feat: add notifications for renew certs #192

This commit is contained in:
0xJacky 2023-12-05 14:35:58 +08:00
parent ddb6cee153
commit 994b9087ae
No known key found for this signature in database
GPG key ID: B6E4A6E4A561BAF0
45 changed files with 1971 additions and 594 deletions

12
.idea/dataSources.xml generated Normal file
View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="database" uuid="31ab1005-9ff6-47e2-9df8-6c521ae42819">
<driver-ref>sqlite.xerial</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/database.db</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

View file

@ -27,6 +27,7 @@ type Ctx[T any] struct {
preloads []string
scan func(tx *gorm.DB) any
transformer func(*T) any
permanentlyDelete bool
SelectedFields []string
}
@ -128,6 +129,11 @@ func (c *Ctx[T]) Abort() {
c.abort = true
}
func (c *Ctx[T]) PermanentlyDelete() *Ctx[T] {
c.permanentlyDelete = true
return c
}
func (c *Ctx[T]) GormScope(hook func(tx *gorm.DB) *gorm.DB) *Ctx[T] {
c.gormScopes = append(c.gormScopes, hook)
return c

View file

@ -29,6 +29,10 @@ func (c *Ctx[T]) Destroy() {
return
}
if c.permanentlyDelete {
result = result.Unscoped()
}
err = result.Delete(&dbModel).Error
if err != nil {
errHandler(c.ctx, err)

View file

@ -0,0 +1,58 @@
package notification
import (
"github.com/0xJacky/Nginx-UI/api"
"github.com/0xJacky/Nginx-UI/api/cosy"
"github.com/0xJacky/Nginx-UI/model"
"github.com/0xJacky/Nginx-UI/query"
"github.com/gin-gonic/gin"
"github.com/spf13/cast"
"net/http"
)
func Get(c *gin.Context) {
n := query.Notification
id := cast.ToInt(c.Param("id"))
data, err := n.FirstByID(id)
if err != nil {
api.ErrHandler(c, err)
return
}
c.JSON(http.StatusOK, data)
}
func GetList(c *gin.Context) {
cosy.Core[model.Notification](c).PagingList()
}
func Destroy(c *gin.Context) {
cosy.Core[model.Notification](c).
PermanentlyDelete().
Destroy()
}
func DestroyAll(c *gin.Context) {
db := model.UseDB()
// remove all records
err := db.Exec("DELETE FROM notifications").Error
if err != nil {
api.ErrHandler(c, err)
return
}
// reset auto increment
err = db.Exec("UPDATE sqlite_sequence SET seq = 0 WHERE name = 'notifications';").Error
if err != nil {
api.ErrHandler(c, err)
return
}
c.JSON(http.StatusOK, gin.H{
"message": "ok",
})
}

View file

@ -0,0 +1,10 @@
package notification
import "github.com/gin-gonic/gin"
func InitRouter(r *gin.RouterGroup) {
r.GET("notifications", GetList)
r.GET("notification/:id", Get)
r.DELETE("notification/:id", Destroy)
r.DELETE("notifications", DestroyAll)
}

3
app/components.d.ts vendored
View file

@ -40,6 +40,7 @@ declare module 'vue' {
AListItem: typeof import('ant-design-vue/es')['ListItem']
AListItemMeta: typeof import('ant-design-vue/es')['ListItemMeta']
AMenu: typeof import('ant-design-vue/es')['Menu']
AMenuDivider: typeof import('ant-design-vue/es')['MenuDivider']
AMenuItem: typeof import('ant-design-vue/es')['MenuItem']
AModal: typeof import('ant-design-vue/es')['Modal']
APagination: typeof import('ant-design-vue/es')['Pagination']
@ -73,6 +74,8 @@ declare module 'vue' {
LogoLogo: typeof import('./src/components/Logo/Logo.vue')['default']
NginxControlNginxControl: typeof import('./src/components/NginxControl/NginxControl.vue')['default']
NodeSelectorNodeSelector: typeof import('./src/components/NodeSelector/NodeSelector.vue')['default']
NotificationClearNotifications: typeof import('./src/components/Notification/ClearNotifications.vue')['default']
NotificationNotification: typeof import('./src/components/Notification/Notification.vue')['default']
PageHeaderPageHeader: typeof import('./src/components/PageHeader/PageHeader.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']

View file

@ -2,6 +2,9 @@
const i18n = require('./i18n.json')
module.exports = {
input: {
include: ["**/*.js", "**/*.ts", "**/*.vue", "**/*.jsx", "**/*.tsx"]
},
output: {
locales: Object.keys(i18n),
},

View file

@ -0,0 +1,19 @@
import type { ModelBase } from '@/api/curd'
import Curd from '@/api/curd'
import http from '@/lib/http'
export interface Notification extends ModelBase {
type: string
title: string
details: string
}
class NotificationCurd extends Curd<Notification> {
public clear() {
return http.delete(this.plural)
}
}
const notification = new NotificationCurd('/notification')
export default notification

View file

@ -0,0 +1,164 @@
<script setup lang="ts">
import { BellOutlined, CheckCircleOutlined, CloseCircleOutlined, DeleteOutlined, InfoCircleOutlined, WarningOutlined } from '@ant-design/icons-vue'
import { useGettext } from 'vue3-gettext'
import type { Ref } from 'vue'
import { message } from 'ant-design-vue'
import notification from '@/api/notification'
import type { Notification } from '@/api/notification'
import { NotificationTypeT } from '@/constants'
import { useUserStore } from '@/pinia'
const { $gettext } = useGettext()
const loading = ref(false)
const { unreadCount } = storeToRefs(useUserStore())
const data = ref([]) as Ref<Notification[]>
function init() {
loading.value = true
notification.get_list().then(r => {
data.value = r.data
unreadCount.value = r.pagination.total
}).catch(e => {
message.error($gettext(e?.message ?? 'Server error'))
}).finally(() => {
loading.value = false
})
}
onMounted(() => {
init()
})
const open = ref(false)
watch(open, v => {
if (v)
init()
})
function clear() {
notification.clear().then(() => {
message.success($gettext('Cleared successfully'))
data.value = []
unreadCount.value = 0
}).catch(e => {
message.error($gettext(e?.message ?? 'Server error'))
})
}
function remove(id: number) {
notification.destroy(id).then(() => {
message.success($gettext('Removed successfully'))
init()
}).catch(e => {
message.error($gettext(e?.message ?? 'Server error'))
})
}
const router = useRouter()
function viewAll() {
router.push('/notifications')
open.value = false
}
</script>
<template>
<span class="cursor-pointer">
<APopover
v-model:open="open"
placement="bottomRight"
overlay-class-name="notification-popover"
trigger="click"
>
<ABadge
:count="unreadCount"
dot
>
<BellOutlined />
</ABadge>
<template #content>
<div class="flex justify-between items-center p-2">
<h3 class="mb-0">{{ $gettext('Notifications') }}</h3>
<APopconfirm
:cancel-text="$gettext('No')"
:ok-text="$gettext('OK')"
:title="$gettext('Are you sure you want to clear all notifications?')"
placement="bottomRight"
@confirm="clear"
>
<a>
{{ $gettext('Clear') }}
</a>
</APopconfirm>
</div>
<ADivider class="mt-2 mb-2" />
<AList
:data-source="data"
class="max-h-96 overflow-scroll"
>
<template #renderItem="{ item }">
<AListItem>
<template #actions>
<span
key="list-loadmore-remove"
class="cursor-pointer"
@click="remove(item.id)"
>
<DeleteOutlined />
</span>
</template>
<AListItemMeta
:title="item.title"
:description="item.details"
>
<template #avatar>
<div>
<CloseCircleOutlined
v-if="item.type === NotificationTypeT.Error"
class="text-red-500"
/>
<WarningOutlined
v-else-if="item.type === NotificationTypeT.Warning"
class="text-orange-400"
/>
<InfoCircleOutlined
v-else-if="item.type === NotificationTypeT.Info"
class="text-blue-500"
/>
<CheckCircleOutlined
v-else-if="item.type === NotificationTypeT.Success"
class="text-green-500"
/>
</div>
</template>
</AListItemMeta>
</AListItem>
</template>
</AList>
<ADivider class="m-0 mb-2" />
<div class="flex justify-center p-2">
<a @click="viewAll">{{ $gettext('View all notifications') }}</a>
</div>
</template>
</APopover>
</span>
</template>
<style lang="less">
.notification-popover {
width: 400px;
}
</style>
<style scoped lang="less">
:deep(.ant-list-item-meta) {
align-items: center !important;
}
:deep(.ant-list-item-meta-avatar) {
font-size: 24px;
}
</style>

View file

@ -107,11 +107,15 @@ const selectedRowKeys = ref([])
<template>
<div class="std-curd">
<ACard :title="title || $gettext('Table')">
<template
v-if="!disableAdd"
#extra
>
<a @click="add">{{ $gettext('Add') }}</a>
<template #extra>
<ASpace>
<a
v-if="!disableAdd"
@click="add"
>{{ $gettext('Add') }}</a>
<slot name="extra" />
</ASpace>
</template>
<StdTable

View file

@ -327,20 +327,26 @@ function export_csv() {
{{ text }}
</template>
<template v-if="column.dataIndex === 'action'">
<AButton
v-if="!props.disabledModify"
type="link"
size="small"
@click="$emit('clickEdit', record[props.rowKey], record)"
>
{{ $gettext('Modify') }}
</AButton>
<template v-if="!props.disabledModify">
<AButton
type="link"
size="small"
@click="$emit('clickEdit', record[props.rowKey], record)"
>
{{ $gettext('Modify') }}
</AButton>
<ADivider
v-if="!props.disableDelete"
type="vertical"
/>
</template>
<slot
name="actions"
:record="record"
/>
<template v-if="!props.disableDelete">
<ADivider type="vertical" />
<APopconfirm
:cancel-text="$gettext('No')"
:ok-text="$gettext('OK')"

View file

@ -1,4 +1,21 @@
import gettext from '@/gettext'
const { $gettext } = gettext
export enum AutoCertState {
Disable = 0,
Enable = 1,
}
export enum NotificationTypeT {
Error,
Warning,
Info,
Success,
}
export const NotificationType = {
[NotificationTypeT.Error]: () => $gettext('Error'),
[NotificationTypeT.Warning]: () => $gettext('Warning'),
[NotificationTypeT.Info]: () => $gettext('Info'),
[NotificationTypeT.Success]: () => $gettext('Success'),
} as const

View file

@ -33,4 +33,7 @@ export const msg = [
$gettext('File exists'),
$gettext('Requested with wrong parameters'),
$gettext('Renew Certificate Success'),
$gettext('Renew Certificate Error'),
]

View file

@ -9,30 +9,30 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/routes/index.ts:199
#: src/routes/index.ts:208
msgid "About"
msgstr "About"
#: src/routes/index.ts:151 src/views/domain/ngx_conf/LogEntry.vue:78
#: src/routes/index.ts:152 src/views/domain/ngx_conf/LogEntry.vue:78
msgid "Access Logs"
msgstr ""
#: src/views/certificate/Certificate.vue:96
#: src/views/certificate/Certificate.vue:104
#: src/views/certificate/DNSCredential.vue:32 src/views/config/config.ts:36
#: src/views/domain/DomainList.vue:50 src/views/environment/Environment.vue:105
#: src/views/user/User.vue:46
#: src/views/notification/Notification.vue:38 src/views/user/User.vue:46
msgid "Action"
msgstr "Action"
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:114
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:115
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
#: src/views/certificate/Certificate.vue:120
#: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:115
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:308
msgid "Add"
msgstr ""
#: src/routes/index.ts:122 src/views/certificate/Certificate.vue:115
#: src/views/certificate/CertificateEditor.vue:76
#: src/routes/index.ts:123 src/views/certificate/CertificateEditor.vue:84
#, fuzzy
msgid "Add Certificate"
msgstr "Certificate Status"
@ -46,7 +46,7 @@ msgstr "Add Directive Below"
msgid "Add Location"
msgstr "Add Location"
#: src/routes/index.ts:70 src/views/domain/DomainAdd.vue:91
#: src/routes/index.ts:71 src/views/domain/DomainAdd.vue:91
msgid "Add Site"
msgstr "Add Site"
@ -75,13 +75,19 @@ msgstr ""
msgid "Arch"
msgstr ""
#: src/components/Notification/Notification.vue:86
#: src/views/notification/Notification.vue:73
#, fuzzy
msgid "Are you sure you want to clear all notifications?"
msgstr "Are you sure you want to remove this directive?"
#: src/components/ChatGPT/ChatGPT.vue:279
#, fuzzy
msgid "Are you sure you want to clear the record of chat?"
msgstr "Are you sure you want to remove this directive?"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:347
#: src/views/domain/DomainList.vue:145
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:353
#: src/views/domain/DomainList.vue:144
#, fuzzy
msgid "Are you sure you want to delete?"
msgstr "Are you sure you want to remove this directive?"
@ -124,7 +130,7 @@ msgstr "Auto-renewal disabled for %{name}"
msgid "Auto-renewal enabled for %{name}"
msgstr "Auto-renewal enabled for %{name}"
#: src/views/certificate/CertificateEditor.vue:168
#: src/views/certificate/CertificateEditor.vue:205
#: src/views/config/Config.vue:75 src/views/config/ConfigEdit.vue:89
#: src/views/domain/DomainEdit.vue:261 src/views/nginx_log/NginxLog.vue:170
msgid "Back"
@ -166,7 +172,7 @@ msgstr ""
#: src/components/ChatGPT/ChatGPT.vue:260
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:58
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:139
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:143
#: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
#: src/views/domain/cert/components/ObtainCert.vue:150
#: src/views/domain/components/Deploy.vue:24
@ -184,17 +190,17 @@ msgstr "Certificate has expired"
msgid "Certificate is valid"
msgstr "Certificate is valid"
#: src/views/certificate/CertificateEditor.vue:119
#: src/views/certificate/CertificateEditor.vue:127
#: src/views/domain/cert/Cert.vue:35
msgid "Certificate Status"
msgstr "Certificate Status"
#: src/routes/index.ts:100 src/views/certificate/Certificate.vue:109
#: src/routes/index.ts:101 src/views/certificate/Certificate.vue:117
#, fuzzy
msgid "Certificates"
msgstr "Certificate Status"
#: src/routes/index.ts:109
#: src/routes/index.ts:110
#, fuzzy
msgid "Certificates List"
msgstr "Certificate is valid"
@ -230,9 +236,17 @@ msgid "Cleaning environment variables"
msgstr ""
#: src/components/ChatGPT/ChatGPT.vue:283
#: src/components/Notification/Notification.vue:91
#: src/views/notification/Notification.vue:78
msgid "Clear"
msgstr ""
#: src/components/Notification/Notification.vue:42
#: src/views/notification/Notification.vue:47
#, fuzzy
msgid "Cleared successfully"
msgstr "Disabled successfully"
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/domain/ngx_conf/LocationEditor.vue:121
#: src/views/domain/ngx_conf/LocationEditor.vue:90
@ -287,7 +301,7 @@ msgstr "CPU:"
msgid "Create Another"
msgstr "Create Another"
#: src/views/user/User.vue:34
#: src/views/notification/Notification.vue:32 src/views/user/User.vue:34
msgid "Created at"
msgstr "Created at"
@ -312,7 +326,7 @@ msgstr ""
msgid "Custom"
msgstr ""
#: src/routes/index.ts:51
#: src/routes/index.ts:52
msgid "Dashboard"
msgstr "Dashboard"
@ -320,7 +334,7 @@ msgstr "Dashboard"
msgid "Database (Optional, default: database)"
msgstr "Database (Optional, default: database)"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:354
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:360
#: src/views/domain/DomainList.vue:153
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:259
msgid "Delete"
@ -358,6 +372,10 @@ msgstr "Saved successfully"
msgid "Description"
msgstr ""
#: src/views/notification/Notification.vue:28
msgid "Details"
msgstr ""
#: src/views/system/About.vue:25
msgid "Development Mode"
msgstr "Development Mode"
@ -385,7 +403,7 @@ msgid "Disable auto-renewal failed for %{name}"
msgstr "Disable auto-renewal failed for %{name}"
#: src/views/domain/cert/ChangeCert.vue:48 src/views/domain/DomainEdit.vue:190
#: src/views/domain/DomainList.vue:123
#: src/views/domain/DomainList.vue:122
msgid "Disabled"
msgstr "Disabled"
@ -398,7 +416,7 @@ msgstr "Disabled successfully"
msgid "Disk IO"
msgstr "Disk IO"
#: src/routes/index.ts:130 src/views/certificate/DNSCredential.vue:39
#: src/routes/index.ts:131 src/views/certificate/DNSCredential.vue:39
msgid "DNS Credentials"
msgstr ""
@ -446,7 +464,7 @@ msgstr "Are you sure you want to remove this directive?"
msgid "Domain Config Created Successfully"
msgstr "Domain Config Created Successfully"
#: src/views/certificate/CertificateEditor.vue:103
#: src/views/certificate/CertificateEditor.vue:111
msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
msgstr ""
@ -463,7 +481,7 @@ msgid "Dry run mode enabled"
msgstr ""
#: src/views/domain/components/SiteDuplicate.vue:128
#: src/views/domain/DomainList.vue:139
#: src/views/domain/DomainList.vue:138
msgid "Duplicate"
msgstr ""
@ -491,11 +509,11 @@ msgstr "Saved successfully"
msgid "Edit %{n}"
msgstr "Edit %{n}"
#: src/routes/index.ts:92 src/views/config/ConfigEdit.vue:83
#: src/routes/index.ts:93 src/views/config/ConfigEdit.vue:83
msgid "Edit Configuration"
msgstr "Edit Configuration"
#: src/routes/index.ts:74
#: src/routes/index.ts:75
msgid "Edit Site"
msgstr "Edit Site"
@ -536,7 +554,7 @@ msgstr "Enable TLS"
#: src/views/domain/cert/ChangeCert.vue:44
#: src/views/domain/components/Deploy.vue:89
#: src/views/domain/components/RightSettings.vue:75
#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:131
#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:130
msgid "Enabled"
msgstr "Enabled"
@ -550,7 +568,7 @@ msgstr "Enabled successfully"
msgid "Encrypt website with Let's Encrypt"
msgstr "Encrypt website with Let's Encrypt"
#: src/routes/index.ts:168 src/views/environment/Environment.vue:113
#: src/routes/index.ts:169 src/views/environment/Environment.vue:113
msgid "Environment"
msgstr ""
@ -559,11 +577,11 @@ msgstr ""
msgid "Environments"
msgstr "Comments"
#: src/views/config/InspectConfig.vue:47
#: src/constants/index.ts:17 src/views/config/InspectConfig.vue:47
msgid "Error"
msgstr ""
#: src/routes/index.ts:155 src/views/domain/ngx_conf/LogEntry.vue:86
#: src/routes/index.ts:156 src/views/domain/ngx_conf/LogEntry.vue:86
msgid "Error Logs"
msgstr ""
@ -571,7 +589,7 @@ msgstr ""
msgid "Executable Path"
msgstr ""
#: src/views/certificate/Certificate.vue:84
#: src/views/certificate/Certificate.vue:92
msgid "Expired"
msgstr ""
@ -637,6 +655,11 @@ msgstr "Save error %{msg}"
msgid "Format successfully"
msgstr "Saved successfully"
#: src/views/certificate/Certificate.vue:45
#, fuzzy
msgid "General Certificate"
msgstr "Certificate is valid"
#: src/components/StdDesign/StdDataEntry/components/StdPassword.vue:60
msgid "Generate"
msgstr ""
@ -674,7 +697,7 @@ msgstr ""
msgid "GPT-4-Turbo"
msgstr ""
#: src/routes/index.ts:44
#: src/routes/index.ts:45
msgid "Home"
msgstr "Home"
@ -694,6 +717,10 @@ msgstr ""
msgid "HTTP01"
msgstr ""
#: src/constants/index.ts:19
msgid "Info"
msgstr ""
#: src/language/constants.ts:27
msgid "Initial core upgrader error"
msgstr ""
@ -702,7 +729,7 @@ msgstr ""
msgid "Initialing core upgrader"
msgstr ""
#: src/routes/index.ts:211 src/views/other/Install.vue:139
#: src/routes/index.ts:220 src/views/other/Install.vue:139
msgid "Install"
msgstr "Install"
@ -764,12 +791,12 @@ msgstr "Location"
msgid "Locations"
msgstr "Locations"
#: src/views/certificate/CertificateEditor.vue:156
#: src/views/certificate/CertificateEditor.vue:193
#, fuzzy
msgid "Log"
msgstr "Login"
#: src/routes/index.ts:217 src/views/other/Login.vue:147
#: src/routes/index.ts:226 src/views/other/Login.vue:147
msgid "Login"
msgstr "Login"
@ -777,7 +804,7 @@ msgstr "Login"
msgid "Login successful"
msgstr "Login successful"
#: src/layouts/HeaderLayout.vue:21
#: src/layouts/HeaderLayout.vue:22
msgid "Logout successful"
msgstr "Logout successful"
@ -790,18 +817,23 @@ msgstr ""
"Make sure you have configured a reverse proxy for .well-known directory to "
"HTTPChallengePort (default: 9180) before getting the certificate."
#: src/routes/index.ts:83
#: src/routes/index.ts:84
msgid "Manage Configs"
msgstr "Manage Configs"
#: src/routes/index.ts:58 src/views/domain/DomainList.vue:102
#: src/routes/index.ts:59 src/views/domain/DomainList.vue:102
msgid "Manage Sites"
msgstr "Manage Sites"
#: src/routes/index.ts:176 src/views/user/User.vue:53
#: src/routes/index.ts:185 src/views/user/User.vue:53
msgid "Manage Users"
msgstr "Manage Users"
#: src/views/certificate/Certificate.vue:44
#, fuzzy
msgid "Managed Certificate"
msgstr "Certificate is valid"
#: src/views/dashboard/ServerAnalytic.vue:220
msgid "Memory"
msgstr "Memory"
@ -811,13 +843,13 @@ msgid "Memory and Storage"
msgstr "Memory and Storage"
#: src/components/ChatGPT/ChatGPT.vue:256
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
#, fuzzy
msgid "Modify"
msgstr "Modify Config"
#: src/routes/index.ts:114 src/views/certificate/CertificateEditor.vue:76
#: src/routes/index.ts:115 src/views/certificate/CertificateEditor.vue:84
#, fuzzy
msgid "Modify Certificate"
msgstr "Certificate Status"
@ -832,6 +864,7 @@ msgid "Multi-line Directive"
msgstr "Single Directive"
#: src/views/certificate/Certificate.vue:22
#: src/views/certificate/CertificateEditor.vue:145
#: src/views/certificate/DNSCredential.vue:13 src/views/config/config.ts:9
#: src/views/domain/cert/ChangeCert.vue:21
#: src/views/domain/components/RightSettings.vue:81
@ -886,7 +919,7 @@ msgstr ""
msgid "Nginx Error Log Path"
msgstr ""
#: src/routes/index.ts:145 src/views/nginx_log/NginxLog.vue:145
#: src/routes/index.ts:146 src/views/nginx_log/NginxLog.vue:145
msgid "Nginx Log"
msgstr ""
@ -901,10 +934,12 @@ msgid "Nginx restarted successfully"
msgstr "Saved successfully"
#: src/components/ChatGPT/ChatGPT.vue:277
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:345
#: src/views/domain/DomainList.vue:143
#: src/components/Notification/Notification.vue:84
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:351
#: src/views/domain/DomainList.vue:142
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:81
#: src/views/domain/ngx_conf/LocationEditor.vue:76
#: src/views/notification/Notification.vue:71
msgid "No"
msgstr "No"
@ -912,11 +947,11 @@ msgstr "No"
msgid "Node Secret"
msgstr ""
#: src/views/certificate/Certificate.vue:90
#: src/views/certificate/Certificate.vue:98
msgid "Not After"
msgstr ""
#: src/routes/index.ts:223 src/routes/index.ts:225
#: src/routes/index.ts:232 src/routes/index.ts:234
msgid "Not Found"
msgstr "Not Found"
@ -929,6 +964,16 @@ msgstr "Not Valid Before: %{date}"
msgid "Note"
msgstr ""
#: src/views/notification/Notification.vue:63
#, fuzzy
msgid "Notification"
msgstr "Certificate is valid"
#: src/components/Notification/Notification.vue:82 src/routes/index.ts:177
#, fuzzy
msgid "Notifications"
msgstr "Certificate is valid"
#: src/views/domain/cert/components/ObtainCert.vue:191
#, fuzzy
msgid "Obtain certificate"
@ -945,16 +990,18 @@ msgid "Offline"
msgstr ""
#: src/components/ChatGPT/ChatGPT.vue:278
#: src/components/Notification/Notification.vue:85
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:59
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:140
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:346
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:144
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:352
#: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:104
#: src/views/domain/cert/components/ObtainCert.vue:149
#: src/views/domain/components/Deploy.vue:23
#: src/views/domain/components/RightSettings.vue:51
#: src/views/domain/DomainList.vue:144
#: src/views/domain/DomainList.vue:143
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:215
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:47
#: src/views/notification/Notification.vue:72
msgid "OK"
msgstr ""
@ -1059,7 +1106,7 @@ msgstr ""
msgid "Pre-release"
msgstr ""
#: src/routes/index.ts:184 src/views/preference/Preference.vue:85
#: src/routes/index.ts:193 src/views/preference/Preference.vue:85
msgid "Preference"
msgstr ""
@ -1124,12 +1171,27 @@ msgstr ""
msgid "Reloading nginx"
msgstr ""
#: src/components/Notification/Notification.vue:52
#, fuzzy
msgid "Removed successfully"
msgstr "Saved successfully"
#: src/views/certificate/RenewCert.vue:43
#: src/views/certificate/RenewCert.vue:47
#, fuzzy
msgid "Renew Certificate"
msgstr "Certificate is valid"
#: src/language/constants.ts:38
#, fuzzy
msgid "Renew Certificate Error"
msgstr "Certificate is valid"
#: src/language/constants.ts:37
#, fuzzy
msgid "Renew Certificate Success"
msgstr "Certificate is valid"
#: src/views/certificate/RenewCert.vue:25
#, fuzzy
msgid "Renew successfully"
@ -1161,7 +1223,7 @@ msgid "Running"
msgstr ""
#: src/components/ChatGPT/ChatGPT.vue:259
#: src/views/certificate/CertificateEditor.vue:175
#: src/views/certificate/CertificateEditor.vue:212
#: src/views/config/ConfigEdit.vue:98 src/views/domain/DomainEdit.vue:268
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:111
#: src/views/preference/Preference.vue:113
@ -1178,7 +1240,7 @@ msgid "Save error %{msg}"
msgstr "Save error %{msg}"
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
#: src/views/certificate/CertificateEditor.vue:46
#: src/views/certificate/CertificateEditor.vue:47
#: src/views/preference/Preference.vue:58
#, fuzzy
msgid "Save successfully"
@ -1245,31 +1307,33 @@ msgstr ""
msgid "Single Directive"
msgstr "Single Directive"
#: src/routes/index.ts:159
#: src/routes/index.ts:160
#, fuzzy
msgid "Site Logs"
msgstr "Sites List"
#: src/routes/index.ts:66
#: src/routes/index.ts:67
msgid "Sites List"
msgstr "Sites List"
#: src/views/certificate/CertificateEditor.vue:135
#: src/views/certificate/CertificateEditor.vue:172
#, fuzzy
msgid "SSL Certificate Content"
msgstr "Certificate Status"
#: src/views/certificate/CertificateEditor.vue:142
#: src/views/certificate/CertificateEditor.vue:179
#, fuzzy
msgid "SSL Certificate Key Content"
msgstr "Certificate Status"
#: src/views/certificate/Certificate.vue:63
#: src/views/certificate/Certificate.vue:71
#: src/views/certificate/CertificateEditor.vue:163
#, fuzzy
msgid "SSL Certificate Key Path"
msgstr "Certificate Status"
#: src/views/certificate/Certificate.vue:55
#: src/views/certificate/Certificate.vue:63
#: src/views/certificate/CertificateEditor.vue:154
#, fuzzy
msgid "SSL Certificate Path"
msgstr "Certificate Status"
@ -1284,7 +1348,7 @@ msgstr "Login"
msgid "Stable"
msgstr "Enabled"
#: src/views/certificate/Certificate.vue:71 src/views/domain/DomainList.vue:25
#: src/views/certificate/Certificate.vue:79 src/views/domain/DomainList.vue:25
#: src/views/environment/Environment.vue:78
msgid "Status"
msgstr "Status"
@ -1302,6 +1366,10 @@ msgstr "Storage"
msgid "Subject Name: %{subject}"
msgstr "Subject Name: %{name}"
#: src/constants/index.ts:20
msgid "Success"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:233
msgid "Swap"
msgstr "Swap"
@ -1314,7 +1382,7 @@ msgstr ""
msgid "Switch to light theme"
msgstr ""
#: src/routes/index.ts:192
#: src/routes/index.ts:201
msgid "System"
msgstr ""
@ -1327,7 +1395,7 @@ msgstr "Enabled"
msgid "Target"
msgstr ""
#: src/routes/index.ts:137 src/views/pty/Terminal.vue:95
#: src/routes/index.ts:138 src/views/pty/Terminal.vue:95
msgid "Terminal"
msgstr "Terminal"
@ -1361,11 +1429,11 @@ msgstr ""
msgid "The username or password is incorrect"
msgstr ""
#: src/views/certificate/CertificateEditor.vue:93
#: src/views/certificate/CertificateEditor.vue:101
msgid "This Auto Cert item is invalid, please remove it."
msgstr ""
#: src/views/certificate/CertificateEditor.vue:83
#: src/views/certificate/CertificateEditor.vue:91
msgid "This certificate is managed by Nginx UI"
msgstr ""
@ -1373,6 +1441,10 @@ msgstr ""
msgid "This field should not be empty"
msgstr ""
#: src/views/notification/Notification.vue:21
msgid "Title"
msgstr ""
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:42
msgid ""
"To make sure the certification auto-renewal can work normally, we need to "
@ -1382,6 +1454,7 @@ msgid ""
msgstr ""
#: src/views/certificate/Certificate.vue:39 src/views/config/config.ts:14
#: src/views/notification/Notification.vue:15
msgid "Type"
msgstr ""
@ -1398,7 +1471,7 @@ msgstr "Updated at"
msgid "Updated successfully"
msgstr "Saved successfully"
#: src/routes/index.ts:203 src/views/system/Upgrade.vue:143
#: src/routes/index.ts:212 src/views/system/Upgrade.vue:143
#: src/views/system/Upgrade.vue:235
msgid "Upgrade"
msgstr ""
@ -1433,7 +1506,7 @@ msgstr "Username"
msgid "Username (*)"
msgstr "Username (*)"
#: src/views/certificate/Certificate.vue:80
#: src/views/certificate/Certificate.vue:88
msgid "Valid"
msgstr ""
@ -1441,7 +1514,12 @@ msgstr ""
msgid "View"
msgstr ""
#: src/views/config/InspectConfig.vue:36
#: src/components/Notification/Notification.vue:143
#, fuzzy
msgid "View all notifications"
msgstr "Certificate is valid"
#: src/constants/index.ts:18 src/views/config/InspectConfig.vue:36
#: src/views/domain/cert/components/AutoCertStepOne.vue:23
#: src/views/domain/DomainAdd.vue:114
msgid "Warning"
@ -1493,10 +1571,6 @@ msgstr ""
#~ msgid "Config Name"
#~ msgstr "Configuration Name"
#, fuzzy
#~ msgid "Certification"
#~ msgstr "Certificate is valid"
#, fuzzy
#~ msgid "Inspect Configurations"
#~ msgstr "Edit Configuration"

View file

@ -14,30 +14,30 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.0\n"
#: src/routes/index.ts:199
#: src/routes/index.ts:208
msgid "About"
msgstr "Acerca de"
#: src/routes/index.ts:151 src/views/domain/ngx_conf/LogEntry.vue:78
#: src/routes/index.ts:152 src/views/domain/ngx_conf/LogEntry.vue:78
msgid "Access Logs"
msgstr "Registros de acceso"
#: src/views/certificate/Certificate.vue:96
#: src/views/certificate/Certificate.vue:104
#: src/views/certificate/DNSCredential.vue:32 src/views/config/config.ts:36
#: src/views/domain/DomainList.vue:50 src/views/environment/Environment.vue:105
#: src/views/user/User.vue:46
#: src/views/notification/Notification.vue:38 src/views/user/User.vue:46
msgid "Action"
msgstr "Acción"
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:114
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:115
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
#: src/views/certificate/Certificate.vue:120
#: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:115
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:308
msgid "Add"
msgstr "Agregar"
#: src/routes/index.ts:122 src/views/certificate/Certificate.vue:115
#: src/views/certificate/CertificateEditor.vue:76
#: src/routes/index.ts:123 src/views/certificate/CertificateEditor.vue:84
#, fuzzy
msgid "Add Certificate"
msgstr "Estado del Certificado"
@ -51,7 +51,7 @@ msgstr "Añadir directiva a continuación"
msgid "Add Location"
msgstr "Agregar Ubicación"
#: src/routes/index.ts:70 src/views/domain/DomainAdd.vue:91
#: src/routes/index.ts:71 src/views/domain/DomainAdd.vue:91
msgid "Add Site"
msgstr "Agregar Sitio"
@ -79,12 +79,18 @@ msgstr "Token de la API"
msgid "Arch"
msgstr "Arquitectura"
#: src/components/Notification/Notification.vue:86
#: src/views/notification/Notification.vue:73
#, fuzzy
msgid "Are you sure you want to clear all notifications?"
msgstr "¿Está seguro de que desea borrar el registro del chat?"
#: src/components/ChatGPT/ChatGPT.vue:279
msgid "Are you sure you want to clear the record of chat?"
msgstr "¿Está seguro de que desea borrar el registro del chat?"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:347
#: src/views/domain/DomainList.vue:145
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:353
#: src/views/domain/DomainList.vue:144
msgid "Are you sure you want to delete?"
msgstr "¿Está seguro de que quiere borrar?"
@ -125,7 +131,7 @@ msgstr "Renovación automática deshabilitada por %{name}"
msgid "Auto-renewal enabled for %{name}"
msgstr "Renovación automática habilitada por %{name}"
#: src/views/certificate/CertificateEditor.vue:168
#: src/views/certificate/CertificateEditor.vue:205
#: src/views/config/Config.vue:75 src/views/config/ConfigEdit.vue:89
#: src/views/domain/DomainEdit.vue:261 src/views/nginx_log/NginxLog.vue:170
msgid "Back"
@ -164,7 +170,7 @@ msgstr "Directorio CA"
#: src/components/ChatGPT/ChatGPT.vue:260
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:58
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:139
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:143
#: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
#: src/views/domain/cert/components/ObtainCert.vue:150
#: src/views/domain/components/Deploy.vue:24
@ -182,17 +188,17 @@ msgstr "El certificado expiró"
msgid "Certificate is valid"
msgstr "El certificado es válido"
#: src/views/certificate/CertificateEditor.vue:119
#: src/views/certificate/CertificateEditor.vue:127
#: src/views/domain/cert/Cert.vue:35
msgid "Certificate Status"
msgstr "Estado del Certificado"
#: src/routes/index.ts:100 src/views/certificate/Certificate.vue:109
#: src/routes/index.ts:101 src/views/certificate/Certificate.vue:117
#, fuzzy
msgid "Certificates"
msgstr "Estado del Certificado"
#: src/routes/index.ts:109
#: src/routes/index.ts:110
#, fuzzy
msgid "Certificates List"
msgstr "Lista de Certificados"
@ -227,9 +233,17 @@ msgid "Cleaning environment variables"
msgstr "Borrar las variables de entorno"
#: src/components/ChatGPT/ChatGPT.vue:283
#: src/components/Notification/Notification.vue:91
#: src/views/notification/Notification.vue:78
msgid "Clear"
msgstr "Limpiar"
#: src/components/Notification/Notification.vue:42
#: src/views/notification/Notification.vue:47
#, fuzzy
msgid "Cleared successfully"
msgstr "Desactivado con éxito"
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/domain/ngx_conf/LocationEditor.vue:121
#: src/views/domain/ngx_conf/LocationEditor.vue:90
@ -283,7 +297,7 @@ msgstr "CPU:"
msgid "Create Another"
msgstr "Crear otro"
#: src/views/user/User.vue:34
#: src/views/notification/Notification.vue:32 src/views/user/User.vue:34
msgid "Created at"
msgstr "Creado el"
@ -308,7 +322,7 @@ msgstr "Versión actual"
msgid "Custom"
msgstr "Personalizado"
#: src/routes/index.ts:51
#: src/routes/index.ts:52
msgid "Dashboard"
msgstr "Panel"
@ -316,7 +330,7 @@ msgstr "Panel"
msgid "Database (Optional, default: database)"
msgstr "Base de datos (Opcional, default: database)"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:354
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:360
#: src/views/domain/DomainList.vue:153
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:259
msgid "Delete"
@ -353,6 +367,10 @@ msgstr "Desplegado con éxito"
msgid "Description"
msgstr "Descripción"
#: src/views/notification/Notification.vue:28
msgid "Details"
msgstr ""
#: src/views/system/About.vue:25
msgid "Development Mode"
msgstr "Modo de desarrollo"
@ -380,7 +398,7 @@ msgid "Disable auto-renewal failed for %{name}"
msgstr "No se pudo desactivar la renovación automática por %{name}"
#: src/views/domain/cert/ChangeCert.vue:48 src/views/domain/DomainEdit.vue:190
#: src/views/domain/DomainList.vue:123
#: src/views/domain/DomainList.vue:122
msgid "Disabled"
msgstr "Desactivado"
@ -393,7 +411,7 @@ msgstr "Desactivado con éxito"
msgid "Disk IO"
msgstr "I/O del disco"
#: src/routes/index.ts:130 src/views/certificate/DNSCredential.vue:39
#: src/routes/index.ts:131 src/views/certificate/DNSCredential.vue:39
msgid "DNS Credentials"
msgstr "Credenciales de DNS"
@ -436,7 +454,7 @@ msgstr "¿Quieres eliminar este servidor?"
msgid "Domain Config Created Successfully"
msgstr "Configuración de dominio creada con éxito"
#: src/views/certificate/CertificateEditor.vue:103
#: src/views/certificate/CertificateEditor.vue:111
#, fuzzy
msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
msgstr ""
@ -456,7 +474,7 @@ msgid "Dry run mode enabled"
msgstr "Modo de ejecución de prueba habilitado"
#: src/views/domain/components/SiteDuplicate.vue:128
#: src/views/domain/DomainList.vue:139
#: src/views/domain/DomainList.vue:138
msgid "Duplicate"
msgstr "Duplicar"
@ -480,11 +498,11 @@ msgstr "Duplicado con éxito a local"
msgid "Edit %{n}"
msgstr "Editar %{n}"
#: src/routes/index.ts:92 src/views/config/ConfigEdit.vue:83
#: src/routes/index.ts:93 src/views/config/ConfigEdit.vue:83
msgid "Edit Configuration"
msgstr "Editar Configuración"
#: src/routes/index.ts:74
#: src/routes/index.ts:75
msgid "Edit Site"
msgstr "Editar Sitio"
@ -524,7 +542,7 @@ msgstr "Habilitar TLS"
#: src/views/domain/cert/ChangeCert.vue:44
#: src/views/domain/components/Deploy.vue:89
#: src/views/domain/components/RightSettings.vue:75
#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:131
#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:130
msgid "Enabled"
msgstr "Habilitado"
@ -538,7 +556,7 @@ msgstr "Habilitado con éxito"
msgid "Encrypt website with Let's Encrypt"
msgstr "Encriptar sitio web con Let's Encrypt"
#: src/routes/index.ts:168 src/views/environment/Environment.vue:113
#: src/routes/index.ts:169 src/views/environment/Environment.vue:113
msgid "Environment"
msgstr "Entorno"
@ -546,11 +564,11 @@ msgstr "Entorno"
msgid "Environments"
msgstr "Entornos"
#: src/views/config/InspectConfig.vue:47
#: src/constants/index.ts:17 src/views/config/InspectConfig.vue:47
msgid "Error"
msgstr "Error"
#: src/routes/index.ts:155 src/views/domain/ngx_conf/LogEntry.vue:86
#: src/routes/index.ts:156 src/views/domain/ngx_conf/LogEntry.vue:86
msgid "Error Logs"
msgstr "Registros de acceso"
@ -558,7 +576,7 @@ msgstr "Registros de acceso"
msgid "Executable Path"
msgstr "Ruta ejecutable"
#: src/views/certificate/Certificate.vue:84
#: src/views/certificate/Certificate.vue:92
msgid "Expired"
msgstr ""
@ -623,6 +641,11 @@ msgstr "Error de formato %{msg}"
msgid "Format successfully"
msgstr "Formateado correctamente"
#: src/views/certificate/Certificate.vue:45
#, fuzzy
msgid "General Certificate"
msgstr "Cambiar Certificado"
#: src/components/StdDesign/StdDataEntry/components/StdPassword.vue:60
msgid "Generate"
msgstr "Generar"
@ -660,7 +683,7 @@ msgstr "GPT-4-32K"
msgid "GPT-4-Turbo"
msgstr "GPT-3.5-Turbo"
#: src/routes/index.ts:44
#: src/routes/index.ts:45
msgid "Home"
msgstr "Inicio"
@ -680,6 +703,10 @@ msgstr "Puerto HTTP"
msgid "HTTP01"
msgstr "HTTP01"
#: src/constants/index.ts:19
msgid "Info"
msgstr ""
#: src/language/constants.ts:27
msgid "Initial core upgrader error"
msgstr "Error de actualización de kernel inicial"
@ -688,7 +715,7 @@ msgstr "Error de actualización de kernel inicial"
msgid "Initialing core upgrader"
msgstr "Inicializando la actualización del kernel"
#: src/routes/index.ts:211 src/views/other/Install.vue:139
#: src/routes/index.ts:220 src/views/other/Install.vue:139
msgid "Install"
msgstr "Instalar"
@ -747,12 +774,12 @@ msgstr "Ubicación"
msgid "Locations"
msgstr "Ubicaciones"
#: src/views/certificate/CertificateEditor.vue:156
#: src/views/certificate/CertificateEditor.vue:193
#, fuzzy
msgid "Log"
msgstr "Acceso"
#: src/routes/index.ts:217 src/views/other/Login.vue:147
#: src/routes/index.ts:226 src/views/other/Login.vue:147
msgid "Login"
msgstr "Acceso"
@ -760,7 +787,7 @@ msgstr "Acceso"
msgid "Login successful"
msgstr "Acceso exitoso"
#: src/layouts/HeaderLayout.vue:21
#: src/layouts/HeaderLayout.vue:22
msgid "Logout successful"
msgstr "Cierre de sesión exitoso"
@ -772,18 +799,23 @@ msgstr ""
"Asegúrese de haber configurado un proxy reverso para el directorio .well-"
"known en HTTPChallengePort antes de obtener el certificado."
#: src/routes/index.ts:83
#: src/routes/index.ts:84
msgid "Manage Configs"
msgstr "Administrar configuraciones"
#: src/routes/index.ts:58 src/views/domain/DomainList.vue:102
#: src/routes/index.ts:59 src/views/domain/DomainList.vue:102
msgid "Manage Sites"
msgstr "Administrar sitios"
#: src/routes/index.ts:176 src/views/user/User.vue:53
#: src/routes/index.ts:185 src/views/user/User.vue:53
msgid "Manage Users"
msgstr "Administrar usuarios"
#: src/views/certificate/Certificate.vue:44
#, fuzzy
msgid "Managed Certificate"
msgstr "Cambiar Certificado"
#: src/views/dashboard/ServerAnalytic.vue:220
msgid "Memory"
msgstr "Memoria"
@ -793,12 +825,12 @@ msgid "Memory and Storage"
msgstr "Memoria y almacenamiento"
#: src/components/ChatGPT/ChatGPT.vue:256
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
msgid "Modify"
msgstr "Modificar"
#: src/routes/index.ts:114 src/views/certificate/CertificateEditor.vue:76
#: src/routes/index.ts:115 src/views/certificate/CertificateEditor.vue:84
#, fuzzy
msgid "Modify Certificate"
msgstr "Estado del Certificado"
@ -812,6 +844,7 @@ msgid "Multi-line Directive"
msgstr "Directiva multilínea"
#: src/views/certificate/Certificate.vue:22
#: src/views/certificate/CertificateEditor.vue:145
#: src/views/certificate/DNSCredential.vue:13 src/views/config/config.ts:9
#: src/views/domain/cert/ChangeCert.vue:21
#: src/views/domain/components/RightSettings.vue:81
@ -865,7 +898,7 @@ msgstr "Control de Nginx"
msgid "Nginx Error Log Path"
msgstr "Ruta de registro de errores de Nginx"
#: src/routes/index.ts:145 src/views/nginx_log/NginxLog.vue:145
#: src/routes/index.ts:146 src/views/nginx_log/NginxLog.vue:145
msgid "Nginx Log"
msgstr "Registro Nginx"
@ -878,10 +911,12 @@ msgid "Nginx restarted successfully"
msgstr "Nginx reiniciado con éxito"
#: src/components/ChatGPT/ChatGPT.vue:277
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:345
#: src/views/domain/DomainList.vue:143
#: src/components/Notification/Notification.vue:84
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:351
#: src/views/domain/DomainList.vue:142
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:81
#: src/views/domain/ngx_conf/LocationEditor.vue:76
#: src/views/notification/Notification.vue:71
msgid "No"
msgstr "No"
@ -889,11 +924,11 @@ msgstr "No"
msgid "Node Secret"
msgstr "Secreto del nodo"
#: src/views/certificate/Certificate.vue:90
#: src/views/certificate/Certificate.vue:98
msgid "Not After"
msgstr ""
#: src/routes/index.ts:223 src/routes/index.ts:225
#: src/routes/index.ts:232 src/routes/index.ts:234
msgid "Not Found"
msgstr "No encontrado"
@ -906,6 +941,16 @@ msgstr "No válido antes: %{date}"
msgid "Note"
msgstr "Nota"
#: src/views/notification/Notification.vue:63
#, fuzzy
msgid "Notification"
msgstr "Certificación"
#: src/components/Notification/Notification.vue:82 src/routes/index.ts:177
#, fuzzy
msgid "Notifications"
msgstr "Certificación"
#: src/views/domain/cert/components/ObtainCert.vue:191
msgid "Obtain certificate"
msgstr "Obtener certificado"
@ -921,16 +966,18 @@ msgid "Offline"
msgstr "Desconectado"
#: src/components/ChatGPT/ChatGPT.vue:278
#: src/components/Notification/Notification.vue:85
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:59
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:140
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:346
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:144
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:352
#: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:104
#: src/views/domain/cert/components/ObtainCert.vue:149
#: src/views/domain/components/Deploy.vue:23
#: src/views/domain/components/RightSettings.vue:51
#: src/views/domain/DomainList.vue:144
#: src/views/domain/DomainList.vue:143
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:215
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:47
#: src/views/notification/Notification.vue:72
msgid "OK"
msgstr "OK"
@ -1040,7 +1087,7 @@ msgstr "¡Seleccione al menos un nodo!"
msgid "Pre-release"
msgstr "Prelanzamiento"
#: src/routes/index.ts:184 src/views/preference/Preference.vue:85
#: src/routes/index.ts:193 src/views/preference/Preference.vue:85
msgid "Preference"
msgstr "Configuración"
@ -1103,12 +1150,27 @@ msgstr "Recargando"
msgid "Reloading nginx"
msgstr "Recargando Nginx"
#: src/components/Notification/Notification.vue:52
#, fuzzy
msgid "Removed successfully"
msgstr "Guardado con éxito"
#: src/views/certificate/RenewCert.vue:43
#: src/views/certificate/RenewCert.vue:47
#, fuzzy
msgid "Renew Certificate"
msgstr "Cambiar Certificado"
#: src/language/constants.ts:38
#, fuzzy
msgid "Renew Certificate Error"
msgstr "Cambiar Certificado"
#: src/language/constants.ts:37
#, fuzzy
msgid "Renew Certificate Success"
msgstr "Cambiar Certificado"
#: src/views/certificate/RenewCert.vue:25
#, fuzzy
msgid "Renew successfully"
@ -1139,7 +1201,7 @@ msgid "Running"
msgstr "Corriendo"
#: src/components/ChatGPT/ChatGPT.vue:259
#: src/views/certificate/CertificateEditor.vue:175
#: src/views/certificate/CertificateEditor.vue:212
#: src/views/config/ConfigEdit.vue:98 src/views/domain/DomainEdit.vue:268
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:111
#: src/views/preference/Preference.vue:113
@ -1156,7 +1218,7 @@ msgid "Save error %{msg}"
msgstr "Error al guardar %{msg}"
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
#: src/views/certificate/CertificateEditor.vue:46
#: src/views/certificate/CertificateEditor.vue:47
#: src/views/preference/Preference.vue:58
msgid "Save successfully"
msgstr "Guardado con éxito"
@ -1223,29 +1285,31 @@ msgstr "Usando el proveedor de desafíos HTTP01"
msgid "Single Directive"
msgstr "Directiva de una sola línea"
#: src/routes/index.ts:159
#: src/routes/index.ts:160
msgid "Site Logs"
msgstr "Registros del sitio"
#: src/routes/index.ts:66
#: src/routes/index.ts:67
msgid "Sites List"
msgstr "Lista de sitios"
#: src/views/certificate/CertificateEditor.vue:135
#: src/views/certificate/CertificateEditor.vue:172
#, fuzzy
msgid "SSL Certificate Content"
msgstr "Contenido de certificado SSL"
#: src/views/certificate/CertificateEditor.vue:142
#: src/views/certificate/CertificateEditor.vue:179
#, fuzzy
msgid "SSL Certificate Key Content"
msgstr "Contenido de la llave del certificado SSL"
#: src/views/certificate/Certificate.vue:63
#: src/views/certificate/Certificate.vue:71
#: src/views/certificate/CertificateEditor.vue:163
msgid "SSL Certificate Key Path"
msgstr "Ruta de la llave del certificado SSL"
#: src/views/certificate/Certificate.vue:55
#: src/views/certificate/Certificate.vue:63
#: src/views/certificate/CertificateEditor.vue:154
msgid "SSL Certificate Path"
msgstr "Ruta del certificado SSL"
@ -1258,7 +1322,7 @@ msgstr "Acceso"
msgid "Stable"
msgstr "Estable"
#: src/views/certificate/Certificate.vue:71 src/views/domain/DomainList.vue:25
#: src/views/certificate/Certificate.vue:79 src/views/domain/DomainList.vue:25
#: src/views/environment/Environment.vue:78
msgid "Status"
msgstr "Estado"
@ -1276,6 +1340,10 @@ msgstr "Almacenamiento"
msgid "Subject Name: %{subject}"
msgstr "Nombre del asunto: %{name}"
#: src/constants/index.ts:20
msgid "Success"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:233
msgid "Swap"
msgstr "Swap"
@ -1288,7 +1356,7 @@ msgstr ""
msgid "Switch to light theme"
msgstr ""
#: src/routes/index.ts:192
#: src/routes/index.ts:201
msgid "System"
msgstr "Sistema"
@ -1300,7 +1368,7 @@ msgstr "Tabla"
msgid "Target"
msgstr "Objetivo"
#: src/routes/index.ts:137 src/views/pty/Terminal.vue:95
#: src/routes/index.ts:138 src/views/pty/Terminal.vue:95
msgid "Terminal"
msgstr "Terminal"
@ -1335,12 +1403,12 @@ msgstr ""
msgid "The username or password is incorrect"
msgstr "El nombre de usuario o contraseña son incorrectos"
#: src/views/certificate/CertificateEditor.vue:93
#: src/views/certificate/CertificateEditor.vue:101
#, fuzzy
msgid "This Auto Cert item is invalid, please remove it."
msgstr "Este elemento de auto-cert es inválido, elimínelo por favor."
#: src/views/certificate/CertificateEditor.vue:83
#: src/views/certificate/CertificateEditor.vue:91
msgid "This certificate is managed by Nginx UI"
msgstr ""
@ -1348,6 +1416,10 @@ msgstr ""
msgid "This field should not be empty"
msgstr "Este campo no debe estar vacío"
#: src/views/notification/Notification.vue:21
msgid "Title"
msgstr ""
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:42
msgid ""
"To make sure the certification auto-renewal can work normally, we need to "
@ -1361,6 +1433,7 @@ msgstr ""
"Nginx. ¿Estás seguro de que quieres continuar?"
#: src/views/certificate/Certificate.vue:39 src/views/config/config.ts:14
#: src/views/notification/Notification.vue:15
msgid "Type"
msgstr "Tipo"
@ -1376,7 +1449,7 @@ msgstr "Actualizado a"
msgid "Updated successfully"
msgstr "Actualización exitosa"
#: src/routes/index.ts:203 src/views/system/Upgrade.vue:143
#: src/routes/index.ts:212 src/views/system/Upgrade.vue:143
#: src/views/system/Upgrade.vue:235
msgid "Upgrade"
msgstr "Actualizar"
@ -1409,7 +1482,7 @@ msgstr "Nombre de usuario"
msgid "Username (*)"
msgstr "Nombre de usuario (*)"
#: src/views/certificate/Certificate.vue:80
#: src/views/certificate/Certificate.vue:88
msgid "Valid"
msgstr ""
@ -1417,7 +1490,12 @@ msgstr ""
msgid "View"
msgstr "Ver"
#: src/views/config/InspectConfig.vue:36
#: src/components/Notification/Notification.vue:143
#, fuzzy
msgid "View all notifications"
msgstr "Certificación"
#: src/constants/index.ts:18 src/views/config/InspectConfig.vue:36
#: src/views/domain/cert/components/AutoCertStepOne.vue:23
#: src/views/domain/DomainAdd.vue:114
msgid "Warning"
@ -1498,9 +1576,6 @@ msgstr "Puede consultar la actualización de Nginx UI en esta página."
#~ "verificación, se eliminarán los registros. Tenga en cuenta que las "
#~ "configuraciones de tiempo que aparecen debajo están todas en segundos."
#~ msgid "Certification"
#~ msgstr "Certificación"
#~ msgid "Delete ID: %{id}"
#~ msgstr "Eliminar ID: %{id}"

View file

@ -11,30 +11,30 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.3\n"
#: src/routes/index.ts:199
#: src/routes/index.ts:208
msgid "About"
msgstr "À propos"
#: src/routes/index.ts:151 src/views/domain/ngx_conf/LogEntry.vue:78
#: src/routes/index.ts:152 src/views/domain/ngx_conf/LogEntry.vue:78
msgid "Access Logs"
msgstr "Journaux d'accès"
#: src/views/certificate/Certificate.vue:96
#: src/views/certificate/Certificate.vue:104
#: src/views/certificate/DNSCredential.vue:32 src/views/config/config.ts:36
#: src/views/domain/DomainList.vue:50 src/views/environment/Environment.vue:105
#: src/views/user/User.vue:46
#: src/views/notification/Notification.vue:38 src/views/user/User.vue:46
msgid "Action"
msgstr "Action"
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:114
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:115
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
#: src/views/certificate/Certificate.vue:120
#: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:115
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:308
msgid "Add"
msgstr "Ajouter"
#: src/routes/index.ts:122 src/views/certificate/Certificate.vue:115
#: src/views/certificate/CertificateEditor.vue:76
#: src/routes/index.ts:123 src/views/certificate/CertificateEditor.vue:84
#, fuzzy
msgid "Add Certificate"
msgstr "État du certificat"
@ -48,7 +48,7 @@ msgstr "Ajouter une directive"
msgid "Add Location"
msgstr "Ajouter une localisation"
#: src/routes/index.ts:70 src/views/domain/DomainAdd.vue:91
#: src/routes/index.ts:71 src/views/domain/DomainAdd.vue:91
msgid "Add Site"
msgstr "Ajouter un site"
@ -78,12 +78,18 @@ msgstr "Jeton d'API"
msgid "Arch"
msgstr "Arch"
#: src/components/Notification/Notification.vue:86
#: src/views/notification/Notification.vue:73
#, fuzzy
msgid "Are you sure you want to clear all notifications?"
msgstr "Voulez-vous vraiment effacer l'historique du chat ?"
#: src/components/ChatGPT/ChatGPT.vue:279
msgid "Are you sure you want to clear the record of chat?"
msgstr "Voulez-vous vraiment effacer l'historique du chat ?"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:347
#: src/views/domain/DomainList.vue:145
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:353
#: src/views/domain/DomainList.vue:144
msgid "Are you sure you want to delete?"
msgstr "Etes-vous sûr que vous voulez supprimer ?"
@ -125,7 +131,7 @@ msgstr "Renouvellement automatique désactivé pour %{name}"
msgid "Auto-renewal enabled for %{name}"
msgstr "Renouvellement automatique activé pour %{name}"
#: src/views/certificate/CertificateEditor.vue:168
#: src/views/certificate/CertificateEditor.vue:205
#: src/views/config/Config.vue:75 src/views/config/ConfigEdit.vue:89
#: src/views/domain/DomainEdit.vue:261 src/views/nginx_log/NginxLog.vue:170
msgid "Back"
@ -165,7 +171,7 @@ msgstr ""
#: src/components/ChatGPT/ChatGPT.vue:260
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:58
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:139
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:143
#: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
#: src/views/domain/cert/components/ObtainCert.vue:150
#: src/views/domain/components/Deploy.vue:24
@ -183,17 +189,17 @@ msgstr "Le certificat a expiré"
msgid "Certificate is valid"
msgstr "Le certificat est valide"
#: src/views/certificate/CertificateEditor.vue:119
#: src/views/certificate/CertificateEditor.vue:127
#: src/views/domain/cert/Cert.vue:35
msgid "Certificate Status"
msgstr "État du certificat"
#: src/routes/index.ts:100 src/views/certificate/Certificate.vue:109
#: src/routes/index.ts:101 src/views/certificate/Certificate.vue:117
#, fuzzy
msgid "Certificates"
msgstr "État du certificat"
#: src/routes/index.ts:109
#: src/routes/index.ts:110
#, fuzzy
msgid "Certificates List"
msgstr "Liste des certifications"
@ -228,9 +234,17 @@ msgid "Cleaning environment variables"
msgstr "Nettoyage des variables d'environnement"
#: src/components/ChatGPT/ChatGPT.vue:283
#: src/components/Notification/Notification.vue:91
#: src/views/notification/Notification.vue:78
msgid "Clear"
msgstr "Effacer"
#: src/components/Notification/Notification.vue:42
#: src/views/notification/Notification.vue:47
#, fuzzy
msgid "Cleared successfully"
msgstr "Désactivé avec succès"
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/domain/ngx_conf/LocationEditor.vue:121
#: src/views/domain/ngx_conf/LocationEditor.vue:90
@ -284,7 +298,7 @@ msgstr "CPU :"
msgid "Create Another"
msgstr "Créer un autre"
#: src/views/user/User.vue:34
#: src/views/notification/Notification.vue:32 src/views/user/User.vue:34
msgid "Created at"
msgstr "Créé le"
@ -309,7 +323,7 @@ msgstr "Version actuelle"
msgid "Custom"
msgstr "Custom"
#: src/routes/index.ts:51
#: src/routes/index.ts:52
msgid "Dashboard"
msgstr "Dashboard"
@ -317,7 +331,7 @@ msgstr "Dashboard"
msgid "Database (Optional, default: database)"
msgstr "Base de données (Facultatif, par défaut : database)"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:354
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:360
#: src/views/domain/DomainList.vue:153
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:259
msgid "Delete"
@ -355,6 +369,10 @@ msgstr "Sauvegarde réussie"
msgid "Description"
msgstr "Description"
#: src/views/notification/Notification.vue:28
msgid "Details"
msgstr ""
#: src/views/system/About.vue:25
msgid "Development Mode"
msgstr "Mode développement"
@ -382,7 +400,7 @@ msgid "Disable auto-renewal failed for %{name}"
msgstr "La désactivation du renouvellement automatique a échoué pour %{name}"
#: src/views/domain/cert/ChangeCert.vue:48 src/views/domain/DomainEdit.vue:190
#: src/views/domain/DomainList.vue:123
#: src/views/domain/DomainList.vue:122
msgid "Disabled"
msgstr "Désactivé"
@ -395,7 +413,7 @@ msgstr "Désactivé avec succès"
msgid "Disk IO"
msgstr "E/S disque"
#: src/routes/index.ts:130 src/views/certificate/DNSCredential.vue:39
#: src/routes/index.ts:131 src/views/certificate/DNSCredential.vue:39
msgid "DNS Credentials"
msgstr "Identifiants DNS"
@ -439,7 +457,7 @@ msgstr "Voulez-vous supprimer ce serveur ?"
msgid "Domain Config Created Successfully"
msgstr "La configuration du domaine a été créée avec succès"
#: src/views/certificate/CertificateEditor.vue:103
#: src/views/certificate/CertificateEditor.vue:111
#, fuzzy
msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
msgstr ""
@ -459,7 +477,7 @@ msgid "Dry run mode enabled"
msgstr ""
#: src/views/domain/components/SiteDuplicate.vue:128
#: src/views/domain/DomainList.vue:139
#: src/views/domain/DomainList.vue:138
msgid "Duplicate"
msgstr "Dupliquer"
@ -487,11 +505,11 @@ msgstr "Dupliqué avec succès"
msgid "Edit %{n}"
msgstr "Modifier %{n}"
#: src/routes/index.ts:92 src/views/config/ConfigEdit.vue:83
#: src/routes/index.ts:93 src/views/config/ConfigEdit.vue:83
msgid "Edit Configuration"
msgstr "Modifier la configuration"
#: src/routes/index.ts:74
#: src/routes/index.ts:75
msgid "Edit Site"
msgstr "Modifier le site"
@ -532,7 +550,7 @@ msgstr "Activer TLS"
#: src/views/domain/cert/ChangeCert.vue:44
#: src/views/domain/components/Deploy.vue:89
#: src/views/domain/components/RightSettings.vue:75
#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:131
#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:130
msgid "Enabled"
msgstr "Activé"
@ -546,7 +564,7 @@ msgstr "Activé avec succès"
msgid "Encrypt website with Let's Encrypt"
msgstr "Crypter le site Web avec Let's Encrypt"
#: src/routes/index.ts:168 src/views/environment/Environment.vue:113
#: src/routes/index.ts:169 src/views/environment/Environment.vue:113
msgid "Environment"
msgstr ""
@ -555,11 +573,11 @@ msgstr ""
msgid "Environments"
msgstr "Commentaires"
#: src/views/config/InspectConfig.vue:47
#: src/constants/index.ts:17 src/views/config/InspectConfig.vue:47
msgid "Error"
msgstr "Erreur"
#: src/routes/index.ts:155 src/views/domain/ngx_conf/LogEntry.vue:86
#: src/routes/index.ts:156 src/views/domain/ngx_conf/LogEntry.vue:86
msgid "Error Logs"
msgstr "Journaux d'erreurs"
@ -567,7 +585,7 @@ msgstr "Journaux d'erreurs"
msgid "Executable Path"
msgstr "Chemin exécutable"
#: src/views/certificate/Certificate.vue:84
#: src/views/certificate/Certificate.vue:92
msgid "Expired"
msgstr ""
@ -633,6 +651,11 @@ msgstr "Erreur de format %{msg}"
msgid "Format successfully"
msgstr "Formaté avec succès"
#: src/views/certificate/Certificate.vue:45
#, fuzzy
msgid "General Certificate"
msgstr "Changer de certificat"
#: src/components/StdDesign/StdDataEntry/components/StdPassword.vue:60
msgid "Generate"
msgstr "Générer"
@ -670,7 +693,7 @@ msgstr "GPT-4-32K"
msgid "GPT-4-Turbo"
msgstr "GPT-3.5-Turbo"
#: src/routes/index.ts:44
#: src/routes/index.ts:45
msgid "Home"
msgstr "Menu principal"
@ -690,6 +713,10 @@ msgstr "Port HTTP"
msgid "HTTP01"
msgstr "HTTP01"
#: src/constants/index.ts:19
msgid "Info"
msgstr ""
#: src/language/constants.ts:27
msgid "Initial core upgrader error"
msgstr "Erreur du programme de mise à niveau initial du core"
@ -698,7 +725,7 @@ msgstr "Erreur du programme de mise à niveau initial du core"
msgid "Initialing core upgrader"
msgstr "Initialisation du programme de mise à niveau du core"
#: src/routes/index.ts:211 src/views/other/Install.vue:139
#: src/routes/index.ts:220 src/views/other/Install.vue:139
msgid "Install"
msgstr "Installer"
@ -760,12 +787,12 @@ msgstr "Localisation"
msgid "Locations"
msgstr "Localisations"
#: src/views/certificate/CertificateEditor.vue:156
#: src/views/certificate/CertificateEditor.vue:193
#, fuzzy
msgid "Log"
msgstr "Connexion"
#: src/routes/index.ts:217 src/views/other/Login.vue:147
#: src/routes/index.ts:226 src/views/other/Login.vue:147
msgid "Login"
msgstr "Connexion"
@ -773,7 +800,7 @@ msgstr "Connexion"
msgid "Login successful"
msgstr "Connexion réussie"
#: src/layouts/HeaderLayout.vue:21
#: src/layouts/HeaderLayout.vue:22
msgid "Logout successful"
msgstr "Déconnexion réussie"
@ -786,18 +813,23 @@ msgstr ""
"Assurez vous d'avoir configuré un reverse proxy pour le répertoire .well-"
"known vers HTTPChallengePort avant d'obtenir le certificat."
#: src/routes/index.ts:83
#: src/routes/index.ts:84
msgid "Manage Configs"
msgstr "Gérer les configurations"
#: src/routes/index.ts:58 src/views/domain/DomainList.vue:102
#: src/routes/index.ts:59 src/views/domain/DomainList.vue:102
msgid "Manage Sites"
msgstr "Gérer les sites"
#: src/routes/index.ts:176 src/views/user/User.vue:53
#: src/routes/index.ts:185 src/views/user/User.vue:53
msgid "Manage Users"
msgstr "Gérer les utilisateurs"
#: src/views/certificate/Certificate.vue:44
#, fuzzy
msgid "Managed Certificate"
msgstr "Changer de certificat"
#: src/views/dashboard/ServerAnalytic.vue:220
msgid "Memory"
msgstr "Mémoire"
@ -807,12 +839,12 @@ msgid "Memory and Storage"
msgstr "Mémoire et stockage"
#: src/components/ChatGPT/ChatGPT.vue:256
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
msgid "Modify"
msgstr "Modifier"
#: src/routes/index.ts:114 src/views/certificate/CertificateEditor.vue:76
#: src/routes/index.ts:115 src/views/certificate/CertificateEditor.vue:84
#, fuzzy
msgid "Modify Certificate"
msgstr "État du certificat"
@ -826,6 +858,7 @@ msgid "Multi-line Directive"
msgstr "Directive multiligne"
#: src/views/certificate/Certificate.vue:22
#: src/views/certificate/CertificateEditor.vue:145
#: src/views/certificate/DNSCredential.vue:13 src/views/config/config.ts:9
#: src/views/domain/cert/ChangeCert.vue:21
#: src/views/domain/components/RightSettings.vue:81
@ -880,7 +913,7 @@ msgstr "Contrôle Nginx"
msgid "Nginx Error Log Path"
msgstr "Chemin du journal des erreurs Nginx"
#: src/routes/index.ts:145 src/views/nginx_log/NginxLog.vue:145
#: src/routes/index.ts:146 src/views/nginx_log/NginxLog.vue:145
msgid "Nginx Log"
msgstr "Journal Nginx"
@ -893,10 +926,12 @@ msgid "Nginx restarted successfully"
msgstr "Nginx a redémarré avec succès"
#: src/components/ChatGPT/ChatGPT.vue:277
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:345
#: src/views/domain/DomainList.vue:143
#: src/components/Notification/Notification.vue:84
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:351
#: src/views/domain/DomainList.vue:142
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:81
#: src/views/domain/ngx_conf/LocationEditor.vue:76
#: src/views/notification/Notification.vue:71
msgid "No"
msgstr "Non"
@ -905,11 +940,11 @@ msgstr "Non"
msgid "Node Secret"
msgstr "Secret Jwt"
#: src/views/certificate/Certificate.vue:90
#: src/views/certificate/Certificate.vue:98
msgid "Not After"
msgstr ""
#: src/routes/index.ts:223 src/routes/index.ts:225
#: src/routes/index.ts:232 src/routes/index.ts:234
msgid "Not Found"
msgstr "Introuvable"
@ -922,6 +957,16 @@ msgstr "Non valide avant : %{date}"
msgid "Note"
msgstr "Note"
#: src/views/notification/Notification.vue:63
#, fuzzy
msgid "Notification"
msgstr "Certification"
#: src/components/Notification/Notification.vue:82 src/routes/index.ts:177
#, fuzzy
msgid "Notifications"
msgstr "Certification"
#: src/views/domain/cert/components/ObtainCert.vue:191
msgid "Obtain certificate"
msgstr "Obtenir un certificat"
@ -937,16 +982,18 @@ msgid "Offline"
msgstr ""
#: src/components/ChatGPT/ChatGPT.vue:278
#: src/components/Notification/Notification.vue:85
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:59
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:140
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:346
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:144
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:352
#: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:104
#: src/views/domain/cert/components/ObtainCert.vue:149
#: src/views/domain/components/Deploy.vue:23
#: src/views/domain/components/RightSettings.vue:51
#: src/views/domain/DomainList.vue:144
#: src/views/domain/DomainList.vue:143
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:215
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:47
#: src/views/notification/Notification.vue:72
msgid "OK"
msgstr "OK"
@ -1057,7 +1104,7 @@ msgstr ""
msgid "Pre-release"
msgstr ""
#: src/routes/index.ts:184 src/views/preference/Preference.vue:85
#: src/routes/index.ts:193 src/views/preference/Preference.vue:85
msgid "Preference"
msgstr "Préférence"
@ -1123,12 +1170,27 @@ msgstr "Rechargement"
msgid "Reloading nginx"
msgstr "Rechargement de nginx"
#: src/components/Notification/Notification.vue:52
#, fuzzy
msgid "Removed successfully"
msgstr "Enregistré avec succès"
#: src/views/certificate/RenewCert.vue:43
#: src/views/certificate/RenewCert.vue:47
#, fuzzy
msgid "Renew Certificate"
msgstr "Changer de certificat"
#: src/language/constants.ts:38
#, fuzzy
msgid "Renew Certificate Error"
msgstr "Changer de certificat"
#: src/language/constants.ts:37
#, fuzzy
msgid "Renew Certificate Success"
msgstr "Changer de certificat"
#: src/views/certificate/RenewCert.vue:25
#, fuzzy
msgid "Renew successfully"
@ -1159,7 +1221,7 @@ msgid "Running"
msgstr "En cours d'éxécution"
#: src/components/ChatGPT/ChatGPT.vue:259
#: src/views/certificate/CertificateEditor.vue:175
#: src/views/certificate/CertificateEditor.vue:212
#: src/views/config/ConfigEdit.vue:98 src/views/domain/DomainEdit.vue:268
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:111
#: src/views/preference/Preference.vue:113
@ -1176,7 +1238,7 @@ msgid "Save error %{msg}"
msgstr "Enregistrer l'erreur %{msg}"
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
#: src/views/certificate/CertificateEditor.vue:46
#: src/views/certificate/CertificateEditor.vue:47
#: src/views/preference/Preference.vue:58
msgid "Save successfully"
msgstr "Sauvegarde réussie"
@ -1243,29 +1305,31 @@ msgstr "Utilisation du fournisseur de challenge HTTP01"
msgid "Single Directive"
msgstr "Directive unique"
#: src/routes/index.ts:159
#: src/routes/index.ts:160
msgid "Site Logs"
msgstr "Journaux du site"
#: src/routes/index.ts:66
#: src/routes/index.ts:67
msgid "Sites List"
msgstr "Liste des sites"
#: src/views/certificate/CertificateEditor.vue:135
#: src/views/certificate/CertificateEditor.vue:172
#, fuzzy
msgid "SSL Certificate Content"
msgstr "Contenu de la certification SSL"
#: src/views/certificate/CertificateEditor.vue:142
#: src/views/certificate/CertificateEditor.vue:179
#, fuzzy
msgid "SSL Certificate Key Content"
msgstr "Contenu de la clé de certification SSL"
#: src/views/certificate/Certificate.vue:63
#: src/views/certificate/Certificate.vue:71
#: src/views/certificate/CertificateEditor.vue:163
msgid "SSL Certificate Key Path"
msgstr "Chemin de la clé du certificat SSL"
#: src/views/certificate/Certificate.vue:55
#: src/views/certificate/Certificate.vue:63
#: src/views/certificate/CertificateEditor.vue:154
msgid "SSL Certificate Path"
msgstr "Chemin du certificat SSL"
@ -1279,7 +1343,7 @@ msgstr "Connexion"
msgid "Stable"
msgstr "Tableau"
#: src/views/certificate/Certificate.vue:71 src/views/domain/DomainList.vue:25
#: src/views/certificate/Certificate.vue:79 src/views/domain/DomainList.vue:25
#: src/views/environment/Environment.vue:78
msgid "Status"
msgstr "Statut"
@ -1297,6 +1361,10 @@ msgstr "Stockage"
msgid "Subject Name: %{subject}"
msgstr "Nom du sujet : %{name}"
#: src/constants/index.ts:20
msgid "Success"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:233
#, fuzzy
msgid "Swap"
@ -1310,7 +1378,7 @@ msgstr ""
msgid "Switch to light theme"
msgstr ""
#: src/routes/index.ts:192
#: src/routes/index.ts:201
msgid "System"
msgstr "Système"
@ -1322,7 +1390,7 @@ msgstr "Tableau"
msgid "Target"
msgstr ""
#: src/routes/index.ts:137 src/views/pty/Terminal.vue:95
#: src/routes/index.ts:138 src/views/pty/Terminal.vue:95
msgid "Terminal"
msgstr "Terminal"
@ -1357,14 +1425,14 @@ msgstr ""
msgid "The username or password is incorrect"
msgstr "Le pseudo ou mot de passe est incorect"
#: src/views/certificate/CertificateEditor.vue:93
#: src/views/certificate/CertificateEditor.vue:101
#, fuzzy
msgid "This Auto Cert item is invalid, please remove it."
msgstr ""
"Cet élément de certification automatique n'est pas valide, veuillez le "
"supprimer."
#: src/views/certificate/CertificateEditor.vue:83
#: src/views/certificate/CertificateEditor.vue:91
msgid "This certificate is managed by Nginx UI"
msgstr ""
@ -1372,6 +1440,10 @@ msgstr ""
msgid "This field should not be empty"
msgstr ""
#: src/views/notification/Notification.vue:21
msgid "Title"
msgstr ""
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:42
msgid ""
"To make sure the certification auto-renewal can work normally, we need to "
@ -1385,6 +1457,7 @@ msgstr ""
"ce fichier et recharger le Nginx. Êtes-vous sûr de vouloir continuer?"
#: src/views/certificate/Certificate.vue:39 src/views/config/config.ts:14
#: src/views/notification/Notification.vue:15
msgid "Type"
msgstr "Type"
@ -1400,7 +1473,7 @@ msgstr "Mis à jour le"
msgid "Updated successfully"
msgstr "Mis à jour avec succés"
#: src/routes/index.ts:203 src/views/system/Upgrade.vue:143
#: src/routes/index.ts:212 src/views/system/Upgrade.vue:143
#: src/views/system/Upgrade.vue:235
msgid "Upgrade"
msgstr "Mettre à niveau"
@ -1434,7 +1507,7 @@ msgstr "Nom d'utilisateur"
msgid "Username (*)"
msgstr "Nom d'utilisateur (*)"
#: src/views/certificate/Certificate.vue:80
#: src/views/certificate/Certificate.vue:88
msgid "Valid"
msgstr ""
@ -1442,7 +1515,12 @@ msgstr ""
msgid "View"
msgstr "Voir"
#: src/views/config/InspectConfig.vue:36
#: src/components/Notification/Notification.vue:143
#, fuzzy
msgid "View all notifications"
msgstr "Certification"
#: src/constants/index.ts:18 src/views/config/InspectConfig.vue:36
#: src/views/domain/cert/components/AutoCertStepOne.vue:23
#: src/views/domain/DomainAdd.vue:114
msgid "Warning"
@ -1524,9 +1602,6 @@ msgstr "Vous pouvez vérifier la mise à niveau de Nginx UI sur cette page."
#~ "supprimés. Veuillez noter que les configurations de temps ci-dessous sont "
#~ "toutes en secondes."
#~ msgid "Certification"
#~ msgstr "Certification"
#~ msgid "Delete ID: %{id}"
#~ msgstr "Supprimer l'identifiant : %{id}"

View file

@ -2,34 +2,35 @@ msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
#: src/routes/index.ts:199
#: src/routes/index.ts:208
msgid "About"
msgstr ""
#: src/routes/index.ts:151
#: src/routes/index.ts:152
#: src/views/domain/ngx_conf/LogEntry.vue:78
msgid "Access Logs"
msgstr ""
#: src/views/certificate/Certificate.vue:96
#: src/views/certificate/Certificate.vue:104
#: src/views/certificate/DNSCredential.vue:32
#: src/views/config/config.ts:36
#: src/views/domain/DomainList.vue:50
#: src/views/environment/Environment.vue:105
#: src/views/notification/Notification.vue:38
#: src/views/user/User.vue:46
msgid "Action"
msgstr ""
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:114
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:115
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
#: src/views/certificate/Certificate.vue:120
#: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:115
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:308
msgid "Add"
msgstr ""
#: src/routes/index.ts:122
#: src/views/certificate/Certificate.vue:115
#: src/views/certificate/CertificateEditor.vue:76
#: src/routes/index.ts:123
#: src/views/certificate/CertificateEditor.vue:84
msgid "Add Certificate"
msgstr ""
@ -42,7 +43,7 @@ msgstr ""
msgid "Add Location"
msgstr ""
#: src/routes/index.ts:70
#: src/routes/index.ts:71
#: src/views/domain/DomainAdd.vue:91
msgid "Add Site"
msgstr ""
@ -71,12 +72,17 @@ msgstr ""
msgid "Arch"
msgstr ""
#: src/components/Notification/Notification.vue:86
#: src/views/notification/Notification.vue:73
msgid "Are you sure you want to clear all notifications?"
msgstr ""
#: src/components/ChatGPT/ChatGPT.vue:279
msgid "Are you sure you want to clear the record of chat?"
msgstr ""
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:347
#: src/views/domain/DomainList.vue:145
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:353
#: src/views/domain/DomainList.vue:144
msgid "Are you sure you want to delete?"
msgstr ""
@ -117,7 +123,7 @@ msgstr ""
msgid "Auto-renewal enabled for %{name}"
msgstr ""
#: src/views/certificate/CertificateEditor.vue:168
#: src/views/certificate/CertificateEditor.vue:205
#: src/views/config/Config.vue:75
#: src/views/config/ConfigEdit.vue:89
#: src/views/domain/DomainEdit.vue:261
@ -158,7 +164,7 @@ msgstr ""
#: src/components/ChatGPT/ChatGPT.vue:260
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:58
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:139
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:143
#: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
#: src/views/domain/cert/components/ObtainCert.vue:150
#: src/views/domain/components/Deploy.vue:24
@ -176,17 +182,17 @@ msgstr ""
msgid "Certificate is valid"
msgstr ""
#: src/views/certificate/CertificateEditor.vue:119
#: src/views/certificate/CertificateEditor.vue:127
#: src/views/domain/cert/Cert.vue:35
msgid "Certificate Status"
msgstr ""
#: src/routes/index.ts:100
#: src/views/certificate/Certificate.vue:109
#: src/routes/index.ts:101
#: src/views/certificate/Certificate.vue:117
msgid "Certificates"
msgstr ""
#: src/routes/index.ts:109
#: src/routes/index.ts:110
msgid "Certificates List"
msgstr ""
@ -220,9 +226,16 @@ msgid "Cleaning environment variables"
msgstr ""
#: src/components/ChatGPT/ChatGPT.vue:283
#: src/components/Notification/Notification.vue:91
#: src/views/notification/Notification.vue:78
msgid "Clear"
msgstr ""
#: src/components/Notification/Notification.vue:42
#: src/views/notification/Notification.vue:47
msgid "Cleared successfully"
msgstr ""
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/domain/ngx_conf/LocationEditor.vue:121
#: src/views/domain/ngx_conf/LocationEditor.vue:90
@ -276,6 +289,7 @@ msgstr ""
msgid "Create Another"
msgstr ""
#: src/views/notification/Notification.vue:32
#: src/views/user/User.vue:34
msgid "Created at"
msgstr ""
@ -301,7 +315,7 @@ msgstr ""
msgid "Custom"
msgstr ""
#: src/routes/index.ts:51
#: src/routes/index.ts:52
msgid "Dashboard"
msgstr ""
@ -309,7 +323,7 @@ msgstr ""
msgid "Database (Optional, default: database)"
msgstr ""
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:354
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:360
#: src/views/domain/DomainList.vue:153
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:259
msgid "Delete"
@ -345,6 +359,10 @@ msgstr ""
msgid "Description"
msgstr ""
#: src/views/notification/Notification.vue:28
msgid "Details"
msgstr ""
#: src/views/system/About.vue:25
msgid "Development Mode"
msgstr ""
@ -371,7 +389,7 @@ msgstr ""
#: src/views/domain/cert/ChangeCert.vue:48
#: src/views/domain/DomainEdit.vue:190
#: src/views/domain/DomainList.vue:123
#: src/views/domain/DomainList.vue:122
msgid "Disabled"
msgstr ""
@ -384,7 +402,7 @@ msgstr ""
msgid "Disk IO"
msgstr ""
#: src/routes/index.ts:130
#: src/routes/index.ts:131
#: src/views/certificate/DNSCredential.vue:39
msgid "DNS Credentials"
msgstr ""
@ -428,7 +446,7 @@ msgstr ""
msgid "Domain Config Created Successfully"
msgstr ""
#: src/views/certificate/CertificateEditor.vue:103
#: src/views/certificate/CertificateEditor.vue:111
msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
msgstr ""
@ -445,7 +463,7 @@ msgid "Dry run mode enabled"
msgstr ""
#: src/views/domain/components/SiteDuplicate.vue:128
#: src/views/domain/DomainList.vue:139
#: src/views/domain/DomainList.vue:138
msgid "Duplicate"
msgstr ""
@ -469,12 +487,12 @@ msgstr ""
msgid "Edit %{n}"
msgstr ""
#: src/routes/index.ts:92
#: src/routes/index.ts:93
#: src/views/config/ConfigEdit.vue:83
msgid "Edit Configuration"
msgstr ""
#: src/routes/index.ts:74
#: src/routes/index.ts:75
msgid "Edit Site"
msgstr ""
@ -514,7 +532,7 @@ msgstr ""
#: src/views/domain/components/Deploy.vue:89
#: src/views/domain/components/RightSettings.vue:75
#: src/views/domain/DomainEdit.vue:184
#: src/views/domain/DomainList.vue:131
#: src/views/domain/DomainList.vue:130
msgid "Enabled"
msgstr ""
@ -529,7 +547,7 @@ msgstr ""
msgid "Encrypt website with Let's Encrypt"
msgstr ""
#: src/routes/index.ts:168
#: src/routes/index.ts:169
#: src/views/environment/Environment.vue:113
msgid "Environment"
msgstr ""
@ -538,11 +556,12 @@ msgstr ""
msgid "Environments"
msgstr ""
#: src/constants/index.ts:17
#: src/views/config/InspectConfig.vue:47
msgid "Error"
msgstr ""
#: src/routes/index.ts:155
#: src/routes/index.ts:156
#: src/views/domain/ngx_conf/LogEntry.vue:86
msgid "Error Logs"
msgstr ""
@ -551,7 +570,7 @@ msgstr ""
msgid "Executable Path"
msgstr ""
#: src/views/certificate/Certificate.vue:84
#: src/views/certificate/Certificate.vue:92
msgid "Expired"
msgstr ""
@ -615,6 +634,10 @@ msgstr ""
msgid "Format successfully"
msgstr ""
#: src/views/certificate/Certificate.vue:45
msgid "General Certificate"
msgstr ""
#: src/components/StdDesign/StdDataEntry/components/StdPassword.vue:60
msgid "Generate"
msgstr ""
@ -651,7 +674,7 @@ msgstr ""
msgid "GPT-4-Turbo"
msgstr ""
#: src/routes/index.ts:44
#: src/routes/index.ts:45
msgid "Home"
msgstr ""
@ -671,6 +694,10 @@ msgstr ""
msgid "HTTP01"
msgstr ""
#: src/constants/index.ts:19
msgid "Info"
msgstr ""
#: src/language/constants.ts:27
msgid "Initial core upgrader error"
msgstr ""
@ -679,7 +706,7 @@ msgstr ""
msgid "Initialing core upgrader"
msgstr ""
#: src/routes/index.ts:211
#: src/routes/index.ts:220
#: src/views/other/Install.vue:139
msgid "Install"
msgstr ""
@ -737,11 +764,11 @@ msgstr ""
msgid "Locations"
msgstr ""
#: src/views/certificate/CertificateEditor.vue:156
#: src/views/certificate/CertificateEditor.vue:193
msgid "Log"
msgstr ""
#: src/routes/index.ts:217
#: src/routes/index.ts:226
#: src/views/other/Login.vue:147
msgid "Login"
msgstr ""
@ -751,7 +778,7 @@ msgstr ""
msgid "Login successful"
msgstr ""
#: src/layouts/HeaderLayout.vue:21
#: src/layouts/HeaderLayout.vue:22
msgid "Logout successful"
msgstr ""
@ -759,20 +786,24 @@ msgstr ""
msgid "Make sure you have configured a reverse proxy for .well-known directory to HTTPChallengePort before obtaining the certificate."
msgstr ""
#: src/routes/index.ts:83
#: src/routes/index.ts:84
msgid "Manage Configs"
msgstr ""
#: src/routes/index.ts:58
#: src/routes/index.ts:59
#: src/views/domain/DomainList.vue:102
msgid "Manage Sites"
msgstr ""
#: src/routes/index.ts:176
#: src/routes/index.ts:185
#: src/views/user/User.vue:53
msgid "Manage Users"
msgstr ""
#: src/views/certificate/Certificate.vue:44
msgid "Managed Certificate"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:220
msgid "Memory"
msgstr ""
@ -782,13 +813,13 @@ msgid "Memory and Storage"
msgstr ""
#: src/components/ChatGPT/ChatGPT.vue:256
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
msgid "Modify"
msgstr ""
#: src/routes/index.ts:114
#: src/views/certificate/CertificateEditor.vue:76
#: src/routes/index.ts:115
#: src/views/certificate/CertificateEditor.vue:84
msgid "Modify Certificate"
msgstr ""
@ -801,6 +832,7 @@ msgid "Multi-line Directive"
msgstr ""
#: src/views/certificate/Certificate.vue:22
#: src/views/certificate/CertificateEditor.vue:145
#: src/views/certificate/DNSCredential.vue:13
#: src/views/config/config.ts:9
#: src/views/domain/cert/ChangeCert.vue:21
@ -856,7 +888,7 @@ msgstr ""
msgid "Nginx Error Log Path"
msgstr ""
#: src/routes/index.ts:145
#: src/routes/index.ts:146
#: src/views/nginx_log/NginxLog.vue:145
msgid "Nginx Log"
msgstr ""
@ -870,10 +902,12 @@ msgid "Nginx restarted successfully"
msgstr ""
#: src/components/ChatGPT/ChatGPT.vue:277
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:345
#: src/views/domain/DomainList.vue:143
#: src/components/Notification/Notification.vue:84
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:351
#: src/views/domain/DomainList.vue:142
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:81
#: src/views/domain/ngx_conf/LocationEditor.vue:76
#: src/views/notification/Notification.vue:71
msgid "No"
msgstr ""
@ -881,12 +915,12 @@ msgstr ""
msgid "Node Secret"
msgstr ""
#: src/views/certificate/Certificate.vue:90
#: src/views/certificate/Certificate.vue:98
msgid "Not After"
msgstr ""
#: src/routes/index.ts:223
#: src/routes/index.ts:225
#: src/routes/index.ts:232
#: src/routes/index.ts:234
msgid "Not Found"
msgstr ""
@ -899,6 +933,15 @@ msgstr ""
msgid "Note"
msgstr ""
#: src/views/notification/Notification.vue:63
msgid "Notification"
msgstr ""
#: src/components/Notification/Notification.vue:82
#: src/routes/index.ts:177
msgid "Notifications"
msgstr ""
#: src/views/domain/cert/components/ObtainCert.vue:191
msgid "Obtain certificate"
msgstr ""
@ -914,16 +957,18 @@ msgid "Offline"
msgstr ""
#: src/components/ChatGPT/ChatGPT.vue:278
#: src/components/Notification/Notification.vue:85
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:59
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:140
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:346
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:144
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:352
#: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:104
#: src/views/domain/cert/components/ObtainCert.vue:149
#: src/views/domain/components/Deploy.vue:23
#: src/views/domain/components/RightSettings.vue:51
#: src/views/domain/DomainList.vue:144
#: src/views/domain/DomainList.vue:143
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:215
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:47
#: src/views/notification/Notification.vue:72
msgid "OK"
msgstr ""
@ -1024,7 +1069,7 @@ msgstr ""
msgid "Pre-release"
msgstr ""
#: src/routes/index.ts:184
#: src/routes/index.ts:193
#: src/views/preference/Preference.vue:85
msgid "Preference"
msgstr ""
@ -1088,11 +1133,23 @@ msgstr ""
msgid "Reloading nginx"
msgstr ""
#: src/components/Notification/Notification.vue:52
msgid "Removed successfully"
msgstr ""
#: src/views/certificate/RenewCert.vue:43
#: src/views/certificate/RenewCert.vue:47
msgid "Renew Certificate"
msgstr ""
#: src/language/constants.ts:38
msgid "Renew Certificate Error"
msgstr ""
#: src/language/constants.ts:37
msgid "Renew Certificate Success"
msgstr ""
#: src/views/certificate/RenewCert.vue:25
msgid "Renew successfully"
msgstr ""
@ -1122,7 +1179,7 @@ msgid "Running"
msgstr ""
#: src/components/ChatGPT/ChatGPT.vue:259
#: src/views/certificate/CertificateEditor.vue:175
#: src/views/certificate/CertificateEditor.vue:212
#: src/views/config/ConfigEdit.vue:98
#: src/views/domain/DomainEdit.vue:268
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:111
@ -1141,7 +1198,7 @@ msgid "Save error %{msg}"
msgstr ""
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
#: src/views/certificate/CertificateEditor.vue:46
#: src/views/certificate/CertificateEditor.vue:47
#: src/views/preference/Preference.vue:58
msgid "Save successfully"
msgstr ""
@ -1209,27 +1266,29 @@ msgstr ""
msgid "Single Directive"
msgstr ""
#: src/routes/index.ts:159
#: src/routes/index.ts:160
msgid "Site Logs"
msgstr ""
#: src/routes/index.ts:66
#: src/routes/index.ts:67
msgid "Sites List"
msgstr ""
#: src/views/certificate/CertificateEditor.vue:135
#: src/views/certificate/CertificateEditor.vue:172
msgid "SSL Certificate Content"
msgstr ""
#: src/views/certificate/CertificateEditor.vue:142
#: src/views/certificate/CertificateEditor.vue:179
msgid "SSL Certificate Key Content"
msgstr ""
#: src/views/certificate/Certificate.vue:63
#: src/views/certificate/Certificate.vue:71
#: src/views/certificate/CertificateEditor.vue:163
msgid "SSL Certificate Key Path"
msgstr ""
#: src/views/certificate/Certificate.vue:55
#: src/views/certificate/Certificate.vue:63
#: src/views/certificate/CertificateEditor.vue:154
msgid "SSL Certificate Path"
msgstr ""
@ -1242,7 +1301,7 @@ msgstr ""
msgid "Stable"
msgstr ""
#: src/views/certificate/Certificate.vue:71
#: src/views/certificate/Certificate.vue:79
#: src/views/domain/DomainList.vue:25
#: src/views/environment/Environment.vue:78
msgid "Status"
@ -1260,6 +1319,10 @@ msgstr ""
msgid "Subject Name: %{subject}"
msgstr ""
#: src/constants/index.ts:20
msgid "Success"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:233
msgid "Swap"
msgstr ""
@ -1272,7 +1335,7 @@ msgstr ""
msgid "Switch to light theme"
msgstr ""
#: src/routes/index.ts:192
#: src/routes/index.ts:201
msgid "System"
msgstr ""
@ -1284,7 +1347,7 @@ msgstr ""
msgid "Target"
msgstr ""
#: src/routes/index.ts:137
#: src/routes/index.ts:138
#: src/views/pty/Terminal.vue:95
msgid "Terminal"
msgstr ""
@ -1309,11 +1372,11 @@ msgstr ""
msgid "The username or password is incorrect"
msgstr ""
#: src/views/certificate/CertificateEditor.vue:93
#: src/views/certificate/CertificateEditor.vue:101
msgid "This Auto Cert item is invalid, please remove it."
msgstr ""
#: src/views/certificate/CertificateEditor.vue:83
#: src/views/certificate/CertificateEditor.vue:91
msgid "This certificate is managed by Nginx UI"
msgstr ""
@ -1321,12 +1384,17 @@ msgstr ""
msgid "This field should not be empty"
msgstr ""
#: src/views/notification/Notification.vue:21
msgid "Title"
msgstr ""
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:42
msgid "To make sure the certification auto-renewal can work normally, we need to add a location which can proxy the request from authority to backend, and we need to save this file and reload the Nginx. Are you sure you want to continue?"
msgstr ""
#: src/views/certificate/Certificate.vue:39
#: src/views/config/config.ts:14
#: src/views/notification/Notification.vue:15
msgid "Type"
msgstr ""
@ -1344,7 +1412,7 @@ msgstr ""
msgid "Updated successfully"
msgstr ""
#: src/routes/index.ts:203
#: src/routes/index.ts:212
#: src/views/system/Upgrade.vue:143
#: src/views/system/Upgrade.vue:235
msgid "Upgrade"
@ -1379,7 +1447,7 @@ msgstr ""
msgid "Username (*)"
msgstr ""
#: src/views/certificate/Certificate.vue:80
#: src/views/certificate/Certificate.vue:88
msgid "Valid"
msgstr ""
@ -1387,6 +1455,11 @@ msgstr ""
msgid "View"
msgstr ""
#: src/components/Notification/Notification.vue:143
msgid "View all notifications"
msgstr ""
#: src/constants/index.ts:18
#: src/views/config/InspectConfig.vue:36
#: src/views/domain/cert/components/AutoCertStepOne.vue:23
#: src/views/domain/DomainAdd.vue:114

View file

@ -9,30 +9,30 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/routes/index.ts:199
#: src/routes/index.ts:208
msgid "About"
msgstr "О проекте"
#: src/routes/index.ts:151 src/views/domain/ngx_conf/LogEntry.vue:78
#: src/routes/index.ts:152 src/views/domain/ngx_conf/LogEntry.vue:78
msgid "Access Logs"
msgstr "Журнал доступа"
#: src/views/certificate/Certificate.vue:96
#: src/views/certificate/Certificate.vue:104
#: src/views/certificate/DNSCredential.vue:32 src/views/config/config.ts:36
#: src/views/domain/DomainList.vue:50 src/views/environment/Environment.vue:105
#: src/views/user/User.vue:46
#: src/views/notification/Notification.vue:38 src/views/user/User.vue:46
msgid "Action"
msgstr "Действие"
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:114
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:115
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
#: src/views/certificate/Certificate.vue:120
#: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:115
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:308
msgid "Add"
msgstr "Добавить"
#: src/routes/index.ts:122 src/views/certificate/Certificate.vue:115
#: src/views/certificate/CertificateEditor.vue:76
#: src/routes/index.ts:123 src/views/certificate/CertificateEditor.vue:84
#, fuzzy
msgid "Add Certificate"
msgstr "Статус сертификата"
@ -46,7 +46,7 @@ msgstr "Добавить директиву ниже"
msgid "Add Location"
msgstr "Добавить Location"
#: src/routes/index.ts:70 src/views/domain/DomainAdd.vue:91
#: src/routes/index.ts:71 src/views/domain/DomainAdd.vue:91
msgid "Add Site"
msgstr "Добавть Сайт"
@ -75,13 +75,19 @@ msgstr ""
msgid "Arch"
msgstr ""
#: src/components/Notification/Notification.vue:86
#: src/views/notification/Notification.vue:73
#, fuzzy
msgid "Are you sure you want to clear all notifications?"
msgstr "Вы уверены, что хотите удалить эту директиву?"
#: src/components/ChatGPT/ChatGPT.vue:279
#, fuzzy
msgid "Are you sure you want to clear the record of chat?"
msgstr "Вы уверены, что хотите удалить эту директиву?"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:347
#: src/views/domain/DomainList.vue:145
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:353
#: src/views/domain/DomainList.vue:144
#, fuzzy
msgid "Are you sure you want to delete?"
msgstr "Вы уверены, что хотите удалить эту директиву?"
@ -124,7 +130,7 @@ msgstr "Автообновление отключено для %{name}"
msgid "Auto-renewal enabled for %{name}"
msgstr "Автообновление включено для %{name}"
#: src/views/certificate/CertificateEditor.vue:168
#: src/views/certificate/CertificateEditor.vue:205
#: src/views/config/Config.vue:75 src/views/config/ConfigEdit.vue:89
#: src/views/domain/DomainEdit.vue:261 src/views/nginx_log/NginxLog.vue:170
msgid "Back"
@ -166,7 +172,7 @@ msgstr ""
#: src/components/ChatGPT/ChatGPT.vue:260
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:58
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:139
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:143
#: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
#: src/views/domain/cert/components/ObtainCert.vue:150
#: src/views/domain/components/Deploy.vue:24
@ -184,17 +190,17 @@ msgstr "Срок действия сертификата истек"
msgid "Certificate is valid"
msgstr "Сертификат действителен"
#: src/views/certificate/CertificateEditor.vue:119
#: src/views/certificate/CertificateEditor.vue:127
#: src/views/domain/cert/Cert.vue:35
msgid "Certificate Status"
msgstr "Статус сертификата"
#: src/routes/index.ts:100 src/views/certificate/Certificate.vue:109
#: src/routes/index.ts:101 src/views/certificate/Certificate.vue:117
#, fuzzy
msgid "Certificates"
msgstr "Статус сертификата"
#: src/routes/index.ts:109
#: src/routes/index.ts:110
#, fuzzy
msgid "Certificates List"
msgstr "Список"
@ -230,9 +236,17 @@ msgid "Cleaning environment variables"
msgstr "Очистка переменных среды"
#: src/components/ChatGPT/ChatGPT.vue:283
#: src/components/Notification/Notification.vue:91
#: src/views/notification/Notification.vue:78
msgid "Clear"
msgstr "Очистить"
#: src/components/Notification/Notification.vue:42
#: src/views/notification/Notification.vue:47
#, fuzzy
msgid "Cleared successfully"
msgstr "Отключено успешно"
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/domain/ngx_conf/LocationEditor.vue:121
#: src/views/domain/ngx_conf/LocationEditor.vue:90
@ -287,7 +301,7 @@ msgstr "CPU:"
msgid "Create Another"
msgstr "Создать еще"
#: src/views/user/User.vue:34
#: src/views/notification/Notification.vue:32 src/views/user/User.vue:34
msgid "Created at"
msgstr "Создан в"
@ -312,7 +326,7 @@ msgstr "Текущяя версия"
msgid "Custom"
msgstr "Пользовательский"
#: src/routes/index.ts:51
#: src/routes/index.ts:52
msgid "Dashboard"
msgstr "Доска"
@ -320,7 +334,7 @@ msgstr "Доска"
msgid "Database (Optional, default: database)"
msgstr "База данных (Опционально, по умолчанию: database)"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:354
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:360
#: src/views/domain/DomainList.vue:153
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:259
msgid "Delete"
@ -358,6 +372,10 @@ msgstr "Saved successfully"
msgid "Description"
msgstr "Описание"
#: src/views/notification/Notification.vue:28
msgid "Details"
msgstr ""
#: src/views/system/About.vue:25
msgid "Development Mode"
msgstr "Режим разработки"
@ -385,7 +403,7 @@ msgid "Disable auto-renewal failed for %{name}"
msgstr "Не удалось отключить автоматическое продление для %{name}"
#: src/views/domain/cert/ChangeCert.vue:48 src/views/domain/DomainEdit.vue:190
#: src/views/domain/DomainList.vue:123
#: src/views/domain/DomainList.vue:122
msgid "Disabled"
msgstr "Отключено"
@ -398,7 +416,7 @@ msgstr "Отключено успешно"
msgid "Disk IO"
msgstr "Нагрузка на Диск IO"
#: src/routes/index.ts:130 src/views/certificate/DNSCredential.vue:39
#: src/routes/index.ts:131 src/views/certificate/DNSCredential.vue:39
msgid "DNS Credentials"
msgstr ""
@ -446,7 +464,7 @@ msgstr "Вы хотите удалить этот сервер?"
msgid "Domain Config Created Successfully"
msgstr "Конфигурация домена успешно создана"
#: src/views/certificate/CertificateEditor.vue:103
#: src/views/certificate/CertificateEditor.vue:111
#, fuzzy
msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
msgstr ""
@ -465,7 +483,7 @@ msgid "Dry run mode enabled"
msgstr "Включен пробный режим"
#: src/views/domain/components/SiteDuplicate.vue:128
#: src/views/domain/DomainList.vue:139
#: src/views/domain/DomainList.vue:138
msgid "Duplicate"
msgstr "Дублировать"
@ -493,11 +511,11 @@ msgstr "Saved successfully"
msgid "Edit %{n}"
msgstr "Редактировать %{n}"
#: src/routes/index.ts:92 src/views/config/ConfigEdit.vue:83
#: src/routes/index.ts:93 src/views/config/ConfigEdit.vue:83
msgid "Edit Configuration"
msgstr "Редактировать Конфигурацию"
#: src/routes/index.ts:74
#: src/routes/index.ts:75
msgid "Edit Site"
msgstr "Редактировать Сайт"
@ -538,7 +556,7 @@ msgstr "Включить TLS"
#: src/views/domain/cert/ChangeCert.vue:44
#: src/views/domain/components/Deploy.vue:89
#: src/views/domain/components/RightSettings.vue:75
#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:131
#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:130
msgid "Enabled"
msgstr "Включено"
@ -552,7 +570,7 @@ msgstr "Активировано успешно"
msgid "Encrypt website with Let's Encrypt"
msgstr "Использовать для сайта Let's Encrypt"
#: src/routes/index.ts:168 src/views/environment/Environment.vue:113
#: src/routes/index.ts:169 src/views/environment/Environment.vue:113
msgid "Environment"
msgstr "Окружение"
@ -561,11 +579,11 @@ msgstr "Окружение"
msgid "Environments"
msgstr "Комментарии"
#: src/views/config/InspectConfig.vue:47
#: src/constants/index.ts:17 src/views/config/InspectConfig.vue:47
msgid "Error"
msgstr "Ошибка"
#: src/routes/index.ts:155 src/views/domain/ngx_conf/LogEntry.vue:86
#: src/routes/index.ts:156 src/views/domain/ngx_conf/LogEntry.vue:86
msgid "Error Logs"
msgstr "Ошибка логирования"
@ -573,7 +591,7 @@ msgstr "Ошибка логирования"
msgid "Executable Path"
msgstr "Исполняемый путь"
#: src/views/certificate/Certificate.vue:84
#: src/views/certificate/Certificate.vue:92
msgid "Expired"
msgstr ""
@ -639,6 +657,11 @@ msgstr "Ошибка форматирования %{msg}"
msgid "Format successfully"
msgstr "Форматирование успешно"
#: src/views/certificate/Certificate.vue:45
#, fuzzy
msgid "General Certificate"
msgstr "Сертификат действителен"
#: src/components/StdDesign/StdDataEntry/components/StdPassword.vue:60
msgid "Generate"
msgstr "Сгенерировать"
@ -676,7 +699,7 @@ msgstr ""
msgid "GPT-4-Turbo"
msgstr ""
#: src/routes/index.ts:44
#: src/routes/index.ts:45
msgid "Home"
msgstr "Главная"
@ -696,6 +719,10 @@ msgstr "Порт HTTP"
msgid "HTTP01"
msgstr ""
#: src/constants/index.ts:19
msgid "Info"
msgstr ""
#: src/language/constants.ts:27
msgid "Initial core upgrader error"
msgstr "Ошибка первоначального обновления ядра"
@ -704,7 +731,7 @@ msgstr "Ошибка первоначального обновления ядр
msgid "Initialing core upgrader"
msgstr "Инициализация программы обновления ядра"
#: src/routes/index.ts:211 src/views/other/Install.vue:139
#: src/routes/index.ts:220 src/views/other/Install.vue:139
msgid "Install"
msgstr "Установить"
@ -766,12 +793,12 @@ msgstr "Location"
msgid "Locations"
msgstr "Locations"
#: src/views/certificate/CertificateEditor.vue:156
#: src/views/certificate/CertificateEditor.vue:193
#, fuzzy
msgid "Log"
msgstr "Логин"
#: src/routes/index.ts:217 src/views/other/Login.vue:147
#: src/routes/index.ts:226 src/views/other/Login.vue:147
msgid "Login"
msgstr "Логин"
@ -779,7 +806,7 @@ msgstr "Логин"
msgid "Login successful"
msgstr "Авторизация успешна"
#: src/layouts/HeaderLayout.vue:21
#: src/layouts/HeaderLayout.vue:22
msgid "Logout successful"
msgstr "Выход выполнен успешно"
@ -792,18 +819,23 @@ msgstr ""
"Убедитесь, что вы настроили обратный прокси-сервер для каталога .well-known "
"на HTTPChallengePort перед получением сертификата»."
#: src/routes/index.ts:83
#: src/routes/index.ts:84
msgid "Manage Configs"
msgstr "Конфигурации"
#: src/routes/index.ts:58 src/views/domain/DomainList.vue:102
#: src/routes/index.ts:59 src/views/domain/DomainList.vue:102
msgid "Manage Sites"
msgstr "Сайты"
#: src/routes/index.ts:176 src/views/user/User.vue:53
#: src/routes/index.ts:185 src/views/user/User.vue:53
msgid "Manage Users"
msgstr "Пользователи"
#: src/views/certificate/Certificate.vue:44
#, fuzzy
msgid "Managed Certificate"
msgstr "Сертификат действителен"
#: src/views/dashboard/ServerAnalytic.vue:220
msgid "Memory"
msgstr "Память"
@ -813,13 +845,13 @@ msgid "Memory and Storage"
msgstr "Память и хранилище"
#: src/components/ChatGPT/ChatGPT.vue:256
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
#, fuzzy
msgid "Modify"
msgstr "Изменить"
#: src/routes/index.ts:114 src/views/certificate/CertificateEditor.vue:76
#: src/routes/index.ts:115 src/views/certificate/CertificateEditor.vue:84
#, fuzzy
msgid "Modify Certificate"
msgstr "Статус сертификата"
@ -834,6 +866,7 @@ msgid "Multi-line Directive"
msgstr "Одиночная директива"
#: src/views/certificate/Certificate.vue:22
#: src/views/certificate/CertificateEditor.vue:145
#: src/views/certificate/DNSCredential.vue:13 src/views/config/config.ts:9
#: src/views/domain/cert/ChangeCert.vue:21
#: src/views/domain/components/RightSettings.vue:81
@ -889,7 +922,7 @@ msgstr "Управление Nginx"
msgid "Nginx Error Log Path"
msgstr "Путь для Nginx Error Log"
#: src/routes/index.ts:145 src/views/nginx_log/NginxLog.vue:145
#: src/routes/index.ts:146 src/views/nginx_log/NginxLog.vue:145
msgid "Nginx Log"
msgstr "Журнал"
@ -904,10 +937,12 @@ msgid "Nginx restarted successfully"
msgstr "Nginx успешно перезапущен"
#: src/components/ChatGPT/ChatGPT.vue:277
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:345
#: src/views/domain/DomainList.vue:143
#: src/components/Notification/Notification.vue:84
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:351
#: src/views/domain/DomainList.vue:142
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:81
#: src/views/domain/ngx_conf/LocationEditor.vue:76
#: src/views/notification/Notification.vue:71
msgid "No"
msgstr "Нет"
@ -915,11 +950,11 @@ msgstr "Нет"
msgid "Node Secret"
msgstr ""
#: src/views/certificate/Certificate.vue:90
#: src/views/certificate/Certificate.vue:98
msgid "Not After"
msgstr ""
#: src/routes/index.ts:223 src/routes/index.ts:225
#: src/routes/index.ts:232 src/routes/index.ts:234
msgid "Not Found"
msgstr "Не найден"
@ -932,6 +967,16 @@ msgstr "Недействительно до: %{date}"
msgid "Note"
msgstr "Заметка"
#: src/views/notification/Notification.vue:63
#, fuzzy
msgid "Notification"
msgstr "Сертификат"
#: src/components/Notification/Notification.vue:82 src/routes/index.ts:177
#, fuzzy
msgid "Notifications"
msgstr "Сертификат"
#: src/views/domain/cert/components/ObtainCert.vue:191
#, fuzzy
msgid "Obtain certificate"
@ -948,16 +993,18 @@ msgid "Offline"
msgstr ""
#: src/components/ChatGPT/ChatGPT.vue:278
#: src/components/Notification/Notification.vue:85
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:59
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:140
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:346
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:144
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:352
#: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:104
#: src/views/domain/cert/components/ObtainCert.vue:149
#: src/views/domain/components/Deploy.vue:23
#: src/views/domain/components/RightSettings.vue:51
#: src/views/domain/DomainList.vue:144
#: src/views/domain/DomainList.vue:143
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:215
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:47
#: src/views/notification/Notification.vue:72
msgid "OK"
msgstr ""
@ -1064,7 +1111,7 @@ msgstr ""
msgid "Pre-release"
msgstr ""
#: src/routes/index.ts:184 src/views/preference/Preference.vue:85
#: src/routes/index.ts:193 src/views/preference/Preference.vue:85
msgid "Preference"
msgstr "Настройки"
@ -1129,12 +1176,27 @@ msgstr "Перезагружается"
msgid "Reloading nginx"
msgstr "Перезагружается nginx"
#: src/components/Notification/Notification.vue:52
#, fuzzy
msgid "Removed successfully"
msgstr "Успешно сохранено"
#: src/views/certificate/RenewCert.vue:43
#: src/views/certificate/RenewCert.vue:47
#, fuzzy
msgid "Renew Certificate"
msgstr "Сертификат действителен"
#: src/language/constants.ts:38
#, fuzzy
msgid "Renew Certificate Error"
msgstr "Сертификат действителен"
#: src/language/constants.ts:37
#, fuzzy
msgid "Renew Certificate Success"
msgstr "Сертификат действителен"
#: src/views/certificate/RenewCert.vue:25
#, fuzzy
msgid "Renew successfully"
@ -1166,7 +1228,7 @@ msgid "Running"
msgstr "Выполняется"
#: src/components/ChatGPT/ChatGPT.vue:259
#: src/views/certificate/CertificateEditor.vue:175
#: src/views/certificate/CertificateEditor.vue:212
#: src/views/config/ConfigEdit.vue:98 src/views/domain/DomainEdit.vue:268
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:111
#: src/views/preference/Preference.vue:113
@ -1183,7 +1245,7 @@ msgid "Save error %{msg}"
msgstr "Ошибка сохранения %{msg}"
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
#: src/views/certificate/CertificateEditor.vue:46
#: src/views/certificate/CertificateEditor.vue:47
#: src/views/preference/Preference.vue:58
#, fuzzy
msgid "Save successfully"
@ -1250,31 +1312,33 @@ msgstr ""
msgid "Single Directive"
msgstr "Одиночная Директива"
#: src/routes/index.ts:159
#: src/routes/index.ts:160
#, fuzzy
msgid "Site Logs"
msgstr "Логи сайтов"
#: src/routes/index.ts:66
#: src/routes/index.ts:67
msgid "Sites List"
msgstr "Список сайтов"
#: src/views/certificate/CertificateEditor.vue:135
#: src/views/certificate/CertificateEditor.vue:172
#, fuzzy
msgid "SSL Certificate Content"
msgstr "Содержание сертификата SSL"
#: src/views/certificate/CertificateEditor.vue:142
#: src/views/certificate/CertificateEditor.vue:179
#, fuzzy
msgid "SSL Certificate Key Content"
msgstr "Содержание ключа сертификата SSL"
#: src/views/certificate/Certificate.vue:63
#: src/views/certificate/Certificate.vue:71
#: src/views/certificate/CertificateEditor.vue:163
#, fuzzy
msgid "SSL Certificate Key Path"
msgstr "Путь к ключу сертификата SSL"
#: src/views/certificate/Certificate.vue:55
#: src/views/certificate/Certificate.vue:63
#: src/views/certificate/CertificateEditor.vue:154
#, fuzzy
msgid "SSL Certificate Path"
msgstr "Путь к сертификату SSL"
@ -1289,7 +1353,7 @@ msgstr "Логин"
msgid "Stable"
msgstr "Таблица"
#: src/views/certificate/Certificate.vue:71 src/views/domain/DomainList.vue:25
#: src/views/certificate/Certificate.vue:79 src/views/domain/DomainList.vue:25
#: src/views/environment/Environment.vue:78
msgid "Status"
msgstr "Статус"
@ -1307,6 +1371,10 @@ msgstr "Хранилище"
msgid "Subject Name: %{subject}"
msgstr "Название темы: %{name}"
#: src/constants/index.ts:20
msgid "Success"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:233
msgid "Swap"
msgstr "Своп"
@ -1319,7 +1387,7 @@ msgstr ""
msgid "Switch to light theme"
msgstr ""
#: src/routes/index.ts:192
#: src/routes/index.ts:201
msgid "System"
msgstr "Система"
@ -1332,7 +1400,7 @@ msgstr "Таблица"
msgid "Target"
msgstr ""
#: src/routes/index.ts:137 src/views/pty/Terminal.vue:95
#: src/routes/index.ts:138 src/views/pty/Terminal.vue:95
msgid "Terminal"
msgstr "Терминал"
@ -1366,12 +1434,12 @@ msgstr ""
msgid "The username or password is incorrect"
msgstr "Имя пользователя или пароль неверны"
#: src/views/certificate/CertificateEditor.vue:93
#: src/views/certificate/CertificateEditor.vue:101
#, fuzzy
msgid "This Auto Cert item is invalid, please remove it."
msgstr "Этот элемент автосертификата недействителен, удалите его.."
#: src/views/certificate/CertificateEditor.vue:83
#: src/views/certificate/CertificateEditor.vue:91
msgid "This certificate is managed by Nginx UI"
msgstr ""
@ -1379,6 +1447,10 @@ msgstr ""
msgid "This field should not be empty"
msgstr ""
#: src/views/notification/Notification.vue:21
msgid "Title"
msgstr ""
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:42
msgid ""
"To make sure the certification auto-renewal can work normally, we need to "
@ -1388,6 +1460,7 @@ msgid ""
msgstr ""
#: src/views/certificate/Certificate.vue:39 src/views/config/config.ts:14
#: src/views/notification/Notification.vue:15
msgid "Type"
msgstr "Тип"
@ -1404,7 +1477,7 @@ msgstr "Обновлено в"
msgid "Updated successfully"
msgstr "Обновлено успешно"
#: src/routes/index.ts:203 src/views/system/Upgrade.vue:143
#: src/routes/index.ts:212 src/views/system/Upgrade.vue:143
#: src/views/system/Upgrade.vue:235
msgid "Upgrade"
msgstr "Обновление"
@ -1439,7 +1512,7 @@ msgstr "Имя пользователя"
msgid "Username (*)"
msgstr "Имя пользователя (*)"
#: src/views/certificate/Certificate.vue:80
#: src/views/certificate/Certificate.vue:88
msgid "Valid"
msgstr ""
@ -1447,7 +1520,12 @@ msgstr ""
msgid "View"
msgstr "Просмотр"
#: src/views/config/InspectConfig.vue:36
#: src/components/Notification/Notification.vue:143
#, fuzzy
msgid "View all notifications"
msgstr "Сертификат"
#: src/constants/index.ts:18 src/views/config/InspectConfig.vue:36
#: src/views/domain/cert/components/AutoCertStepOne.vue:23
#: src/views/domain/DomainAdd.vue:114
msgid "Warning"
@ -1510,10 +1588,6 @@ msgstr "Вы можете проверить обновление Nginx UI на
#~ msgid "Auto cert is enabled, please do not modify this certification."
#~ msgstr "Включено автомотическое получения сертификата. Не правте руками."
#, fuzzy
#~ msgid "Certification"
#~ msgstr "Сертификат"
#~ msgid "Delete ID: %{id}"
#~ msgstr "Удалить ID: %{id}"

Binary file not shown.

View file

@ -13,30 +13,30 @@ msgstr ""
"Generated-By: easygettext\n"
"X-Generator: Poedit 3.4.1\n"
#: src/routes/index.ts:199
#: src/routes/index.ts:208
msgid "About"
msgstr "关于"
#: src/routes/index.ts:151 src/views/domain/ngx_conf/LogEntry.vue:78
#: src/routes/index.ts:152 src/views/domain/ngx_conf/LogEntry.vue:78
msgid "Access Logs"
msgstr "访问日志"
#: src/views/certificate/Certificate.vue:96
#: src/views/certificate/Certificate.vue:104
#: src/views/certificate/DNSCredential.vue:32 src/views/config/config.ts:36
#: src/views/domain/DomainList.vue:50 src/views/environment/Environment.vue:105
#: src/views/user/User.vue:46
#: src/views/notification/Notification.vue:38 src/views/user/User.vue:46
msgid "Action"
msgstr "操作"
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:114
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:115
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
#: src/views/certificate/Certificate.vue:120
#: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:115
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:308
msgid "Add"
msgstr "添加"
#: src/routes/index.ts:122 src/views/certificate/Certificate.vue:115
#: src/views/certificate/CertificateEditor.vue:76
#: src/routes/index.ts:123 src/views/certificate/CertificateEditor.vue:84
msgid "Add Certificate"
msgstr "添加证书"
@ -49,7 +49,7 @@ msgstr "在下面添加指令"
msgid "Add Location"
msgstr "添加 Location"
#: src/routes/index.ts:70 src/views/domain/DomainAdd.vue:91
#: src/routes/index.ts:71 src/views/domain/DomainAdd.vue:91
msgid "Add Site"
msgstr "添加站点"
@ -77,12 +77,17 @@ msgstr "API Token"
msgid "Arch"
msgstr "架构"
#: src/components/Notification/Notification.vue:86
#: src/views/notification/Notification.vue:73
msgid "Are you sure you want to clear all notifications?"
msgstr "您确定要清除所有通知吗?"
#: src/components/ChatGPT/ChatGPT.vue:279
msgid "Are you sure you want to clear the record of chat?"
msgstr "你确定你要清除聊天记录吗?"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:347
#: src/views/domain/DomainList.vue:145
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:353
#: src/views/domain/DomainList.vue:144
msgid "Are you sure you want to delete?"
msgstr "您确定要删除吗?"
@ -123,7 +128,7 @@ msgstr "成功关闭 %{name} 自动续签"
msgid "Auto-renewal enabled for %{name}"
msgstr "成功启用 %{name} 自动续签"
#: src/views/certificate/CertificateEditor.vue:168
#: src/views/certificate/CertificateEditor.vue:205
#: src/views/config/Config.vue:75 src/views/config/ConfigEdit.vue:89
#: src/views/domain/DomainEdit.vue:261 src/views/nginx_log/NginxLog.vue:170
msgid "Back"
@ -162,7 +167,7 @@ msgstr "CADir"
#: src/components/ChatGPT/ChatGPT.vue:260
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:58
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:139
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:143
#: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
#: src/views/domain/cert/components/ObtainCert.vue:150
#: src/views/domain/components/Deploy.vue:24
@ -180,16 +185,16 @@ msgstr "此证书已过期"
msgid "Certificate is valid"
msgstr "此证书有效"
#: src/views/certificate/CertificateEditor.vue:119
#: src/views/certificate/CertificateEditor.vue:127
#: src/views/domain/cert/Cert.vue:35
msgid "Certificate Status"
msgstr "证书状态"
#: src/routes/index.ts:100 src/views/certificate/Certificate.vue:109
#: src/routes/index.ts:101 src/views/certificate/Certificate.vue:117
msgid "Certificates"
msgstr "证书"
#: src/routes/index.ts:109
#: src/routes/index.ts:110
msgid "Certificates List"
msgstr "证书列表"
@ -223,9 +228,16 @@ msgid "Cleaning environment variables"
msgstr "正在清理环境变量"
#: src/components/ChatGPT/ChatGPT.vue:283
#: src/components/Notification/Notification.vue:91
#: src/views/notification/Notification.vue:78
msgid "Clear"
msgstr "清空"
#: src/components/Notification/Notification.vue:42
#: src/views/notification/Notification.vue:47
msgid "Cleared successfully"
msgstr "清除成功"
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/domain/ngx_conf/LocationEditor.vue:121
#: src/views/domain/ngx_conf/LocationEditor.vue:90
@ -279,7 +291,7 @@ msgstr "CPU:"
msgid "Create Another"
msgstr "再创建一个"
#: src/views/user/User.vue:34
#: src/views/notification/Notification.vue:32 src/views/user/User.vue:34
msgid "Created at"
msgstr "创建时间"
@ -304,7 +316,7 @@ msgstr "当前版本"
msgid "Custom"
msgstr "自定义"
#: src/routes/index.ts:51
#: src/routes/index.ts:52
msgid "Dashboard"
msgstr "仪表盘"
@ -312,7 +324,7 @@ msgstr "仪表盘"
msgid "Database (Optional, default: database)"
msgstr "数据库 (可选,默认: database)"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:354
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:360
#: src/views/domain/DomainList.vue:153
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:259
msgid "Delete"
@ -348,6 +360,10 @@ msgstr "部署成功"
msgid "Description"
msgstr "描述"
#: src/views/notification/Notification.vue:28
msgid "Details"
msgstr "详情"
#: src/views/system/About.vue:25
msgid "Development Mode"
msgstr "开发模式"
@ -373,7 +389,7 @@ msgid "Disable auto-renewal failed for %{name}"
msgstr "关闭 %{name} 自动续签失败"
#: src/views/domain/cert/ChangeCert.vue:48 src/views/domain/DomainEdit.vue:190
#: src/views/domain/DomainList.vue:123
#: src/views/domain/DomainList.vue:122
msgid "Disabled"
msgstr "禁用"
@ -386,7 +402,7 @@ msgstr "禁用成功"
msgid "Disk IO"
msgstr "磁盘 IO"
#: src/routes/index.ts:130 src/views/certificate/DNSCredential.vue:39
#: src/routes/index.ts:131 src/views/certificate/DNSCredential.vue:39
msgid "DNS Credentials"
msgstr "DNS 凭证"
@ -428,7 +444,7 @@ msgstr "你想删除这个服务器吗?"
msgid "Domain Config Created Successfully"
msgstr "域名配置文件创建成功"
#: src/views/certificate/CertificateEditor.vue:103
#: src/views/certificate/CertificateEditor.vue:111
msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
msgstr "域名列表为空,请尝试为 %{config} 重新打开证书自动续期。"
@ -445,7 +461,7 @@ msgid "Dry run mode enabled"
msgstr "试运行模式已启动"
#: src/views/domain/components/SiteDuplicate.vue:128
#: src/views/domain/DomainList.vue:139
#: src/views/domain/DomainList.vue:138
msgid "Duplicate"
msgstr "复制"
@ -469,11 +485,11 @@ msgstr "成功复制到本地"
msgid "Edit %{n}"
msgstr "编辑 %{n}"
#: src/routes/index.ts:92 src/views/config/ConfigEdit.vue:83
#: src/routes/index.ts:93 src/views/config/ConfigEdit.vue:83
msgid "Edit Configuration"
msgstr "编辑配置"
#: src/routes/index.ts:74
#: src/routes/index.ts:75
msgid "Edit Site"
msgstr "编辑站点"
@ -512,7 +528,7 @@ msgstr "启用 TLS"
#: src/views/domain/cert/ChangeCert.vue:44
#: src/views/domain/components/Deploy.vue:89
#: src/views/domain/components/RightSettings.vue:75
#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:131
#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:130
msgid "Enabled"
msgstr "启用"
@ -526,7 +542,7 @@ msgstr "启用成功"
msgid "Encrypt website with Let's Encrypt"
msgstr "用 Let's Encrypt 对网站进行加密"
#: src/routes/index.ts:168 src/views/environment/Environment.vue:113
#: src/routes/index.ts:169 src/views/environment/Environment.vue:113
msgid "Environment"
msgstr "环境"
@ -534,11 +550,11 @@ msgstr "环境"
msgid "Environments"
msgstr "环境"
#: src/views/config/InspectConfig.vue:47
#: src/constants/index.ts:17 src/views/config/InspectConfig.vue:47
msgid "Error"
msgstr "错误"
#: src/routes/index.ts:155 src/views/domain/ngx_conf/LogEntry.vue:86
#: src/routes/index.ts:156 src/views/domain/ngx_conf/LogEntry.vue:86
msgid "Error Logs"
msgstr "错误日志"
@ -546,7 +562,7 @@ msgstr "错误日志"
msgid "Executable Path"
msgstr "可执行文件路径"
#: src/views/certificate/Certificate.vue:84
#: src/views/certificate/Certificate.vue:92
msgid "Expired"
msgstr "已过期"
@ -609,6 +625,10 @@ msgstr "保存错误 %{msg}"
msgid "Format successfully"
msgstr "格式化成功"
#: src/views/certificate/Certificate.vue:45
msgid "General Certificate"
msgstr "普通证书"
#: src/components/StdDesign/StdDataEntry/components/StdPassword.vue:60
msgid "Generate"
msgstr "生成"
@ -645,7 +665,7 @@ msgstr "GPT-4-32K"
msgid "GPT-4-Turbo"
msgstr "GPT-4-Turbo"
#: src/routes/index.ts:44
#: src/routes/index.ts:45
msgid "Home"
msgstr "首页"
@ -665,6 +685,10 @@ msgstr "HTTP 监听端口"
msgid "HTTP01"
msgstr "HTTP01"
#: src/constants/index.ts:19
msgid "Info"
msgstr "信息"
#: src/language/constants.ts:27
msgid "Initial core upgrader error"
msgstr "初始化核心升级程序错误"
@ -673,7 +697,7 @@ msgstr "初始化核心升级程序错误"
msgid "Initialing core upgrader"
msgstr "初始化核心升级器"
#: src/routes/index.ts:211 src/views/other/Install.vue:139
#: src/routes/index.ts:220 src/views/other/Install.vue:139
msgid "Install"
msgstr "安装"
@ -730,11 +754,11 @@ msgstr "Location"
msgid "Locations"
msgstr "Locations"
#: src/views/certificate/CertificateEditor.vue:156
#: src/views/certificate/CertificateEditor.vue:193
msgid "Log"
msgstr "日志"
#: src/routes/index.ts:217 src/views/other/Login.vue:147
#: src/routes/index.ts:226 src/views/other/Login.vue:147
msgid "Login"
msgstr "登录"
@ -742,7 +766,7 @@ msgstr "登录"
msgid "Login successful"
msgstr "登录成功"
#: src/layouts/HeaderLayout.vue:21
#: src/layouts/HeaderLayout.vue:22
msgid "Logout successful"
msgstr "登出成功"
@ -754,18 +778,22 @@ msgstr ""
"在获取签发证书前,请确保配置文件中已将 .well-known 目录反向代理到 "
"HTTPChallengePort。"
#: src/routes/index.ts:83
#: src/routes/index.ts:84
msgid "Manage Configs"
msgstr "配置管理"
#: src/routes/index.ts:58 src/views/domain/DomainList.vue:102
#: src/routes/index.ts:59 src/views/domain/DomainList.vue:102
msgid "Manage Sites"
msgstr "网站管理"
#: src/routes/index.ts:176 src/views/user/User.vue:53
#: src/routes/index.ts:185 src/views/user/User.vue:53
msgid "Manage Users"
msgstr "用户管理"
#: src/views/certificate/Certificate.vue:44
msgid "Managed Certificate"
msgstr "托管证书"
#: src/views/dashboard/ServerAnalytic.vue:220
msgid "Memory"
msgstr "内存"
@ -775,12 +803,12 @@ msgid "Memory and Storage"
msgstr "内存与存储"
#: src/components/ChatGPT/ChatGPT.vue:256
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
msgid "Modify"
msgstr "修改"
#: src/routes/index.ts:114 src/views/certificate/CertificateEditor.vue:76
#: src/routes/index.ts:115 src/views/certificate/CertificateEditor.vue:84
msgid "Modify Certificate"
msgstr "修改证书"
@ -793,6 +821,7 @@ msgid "Multi-line Directive"
msgstr "多行指令"
#: src/views/certificate/Certificate.vue:22
#: src/views/certificate/CertificateEditor.vue:145
#: src/views/certificate/DNSCredential.vue:13 src/views/config/config.ts:9
#: src/views/domain/cert/ChangeCert.vue:21
#: src/views/domain/components/RightSettings.vue:81
@ -846,7 +875,7 @@ msgstr "控制 Nginx"
msgid "Nginx Error Log Path"
msgstr "Nginx 错误日志路径"
#: src/routes/index.ts:145 src/views/nginx_log/NginxLog.vue:145
#: src/routes/index.ts:146 src/views/nginx_log/NginxLog.vue:145
msgid "Nginx Log"
msgstr "Nginx 日志"
@ -859,10 +888,12 @@ msgid "Nginx restarted successfully"
msgstr "Nginx 重启成功"
#: src/components/ChatGPT/ChatGPT.vue:277
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:345
#: src/views/domain/DomainList.vue:143
#: src/components/Notification/Notification.vue:84
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:351
#: src/views/domain/DomainList.vue:142
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:81
#: src/views/domain/ngx_conf/LocationEditor.vue:76
#: src/views/notification/Notification.vue:71
msgid "No"
msgstr "取消"
@ -870,11 +901,11 @@ msgstr "取消"
msgid "Node Secret"
msgstr "节点密钥"
#: src/views/certificate/Certificate.vue:90
#: src/views/certificate/Certificate.vue:98
msgid "Not After"
msgstr "有效期"
#: src/routes/index.ts:223 src/routes/index.ts:225
#: src/routes/index.ts:232 src/routes/index.ts:234
msgid "Not Found"
msgstr "找不到页面"
@ -887,6 +918,14 @@ msgstr "此前无效: %{date}"
msgid "Note"
msgstr "注意"
#: src/views/notification/Notification.vue:63
msgid "Notification"
msgstr "通知"
#: src/components/Notification/Notification.vue:82 src/routes/index.ts:177
msgid "Notifications"
msgstr "通知"
#: src/views/domain/cert/components/ObtainCert.vue:191
msgid "Obtain certificate"
msgstr "获取证书"
@ -902,16 +941,18 @@ msgid "Offline"
msgstr "离线"
#: src/components/ChatGPT/ChatGPT.vue:278
#: src/components/Notification/Notification.vue:85
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:59
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:140
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:346
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:144
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:352
#: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:104
#: src/views/domain/cert/components/ObtainCert.vue:149
#: src/views/domain/components/Deploy.vue:23
#: src/views/domain/components/RightSettings.vue:51
#: src/views/domain/DomainList.vue:144
#: src/views/domain/DomainList.vue:143
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:215
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:47
#: src/views/notification/Notification.vue:72
msgid "OK"
msgstr "确定"
@ -1017,7 +1058,7 @@ msgstr "请至少选择一个节点!"
msgid "Pre-release"
msgstr "预发布"
#: src/routes/index.ts:184 src/views/preference/Preference.vue:85
#: src/routes/index.ts:193 src/views/preference/Preference.vue:85
msgid "Preference"
msgstr "偏好设置"
@ -1080,11 +1121,23 @@ msgstr "重载中"
msgid "Reloading nginx"
msgstr "正在重载 Nginx"
#: src/components/Notification/Notification.vue:52
msgid "Removed successfully"
msgstr "删除成功"
#: src/views/certificate/RenewCert.vue:43
#: src/views/certificate/RenewCert.vue:47
msgid "Renew Certificate"
msgstr "更新证书"
#: src/language/constants.ts:38
msgid "Renew Certificate Error"
msgstr "证书续期错误"
#: src/language/constants.ts:37
msgid "Renew Certificate Success"
msgstr "证书续期成功"
#: src/views/certificate/RenewCert.vue:25
msgid "Renew successfully"
msgstr "更新成功"
@ -1114,7 +1167,7 @@ msgid "Running"
msgstr "运行中"
#: src/components/ChatGPT/ChatGPT.vue:259
#: src/views/certificate/CertificateEditor.vue:175
#: src/views/certificate/CertificateEditor.vue:212
#: src/views/config/ConfigEdit.vue:98 src/views/domain/DomainEdit.vue:268
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:111
#: src/views/preference/Preference.vue:113
@ -1131,7 +1184,7 @@ msgid "Save error %{msg}"
msgstr "保存错误 %{msg}"
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
#: src/views/certificate/CertificateEditor.vue:46
#: src/views/certificate/CertificateEditor.vue:47
#: src/views/preference/Preference.vue:58
msgid "Save successfully"
msgstr "保存成功"
@ -1196,27 +1249,29 @@ msgstr "使用 HTTP01 challenge provider"
msgid "Single Directive"
msgstr "单行指令"
#: src/routes/index.ts:159
#: src/routes/index.ts:160
msgid "Site Logs"
msgstr "站点列表"
#: src/routes/index.ts:66
#: src/routes/index.ts:67
msgid "Sites List"
msgstr "站点列表"
#: src/views/certificate/CertificateEditor.vue:135
#: src/views/certificate/CertificateEditor.vue:172
msgid "SSL Certificate Content"
msgstr "SSL 证书内容"
#: src/views/certificate/CertificateEditor.vue:142
#: src/views/certificate/CertificateEditor.vue:179
msgid "SSL Certificate Key Content"
msgstr "SSL 证书密钥内容"
#: src/views/certificate/Certificate.vue:63
#: src/views/certificate/Certificate.vue:71
#: src/views/certificate/CertificateEditor.vue:163
msgid "SSL Certificate Key Path"
msgstr "SSL证书密钥路径"
#: src/views/certificate/Certificate.vue:55
#: src/views/certificate/Certificate.vue:63
#: src/views/certificate/CertificateEditor.vue:154
msgid "SSL Certificate Path"
msgstr "SSL证书路径"
@ -1228,7 +1283,7 @@ msgstr "SSO 登录"
msgid "Stable"
msgstr "稳定"
#: src/views/certificate/Certificate.vue:71 src/views/domain/DomainList.vue:25
#: src/views/certificate/Certificate.vue:79 src/views/domain/DomainList.vue:25
#: src/views/environment/Environment.vue:78
msgid "Status"
msgstr "状态"
@ -1245,6 +1300,10 @@ msgstr "存储"
msgid "Subject Name: %{subject}"
msgstr "主体名称: %{subject}"
#: src/constants/index.ts:20
msgid "Success"
msgstr "成功"
#: src/views/dashboard/ServerAnalytic.vue:233
msgid "Swap"
msgstr "Swap"
@ -1257,7 +1316,7 @@ msgstr "切换到深色主题"
msgid "Switch to light theme"
msgstr "切换到浅色"
#: src/routes/index.ts:192
#: src/routes/index.ts:201
msgid "System"
msgstr "系统"
@ -1269,7 +1328,7 @@ msgstr "列表"
msgid "Target"
msgstr "目标"
#: src/routes/index.ts:137 src/views/pty/Terminal.vue:95
#: src/routes/index.ts:138 src/views/pty/Terminal.vue:95
msgid "Terminal"
msgstr "终端"
@ -1299,11 +1358,11 @@ msgstr "当前配置中的 server_name 必须是获取证书所需的域名,
msgid "The username or password is incorrect"
msgstr "用户名或密码错误"
#: src/views/certificate/CertificateEditor.vue:93
#: src/views/certificate/CertificateEditor.vue:101
msgid "This Auto Cert item is invalid, please remove it."
msgstr "这个证书自动续期项目是无效的,请删除。"
#: src/views/certificate/CertificateEditor.vue:83
#: src/views/certificate/CertificateEditor.vue:91
msgid "This certificate is managed by Nginx UI"
msgstr "该证书由 Nginx UI 托管"
@ -1311,6 +1370,10 @@ msgstr "该证书由 Nginx UI 托管"
msgid "This field should not be empty"
msgstr "该字段不能为空"
#: src/views/notification/Notification.vue:21
msgid "Title"
msgstr "标题"
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:42
msgid ""
"To make sure the certification auto-renewal can work normally, we need to "
@ -1322,6 +1385,7 @@ msgstr ""
"请求的 Location并且我们需要保存这个文件并重新加载Nginx。你确定要继续吗"
#: src/views/certificate/Certificate.vue:39 src/views/config/config.ts:14
#: src/views/notification/Notification.vue:15
msgid "Type"
msgstr "类型"
@ -1337,7 +1401,7 @@ msgstr "修改时间"
msgid "Updated successfully"
msgstr "更新成功"
#: src/routes/index.ts:203 src/views/system/Upgrade.vue:143
#: src/routes/index.ts:212 src/views/system/Upgrade.vue:143
#: src/views/system/Upgrade.vue:235
msgid "Upgrade"
msgstr "升级"
@ -1370,7 +1434,7 @@ msgstr "用户名"
msgid "Username (*)"
msgstr "用户名 (*)"
#: src/views/certificate/Certificate.vue:80
#: src/views/certificate/Certificate.vue:88
msgid "Valid"
msgstr "有效的"
@ -1378,7 +1442,11 @@ msgstr "有效的"
msgid "View"
msgstr "查看"
#: src/views/config/InspectConfig.vue:36
#: src/components/Notification/Notification.vue:143
msgid "View all notifications"
msgstr "查看全部通知"
#: src/constants/index.ts:18 src/views/config/InspectConfig.vue:36
#: src/views/domain/cert/components/AutoCertStepOne.vue:23
#: src/views/domain/DomainAdd.vue:114
msgid "Warning"
@ -1450,9 +1518,6 @@ msgstr "你可以在这个页面检查Nginx UI的升级。"
#~ "或多个TXT记录以进行所有权验证。一旦验证完成这些记录将被删除。请注意"
#~ "下面的时间配置都是以秒为单位。"
#~ msgid "Certification"
#~ msgstr "证书"
#~ msgid "Delete ID: %{id}"
#~ msgstr "删除 ID: %{id}"

View file

@ -14,30 +14,30 @@ msgstr ""
"Generated-By: easygettext\n"
"X-Generator: Poedit 3.4.1\n"
#: src/routes/index.ts:199
#: src/routes/index.ts:208
msgid "About"
msgstr "關於"
#: src/routes/index.ts:151 src/views/domain/ngx_conf/LogEntry.vue:78
#: src/routes/index.ts:152 src/views/domain/ngx_conf/LogEntry.vue:78
msgid "Access Logs"
msgstr "存取日誌"
#: src/views/certificate/Certificate.vue:96
#: src/views/certificate/Certificate.vue:104
#: src/views/certificate/DNSCredential.vue:32 src/views/config/config.ts:36
#: src/views/domain/DomainList.vue:50 src/views/environment/Environment.vue:105
#: src/views/user/User.vue:46
#: src/views/notification/Notification.vue:38 src/views/user/User.vue:46
msgid "Action"
msgstr "操作"
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:114
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:115
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
#: src/views/certificate/Certificate.vue:120
#: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:115
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:308
msgid "Add"
msgstr "新增"
#: src/routes/index.ts:122 src/views/certificate/Certificate.vue:115
#: src/views/certificate/CertificateEditor.vue:76
#: src/routes/index.ts:123 src/views/certificate/CertificateEditor.vue:84
#, fuzzy
msgid "Add Certificate"
msgstr "憑證狀態"
@ -51,7 +51,7 @@ msgstr "在下方新增指令"
msgid "Add Location"
msgstr "新增 Location"
#: src/routes/index.ts:70 src/views/domain/DomainAdd.vue:91
#: src/routes/index.ts:71 src/views/domain/DomainAdd.vue:91
msgid "Add Site"
msgstr "新增網站"
@ -79,12 +79,18 @@ msgstr "API Token"
msgid "Arch"
msgstr "架構"
#: src/components/Notification/Notification.vue:86
#: src/views/notification/Notification.vue:73
#, fuzzy
msgid "Are you sure you want to clear all notifications?"
msgstr "您確定要清除聊天記錄嗎?"
#: src/components/ChatGPT/ChatGPT.vue:279
msgid "Are you sure you want to clear the record of chat?"
msgstr "您確定要清除聊天記錄嗎?"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:347
#: src/views/domain/DomainList.vue:145
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:353
#: src/views/domain/DomainList.vue:144
msgid "Are you sure you want to delete?"
msgstr "您確定要刪除嗎?"
@ -125,7 +131,7 @@ msgstr "已關閉 %{name} 的自動續簽"
msgid "Auto-renewal enabled for %{name}"
msgstr "已啟用 %{name} 的自動續簽"
#: src/views/certificate/CertificateEditor.vue:168
#: src/views/certificate/CertificateEditor.vue:205
#: src/views/config/Config.vue:75 src/views/config/ConfigEdit.vue:89
#: src/views/domain/DomainEdit.vue:261 src/views/nginx_log/NginxLog.vue:170
msgid "Back"
@ -164,7 +170,7 @@ msgstr "CADir"
#: src/components/ChatGPT/ChatGPT.vue:260
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:58
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:139
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:143
#: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
#: src/views/domain/cert/components/ObtainCert.vue:150
#: src/views/domain/components/Deploy.vue:24
@ -182,17 +188,17 @@ msgstr "此憑證已過期"
msgid "Certificate is valid"
msgstr "此憑證有效"
#: src/views/certificate/CertificateEditor.vue:119
#: src/views/certificate/CertificateEditor.vue:127
#: src/views/domain/cert/Cert.vue:35
msgid "Certificate Status"
msgstr "憑證狀態"
#: src/routes/index.ts:100 src/views/certificate/Certificate.vue:109
#: src/routes/index.ts:101 src/views/certificate/Certificate.vue:117
#, fuzzy
msgid "Certificates"
msgstr "憑證狀態"
#: src/routes/index.ts:109
#: src/routes/index.ts:110
#, fuzzy
msgid "Certificates List"
msgstr "憑證清單"
@ -227,9 +233,17 @@ msgid "Cleaning environment variables"
msgstr "清理環境變數"
#: src/components/ChatGPT/ChatGPT.vue:283
#: src/components/Notification/Notification.vue:91
#: src/views/notification/Notification.vue:78
msgid "Clear"
msgstr "清除"
#: src/components/Notification/Notification.vue:42
#: src/views/notification/Notification.vue:47
#, fuzzy
msgid "Cleared successfully"
msgstr "成功停用"
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/domain/ngx_conf/LocationEditor.vue:121
#: src/views/domain/ngx_conf/LocationEditor.vue:90
@ -283,7 +297,7 @@ msgstr "中央處理器:"
msgid "Create Another"
msgstr "再建立一個"
#: src/views/user/User.vue:34
#: src/views/notification/Notification.vue:32 src/views/user/User.vue:34
msgid "Created at"
msgstr "建立時間"
@ -308,7 +322,7 @@ msgstr "目前版本"
msgid "Custom"
msgstr "自訂"
#: src/routes/index.ts:51
#: src/routes/index.ts:52
msgid "Dashboard"
msgstr "儀表板"
@ -316,7 +330,7 @@ msgstr "儀表板"
msgid "Database (Optional, default: database)"
msgstr "資料庫 (可選,預設: database)"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:354
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:360
#: src/views/domain/DomainList.vue:153
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:259
msgid "Delete"
@ -353,6 +367,10 @@ msgstr "部署成功"
msgid "Description"
msgstr "描述"
#: src/views/notification/Notification.vue:28
msgid "Details"
msgstr ""
#: src/views/system/About.vue:25
msgid "Development Mode"
msgstr "開發模式"
@ -379,7 +397,7 @@ msgid "Disable auto-renewal failed for %{name}"
msgstr "關閉 %{name} 自動續簽失敗"
#: src/views/domain/cert/ChangeCert.vue:48 src/views/domain/DomainEdit.vue:190
#: src/views/domain/DomainList.vue:123
#: src/views/domain/DomainList.vue:122
msgid "Disabled"
msgstr "停用"
@ -392,7 +410,7 @@ msgstr "成功停用"
msgid "Disk IO"
msgstr "磁碟 IO"
#: src/routes/index.ts:130 src/views/certificate/DNSCredential.vue:39
#: src/routes/index.ts:131 src/views/certificate/DNSCredential.vue:39
msgid "DNS Credentials"
msgstr "DNS 認證"
@ -434,7 +452,7 @@ msgstr "您要移除此伺服器嗎?"
msgid "Domain Config Created Successfully"
msgstr "網域設定檔成功建立"
#: src/views/certificate/CertificateEditor.vue:103
#: src/views/certificate/CertificateEditor.vue:111
#, fuzzy
msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
msgstr "網域列表為空,請嘗試重新開啟 %{config} 的自動憑證"
@ -452,7 +470,7 @@ msgid "Dry run mode enabled"
msgstr "試運轉模式已啟用"
#: src/views/domain/components/SiteDuplicate.vue:128
#: src/views/domain/DomainList.vue:139
#: src/views/domain/DomainList.vue:138
msgid "Duplicate"
msgstr "複製"
@ -476,11 +494,11 @@ msgstr "成功複製至本機"
msgid "Edit %{n}"
msgstr "編輯 %{n}"
#: src/routes/index.ts:92 src/views/config/ConfigEdit.vue:83
#: src/routes/index.ts:93 src/views/config/ConfigEdit.vue:83
msgid "Edit Configuration"
msgstr "編輯設定"
#: src/routes/index.ts:74
#: src/routes/index.ts:75
msgid "Edit Site"
msgstr "編輯網站"
@ -519,7 +537,7 @@ msgstr "啟用 TLS"
#: src/views/domain/cert/ChangeCert.vue:44
#: src/views/domain/components/Deploy.vue:89
#: src/views/domain/components/RightSettings.vue:75
#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:131
#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:130
msgid "Enabled"
msgstr "已啟用"
@ -533,7 +551,7 @@ msgstr "成功啟用"
msgid "Encrypt website with Let's Encrypt"
msgstr "用 Let's Encrypt 對網站進行加密"
#: src/routes/index.ts:168 src/views/environment/Environment.vue:113
#: src/routes/index.ts:169 src/views/environment/Environment.vue:113
msgid "Environment"
msgstr "環境"
@ -541,11 +559,11 @@ msgstr "環境"
msgid "Environments"
msgstr "環境"
#: src/views/config/InspectConfig.vue:47
#: src/constants/index.ts:17 src/views/config/InspectConfig.vue:47
msgid "Error"
msgstr "錯誤"
#: src/routes/index.ts:155 src/views/domain/ngx_conf/LogEntry.vue:86
#: src/routes/index.ts:156 src/views/domain/ngx_conf/LogEntry.vue:86
msgid "Error Logs"
msgstr "錯誤日誌"
@ -553,7 +571,7 @@ msgstr "錯誤日誌"
msgid "Executable Path"
msgstr "可執行檔路徑"
#: src/views/certificate/Certificate.vue:84
#: src/views/certificate/Certificate.vue:92
msgid "Expired"
msgstr ""
@ -617,6 +635,11 @@ msgstr "格式錯誤 %{msg}"
msgid "Format successfully"
msgstr "成功格式化"
#: src/views/certificate/Certificate.vue:45
#, fuzzy
msgid "General Certificate"
msgstr "更換憑證"
#: src/components/StdDesign/StdDataEntry/components/StdPassword.vue:60
msgid "Generate"
msgstr "產生"
@ -653,7 +676,7 @@ msgstr "GPT-4-32K"
msgid "GPT-4-Turbo"
msgstr "GPT-4-Turbo"
#: src/routes/index.ts:44
#: src/routes/index.ts:45
msgid "Home"
msgstr "首頁"
@ -673,6 +696,10 @@ msgstr "HTTP 監聽埠"
msgid "HTTP01"
msgstr "HTTP01"
#: src/constants/index.ts:19
msgid "Info"
msgstr ""
#: src/language/constants.ts:27
msgid "Initial core upgrader error"
msgstr "初始化核心升級程式錯誤"
@ -681,7 +708,7 @@ msgstr "初始化核心升級程式錯誤"
msgid "Initialing core upgrader"
msgstr "正在初始化核心升級程式"
#: src/routes/index.ts:211 src/views/other/Install.vue:139
#: src/routes/index.ts:220 src/views/other/Install.vue:139
msgid "Install"
msgstr "安裝"
@ -740,12 +767,12 @@ msgstr "Location"
msgid "Locations"
msgstr "Locations"
#: src/views/certificate/CertificateEditor.vue:156
#: src/views/certificate/CertificateEditor.vue:193
#, fuzzy
msgid "Log"
msgstr "登入"
#: src/routes/index.ts:217 src/views/other/Login.vue:147
#: src/routes/index.ts:226 src/views/other/Login.vue:147
msgid "Login"
msgstr "登入"
@ -753,7 +780,7 @@ msgstr "登入"
msgid "Login successful"
msgstr "登入成功"
#: src/layouts/HeaderLayout.vue:21
#: src/layouts/HeaderLayout.vue:22
msgid "Logout successful"
msgstr "登出成功"
@ -764,18 +791,23 @@ msgid ""
msgstr ""
"在取得憑證前,請確保您已將 .well-known 目錄反向代理到 HTTPChallengePort。"
#: src/routes/index.ts:83
#: src/routes/index.ts:84
msgid "Manage Configs"
msgstr "管理設定"
#: src/routes/index.ts:58 src/views/domain/DomainList.vue:102
#: src/routes/index.ts:59 src/views/domain/DomainList.vue:102
msgid "Manage Sites"
msgstr "管理網站"
#: src/routes/index.ts:176 src/views/user/User.vue:53
#: src/routes/index.ts:185 src/views/user/User.vue:53
msgid "Manage Users"
msgstr "管理使用者"
#: src/views/certificate/Certificate.vue:44
#, fuzzy
msgid "Managed Certificate"
msgstr "更換憑證"
#: src/views/dashboard/ServerAnalytic.vue:220
msgid "Memory"
msgstr "記憶體"
@ -785,12 +817,12 @@ msgid "Memory and Storage"
msgstr "記憶體與儲存"
#: src/components/ChatGPT/ChatGPT.vue:256
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:141
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
msgid "Modify"
msgstr "修改"
#: src/routes/index.ts:114 src/views/certificate/CertificateEditor.vue:76
#: src/routes/index.ts:115 src/views/certificate/CertificateEditor.vue:84
#, fuzzy
msgid "Modify Certificate"
msgstr "憑證狀態"
@ -804,6 +836,7 @@ msgid "Multi-line Directive"
msgstr "多行指令"
#: src/views/certificate/Certificate.vue:22
#: src/views/certificate/CertificateEditor.vue:145
#: src/views/certificate/DNSCredential.vue:13 src/views/config/config.ts:9
#: src/views/domain/cert/ChangeCert.vue:21
#: src/views/domain/components/RightSettings.vue:81
@ -857,7 +890,7 @@ msgstr "Nginx 控制元件"
msgid "Nginx Error Log Path"
msgstr "Nginx 錯誤日誌路徑"
#: src/routes/index.ts:145 src/views/nginx_log/NginxLog.vue:145
#: src/routes/index.ts:146 src/views/nginx_log/NginxLog.vue:145
msgid "Nginx Log"
msgstr "Nginx 日誌"
@ -870,10 +903,12 @@ msgid "Nginx restarted successfully"
msgstr "Nginx 重啟成功"
#: src/components/ChatGPT/ChatGPT.vue:277
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:345
#: src/views/domain/DomainList.vue:143
#: src/components/Notification/Notification.vue:84
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:351
#: src/views/domain/DomainList.vue:142
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:81
#: src/views/domain/ngx_conf/LocationEditor.vue:76
#: src/views/notification/Notification.vue:71
msgid "No"
msgstr "取消"
@ -881,11 +916,11 @@ msgstr "取消"
msgid "Node Secret"
msgstr "Node Secret"
#: src/views/certificate/Certificate.vue:90
#: src/views/certificate/Certificate.vue:98
msgid "Not After"
msgstr ""
#: src/routes/index.ts:223 src/routes/index.ts:225
#: src/routes/index.ts:232 src/routes/index.ts:234
msgid "Not Found"
msgstr "找不到頁面"
@ -898,6 +933,16 @@ msgstr "此前無效: %{date}"
msgid "Note"
msgstr "備註"
#: src/views/notification/Notification.vue:63
#, fuzzy
msgid "Notification"
msgstr "憑證"
#: src/components/Notification/Notification.vue:82 src/routes/index.ts:177
#, fuzzy
msgid "Notifications"
msgstr "憑證"
#: src/views/domain/cert/components/ObtainCert.vue:191
msgid "Obtain certificate"
msgstr "取得憑證"
@ -913,16 +958,18 @@ msgid "Offline"
msgstr "離線"
#: src/components/ChatGPT/ChatGPT.vue:278
#: src/components/Notification/Notification.vue:85
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:59
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:140
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:346
#: src/components/StdDesign/StdDataDisplay/StdCurd.vue:144
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:352
#: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:104
#: src/views/domain/cert/components/ObtainCert.vue:149
#: src/views/domain/components/Deploy.vue:23
#: src/views/domain/components/RightSettings.vue:51
#: src/views/domain/DomainList.vue:144
#: src/views/domain/DomainList.vue:143
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:215
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:47
#: src/views/notification/Notification.vue:72
msgid "OK"
msgstr "確定"
@ -1029,7 +1076,7 @@ msgstr "請至少選擇一個節點!"
msgid "Pre-release"
msgstr "預先發布"
#: src/routes/index.ts:184 src/views/preference/Preference.vue:85
#: src/routes/index.ts:193 src/views/preference/Preference.vue:85
msgid "Preference"
msgstr "偏好設定"
@ -1092,12 +1139,27 @@ msgstr "重新載入中"
msgid "Reloading nginx"
msgstr "正在重新載入 Nginx"
#: src/components/Notification/Notification.vue:52
#, fuzzy
msgid "Removed successfully"
msgstr "儲存成功"
#: src/views/certificate/RenewCert.vue:43
#: src/views/certificate/RenewCert.vue:47
#, fuzzy
msgid "Renew Certificate"
msgstr "更換憑證"
#: src/language/constants.ts:38
#, fuzzy
msgid "Renew Certificate Error"
msgstr "更換憑證"
#: src/language/constants.ts:37
#, fuzzy
msgid "Renew Certificate Success"
msgstr "更換憑證"
#: src/views/certificate/RenewCert.vue:25
#, fuzzy
msgid "Renew successfully"
@ -1128,7 +1190,7 @@ msgid "Running"
msgstr "執行中"
#: src/components/ChatGPT/ChatGPT.vue:259
#: src/views/certificate/CertificateEditor.vue:175
#: src/views/certificate/CertificateEditor.vue:212
#: src/views/config/ConfigEdit.vue:98 src/views/domain/DomainEdit.vue:268
#: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:111
#: src/views/preference/Preference.vue:113
@ -1145,7 +1207,7 @@ msgid "Save error %{msg}"
msgstr "儲存錯誤 %{msg}"
#: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
#: src/views/certificate/CertificateEditor.vue:46
#: src/views/certificate/CertificateEditor.vue:47
#: src/views/preference/Preference.vue:58
msgid "Save successfully"
msgstr "儲存成功"
@ -1212,29 +1274,31 @@ msgstr "使用 HTTP01 挑戰提供者"
msgid "Single Directive"
msgstr "單一指令"
#: src/routes/index.ts:159
#: src/routes/index.ts:160
msgid "Site Logs"
msgstr "網站日誌"
#: src/routes/index.ts:66
#: src/routes/index.ts:67
msgid "Sites List"
msgstr "網站列表"
#: src/views/certificate/CertificateEditor.vue:135
#: src/views/certificate/CertificateEditor.vue:172
#, fuzzy
msgid "SSL Certificate Content"
msgstr "SSL 認證內容"
#: src/views/certificate/CertificateEditor.vue:142
#: src/views/certificate/CertificateEditor.vue:179
#, fuzzy
msgid "SSL Certificate Key Content"
msgstr "SSL 憑證金鑰內容"
#: src/views/certificate/Certificate.vue:63
#: src/views/certificate/Certificate.vue:71
#: src/views/certificate/CertificateEditor.vue:163
msgid "SSL Certificate Key Path"
msgstr "SSL 憑證金鑰路徑"
#: src/views/certificate/Certificate.vue:55
#: src/views/certificate/Certificate.vue:63
#: src/views/certificate/CertificateEditor.vue:154
msgid "SSL Certificate Path"
msgstr "SSL 憑證路徑"
@ -1247,7 +1311,7 @@ msgstr "登入"
msgid "Stable"
msgstr "穩定"
#: src/views/certificate/Certificate.vue:71 src/views/domain/DomainList.vue:25
#: src/views/certificate/Certificate.vue:79 src/views/domain/DomainList.vue:25
#: src/views/environment/Environment.vue:78
msgid "Status"
msgstr "狀態"
@ -1265,6 +1329,10 @@ msgstr "儲存空間"
msgid "Subject Name: %{subject}"
msgstr "主體名稱: %{name}"
#: src/constants/index.ts:20
msgid "Success"
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:233
msgid "Swap"
msgstr "交換空間"
@ -1277,7 +1345,7 @@ msgstr ""
msgid "Switch to light theme"
msgstr ""
#: src/routes/index.ts:192
#: src/routes/index.ts:201
msgid "System"
msgstr "系統"
@ -1289,7 +1357,7 @@ msgstr "表格"
msgid "Target"
msgstr "目標"
#: src/routes/index.ts:137 src/views/pty/Terminal.vue:95
#: src/routes/index.ts:138 src/views/pty/Terminal.vue:95
msgid "Terminal"
msgstr "終端機"
@ -1321,12 +1389,12 @@ msgstr "注意:目前設定中的 server_name 必須為需要申請憑證的
msgid "The username or password is incorrect"
msgstr "使用者名稱或密碼不正確"
#: src/views/certificate/CertificateEditor.vue:93
#: src/views/certificate/CertificateEditor.vue:101
#, fuzzy
msgid "This Auto Cert item is invalid, please remove it."
msgstr "此自動憑證項目無效,請將其移除。"
#: src/views/certificate/CertificateEditor.vue:83
#: src/views/certificate/CertificateEditor.vue:91
msgid "This certificate is managed by Nginx UI"
msgstr ""
@ -1334,6 +1402,10 @@ msgstr ""
msgid "This field should not be empty"
msgstr "此欄位不應為空"
#: src/views/notification/Notification.vue:21
msgid "Title"
msgstr ""
#: src/views/domain/ngx_conf/NgxConfigEditor.vue:42
msgid ""
"To make sure the certification auto-renewal can work normally, we need to "
@ -1345,6 +1417,7 @@ msgstr ""
"的請求,我們需要儲存這個檔案並重新載入 Nginx。你確定你要繼續嗎"
#: src/views/certificate/Certificate.vue:39 src/views/config/config.ts:14
#: src/views/notification/Notification.vue:15
msgid "Type"
msgstr "類型"
@ -1360,7 +1433,7 @@ msgstr "更新時間"
msgid "Updated successfully"
msgstr "更新成功"
#: src/routes/index.ts:203 src/views/system/Upgrade.vue:143
#: src/routes/index.ts:212 src/views/system/Upgrade.vue:143
#: src/views/system/Upgrade.vue:235
msgid "Upgrade"
msgstr "升級"
@ -1393,7 +1466,7 @@ msgstr "使用者名稱"
msgid "Username (*)"
msgstr "使用者名稱 (*)"
#: src/views/certificate/Certificate.vue:80
#: src/views/certificate/Certificate.vue:88
msgid "Valid"
msgstr ""
@ -1401,7 +1474,12 @@ msgstr ""
msgid "View"
msgstr "檢視"
#: src/views/config/InspectConfig.vue:36
#: src/components/Notification/Notification.vue:143
#, fuzzy
msgid "View all notifications"
msgstr "憑證"
#: src/constants/index.ts:18 src/views/config/InspectConfig.vue:36
#: src/views/domain/cert/components/AutoCertStepOne.vue:23
#: src/views/domain/DomainAdd.vue:114
msgid "Warning"
@ -1478,9 +1556,6 @@ msgstr "您可以在此頁面檢查 Nginx UI 的升級。"
#~ "新增到您網域的 DNS 記錄中以進行所有權驗證。驗證完成後,記錄將被刪除。請注"
#~ "意,以下時間設定均以秒為單位。"
#~ msgid "Certification"
#~ msgstr "憑證"
#~ msgid "Delete ID: %{id}"
#~ msgstr "刪除 ID: %{id}"

View file

@ -7,6 +7,7 @@ import gettext from '@/gettext'
import auth from '@/api/auth'
import NginxControl from '@/components/NginxControl/NginxControl.vue'
import SwitchAppearance from '@/components/SwitchAppearance/SwitchAppearance.vue'
import Notification from '@/components/Notification/Notification.vue'
const emit = defineEmits<{
clickUnFold: [void]
@ -39,6 +40,8 @@ function logout() {
<SwitchAppearance />
<Notification />
<a href="/">
<HomeOutlined />
</a>

View file

@ -3,6 +3,7 @@ import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
state: () => ({
token: '',
unreadCount: 0,
}),
getters: {
is_login(state): boolean {

View file

@ -2,6 +2,7 @@ import { createRouter, createWebHashHistory } from 'vue-router'
import type { AntDesignOutlinedIconType } from '@ant-design/icons-vue/lib/icons/AntDesignOutlined'
import {
BellOutlined,
CloudOutlined,
CodeOutlined,
DatabaseOutlined,
@ -171,6 +172,14 @@ export const routes: Route[] = [
icon: DatabaseOutlined,
},
},
{
path: 'notifications',
name: () => $gettext('Notifications'),
component: () => import('@/views/notification/Notification.vue'),
meta: {
icon: BellOutlined,
},
},
{
path: 'user',
name: () => $gettext('Manage Users'),

View file

@ -41,11 +41,19 @@ const columns: Column[] = [{
customRender: (args: customRender) => {
const template = []
const { text } = args
if (text === true || text > 0)
template.push(<Tag bordered={false} color="processing">{$gettext('Managed Certificate')}</Tag>)
const managed = $gettext('Managed Certificate')
const general = $gettext('General Certificate')
if (text === true || text > 0) {
template.push(<Tag bordered={false} color="processing">
{ managed }
</Tag>)
}
else
template.push(<Tag bordered={false} color="purple">{$gettext('General Certificate')}</Tag>)
else {
template.push(<Tag bordered={false} color="purple">{
general }
</Tag>)
}
return h('div', template)
},

View file

@ -40,10 +40,14 @@ onMounted(() => {
init()
})
const router = useRouter()
function save() {
cert.save(data.value.id, data.value).then(r => {
data.value = r
message.success($gettext('Save successfully'))
router.push(`/certificates/${r.id}`)
}).catch(e => {
message.error($gettext(e?.message ?? 'Server error'))
})
}
@ -70,12 +74,16 @@ const log = computed(() => {
return logs.join('\n')
})
const isManaged = computed(() => {
return data.value.auto_cert === AutoCertState.Enable
})
</script>
<template>
<ACard :title="id > 0 ? $gettext('Modify Certificate') : $gettext('Add Certificate')">
<div
v-if="data.auto_cert === AutoCertState.Enable"
v-if="isManaged"
class="mb-4"
>
<div class="mb-2">
@ -121,25 +129,45 @@ const log = computed(() => {
</AFormItem>
</AForm>
<RenewCert
v-if="data.auto_cert === AutoCertState.Enable"
@renewed="init"
/>
<template v-if="isManaged">
<RenewCert @renewed="init" />
<AutoCertStepOne
style="max-width: 600px"
hide-note
/>
</template>
<AutoCertStepOne
v-if="data.auto_cert === AutoCertState.Enable"
style="max-width: 600px"
hide-note
/>
<AForm
layout="vertical"
style="max-width: 600px"
>
<AFormItem :label="$gettext('Name')">
<p v-if="isManaged">
{{ data.name }}
</p>
<AInput
v-else
v-model:value="data.name"
/>
</AFormItem>
<AFormItem :label="$gettext('SSL Certificate Path')">
<AInput v-model:value="data.ssl_certificate_path" />
<p v-if="isManaged">
{{ data.ssl_certificate_path }}
</p>
<AInput
v-else
v-model:value="data.ssl_certificate_path"
/>
</AFormItem>
<AFormItem :label="$gettext('SSL Certificate Key Path')">
<AInput v-model:value="data.ssl_certificate_key_path" />
<p v-if="isManaged">
{{ data.ssl_certificate_key_path }}
</p>
<AInput
v-else
v-model:value="data.ssl_certificate_key_path"
/>
</AFormItem>
<AFormItem :label="$gettext('SSL Certificate Content')">
<CodeEditor

View file

@ -113,7 +113,6 @@ watch(route, () => {
})"
>
<template #actions="{ record }">
<ADivider type="vertical" />
<AButton
v-if="record.enabled"
type="link"

View file

@ -0,0 +1,87 @@
<script setup lang="ts">
import { useGettext } from 'vue3-gettext'
import { message } from 'ant-design-vue'
import StdCurd from '@/components/StdDesign/StdDataDisplay/StdCurd.vue'
import notification from '@/api/notification'
import type { Column } from '@/components/StdDesign/types'
import type { customRender } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer'
import { datetime, mask } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer'
import { NotificationType } from '@/constants'
import { useUserStore } from '@/pinia'
const { $gettext } = useGettext()
const columns: Column[] = [{
title: () => $gettext('Type'),
dataIndex: 'type',
customRender: (args: customRender) => mask(args, NotificationType),
sortable: true,
pithy: true,
}, {
title: () => $gettext('Title'),
dataIndex: 'title',
customRender: (args: customRender) => {
return h('span', $gettext(args.text))
},
pithy: true,
}, {
title: () => $gettext('Details'),
dataIndex: 'details',
pithy: true,
}, {
title: () => $gettext('Created at'),
dataIndex: 'created_at',
sortable: true,
customRender: datetime,
pithy: true,
}, {
title: () => $gettext('Action'),
dataIndex: 'action',
}]
const { unreadCount } = storeToRefs(useUserStore())
const curd = ref()
function clear() {
notification.clear().then(() => {
message.success($gettext('Cleared successfully'))
curd.value.get_list()
unreadCount.value = 0
}).catch(e => {
message.error($gettext(e?.message ?? 'Server error'))
})
}
watch(unreadCount, () => {
curd.value.get_list()
})
</script>
<template>
<StdCurd
ref="curd"
:title="$gettext('Notification')"
:columns="columns"
:api="notification"
disabled-modify
disable-add
>
<template #extra>
<APopconfirm
:cancel-text="$gettext('No')"
:ok-text="$gettext('OK')"
:title="$gettext('Are you sure you want to clear all notifications?')"
placement="bottomRight"
@confirm="clear"
>
<a>
{{ $gettext('Clear') }}
</a>
</APopconfirm>
</template>
</StdCurd>
</template>
<style scoped lang="less">
</style>

View file

@ -17,7 +17,7 @@ func main() {
// specify the output directory (default: "./query")
// ### if you want to query without context constrain, set mode gen.WithoutContext ###
g := gen.NewGenerator(gen.Config{
OutPath: "../../server/query",
OutPath: "../../query",
Mode: gen.WithoutContext | gen.WithDefaultQuery,
//if you want the nullable field generation property to be pointer type, set FieldNullable true
FieldNullable: true,

View file

@ -2,8 +2,10 @@ package cert
import (
"github.com/0xJacky/Nginx-UI/internal/logger"
"github.com/0xJacky/Nginx-UI/internal/notification"
"github.com/0xJacky/Nginx-UI/model"
"github.com/pkg/errors"
"runtime"
"strings"
"time"
)
@ -11,7 +13,9 @@ import (
func AutoObtain() {
defer func() {
if err := recover(); err != nil {
logger.Error("AutoCert Recover", err)
buf := make([]byte, 1024)
runtime.Stack(buf, false)
logger.Error("AutoCert Recover", err, string(buf))
}
}()
logger.Info("AutoCert Worker Started")
@ -38,21 +42,29 @@ func renew(certModel *model.Cert) {
if len(certModel.Domains) == 0 {
log.Error(errors.New("domains list is empty, " +
"try to reopen auto-cert for this config:" + confName))
notification.Error("Renew Certificate Error", confName)
return
}
if certModel.SSLCertificatePath != "" {
cert, err := GetCertInfo(certModel.SSLCertificatePath)
if err != nil {
// Get certificate info error, ignore this certificate
log.Error(errors.Wrap(err, "get certificate info error"))
return
}
if time.Now().Sub(cert.NotBefore).Hours()/24 < 7 {
// not between 1 week, ignore this certificate
return
}
if certModel.SSLCertificatePath == "" {
log.Error(errors.New("ssl certificate path is empty, " +
"try to reopen auto-cert for this config:" + confName))
notification.Error("Renew Certificate Error", confName)
return
}
cert, err := GetCertInfo(certModel.SSLCertificatePath)
if err != nil {
// Get certificate info error, ignore this certificate
log.Error(errors.Wrap(err, "get certificate info error"))
notification.Error("Renew Certificate Error", strings.Join(certModel.Domains, ", "))
return
}
if time.Now().Sub(cert.NotBefore).Hours()/24 < 7 {
// not between 1 week, ignore this certificate
return
}
// after 1 mo, reissue certificate
logChan := make(chan string, 1)
errChan := make(chan error, 1)
@ -76,5 +88,9 @@ func renew(certModel *model.Cert) {
// block, unless errChan closed
for err := range errChan {
log.Error(err)
notification.Error("Renew Certificate Error", strings.Join(payload.ServerName, ", "))
return
}
notification.Success("Renew Certificate Success", strings.Join(payload.ServerName, ", "))
}

View file

@ -0,0 +1,32 @@
package notification
import (
"github.com/0xJacky/Nginx-UI/model"
"github.com/0xJacky/Nginx-UI/query"
)
func Info(title string, details string) {
push(model.NotificationInfo, title, details)
}
func Error(title string, details string) {
push(model.NotificationError, title, details)
}
func Warning(title string, details string) {
push(model.NotificationWarning, title, details)
}
func Success(title string, details string) {
push(model.NotificationSuccess, title, details)
}
func push(nType model.NotificationType, title string, details string) {
n := query.Notification
_ = n.Create(&model.Notification{
Type: nType,
Title: title,
Details: details,
})
}

View file

@ -34,6 +34,7 @@ func GenerateAllModel() []any {
Site{},
DnsCredential{},
Environment{},
Notification{},
}
}
@ -99,12 +100,8 @@ func OrderAndPaginate(c *gin.Context) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
sort := c.DefaultQuery("order", "desc")
sortBy := DefaultQuery(c, "sort_by", "")
if sortBy != "" {
order := fmt.Sprintf("`%s` %s", DefaultQuery(c, "sort_by", "id"), sort)
db = db.Order(order)
}
order := fmt.Sprintf("`%s` %s", DefaultQuery(c, "sort_by", "id"), sort)
db = db.Order(order)
page := cast.ToInt(c.Query("page"))
if page == 0 {

17
model/notification.go Normal file
View file

@ -0,0 +1,17 @@
package model
type NotificationType int
const (
NotificationError NotificationType = iota
NotificationWarning
NotificationInfo
NotificationSuccess
)
type Notification struct {
Model
Type NotificationType `json:"type"`
Title string `json:"title"`
Details string `json:"details"`
}

View file

@ -6,7 +6,6 @@ package query
import (
"context"
"github.com/0xJacky/Nginx-UI/model"
"strings"
"gorm.io/gorm"
@ -17,6 +16,8 @@ import (
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"github.com/0xJacky/Nginx-UI/model"
)
func newAuthToken(db *gorm.DB, opts ...gen.DOOption) authToken {
@ -162,10 +163,6 @@ func (a authTokenDo) Where(conds ...gen.Condition) *authTokenDo {
return a.withDO(a.DO.Where(conds...))
}
func (a authTokenDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) *authTokenDo {
return a.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB()))
}
func (a authTokenDo) Order(conds ...field.Expr) *authTokenDo {
return a.withDO(a.DO.Order(conds...))
}

View file

@ -6,7 +6,6 @@ package query
import (
"context"
"github.com/0xJacky/Nginx-UI/model"
"strings"
"gorm.io/gorm"
@ -17,6 +16,8 @@ import (
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"github.com/0xJacky/Nginx-UI/model"
)
func newAuth(db *gorm.DB, opts ...gen.DOOption) auth {
@ -182,10 +183,6 @@ func (a authDo) Where(conds ...gen.Condition) *authDo {
return a.withDO(a.DO.Where(conds...))
}
func (a authDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) *authDo {
return a.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB()))
}
func (a authDo) Order(conds ...field.Expr) *authDo {
return a.withDO(a.DO.Order(conds...))
}

View file

@ -6,7 +6,6 @@ package query
import (
"context"
model2 "github.com/0xJacky/Nginx-UI/model"
"strings"
"gorm.io/gorm"
@ -17,13 +16,15 @@ import (
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"github.com/0xJacky/Nginx-UI/model"
)
func newCert(db *gorm.DB, opts ...gen.DOOption) cert {
_cert := cert{}
_cert.certDo.UseDB(db, opts...)
_cert.certDo.UseModel(&model2.Cert{})
_cert.certDo.UseModel(&model.Cert{})
tableName := _cert.certDo.TableName()
_cert.ALL = field.NewAsterisk(tableName)
@ -67,8 +68,8 @@ type cert struct {
AutoCert field.Int
ChallengeMethod field.String
DnsCredentialID field.Int
Log field.String
DnsCredential certBelongsToDnsCredential
Log field.String
DnsCredential certBelongsToDnsCredential
fieldMap map[string]field.Expr
}
@ -170,17 +171,17 @@ func (a certBelongsToDnsCredential) Session(session *gorm.Session) *certBelongsT
return &a
}
func (a certBelongsToDnsCredential) Model(m *model2.Cert) *certBelongsToDnsCredentialTx {
func (a certBelongsToDnsCredential) Model(m *model.Cert) *certBelongsToDnsCredentialTx {
return &certBelongsToDnsCredentialTx{a.db.Model(m).Association(a.Name())}
}
type certBelongsToDnsCredentialTx struct{ tx *gorm.Association }
func (a certBelongsToDnsCredentialTx) Find() (result *model2.DnsCredential, err error) {
func (a certBelongsToDnsCredentialTx) Find() (result *model.DnsCredential, err error) {
return result, a.tx.Find(&result)
}
func (a certBelongsToDnsCredentialTx) Append(values ...*model2.DnsCredential) (err error) {
func (a certBelongsToDnsCredentialTx) Append(values ...*model.DnsCredential) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
@ -188,7 +189,7 @@ func (a certBelongsToDnsCredentialTx) Append(values ...*model2.DnsCredential) (e
return a.tx.Append(targetValues...)
}
func (a certBelongsToDnsCredentialTx) Replace(values ...*model2.DnsCredential) (err error) {
func (a certBelongsToDnsCredentialTx) Replace(values ...*model.DnsCredential) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
@ -196,7 +197,7 @@ func (a certBelongsToDnsCredentialTx) Replace(values ...*model2.DnsCredential) (
return a.tx.Replace(targetValues...)
}
func (a certBelongsToDnsCredentialTx) Delete(values ...*model2.DnsCredential) (err error) {
func (a certBelongsToDnsCredentialTx) Delete(values ...*model.DnsCredential) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
@ -215,7 +216,7 @@ func (a certBelongsToDnsCredentialTx) Count() int64 {
type certDo struct{ gen.DO }
// FirstByID Where("id=@id")
func (c certDo) FirstByID(id int) (result *model2.Cert, err error) {
func (c certDo) FirstByID(id int) (result *model.Cert, err error) {
var params []interface{}
var generateSQL strings.Builder
@ -288,10 +289,6 @@ func (c certDo) Where(conds ...gen.Condition) *certDo {
return c.withDO(c.DO.Where(conds...))
}
func (c certDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) *certDo {
return c.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB()))
}
func (c certDo) Order(conds ...field.Expr) *certDo {
return c.withDO(c.DO.Order(conds...))
}
@ -340,57 +337,57 @@ func (c certDo) Unscoped() *certDo {
return c.withDO(c.DO.Unscoped())
}
func (c certDo) Create(values ...*model2.Cert) error {
func (c certDo) Create(values ...*model.Cert) error {
if len(values) == 0 {
return nil
}
return c.DO.Create(values)
}
func (c certDo) CreateInBatches(values []*model2.Cert, batchSize int) error {
func (c certDo) CreateInBatches(values []*model.Cert, batchSize int) error {
return c.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (c certDo) Save(values ...*model2.Cert) error {
func (c certDo) Save(values ...*model.Cert) error {
if len(values) == 0 {
return nil
}
return c.DO.Save(values)
}
func (c certDo) First() (*model2.Cert, error) {
func (c certDo) First() (*model.Cert, error) {
if result, err := c.DO.First(); err != nil {
return nil, err
} else {
return result.(*model2.Cert), nil
return result.(*model.Cert), nil
}
}
func (c certDo) Take() (*model2.Cert, error) {
func (c certDo) Take() (*model.Cert, error) {
if result, err := c.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model2.Cert), nil
return result.(*model.Cert), nil
}
}
func (c certDo) Last() (*model2.Cert, error) {
func (c certDo) Last() (*model.Cert, error) {
if result, err := c.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model2.Cert), nil
return result.(*model.Cert), nil
}
}
func (c certDo) Find() ([]*model2.Cert, error) {
func (c certDo) Find() ([]*model.Cert, error) {
result, err := c.DO.Find()
return result.([]*model2.Cert), err
return result.([]*model.Cert), err
}
func (c certDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model2.Cert, err error) {
buf := make([]*model2.Cert, 0, batchSize)
func (c certDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Cert, err error) {
buf := make([]*model.Cert, 0, batchSize)
err = c.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
@ -398,7 +395,7 @@ func (c certDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error)
return results, err
}
func (c certDo) FindInBatches(result *[]*model2.Cert, batchSize int, fc func(tx gen.Dao, batch int) error) error {
func (c certDo) FindInBatches(result *[]*model.Cert, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return c.DO.FindInBatches(result, batchSize, fc)
}
@ -424,23 +421,23 @@ func (c certDo) Preload(fields ...field.RelationField) *certDo {
return &c
}
func (c certDo) FirstOrInit() (*model2.Cert, error) {
func (c certDo) FirstOrInit() (*model.Cert, error) {
if result, err := c.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model2.Cert), nil
return result.(*model.Cert), nil
}
}
func (c certDo) FirstOrCreate() (*model2.Cert, error) {
func (c certDo) FirstOrCreate() (*model.Cert, error) {
if result, err := c.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model2.Cert), nil
return result.(*model.Cert), nil
}
}
func (c certDo) FindByPage(offset int, limit int) (result []*model2.Cert, count int64, err error) {
func (c certDo) FindByPage(offset int, limit int) (result []*model.Cert, count int64, err error) {
result, err = c.Offset(offset).Limit(limit).Find()
if err != nil {
return
@ -469,7 +466,7 @@ func (c certDo) Scan(result interface{}) (err error) {
return c.DO.Scan(result)
}
func (c certDo) Delete(models ...*model2.Cert) (result gen.ResultInfo, err error) {
func (c certDo) Delete(models ...*model.Cert) (result gen.ResultInfo, err error) {
return c.DO.Delete(models)
}

View file

@ -6,7 +6,6 @@ package query
import (
"context"
"github.com/0xJacky/Nginx-UI/model"
"strings"
"gorm.io/gorm"
@ -17,6 +16,8 @@ import (
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"github.com/0xJacky/Nginx-UI/model"
)
func newChatGPTLog(db *gorm.DB, opts ...gen.DOOption) chatGPTLog {
@ -166,10 +167,6 @@ func (c chatGPTLogDo) Where(conds ...gen.Condition) *chatGPTLogDo {
return c.withDO(c.DO.Where(conds...))
}
func (c chatGPTLogDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) *chatGPTLogDo {
return c.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB()))
}
func (c chatGPTLogDo) Order(conds ...field.Expr) *chatGPTLogDo {
return c.withDO(c.DO.Order(conds...))
}

View file

@ -6,7 +6,6 @@ package query
import (
"context"
"github.com/0xJacky/Nginx-UI/model"
"strings"
"gorm.io/gorm"
@ -17,6 +16,8 @@ import (
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"github.com/0xJacky/Nginx-UI/model"
)
func newConfigBackup(db *gorm.DB, opts ...gen.DOOption) configBackup {
@ -186,10 +187,6 @@ func (c configBackupDo) Where(conds ...gen.Condition) *configBackupDo {
return c.withDO(c.DO.Where(conds...))
}
func (c configBackupDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) *configBackupDo {
return c.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB()))
}
func (c configBackupDo) Order(conds ...field.Expr) *configBackupDo {
return c.withDO(c.DO.Order(conds...))
}

View file

@ -6,7 +6,6 @@ package query
import (
"context"
"github.com/0xJacky/Nginx-UI/model"
"strings"
"gorm.io/gorm"
@ -17,6 +16,8 @@ import (
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"github.com/0xJacky/Nginx-UI/model"
)
func newDnsCredential(db *gorm.DB, opts ...gen.DOOption) dnsCredential {
@ -186,10 +187,6 @@ func (d dnsCredentialDo) Where(conds ...gen.Condition) *dnsCredentialDo {
return d.withDO(d.DO.Where(conds...))
}
func (d dnsCredentialDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) *dnsCredentialDo {
return d.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB()))
}
func (d dnsCredentialDo) Order(conds ...field.Expr) *dnsCredentialDo {
return d.withDO(d.DO.Order(conds...))
}

View file

@ -6,7 +6,6 @@ package query
import (
"context"
"github.com/0xJacky/Nginx-UI/model"
"strings"
"gorm.io/gorm"
@ -17,6 +16,8 @@ import (
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"github.com/0xJacky/Nginx-UI/model"
)
func newEnvironment(db *gorm.DB, opts ...gen.DOOption) environment {
@ -194,10 +195,6 @@ func (e environmentDo) Where(conds ...gen.Condition) *environmentDo {
return e.withDO(e.DO.Where(conds...))
}
func (e environmentDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) *environmentDo {
return e.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB()))
}
func (e environmentDo) Order(conds ...field.Expr) *environmentDo {
return e.withDO(e.DO.Order(conds...))
}

View file

@ -24,6 +24,7 @@ var (
ConfigBackup *configBackup
DnsCredential *dnsCredential
Environment *environment
Notification *notification
Site *site
)
@ -36,6 +37,7 @@ func SetDefault(db *gorm.DB, opts ...gen.DOOption) {
ConfigBackup = &Q.ConfigBackup
DnsCredential = &Q.DnsCredential
Environment = &Q.Environment
Notification = &Q.Notification
Site = &Q.Site
}
@ -49,6 +51,7 @@ func Use(db *gorm.DB, opts ...gen.DOOption) *Query {
ConfigBackup: newConfigBackup(db, opts...),
DnsCredential: newDnsCredential(db, opts...),
Environment: newEnvironment(db, opts...),
Notification: newNotification(db, opts...),
Site: newSite(db, opts...),
}
}
@ -63,6 +66,7 @@ type Query struct {
ConfigBackup configBackup
DnsCredential dnsCredential
Environment environment
Notification notification
Site site
}
@ -78,6 +82,7 @@ func (q *Query) clone(db *gorm.DB) *Query {
ConfigBackup: q.ConfigBackup.clone(db),
DnsCredential: q.DnsCredential.clone(db),
Environment: q.Environment.clone(db),
Notification: q.Notification.clone(db),
Site: q.Site.clone(db),
}
}
@ -100,6 +105,7 @@ func (q *Query) ReplaceDB(db *gorm.DB) *Query {
ConfigBackup: q.ConfigBackup.replaceDB(db),
DnsCredential: q.DnsCredential.replaceDB(db),
Environment: q.Environment.replaceDB(db),
Notification: q.Notification.replaceDB(db),
Site: q.Site.replaceDB(db),
}
}
@ -112,6 +118,7 @@ type queryCtx struct {
ConfigBackup *configBackupDo
DnsCredential *dnsCredentialDo
Environment *environmentDo
Notification *notificationDo
Site *siteDo
}
@ -124,6 +131,7 @@ func (q *Query) WithContext(ctx context.Context) *queryCtx {
ConfigBackup: q.ConfigBackup.WithContext(ctx),
DnsCredential: q.DnsCredential.WithContext(ctx),
Environment: q.Environment.WithContext(ctx),
Notification: q.Notification.WithContext(ctx),
Site: q.Site.WithContext(ctx),
}
}

374
query/notifications.gen.go Normal file
View file

@ -0,0 +1,374 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package query
import (
"context"
"strings"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"github.com/0xJacky/Nginx-UI/model"
)
func newNotification(db *gorm.DB, opts ...gen.DOOption) notification {
_notification := notification{}
_notification.notificationDo.UseDB(db, opts...)
_notification.notificationDo.UseModel(&model.Notification{})
tableName := _notification.notificationDo.TableName()
_notification.ALL = field.NewAsterisk(tableName)
_notification.ID = field.NewInt(tableName, "id")
_notification.CreatedAt = field.NewTime(tableName, "created_at")
_notification.UpdatedAt = field.NewTime(tableName, "updated_at")
_notification.DeletedAt = field.NewField(tableName, "deleted_at")
_notification.Type = field.NewInt(tableName, "type")
_notification.Title = field.NewString(tableName, "title")
_notification.Details = field.NewString(tableName, "details")
_notification.fillFieldMap()
return _notification
}
type notification struct {
notificationDo
ALL field.Asterisk
ID field.Int
CreatedAt field.Time
UpdatedAt field.Time
DeletedAt field.Field
Type field.Int
Title field.String
Details field.String
fieldMap map[string]field.Expr
}
func (n notification) Table(newTableName string) *notification {
n.notificationDo.UseTable(newTableName)
return n.updateTableName(newTableName)
}
func (n notification) As(alias string) *notification {
n.notificationDo.DO = *(n.notificationDo.As(alias).(*gen.DO))
return n.updateTableName(alias)
}
func (n *notification) updateTableName(table string) *notification {
n.ALL = field.NewAsterisk(table)
n.ID = field.NewInt(table, "id")
n.CreatedAt = field.NewTime(table, "created_at")
n.UpdatedAt = field.NewTime(table, "updated_at")
n.DeletedAt = field.NewField(table, "deleted_at")
n.Type = field.NewInt(table, "type")
n.Title = field.NewString(table, "title")
n.Details = field.NewString(table, "details")
n.fillFieldMap()
return n
}
func (n *notification) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := n.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (n *notification) fillFieldMap() {
n.fieldMap = make(map[string]field.Expr, 7)
n.fieldMap["id"] = n.ID
n.fieldMap["created_at"] = n.CreatedAt
n.fieldMap["updated_at"] = n.UpdatedAt
n.fieldMap["deleted_at"] = n.DeletedAt
n.fieldMap["type"] = n.Type
n.fieldMap["title"] = n.Title
n.fieldMap["details"] = n.Details
}
func (n notification) clone(db *gorm.DB) notification {
n.notificationDo.ReplaceConnPool(db.Statement.ConnPool)
return n
}
func (n notification) replaceDB(db *gorm.DB) notification {
n.notificationDo.ReplaceDB(db)
return n
}
type notificationDo struct{ gen.DO }
// FirstByID Where("id=@id")
func (n notificationDo) FirstByID(id int) (result *model.Notification, err error) {
var params []interface{}
var generateSQL strings.Builder
params = append(params, id)
generateSQL.WriteString("id=? ")
var executeSQL *gorm.DB
executeSQL = n.UnderlyingDB().Where(generateSQL.String(), params...).Take(&result) // ignore_security_alert
err = executeSQL.Error
return
}
// DeleteByID update @@table set deleted_at=strftime('%Y-%m-%d %H:%M:%S','now') where id=@id
func (n notificationDo) DeleteByID(id int) (err error) {
var params []interface{}
var generateSQL strings.Builder
params = append(params, id)
generateSQL.WriteString("update notifications set deleted_at=strftime('%Y-%m-%d %H:%M:%S','now') where id=? ")
var executeSQL *gorm.DB
executeSQL = n.UnderlyingDB().Exec(generateSQL.String(), params...) // ignore_security_alert
err = executeSQL.Error
return
}
func (n notificationDo) Debug() *notificationDo {
return n.withDO(n.DO.Debug())
}
func (n notificationDo) WithContext(ctx context.Context) *notificationDo {
return n.withDO(n.DO.WithContext(ctx))
}
func (n notificationDo) ReadDB() *notificationDo {
return n.Clauses(dbresolver.Read)
}
func (n notificationDo) WriteDB() *notificationDo {
return n.Clauses(dbresolver.Write)
}
func (n notificationDo) Session(config *gorm.Session) *notificationDo {
return n.withDO(n.DO.Session(config))
}
func (n notificationDo) Clauses(conds ...clause.Expression) *notificationDo {
return n.withDO(n.DO.Clauses(conds...))
}
func (n notificationDo) Returning(value interface{}, columns ...string) *notificationDo {
return n.withDO(n.DO.Returning(value, columns...))
}
func (n notificationDo) Not(conds ...gen.Condition) *notificationDo {
return n.withDO(n.DO.Not(conds...))
}
func (n notificationDo) Or(conds ...gen.Condition) *notificationDo {
return n.withDO(n.DO.Or(conds...))
}
func (n notificationDo) Select(conds ...field.Expr) *notificationDo {
return n.withDO(n.DO.Select(conds...))
}
func (n notificationDo) Where(conds ...gen.Condition) *notificationDo {
return n.withDO(n.DO.Where(conds...))
}
func (n notificationDo) Order(conds ...field.Expr) *notificationDo {
return n.withDO(n.DO.Order(conds...))
}
func (n notificationDo) Distinct(cols ...field.Expr) *notificationDo {
return n.withDO(n.DO.Distinct(cols...))
}
func (n notificationDo) Omit(cols ...field.Expr) *notificationDo {
return n.withDO(n.DO.Omit(cols...))
}
func (n notificationDo) Join(table schema.Tabler, on ...field.Expr) *notificationDo {
return n.withDO(n.DO.Join(table, on...))
}
func (n notificationDo) LeftJoin(table schema.Tabler, on ...field.Expr) *notificationDo {
return n.withDO(n.DO.LeftJoin(table, on...))
}
func (n notificationDo) RightJoin(table schema.Tabler, on ...field.Expr) *notificationDo {
return n.withDO(n.DO.RightJoin(table, on...))
}
func (n notificationDo) Group(cols ...field.Expr) *notificationDo {
return n.withDO(n.DO.Group(cols...))
}
func (n notificationDo) Having(conds ...gen.Condition) *notificationDo {
return n.withDO(n.DO.Having(conds...))
}
func (n notificationDo) Limit(limit int) *notificationDo {
return n.withDO(n.DO.Limit(limit))
}
func (n notificationDo) Offset(offset int) *notificationDo {
return n.withDO(n.DO.Offset(offset))
}
func (n notificationDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *notificationDo {
return n.withDO(n.DO.Scopes(funcs...))
}
func (n notificationDo) Unscoped() *notificationDo {
return n.withDO(n.DO.Unscoped())
}
func (n notificationDo) Create(values ...*model.Notification) error {
if len(values) == 0 {
return nil
}
return n.DO.Create(values)
}
func (n notificationDo) CreateInBatches(values []*model.Notification, batchSize int) error {
return n.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (n notificationDo) Save(values ...*model.Notification) error {
if len(values) == 0 {
return nil
}
return n.DO.Save(values)
}
func (n notificationDo) First() (*model.Notification, error) {
if result, err := n.DO.First(); err != nil {
return nil, err
} else {
return result.(*model.Notification), nil
}
}
func (n notificationDo) Take() (*model.Notification, error) {
if result, err := n.DO.Take(); err != nil {
return nil, err
} else {
return result.(*model.Notification), nil
}
}
func (n notificationDo) Last() (*model.Notification, error) {
if result, err := n.DO.Last(); err != nil {
return nil, err
} else {
return result.(*model.Notification), nil
}
}
func (n notificationDo) Find() ([]*model.Notification, error) {
result, err := n.DO.Find()
return result.([]*model.Notification), err
}
func (n notificationDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Notification, err error) {
buf := make([]*model.Notification, 0, batchSize)
err = n.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (n notificationDo) FindInBatches(result *[]*model.Notification, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return n.DO.FindInBatches(result, batchSize, fc)
}
func (n notificationDo) Attrs(attrs ...field.AssignExpr) *notificationDo {
return n.withDO(n.DO.Attrs(attrs...))
}
func (n notificationDo) Assign(attrs ...field.AssignExpr) *notificationDo {
return n.withDO(n.DO.Assign(attrs...))
}
func (n notificationDo) Joins(fields ...field.RelationField) *notificationDo {
for _, _f := range fields {
n = *n.withDO(n.DO.Joins(_f))
}
return &n
}
func (n notificationDo) Preload(fields ...field.RelationField) *notificationDo {
for _, _f := range fields {
n = *n.withDO(n.DO.Preload(_f))
}
return &n
}
func (n notificationDo) FirstOrInit() (*model.Notification, error) {
if result, err := n.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*model.Notification), nil
}
}
func (n notificationDo) FirstOrCreate() (*model.Notification, error) {
if result, err := n.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*model.Notification), nil
}
}
func (n notificationDo) FindByPage(offset int, limit int) (result []*model.Notification, count int64, err error) {
result, err = n.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = n.Offset(-1).Limit(-1).Count()
return
}
func (n notificationDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = n.Count()
if err != nil {
return
}
err = n.Offset(offset).Limit(limit).Scan(result)
return
}
func (n notificationDo) Scan(result interface{}) (err error) {
return n.DO.Scan(result)
}
func (n notificationDo) Delete(models ...*model.Notification) (result gen.ResultInfo, err error) {
return n.DO.Delete(models)
}
func (n *notificationDo) withDO(do gen.Dao) *notificationDo {
n.DO = *do.(*gen.DO)
return n
}

View file

@ -6,7 +6,6 @@ package query
import (
"context"
"github.com/0xJacky/Nginx-UI/model"
"strings"
"gorm.io/gorm"
@ -17,6 +16,8 @@ import (
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"github.com/0xJacky/Nginx-UI/model"
)
func newSite(db *gorm.DB, opts ...gen.DOOption) site {
@ -182,10 +183,6 @@ func (s siteDo) Where(conds ...gen.Condition) *siteDo {
return s.withDO(s.DO.Where(conds...))
}
func (s siteDo) Exists(subquery interface{ UnderlyingDB() *gorm.DB }) *siteDo {
return s.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB()))
}
func (s siteDo) Order(conds ...field.Expr) *siteDo {
return s.withDO(s.DO.Order(conds...))
}

Binary file not shown.

View file

@ -6,6 +6,7 @@ import (
"github.com/0xJacky/Nginx-UI/api/cluster"
"github.com/0xJacky/Nginx-UI/api/config"
"github.com/0xJacky/Nginx-UI/api/nginx"
"github.com/0xJacky/Nginx-UI/api/notification"
"github.com/0xJacky/Nginx-UI/api/openai"
"github.com/0xJacky/Nginx-UI/api/sites"
"github.com/0xJacky/Nginx-UI/api/system"
@ -54,6 +55,7 @@ func InitRouter() *gin.Engine {
system.InitPrivateRouter(g)
openai.InitRouter(g)
cluster.InitRouter(g)
notification.InitRouter(g)
}
// Authorization required and websocket request