Browse Source

feat: change challenge method in certificate management page

0xJacky 1 year ago
parent
commit
5b3cd981e9

+ 12 - 185
api/certificate/cert.go → api/certificate/certificate.go

@@ -2,166 +2,27 @@ package certificate
 
 import (
 	"github.com/0xJacky/Nginx-UI/api"
+	"github.com/0xJacky/Nginx-UI/api/cosy"
 	"github.com/0xJacky/Nginx-UI/api/sites"
 	"github.com/0xJacky/Nginx-UI/internal/cert"
-	"github.com/0xJacky/Nginx-UI/internal/cert/dns"
-	"github.com/0xJacky/Nginx-UI/internal/logger"
-	"github.com/0xJacky/Nginx-UI/internal/nginx"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/gin-gonic/gin"
-	"github.com/gorilla/websocket"
 	"github.com/spf13/cast"
 	"net/http"
 	"os"
 	"path/filepath"
-	"strings"
 )
 
-const (
-	Success = "success"
-	Info    = "info"
-	Error   = "error"
-)
-
-type IssueCertResponse struct {
-	Status            string `json:"status"`
-	Message           string `json:"message"`
-	SSLCertificate    string `json:"ssl_certificate,omitempty"`
-	SSLCertificateKey string `json:"ssl_certificate_key,omitempty"`
-}
-
-func handleIssueCertLogChan(conn *websocket.Conn, logChan chan string) {
-	defer func() {
-		if err := recover(); err != nil {
-			logger.Error(err)
-		}
-	}()
-
-	for logString := range logChan {
-
-		err := conn.WriteJSON(IssueCertResponse{
-			Status:  Info,
-			Message: logString,
-		})
-
-		if err != nil {
-			logger.Error(err)
-			return
-		}
-
-	}
-}
-
-func IssueCert(c *gin.Context) {
-	var upGrader = websocket.Upgrader{
-		CheckOrigin: func(r *http.Request) bool {
-			return true
-		},
-	}
-
-	// upgrade http to websocket
-	ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)
-	if err != nil {
-		logger.Error(err)
-		return
-	}
-
-	defer func(ws *websocket.Conn) {
-		_ = ws.Close()
-	}(ws)
-
-	// read
-	buffer := &cert.ConfigPayload{}
-
-	err = ws.ReadJSON(buffer)
-
-	if err != nil {
-		logger.Error(err)
-		return
-	}
-
-	certModel, err := model.FirstOrCreateCert(c.Param("name"))
-
-	if err != nil {
-		logger.Error(err)
-		return
-	}
-
-	logChan := make(chan string, 1)
-	errChan := make(chan error, 1)
-
-	go cert.IssueCert(buffer, logChan, errChan)
-
-	go handleIssueCertLogChan(ws, logChan)
-
-	// block, until errChan closes
-	for err = range errChan {
-		errLog := &cert.AutoCertErrorLog{}
-		errLog.SetCertModel(&certModel)
-		errLog.Exit("issue cert", err)
-
-		err = ws.WriteJSON(IssueCertResponse{
-			Status:  Error,
-			Message: err.Error(),
-		})
-
-		if err != nil {
-			logger.Error(err)
-			return
-		}
-
-		return
-	}
-
-	certDirName := strings.Join(buffer.ServerName, "_")
-	sslCertificatePath := nginx.GetConfPath("ssl", certDirName, "fullchain.cer")
-	sslCertificateKeyPath := nginx.GetConfPath("ssl", certDirName, "private.key")
-
-	err = certModel.Updates(&model.Cert{
-		Domains:               buffer.ServerName,
-		SSLCertificatePath:    sslCertificatePath,
-		SSLCertificateKeyPath: sslCertificateKeyPath,
-	})
-
-	if err != nil {
-		logger.Error(err)
-		err = ws.WriteJSON(IssueCertResponse{
-			Status:  Error,
-			Message: err.Error(),
-		})
-		return
-	}
-
-	certModel.ClearLog()
-
-	err = ws.WriteJSON(IssueCertResponse{
-		Status:            Success,
-		Message:           "Issued certificate successfully",
-		SSLCertificate:    sslCertificatePath,
-		SSLCertificateKey: sslCertificateKeyPath,
-	})
-
-	if err != nil {
-		logger.Error(err)
-		return
-	}
-
-}
-
 func GetCertList(c *gin.Context) {
-	certList := model.GetCertList(c.Query("name"), c.Query("domain"))
-
-	c.JSON(http.StatusOK, gin.H{
-		"data": certList,
-	})
+	cosy.Core[model.Cert](c).SetFussy("name", "domain").PagingList()
 }
 
 func getCert(c *gin.Context, certModel *model.Cert) {
 	type resp struct {
 		*model.Cert
-		SSLCertification    string                 `json:"ssl_certification"`
-		SSLCertificationKey string                 `json:"ssl_certification_key"`
-		CertificateInfo     *sites.CertificateInfo `json:"certificate_info,omitempty"`
+		SSLCertificate    string                 `json:"ssl_certificate"`
+		SSLCertificateKey string                 `json:"ssl_certificate_key"`
+		CertificateInfo   *sites.CertificateInfo `json:"certificate_info,omitempty"`
 	}
 
 	var sslCertificationBytes, sslCertificationKeyBytes []byte
@@ -273,8 +134,8 @@ func ModifyCert(c *gin.Context) {
 		Name                  string `json:"name"`
 		SSLCertificatePath    string `json:"ssl_certificate_path" binding:"required"`
 		SSLCertificateKeyPath string `json:"ssl_certificate_key_path" binding:"required"`
-		SSLCertification      string `json:"ssl_certification"`
-		SSLCertificationKey   string `json:"ssl_certification_key"`
+		SSLCertificate        string `json:"ssl_certificate"`
+		SSLCertificateKey     string `json:"ssl_certificate_key"`
 	}
 
 	if !api.BindAndValid(c, &json) {
@@ -310,16 +171,16 @@ func ModifyCert(c *gin.Context) {
 		return
 	}
 
-	if json.SSLCertification != "" {
-		err = os.WriteFile(json.SSLCertificatePath, []byte(json.SSLCertification), 0644)
+	if json.SSLCertificate != "" {
+		err = os.WriteFile(json.SSLCertificatePath, []byte(json.SSLCertificate), 0644)
 		if err != nil {
 			api.ErrHandler(c, err)
 			return
 		}
 	}
 
-	if json.SSLCertificationKey != "" {
-		err = os.WriteFile(json.SSLCertificateKeyPath, []byte(json.SSLCertificationKey), 0644)
+	if json.SSLCertificateKeyPath != "" {
+		err = os.WriteFile(json.SSLCertificateKeyPath, []byte(json.SSLCertificateKey), 0644)
 		if err != nil {
 			api.ErrHandler(c, err)
 			return
@@ -330,39 +191,5 @@ func ModifyCert(c *gin.Context) {
 }
 
 func RemoveCert(c *gin.Context) {
-	id := cast.ToInt(c.Param("id"))
-	certModel, err := model.FirstCertByID(id)
-
-	if err != nil {
-		api.ErrHandler(c, err)
-		return
-	}
-
-	err = certModel.Remove()
-
-	if err != nil {
-		api.ErrHandler(c, err)
-		return
-	}
-
-	c.JSON(http.StatusNoContent, nil)
-}
-
-func GetDNSProvidersList(c *gin.Context) {
-	c.JSON(http.StatusOK, dns.GetProvidersList())
-}
-
-func GetDNSProvider(c *gin.Context) {
-	code := c.Param("code")
-
-	provider, ok := dns.GetProvider(code)
-
-	if !ok {
-		c.JSON(http.StatusNotFound, gin.H{
-			"message": "provider not found",
-		})
-		return
-	}
-
-	c.JSON(http.StatusOK, provider)
+	cosy.Core[model.Cert](c).Destroy()
 }

+ 3 - 31
api/certificate/dns_credential.go

@@ -2,6 +2,7 @@ package certificate
 
 import (
 	"github.com/0xJacky/Nginx-UI/api"
+	"github.com/0xJacky/Nginx-UI/api/cosy"
 	"github.com/0xJacky/Nginx-UI/internal/cert/dns"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/query"
@@ -33,23 +34,7 @@ func GetDnsCredential(c *gin.Context) {
 }
 
 func GetDnsCredentialList(c *gin.Context) {
-	d := query.DnsCredential
-	provider := c.Query("provider")
-	var data []*model.DnsCredential
-	var err error
-	if provider != "" {
-		data, err = d.Where(d.Provider.Eq(provider)).Find()
-	} else {
-		data, err = d.Find()
-	}
-
-	if err != nil {
-		api.ErrHandler(c, err)
-		return
-	}
-	c.JSON(http.StatusOK, gin.H{
-		"data": data,
-	})
+	cosy.Core[model.DnsCredential](c).SetFussy("provider").PagingList()
 }
 
 type DnsCredentialManageJson struct {
@@ -114,18 +99,5 @@ func EditDnsCredential(c *gin.Context) {
 }
 
 func DeleteDnsCredential(c *gin.Context) {
-	id := cast.ToInt(c.Param("id"))
-	d := query.DnsCredential
-
-	dnsCredential, err := d.FirstByID(id)
-	if err != nil {
-		api.ErrHandler(c, err)
-		return
-	}
-	err = d.DeleteByID(dnsCredential.ID)
-	if err != nil {
-		api.ErrHandler(c, err)
-		return
-	}
-	c.JSON(http.StatusNoContent, nil)
+	cosy.Core[model.DnsCredential](c).Destroy()
 }

+ 27 - 0
api/certificate/dns_provider.go

@@ -0,0 +1,27 @@
+package certificate
+
+import (
+    "github.com/0xJacky/Nginx-UI/internal/cert/dns"
+    "github.com/gin-gonic/gin"
+    "net/http"
+)
+
+func GetDNSProvidersList(c *gin.Context) {
+    c.JSON(http.StatusOK, dns.GetProvidersList())
+}
+
+func GetDNSProvider(c *gin.Context) {
+    code := c.Param("code")
+
+    provider, ok := dns.GetProvider(code)
+
+    if !ok {
+        c.JSON(http.StatusNotFound, gin.H{
+            "message": "provider not found",
+        })
+        return
+    }
+
+    c.JSON(http.StatusOK, provider)
+}
+

+ 142 - 0
api/certificate/issue.go

@@ -0,0 +1,142 @@
+package certificate
+
+import (
+	"github.com/0xJacky/Nginx-UI/internal/cert"
+	"github.com/0xJacky/Nginx-UI/internal/logger"
+	"github.com/0xJacky/Nginx-UI/internal/nginx"
+	"github.com/0xJacky/Nginx-UI/model"
+	"github.com/gin-gonic/gin"
+	"github.com/gorilla/websocket"
+	"net/http"
+	"strings"
+)
+
+const (
+	Success = "success"
+	Info    = "info"
+	Error   = "error"
+)
+
+type IssueCertResponse struct {
+	Status            string `json:"status"`
+	Message           string `json:"message"`
+	SSLCertificate    string `json:"ssl_certificate,omitempty"`
+	SSLCertificateKey string `json:"ssl_certificate_key,omitempty"`
+}
+
+func handleIssueCertLogChan(conn *websocket.Conn, logChan chan string) {
+	defer func() {
+		if err := recover(); err != nil {
+			logger.Error(err)
+		}
+	}()
+
+	for logString := range logChan {
+
+		err := conn.WriteJSON(IssueCertResponse{
+			Status:  Info,
+			Message: logString,
+		})
+
+		if err != nil {
+			logger.Error(err)
+			return
+		}
+
+	}
+}
+
+func IssueCert(c *gin.Context) {
+	var upGrader = websocket.Upgrader{
+		CheckOrigin: func(r *http.Request) bool {
+			return true
+		},
+	}
+
+	// upgrade http to websocket
+	ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)
+	if err != nil {
+		logger.Error(err)
+		return
+	}
+
+	defer func(ws *websocket.Conn) {
+		_ = ws.Close()
+	}(ws)
+
+	// read
+	buffer := &cert.ConfigPayload{}
+
+	err = ws.ReadJSON(buffer)
+
+	if err != nil {
+		logger.Error(err)
+		return
+	}
+
+	certModel, err := model.FirstOrCreateCert(c.Param("name"))
+
+	if err != nil {
+		logger.Error(err)
+		return
+	}
+
+	logChan := make(chan string, 1)
+	errChan := make(chan error, 1)
+
+	go cert.IssueCert(buffer, logChan, errChan)
+
+	go handleIssueCertLogChan(ws, logChan)
+
+	// block, until errChan closes
+	for err = range errChan {
+		errLog := &cert.AutoCertErrorLog{}
+		errLog.SetCertModel(&certModel)
+		errLog.Exit("issue cert", err)
+
+		err = ws.WriteJSON(IssueCertResponse{
+			Status:  Error,
+			Message: err.Error(),
+		})
+
+		if err != nil {
+			logger.Error(err)
+			return
+		}
+
+		return
+	}
+
+	certDirName := strings.Join(buffer.ServerName, "_")
+	sslCertificatePath := nginx.GetConfPath("ssl", certDirName, "fullchain.cer")
+	sslCertificateKeyPath := nginx.GetConfPath("ssl", certDirName, "private.key")
+
+	err = certModel.Updates(&model.Cert{
+		Domains:               buffer.ServerName,
+		SSLCertificatePath:    sslCertificatePath,
+		SSLCertificateKeyPath: sslCertificateKeyPath,
+	})
+
+	if err != nil {
+		logger.Error(err)
+		err = ws.WriteJSON(IssueCertResponse{
+			Status:  Error,
+			Message: err.Error(),
+		})
+		return
+	}
+
+	certModel.ClearLog()
+
+	err = ws.WriteJSON(IssueCertResponse{
+		Status:            Success,
+		Message:           "Issued certificate successfully",
+		SSLCertificate:    sslCertificatePath,
+		SSLCertificateKey: sslCertificateKeyPath,
+	})
+
+	if err != nil {
+		logger.Error(err)
+		return
+	}
+}

+ 1 - 1
api/cosy/list.go

@@ -133,7 +133,7 @@ func (c *Ctx[T]) PagingListData() (*model.DataList, bool) {
 		page = 1
 	}
 
-	pageSize := settings.AppSettings.PageSize
+	pageSize := settings.ServerSettings.PageSize
 	if reqPageSize := c.ctx.Query("page_size"); reqPageSize != "" {
 		pageSize = cast.ToInt(reqPageSize)
 	}

+ 4 - 5
api/user/user.go

@@ -2,6 +2,7 @@ package user
 
 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/0xJacky/Nginx-UI/settings"
@@ -12,9 +13,7 @@ import (
 )
 
 func GetUsers(c *gin.Context) {
-	data := model.GetUserList(c, c.Query("name"))
-
-	c.JSON(http.StatusOK, data)
+	cosy.Core[model.Auth](c).SetFussy("name").PagingList()
 }
 
 func GetUser(c *gin.Context) {
@@ -74,7 +73,7 @@ func EditUser(c *gin.Context) {
 
 	if settings.ServerSettings.Demo && userId == 1 {
 		c.JSON(http.StatusNotAcceptable, gin.H{
-			"message": "Prohibit changing root password in demo",
+			"message": "Changing user password is forbidden in demo mode",
 		})
 		return
 	}
@@ -133,5 +132,5 @@ func DeleteUser(c *gin.Context) {
 		api.ErrHandler(c, err)
 		return
 	}
-	c.JSON(http.StatusNoContent, gin.H{})
+	c.JSON(http.StatusNoContent, nil)
 }

+ 0 - 0
app/gettext.config.js → app/gettext.config.cjs


+ 1 - 2
app/package.json

@@ -8,8 +8,7 @@
     "lint": "eslint . -c .eslintrc.cjs --fix --ext .ts,.vue,.tsx,.d.ts",
     "build": "vite build",
     "preview": "vite preview",
-    "gettext:extract": "vue-gettext-extract",
-    "gettext:compile": "vue-gettext-compile"
+    "gettext:extract": "vue-gettext-extract"
   },
   "dependencies": {
     "@ant-design/icons-vue": "^7.0.1",

+ 1 - 1
app/src/api/auto_cert.ts

@@ -2,7 +2,7 @@ import http from '@/lib/http'
 
 export interface DNSProvider {
   name?: string
-  code: string
+  code?: string
   provider?: string
   configuration: {
     credentials: {

+ 3 - 0
app/src/api/cert.ts

@@ -7,12 +7,15 @@ export interface Cert extends ModelBase {
   domains: string[]
   filename: string
   ssl_certificate_path: string
+  ssl_certificate: string
   ssl_certificate_key_path: string
+  ssl_certificate_key: string
   auto_cert: number
   challenge_method: string
   dns_credential_id: number
   dns_credential?: DnsCredential
   log: string
+  certificate_info: CertificateInfo
 }
 
 export interface CertificateInfo {

+ 9 - 0
app/src/api/dns_credential.ts

@@ -6,6 +6,15 @@ export interface DnsCredential extends ModelBase {
   name: string
   config?: DNSProvider
   provider: string
+  code: string
+  configuration: {
+    credentials: {
+      [key: string]: string
+    }
+    additional: {
+      [key: string]: string
+    }
+  }
 }
 
 const dns_credential: Curd<DnsCredential> = new Curd('/dns_credential')

+ 1 - 1
app/src/api/openai.ts

@@ -7,7 +7,7 @@ export interface ChatComplicationMessage {
 }
 
 const openai = {
-  store_record(data: { file_name?: string; messages: ChatComplicationMessage[] }) {
+  store_record(data: { file_name?: string; messages?: ChatComplicationMessage[] }) {
     return http.post('/chat_gpt_record', data)
   },
 }

+ 6 - 6
app/src/components/ChatGPT/ChatGPT.vue

@@ -16,7 +16,7 @@ import ChatGPT_logo from '@/assets/svg/ChatGPT_logo.svg'
 const props = defineProps<{
   content: string
   path?: string
-  historyMessages: ChatComplicationMessage[]
+  historyMessages?: ChatComplicationMessage[]
 }>()
 
 const emit = defineEmits(['update:history_messages'])
@@ -26,7 +26,7 @@ const { $gettext } = useGettext()
 const { language: current } = storeToRefs(useSettingsStore())
 
 const history_messages = computed(() => props.historyMessages)
-const messages = ref([]) as Ref<ChatComplicationMessage[]>
+const messages = ref([]) as Ref<ChatComplicationMessage[] | undefined >
 
 onMounted(() => {
   messages.value = props.historyMessages
@@ -54,14 +54,14 @@ async function request() {
 
   console.log('fetching...')
 
-  messages.value.push(t.value)
+  messages.value?.push(t.value)
 
   emit('update:history_messages', messages.value)
 
   const res = await fetch(urlJoin(window.location.pathname, '/api/chat_gpt'), {
     method: 'POST',
     headers: { Accept: 'text/event-stream', Authorization: token.value },
-    body: JSON.stringify({ messages: messages.value.slice(0, messages.value?.length - 1) }),
+    body: JSON.stringify({ messages: messages.value?.slice(0, messages.value?.length - 1) }),
   })
 
   // read body as stream
@@ -200,7 +200,7 @@ function clear_record() {
 const editing_idx = ref(-1)
 async function regenerate(index: number) {
   editing_idx.value = -1
-  messages.value = messages.value.slice(0, index)
+  messages.value = messages.value?.slice(0, index)
   await request()
 }
 
@@ -285,7 +285,7 @@ const show = computed(() => !messages.value || messages.value?.length === 0)
           </APopconfirm>
           <AButton
             type="text"
-            @click="regenerate(messages?.length - 1)"
+            @click="regenerate((messages?.length ?? 1) - 1)"
           >
             {{ $gettext('Regenerate response') }}
           </AButton>

+ 1 - 1
app/src/components/StdDesign/types.d.ts

@@ -4,7 +4,7 @@ import { Ref } from 'vue'
 export interface StdDesignEdit {
   type?: function // component type
 
-  show?: function // show component
+  show?: (dataSource: any) => boolean // show component or not
 
   batch?: boolean // batch edit
 

+ 4 - 0
app/src/constants/index.ts

@@ -0,0 +1,4 @@
+export enum AutoCertState {
+  Disable = 0,
+  Enable = 1,
+}

+ 179 - 156
app/src/language/en/app.po

@@ -9,29 +9,25 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/views/domain/cert/CertInfo.vue:28
-#, fuzzy
-msgid " Expiration Date: %{date}"
-msgstr "Expiration Date: %{date}"
-
-#: src/routes/index.ts:183
+#: src/routes/index.ts:182
 msgid "About"
 msgstr "About"
 
-#: src/routes/index.ts:135 src/views/domain/ngx_conf/LogEntry.vue:78
+#: src/routes/index.ts:134 src/views/domain/ngx_conf/LogEntry.vue:78
 msgid "Access Logs"
 msgstr ""
 
-#: src/views/cert/Cert.vue:77 src/views/cert/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/certificate/Certificate.vue:87
+#: 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
 msgid "Action"
 msgstr "Action"
 
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:114
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:115
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:307
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:308
 msgid "Add"
 msgstr ""
 
@@ -44,16 +40,16 @@ msgstr "Add Directive Below"
 msgid "Add Location"
 msgstr "Add Location"
 
-#: src/routes/index.ts:71 src/views/domain/DomainAdd.vue:91
+#: src/routes/index.ts:70 src/views/domain/DomainAdd.vue:91
 msgid "Add Site"
 msgstr "Add Site"
 
-#: src/views/cert/DNSChallenge.vue:95
+#: src/views/certificate/DNSChallenge.vue:95
 #, fuzzy
 msgid "Additional"
 msgstr "Add Location"
 
-#: src/views/domain/DomainEdit.vue:205
+#: src/views/domain/DomainEdit.vue:204
 msgid "Advance Mode"
 msgstr "Advance Mode"
 
@@ -106,32 +102,33 @@ msgstr ""
 msgid "Author"
 msgstr ""
 
-#: src/views/cert/Cert.vue:38 src/views/domain/cert/ChangeCert.vue:37
+#: src/views/certificate/Certificate.vue:46
+#: src/views/domain/cert/ChangeCert.vue:37
 msgid "Auto Cert"
 msgstr ""
 
-#: src/views/cert/Cert.vue:92
-msgid "Auto cert is enabled, please do not modify this certification."
+#: src/views/certificate/Certificate.vue:105
+msgid "Auto Cert is enabled"
 msgstr ""
 
-#: src/views/nginx_log/NginxLog.vue:150
-msgid "Auto Refresh"
+#: src/views/certificate/Certificate.vue:135
+msgid "Auto Cert Log"
 msgstr ""
 
-#: src/views/cert/Cert.vue:122
-msgid "Auto-Cert Log"
+#: src/views/nginx_log/NginxLog.vue:149
+msgid "Auto Refresh"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:125
+#: src/views/domain/cert/components/ObtainCert.vue:126
 msgid "Auto-renewal disabled for %{name}"
 msgstr "Auto-renewal disabled for %{name}"
 
-#: src/views/domain/cert/components/ObtainCert.vue:118
+#: src/views/domain/cert/components/ObtainCert.vue:119
 msgid "Auto-renewal enabled for %{name}"
 msgstr "Auto-renewal enabled for %{name}"
 
 #: src/views/config/Config.vue:75 src/views/config/ConfigEdit.vue:89
-#: src/views/domain/DomainEdit.vue:262 src/views/nginx_log/NginxLog.vue:171
+#: src/views/domain/DomainEdit.vue:261 src/views/nginx_log/NginxLog.vue:170
 msgid "Back"
 msgstr "Back"
 
@@ -145,13 +142,13 @@ msgid "Base information"
 msgstr "Base information"
 
 #: src/views/config/ConfigEdit.vue:117
-#: src/views/domain/components/RightSettings.vue:71
-#: src/views/preference/Preference.vue:92
+#: src/views/domain/components/RightSettings.vue:73
+#: src/views/preference/Preference.vue:90
 #, fuzzy
 msgid "Basic"
 msgstr "Basic Mode"
 
-#: src/views/domain/DomainEdit.vue:208
+#: src/views/domain/DomainEdit.vue:207
 msgid "Basic Mode"
 msgstr "Basic Mode"
 
@@ -173,37 +170,38 @@ msgstr ""
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:58
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:139
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
-#: src/views/domain/cert/components/ObtainCert.vue:210
-#: src/views/domain/components/Deploy.vue:25
-#: src/views/domain/components/RightSettings.vue:51
+#: src/views/domain/cert/components/ObtainCert.vue:211
+#: src/views/domain/components/Deploy.vue:24
+#: src/views/domain/components/RightSettings.vue:52
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:216
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:48
 msgid "Cancel"
 msgstr "Cancel"
 
-#: src/views/domain/cert/CertInfo.vue:36
+#: src/views/domain/cert/CertInfo.vue:35
 msgid "Certificate has expired"
 msgstr "Certificate has expired"
 
-#: src/views/domain/cert/CertInfo.vue:40
+#: src/views/domain/cert/CertInfo.vue:39
 msgid "Certificate is valid"
 msgstr "Certificate is valid"
 
-#: src/views/cert/Cert.vue:132 src/views/domain/cert/Cert.vue:35
+#: src/views/certificate/Certificate.vue:145 src/views/domain/cert/Cert.vue:35
 msgid "Certificate Status"
 msgstr "Certificate Status"
 
-#: src/routes/index.ts:101 src/views/cert/Cert.vue:84
+#: src/routes/index.ts:100 src/views/certificate/Certificate.vue:96
 #, fuzzy
-msgid "Certification"
-msgstr "Certificate is valid"
+msgid "Certificates"
+msgstr "Certificate Status"
 
-#: src/routes/index.ts:109
+#: src/routes/index.ts:108
 #, fuzzy
-msgid "Certification List"
+msgid "Certificates List"
 msgstr "Certificate is valid"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:57
+#: src/views/certificate/Certificate.vue:150
+#: src/views/domain/cert/components/AutoCertStepOne.vue:63
 msgid "Challenge Method"
 msgstr ""
 
@@ -240,11 +238,11 @@ 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
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:283
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:284
 msgid "Comments"
 msgstr "Comments"
 
-#: src/views/cert/Cert.vue:33
+#: src/views/certificate/Certificate.vue:41
 #, fuzzy
 msgid "Config Name"
 msgstr "Configuration Name"
@@ -254,7 +252,7 @@ msgstr "Configuration Name"
 msgid "Config Templates"
 msgstr "Configurations"
 
-#: src/views/config/InspectConfig.vue:31
+#: src/views/config/InspectConfig.vue:30
 msgid "Configuration file is test successful"
 msgstr ""
 
@@ -308,7 +306,7 @@ msgstr ""
 msgid "Credential"
 msgstr ""
 
-#: src/views/cert/DNSChallenge.vue:83
+#: src/views/certificate/DNSChallenge.vue:83
 msgid "Credentials"
 msgstr ""
 
@@ -317,7 +315,7 @@ msgid "Current Version"
 msgstr ""
 
 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:122
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:240
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:241
 msgid "Custom"
 msgstr ""
 
@@ -325,13 +323,13 @@ msgstr ""
 msgid "Dashboard"
 msgstr "Dashboard"
 
-#: src/views/other/Install.vue:122
+#: src/views/other/Install.vue:124
 msgid "Database (Optional, default: database)"
 msgstr "Database (Optional, default: database)"
 
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:354
 #: src/views/domain/DomainList.vue:153
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:258
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:259
 msgid "Delete"
 msgstr ""
 
@@ -345,19 +343,19 @@ msgid "Deleted successfully"
 msgstr "Disabled successfully"
 
 #: src/views/domain/components/Deploy.vue:109
-#: src/views/domain/components/RightSettings.vue:89
+#: src/views/domain/components/RightSettings.vue:91
 msgid "Deploy"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:67
+#: src/views/domain/components/Deploy.vue:66
 msgid "Deploy %{conf_name} to %{node_name} failed"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:41
+#: src/views/domain/components/Deploy.vue:40
 msgid "Deploy %{conf_name} to %{node_name} successfully"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:39
+#: src/views/domain/components/Deploy.vue:38
 #, fuzzy
 msgid "Deploy successfully"
 msgstr "Saved successfully"
@@ -389,16 +387,17 @@ msgstr "Directive"
 msgid "Disable"
 msgstr "Disabled"
 
-#: src/views/domain/cert/components/ObtainCert.vue:127
+#: src/views/domain/cert/components/ObtainCert.vue:128
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "Disable auto-renewal failed for %{name}"
 
-#: src/views/cert/Cert.vue:49 src/views/domain/cert/ChangeCert.vue:48
-#: src/views/domain/DomainEdit.vue:191 src/views/domain/DomainList.vue:123
+#: src/views/certificate/Certificate.vue:57
+#: src/views/domain/cert/ChangeCert.vue:48 src/views/domain/DomainEdit.vue:190
+#: src/views/domain/DomainList.vue:123
 msgid "Disabled"
 msgstr "Disabled"
 
-#: src/views/domain/components/RightSettings.vue:38
+#: src/views/domain/components/RightSettings.vue:39
 #: src/views/domain/DomainList.vue:67
 msgid "Disabled successfully"
 msgstr "Disabled successfully"
@@ -407,36 +406,36 @@ msgstr "Disabled successfully"
 msgid "Disk IO"
 msgstr "Disk IO"
 
-#: src/routes/index.ts:114 src/views/cert/DNSCredential.vue:39
+#: src/routes/index.ts:113 src/views/certificate/DNSCredential.vue:39
 msgid "DNS Credentials"
 msgstr ""
 
-#: src/views/cert/DNSChallenge.vue:74
+#: src/views/certificate/DNSChallenge.vue:74
 #: src/views/domain/cert/components/DNSChallenge.vue:79
 msgid "DNS Provider"
 msgstr ""
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:63
+#: src/views/domain/cert/components/AutoCertStepOne.vue:69
 msgid "DNS01"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:20
+#: src/views/domain/components/Deploy.vue:19
 #, fuzzy
 msgid "Do you want to deploy this file to remote server?"
 msgid_plural "Do you want to deploy this file to remote servers?"
 msgstr[0] "Are you sure you want to remove this directive?"
 msgstr[1] "Are you sure you want to remove this directive?"
 
-#: src/views/domain/cert/components/ObtainCert.vue:206
+#: src/views/domain/cert/components/ObtainCert.vue:207
 msgid "Do you want to disable auto-cert renewal?"
 msgstr ""
 
-#: src/views/domain/components/RightSettings.vue:47
+#: src/views/domain/components/RightSettings.vue:48
 #, fuzzy
 msgid "Do you want to disable this site?"
 msgstr "Are you sure you want to remove this directive?"
 
-#: src/views/domain/components/RightSettings.vue:47
+#: src/views/domain/components/RightSettings.vue:48
 #, fuzzy
 msgid "Do you want to enable this site?"
 msgstr "Are you sure you want to remove this directive?"
@@ -455,8 +454,8 @@ msgstr "Are you sure you want to remove this directive?"
 msgid "Domain Config Created Successfully"
 msgstr "Domain Config Created Successfully"
 
-#: src/views/cert/Cert.vue:112
-msgid "Domains list is empty, try to reopen auto-cert for %{config}"
+#: src/views/certificate/Certificate.vue:125
+msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr ""
 
 #: src/language/constants.ts:29
@@ -496,19 +495,19 @@ msgstr "Saved successfully"
 msgid "Duplicate to local successfully"
 msgstr "Saved successfully"
 
-#: src/views/domain/DomainEdit.vue:180
+#: src/views/domain/DomainEdit.vue:179
 msgid "Edit %{n}"
 msgstr "Edit %{n}"
 
-#: src/routes/index.ts:93 src/views/config/ConfigEdit.vue:83
+#: src/routes/index.ts:92 src/views/config/ConfigEdit.vue:83
 msgid "Edit Configuration"
 msgstr "Edit Configuration"
 
-#: src/routes/index.ts:75
+#: src/routes/index.ts:74
 msgid "Edit Site"
 msgstr "Edit Site"
 
-#: src/views/other/Install.vue:91
+#: src/views/other/Install.vue:93
 msgid "Email (*)"
 msgstr "Email (*)"
 
@@ -517,15 +516,15 @@ msgstr "Email (*)"
 msgid "Enable"
 msgstr "Enabled"
 
-#: src/views/domain/components/Deploy.vue:56
+#: src/views/domain/components/Deploy.vue:55
 msgid "Enable %{conf_name} in %{node_name} failed"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:50
+#: src/views/domain/components/Deploy.vue:49
 msgid "Enable %{conf_name} in %{node_name} successfully"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:120
+#: src/views/domain/cert/components/ObtainCert.vue:121
 msgid "Enable auto-renewal failed for %{name}"
 msgstr "Enable auto-renewal failed for %{name}"
 
@@ -533,23 +532,24 @@ msgstr "Enable auto-renewal failed for %{name}"
 msgid "Enable failed"
 msgstr "Enable failed"
 
-#: src/views/domain/components/Deploy.vue:48
+#: src/views/domain/components/Deploy.vue:47
 #, fuzzy
 msgid "Enable successfully"
 msgstr "Enabled successfully"
 
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:235
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:236
 msgid "Enable TLS"
 msgstr "Enable TLS"
 
-#: src/views/cert/Cert.vue:45 src/views/domain/cert/ChangeCert.vue:44
+#: src/views/certificate/Certificate.vue:53
+#: src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/components/Deploy.vue:89
-#: src/views/domain/components/RightSettings.vue:73
-#: src/views/domain/DomainEdit.vue:185 src/views/domain/DomainList.vue:131
+#: src/views/domain/components/RightSettings.vue:75
+#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:131
 msgid "Enabled"
 msgstr "Enabled"
 
-#: src/views/domain/components/RightSettings.vue:29
+#: src/views/domain/components/RightSettings.vue:30
 #: src/views/domain/components/SiteDuplicate.vue:100
 #: src/views/domain/DomainAdd.vue:45 src/views/domain/DomainList.vue:58
 msgid "Enabled successfully"
@@ -559,7 +559,7 @@ msgstr "Enabled successfully"
 msgid "Encrypt website with Let's Encrypt"
 msgstr "Encrypt website with Let's Encrypt"
 
-#: src/routes/index.ts:152 src/views/environment/Environment.vue:113
+#: src/routes/index.ts:151 src/views/environment/Environment.vue:113
 msgid "Environment"
 msgstr ""
 
@@ -568,11 +568,11 @@ msgstr ""
 msgid "Environments"
 msgstr "Comments"
 
-#: src/views/config/InspectConfig.vue:48
+#: src/views/config/InspectConfig.vue:47
 msgid "Error"
 msgstr ""
 
-#: src/routes/index.ts:139 src/views/domain/ngx_conf/LogEntry.vue:86
+#: src/routes/index.ts:138 src/views/domain/ngx_conf/LogEntry.vue:86
 msgid "Error Logs"
 msgstr ""
 
@@ -580,17 +580,22 @@ msgstr ""
 msgid "Executable Path"
 msgstr ""
 
+#: src/views/domain/cert/CertInfo.vue:27
+#, fuzzy
+msgid "Expired At: %{date}"
+msgstr "Expiration Date: %{date}"
+
 #: src/components/StdDesign/StdDataDisplay/methods/exportCsv.ts:68
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:296
 msgid "Export"
 msgstr ""
 
-#: src/views/domain/components/RightSettings.vue:41
+#: src/views/domain/components/RightSettings.vue:42
 #: src/views/domain/DomainList.vue:70
 msgid "Failed to disable %{msg}"
 msgstr "Failed to disable %{msg}"
 
-#: src/views/domain/components/RightSettings.vue:32
+#: src/views/domain/components/RightSettings.vue:33
 #: src/views/domain/DomainList.vue:61
 msgid "Failed to enable %{msg}"
 msgstr "Failed to enable %{msg}"
@@ -599,7 +604,7 @@ msgstr "Failed to enable %{msg}"
 msgid "Failed to get certificate information"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:139
+#: src/views/domain/DomainEdit.vue:138
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr ""
 
@@ -615,7 +620,7 @@ msgstr ""
 msgid "File Not Found"
 msgstr "File Not Found"
 
-#: src/views/nginx_log/NginxLog.vue:153
+#: src/views/nginx_log/NginxLog.vue:152
 msgid "Filter"
 msgstr ""
 
@@ -650,7 +655,7 @@ msgstr ""
 msgid "Get release information error"
 msgstr "Base information"
 
-#: src/views/domain/cert/components/ObtainCert.vue:63
+#: src/views/domain/cert/components/ObtainCert.vue:64
 msgid "Getting the certificate, please wait..."
 msgstr "Getting the certificate, please wait..."
 
@@ -690,7 +695,7 @@ msgstr ""
 msgid "HTTP Port"
 msgstr ""
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:60
+#: src/views/domain/cert/components/AutoCertStepOne.vue:66
 msgid "HTTP01"
 msgstr ""
 
@@ -702,16 +707,16 @@ msgstr ""
 msgid "Initialing core upgrader"
 msgstr ""
 
-#: src/routes/index.ts:195 src/views/other/Install.vue:137
+#: src/routes/index.ts:194 src/views/other/Install.vue:139
 msgid "Install"
 msgstr "Install"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:68
 #, fuzzy
 msgid "Install successfully"
 msgstr "Enabled successfully"
 
-#: src/views/domain/cert/CertInfo.vue:22
+#: src/views/domain/cert/CertInfo.vue:21
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "Intermediate Certification Authorities: %{issuer}"
 
@@ -764,11 +769,11 @@ msgstr "Location"
 msgid "Locations"
 msgstr "Locations"
 
-#: src/routes/index.ts:201 src/views/other/Login.vue:147
+#: src/routes/index.ts:200 src/views/other/Login.vue:147
 msgid "Login"
 msgstr "Login"
 
-#: src/views/other/Login.vue:53 src/views/other/Login.vue:99
+#: src/views/other/Login.vue:51 src/views/other/Login.vue:97
 msgid "Login successful"
 msgstr "Login successful"
 
@@ -776,7 +781,7 @@ msgstr "Login successful"
 msgid "Logout successful"
 msgstr "Logout successful"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:45
+#: src/views/domain/cert/components/AutoCertStepOne.vue:51
 #, fuzzy
 msgid ""
 "Make sure you have configured a reverse proxy for .well-known directory to "
@@ -785,15 +790,15 @@ 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:84
+#: src/routes/index.ts:83
 msgid "Manage Configs"
 msgstr "Manage Configs"
 
-#: src/routes/index.ts:59 src/views/domain/DomainList.vue:102
+#: src/routes/index.ts:58 src/views/domain/DomainList.vue:102
 msgid "Manage Sites"
 msgstr "Manage Sites"
 
-#: src/routes/index.ts:160 src/views/user/User.vue:53
+#: src/routes/index.ts:159 src/views/user/User.vue:53
 msgid "Manage Users"
 msgstr "Manage Users"
 
@@ -808,6 +813,7 @@ msgstr "Memory and Storage"
 #: src/components/ChatGPT/ChatGPT.vue:256
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
+#: src/views/certificate/Certificate.vue:156
 #, fuzzy
 msgid "Modify"
 msgstr "Modify Config"
@@ -821,9 +827,10 @@ msgstr "Modify Config"
 msgid "Multi-line Directive"
 msgstr "Single Directive"
 
-#: src/views/cert/Cert.vue:17 src/views/cert/DNSCredential.vue:13
-#: src/views/config/config.ts:9 src/views/domain/cert/ChangeCert.vue:21
-#: src/views/domain/components/RightSettings.vue:79
+#: src/views/certificate/Certificate.vue:24
+#: 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
 #: src/views/domain/components/SiteDuplicate.vue:135
 #: src/views/domain/DomainList.vue:16 src/views/environment/Environment.vue:15
 msgid "Name"
@@ -849,12 +856,12 @@ msgstr "Network Total Send"
 msgid "New version released"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:278
+#: src/views/domain/cert/components/ObtainCert.vue:281
 #: src/views/domain/DomainAdd.vue:140
 msgid "Next"
 msgstr "Next"
 
-#: src/views/preference/Preference.vue:98
+#: src/views/preference/Preference.vue:96
 msgid "Nginx"
 msgstr ""
 
@@ -862,7 +869,7 @@ msgstr ""
 msgid "Nginx Access Log Path"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:223
+#: src/views/domain/DomainEdit.vue:222
 #, fuzzy
 msgid "Nginx Configuration Parse Error"
 msgstr "Configuration Name"
@@ -875,7 +882,7 @@ msgstr ""
 msgid "Nginx Error Log Path"
 msgstr ""
 
-#: src/routes/index.ts:129 src/views/nginx_log/NginxLog.vue:146
+#: src/routes/index.ts:128 src/views/nginx_log/NginxLog.vue:145
 msgid "Nginx Log"
 msgstr ""
 
@@ -901,20 +908,20 @@ msgstr "No"
 msgid "Node Secret"
 msgstr ""
 
-#: src/routes/index.ts:207 src/routes/index.ts:209
+#: src/routes/index.ts:206 src/routes/index.ts:208
 msgid "Not Found"
 msgstr "Not Found"
 
-#: src/views/domain/cert/CertInfo.vue:31
+#: src/views/domain/cert/CertInfo.vue:30
 msgid "Not Valid Before: %{date}"
 msgstr "Not Valid Before: %{date}"
 
-#: src/views/cert/DNSCredential.vue:48
-#: src/views/domain/cert/components/AutoCertStepOne.vue:32
+#: src/views/certificate/DNSCredential.vue:48
+#: src/views/domain/cert/components/AutoCertStepOne.vue:38
 msgid "Note"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:249
+#: src/views/domain/cert/components/ObtainCert.vue:252
 #, fuzzy
 msgid "Obtain certificate"
 msgstr "Certificate is valid"
@@ -934,15 +941,19 @@ msgstr ""
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:140
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:346
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:104
-#: src/views/domain/cert/components/ObtainCert.vue:209
-#: src/views/domain/components/Deploy.vue:24
-#: src/views/domain/components/RightSettings.vue:50
+#: src/views/domain/cert/components/ObtainCert.vue:210
+#: src/views/domain/components/Deploy.vue:23
+#: src/views/domain/components/RightSettings.vue:51
 #: src/views/domain/DomainList.vue:144
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:215
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:47
 msgid "OK"
 msgstr ""
 
+#: src/views/certificate/DNSCredential.vue:58
+msgid "Once the verification is complete, the records will be removed."
+msgstr ""
+
 #: src/components/NodeSelector/NodeSelector.vue:57
 #: src/components/NodeSelector/NodeSelector.vue:72
 #: src/views/dashboard/Environments.vue:100
@@ -950,7 +961,7 @@ msgstr ""
 msgid "Online"
 msgstr ""
 
-#: src/views/preference/Preference.vue:104
+#: src/views/preference/Preference.vue:102
 msgid "OpenAI"
 msgstr ""
 
@@ -979,7 +990,7 @@ msgstr "Params"
 msgid "Password"
 msgstr "Password"
 
-#: src/views/other/Install.vue:111
+#: src/views/other/Install.vue:113
 msgid "Password (*)"
 msgstr "Password (*)"
 
@@ -997,17 +1008,13 @@ msgstr ""
 msgid "Performing core upgrade"
 msgstr ""
 
-#: src/views/cert/DNSCredential.vue:52
+#: src/views/certificate/DNSCredential.vue:52
 msgid ""
 "Please fill in the API authentication credentials provided by your DNS "
-"provider.\n"
-"We will add one or more TXT records to the DNS records of your domain for "
-"ownership verification.\n"
-"Once the verification is complete, the records will be removed.\n"
-"Please note that the time configurations below are all in seconds."
+"provider."
 msgstr ""
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:49
+#: src/views/domain/cert/components/AutoCertStepOne.vue:55
 msgid ""
 "Please first add credentials in Certification > DNS Credentials, and then "
 "select one of the credentialsbelow to request the API of the DNS provider."
@@ -1019,18 +1026,23 @@ msgid ""
 "configuration!"
 msgstr ""
 
-#: src/views/other/Install.vue:34
+#: src/views/other/Install.vue:35
 msgid "Please input your E-mail!"
 msgstr "Please input your E-mail!"
 
-#: src/views/other/Install.vue:46 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:47 src/views/other/Login.vue:39
 msgid "Please input your password!"
 msgstr "Please input your password!"
 
-#: src/views/other/Install.vue:40 src/views/other/Login.vue:35
+#: src/views/other/Install.vue:41 src/views/other/Login.vue:33
 msgid "Please input your username!"
 msgstr "Please input your username!"
 
+#: src/views/certificate/DNSCredential.vue:61
+msgid ""
+"Please note that the unit of time configurations below are all in seconds."
+msgstr ""
+
 #: src/views/domain/components/SiteDuplicate.vue:47
 msgid "Please select at least one node!"
 msgstr ""
@@ -1039,7 +1051,7 @@ msgstr ""
 msgid "Pre-release"
 msgstr ""
 
-#: src/routes/index.ts:168 src/views/preference/Preference.vue:87
+#: src/routes/index.ts:167 src/views/preference/Preference.vue:85
 msgid "Preference"
 msgstr ""
 
@@ -1060,7 +1072,7 @@ msgstr ""
 msgid "Project Team"
 msgstr "Project Team"
 
-#: src/views/cert/DNSCredential.vue:21
+#: src/views/certificate/DNSCredential.vue:21
 msgid "Provider"
 msgstr ""
 
@@ -1130,9 +1142,9 @@ msgid "Running"
 msgstr ""
 
 #: src/components/ChatGPT/ChatGPT.vue:259 src/views/config/ConfigEdit.vue:98
-#: src/views/domain/DomainEdit.vue:269
+#: src/views/domain/DomainEdit.vue:268
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:111
-#: src/views/preference/Preference.vue:115
+#: src/views/preference/Preference.vue:113
 msgid "Save"
 msgstr "Save"
 
@@ -1146,7 +1158,7 @@ msgid "Save error %{msg}"
 msgstr "Save error %{msg}"
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
-#: src/views/preference/Preference.vue:60
+#: src/views/preference/Preference.vue:58
 #, fuzzy
 msgid "Save successfully"
 msgstr "Saved successfully"
@@ -1157,7 +1169,7 @@ msgid "Save Successfully"
 msgstr "Saved successfully"
 
 #: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:41
-#: src/views/domain/DomainEdit.vue:155
+#: src/views/domain/DomainEdit.vue:154
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
 msgid "Saved successfully"
 msgstr "Saved successfully"
@@ -1178,7 +1190,7 @@ msgstr "Send"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:45
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:157
 #: src/views/config/ConfigEdit.vue:42 src/views/domain/DomainList.vue:79
-#: src/views/other/Install.vue:71 src/views/preference/Preference.vue:62
+#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:60
 #: src/views/system/Upgrade.vue:45
 msgid "Server error"
 msgstr "Server error"
@@ -1187,11 +1199,11 @@ msgstr "Server error"
 msgid "Server Info"
 msgstr "Server Info"
 
-#: src/views/domain/cert/components/ObtainCert.vue:164
+#: src/views/domain/cert/components/ObtainCert.vue:165
 msgid "server_name not found in directives"
 msgstr "server_name not found in directives"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:22
+#: src/views/domain/cert/components/AutoCertStepOne.vue:27
 #: src/views/domain/DomainAdd.vue:119
 msgid "server_name parameter is required"
 msgstr "server_name parameter is required"
@@ -1204,33 +1216,33 @@ msgstr ""
 msgid "Single Directive"
 msgstr "Single Directive"
 
-#: src/routes/index.ts:143
+#: src/routes/index.ts:142
 #, fuzzy
 msgid "Site Logs"
 msgstr "Sites List"
 
-#: src/routes/index.ts:67
+#: src/routes/index.ts:66
 msgid "Sites List"
 msgstr "Sites List"
 
-#: src/views/cert/Cert.vue:64
+#: src/views/certificate/Certificate.vue:164
 #, fuzzy
-msgid "SSL Certificate Key Path"
+msgid "SSL Certificate Content"
 msgstr "Certificate Status"
 
-#: src/views/cert/Cert.vue:57
+#: src/views/certificate/Certificate.vue:171
 #, fuzzy
-msgid "SSL Certificate Path"
+msgid "SSL Certificate Key Content"
 msgstr "Certificate Status"
 
-#: src/views/cert/Cert.vue:139
+#: src/views/certificate/Certificate.vue:73
 #, fuzzy
-msgid "SSL Certification Content"
+msgid "SSL Certificate Key Path"
 msgstr "Certificate Status"
 
-#: src/views/cert/Cert.vue:145
+#: src/views/certificate/Certificate.vue:65
 #, fuzzy
-msgid "SSL Certification Key Content"
+msgid "SSL Certificate Path"
 msgstr "Certificate Status"
 
 #: src/views/other/Login.vue:158
@@ -1255,7 +1267,7 @@ msgstr ""
 msgid "Storage"
 msgstr "Storage"
 
-#: src/views/domain/cert/CertInfo.vue:25
+#: src/views/domain/cert/CertInfo.vue:24
 #, fuzzy
 msgid "Subject Name: %{subject}"
 msgstr "Subject Name: %{name}"
@@ -1272,7 +1284,7 @@ msgstr ""
 msgid "Switch to light theme"
 msgstr ""
 
-#: src/routes/index.ts:176
+#: src/routes/index.ts:175
 msgid "System"
 msgstr ""
 
@@ -1285,7 +1297,7 @@ msgstr "Enabled"
 msgid "Target"
 msgstr ""
 
-#: src/routes/index.ts:121 src/views/pty/Terminal.vue:95
+#: src/routes/index.ts:120 src/views/pty/Terminal.vue:95
 msgid "Terminal"
 msgstr "Terminal"
 
@@ -1293,7 +1305,7 @@ msgstr "Terminal"
 msgid "Terminal Start Command"
 msgstr ""
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:41
+#: src/views/domain/cert/components/AutoCertStepOne.vue:47
 #, fuzzy
 msgid ""
 "The certificate for the domain will be checked 5 minutes, and will be "
@@ -1302,11 +1314,11 @@ msgstr ""
 "The certificate for the domain will be checked every hour, and will be "
 "renewed if it has been more than 1 month since it was last issued."
 
-#: src/views/other/Install.vue:52
+#: src/views/other/Install.vue:53
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr "The filename cannot contain the following characters: %{c}"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:36
+#: src/views/domain/cert/components/AutoCertStepOne.vue:42
 #, fuzzy
 msgid ""
 "The server_name in the current configuration must be the domain name you "
@@ -1319,8 +1331,8 @@ msgstr ""
 msgid "The username or password is incorrect"
 msgstr ""
 
-#: src/views/cert/Cert.vue:102
-msgid "This auto-cert item is invalid, please remove it."
+#: src/views/certificate/Certificate.vue:115
+msgid "This Auto Cert item is invalid, please remove it."
 msgstr ""
 
 #: src/components/StdDesign/StdDataEntry/StdFormItem.vue:31
@@ -1339,9 +1351,10 @@ msgstr ""
 msgid "Type"
 msgstr ""
 
-#: src/views/cert/Cert.vue:71 src/views/cert/DNSCredential.vue:26
-#: src/views/config/config.ts:29 src/views/config/ConfigEdit.vue:123
-#: src/views/domain/components/RightSettings.vue:82
+#: src/views/certificate/Certificate.vue:81
+#: src/views/certificate/DNSCredential.vue:26 src/views/config/config.ts:29
+#: src/views/config/ConfigEdit.vue:123
+#: src/views/domain/components/RightSettings.vue:84
 #: src/views/domain/DomainList.vue:44 src/views/environment/Environment.vue:98
 #: src/views/user/User.vue:40
 msgid "Updated at"
@@ -1352,7 +1365,7 @@ msgstr "Updated at"
 msgid "Updated successfully"
 msgstr "Saved successfully"
 
-#: src/routes/index.ts:187 src/views/system/Upgrade.vue:143
+#: src/routes/index.ts:186 src/views/system/Upgrade.vue:143
 #: src/views/system/Upgrade.vue:235
 msgid "Upgrade"
 msgstr ""
@@ -1383,7 +1396,7 @@ msgstr "Username"
 msgid "Username"
 msgstr "Username"
 
-#: src/views/other/Install.vue:101
+#: src/views/other/Install.vue:103
 msgid "Username (*)"
 msgstr "Username (*)"
 
@@ -1399,13 +1412,19 @@ msgstr ""
 msgid "View"
 msgstr ""
 
-#: src/views/config/InspectConfig.vue:37
-#: src/views/domain/cert/components/AutoCertStepOne.vue:16
+#: src/views/config/InspectConfig.vue:36
+#: src/views/domain/cert/components/AutoCertStepOne.vue:21
 #: src/views/domain/DomainAdd.vue:114
 msgid "Warning"
 msgstr "Warning"
 
-#: src/views/domain/cert/components/ObtainCert.vue:207
+#: src/views/certificate/DNSCredential.vue:55
+msgid ""
+"We will add one or more TXT records to the DNS records of your domain for "
+"ownership verification."
+msgstr ""
+
+#: src/views/domain/cert/components/ObtainCert.vue:208
 msgid ""
 "We will remove the HTTPChallenge configuration from this file and reload the "
 "Nginx. Are you sure you want to continue?"
@@ -1437,6 +1456,10 @@ msgstr ""
 msgid "You can check Nginx UI upgrade at this page."
 msgstr ""
 
+#, fuzzy
+#~ msgid "Certification"
+#~ msgstr "Certificate is valid"
+
 #, fuzzy
 #~ msgid "Inspect Configurations"
 #~ msgstr "Edit Configuration"

+ 210 - 168
app/src/language/es/app.po

@@ -14,29 +14,25 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 5.0\n"
 
-#: src/views/domain/cert/CertInfo.vue:28
-#, fuzzy
-msgid " Expiration Date: %{date}"
-msgstr "Fecha de vencimiento: %{date}"
-
-#: src/routes/index.ts:183
+#: src/routes/index.ts:182
 msgid "About"
 msgstr "Acerca de"
 
-#: src/routes/index.ts:135 src/views/domain/ngx_conf/LogEntry.vue:78
+#: src/routes/index.ts:134 src/views/domain/ngx_conf/LogEntry.vue:78
 msgid "Access Logs"
 msgstr "Registros de acceso"
 
-#: src/views/cert/Cert.vue:77 src/views/cert/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/certificate/Certificate.vue:87
+#: 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
 msgid "Action"
 msgstr "Acción"
 
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:114
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:115
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:307
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:308
 msgid "Add"
 msgstr "Agregar"
 
@@ -49,15 +45,15 @@ msgstr "Añadir directiva a continuación"
 msgid "Add Location"
 msgstr "Agregar Ubicación"
 
-#: src/routes/index.ts:71 src/views/domain/DomainAdd.vue:91
+#: src/routes/index.ts:70 src/views/domain/DomainAdd.vue:91
 msgid "Add Site"
 msgstr "Agregar Sitio"
 
-#: src/views/cert/DNSChallenge.vue:95
+#: src/views/certificate/DNSChallenge.vue:95
 msgid "Additional"
 msgstr "Adicional"
 
-#: src/views/domain/DomainEdit.vue:205
+#: src/views/domain/DomainEdit.vue:204
 msgid "Advance Mode"
 msgstr "Modo avanzado"
 
@@ -107,34 +103,35 @@ msgstr "Asistente"
 msgid "Author"
 msgstr "Autor"
 
-#: src/views/cert/Cert.vue:38 src/views/domain/cert/ChangeCert.vue:37
+#: src/views/certificate/Certificate.vue:46
+#: src/views/domain/cert/ChangeCert.vue:37
 msgid "Auto Cert"
 msgstr "Certificado automático"
 
-#: src/views/cert/Cert.vue:92
-msgid "Auto cert is enabled, please do not modify this certification."
-msgstr ""
-"Está habilitado el Certificado automático, por favor no modifique esta "
-"certificación."
+#: src/views/certificate/Certificate.vue:105
+#, fuzzy
+msgid "Auto Cert is enabled"
+msgstr "Certificado automático"
 
-#: src/views/nginx_log/NginxLog.vue:150
+#: src/views/certificate/Certificate.vue:135
+#, fuzzy
+msgid "Auto Cert Log"
+msgstr "Registro del Certificado automático"
+
+#: src/views/nginx_log/NginxLog.vue:149
 msgid "Auto Refresh"
 msgstr "Actualización automática"
 
-#: src/views/cert/Cert.vue:122
-msgid "Auto-Cert Log"
-msgstr "Registro del Certificado automático"
-
-#: src/views/domain/cert/components/ObtainCert.vue:125
+#: src/views/domain/cert/components/ObtainCert.vue:126
 msgid "Auto-renewal disabled for %{name}"
 msgstr "Renovación automática deshabilitada por %{name}"
 
-#: src/views/domain/cert/components/ObtainCert.vue:118
+#: src/views/domain/cert/components/ObtainCert.vue:119
 msgid "Auto-renewal enabled for %{name}"
 msgstr "Renovación automática habilitada por %{name}"
 
 #: src/views/config/Config.vue:75 src/views/config/ConfigEdit.vue:89
-#: src/views/domain/DomainEdit.vue:262 src/views/nginx_log/NginxLog.vue:171
+#: src/views/domain/DomainEdit.vue:261 src/views/nginx_log/NginxLog.vue:170
 msgid "Back"
 msgstr "Volver"
 
@@ -147,12 +144,12 @@ msgid "Base information"
 msgstr "Información general"
 
 #: src/views/config/ConfigEdit.vue:117
-#: src/views/domain/components/RightSettings.vue:71
-#: src/views/preference/Preference.vue:92
+#: src/views/domain/components/RightSettings.vue:73
+#: src/views/preference/Preference.vue:90
 msgid "Basic"
 msgstr "Básico"
 
-#: src/views/domain/DomainEdit.vue:208
+#: src/views/domain/DomainEdit.vue:207
 msgid "Basic Mode"
 msgstr "Modo Básico"
 
@@ -173,35 +170,38 @@ msgstr "Directorio CA"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:58
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:139
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
-#: src/views/domain/cert/components/ObtainCert.vue:210
-#: src/views/domain/components/Deploy.vue:25
-#: src/views/domain/components/RightSettings.vue:51
+#: src/views/domain/cert/components/ObtainCert.vue:211
+#: src/views/domain/components/Deploy.vue:24
+#: src/views/domain/components/RightSettings.vue:52
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:216
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:48
 msgid "Cancel"
 msgstr "Cancelar"
 
-#: src/views/domain/cert/CertInfo.vue:36
+#: src/views/domain/cert/CertInfo.vue:35
 msgid "Certificate has expired"
 msgstr "El certificado expiró"
 
-#: src/views/domain/cert/CertInfo.vue:40
+#: src/views/domain/cert/CertInfo.vue:39
 msgid "Certificate is valid"
 msgstr "El certificado es válido"
 
-#: src/views/cert/Cert.vue:132 src/views/domain/cert/Cert.vue:35
+#: src/views/certificate/Certificate.vue:145 src/views/domain/cert/Cert.vue:35
 msgid "Certificate Status"
 msgstr "Estado del Certificado"
 
-#: src/routes/index.ts:101 src/views/cert/Cert.vue:84
-msgid "Certification"
-msgstr "Certificación"
+#: src/routes/index.ts:100 src/views/certificate/Certificate.vue:96
+#, fuzzy
+msgid "Certificates"
+msgstr "Estado del Certificado"
 
-#: src/routes/index.ts:109
-msgid "Certification List"
+#: src/routes/index.ts:108
+#, fuzzy
+msgid "Certificates List"
 msgstr "Lista de Certificados"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:57
+#: src/views/certificate/Certificate.vue:150
+#: src/views/domain/cert/components/AutoCertStepOne.vue:63
 msgid "Challenge Method"
 msgstr "Método de desafío"
 
@@ -237,11 +237,11 @@ msgstr "Limpiar"
 #: 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
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:283
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:284
 msgid "Comments"
 msgstr "Comentarios"
 
-#: src/views/cert/Cert.vue:33
+#: src/views/certificate/Certificate.vue:41
 msgid "Config Name"
 msgstr "Nombre de la configuración"
 
@@ -249,7 +249,7 @@ msgstr "Nombre de la configuración"
 msgid "Config Templates"
 msgstr "Plantillas de configuración"
 
-#: src/views/config/InspectConfig.vue:31
+#: src/views/config/InspectConfig.vue:30
 msgid "Configuration file is test successful"
 msgstr "El archivo de configuración se probó exitosamente"
 
@@ -303,7 +303,7 @@ msgstr "La creación de un cliente facilita la comunicación con el servidor CA"
 msgid "Credential"
 msgstr "Credencial"
 
-#: src/views/cert/DNSChallenge.vue:83
+#: src/views/certificate/DNSChallenge.vue:83
 msgid "Credentials"
 msgstr "Credenciales"
 
@@ -312,7 +312,7 @@ msgid "Current Version"
 msgstr "Versión actual"
 
 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:122
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:240
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:241
 msgid "Custom"
 msgstr "Personalizado"
 
@@ -320,13 +320,13 @@ msgstr "Personalizado"
 msgid "Dashboard"
 msgstr "Panel"
 
-#: src/views/other/Install.vue:122
+#: src/views/other/Install.vue:124
 msgid "Database (Optional, default: database)"
 msgstr "Base de datos (Opcional, default: database)"
 
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:354
 #: src/views/domain/DomainList.vue:153
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:258
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:259
 msgid "Delete"
 msgstr "Eliminar"
 
@@ -340,19 +340,19 @@ msgid "Deleted successfully"
 msgstr "Desactivado con éxito"
 
 #: src/views/domain/components/Deploy.vue:109
-#: src/views/domain/components/RightSettings.vue:89
+#: src/views/domain/components/RightSettings.vue:91
 msgid "Deploy"
 msgstr "Desplegar"
 
-#: src/views/domain/components/Deploy.vue:67
+#: src/views/domain/components/Deploy.vue:66
 msgid "Deploy %{conf_name} to %{node_name} failed"
 msgstr "Falló el desplegado de %{conf_name} a %{node_name}"
 
-#: src/views/domain/components/Deploy.vue:41
+#: src/views/domain/components/Deploy.vue:40
 msgid "Deploy %{conf_name} to %{node_name} successfully"
 msgstr "Desplegado de %{conf_name} a %{node_name} exitoso"
 
-#: src/views/domain/components/Deploy.vue:39
+#: src/views/domain/components/Deploy.vue:38
 msgid "Deploy successfully"
 msgstr "Desplegado con éxito"
 
@@ -383,16 +383,17 @@ msgstr "Directiva"
 msgid "Disable"
 msgstr "Desactivado"
 
-#: src/views/domain/cert/components/ObtainCert.vue:127
+#: src/views/domain/cert/components/ObtainCert.vue:128
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "No se pudo desactivar la renovación automática por %{name}"
 
-#: src/views/cert/Cert.vue:49 src/views/domain/cert/ChangeCert.vue:48
-#: src/views/domain/DomainEdit.vue:191 src/views/domain/DomainList.vue:123
+#: src/views/certificate/Certificate.vue:57
+#: src/views/domain/cert/ChangeCert.vue:48 src/views/domain/DomainEdit.vue:190
+#: src/views/domain/DomainList.vue:123
 msgid "Disabled"
 msgstr "Desactivado"
 
-#: src/views/domain/components/RightSettings.vue:38
+#: src/views/domain/components/RightSettings.vue:39
 #: src/views/domain/DomainList.vue:67
 msgid "Disabled successfully"
 msgstr "Desactivado con éxito"
@@ -401,34 +402,34 @@ msgstr "Desactivado con éxito"
 msgid "Disk IO"
 msgstr "I/O del disco"
 
-#: src/routes/index.ts:114 src/views/cert/DNSCredential.vue:39
+#: src/routes/index.ts:113 src/views/certificate/DNSCredential.vue:39
 msgid "DNS Credentials"
 msgstr "Credenciales de DNS"
 
-#: src/views/cert/DNSChallenge.vue:74
+#: src/views/certificate/DNSChallenge.vue:74
 #: src/views/domain/cert/components/DNSChallenge.vue:79
 msgid "DNS Provider"
 msgstr "Proveedor DNS"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:63
+#: src/views/domain/cert/components/AutoCertStepOne.vue:69
 msgid "DNS01"
 msgstr "DNS01"
 
-#: src/views/domain/components/Deploy.vue:20
+#: src/views/domain/components/Deploy.vue:19
 msgid "Do you want to deploy this file to remote server?"
 msgid_plural "Do you want to deploy this file to remote servers?"
 msgstr[0] "¿Desea desplegar este archivo en un servidor remoto?"
 msgstr[1] "¿Desea desplegar este archivo en los servidores remotos?"
 
-#: src/views/domain/cert/components/ObtainCert.vue:206
+#: src/views/domain/cert/components/ObtainCert.vue:207
 msgid "Do you want to disable auto-cert renewal?"
 msgstr "¿Desea deshabilitar la renovación automática de certificado?"
 
-#: src/views/domain/components/RightSettings.vue:47
+#: src/views/domain/components/RightSettings.vue:48
 msgid "Do you want to disable this site?"
 msgstr "¿Quieres deshabilitar este sitio?"
 
-#: src/views/domain/components/RightSettings.vue:47
+#: src/views/domain/components/RightSettings.vue:48
 msgid "Do you want to enable this site?"
 msgstr "¿Quieres habilitar este sitio?"
 
@@ -444,8 +445,9 @@ msgstr "¿Quieres eliminar este servidor?"
 msgid "Domain Config Created Successfully"
 msgstr "Configuración de dominio creada con éxito"
 
-#: src/views/cert/Cert.vue:112
-msgid "Domains list is empty, try to reopen auto-cert for %{config}"
+#: src/views/certificate/Certificate.vue:125
+#, fuzzy
+msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr ""
 "La lista de dominios está vacía, intente reabrir la certificación automática "
 "para %{config}"
@@ -483,19 +485,19 @@ msgstr "Duplicado con éxito"
 msgid "Duplicate to local successfully"
 msgstr "Duplicado con éxito a local"
 
-#: src/views/domain/DomainEdit.vue:180
+#: src/views/domain/DomainEdit.vue:179
 msgid "Edit %{n}"
 msgstr "Editar %{n}"
 
-#: src/routes/index.ts:93 src/views/config/ConfigEdit.vue:83
+#: src/routes/index.ts:92 src/views/config/ConfigEdit.vue:83
 msgid "Edit Configuration"
 msgstr "Editar Configuración"
 
-#: src/routes/index.ts:75
+#: src/routes/index.ts:74
 msgid "Edit Site"
 msgstr "Editar Sitio"
 
-#: src/views/other/Install.vue:91
+#: src/views/other/Install.vue:93
 msgid "Email (*)"
 msgstr "Correo (*)"
 
@@ -504,15 +506,15 @@ msgstr "Correo (*)"
 msgid "Enable"
 msgstr "Habilitado"
 
-#: src/views/domain/components/Deploy.vue:56
+#: src/views/domain/components/Deploy.vue:55
 msgid "Enable %{conf_name} in %{node_name} failed"
 msgstr "Falló el habilitado de %{conf_name} en %{node_name}"
 
-#: src/views/domain/components/Deploy.vue:50
+#: src/views/domain/components/Deploy.vue:49
 msgid "Enable %{conf_name} in %{node_name} successfully"
 msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
 
-#: src/views/domain/cert/components/ObtainCert.vue:120
+#: src/views/domain/cert/components/ObtainCert.vue:121
 msgid "Enable auto-renewal failed for %{name}"
 msgstr "No se pudo activar la renovación automática por %{name}"
 
@@ -520,22 +522,23 @@ msgstr "No se pudo activar la renovación automática por %{name}"
 msgid "Enable failed"
 msgstr "Falló la habilitación"
 
-#: src/views/domain/components/Deploy.vue:48
+#: src/views/domain/components/Deploy.vue:47
 msgid "Enable successfully"
 msgstr "Habilitado con éxito"
 
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:235
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:236
 msgid "Enable TLS"
 msgstr "Habilitar TLS"
 
-#: src/views/cert/Cert.vue:45 src/views/domain/cert/ChangeCert.vue:44
+#: src/views/certificate/Certificate.vue:53
+#: src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/components/Deploy.vue:89
-#: src/views/domain/components/RightSettings.vue:73
-#: src/views/domain/DomainEdit.vue:185 src/views/domain/DomainList.vue:131
+#: src/views/domain/components/RightSettings.vue:75
+#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:131
 msgid "Enabled"
 msgstr "Habilitado"
 
-#: src/views/domain/components/RightSettings.vue:29
+#: src/views/domain/components/RightSettings.vue:30
 #: src/views/domain/components/SiteDuplicate.vue:100
 #: src/views/domain/DomainAdd.vue:45 src/views/domain/DomainList.vue:58
 msgid "Enabled successfully"
@@ -545,7 +548,7 @@ msgstr "Habilitado con éxito"
 msgid "Encrypt website with Let's Encrypt"
 msgstr "Encriptar sitio web con Let's Encrypt"
 
-#: src/routes/index.ts:152 src/views/environment/Environment.vue:113
+#: src/routes/index.ts:151 src/views/environment/Environment.vue:113
 msgid "Environment"
 msgstr "Entorno"
 
@@ -553,11 +556,11 @@ msgstr "Entorno"
 msgid "Environments"
 msgstr "Entornos"
 
-#: src/views/config/InspectConfig.vue:48
+#: src/views/config/InspectConfig.vue:47
 msgid "Error"
 msgstr "Error"
 
-#: src/routes/index.ts:139 src/views/domain/ngx_conf/LogEntry.vue:86
+#: src/routes/index.ts:138 src/views/domain/ngx_conf/LogEntry.vue:86
 msgid "Error Logs"
 msgstr "Registros de acceso"
 
@@ -565,17 +568,22 @@ msgstr "Registros de acceso"
 msgid "Executable Path"
 msgstr "Ruta ejecutable"
 
+#: src/views/domain/cert/CertInfo.vue:27
+#, fuzzy
+msgid "Expired At: %{date}"
+msgstr "Fecha de vencimiento: %{date}"
+
 #: src/components/StdDesign/StdDataDisplay/methods/exportCsv.ts:68
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:296
 msgid "Export"
 msgstr "Exportar"
 
-#: src/views/domain/components/RightSettings.vue:41
+#: src/views/domain/components/RightSettings.vue:42
 #: src/views/domain/DomainList.vue:70
 msgid "Failed to disable %{msg}"
 msgstr "Error al deshabilitar %{msg}"
 
-#: src/views/domain/components/RightSettings.vue:32
+#: src/views/domain/components/RightSettings.vue:33
 #: src/views/domain/DomainList.vue:61
 msgid "Failed to enable %{msg}"
 msgstr "Error al habilitar %{msg}"
@@ -584,7 +592,7 @@ msgstr "Error al habilitar %{msg}"
 msgid "Failed to get certificate information"
 msgstr "No se pudo obtener la información del certificado"
 
-#: src/views/domain/DomainEdit.vue:139
+#: src/views/domain/DomainEdit.vue:138
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr ""
 "No se pudo guardar, se detectó un error(es) de sintaxis en la configuración."
@@ -601,7 +609,7 @@ msgstr "El archivo existe"
 msgid "File Not Found"
 msgstr "Archivo no encontrado"
 
-#: src/views/nginx_log/NginxLog.vue:153
+#: src/views/nginx_log/NginxLog.vue:152
 msgid "Filter"
 msgstr "Filtro"
 
@@ -633,7 +641,7 @@ msgstr "Generando clave privada para registrar cuenta"
 msgid "Get release information error"
 msgstr "Obtener error de información de versión"
 
-#: src/views/domain/cert/components/ObtainCert.vue:63
+#: src/views/domain/cert/components/ObtainCert.vue:64
 msgid "Getting the certificate, please wait..."
 msgstr "Obteniendo el certificado, por favor espere..."
 
@@ -674,7 +682,7 @@ msgstr "Host HTTP"
 msgid "HTTP Port"
 msgstr "Puerto HTTP"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:60
+#: src/views/domain/cert/components/AutoCertStepOne.vue:66
 msgid "HTTP01"
 msgstr "HTTP01"
 
@@ -686,15 +694,15 @@ msgstr "Error de actualización de kernel inicial"
 msgid "Initialing core upgrader"
 msgstr "Inicializando la actualización del kernel"
 
-#: src/routes/index.ts:195 src/views/other/Install.vue:137
+#: src/routes/index.ts:194 src/views/other/Install.vue:139
 msgid "Install"
 msgstr "Instalar"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:68
 msgid "Install successfully"
 msgstr "Instalación exitosa"
 
-#: src/views/domain/cert/CertInfo.vue:22
+#: src/views/domain/cert/CertInfo.vue:21
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "Autoridades de certificación intermedias: %{issuer}"
 
@@ -745,11 +753,11 @@ msgstr "Ubicación"
 msgid "Locations"
 msgstr "Ubicaciones"
 
-#: src/routes/index.ts:201 src/views/other/Login.vue:147
+#: src/routes/index.ts:200 src/views/other/Login.vue:147
 msgid "Login"
 msgstr "Acceso"
 
-#: src/views/other/Login.vue:53 src/views/other/Login.vue:99
+#: src/views/other/Login.vue:51 src/views/other/Login.vue:97
 msgid "Login successful"
 msgstr "Acceso exitoso"
 
@@ -757,7 +765,7 @@ msgstr "Acceso exitoso"
 msgid "Logout successful"
 msgstr "Cierre de sesión exitoso"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:45
+#: src/views/domain/cert/components/AutoCertStepOne.vue:51
 msgid ""
 "Make sure you have configured a reverse proxy for .well-known directory to "
 "HTTPChallengePort before obtaining the certificate."
@@ -765,15 +773,15 @@ 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:84
+#: src/routes/index.ts:83
 msgid "Manage Configs"
 msgstr "Administrar configuraciones"
 
-#: src/routes/index.ts:59 src/views/domain/DomainList.vue:102
+#: src/routes/index.ts:58 src/views/domain/DomainList.vue:102
 msgid "Manage Sites"
 msgstr "Administrar sitios"
 
-#: src/routes/index.ts:160 src/views/user/User.vue:53
+#: src/routes/index.ts:159 src/views/user/User.vue:53
 msgid "Manage Users"
 msgstr "Administrar usuarios"
 
@@ -788,6 +796,7 @@ msgstr "Memoria y almacenamiento"
 #: src/components/ChatGPT/ChatGPT.vue:256
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
+#: src/views/certificate/Certificate.vue:156
 msgid "Modify"
 msgstr "Modificar"
 
@@ -799,9 +808,10 @@ msgstr "Modificar configuración"
 msgid "Multi-line Directive"
 msgstr "Directiva multilínea"
 
-#: src/views/cert/Cert.vue:17 src/views/cert/DNSCredential.vue:13
-#: src/views/config/config.ts:9 src/views/domain/cert/ChangeCert.vue:21
-#: src/views/domain/components/RightSettings.vue:79
+#: src/views/certificate/Certificate.vue:24
+#: 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
 #: src/views/domain/components/SiteDuplicate.vue:135
 #: src/views/domain/DomainList.vue:16 src/views/environment/Environment.vue:15
 msgid "Name"
@@ -827,12 +837,12 @@ msgstr "Total enviado por la red"
 msgid "New version released"
 msgstr "Se liberó una nueva versión"
 
-#: src/views/domain/cert/components/ObtainCert.vue:278
+#: src/views/domain/cert/components/ObtainCert.vue:281
 #: src/views/domain/DomainAdd.vue:140
 msgid "Next"
 msgstr "Siguiente"
 
-#: src/views/preference/Preference.vue:98
+#: src/views/preference/Preference.vue:96
 msgid "Nginx"
 msgstr "Nginx"
 
@@ -840,7 +850,7 @@ msgstr "Nginx"
 msgid "Nginx Access Log Path"
 msgstr "Ruta de registro de acceso de Nginx"
 
-#: src/views/domain/DomainEdit.vue:223
+#: src/views/domain/DomainEdit.vue:222
 msgid "Nginx Configuration Parse Error"
 msgstr "Error de análisis de configuración de Nginx"
 
@@ -852,7 +862,7 @@ msgstr "Control de Nginx"
 msgid "Nginx Error Log Path"
 msgstr "Ruta de registro de errores de Nginx"
 
-#: src/routes/index.ts:129 src/views/nginx_log/NginxLog.vue:146
+#: src/routes/index.ts:128 src/views/nginx_log/NginxLog.vue:145
 msgid "Nginx Log"
 msgstr "Registro Nginx"
 
@@ -876,20 +886,20 @@ msgstr "No"
 msgid "Node Secret"
 msgstr "Secreto del nodo"
 
-#: src/routes/index.ts:207 src/routes/index.ts:209
+#: src/routes/index.ts:206 src/routes/index.ts:208
 msgid "Not Found"
 msgstr "No encontrado"
 
-#: src/views/domain/cert/CertInfo.vue:31
+#: src/views/domain/cert/CertInfo.vue:30
 msgid "Not Valid Before: %{date}"
 msgstr "No válido antes: %{date}"
 
-#: src/views/cert/DNSCredential.vue:48
-#: src/views/domain/cert/components/AutoCertStepOne.vue:32
+#: src/views/certificate/DNSCredential.vue:48
+#: src/views/domain/cert/components/AutoCertStepOne.vue:38
 msgid "Note"
 msgstr "Nota"
 
-#: src/views/domain/cert/components/ObtainCert.vue:249
+#: src/views/domain/cert/components/ObtainCert.vue:252
 msgid "Obtain certificate"
 msgstr "Obtener certificado"
 
@@ -908,15 +918,19 @@ msgstr "Desconectado"
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:140
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:346
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:104
-#: src/views/domain/cert/components/ObtainCert.vue:209
-#: src/views/domain/components/Deploy.vue:24
-#: src/views/domain/components/RightSettings.vue:50
+#: src/views/domain/cert/components/ObtainCert.vue:210
+#: src/views/domain/components/Deploy.vue:23
+#: src/views/domain/components/RightSettings.vue:51
 #: src/views/domain/DomainList.vue:144
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:215
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:47
 msgid "OK"
 msgstr "OK"
 
+#: src/views/certificate/DNSCredential.vue:58
+msgid "Once the verification is complete, the records will be removed."
+msgstr ""
+
 #: src/components/NodeSelector/NodeSelector.vue:57
 #: src/components/NodeSelector/NodeSelector.vue:72
 #: src/views/dashboard/Environments.vue:100
@@ -924,7 +938,7 @@ msgstr "OK"
 msgid "Online"
 msgstr "Conectado"
 
-#: src/views/preference/Preference.vue:104
+#: src/views/preference/Preference.vue:102
 msgid "OpenAI"
 msgstr "OpenAI"
 
@@ -952,7 +966,7 @@ msgstr "Parámetros"
 msgid "Password"
 msgstr "Contraseña"
 
-#: src/views/other/Install.vue:111
+#: src/views/other/Install.vue:113
 msgid "Password (*)"
 msgstr "Contraseña (*)"
 
@@ -970,23 +984,13 @@ msgstr "Error al ejecutar la actualización del kernel"
 msgid "Performing core upgrade"
 msgstr "Realizando la actualizaciónd el kernel"
 
-#: src/views/cert/DNSCredential.vue:52
-#, fuzzy
+#: src/views/certificate/DNSCredential.vue:52
 msgid ""
 "Please fill in the API authentication credentials provided by your DNS "
-"provider.\n"
-"We will add one or more TXT records to the DNS records of your domain for "
-"ownership verification.\n"
-"Once the verification is complete, the records will be removed.\n"
-"Please note that the time configurations below are all in seconds."
+"provider."
 msgstr ""
-"Complete las credenciales de autenticación de la API proporcionadas por su "
-"proveedor de DNS. Agregaremos uno o más registros TXT a los registros DNS de "
-"su dominio para verificar la propiedad. Una vez que se complete la "
-"verificación, se eliminarán los registros. Tenga en cuenta que las "
-"configuraciones de tiempo que aparecen debajo están todas en segundos."
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:49
+#: src/views/domain/cert/components/AutoCertStepOne.vue:55
 #, fuzzy
 msgid ""
 "Please first add credentials in Certification > DNS Credentials, and then "
@@ -1004,18 +1008,23 @@ msgstr ""
 "Ingrese el nombre, ¡este se usará como el nombre de archivo de la nueva "
 "configuración!"
 
-#: src/views/other/Install.vue:34
+#: src/views/other/Install.vue:35
 msgid "Please input your E-mail!"
 msgstr "¡Por favor ingrese su correo electrónico!"
 
-#: src/views/other/Install.vue:46 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:47 src/views/other/Login.vue:39
 msgid "Please input your password!"
 msgstr "¡Por favor ingrese su contraseña!"
 
-#: src/views/other/Install.vue:40 src/views/other/Login.vue:35
+#: src/views/other/Install.vue:41 src/views/other/Login.vue:33
 msgid "Please input your username!"
 msgstr "¡Por favor ingrese su nombre de usuario!"
 
+#: src/views/certificate/DNSCredential.vue:61
+msgid ""
+"Please note that the unit of time configurations below are all in seconds."
+msgstr ""
+
 #: src/views/domain/components/SiteDuplicate.vue:47
 msgid "Please select at least one node!"
 msgstr "¡Seleccione al menos un nodo!"
@@ -1024,7 +1033,7 @@ msgstr "¡Seleccione al menos un nodo!"
 msgid "Pre-release"
 msgstr "Prelanzamiento"
 
-#: src/routes/index.ts:168 src/views/preference/Preference.vue:87
+#: src/routes/index.ts:167 src/views/preference/Preference.vue:85
 msgid "Preference"
 msgstr "Configuración"
 
@@ -1044,7 +1053,7 @@ msgstr "Prohibir la eliminación del usuario predeterminado"
 msgid "Project Team"
 msgstr "Grupo del proyecto"
 
-#: src/views/cert/DNSCredential.vue:21
+#: src/views/certificate/DNSCredential.vue:21
 msgid "Provider"
 msgstr "Proveedor"
 
@@ -1112,9 +1121,9 @@ msgid "Running"
 msgstr "Corriendo"
 
 #: src/components/ChatGPT/ChatGPT.vue:259 src/views/config/ConfigEdit.vue:98
-#: src/views/domain/DomainEdit.vue:269
+#: src/views/domain/DomainEdit.vue:268
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:111
-#: src/views/preference/Preference.vue:115
+#: src/views/preference/Preference.vue:113
 msgid "Save"
 msgstr "Guardar"
 
@@ -1128,7 +1137,7 @@ msgid "Save error %{msg}"
 msgstr "Error al guardar %{msg}"
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
-#: src/views/preference/Preference.vue:60
+#: src/views/preference/Preference.vue:58
 msgid "Save successfully"
 msgstr "Guardado con éxito"
 
@@ -1137,7 +1146,7 @@ msgid "Save Successfully"
 msgstr "Guardado con éxito"
 
 #: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:41
-#: src/views/domain/DomainEdit.vue:155
+#: src/views/domain/DomainEdit.vue:154
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
 msgid "Saved successfully"
 msgstr "Guardado con éxito"
@@ -1158,7 +1167,7 @@ msgstr "Enviado"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:45
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:157
 #: src/views/config/ConfigEdit.vue:42 src/views/domain/DomainList.vue:79
-#: src/views/other/Install.vue:71 src/views/preference/Preference.vue:62
+#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:60
 #: src/views/system/Upgrade.vue:45
 msgid "Server error"
 msgstr "Error del servidor"
@@ -1167,11 +1176,11 @@ msgstr "Error del servidor"
 msgid "Server Info"
 msgstr "Información del servidor"
 
-#: src/views/domain/cert/components/ObtainCert.vue:164
+#: src/views/domain/cert/components/ObtainCert.vue:165
 msgid "server_name not found in directives"
 msgstr "No se encuentra server_name en las directivas"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:22
+#: src/views/domain/cert/components/AutoCertStepOne.vue:27
 #: src/views/domain/DomainAdd.vue:119
 msgid "server_name parameter is required"
 msgstr "Se requiere el parámetro server_name"
@@ -1184,30 +1193,32 @@ msgstr "Configuración de variables de entorno"
 msgid "Single Directive"
 msgstr "Directiva de una sola línea"
 
-#: src/routes/index.ts:143
+#: src/routes/index.ts:142
 msgid "Site Logs"
 msgstr "Registros del sitio"
 
-#: src/routes/index.ts:67
+#: src/routes/index.ts:66
 msgid "Sites List"
 msgstr "Lista de sitios"
 
-#: src/views/cert/Cert.vue:64
+#: src/views/certificate/Certificate.vue:164
+#, fuzzy
+msgid "SSL Certificate Content"
+msgstr "Contenido de certificado SSL"
+
+#: src/views/certificate/Certificate.vue:171
+#, fuzzy
+msgid "SSL Certificate Key Content"
+msgstr "Contenido de la llave del certificado SSL"
+
+#: src/views/certificate/Certificate.vue:73
 msgid "SSL Certificate Key Path"
 msgstr "Ruta de la llave del certificado SSL"
 
-#: src/views/cert/Cert.vue:57
+#: src/views/certificate/Certificate.vue:65
 msgid "SSL Certificate Path"
 msgstr "Ruta del certificado SSL"
 
-#: src/views/cert/Cert.vue:139
-msgid "SSL Certification Content"
-msgstr "Contenido de certificado SSL"
-
-#: src/views/cert/Cert.vue:145
-msgid "SSL Certification Key Content"
-msgstr "Contenido de la llave del certificado SSL"
-
 #: src/views/other/Login.vue:158
 #, fuzzy
 msgid "SSO Login"
@@ -1229,7 +1240,7 @@ msgstr "Detenido"
 msgid "Storage"
 msgstr "Almacenamiento"
 
-#: src/views/domain/cert/CertInfo.vue:25
+#: src/views/domain/cert/CertInfo.vue:24
 #, fuzzy
 msgid "Subject Name: %{subject}"
 msgstr "Nombre del asunto: %{name}"
@@ -1246,7 +1257,7 @@ msgstr ""
 msgid "Switch to light theme"
 msgstr ""
 
-#: src/routes/index.ts:176
+#: src/routes/index.ts:175
 msgid "System"
 msgstr "Sistema"
 
@@ -1258,7 +1269,7 @@ msgstr "Tabla"
 msgid "Target"
 msgstr "Objetivo"
 
-#: src/routes/index.ts:121 src/views/pty/Terminal.vue:95
+#: src/routes/index.ts:120 src/views/pty/Terminal.vue:95
 msgid "Terminal"
 msgstr "Terminal"
 
@@ -1266,7 +1277,7 @@ msgstr "Terminal"
 msgid "Terminal Start Command"
 msgstr "Comando de inicio de terminal"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:41
+#: src/views/domain/cert/components/AutoCertStepOne.vue:47
 #, fuzzy
 msgid ""
 "The certificate for the domain will be checked 5 minutes, and will be "
@@ -1275,12 +1286,12 @@ msgstr ""
 "El certificado de dominio se comprobará cada hora y se renovará si ha pasado "
 "más de 1 semana desde su última emisión."
 
-#: src/views/other/Install.vue:52
+#: src/views/other/Install.vue:53
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr ""
 "El nombre del archivo no puede contener los siguientes caracteres: %{c}"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:36
+#: src/views/domain/cert/components/AutoCertStepOne.vue:42
 #, fuzzy
 msgid ""
 "The server_name in the current configuration must be the domain name you "
@@ -1293,8 +1304,9 @@ msgstr ""
 msgid "The username or password is incorrect"
 msgstr "El nombre de usuario o contraseña son incorrectos"
 
-#: src/views/cert/Cert.vue:102
-msgid "This auto-cert item is invalid, please remove it."
+#: src/views/certificate/Certificate.vue:115
+#, 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/components/StdDesign/StdDataEntry/StdFormItem.vue:31
@@ -1317,9 +1329,10 @@ msgstr ""
 msgid "Type"
 msgstr "Tipo"
 
-#: src/views/cert/Cert.vue:71 src/views/cert/DNSCredential.vue:26
-#: src/views/config/config.ts:29 src/views/config/ConfigEdit.vue:123
-#: src/views/domain/components/RightSettings.vue:82
+#: src/views/certificate/Certificate.vue:81
+#: src/views/certificate/DNSCredential.vue:26 src/views/config/config.ts:29
+#: src/views/config/ConfigEdit.vue:123
+#: src/views/domain/components/RightSettings.vue:84
 #: src/views/domain/DomainList.vue:44 src/views/environment/Environment.vue:98
 #: src/views/user/User.vue:40
 msgid "Updated at"
@@ -1329,7 +1342,7 @@ msgstr "Actualizado a"
 msgid "Updated successfully"
 msgstr "Actualización exitosa"
 
-#: src/routes/index.ts:187 src/views/system/Upgrade.vue:143
+#: src/routes/index.ts:186 src/views/system/Upgrade.vue:143
 #: src/views/system/Upgrade.vue:235
 msgid "Upgrade"
 msgstr "Actualizar"
@@ -1358,7 +1371,7 @@ msgstr "Usuario"
 msgid "Username"
 msgstr "Nombre de usuario"
 
-#: src/views/other/Install.vue:101
+#: src/views/other/Install.vue:103
 msgid "Username (*)"
 msgstr "Nombre de usuario (*)"
 
@@ -1374,13 +1387,19 @@ msgstr "Usando el proveedor de desafíos HTTP01"
 msgid "View"
 msgstr "Ver"
 
-#: src/views/config/InspectConfig.vue:37
-#: src/views/domain/cert/components/AutoCertStepOne.vue:16
+#: src/views/config/InspectConfig.vue:36
+#: src/views/domain/cert/components/AutoCertStepOne.vue:21
 #: src/views/domain/DomainAdd.vue:114
 msgid "Warning"
 msgstr "Advertencia"
 
-#: src/views/domain/cert/components/ObtainCert.vue:207
+#: src/views/certificate/DNSCredential.vue:55
+msgid ""
+"We will add one or more TXT records to the DNS records of your domain for "
+"ownership verification."
+msgstr ""
+
+#: src/views/domain/cert/components/ObtainCert.vue:208
 msgid ""
 "We will remove the HTTPChallenge configuration from this file and reload the "
 "Nginx. Are you sure you want to continue?"
@@ -1414,6 +1433,29 @@ msgstr "Estás usando la última versión"
 msgid "You can check Nginx UI upgrade at this page."
 msgstr "Puede consultar la actualización de Nginx UI en esta página."
 
+#~ msgid "Auto cert is enabled, please do not modify this certification."
+#~ msgstr ""
+#~ "Está habilitado el Certificado automático, por favor no modifique esta "
+#~ "certificación."
+
+#, fuzzy
+#~ msgid ""
+#~ "Please fill in the API authentication credentials provided by your DNS "
+#~ "provider.\n"
+#~ "We will add one or more TXT records to the DNS records of your domain for "
+#~ "ownership verification.\n"
+#~ "Once the verification is complete, the records will be removed.\n"
+#~ "Please note that the unit of time configurations below are all in seconds."
+#~ msgstr ""
+#~ "Complete las credenciales de autenticación de la API proporcionadas por "
+#~ "su proveedor de DNS. Agregaremos uno o más registros TXT a los registros "
+#~ "DNS de su dominio para verificar la propiedad. Una vez que se complete la "
+#~ "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}"
 

+ 211 - 171
app/src/language/fr_FR/app.po

@@ -11,29 +11,25 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Poedit 3.3\n"
 
-#: src/views/domain/cert/CertInfo.vue:28
-#, fuzzy
-msgid " Expiration Date: %{date}"
-msgstr "Date d'expiration : %{date}"
-
-#: src/routes/index.ts:183
+#: src/routes/index.ts:182
 msgid "About"
 msgstr "À propos"
 
-#: src/routes/index.ts:135 src/views/domain/ngx_conf/LogEntry.vue:78
+#: src/routes/index.ts:134 src/views/domain/ngx_conf/LogEntry.vue:78
 msgid "Access Logs"
 msgstr "Journaux d'accès"
 
-#: src/views/cert/Cert.vue:77 src/views/cert/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/certificate/Certificate.vue:87
+#: 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
 msgid "Action"
 msgstr "Action"
 
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:114
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:115
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:307
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:308
 msgid "Add"
 msgstr "Ajouter"
 
@@ -46,16 +42,16 @@ msgstr "Ajouter une directive"
 msgid "Add Location"
 msgstr "Ajouter une localisation"
 
-#: src/routes/index.ts:71 src/views/domain/DomainAdd.vue:91
+#: src/routes/index.ts:70 src/views/domain/DomainAdd.vue:91
 msgid "Add Site"
 msgstr "Ajouter un site"
 
-#: src/views/cert/DNSChallenge.vue:95
+#: src/views/certificate/DNSChallenge.vue:95
 #, fuzzy
 msgid "Additional"
 msgstr "Supplémentaire"
 
-#: src/views/domain/DomainEdit.vue:205
+#: src/views/domain/DomainEdit.vue:204
 msgid "Advance Mode"
 msgstr "Mode avancé"
 
@@ -107,35 +103,35 @@ msgstr ""
 msgid "Author"
 msgstr "Autheur"
 
-#: src/views/cert/Cert.vue:38 src/views/domain/cert/ChangeCert.vue:37
+#: src/views/certificate/Certificate.vue:46
+#: src/views/domain/cert/ChangeCert.vue:37
 msgid "Auto Cert"
 msgstr "Auto Cert"
 
-#: src/views/cert/Cert.vue:92
-msgid "Auto cert is enabled, please do not modify this certification."
-msgstr ""
-"La certification automatique est activée, veuillez ne pas modifier cette "
-"certification."
-
-#: src/views/nginx_log/NginxLog.vue:150
-msgid "Auto Refresh"
-msgstr "Actualisation automatique"
+#: src/views/certificate/Certificate.vue:105
+#, fuzzy
+msgid "Auto Cert is enabled"
+msgstr "Auto Cert"
 
-#: src/views/cert/Cert.vue:122
+#: src/views/certificate/Certificate.vue:135
 #, fuzzy
-msgid "Auto-Cert Log"
+msgid "Auto Cert Log"
 msgstr "Journal Auto-Cert"
 
-#: src/views/domain/cert/components/ObtainCert.vue:125
+#: src/views/nginx_log/NginxLog.vue:149
+msgid "Auto Refresh"
+msgstr "Actualisation automatique"
+
+#: src/views/domain/cert/components/ObtainCert.vue:126
 msgid "Auto-renewal disabled for %{name}"
 msgstr "Renouvellement automatique désactivé pour %{name}"
 
-#: src/views/domain/cert/components/ObtainCert.vue:118
+#: src/views/domain/cert/components/ObtainCert.vue:119
 msgid "Auto-renewal enabled for %{name}"
 msgstr "Renouvellement automatique activé pour %{name}"
 
 #: src/views/config/Config.vue:75 src/views/config/ConfigEdit.vue:89
-#: src/views/domain/DomainEdit.vue:262 src/views/nginx_log/NginxLog.vue:171
+#: src/views/domain/DomainEdit.vue:261 src/views/nginx_log/NginxLog.vue:170
 msgid "Back"
 msgstr "Retour"
 
@@ -148,12 +144,12 @@ msgid "Base information"
 msgstr "Information générale"
 
 #: src/views/config/ConfigEdit.vue:117
-#: src/views/domain/components/RightSettings.vue:71
-#: src/views/preference/Preference.vue:92
+#: src/views/domain/components/RightSettings.vue:73
+#: src/views/preference/Preference.vue:90
 msgid "Basic"
 msgstr "Basique"
 
-#: src/views/domain/DomainEdit.vue:208
+#: src/views/domain/DomainEdit.vue:207
 msgid "Basic Mode"
 msgstr "Mode simple"
 
@@ -175,35 +171,38 @@ msgstr ""
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:58
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:139
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
-#: src/views/domain/cert/components/ObtainCert.vue:210
-#: src/views/domain/components/Deploy.vue:25
-#: src/views/domain/components/RightSettings.vue:51
+#: src/views/domain/cert/components/ObtainCert.vue:211
+#: src/views/domain/components/Deploy.vue:24
+#: src/views/domain/components/RightSettings.vue:52
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:216
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:48
 msgid "Cancel"
 msgstr "Annuler"
 
-#: src/views/domain/cert/CertInfo.vue:36
+#: src/views/domain/cert/CertInfo.vue:35
 msgid "Certificate has expired"
 msgstr "Le certificat a expiré"
 
-#: src/views/domain/cert/CertInfo.vue:40
+#: src/views/domain/cert/CertInfo.vue:39
 msgid "Certificate is valid"
 msgstr "Le certificat est valide"
 
-#: src/views/cert/Cert.vue:132 src/views/domain/cert/Cert.vue:35
+#: src/views/certificate/Certificate.vue:145 src/views/domain/cert/Cert.vue:35
 msgid "Certificate Status"
 msgstr "État du certificat"
 
-#: src/routes/index.ts:101 src/views/cert/Cert.vue:84
-msgid "Certification"
-msgstr "Certification"
+#: src/routes/index.ts:100 src/views/certificate/Certificate.vue:96
+#, fuzzy
+msgid "Certificates"
+msgstr "État du certificat"
 
-#: src/routes/index.ts:109
-msgid "Certification List"
+#: src/routes/index.ts:108
+#, fuzzy
+msgid "Certificates List"
 msgstr "Liste des certifications"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:57
+#: src/views/certificate/Certificate.vue:150
+#: src/views/domain/cert/components/AutoCertStepOne.vue:63
 msgid "Challenge Method"
 msgstr "Méthode de challenge"
 
@@ -239,11 +238,11 @@ msgstr "Effacer"
 #: 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
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:283
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:284
 msgid "Comments"
 msgstr "Commentaires"
 
-#: src/views/cert/Cert.vue:33
+#: src/views/certificate/Certificate.vue:41
 msgid "Config Name"
 msgstr "Nom de la config"
 
@@ -251,7 +250,7 @@ msgstr "Nom de la config"
 msgid "Config Templates"
 msgstr "Modèles de configuration"
 
-#: src/views/config/InspectConfig.vue:31
+#: src/views/config/InspectConfig.vue:30
 msgid "Configuration file is test successful"
 msgstr "Le fichier de configuration est testé avec succès"
 
@@ -305,7 +304,7 @@ msgstr "La création du client facilite la communication avec le serveur CA"
 msgid "Credential"
 msgstr "Identifiant"
 
-#: src/views/cert/DNSChallenge.vue:83
+#: src/views/certificate/DNSChallenge.vue:83
 msgid "Credentials"
 msgstr "Identifiants"
 
@@ -314,7 +313,7 @@ msgid "Current Version"
 msgstr "Version actuelle"
 
 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:122
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:240
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:241
 msgid "Custom"
 msgstr "Custom"
 
@@ -322,13 +321,13 @@ msgstr "Custom"
 msgid "Dashboard"
 msgstr "Dashboard"
 
-#: src/views/other/Install.vue:122
+#: src/views/other/Install.vue:124
 msgid "Database (Optional, default: database)"
 msgstr "Base de données (Facultatif, par défaut : database)"
 
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:354
 #: src/views/domain/DomainList.vue:153
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:258
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:259
 msgid "Delete"
 msgstr "Supprimer"
 
@@ -342,19 +341,19 @@ msgid "Deleted successfully"
 msgstr "Désactivé avec succès"
 
 #: src/views/domain/components/Deploy.vue:109
-#: src/views/domain/components/RightSettings.vue:89
+#: src/views/domain/components/RightSettings.vue:91
 msgid "Deploy"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:67
+#: src/views/domain/components/Deploy.vue:66
 msgid "Deploy %{conf_name} to %{node_name} failed"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:41
+#: src/views/domain/components/Deploy.vue:40
 msgid "Deploy %{conf_name} to %{node_name} successfully"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:39
+#: src/views/domain/components/Deploy.vue:38
 #, fuzzy
 msgid "Deploy successfully"
 msgstr "Sauvegarde réussie"
@@ -386,16 +385,17 @@ msgstr "Directive"
 msgid "Disable"
 msgstr "Désactivé"
 
-#: src/views/domain/cert/components/ObtainCert.vue:127
+#: src/views/domain/cert/components/ObtainCert.vue:128
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "La désactivation du renouvellement automatique a échoué pour %{name}"
 
-#: src/views/cert/Cert.vue:49 src/views/domain/cert/ChangeCert.vue:48
-#: src/views/domain/DomainEdit.vue:191 src/views/domain/DomainList.vue:123
+#: src/views/certificate/Certificate.vue:57
+#: src/views/domain/cert/ChangeCert.vue:48 src/views/domain/DomainEdit.vue:190
+#: src/views/domain/DomainList.vue:123
 msgid "Disabled"
 msgstr "Désactivé"
 
-#: src/views/domain/components/RightSettings.vue:38
+#: src/views/domain/components/RightSettings.vue:39
 #: src/views/domain/DomainList.vue:67
 msgid "Disabled successfully"
 msgstr "Désactivé avec succès"
@@ -404,35 +404,35 @@ msgstr "Désactivé avec succès"
 msgid "Disk IO"
 msgstr "E/S disque"
 
-#: src/routes/index.ts:114 src/views/cert/DNSCredential.vue:39
+#: src/routes/index.ts:113 src/views/certificate/DNSCredential.vue:39
 msgid "DNS Credentials"
 msgstr "Identifiants DNS"
 
-#: src/views/cert/DNSChallenge.vue:74
+#: src/views/certificate/DNSChallenge.vue:74
 #: src/views/domain/cert/components/DNSChallenge.vue:79
 msgid "DNS Provider"
 msgstr "Fournisseur DNS"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:63
+#: src/views/domain/cert/components/AutoCertStepOne.vue:69
 msgid "DNS01"
 msgstr "DNS01"
 
-#: src/views/domain/components/Deploy.vue:20
+#: src/views/domain/components/Deploy.vue:19
 #, fuzzy
 msgid "Do you want to deploy this file to remote server?"
 msgid_plural "Do you want to deploy this file to remote servers?"
 msgstr[0] "Voulez-vous supprimer ce serveur ?"
 msgstr[1] "Voulez-vous supprimer ce serveur ?"
 
-#: src/views/domain/cert/components/ObtainCert.vue:206
+#: src/views/domain/cert/components/ObtainCert.vue:207
 msgid "Do you want to disable auto-cert renewal?"
 msgstr "Voulez-vous désactiver le renouvellement automatique des certificats ?"
 
-#: src/views/domain/components/RightSettings.vue:47
+#: src/views/domain/components/RightSettings.vue:48
 msgid "Do you want to disable this site?"
 msgstr "Voulez-vous désactiver ce site ?"
 
-#: src/views/domain/components/RightSettings.vue:47
+#: src/views/domain/components/RightSettings.vue:48
 msgid "Do you want to enable this site?"
 msgstr "Voulez-vous activer ce site ?"
 
@@ -448,8 +448,9 @@ 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/cert/Cert.vue:112
-msgid "Domains list is empty, try to reopen auto-cert for %{config}"
+#: src/views/certificate/Certificate.vue:125
+#, fuzzy
+msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr ""
 "La liste des domaines est vide, essayez de rouvrir la certification "
 "automatique pour %{config}"
@@ -491,19 +492,19 @@ msgstr "Dupliqué avec succès"
 msgid "Duplicate to local successfully"
 msgstr "Dupliqué avec succès"
 
-#: src/views/domain/DomainEdit.vue:180
+#: src/views/domain/DomainEdit.vue:179
 msgid "Edit %{n}"
 msgstr "Modifier %{n}"
 
-#: src/routes/index.ts:93 src/views/config/ConfigEdit.vue:83
+#: src/routes/index.ts:92 src/views/config/ConfigEdit.vue:83
 msgid "Edit Configuration"
 msgstr "Modifier la configuration"
 
-#: src/routes/index.ts:75
+#: src/routes/index.ts:74
 msgid "Edit Site"
 msgstr "Modifier le site"
 
-#: src/views/other/Install.vue:91
+#: src/views/other/Install.vue:93
 msgid "Email (*)"
 msgstr "Email (*)"
 
@@ -512,15 +513,15 @@ msgstr "Email (*)"
 msgid "Enable"
 msgstr "Activé"
 
-#: src/views/domain/components/Deploy.vue:56
+#: src/views/domain/components/Deploy.vue:55
 msgid "Enable %{conf_name} in %{node_name} failed"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:50
+#: src/views/domain/components/Deploy.vue:49
 msgid "Enable %{conf_name} in %{node_name} successfully"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:120
+#: src/views/domain/cert/components/ObtainCert.vue:121
 msgid "Enable auto-renewal failed for %{name}"
 msgstr "Échec de l'activation du renouvellement automatique pour %{name}"
 
@@ -528,23 +529,24 @@ msgstr "Échec de l'activation du renouvellement automatique pour %{name}"
 msgid "Enable failed"
 msgstr "Échec de l'activation"
 
-#: src/views/domain/components/Deploy.vue:48
+#: src/views/domain/components/Deploy.vue:47
 #, fuzzy
 msgid "Enable successfully"
 msgstr "Activé avec succès"
 
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:235
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:236
 msgid "Enable TLS"
 msgstr "Activer TLS"
 
-#: src/views/cert/Cert.vue:45 src/views/domain/cert/ChangeCert.vue:44
+#: src/views/certificate/Certificate.vue:53
+#: src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/components/Deploy.vue:89
-#: src/views/domain/components/RightSettings.vue:73
-#: src/views/domain/DomainEdit.vue:185 src/views/domain/DomainList.vue:131
+#: src/views/domain/components/RightSettings.vue:75
+#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:131
 msgid "Enabled"
 msgstr "Activé"
 
-#: src/views/domain/components/RightSettings.vue:29
+#: src/views/domain/components/RightSettings.vue:30
 #: src/views/domain/components/SiteDuplicate.vue:100
 #: src/views/domain/DomainAdd.vue:45 src/views/domain/DomainList.vue:58
 msgid "Enabled successfully"
@@ -554,7 +556,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:152 src/views/environment/Environment.vue:113
+#: src/routes/index.ts:151 src/views/environment/Environment.vue:113
 msgid "Environment"
 msgstr ""
 
@@ -563,11 +565,11 @@ msgstr ""
 msgid "Environments"
 msgstr "Commentaires"
 
-#: src/views/config/InspectConfig.vue:48
+#: src/views/config/InspectConfig.vue:47
 msgid "Error"
 msgstr "Erreur"
 
-#: src/routes/index.ts:139 src/views/domain/ngx_conf/LogEntry.vue:86
+#: src/routes/index.ts:138 src/views/domain/ngx_conf/LogEntry.vue:86
 msgid "Error Logs"
 msgstr "Journaux d'erreurs"
 
@@ -575,17 +577,22 @@ msgstr "Journaux d'erreurs"
 msgid "Executable Path"
 msgstr "Chemin exécutable"
 
+#: src/views/domain/cert/CertInfo.vue:27
+#, fuzzy
+msgid "Expired At: %{date}"
+msgstr "Date d'expiration : %{date}"
+
 #: src/components/StdDesign/StdDataDisplay/methods/exportCsv.ts:68
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:296
 msgid "Export"
 msgstr "Exporter"
 
-#: src/views/domain/components/RightSettings.vue:41
+#: src/views/domain/components/RightSettings.vue:42
 #: src/views/domain/DomainList.vue:70
 msgid "Failed to disable %{msg}"
 msgstr "Impossible de désactiver %{msg}"
 
-#: src/views/domain/components/RightSettings.vue:32
+#: src/views/domain/components/RightSettings.vue:33
 #: src/views/domain/DomainList.vue:61
 msgid "Failed to enable %{msg}"
 msgstr "Impossible d'activer %{msg}"
@@ -594,7 +601,7 @@ msgstr "Impossible d'activer %{msg}"
 msgid "Failed to get certificate information"
 msgstr "Échec de l'obtention des informations sur le certificat"
 
-#: src/views/domain/DomainEdit.vue:139
+#: src/views/domain/DomainEdit.vue:138
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr ""
 "Échec de l'enregistrement, une ou plusieurs erreurs de syntaxe ont été "
@@ -612,7 +619,7 @@ msgstr "Le fichier existe"
 msgid "File Not Found"
 msgstr "Fichier introuvable"
 
-#: src/views/nginx_log/NginxLog.vue:153
+#: src/views/nginx_log/NginxLog.vue:152
 msgid "Filter"
 msgstr "Filtrer"
 
@@ -644,7 +651,7 @@ msgstr "Génération de clé privée pour l'enregistrement du compte"
 msgid "Get release information error"
 msgstr "Erreur d'obtention des informations sur la version"
 
-#: src/views/domain/cert/components/ObtainCert.vue:63
+#: src/views/domain/cert/components/ObtainCert.vue:64
 msgid "Getting the certificate, please wait..."
 msgstr "Obtention du certificat, veuillez patienter..."
 
@@ -685,7 +692,7 @@ msgstr "Host HTTP"
 msgid "HTTP Port"
 msgstr "Port HTTP"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:60
+#: src/views/domain/cert/components/AutoCertStepOne.vue:66
 msgid "HTTP01"
 msgstr "HTTP01"
 
@@ -697,15 +704,15 @@ 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:195 src/views/other/Install.vue:137
+#: src/routes/index.ts:194 src/views/other/Install.vue:139
 msgid "Install"
 msgstr "Installer"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:68
 msgid "Install successfully"
 msgstr "Installé avec succès"
 
-#: src/views/domain/cert/CertInfo.vue:22
+#: src/views/domain/cert/CertInfo.vue:21
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "Autorités de certification intermédiaires : %{issuer}"
 
@@ -759,11 +766,11 @@ msgstr "Localisation"
 msgid "Locations"
 msgstr "Localisations"
 
-#: src/routes/index.ts:201 src/views/other/Login.vue:147
+#: src/routes/index.ts:200 src/views/other/Login.vue:147
 msgid "Login"
 msgstr "Connexion"
 
-#: src/views/other/Login.vue:53 src/views/other/Login.vue:99
+#: src/views/other/Login.vue:51 src/views/other/Login.vue:97
 msgid "Login successful"
 msgstr "Connexion réussie"
 
@@ -771,7 +778,7 @@ msgstr "Connexion réussie"
 msgid "Logout successful"
 msgstr "Déconnexion réussie"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:45
+#: src/views/domain/cert/components/AutoCertStepOne.vue:51
 #, fuzzy
 msgid ""
 "Make sure you have configured a reverse proxy for .well-known directory to "
@@ -780,15 +787,15 @@ 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:84
+#: src/routes/index.ts:83
 msgid "Manage Configs"
 msgstr "Gérer les configurations"
 
-#: src/routes/index.ts:59 src/views/domain/DomainList.vue:102
+#: src/routes/index.ts:58 src/views/domain/DomainList.vue:102
 msgid "Manage Sites"
 msgstr "Gérer les sites"
 
-#: src/routes/index.ts:160 src/views/user/User.vue:53
+#: src/routes/index.ts:159 src/views/user/User.vue:53
 msgid "Manage Users"
 msgstr "Gérer les utilisateurs"
 
@@ -803,6 +810,7 @@ msgstr "Mémoire et stockage"
 #: src/components/ChatGPT/ChatGPT.vue:256
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
+#: src/views/certificate/Certificate.vue:156
 msgid "Modify"
 msgstr "Modifier"
 
@@ -814,9 +822,10 @@ msgstr "Modifier la configuration"
 msgid "Multi-line Directive"
 msgstr "Directive multiligne"
 
-#: src/views/cert/Cert.vue:17 src/views/cert/DNSCredential.vue:13
-#: src/views/config/config.ts:9 src/views/domain/cert/ChangeCert.vue:21
-#: src/views/domain/components/RightSettings.vue:79
+#: src/views/certificate/Certificate.vue:24
+#: 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
 #: src/views/domain/components/SiteDuplicate.vue:135
 #: src/views/domain/DomainList.vue:16 src/views/environment/Environment.vue:15
 msgid "Name"
@@ -842,12 +851,12 @@ msgstr "Envoi total réseau"
 msgid "New version released"
 msgstr "Nouvelle version publiée"
 
-#: src/views/domain/cert/components/ObtainCert.vue:278
+#: src/views/domain/cert/components/ObtainCert.vue:281
 #: src/views/domain/DomainAdd.vue:140
 msgid "Next"
 msgstr "Suivant"
 
-#: src/views/preference/Preference.vue:98
+#: src/views/preference/Preference.vue:96
 #, fuzzy
 msgid "Nginx"
 msgstr "Journal Nginx"
@@ -856,7 +865,7 @@ msgstr "Journal Nginx"
 msgid "Nginx Access Log Path"
 msgstr "Chemin du journal d'accès Nginx"
 
-#: src/views/domain/DomainEdit.vue:223
+#: src/views/domain/DomainEdit.vue:222
 msgid "Nginx Configuration Parse Error"
 msgstr "Erreur d'analyse de configuration Nginx"
 
@@ -868,7 +877,7 @@ msgstr "Contrôle Nginx"
 msgid "Nginx Error Log Path"
 msgstr "Chemin du journal des erreurs Nginx"
 
-#: src/routes/index.ts:129 src/views/nginx_log/NginxLog.vue:146
+#: src/routes/index.ts:128 src/views/nginx_log/NginxLog.vue:145
 msgid "Nginx Log"
 msgstr "Journal Nginx"
 
@@ -893,20 +902,20 @@ msgstr "Non"
 msgid "Node Secret"
 msgstr "Secret Jwt"
 
-#: src/routes/index.ts:207 src/routes/index.ts:209
+#: src/routes/index.ts:206 src/routes/index.ts:208
 msgid "Not Found"
 msgstr "Introuvable"
 
-#: src/views/domain/cert/CertInfo.vue:31
+#: src/views/domain/cert/CertInfo.vue:30
 msgid "Not Valid Before: %{date}"
 msgstr "Non valide avant : %{date}"
 
-#: src/views/cert/DNSCredential.vue:48
-#: src/views/domain/cert/components/AutoCertStepOne.vue:32
+#: src/views/certificate/DNSCredential.vue:48
+#: src/views/domain/cert/components/AutoCertStepOne.vue:38
 msgid "Note"
 msgstr "Note"
 
-#: src/views/domain/cert/components/ObtainCert.vue:249
+#: src/views/domain/cert/components/ObtainCert.vue:252
 msgid "Obtain certificate"
 msgstr "Obtenir un certificat"
 
@@ -925,15 +934,19 @@ msgstr ""
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:140
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:346
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:104
-#: src/views/domain/cert/components/ObtainCert.vue:209
-#: src/views/domain/components/Deploy.vue:24
-#: src/views/domain/components/RightSettings.vue:50
+#: src/views/domain/cert/components/ObtainCert.vue:210
+#: src/views/domain/components/Deploy.vue:23
+#: src/views/domain/components/RightSettings.vue:51
 #: src/views/domain/DomainList.vue:144
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:215
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:47
 msgid "OK"
 msgstr "OK"
 
+#: src/views/certificate/DNSCredential.vue:58
+msgid "Once the verification is complete, the records will be removed."
+msgstr ""
+
 #: src/components/NodeSelector/NodeSelector.vue:57
 #: src/components/NodeSelector/NodeSelector.vue:72
 #: src/views/dashboard/Environments.vue:100
@@ -941,7 +954,7 @@ msgstr "OK"
 msgid "Online"
 msgstr ""
 
-#: src/views/preference/Preference.vue:104
+#: src/views/preference/Preference.vue:102
 msgid "OpenAI"
 msgstr "OpenAI"
 
@@ -969,7 +982,7 @@ msgstr "Paramètres"
 msgid "Password"
 msgstr "Mot de passe"
 
-#: src/views/other/Install.vue:111
+#: src/views/other/Install.vue:113
 msgid "Password (*)"
 msgstr "Mot de passe (*)"
 
@@ -987,24 +1000,13 @@ msgstr "Erreur lors de la mise a niveau du core"
 msgid "Performing core upgrade"
 msgstr "Exécution de la mise à niveau du core"
 
-#: src/views/cert/DNSCredential.vue:52
-#, fuzzy
+#: src/views/certificate/DNSCredential.vue:52
 msgid ""
 "Please fill in the API authentication credentials provided by your DNS "
-"provider.\n"
-"We will add one or more TXT records to the DNS records of your domain for "
-"ownership verification.\n"
-"Once the verification is complete, the records will be removed.\n"
-"Please note that the time configurations below are all in seconds."
+"provider."
 msgstr ""
-"Veuillez remplir les identifiants d'authentification de l'API fournis par "
-"votre fournisseur DNS. Nous ajouterons un ou plusieurs enregistrements TXT "
-"aux enregistrements DNS de votre domaine pour la vérification de la "
-"propriété. Une fois la vérification terminée, les enregistrements seront "
-"supprimés. Veuillez noter que les configurations de temps ci-dessous sont "
-"toutes en secondes."
-
-#: src/views/domain/cert/components/AutoCertStepOne.vue:49
+
+#: src/views/domain/cert/components/AutoCertStepOne.vue:55
 #, fuzzy
 msgid ""
 "Please first add credentials in Certification > DNS Credentials, and then "
@@ -1023,18 +1025,23 @@ msgstr ""
 "Veuillez entrer le nom, il sera utilisé comme nom de fichier de la nouvelle "
 "configuration !"
 
-#: src/views/other/Install.vue:34
+#: src/views/other/Install.vue:35
 msgid "Please input your E-mail!"
 msgstr "Veuillez saisir votre e-mail !"
 
-#: src/views/other/Install.vue:46 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:47 src/views/other/Login.vue:39
 msgid "Please input your password!"
 msgstr "Veuillez saisir votre mot de passe !"
 
-#: src/views/other/Install.vue:40 src/views/other/Login.vue:35
+#: src/views/other/Install.vue:41 src/views/other/Login.vue:33
 msgid "Please input your username!"
 msgstr "Veuillez saisir votre nom d'utilisateur !"
 
+#: src/views/certificate/DNSCredential.vue:61
+msgid ""
+"Please note that the unit of time configurations below are all in seconds."
+msgstr ""
+
 #: src/views/domain/components/SiteDuplicate.vue:47
 msgid "Please select at least one node!"
 msgstr ""
@@ -1043,7 +1050,7 @@ msgstr ""
 msgid "Pre-release"
 msgstr ""
 
-#: src/routes/index.ts:168 src/views/preference/Preference.vue:87
+#: src/routes/index.ts:167 src/views/preference/Preference.vue:85
 msgid "Preference"
 msgstr "Préférence"
 
@@ -1064,7 +1071,7 @@ msgstr "Interdire la suppression de l'utilisateur par défaut"
 msgid "Project Team"
 msgstr "Groupe de projet"
 
-#: src/views/cert/DNSCredential.vue:21
+#: src/views/certificate/DNSCredential.vue:21
 msgid "Provider"
 msgstr "Fournisseur"
 
@@ -1134,9 +1141,9 @@ msgid "Running"
 msgstr "En cours d'éxécution"
 
 #: src/components/ChatGPT/ChatGPT.vue:259 src/views/config/ConfigEdit.vue:98
-#: src/views/domain/DomainEdit.vue:269
+#: src/views/domain/DomainEdit.vue:268
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:111
-#: src/views/preference/Preference.vue:115
+#: src/views/preference/Preference.vue:113
 msgid "Save"
 msgstr "Enregistrer"
 
@@ -1150,7 +1157,7 @@ msgid "Save error %{msg}"
 msgstr "Enregistrer l'erreur %{msg}"
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
-#: src/views/preference/Preference.vue:60
+#: src/views/preference/Preference.vue:58
 msgid "Save successfully"
 msgstr "Sauvegarde réussie"
 
@@ -1159,7 +1166,7 @@ msgid "Save Successfully"
 msgstr "Sauvegarde Réussie"
 
 #: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:41
-#: src/views/domain/DomainEdit.vue:155
+#: src/views/domain/DomainEdit.vue:154
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
 msgid "Saved successfully"
 msgstr "Enregistré avec succès"
@@ -1180,7 +1187,7 @@ msgstr "Envoyer"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:45
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:157
 #: src/views/config/ConfigEdit.vue:42 src/views/domain/DomainList.vue:79
-#: src/views/other/Install.vue:71 src/views/preference/Preference.vue:62
+#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:60
 #: src/views/system/Upgrade.vue:45
 msgid "Server error"
 msgstr "Erreur du serveur"
@@ -1189,11 +1196,11 @@ msgstr "Erreur du serveur"
 msgid "Server Info"
 msgstr "Informations sur le serveur"
 
-#: src/views/domain/cert/components/ObtainCert.vue:164
+#: src/views/domain/cert/components/ObtainCert.vue:165
 msgid "server_name not found in directives"
 msgstr "server_name introuvable dans les directives"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:22
+#: src/views/domain/cert/components/AutoCertStepOne.vue:27
 #: src/views/domain/DomainAdd.vue:119
 msgid "server_name parameter is required"
 msgstr "Le paramètre server_name est obligatoire"
@@ -1206,30 +1213,32 @@ msgstr "Définition des variables d'environnement"
 msgid "Single Directive"
 msgstr "Directive unique"
 
-#: src/routes/index.ts:143
+#: src/routes/index.ts:142
 msgid "Site Logs"
 msgstr "Journaux du site"
 
-#: src/routes/index.ts:67
+#: src/routes/index.ts:66
 msgid "Sites List"
 msgstr "Liste des sites"
 
-#: src/views/cert/Cert.vue:64
+#: src/views/certificate/Certificate.vue:164
+#, fuzzy
+msgid "SSL Certificate Content"
+msgstr "Contenu de la certification SSL"
+
+#: src/views/certificate/Certificate.vue:171
+#, fuzzy
+msgid "SSL Certificate Key Content"
+msgstr "Contenu de la clé de certification SSL"
+
+#: src/views/certificate/Certificate.vue:73
 msgid "SSL Certificate Key Path"
 msgstr "Chemin de la clé du certificat SSL"
 
-#: src/views/cert/Cert.vue:57
+#: src/views/certificate/Certificate.vue:65
 msgid "SSL Certificate Path"
 msgstr "Chemin du certificat SSL"
 
-#: src/views/cert/Cert.vue:139
-msgid "SSL Certification Content"
-msgstr "Contenu de la certification SSL"
-
-#: src/views/cert/Cert.vue:145
-msgid "SSL Certification Key Content"
-msgstr "Contenu de la clé de certification SSL"
-
 #: src/views/other/Login.vue:158
 #, fuzzy
 msgid "SSO Login"
@@ -1252,7 +1261,7 @@ msgstr "Arrêté"
 msgid "Storage"
 msgstr "Stockage"
 
-#: src/views/domain/cert/CertInfo.vue:25
+#: src/views/domain/cert/CertInfo.vue:24
 #, fuzzy
 msgid "Subject Name: %{subject}"
 msgstr "Nom du sujet : %{name}"
@@ -1270,7 +1279,7 @@ msgstr ""
 msgid "Switch to light theme"
 msgstr ""
 
-#: src/routes/index.ts:176
+#: src/routes/index.ts:175
 msgid "System"
 msgstr "Système"
 
@@ -1282,7 +1291,7 @@ msgstr "Tableau"
 msgid "Target"
 msgstr ""
 
-#: src/routes/index.ts:121 src/views/pty/Terminal.vue:95
+#: src/routes/index.ts:120 src/views/pty/Terminal.vue:95
 msgid "Terminal"
 msgstr "Terminal"
 
@@ -1290,7 +1299,7 @@ msgstr "Terminal"
 msgid "Terminal Start Command"
 msgstr "Commande de démarrage du terminal"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:41
+#: src/views/domain/cert/components/AutoCertStepOne.vue:47
 #, fuzzy
 msgid ""
 "The certificate for the domain will be checked 5 minutes, and will be "
@@ -1299,11 +1308,11 @@ msgstr ""
 "Le certificat du domaine sera vérifié toutes les heures et sera renouvelé "
 "s'il s'est écoulé plus d'une semaine depuis sa dernière émission."
 
-#: src/views/other/Install.vue:52
+#: src/views/other/Install.vue:53
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr "Le nom de fichier ne peut pas contenir les caractères suivants : %{c}"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:36
+#: src/views/domain/cert/components/AutoCertStepOne.vue:42
 #, fuzzy
 msgid ""
 "The server_name in the current configuration must be the domain name you "
@@ -1317,9 +1326,9 @@ msgstr ""
 msgid "The username or password is incorrect"
 msgstr "Le pseudo ou mot de passe est incorect"
 
-#: src/views/cert/Cert.vue:102
+#: src/views/certificate/Certificate.vue:115
 #, fuzzy
-msgid "This auto-cert item is invalid, please remove it."
+msgid "This Auto Cert item is invalid, please remove it."
 msgstr ""
 "Cet élément de certification automatique n'est pas valide, veuillez le "
 "supprimer."
@@ -1344,9 +1353,10 @@ msgstr ""
 msgid "Type"
 msgstr "Type"
 
-#: src/views/cert/Cert.vue:71 src/views/cert/DNSCredential.vue:26
-#: src/views/config/config.ts:29 src/views/config/ConfigEdit.vue:123
-#: src/views/domain/components/RightSettings.vue:82
+#: src/views/certificate/Certificate.vue:81
+#: src/views/certificate/DNSCredential.vue:26 src/views/config/config.ts:29
+#: src/views/config/ConfigEdit.vue:123
+#: src/views/domain/components/RightSettings.vue:84
 #: src/views/domain/DomainList.vue:44 src/views/environment/Environment.vue:98
 #: src/views/user/User.vue:40
 msgid "Updated at"
@@ -1356,7 +1366,7 @@ msgstr "Mis à jour le"
 msgid "Updated successfully"
 msgstr "Mis à jour avec succés"
 
-#: src/routes/index.ts:187 src/views/system/Upgrade.vue:143
+#: src/routes/index.ts:186 src/views/system/Upgrade.vue:143
 #: src/views/system/Upgrade.vue:235
 msgid "Upgrade"
 msgstr "Mettre à niveau"
@@ -1386,7 +1396,7 @@ msgstr "Nom d'utilisateur"
 msgid "Username"
 msgstr "Nom d'utilisateur"
 
-#: src/views/other/Install.vue:101
+#: src/views/other/Install.vue:103
 msgid "Username (*)"
 msgstr "Nom d'utilisateur (*)"
 
@@ -1402,13 +1412,19 @@ msgstr "Utilisation du fournisseur de challenge HTTP01"
 msgid "View"
 msgstr "Voir"
 
-#: src/views/config/InspectConfig.vue:37
-#: src/views/domain/cert/components/AutoCertStepOne.vue:16
+#: src/views/config/InspectConfig.vue:36
+#: src/views/domain/cert/components/AutoCertStepOne.vue:21
 #: src/views/domain/DomainAdd.vue:114
 msgid "Warning"
 msgstr "Avertissement"
 
-#: src/views/domain/cert/components/ObtainCert.vue:207
+#: src/views/certificate/DNSCredential.vue:55
+msgid ""
+"We will add one or more TXT records to the DNS records of your domain for "
+"ownership verification."
+msgstr ""
+
+#: src/views/domain/cert/components/ObtainCert.vue:208
 msgid ""
 "We will remove the HTTPChallenge configuration from this file and reload the "
 "Nginx. Are you sure you want to continue?"
@@ -1442,6 +1458,30 @@ msgstr "Vous utilisez la dernière version"
 msgid "You can check Nginx UI upgrade at this page."
 msgstr "Vous pouvez vérifier la mise à niveau de Nginx UI sur cette page."
 
+#~ msgid "Auto cert is enabled, please do not modify this certification."
+#~ msgstr ""
+#~ "La certification automatique est activée, veuillez ne pas modifier cette "
+#~ "certification."
+
+#, fuzzy
+#~ msgid ""
+#~ "Please fill in the API authentication credentials provided by your DNS "
+#~ "provider.\n"
+#~ "We will add one or more TXT records to the DNS records of your domain for "
+#~ "ownership verification.\n"
+#~ "Once the verification is complete, the records will be removed.\n"
+#~ "Please note that the unit of time configurations below are all in seconds."
+#~ msgstr ""
+#~ "Veuillez remplir les identifiants d'authentification de l'API fournis par "
+#~ "votre fournisseur DNS. Nous ajouterons un ou plusieurs enregistrements "
+#~ "TXT aux enregistrements DNS de votre domaine pour la vérification de la "
+#~ "propriété. Une fois la vérification terminée, les enregistrements seront "
+#~ "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}"
 

+ 174 - 164
app/src/language/messages.pot

@@ -2,21 +2,17 @@ msgid ""
 msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 
-#: src/views/domain/cert/CertInfo.vue:28
-msgid " Expiration Date: %{date}"
-msgstr ""
-
-#: src/routes/index.ts:183
+#: src/routes/index.ts:182
 msgid "About"
 msgstr ""
 
-#: src/routes/index.ts:135
+#: src/routes/index.ts:134
 #: src/views/domain/ngx_conf/LogEntry.vue:78
 msgid "Access Logs"
 msgstr ""
 
-#: src/views/cert/Cert.vue:77
-#: src/views/cert/DNSCredential.vue:32
+#: src/views/certificate/Certificate.vue:87
+#: src/views/certificate/DNSCredential.vue:32
 #: src/views/config/config.ts:36
 #: src/views/domain/DomainList.vue:50
 #: src/views/environment/Environment.vue:105
@@ -27,7 +23,7 @@ msgstr ""
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:114
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:115
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:307
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:308
 msgid "Add"
 msgstr ""
 
@@ -40,16 +36,16 @@ msgstr ""
 msgid "Add Location"
 msgstr ""
 
-#: src/routes/index.ts:71
+#: src/routes/index.ts:70
 #: src/views/domain/DomainAdd.vue:91
 msgid "Add Site"
 msgstr ""
 
-#: src/views/cert/DNSChallenge.vue:95
+#: src/views/certificate/DNSChallenge.vue:95
 msgid "Additional"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:205
+#: src/views/domain/DomainEdit.vue:204
 msgid "Advance Mode"
 msgstr ""
 
@@ -99,35 +95,35 @@ msgstr ""
 msgid "Author"
 msgstr ""
 
-#: src/views/cert/Cert.vue:38
+#: src/views/certificate/Certificate.vue:46
 #: src/views/domain/cert/ChangeCert.vue:37
 msgid "Auto Cert"
 msgstr ""
 
-#: src/views/cert/Cert.vue:92
-msgid "Auto cert is enabled, please do not modify this certification."
+#: src/views/certificate/Certificate.vue:105
+msgid "Auto Cert is enabled"
 msgstr ""
 
-#: src/views/nginx_log/NginxLog.vue:150
-msgid "Auto Refresh"
+#: src/views/certificate/Certificate.vue:135
+msgid "Auto Cert Log"
 msgstr ""
 
-#: src/views/cert/Cert.vue:122
-msgid "Auto-Cert Log"
+#: src/views/nginx_log/NginxLog.vue:149
+msgid "Auto Refresh"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:125
+#: src/views/domain/cert/components/ObtainCert.vue:126
 msgid "Auto-renewal disabled for %{name}"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:118
+#: src/views/domain/cert/components/ObtainCert.vue:119
 msgid "Auto-renewal enabled for %{name}"
 msgstr ""
 
 #: src/views/config/Config.vue:75
 #: src/views/config/ConfigEdit.vue:89
-#: src/views/domain/DomainEdit.vue:262
-#: src/views/nginx_log/NginxLog.vue:171
+#: src/views/domain/DomainEdit.vue:261
+#: src/views/nginx_log/NginxLog.vue:170
 msgid "Back"
 msgstr ""
 
@@ -140,12 +136,12 @@ msgid "Base information"
 msgstr ""
 
 #: src/views/config/ConfigEdit.vue:117
-#: src/views/domain/components/RightSettings.vue:71
-#: src/views/preference/Preference.vue:92
+#: src/views/domain/components/RightSettings.vue:73
+#: src/views/preference/Preference.vue:90
 msgid "Basic"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:208
+#: src/views/domain/DomainEdit.vue:207
 msgid "Basic Mode"
 msgstr ""
 
@@ -166,37 +162,38 @@ msgstr ""
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:58
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:139
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
-#: src/views/domain/cert/components/ObtainCert.vue:210
-#: src/views/domain/components/Deploy.vue:25
-#: src/views/domain/components/RightSettings.vue:51
+#: src/views/domain/cert/components/ObtainCert.vue:211
+#: src/views/domain/components/Deploy.vue:24
+#: src/views/domain/components/RightSettings.vue:52
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:216
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:48
 msgid "Cancel"
 msgstr ""
 
-#: src/views/domain/cert/CertInfo.vue:36
+#: src/views/domain/cert/CertInfo.vue:35
 msgid "Certificate has expired"
 msgstr ""
 
-#: src/views/domain/cert/CertInfo.vue:40
+#: src/views/domain/cert/CertInfo.vue:39
 msgid "Certificate is valid"
 msgstr ""
 
-#: src/views/cert/Cert.vue:132
+#: src/views/certificate/Certificate.vue:145
 #: src/views/domain/cert/Cert.vue:35
 msgid "Certificate Status"
 msgstr ""
 
-#: src/routes/index.ts:101
-#: src/views/cert/Cert.vue:84
-msgid "Certification"
+#: src/routes/index.ts:100
+#: src/views/certificate/Certificate.vue:96
+msgid "Certificates"
 msgstr ""
 
-#: src/routes/index.ts:109
-msgid "Certification List"
+#: src/routes/index.ts:108
+msgid "Certificates List"
 msgstr ""
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:57
+#: src/views/certificate/Certificate.vue:150
+#: src/views/domain/cert/components/AutoCertStepOne.vue:63
 msgid "Challenge Method"
 msgstr ""
 
@@ -232,11 +229,11 @@ 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
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:283
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:284
 msgid "Comments"
 msgstr ""
 
-#: src/views/cert/Cert.vue:33
+#: src/views/certificate/Certificate.vue:41
 msgid "Config Name"
 msgstr ""
 
@@ -244,7 +241,7 @@ msgstr ""
 msgid "Config Templates"
 msgstr ""
 
-#: src/views/config/InspectConfig.vue:31
+#: src/views/config/InspectConfig.vue:30
 msgid "Configuration file is test successful"
 msgstr ""
 
@@ -298,7 +295,7 @@ msgstr ""
 msgid "Credential"
 msgstr ""
 
-#: src/views/cert/DNSChallenge.vue:83
+#: src/views/certificate/DNSChallenge.vue:83
 msgid "Credentials"
 msgstr ""
 
@@ -307,7 +304,7 @@ msgid "Current Version"
 msgstr ""
 
 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:122
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:240
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:241
 msgid "Custom"
 msgstr ""
 
@@ -315,13 +312,13 @@ msgstr ""
 msgid "Dashboard"
 msgstr ""
 
-#: src/views/other/Install.vue:122
+#: src/views/other/Install.vue:124
 msgid "Database (Optional, default: database)"
 msgstr ""
 
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:354
 #: src/views/domain/DomainList.vue:153
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:258
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:259
 msgid "Delete"
 msgstr ""
 
@@ -334,19 +331,19 @@ msgid "Deleted successfully"
 msgstr ""
 
 #: src/views/domain/components/Deploy.vue:109
-#: src/views/domain/components/RightSettings.vue:89
+#: src/views/domain/components/RightSettings.vue:91
 msgid "Deploy"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:67
+#: src/views/domain/components/Deploy.vue:66
 msgid "Deploy %{conf_name} to %{node_name} failed"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:41
+#: src/views/domain/components/Deploy.vue:40
 msgid "Deploy %{conf_name} to %{node_name} successfully"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:39
+#: src/views/domain/components/Deploy.vue:38
 msgid "Deploy successfully"
 msgstr ""
 
@@ -375,18 +372,18 @@ msgstr ""
 msgid "Disable"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:127
+#: src/views/domain/cert/components/ObtainCert.vue:128
 msgid "Disable auto-renewal failed for %{name}"
 msgstr ""
 
-#: src/views/cert/Cert.vue:49
+#: src/views/certificate/Certificate.vue:57
 #: src/views/domain/cert/ChangeCert.vue:48
-#: src/views/domain/DomainEdit.vue:191
+#: src/views/domain/DomainEdit.vue:190
 #: src/views/domain/DomainList.vue:123
 msgid "Disabled"
 msgstr ""
 
-#: src/views/domain/components/RightSettings.vue:38
+#: src/views/domain/components/RightSettings.vue:39
 #: src/views/domain/DomainList.vue:67
 msgid "Disabled successfully"
 msgstr ""
@@ -395,35 +392,35 @@ msgstr ""
 msgid "Disk IO"
 msgstr ""
 
-#: src/routes/index.ts:114
-#: src/views/cert/DNSCredential.vue:39
+#: src/routes/index.ts:113
+#: src/views/certificate/DNSCredential.vue:39
 msgid "DNS Credentials"
 msgstr ""
 
-#: src/views/cert/DNSChallenge.vue:74
+#: src/views/certificate/DNSChallenge.vue:74
 #: src/views/domain/cert/components/DNSChallenge.vue:79
 msgid "DNS Provider"
 msgstr ""
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:63
+#: src/views/domain/cert/components/AutoCertStepOne.vue:69
 msgid "DNS01"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:20
+#: src/views/domain/components/Deploy.vue:19
 msgid "Do you want to deploy this file to remote server?"
 msgid_plural "Do you want to deploy this file to remote servers?"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:206
+#: src/views/domain/cert/components/ObtainCert.vue:207
 msgid "Do you want to disable auto-cert renewal?"
 msgstr ""
 
-#: src/views/domain/components/RightSettings.vue:47
+#: src/views/domain/components/RightSettings.vue:48
 msgid "Do you want to disable this site?"
 msgstr ""
 
-#: src/views/domain/components/RightSettings.vue:47
+#: src/views/domain/components/RightSettings.vue:48
 msgid "Do you want to enable this site?"
 msgstr ""
 
@@ -439,8 +436,8 @@ msgstr ""
 msgid "Domain Config Created Successfully"
 msgstr ""
 
-#: src/views/cert/Cert.vue:112
-msgid "Domains list is empty, try to reopen auto-cert for %{config}"
+#: src/views/certificate/Certificate.vue:125
+msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr ""
 
 #: src/language/constants.ts:29
@@ -476,20 +473,20 @@ msgstr ""
 msgid "Duplicate to local successfully"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:180
+#: src/views/domain/DomainEdit.vue:179
 msgid "Edit %{n}"
 msgstr ""
 
-#: src/routes/index.ts:93
+#: src/routes/index.ts:92
 #: src/views/config/ConfigEdit.vue:83
 msgid "Edit Configuration"
 msgstr ""
 
-#: src/routes/index.ts:75
+#: src/routes/index.ts:74
 msgid "Edit Site"
 msgstr ""
 
-#: src/views/other/Install.vue:91
+#: src/views/other/Install.vue:93
 msgid "Email (*)"
 msgstr ""
 
@@ -497,15 +494,15 @@ msgstr ""
 msgid "Enable"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:56
+#: src/views/domain/components/Deploy.vue:55
 msgid "Enable %{conf_name} in %{node_name} failed"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:50
+#: src/views/domain/components/Deploy.vue:49
 msgid "Enable %{conf_name} in %{node_name} successfully"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:120
+#: src/views/domain/cert/components/ObtainCert.vue:121
 msgid "Enable auto-renewal failed for %{name}"
 msgstr ""
 
@@ -513,24 +510,24 @@ msgstr ""
 msgid "Enable failed"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:48
+#: src/views/domain/components/Deploy.vue:47
 msgid "Enable successfully"
 msgstr ""
 
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:235
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:236
 msgid "Enable TLS"
 msgstr ""
 
-#: src/views/cert/Cert.vue:45
+#: src/views/certificate/Certificate.vue:53
 #: src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/components/Deploy.vue:89
-#: src/views/domain/components/RightSettings.vue:73
-#: src/views/domain/DomainEdit.vue:185
+#: src/views/domain/components/RightSettings.vue:75
+#: src/views/domain/DomainEdit.vue:184
 #: src/views/domain/DomainList.vue:131
 msgid "Enabled"
 msgstr ""
 
-#: src/views/domain/components/RightSettings.vue:29
+#: src/views/domain/components/RightSettings.vue:30
 #: src/views/domain/components/SiteDuplicate.vue:100
 #: src/views/domain/DomainAdd.vue:45
 #: src/views/domain/DomainList.vue:58
@@ -541,7 +538,7 @@ msgstr ""
 msgid "Encrypt website with Let's Encrypt"
 msgstr ""
 
-#: src/routes/index.ts:152
+#: src/routes/index.ts:151
 #: src/views/environment/Environment.vue:113
 msgid "Environment"
 msgstr ""
@@ -550,11 +547,11 @@ msgstr ""
 msgid "Environments"
 msgstr ""
 
-#: src/views/config/InspectConfig.vue:48
+#: src/views/config/InspectConfig.vue:47
 msgid "Error"
 msgstr ""
 
-#: src/routes/index.ts:139
+#: src/routes/index.ts:138
 #: src/views/domain/ngx_conf/LogEntry.vue:86
 msgid "Error Logs"
 msgstr ""
@@ -563,17 +560,21 @@ msgstr ""
 msgid "Executable Path"
 msgstr ""
 
+#: src/views/domain/cert/CertInfo.vue:27
+msgid "Expired At: %{date}"
+msgstr ""
+
 #: src/components/StdDesign/StdDataDisplay/methods/exportCsv.ts:68
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:296
 msgid "Export"
 msgstr ""
 
-#: src/views/domain/components/RightSettings.vue:41
+#: src/views/domain/components/RightSettings.vue:42
 #: src/views/domain/DomainList.vue:70
 msgid "Failed to disable %{msg}"
 msgstr ""
 
-#: src/views/domain/components/RightSettings.vue:32
+#: src/views/domain/components/RightSettings.vue:33
 #: src/views/domain/DomainList.vue:61
 msgid "Failed to enable %{msg}"
 msgstr ""
@@ -582,7 +583,7 @@ msgstr ""
 msgid "Failed to get certificate information"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:139
+#: src/views/domain/DomainEdit.vue:138
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr ""
 
@@ -598,7 +599,7 @@ msgstr ""
 msgid "File Not Found"
 msgstr ""
 
-#: src/views/nginx_log/NginxLog.vue:153
+#: src/views/nginx_log/NginxLog.vue:152
 msgid "Filter"
 msgstr ""
 
@@ -631,7 +632,7 @@ msgstr ""
 msgid "Get release information error"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:63
+#: src/views/domain/cert/components/ObtainCert.vue:64
 msgid "Getting the certificate, please wait..."
 msgstr ""
 
@@ -671,7 +672,7 @@ msgstr ""
 msgid "HTTP Port"
 msgstr ""
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:60
+#: src/views/domain/cert/components/AutoCertStepOne.vue:66
 msgid "HTTP01"
 msgstr ""
 
@@ -683,16 +684,16 @@ msgstr ""
 msgid "Initialing core upgrader"
 msgstr ""
 
-#: src/routes/index.ts:195
-#: src/views/other/Install.vue:137
+#: src/routes/index.ts:194
+#: src/views/other/Install.vue:139
 msgid "Install"
 msgstr ""
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:68
 msgid "Install successfully"
 msgstr ""
 
-#: src/views/domain/cert/CertInfo.vue:22
+#: src/views/domain/cert/CertInfo.vue:21
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr ""
 
@@ -741,13 +742,13 @@ msgstr ""
 msgid "Locations"
 msgstr ""
 
-#: src/routes/index.ts:201
+#: src/routes/index.ts:200
 #: src/views/other/Login.vue:147
 msgid "Login"
 msgstr ""
 
-#: src/views/other/Login.vue:53
-#: src/views/other/Login.vue:99
+#: src/views/other/Login.vue:51
+#: src/views/other/Login.vue:97
 msgid "Login successful"
 msgstr ""
 
@@ -755,20 +756,20 @@ msgstr ""
 msgid "Logout successful"
 msgstr ""
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:45
+#: src/views/domain/cert/components/AutoCertStepOne.vue:51
 msgid "Make sure you have configured a reverse proxy for .well-known directory to HTTPChallengePort before obtaining the certificate."
 msgstr ""
 
-#: src/routes/index.ts:84
+#: src/routes/index.ts:83
 msgid "Manage Configs"
 msgstr ""
 
-#: src/routes/index.ts:59
+#: src/routes/index.ts:58
 #: src/views/domain/DomainList.vue:102
 msgid "Manage Sites"
 msgstr ""
 
-#: src/routes/index.ts:160
+#: src/routes/index.ts:159
 #: src/views/user/User.vue:53
 msgid "Manage Users"
 msgstr ""
@@ -784,6 +785,7 @@ msgstr ""
 #: src/components/ChatGPT/ChatGPT.vue:256
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
+#: src/views/certificate/Certificate.vue:156
 msgid "Modify"
 msgstr ""
 
@@ -795,11 +797,11 @@ msgstr ""
 msgid "Multi-line Directive"
 msgstr ""
 
-#: src/views/cert/Cert.vue:17
-#: src/views/cert/DNSCredential.vue:13
+#: src/views/certificate/Certificate.vue:24
+#: 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:79
+#: src/views/domain/components/RightSettings.vue:81
 #: src/views/domain/components/SiteDuplicate.vue:135
 #: src/views/domain/DomainList.vue:16
 #: src/views/environment/Environment.vue:15
@@ -826,12 +828,12 @@ msgstr ""
 msgid "New version released"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:278
+#: src/views/domain/cert/components/ObtainCert.vue:281
 #: src/views/domain/DomainAdd.vue:140
 msgid "Next"
 msgstr ""
 
-#: src/views/preference/Preference.vue:98
+#: src/views/preference/Preference.vue:96
 msgid "Nginx"
 msgstr ""
 
@@ -839,7 +841,7 @@ msgstr ""
 msgid "Nginx Access Log Path"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:223
+#: src/views/domain/DomainEdit.vue:222
 msgid "Nginx Configuration Parse Error"
 msgstr ""
 
@@ -851,8 +853,8 @@ msgstr ""
 msgid "Nginx Error Log Path"
 msgstr ""
 
-#: src/routes/index.ts:129
-#: src/views/nginx_log/NginxLog.vue:146
+#: src/routes/index.ts:128
+#: src/views/nginx_log/NginxLog.vue:145
 msgid "Nginx Log"
 msgstr ""
 
@@ -876,21 +878,21 @@ msgstr ""
 msgid "Node Secret"
 msgstr ""
 
-#: src/routes/index.ts:207
-#: src/routes/index.ts:209
+#: src/routes/index.ts:206
+#: src/routes/index.ts:208
 msgid "Not Found"
 msgstr ""
 
-#: src/views/domain/cert/CertInfo.vue:31
+#: src/views/domain/cert/CertInfo.vue:30
 msgid "Not Valid Before: %{date}"
 msgstr ""
 
-#: src/views/cert/DNSCredential.vue:48
-#: src/views/domain/cert/components/AutoCertStepOne.vue:32
+#: src/views/certificate/DNSCredential.vue:48
+#: src/views/domain/cert/components/AutoCertStepOne.vue:38
 msgid "Note"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:249
+#: src/views/domain/cert/components/ObtainCert.vue:252
 msgid "Obtain certificate"
 msgstr ""
 
@@ -909,15 +911,19 @@ msgstr ""
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:140
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:346
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:104
-#: src/views/domain/cert/components/ObtainCert.vue:209
-#: src/views/domain/components/Deploy.vue:24
-#: src/views/domain/components/RightSettings.vue:50
+#: src/views/domain/cert/components/ObtainCert.vue:210
+#: src/views/domain/components/Deploy.vue:23
+#: src/views/domain/components/RightSettings.vue:51
 #: src/views/domain/DomainList.vue:144
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:215
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:47
 msgid "OK"
 msgstr ""
 
+#: src/views/certificate/DNSCredential.vue:58
+msgid "Once the verification is complete, the records will be removed."
+msgstr ""
+
 #: src/components/NodeSelector/NodeSelector.vue:57
 #: src/components/NodeSelector/NodeSelector.vue:72
 #: src/views/dashboard/Environments.vue:100
@@ -925,7 +931,7 @@ msgstr ""
 msgid "Online"
 msgstr ""
 
-#: src/views/preference/Preference.vue:104
+#: src/views/preference/Preference.vue:102
 msgid "OpenAI"
 msgstr ""
 
@@ -954,7 +960,7 @@ msgstr ""
 msgid "Password"
 msgstr ""
 
-#: src/views/other/Install.vue:111
+#: src/views/other/Install.vue:113
 msgid "Password (*)"
 msgstr ""
 
@@ -972,15 +978,11 @@ msgstr ""
 msgid "Performing core upgrade"
 msgstr ""
 
-#: src/views/cert/DNSCredential.vue:52
-msgid ""
-"Please fill in the API authentication credentials provided by your DNS provider.\n"
-"We will add one or more TXT records to the DNS records of your domain for ownership verification.\n"
-"Once the verification is complete, the records will be removed.\n"
-"Please note that the time configurations below are all in seconds."
+#: src/views/certificate/DNSCredential.vue:52
+msgid "Please fill in the API authentication credentials provided by your DNS provider."
 msgstr ""
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:49
+#: src/views/domain/cert/components/AutoCertStepOne.vue:55
 msgid "Please first add credentials in Certification > DNS Credentials, and then select one of the credentialsbelow to request the API of the DNS provider."
 msgstr ""
 
@@ -988,20 +990,24 @@ msgstr ""
 msgid "Please input name, this will be used as the filename of the new configuration!"
 msgstr ""
 
-#: src/views/other/Install.vue:34
+#: src/views/other/Install.vue:35
 msgid "Please input your E-mail!"
 msgstr ""
 
-#: src/views/other/Install.vue:46
-#: src/views/other/Login.vue:41
+#: src/views/other/Install.vue:47
+#: src/views/other/Login.vue:39
 msgid "Please input your password!"
 msgstr ""
 
-#: src/views/other/Install.vue:40
-#: src/views/other/Login.vue:35
+#: src/views/other/Install.vue:41
+#: src/views/other/Login.vue:33
 msgid "Please input your username!"
 msgstr ""
 
+#: src/views/certificate/DNSCredential.vue:61
+msgid "Please note that the unit of time configurations below are all in seconds."
+msgstr ""
+
 #: src/views/domain/components/SiteDuplicate.vue:47
 msgid "Please select at least one node!"
 msgstr ""
@@ -1011,8 +1017,8 @@ msgstr ""
 msgid "Pre-release"
 msgstr ""
 
-#: src/routes/index.ts:168
-#: src/views/preference/Preference.vue:87
+#: src/routes/index.ts:167
+#: src/views/preference/Preference.vue:85
 msgid "Preference"
 msgstr ""
 
@@ -1032,7 +1038,7 @@ msgstr ""
 msgid "Project Team"
 msgstr ""
 
-#: src/views/cert/DNSCredential.vue:21
+#: src/views/certificate/DNSCredential.vue:21
 msgid "Provider"
 msgstr ""
 
@@ -1101,9 +1107,9 @@ msgstr ""
 
 #: src/components/ChatGPT/ChatGPT.vue:259
 #: src/views/config/ConfigEdit.vue:98
-#: src/views/domain/DomainEdit.vue:269
+#: src/views/domain/DomainEdit.vue:268
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:111
-#: src/views/preference/Preference.vue:115
+#: src/views/preference/Preference.vue:113
 msgid "Save"
 msgstr ""
 
@@ -1118,7 +1124,7 @@ msgid "Save error %{msg}"
 msgstr ""
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
-#: src/views/preference/Preference.vue:60
+#: src/views/preference/Preference.vue:58
 msgid "Save successfully"
 msgstr ""
 
@@ -1128,7 +1134,7 @@ msgstr ""
 
 #: src/views/config/ConfigEdit.vue:57
 #: src/views/domain/DomainAdd.vue:41
-#: src/views/domain/DomainEdit.vue:155
+#: src/views/domain/DomainEdit.vue:154
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
 msgid "Saved successfully"
 msgstr ""
@@ -1150,8 +1156,8 @@ msgstr ""
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:157
 #: src/views/config/ConfigEdit.vue:42
 #: src/views/domain/DomainList.vue:79
-#: src/views/other/Install.vue:71
-#: src/views/preference/Preference.vue:62
+#: src/views/other/Install.vue:72
+#: src/views/preference/Preference.vue:60
 #: src/views/system/Upgrade.vue:45
 msgid "Server error"
 msgstr ""
@@ -1160,11 +1166,11 @@ msgstr ""
 msgid "Server Info"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:164
+#: src/views/domain/cert/components/ObtainCert.vue:165
 msgid "server_name not found in directives"
 msgstr ""
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:22
+#: src/views/domain/cert/components/AutoCertStepOne.vue:27
 #: src/views/domain/DomainAdd.vue:119
 msgid "server_name parameter is required"
 msgstr ""
@@ -1177,28 +1183,28 @@ msgstr ""
 msgid "Single Directive"
 msgstr ""
 
-#: src/routes/index.ts:143
+#: src/routes/index.ts:142
 msgid "Site Logs"
 msgstr ""
 
-#: src/routes/index.ts:67
+#: src/routes/index.ts:66
 msgid "Sites List"
 msgstr ""
 
-#: src/views/cert/Cert.vue:64
-msgid "SSL Certificate Key Path"
+#: src/views/certificate/Certificate.vue:164
+msgid "SSL Certificate Content"
 msgstr ""
 
-#: src/views/cert/Cert.vue:57
-msgid "SSL Certificate Path"
+#: src/views/certificate/Certificate.vue:171
+msgid "SSL Certificate Key Content"
 msgstr ""
 
-#: src/views/cert/Cert.vue:139
-msgid "SSL Certification Content"
+#: src/views/certificate/Certificate.vue:73
+msgid "SSL Certificate Key Path"
 msgstr ""
 
-#: src/views/cert/Cert.vue:145
-msgid "SSL Certification Key Content"
+#: src/views/certificate/Certificate.vue:65
+msgid "SSL Certificate Path"
 msgstr ""
 
 #: src/views/other/Login.vue:158
@@ -1223,7 +1229,7 @@ msgstr ""
 msgid "Storage"
 msgstr ""
 
-#: src/views/domain/cert/CertInfo.vue:25
+#: src/views/domain/cert/CertInfo.vue:24
 msgid "Subject Name: %{subject}"
 msgstr ""
 
@@ -1239,7 +1245,7 @@ msgstr ""
 msgid "Switch to light theme"
 msgstr ""
 
-#: src/routes/index.ts:176
+#: src/routes/index.ts:175
 msgid "System"
 msgstr ""
 
@@ -1251,7 +1257,7 @@ msgstr ""
 msgid "Target"
 msgstr ""
 
-#: src/routes/index.ts:121
+#: src/routes/index.ts:120
 #: src/views/pty/Terminal.vue:95
 msgid "Terminal"
 msgstr ""
@@ -1260,15 +1266,15 @@ msgstr ""
 msgid "Terminal Start Command"
 msgstr ""
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:41
+#: src/views/domain/cert/components/AutoCertStepOne.vue:47
 msgid "The certificate for the domain will be checked 5 minutes, and will be renewed if it has been more than 1 week since it was last issued."
 msgstr ""
 
-#: src/views/other/Install.vue:52
+#: src/views/other/Install.vue:53
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr ""
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:36
+#: src/views/domain/cert/components/AutoCertStepOne.vue:42
 msgid "The server_name in the current configuration must be the domain name you need to get the certificate, supportmultiple domains."
 msgstr ""
 
@@ -1276,8 +1282,8 @@ msgstr ""
 msgid "The username or password is incorrect"
 msgstr ""
 
-#: src/views/cert/Cert.vue:102
-msgid "This auto-cert item is invalid, please remove it."
+#: src/views/certificate/Certificate.vue:115
+msgid "This Auto Cert item is invalid, please remove it."
 msgstr ""
 
 #: src/components/StdDesign/StdDataEntry/StdFormItem.vue:31
@@ -1292,11 +1298,11 @@ msgstr ""
 msgid "Type"
 msgstr ""
 
-#: src/views/cert/Cert.vue:71
-#: src/views/cert/DNSCredential.vue:26
+#: src/views/certificate/Certificate.vue:81
+#: src/views/certificate/DNSCredential.vue:26
 #: src/views/config/config.ts:29
 #: src/views/config/ConfigEdit.vue:123
-#: src/views/domain/components/RightSettings.vue:82
+#: src/views/domain/components/RightSettings.vue:84
 #: src/views/domain/DomainList.vue:44
 #: src/views/environment/Environment.vue:98
 #: src/views/user/User.vue:40
@@ -1307,7 +1313,7 @@ msgstr ""
 msgid "Updated successfully"
 msgstr ""
 
-#: src/routes/index.ts:187
+#: src/routes/index.ts:186
 #: src/views/system/Upgrade.vue:143
 #: src/views/system/Upgrade.vue:235
 msgid "Upgrade"
@@ -1338,7 +1344,7 @@ msgstr ""
 msgid "Username"
 msgstr ""
 
-#: src/views/other/Install.vue:101
+#: src/views/other/Install.vue:103
 msgid "Username (*)"
 msgstr ""
 
@@ -1354,13 +1360,17 @@ msgstr ""
 msgid "View"
 msgstr ""
 
-#: src/views/config/InspectConfig.vue:37
-#: src/views/domain/cert/components/AutoCertStepOne.vue:16
+#: src/views/config/InspectConfig.vue:36
+#: src/views/domain/cert/components/AutoCertStepOne.vue:21
 #: src/views/domain/DomainAdd.vue:114
 msgid "Warning"
 msgstr ""
 
-#: src/views/domain/cert/components/ObtainCert.vue:207
+#: src/views/certificate/DNSCredential.vue:55
+msgid "We will add one or more TXT records to the DNS records of your domain for ownership verification."
+msgstr ""
+
+#: src/views/domain/cert/components/ObtainCert.vue:208
 msgid "We will remove the HTTPChallenge configuration from this file and reload the Nginx. Are you sure you want to continue?"
 msgstr ""
 

+ 192 - 162
app/src/language/ru_RU/app.po

@@ -9,29 +9,25 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/views/domain/cert/CertInfo.vue:28
-#, fuzzy
-msgid " Expiration Date: %{date}"
-msgstr "Дата окончания срока: %{date}"
-
-#: src/routes/index.ts:183
+#: src/routes/index.ts:182
 msgid "About"
 msgstr "О проекте"
 
-#: src/routes/index.ts:135 src/views/domain/ngx_conf/LogEntry.vue:78
+#: src/routes/index.ts:134 src/views/domain/ngx_conf/LogEntry.vue:78
 msgid "Access Logs"
 msgstr "Журнал доступа"
 
-#: src/views/cert/Cert.vue:77 src/views/cert/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/certificate/Certificate.vue:87
+#: 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
 msgid "Action"
 msgstr "Действие"
 
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:114
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:115
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:307
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:308
 msgid "Add"
 msgstr "Добавить"
 
@@ -44,16 +40,16 @@ msgstr "Добавить директиву ниже"
 msgid "Add Location"
 msgstr "Добавить Location"
 
-#: src/routes/index.ts:71 src/views/domain/DomainAdd.vue:91
+#: src/routes/index.ts:70 src/views/domain/DomainAdd.vue:91
 msgid "Add Site"
 msgstr "Добавть Сайт"
 
-#: src/views/cert/DNSChallenge.vue:95
+#: src/views/certificate/DNSChallenge.vue:95
 #, fuzzy
 msgid "Additional"
 msgstr "Дополнительно"
 
-#: src/views/domain/DomainEdit.vue:205
+#: src/views/domain/DomainEdit.vue:204
 msgid "Advance Mode"
 msgstr "Расширенный режим"
 
@@ -106,32 +102,35 @@ msgstr ""
 msgid "Author"
 msgstr "Автор"
 
-#: src/views/cert/Cert.vue:38 src/views/domain/cert/ChangeCert.vue:37
+#: src/views/certificate/Certificate.vue:46
+#: src/views/domain/cert/ChangeCert.vue:37
 msgid "Auto Cert"
 msgstr "Авто Сертификат"
 
-#: src/views/cert/Cert.vue:92
-msgid "Auto cert is enabled, please do not modify this certification."
-msgstr "Включено автомотическое получения сертификата. Не правте руками."
+#: src/views/certificate/Certificate.vue:105
+#, fuzzy
+msgid "Auto Cert is enabled"
+msgstr "Авто Сертификат"
+
+#: src/views/certificate/Certificate.vue:135
+#, fuzzy
+msgid "Auto Cert Log"
+msgstr "Логирование авто-сертификата"
 
-#: src/views/nginx_log/NginxLog.vue:150
+#: src/views/nginx_log/NginxLog.vue:149
 msgid "Auto Refresh"
 msgstr "Автообновление"
 
-#: src/views/cert/Cert.vue:122
-msgid "Auto-Cert Log"
-msgstr "Логирование авто-сертификата"
-
-#: src/views/domain/cert/components/ObtainCert.vue:125
+#: src/views/domain/cert/components/ObtainCert.vue:126
 msgid "Auto-renewal disabled for %{name}"
 msgstr "Автообновление отключено для %{name}"
 
-#: src/views/domain/cert/components/ObtainCert.vue:118
+#: src/views/domain/cert/components/ObtainCert.vue:119
 msgid "Auto-renewal enabled for %{name}"
 msgstr "Автообновление включено для %{name}"
 
 #: src/views/config/Config.vue:75 src/views/config/ConfigEdit.vue:89
-#: src/views/domain/DomainEdit.vue:262 src/views/nginx_log/NginxLog.vue:171
+#: src/views/domain/DomainEdit.vue:261 src/views/nginx_log/NginxLog.vue:170
 msgid "Back"
 msgstr "Назад"
 
@@ -145,13 +144,13 @@ msgid "Base information"
 msgstr "Основная информация"
 
 #: src/views/config/ConfigEdit.vue:117
-#: src/views/domain/components/RightSettings.vue:71
-#: src/views/preference/Preference.vue:92
+#: src/views/domain/components/RightSettings.vue:73
+#: src/views/preference/Preference.vue:90
 #, fuzzy
 msgid "Basic"
 msgstr "Простой режим"
 
-#: src/views/domain/DomainEdit.vue:208
+#: src/views/domain/DomainEdit.vue:207
 msgid "Basic Mode"
 msgstr "Простой режим"
 
@@ -173,37 +172,38 @@ msgstr ""
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:58
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:139
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
-#: src/views/domain/cert/components/ObtainCert.vue:210
-#: src/views/domain/components/Deploy.vue:25
-#: src/views/domain/components/RightSettings.vue:51
+#: src/views/domain/cert/components/ObtainCert.vue:211
+#: src/views/domain/components/Deploy.vue:24
+#: src/views/domain/components/RightSettings.vue:52
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:216
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:48
 msgid "Cancel"
 msgstr "Отмена"
 
-#: src/views/domain/cert/CertInfo.vue:36
+#: src/views/domain/cert/CertInfo.vue:35
 msgid "Certificate has expired"
 msgstr "Срок действия сертификата истек"
 
-#: src/views/domain/cert/CertInfo.vue:40
+#: src/views/domain/cert/CertInfo.vue:39
 msgid "Certificate is valid"
 msgstr "Сертификат действителен"
 
-#: src/views/cert/Cert.vue:132 src/views/domain/cert/Cert.vue:35
+#: src/views/certificate/Certificate.vue:145 src/views/domain/cert/Cert.vue:35
 msgid "Certificate Status"
 msgstr "Статус сертификата"
 
-#: src/routes/index.ts:101 src/views/cert/Cert.vue:84
+#: src/routes/index.ts:100 src/views/certificate/Certificate.vue:96
 #, fuzzy
-msgid "Certification"
-msgstr "Сертификат"
+msgid "Certificates"
+msgstr "Статус сертификата"
 
-#: src/routes/index.ts:109
+#: src/routes/index.ts:108
 #, fuzzy
-msgid "Certification List"
+msgid "Certificates List"
 msgstr "Список"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:57
+#: src/views/certificate/Certificate.vue:150
+#: src/views/domain/cert/components/AutoCertStepOne.vue:63
 msgid "Challenge Method"
 msgstr "Метод Challenge"
 
@@ -240,11 +240,11 @@ 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
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:283
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:284
 msgid "Comments"
 msgstr "Комментарии"
 
-#: src/views/cert/Cert.vue:33
+#: src/views/certificate/Certificate.vue:41
 #, fuzzy
 msgid "Config Name"
 msgstr "Название конфигурации"
@@ -254,7 +254,7 @@ msgstr "Название конфигурации"
 msgid "Config Templates"
 msgstr "Шаблоны конфигураций"
 
-#: src/views/config/InspectConfig.vue:31
+#: src/views/config/InspectConfig.vue:30
 msgid "Configuration file is test successful"
 msgstr "Проверка конфигурации успешна"
 
@@ -308,7 +308,7 @@ msgstr ""
 msgid "Credential"
 msgstr "Учетные данные"
 
-#: src/views/cert/DNSChallenge.vue:83
+#: src/views/certificate/DNSChallenge.vue:83
 msgid "Credentials"
 msgstr "Учетные данные"
 
@@ -317,7 +317,7 @@ msgid "Current Version"
 msgstr "Текущяя версия"
 
 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:122
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:240
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:241
 msgid "Custom"
 msgstr "Пользовательский"
 
@@ -325,13 +325,13 @@ msgstr "Пользовательский"
 msgid "Dashboard"
 msgstr "Доска"
 
-#: src/views/other/Install.vue:122
+#: src/views/other/Install.vue:124
 msgid "Database (Optional, default: database)"
 msgstr "База данных (Опционально, по умолчанию: database)"
 
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:354
 #: src/views/domain/DomainList.vue:153
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:258
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:259
 msgid "Delete"
 msgstr "Удалить"
 
@@ -345,19 +345,19 @@ msgid "Deleted successfully"
 msgstr "Отключено успешно"
 
 #: src/views/domain/components/Deploy.vue:109
-#: src/views/domain/components/RightSettings.vue:89
+#: src/views/domain/components/RightSettings.vue:91
 msgid "Deploy"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:67
+#: src/views/domain/components/Deploy.vue:66
 msgid "Deploy %{conf_name} to %{node_name} failed"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:41
+#: src/views/domain/components/Deploy.vue:40
 msgid "Deploy %{conf_name} to %{node_name} successfully"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:39
+#: src/views/domain/components/Deploy.vue:38
 #, fuzzy
 msgid "Deploy successfully"
 msgstr "Saved successfully"
@@ -389,16 +389,17 @@ msgstr "Деректива"
 msgid "Disable"
 msgstr "Отключить"
 
-#: src/views/domain/cert/components/ObtainCert.vue:127
+#: src/views/domain/cert/components/ObtainCert.vue:128
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "Не удалось отключить автоматическое продление для %{name}"
 
-#: src/views/cert/Cert.vue:49 src/views/domain/cert/ChangeCert.vue:48
-#: src/views/domain/DomainEdit.vue:191 src/views/domain/DomainList.vue:123
+#: src/views/certificate/Certificate.vue:57
+#: src/views/domain/cert/ChangeCert.vue:48 src/views/domain/DomainEdit.vue:190
+#: src/views/domain/DomainList.vue:123
 msgid "Disabled"
 msgstr "Отключено"
 
-#: src/views/domain/components/RightSettings.vue:38
+#: src/views/domain/components/RightSettings.vue:39
 #: src/views/domain/DomainList.vue:67
 msgid "Disabled successfully"
 msgstr "Отключено успешно"
@@ -407,36 +408,36 @@ msgstr "Отключено успешно"
 msgid "Disk IO"
 msgstr "Нагрузка на Диск IO"
 
-#: src/routes/index.ts:114 src/views/cert/DNSCredential.vue:39
+#: src/routes/index.ts:113 src/views/certificate/DNSCredential.vue:39
 msgid "DNS Credentials"
 msgstr ""
 
-#: src/views/cert/DNSChallenge.vue:74
+#: src/views/certificate/DNSChallenge.vue:74
 #: src/views/domain/cert/components/DNSChallenge.vue:79
 msgid "DNS Provider"
 msgstr ""
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:63
+#: src/views/domain/cert/components/AutoCertStepOne.vue:69
 msgid "DNS01"
 msgstr ""
 
-#: src/views/domain/components/Deploy.vue:20
+#: src/views/domain/components/Deploy.vue:19
 #, fuzzy
 msgid "Do you want to deploy this file to remote server?"
 msgid_plural "Do you want to deploy this file to remote servers?"
 msgstr[0] "Are you sure you want to remove this directive?"
 msgstr[1] "Are you sure you want to remove this directive?"
 
-#: src/views/domain/cert/components/ObtainCert.vue:206
+#: src/views/domain/cert/components/ObtainCert.vue:207
 msgid "Do you want to disable auto-cert renewal?"
 msgstr "Вы хотите отключить автоматическое обновление сертификата?"
 
-#: src/views/domain/components/RightSettings.vue:47
+#: src/views/domain/components/RightSettings.vue:48
 #, fuzzy
 msgid "Do you want to disable this site?"
 msgstr "Вы хотите отключить этот сайт?"
 
-#: src/views/domain/components/RightSettings.vue:47
+#: src/views/domain/components/RightSettings.vue:48
 #, fuzzy
 msgid "Do you want to enable this site?"
 msgstr "Вы хотите включить этот сайт?"
@@ -455,8 +456,9 @@ msgstr "Вы хотите удалить этот сервер?"
 msgid "Domain Config Created Successfully"
 msgstr "Конфигурация домена успешно создана"
 
-#: src/views/cert/Cert.vue:112
-msgid "Domains list is empty, try to reopen auto-cert for %{config}"
+#: src/views/certificate/Certificate.vue:125
+#, fuzzy
+msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr ""
 "Список доменов пуст, попробуйте заново открыть авто-сертификат для %{config}"
 
@@ -497,19 +499,19 @@ msgstr "Продублированно"
 msgid "Duplicate to local successfully"
 msgstr "Saved successfully"
 
-#: src/views/domain/DomainEdit.vue:180
+#: src/views/domain/DomainEdit.vue:179
 msgid "Edit %{n}"
 msgstr "Редактировать %{n}"
 
-#: src/routes/index.ts:93 src/views/config/ConfigEdit.vue:83
+#: src/routes/index.ts:92 src/views/config/ConfigEdit.vue:83
 msgid "Edit Configuration"
 msgstr "Редактировать Конфигурацию"
 
-#: src/routes/index.ts:75
+#: src/routes/index.ts:74
 msgid "Edit Site"
 msgstr "Редактировать Сайт"
 
-#: src/views/other/Install.vue:91
+#: src/views/other/Install.vue:93
 msgid "Email (*)"
 msgstr "Email (*)"
 
@@ -518,15 +520,15 @@ msgstr "Email (*)"
 msgid "Enable"
 msgstr "Включить"
 
-#: src/views/domain/components/Deploy.vue:56
+#: src/views/domain/components/Deploy.vue:55
 msgid "Enable %{conf_name} in %{node_name} failed"
 msgstr "Включение %{conf_name} in %{node_name} нипалучилася"
 
-#: src/views/domain/components/Deploy.vue:50
+#: src/views/domain/components/Deploy.vue:49
 msgid "Enable %{conf_name} in %{node_name} successfully"
 msgstr "Включение %{conf_name} in %{node_name} успешно"
 
-#: src/views/domain/cert/components/ObtainCert.vue:120
+#: src/views/domain/cert/components/ObtainCert.vue:121
 msgid "Enable auto-renewal failed for %{name}"
 msgstr "Не удалось включить автоматическое продление для %{name}"
 
@@ -534,23 +536,24 @@ msgstr "Не удалось включить автоматическое про
 msgid "Enable failed"
 msgstr "Включить не удалось"
 
-#: src/views/domain/components/Deploy.vue:48
+#: src/views/domain/components/Deploy.vue:47
 #, fuzzy
 msgid "Enable successfully"
 msgstr "Активировано успешно"
 
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:235
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:236
 msgid "Enable TLS"
 msgstr "Включить TLS"
 
-#: src/views/cert/Cert.vue:45 src/views/domain/cert/ChangeCert.vue:44
+#: src/views/certificate/Certificate.vue:53
+#: src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/components/Deploy.vue:89
-#: src/views/domain/components/RightSettings.vue:73
-#: src/views/domain/DomainEdit.vue:185 src/views/domain/DomainList.vue:131
+#: src/views/domain/components/RightSettings.vue:75
+#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:131
 msgid "Enabled"
 msgstr "Включено"
 
-#: src/views/domain/components/RightSettings.vue:29
+#: src/views/domain/components/RightSettings.vue:30
 #: src/views/domain/components/SiteDuplicate.vue:100
 #: src/views/domain/DomainAdd.vue:45 src/views/domain/DomainList.vue:58
 msgid "Enabled successfully"
@@ -560,7 +563,7 @@ msgstr "Активировано успешно"
 msgid "Encrypt website with Let's Encrypt"
 msgstr "Использовать для сайта Let's Encrypt"
 
-#: src/routes/index.ts:152 src/views/environment/Environment.vue:113
+#: src/routes/index.ts:151 src/views/environment/Environment.vue:113
 msgid "Environment"
 msgstr "Окружение"
 
@@ -569,11 +572,11 @@ msgstr "Окружение"
 msgid "Environments"
 msgstr "Комментарии"
 
-#: src/views/config/InspectConfig.vue:48
+#: src/views/config/InspectConfig.vue:47
 msgid "Error"
 msgstr "Ошибка"
 
-#: src/routes/index.ts:139 src/views/domain/ngx_conf/LogEntry.vue:86
+#: src/routes/index.ts:138 src/views/domain/ngx_conf/LogEntry.vue:86
 msgid "Error Logs"
 msgstr "Ошибка логирования"
 
@@ -581,17 +584,22 @@ msgstr "Ошибка логирования"
 msgid "Executable Path"
 msgstr "Исполняемый путь"
 
+#: src/views/domain/cert/CertInfo.vue:27
+#, fuzzy
+msgid "Expired At: %{date}"
+msgstr "Дата окончания срока: %{date}"
+
 #: src/components/StdDesign/StdDataDisplay/methods/exportCsv.ts:68
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:296
 msgid "Export"
 msgstr "Экспорт"
 
-#: src/views/domain/components/RightSettings.vue:41
+#: src/views/domain/components/RightSettings.vue:42
 #: src/views/domain/DomainList.vue:70
 msgid "Failed to disable %{msg}"
 msgstr "Не удалось отключить %{msg}"
 
-#: src/views/domain/components/RightSettings.vue:32
+#: src/views/domain/components/RightSettings.vue:33
 #: src/views/domain/DomainList.vue:61
 msgid "Failed to enable %{msg}"
 msgstr "Не удалось включить %{msg}"
@@ -600,7 +608,7 @@ msgstr "Не удалось включить %{msg}"
 msgid "Failed to get certificate information"
 msgstr "Не удалось получить информацию о сертификате"
 
-#: src/views/domain/DomainEdit.vue:139
+#: src/views/domain/DomainEdit.vue:138
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "Не удалось сохранить, обнаружены синтаксические ошибки в конфигурации."
 
@@ -616,7 +624,7 @@ msgstr "Файл существует"
 msgid "File Not Found"
 msgstr "Файл не найден"
 
-#: src/views/nginx_log/NginxLog.vue:153
+#: src/views/nginx_log/NginxLog.vue:152
 msgid "Filter"
 msgstr "Фильтр"
 
@@ -651,7 +659,7 @@ msgstr "Генерация приватного ключа для регистр
 msgid "Get release information error"
 msgstr "Ошибка получения информации о релизе"
 
-#: src/views/domain/cert/components/ObtainCert.vue:63
+#: src/views/domain/cert/components/ObtainCert.vue:64
 msgid "Getting the certificate, please wait..."
 msgstr "Получение сертификата, пожалуйста, подождите..."
 
@@ -691,7 +699,7 @@ msgstr "Хостинг HTTP"
 msgid "HTTP Port"
 msgstr "Порт HTTP"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:60
+#: src/views/domain/cert/components/AutoCertStepOne.vue:66
 msgid "HTTP01"
 msgstr ""
 
@@ -703,16 +711,16 @@ msgstr "Ошибка первоначального обновления ядр
 msgid "Initialing core upgrader"
 msgstr "Инициализация программы обновления ядра"
 
-#: src/routes/index.ts:195 src/views/other/Install.vue:137
+#: src/routes/index.ts:194 src/views/other/Install.vue:139
 msgid "Install"
 msgstr "Установить"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:68
 #, fuzzy
 msgid "Install successfully"
 msgstr "Установленно"
 
-#: src/views/domain/cert/CertInfo.vue:22
+#: src/views/domain/cert/CertInfo.vue:21
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "Промежуточные центры сертификации: %{issuer}"
 
@@ -765,11 +773,11 @@ msgstr "Location"
 msgid "Locations"
 msgstr "Locations"
 
-#: src/routes/index.ts:201 src/views/other/Login.vue:147
+#: src/routes/index.ts:200 src/views/other/Login.vue:147
 msgid "Login"
 msgstr "Логин"
 
-#: src/views/other/Login.vue:53 src/views/other/Login.vue:99
+#: src/views/other/Login.vue:51 src/views/other/Login.vue:97
 msgid "Login successful"
 msgstr "Авторизация успешна"
 
@@ -777,7 +785,7 @@ msgstr "Авторизация успешна"
 msgid "Logout successful"
 msgstr "Выход выполнен успешно"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:45
+#: src/views/domain/cert/components/AutoCertStepOne.vue:51
 #, fuzzy
 msgid ""
 "Make sure you have configured a reverse proxy for .well-known directory to "
@@ -786,15 +794,15 @@ msgstr ""
 "Убедитесь, что вы настроили обратный прокси-сервер для каталога .well-known "
 "на HTTPChallengePort перед получением сертификата»."
 
-#: src/routes/index.ts:84
+#: src/routes/index.ts:83
 msgid "Manage Configs"
 msgstr "Конфигурации"
 
-#: src/routes/index.ts:59 src/views/domain/DomainList.vue:102
+#: src/routes/index.ts:58 src/views/domain/DomainList.vue:102
 msgid "Manage Sites"
 msgstr "Сайты"
 
-#: src/routes/index.ts:160 src/views/user/User.vue:53
+#: src/routes/index.ts:159 src/views/user/User.vue:53
 msgid "Manage Users"
 msgstr "Пользователи"
 
@@ -809,6 +817,7 @@ msgstr "Память и хранилище"
 #: src/components/ChatGPT/ChatGPT.vue:256
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
+#: src/views/certificate/Certificate.vue:156
 #, fuzzy
 msgid "Modify"
 msgstr "Изменить"
@@ -822,9 +831,10 @@ msgstr "Изменить конфигурацию"
 msgid "Multi-line Directive"
 msgstr "Одиночная директива"
 
-#: src/views/cert/Cert.vue:17 src/views/cert/DNSCredential.vue:13
-#: src/views/config/config.ts:9 src/views/domain/cert/ChangeCert.vue:21
-#: src/views/domain/components/RightSettings.vue:79
+#: src/views/certificate/Certificate.vue:24
+#: 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
 #: src/views/domain/components/SiteDuplicate.vue:135
 #: src/views/domain/DomainList.vue:16 src/views/environment/Environment.vue:15
 msgid "Name"
@@ -850,12 +860,12 @@ msgstr "Всего отправлено"
 msgid "New version released"
 msgstr "Вышла новая версия"
 
-#: src/views/domain/cert/components/ObtainCert.vue:278
+#: src/views/domain/cert/components/ObtainCert.vue:281
 #: src/views/domain/DomainAdd.vue:140
 msgid "Next"
 msgstr "Дальше"
 
-#: src/views/preference/Preference.vue:98
+#: src/views/preference/Preference.vue:96
 #, fuzzy
 msgid "Nginx"
 msgstr "Журнал"
@@ -864,7 +874,7 @@ msgstr "Журнал"
 msgid "Nginx Access Log Path"
 msgstr "Путь для Nginx Access Log"
 
-#: src/views/domain/DomainEdit.vue:223
+#: src/views/domain/DomainEdit.vue:222
 #, fuzzy
 msgid "Nginx Configuration Parse Error"
 msgstr "Ошибка синтаксического анализа конфигурации Nginx"
@@ -877,7 +887,7 @@ msgstr "Управление Nginx"
 msgid "Nginx Error Log Path"
 msgstr "Путь для Nginx Error Log"
 
-#: src/routes/index.ts:129 src/views/nginx_log/NginxLog.vue:146
+#: src/routes/index.ts:128 src/views/nginx_log/NginxLog.vue:145
 msgid "Nginx Log"
 msgstr "Журнал"
 
@@ -903,20 +913,20 @@ msgstr "Нет"
 msgid "Node Secret"
 msgstr ""
 
-#: src/routes/index.ts:207 src/routes/index.ts:209
+#: src/routes/index.ts:206 src/routes/index.ts:208
 msgid "Not Found"
 msgstr "Не найден"
 
-#: src/views/domain/cert/CertInfo.vue:31
+#: src/views/domain/cert/CertInfo.vue:30
 msgid "Not Valid Before: %{date}"
 msgstr "Недействительно до: %{date}"
 
-#: src/views/cert/DNSCredential.vue:48
-#: src/views/domain/cert/components/AutoCertStepOne.vue:32
+#: src/views/certificate/DNSCredential.vue:48
+#: src/views/domain/cert/components/AutoCertStepOne.vue:38
 msgid "Note"
 msgstr "Заметка"
 
-#: src/views/domain/cert/components/ObtainCert.vue:249
+#: src/views/domain/cert/components/ObtainCert.vue:252
 #, fuzzy
 msgid "Obtain certificate"
 msgstr "Получить сертификат"
@@ -936,15 +946,19 @@ msgstr ""
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:140
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:346
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:104
-#: src/views/domain/cert/components/ObtainCert.vue:209
-#: src/views/domain/components/Deploy.vue:24
-#: src/views/domain/components/RightSettings.vue:50
+#: src/views/domain/cert/components/ObtainCert.vue:210
+#: src/views/domain/components/Deploy.vue:23
+#: src/views/domain/components/RightSettings.vue:51
 #: src/views/domain/DomainList.vue:144
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:215
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:47
 msgid "OK"
 msgstr ""
 
+#: src/views/certificate/DNSCredential.vue:58
+msgid "Once the verification is complete, the records will be removed."
+msgstr ""
+
 #: src/components/NodeSelector/NodeSelector.vue:57
 #: src/components/NodeSelector/NodeSelector.vue:72
 #: src/views/dashboard/Environments.vue:100
@@ -952,7 +966,7 @@ msgstr ""
 msgid "Online"
 msgstr ""
 
-#: src/views/preference/Preference.vue:104
+#: src/views/preference/Preference.vue:102
 msgid "OpenAI"
 msgstr ""
 
@@ -981,7 +995,7 @@ msgstr "Параметры"
 msgid "Password"
 msgstr "Пароль"
 
-#: src/views/other/Install.vue:111
+#: src/views/other/Install.vue:113
 msgid "Password (*)"
 msgstr "Пароль (*)"
 
@@ -999,17 +1013,13 @@ msgstr ""
 msgid "Performing core upgrade"
 msgstr ""
 
-#: src/views/cert/DNSCredential.vue:52
+#: src/views/certificate/DNSCredential.vue:52
 msgid ""
 "Please fill in the API authentication credentials provided by your DNS "
-"provider.\n"
-"We will add one or more TXT records to the DNS records of your domain for "
-"ownership verification.\n"
-"Once the verification is complete, the records will be removed.\n"
-"Please note that the time configurations below are all in seconds."
+"provider."
 msgstr ""
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:49
+#: src/views/domain/cert/components/AutoCertStepOne.vue:55
 msgid ""
 "Please first add credentials in Certification > DNS Credentials, and then "
 "select one of the credentialsbelow to request the API of the DNS provider."
@@ -1023,18 +1033,23 @@ msgstr ""
 "Введите имя, оно будет использоваться в качестве имени файла нового "
 "поздравляем!"
 
-#: src/views/other/Install.vue:34
+#: src/views/other/Install.vue:35
 msgid "Please input your E-mail!"
 msgstr "Введите ваш E-mail!"
 
-#: src/views/other/Install.vue:46 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:47 src/views/other/Login.vue:39
 msgid "Please input your password!"
 msgstr "Введите ваш пароль!"
 
-#: src/views/other/Install.vue:40 src/views/other/Login.vue:35
+#: src/views/other/Install.vue:41 src/views/other/Login.vue:33
 msgid "Please input your username!"
 msgstr "Введите ваше имя пользователя!"
 
+#: src/views/certificate/DNSCredential.vue:61
+msgid ""
+"Please note that the unit of time configurations below are all in seconds."
+msgstr ""
+
 #: src/views/domain/components/SiteDuplicate.vue:47
 msgid "Please select at least one node!"
 msgstr ""
@@ -1043,7 +1058,7 @@ msgstr ""
 msgid "Pre-release"
 msgstr ""
 
-#: src/routes/index.ts:168 src/views/preference/Preference.vue:87
+#: src/routes/index.ts:167 src/views/preference/Preference.vue:85
 msgid "Preference"
 msgstr "Настройки"
 
@@ -1064,7 +1079,7 @@ msgstr "Запретить удаление пользователя по умо
 msgid "Project Team"
 msgstr "Команда проекта"
 
-#: src/views/cert/DNSCredential.vue:21
+#: src/views/certificate/DNSCredential.vue:21
 msgid "Provider"
 msgstr "Провайдер"
 
@@ -1134,9 +1149,9 @@ msgid "Running"
 msgstr "Выполняется"
 
 #: src/components/ChatGPT/ChatGPT.vue:259 src/views/config/ConfigEdit.vue:98
-#: src/views/domain/DomainEdit.vue:269
+#: src/views/domain/DomainEdit.vue:268
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:111
-#: src/views/preference/Preference.vue:115
+#: src/views/preference/Preference.vue:113
 msgid "Save"
 msgstr "Сохранить"
 
@@ -1150,7 +1165,7 @@ msgid "Save error %{msg}"
 msgstr "Ошибка сохранения %{msg}"
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
-#: src/views/preference/Preference.vue:60
+#: src/views/preference/Preference.vue:58
 #, fuzzy
 msgid "Save successfully"
 msgstr "Успешно сохранено"
@@ -1161,7 +1176,7 @@ msgid "Save Successfully"
 msgstr "Успешно сохранено"
 
 #: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:41
-#: src/views/domain/DomainEdit.vue:155
+#: src/views/domain/DomainEdit.vue:154
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
 msgid "Saved successfully"
 msgstr "Успешно сохранено"
@@ -1182,7 +1197,7 @@ msgstr "Отправлено"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:45
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:157
 #: src/views/config/ConfigEdit.vue:42 src/views/domain/DomainList.vue:79
-#: src/views/other/Install.vue:71 src/views/preference/Preference.vue:62
+#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:60
 #: src/views/system/Upgrade.vue:45
 msgid "Server error"
 msgstr "Ошибка сервера"
@@ -1191,11 +1206,11 @@ msgstr "Ошибка сервера"
 msgid "Server Info"
 msgstr "Информация о сервере"
 
-#: src/views/domain/cert/components/ObtainCert.vue:164
+#: src/views/domain/cert/components/ObtainCert.vue:165
 msgid "server_name not found in directives"
 msgstr "server_name не нашел в директивах"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:22
+#: src/views/domain/cert/components/AutoCertStepOne.vue:27
 #: src/views/domain/DomainAdd.vue:119
 msgid "server_name parameter is required"
 msgstr "server_name параметр обязателен"
@@ -1208,34 +1223,34 @@ msgstr "Настройка переменных сред"
 msgid "Single Directive"
 msgstr "Одиночная Директива"
 
-#: src/routes/index.ts:143
+#: src/routes/index.ts:142
 #, fuzzy
 msgid "Site Logs"
 msgstr "Логи сайтов"
 
-#: src/routes/index.ts:67
+#: src/routes/index.ts:66
 msgid "Sites List"
 msgstr "Список сайтов"
 
-#: src/views/cert/Cert.vue:64
+#: src/views/certificate/Certificate.vue:164
 #, fuzzy
-msgid "SSL Certificate Key Path"
-msgstr "Путь к ключу сертификата SSL"
+msgid "SSL Certificate Content"
+msgstr "Содержание сертификата SSL"
 
-#: src/views/cert/Cert.vue:57
+#: src/views/certificate/Certificate.vue:171
 #, fuzzy
-msgid "SSL Certificate Path"
-msgstr "Путь к сертификату SSL"
+msgid "SSL Certificate Key Content"
+msgstr "Содержание ключа сертификата SSL"
 
-#: src/views/cert/Cert.vue:139
+#: src/views/certificate/Certificate.vue:73
 #, fuzzy
-msgid "SSL Certification Content"
-msgstr "Содержание сертификата SSL"
+msgid "SSL Certificate Key Path"
+msgstr "Путь к ключу сертификата SSL"
 
-#: src/views/cert/Cert.vue:145
+#: src/views/certificate/Certificate.vue:65
 #, fuzzy
-msgid "SSL Certification Key Content"
-msgstr "Содержание ключа сертификата SSL"
+msgid "SSL Certificate Path"
+msgstr "Путь к сертификату SSL"
 
 #: src/views/other/Login.vue:158
 #, fuzzy
@@ -1259,7 +1274,7 @@ msgstr "Остановлен"
 msgid "Storage"
 msgstr "Хранилище"
 
-#: src/views/domain/cert/CertInfo.vue:25
+#: src/views/domain/cert/CertInfo.vue:24
 #, fuzzy
 msgid "Subject Name: %{subject}"
 msgstr "Название темы: %{name}"
@@ -1276,7 +1291,7 @@ msgstr ""
 msgid "Switch to light theme"
 msgstr ""
 
-#: src/routes/index.ts:176
+#: src/routes/index.ts:175
 msgid "System"
 msgstr "Система"
 
@@ -1289,7 +1304,7 @@ msgstr "Таблица"
 msgid "Target"
 msgstr ""
 
-#: src/routes/index.ts:121 src/views/pty/Terminal.vue:95
+#: src/routes/index.ts:120 src/views/pty/Terminal.vue:95
 msgid "Terminal"
 msgstr "Терминал"
 
@@ -1297,7 +1312,7 @@ msgstr "Терминал"
 msgid "Terminal Start Command"
 msgstr "Терминальная команда запуска"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:41
+#: src/views/domain/cert/components/AutoCertStepOne.vue:47
 #, fuzzy
 msgid ""
 "The certificate for the domain will be checked 5 minutes, and will be "
@@ -1306,11 +1321,11 @@ msgstr ""
 "The certificate for the domain will be checked every hour, and will be "
 "renewed if it has been more than 1 month since it was last issued."
 
-#: src/views/other/Install.vue:52
+#: src/views/other/Install.vue:53
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr "The filename cannot contain the following characters: %{c}"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:36
+#: src/views/domain/cert/components/AutoCertStepOne.vue:42
 #, fuzzy
 msgid ""
 "The server_name in the current configuration must be the domain name you "
@@ -1323,8 +1338,9 @@ msgstr ""
 msgid "The username or password is incorrect"
 msgstr "Имя пользователя или пароль неверны"
 
-#: src/views/cert/Cert.vue:102
-msgid "This auto-cert item is invalid, please remove it."
+#: src/views/certificate/Certificate.vue:115
+#, fuzzy
+msgid "This Auto Cert item is invalid, please remove it."
 msgstr "Этот элемент автосертификата недействителен, удалите его.."
 
 #: src/components/StdDesign/StdDataEntry/StdFormItem.vue:31
@@ -1343,9 +1359,10 @@ msgstr ""
 msgid "Type"
 msgstr "Тип"
 
-#: src/views/cert/Cert.vue:71 src/views/cert/DNSCredential.vue:26
-#: src/views/config/config.ts:29 src/views/config/ConfigEdit.vue:123
-#: src/views/domain/components/RightSettings.vue:82
+#: src/views/certificate/Certificate.vue:81
+#: src/views/certificate/DNSCredential.vue:26 src/views/config/config.ts:29
+#: src/views/config/ConfigEdit.vue:123
+#: src/views/domain/components/RightSettings.vue:84
 #: src/views/domain/DomainList.vue:44 src/views/environment/Environment.vue:98
 #: src/views/user/User.vue:40
 msgid "Updated at"
@@ -1356,7 +1373,7 @@ msgstr "Обновлено в"
 msgid "Updated successfully"
 msgstr "Обновлено успешно"
 
-#: src/routes/index.ts:187 src/views/system/Upgrade.vue:143
+#: src/routes/index.ts:186 src/views/system/Upgrade.vue:143
 #: src/views/system/Upgrade.vue:235
 msgid "Upgrade"
 msgstr "Обновление"
@@ -1387,7 +1404,7 @@ msgstr "Имя пользователя"
 msgid "Username"
 msgstr "Имя пользователя"
 
-#: src/views/other/Install.vue:101
+#: src/views/other/Install.vue:103
 msgid "Username (*)"
 msgstr "Имя пользователя (*)"
 
@@ -1403,13 +1420,19 @@ msgstr ""
 msgid "View"
 msgstr "Просмотр"
 
-#: src/views/config/InspectConfig.vue:37
-#: src/views/domain/cert/components/AutoCertStepOne.vue:16
+#: src/views/config/InspectConfig.vue:36
+#: src/views/domain/cert/components/AutoCertStepOne.vue:21
 #: src/views/domain/DomainAdd.vue:114
 msgid "Warning"
 msgstr "Внимание"
 
-#: src/views/domain/cert/components/ObtainCert.vue:207
+#: src/views/certificate/DNSCredential.vue:55
+msgid ""
+"We will add one or more TXT records to the DNS records of your domain for "
+"ownership verification."
+msgstr ""
+
+#: src/views/domain/cert/components/ObtainCert.vue:208
 msgid ""
 "We will remove the HTTPChallenge configuration from this file and reload the "
 "Nginx. Are you sure you want to continue?"
@@ -1441,6 +1464,13 @@ msgstr "Вы используете последнюю версию"
 msgid "You can check Nginx UI upgrade at this page."
 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}"
 

File diff suppressed because it is too large
+ 0 - 0
app/src/language/translations.json


BIN
app/src/language/zh_CN/app.mo


+ 197 - 163
app/src/language/zh_CN/app.po

@@ -13,28 +13,25 @@ msgstr ""
 "Generated-By: easygettext\n"
 "X-Generator: Poedit 3.4.1\n"
 
-#: src/views/domain/cert/CertInfo.vue:28
-msgid " Expiration Date: %{date}"
-msgstr "过期时间: %{date}"
-
-#: src/routes/index.ts:183
+#: src/routes/index.ts:182
 msgid "About"
 msgstr "关于"
 
-#: src/routes/index.ts:135 src/views/domain/ngx_conf/LogEntry.vue:78
+#: src/routes/index.ts:134 src/views/domain/ngx_conf/LogEntry.vue:78
 msgid "Access Logs"
 msgstr "访问日志"
 
-#: src/views/cert/Cert.vue:77 src/views/cert/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/certificate/Certificate.vue:87
+#: 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
 msgid "Action"
 msgstr "操作"
 
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:114
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:115
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:307
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:308
 msgid "Add"
 msgstr "添加"
 
@@ -47,15 +44,15 @@ msgstr "在下面添加指令"
 msgid "Add Location"
 msgstr "添加 Location"
 
-#: src/routes/index.ts:71 src/views/domain/DomainAdd.vue:91
+#: src/routes/index.ts:70 src/views/domain/DomainAdd.vue:91
 msgid "Add Site"
 msgstr "添加站点"
 
-#: src/views/cert/DNSChallenge.vue:95
+#: src/views/certificate/DNSChallenge.vue:95
 msgid "Additional"
 msgstr "额外选项"
 
-#: src/views/domain/DomainEdit.vue:205
+#: src/views/domain/DomainEdit.vue:204
 msgid "Advance Mode"
 msgstr "高级模式"
 
@@ -105,32 +102,33 @@ msgstr "助手"
 msgid "Author"
 msgstr "作者"
 
-#: src/views/cert/Cert.vue:38 src/views/domain/cert/ChangeCert.vue:37
+#: src/views/certificate/Certificate.vue:46
+#: src/views/domain/cert/ChangeCert.vue:37
 msgid "Auto Cert"
 msgstr "自动更新"
 
-#: src/views/cert/Cert.vue:92
-msgid "Auto cert is enabled, please do not modify this certification."
-msgstr "自动更新已启用,请勿修改此证书配置。"
+#: src/views/certificate/Certificate.vue:105
+msgid "Auto Cert is enabled"
+msgstr "自动更新已启用"
 
-#: src/views/nginx_log/NginxLog.vue:150
+#: src/views/certificate/Certificate.vue:135
+msgid "Auto Cert Log"
+msgstr "证书自动续期日志"
+
+#: src/views/nginx_log/NginxLog.vue:149
 msgid "Auto Refresh"
 msgstr "自动刷新"
 
-#: src/views/cert/Cert.vue:122
-msgid "Auto-Cert Log"
-msgstr "证书自动续期日志"
-
-#: src/views/domain/cert/components/ObtainCert.vue:125
+#: src/views/domain/cert/components/ObtainCert.vue:126
 msgid "Auto-renewal disabled for %{name}"
 msgstr "成功关闭 %{name} 自动续签"
 
-#: src/views/domain/cert/components/ObtainCert.vue:118
+#: src/views/domain/cert/components/ObtainCert.vue:119
 msgid "Auto-renewal enabled for %{name}"
 msgstr "成功启用 %{name} 自动续签"
 
 #: src/views/config/Config.vue:75 src/views/config/ConfigEdit.vue:89
-#: src/views/domain/DomainEdit.vue:262 src/views/nginx_log/NginxLog.vue:171
+#: src/views/domain/DomainEdit.vue:261 src/views/nginx_log/NginxLog.vue:170
 msgid "Back"
 msgstr "返回"
 
@@ -143,12 +141,12 @@ msgid "Base information"
 msgstr "基本信息"
 
 #: src/views/config/ConfigEdit.vue:117
-#: src/views/domain/components/RightSettings.vue:71
-#: src/views/preference/Preference.vue:92
+#: src/views/domain/components/RightSettings.vue:73
+#: src/views/preference/Preference.vue:90
 msgid "Basic"
 msgstr "基本"
 
-#: src/views/domain/DomainEdit.vue:208
+#: src/views/domain/DomainEdit.vue:207
 msgid "Basic Mode"
 msgstr "基本模式"
 
@@ -169,35 +167,36 @@ msgstr "CADir"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:58
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:139
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
-#: src/views/domain/cert/components/ObtainCert.vue:210
-#: src/views/domain/components/Deploy.vue:25
-#: src/views/domain/components/RightSettings.vue:51
+#: src/views/domain/cert/components/ObtainCert.vue:211
+#: src/views/domain/components/Deploy.vue:24
+#: src/views/domain/components/RightSettings.vue:52
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:216
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:48
 msgid "Cancel"
 msgstr "取消"
 
-#: src/views/domain/cert/CertInfo.vue:36
+#: src/views/domain/cert/CertInfo.vue:35
 msgid "Certificate has expired"
 msgstr "此证书已过期"
 
-#: src/views/domain/cert/CertInfo.vue:40
+#: src/views/domain/cert/CertInfo.vue:39
 msgid "Certificate is valid"
 msgstr "此证书有效"
 
-#: src/views/cert/Cert.vue:132 src/views/domain/cert/Cert.vue:35
+#: src/views/certificate/Certificate.vue:145 src/views/domain/cert/Cert.vue:35
 msgid "Certificate Status"
 msgstr "证书状态"
 
-#: src/routes/index.ts:101 src/views/cert/Cert.vue:84
-msgid "Certification"
+#: src/routes/index.ts:100 src/views/certificate/Certificate.vue:96
+msgid "Certificates"
 msgstr "证书"
 
-#: src/routes/index.ts:109
-msgid "Certification List"
+#: src/routes/index.ts:108
+msgid "Certificates List"
 msgstr "证书列表"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:57
+#: src/views/certificate/Certificate.vue:150
+#: src/views/domain/cert/components/AutoCertStepOne.vue:63
 msgid "Challenge Method"
 msgstr "挑战方法"
 
@@ -233,11 +232,11 @@ 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
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:283
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:284
 msgid "Comments"
 msgstr "注释"
 
-#: src/views/cert/Cert.vue:33
+#: src/views/certificate/Certificate.vue:41
 msgid "Config Name"
 msgstr "配置文件名称"
 
@@ -245,7 +244,7 @@ msgstr "配置文件名称"
 msgid "Config Templates"
 msgstr "配置"
 
-#: src/views/config/InspectConfig.vue:31
+#: src/views/config/InspectConfig.vue:30
 msgid "Configuration file is test successful"
 msgstr "配置文件测试成功"
 
@@ -299,7 +298,7 @@ msgstr "正在创建客户端用于与 CA 服务器通信"
 msgid "Credential"
 msgstr "DNS 凭证"
 
-#: src/views/cert/DNSChallenge.vue:83
+#: src/views/certificate/DNSChallenge.vue:83
 msgid "Credentials"
 msgstr "凭证"
 
@@ -308,7 +307,7 @@ msgid "Current Version"
 msgstr "当前版本"
 
 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:122
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:240
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:241
 msgid "Custom"
 msgstr "自定义"
 
@@ -316,13 +315,13 @@ msgstr "自定义"
 msgid "Dashboard"
 msgstr "仪表盘"
 
-#: src/views/other/Install.vue:122
+#: src/views/other/Install.vue:124
 msgid "Database (Optional, default: database)"
 msgstr "数据库 (可选,默认: database)"
 
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:354
 #: src/views/domain/DomainList.vue:153
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:258
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:259
 msgid "Delete"
 msgstr "删除"
 
@@ -335,19 +334,19 @@ msgid "Deleted successfully"
 msgstr "删除成功"
 
 #: src/views/domain/components/Deploy.vue:109
-#: src/views/domain/components/RightSettings.vue:89
+#: src/views/domain/components/RightSettings.vue:91
 msgid "Deploy"
 msgstr "部署"
 
-#: src/views/domain/components/Deploy.vue:67
+#: src/views/domain/components/Deploy.vue:66
 msgid "Deploy %{conf_name} to %{node_name} failed"
 msgstr "部署%{conf_name}到%{node_name}失败"
 
-#: src/views/domain/components/Deploy.vue:41
+#: src/views/domain/components/Deploy.vue:40
 msgid "Deploy %{conf_name} to %{node_name} successfully"
 msgstr "成功地将%{conf_name}部署到%{node_name}"
 
-#: src/views/domain/components/Deploy.vue:39
+#: src/views/domain/components/Deploy.vue:38
 msgid "Deploy successfully"
 msgstr "部署成功"
 
@@ -376,16 +375,17 @@ msgstr "目录"
 msgid "Disable"
 msgstr "禁用"
 
-#: src/views/domain/cert/components/ObtainCert.vue:127
+#: src/views/domain/cert/components/ObtainCert.vue:128
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "关闭 %{name} 自动续签失败"
 
-#: src/views/cert/Cert.vue:49 src/views/domain/cert/ChangeCert.vue:48
-#: src/views/domain/DomainEdit.vue:191 src/views/domain/DomainList.vue:123
+#: src/views/certificate/Certificate.vue:57
+#: src/views/domain/cert/ChangeCert.vue:48 src/views/domain/DomainEdit.vue:190
+#: src/views/domain/DomainList.vue:123
 msgid "Disabled"
 msgstr "禁用"
 
-#: src/views/domain/components/RightSettings.vue:38
+#: src/views/domain/components/RightSettings.vue:39
 #: src/views/domain/DomainList.vue:67
 msgid "Disabled successfully"
 msgstr "禁用成功"
@@ -394,33 +394,33 @@ msgstr "禁用成功"
 msgid "Disk IO"
 msgstr "磁盘 IO"
 
-#: src/routes/index.ts:114 src/views/cert/DNSCredential.vue:39
+#: src/routes/index.ts:113 src/views/certificate/DNSCredential.vue:39
 msgid "DNS Credentials"
 msgstr "DNS 凭证"
 
-#: src/views/cert/DNSChallenge.vue:74
+#: src/views/certificate/DNSChallenge.vue:74
 #: src/views/domain/cert/components/DNSChallenge.vue:79
 msgid "DNS Provider"
 msgstr "DNS供应商"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:63
+#: src/views/domain/cert/components/AutoCertStepOne.vue:69
 msgid "DNS01"
 msgstr "DNS01"
 
-#: src/views/domain/components/Deploy.vue:20
+#: src/views/domain/components/Deploy.vue:19
 msgid "Do you want to deploy this file to remote server?"
 msgid_plural "Do you want to deploy this file to remote servers?"
 msgstr[0] "你想把这个文件部署到远程服务器上吗?"
 
-#: src/views/domain/cert/components/ObtainCert.vue:206
+#: src/views/domain/cert/components/ObtainCert.vue:207
 msgid "Do you want to disable auto-cert renewal?"
 msgstr "你想禁用自动更新证书吗?"
 
-#: src/views/domain/components/RightSettings.vue:47
+#: src/views/domain/components/RightSettings.vue:48
 msgid "Do you want to disable this site?"
 msgstr "你想停用这个网站吗?"
 
-#: src/views/domain/components/RightSettings.vue:47
+#: src/views/domain/components/RightSettings.vue:48
 msgid "Do you want to enable this site?"
 msgstr "你想启用这个网站吗?"
 
@@ -436,9 +436,9 @@ msgstr "你想删除这个服务器吗?"
 msgid "Domain Config Created Successfully"
 msgstr "域名配置文件创建成功"
 
-#: src/views/cert/Cert.vue:112
-msgid "Domains list is empty, try to reopen auto-cert for %{config}"
-msgstr "域名列表为空,请尝试为%{config}重新打开证书自动续期。"
+#: src/views/certificate/Certificate.vue:125
+msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
+msgstr "域名列表为空,请尝试为 %{config} 重新打开证书自动续期。"
 
 #: src/language/constants.ts:29
 msgid "Download latest release error"
@@ -473,19 +473,19 @@ msgstr "复制成功"
 msgid "Duplicate to local successfully"
 msgstr "成功复制到本地"
 
-#: src/views/domain/DomainEdit.vue:180
+#: src/views/domain/DomainEdit.vue:179
 msgid "Edit %{n}"
 msgstr "编辑 %{n}"
 
-#: src/routes/index.ts:93 src/views/config/ConfigEdit.vue:83
+#: src/routes/index.ts:92 src/views/config/ConfigEdit.vue:83
 msgid "Edit Configuration"
 msgstr "编辑配置"
 
-#: src/routes/index.ts:75
+#: src/routes/index.ts:74
 msgid "Edit Site"
 msgstr "编辑站点"
 
-#: src/views/other/Install.vue:91
+#: src/views/other/Install.vue:93
 msgid "Email (*)"
 msgstr "邮箱 (*)"
 
@@ -493,15 +493,15 @@ msgstr "邮箱 (*)"
 msgid "Enable"
 msgstr "启用"
 
-#: src/views/domain/components/Deploy.vue:56
+#: src/views/domain/components/Deploy.vue:55
 msgid "Enable %{conf_name} in %{node_name} failed"
 msgstr "在%{node_name}中启用%{conf_name}失败"
 
-#: src/views/domain/components/Deploy.vue:50
+#: src/views/domain/components/Deploy.vue:49
 msgid "Enable %{conf_name} in %{node_name} successfully"
 msgstr "成功启用%{node_name}中的%{conf_name}"
 
-#: src/views/domain/cert/components/ObtainCert.vue:120
+#: src/views/domain/cert/components/ObtainCert.vue:121
 msgid "Enable auto-renewal failed for %{name}"
 msgstr "启用 %{name} 自动续签失败"
 
@@ -509,22 +509,23 @@ msgstr "启用 %{name} 自动续签失败"
 msgid "Enable failed"
 msgstr "启用失败"
 
-#: src/views/domain/components/Deploy.vue:48
+#: src/views/domain/components/Deploy.vue:47
 msgid "Enable successfully"
 msgstr "启用成功"
 
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:235
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:236
 msgid "Enable TLS"
 msgstr "启用 TLS"
 
-#: src/views/cert/Cert.vue:45 src/views/domain/cert/ChangeCert.vue:44
+#: src/views/certificate/Certificate.vue:53
+#: src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/components/Deploy.vue:89
-#: src/views/domain/components/RightSettings.vue:73
-#: src/views/domain/DomainEdit.vue:185 src/views/domain/DomainList.vue:131
+#: src/views/domain/components/RightSettings.vue:75
+#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:131
 msgid "Enabled"
 msgstr "启用"
 
-#: src/views/domain/components/RightSettings.vue:29
+#: src/views/domain/components/RightSettings.vue:30
 #: src/views/domain/components/SiteDuplicate.vue:100
 #: src/views/domain/DomainAdd.vue:45 src/views/domain/DomainList.vue:58
 msgid "Enabled successfully"
@@ -534,7 +535,7 @@ msgstr "启用成功"
 msgid "Encrypt website with Let's Encrypt"
 msgstr "用 Let's Encrypt 对网站进行加密"
 
-#: src/routes/index.ts:152 src/views/environment/Environment.vue:113
+#: src/routes/index.ts:151 src/views/environment/Environment.vue:113
 msgid "Environment"
 msgstr "环境"
 
@@ -542,11 +543,11 @@ msgstr "环境"
 msgid "Environments"
 msgstr "环境"
 
-#: src/views/config/InspectConfig.vue:48
+#: src/views/config/InspectConfig.vue:47
 msgid "Error"
 msgstr "错误"
 
-#: src/routes/index.ts:139 src/views/domain/ngx_conf/LogEntry.vue:86
+#: src/routes/index.ts:138 src/views/domain/ngx_conf/LogEntry.vue:86
 msgid "Error Logs"
 msgstr "错误日志"
 
@@ -554,17 +555,21 @@ msgstr "错误日志"
 msgid "Executable Path"
 msgstr "可执行文件路径"
 
+#: src/views/domain/cert/CertInfo.vue:27
+msgid "Expired At: %{date}"
+msgstr "过期时间: %{date}"
+
 #: src/components/StdDesign/StdDataDisplay/methods/exportCsv.ts:68
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:296
 msgid "Export"
 msgstr "导出"
 
-#: src/views/domain/components/RightSettings.vue:41
+#: src/views/domain/components/RightSettings.vue:42
 #: src/views/domain/DomainList.vue:70
 msgid "Failed to disable %{msg}"
 msgstr "禁用失败 %{msg}"
 
-#: src/views/domain/components/RightSettings.vue:32
+#: src/views/domain/components/RightSettings.vue:33
 #: src/views/domain/DomainList.vue:61
 msgid "Failed to enable %{msg}"
 msgstr "启用失败 %{msg}"
@@ -573,7 +578,7 @@ msgstr "启用失败 %{msg}"
 msgid "Failed to get certificate information"
 msgstr "获取证书信息失败"
 
-#: src/views/domain/DomainEdit.vue:139
+#: src/views/domain/DomainEdit.vue:138
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "保存失败,在配置中检测到语法错误。"
 
@@ -589,7 +594,7 @@ msgstr "文件已存在"
 msgid "File Not Found"
 msgstr "未找到文件"
 
-#: src/views/nginx_log/NginxLog.vue:153
+#: src/views/nginx_log/NginxLog.vue:152
 msgid "Filter"
 msgstr "过滤"
 
@@ -621,7 +626,7 @@ msgstr "正在生成私钥用于注册账户"
 msgid "Get release information error"
 msgstr "获取发布信息错误"
 
-#: src/views/domain/cert/components/ObtainCert.vue:63
+#: src/views/domain/cert/components/ObtainCert.vue:64
 msgid "Getting the certificate, please wait..."
 msgstr "正在获取证书,请稍等..."
 
@@ -661,7 +666,7 @@ msgstr "HTTP 监听主机"
 msgid "HTTP Port"
 msgstr "HTTP 监听端口"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:60
+#: src/views/domain/cert/components/AutoCertStepOne.vue:66
 msgid "HTTP01"
 msgstr "HTTP01"
 
@@ -673,15 +678,15 @@ msgstr "初始化核心升级程序错误"
 msgid "Initialing core upgrader"
 msgstr "初始化核心升级器"
 
-#: src/routes/index.ts:195 src/views/other/Install.vue:137
+#: src/routes/index.ts:194 src/views/other/Install.vue:139
 msgid "Install"
 msgstr "安装"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:68
 msgid "Install successfully"
 msgstr "安装成功"
 
-#: src/views/domain/cert/CertInfo.vue:22
+#: src/views/domain/cert/CertInfo.vue:21
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "中级证书颁发机构: %{issuer}"
 
@@ -730,11 +735,11 @@ msgstr "Location"
 msgid "Locations"
 msgstr "Locations"
 
-#: src/routes/index.ts:201 src/views/other/Login.vue:147
+#: src/routes/index.ts:200 src/views/other/Login.vue:147
 msgid "Login"
 msgstr "登录"
 
-#: src/views/other/Login.vue:53 src/views/other/Login.vue:99
+#: src/views/other/Login.vue:51 src/views/other/Login.vue:97
 msgid "Login successful"
 msgstr "登录成功"
 
@@ -742,7 +747,7 @@ msgstr "登录成功"
 msgid "Logout successful"
 msgstr "登出成功"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:45
+#: src/views/domain/cert/components/AutoCertStepOne.vue:51
 msgid ""
 "Make sure you have configured a reverse proxy for .well-known directory to "
 "HTTPChallengePort before obtaining the certificate."
@@ -750,15 +755,15 @@ msgstr ""
 "在获取签发证书前,请确保配置文件中已将 .well-known 目录反向代理到 "
 "HTTPChallengePort。"
 
-#: src/routes/index.ts:84
+#: src/routes/index.ts:83
 msgid "Manage Configs"
 msgstr "配置管理"
 
-#: src/routes/index.ts:59 src/views/domain/DomainList.vue:102
+#: src/routes/index.ts:58 src/views/domain/DomainList.vue:102
 msgid "Manage Sites"
 msgstr "网站管理"
 
-#: src/routes/index.ts:160 src/views/user/User.vue:53
+#: src/routes/index.ts:159 src/views/user/User.vue:53
 msgid "Manage Users"
 msgstr "用户管理"
 
@@ -773,6 +778,7 @@ msgstr "内存与存储"
 #: src/components/ChatGPT/ChatGPT.vue:256
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
+#: src/views/certificate/Certificate.vue:156
 msgid "Modify"
 msgstr "修改"
 
@@ -784,9 +790,10 @@ msgstr "修改配置文件"
 msgid "Multi-line Directive"
 msgstr "多行指令"
 
-#: src/views/cert/Cert.vue:17 src/views/cert/DNSCredential.vue:13
-#: src/views/config/config.ts:9 src/views/domain/cert/ChangeCert.vue:21
-#: src/views/domain/components/RightSettings.vue:79
+#: src/views/certificate/Certificate.vue:24
+#: 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
 #: src/views/domain/components/SiteDuplicate.vue:135
 #: src/views/domain/DomainList.vue:16 src/views/environment/Environment.vue:15
 msgid "Name"
@@ -812,12 +819,12 @@ msgstr "上传流量"
 msgid "New version released"
 msgstr "新版本发布"
 
-#: src/views/domain/cert/components/ObtainCert.vue:278
+#: src/views/domain/cert/components/ObtainCert.vue:281
 #: src/views/domain/DomainAdd.vue:140
 msgid "Next"
 msgstr "下一步"
 
-#: src/views/preference/Preference.vue:98
+#: src/views/preference/Preference.vue:96
 msgid "Nginx"
 msgstr "Nginx"
 
@@ -825,7 +832,7 @@ msgstr "Nginx"
 msgid "Nginx Access Log Path"
 msgstr "Nginx 访问日志路径"
 
-#: src/views/domain/DomainEdit.vue:223
+#: src/views/domain/DomainEdit.vue:222
 msgid "Nginx Configuration Parse Error"
 msgstr "Nginx 配置解析错误"
 
@@ -837,7 +844,7 @@ msgstr "控制 Nginx"
 msgid "Nginx Error Log Path"
 msgstr "Nginx 错误日志路径"
 
-#: src/routes/index.ts:129 src/views/nginx_log/NginxLog.vue:146
+#: src/routes/index.ts:128 src/views/nginx_log/NginxLog.vue:145
 msgid "Nginx Log"
 msgstr "Nginx 日志"
 
@@ -861,20 +868,20 @@ msgstr "取消"
 msgid "Node Secret"
 msgstr "节点密钥"
 
-#: src/routes/index.ts:207 src/routes/index.ts:209
+#: src/routes/index.ts:206 src/routes/index.ts:208
 msgid "Not Found"
 msgstr "找不到页面"
 
-#: src/views/domain/cert/CertInfo.vue:31
+#: src/views/domain/cert/CertInfo.vue:30
 msgid "Not Valid Before: %{date}"
 msgstr "此前无效: %{date}"
 
-#: src/views/cert/DNSCredential.vue:48
-#: src/views/domain/cert/components/AutoCertStepOne.vue:32
+#: src/views/certificate/DNSCredential.vue:48
+#: src/views/domain/cert/components/AutoCertStepOne.vue:38
 msgid "Note"
 msgstr "注意"
 
-#: src/views/domain/cert/components/ObtainCert.vue:249
+#: src/views/domain/cert/components/ObtainCert.vue:252
 msgid "Obtain certificate"
 msgstr "获取证书"
 
@@ -893,15 +900,19 @@ msgstr "离线"
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:140
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:346
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:104
-#: src/views/domain/cert/components/ObtainCert.vue:209
-#: src/views/domain/components/Deploy.vue:24
-#: src/views/domain/components/RightSettings.vue:50
+#: src/views/domain/cert/components/ObtainCert.vue:210
+#: src/views/domain/components/Deploy.vue:23
+#: src/views/domain/components/RightSettings.vue:51
 #: src/views/domain/DomainList.vue:144
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:215
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:47
 msgid "OK"
 msgstr "确定"
 
+#: src/views/certificate/DNSCredential.vue:58
+msgid "Once the verification is complete, the records will be removed."
+msgstr "一旦验证完成,这些记录将被删除。"
+
 #: src/components/NodeSelector/NodeSelector.vue:57
 #: src/components/NodeSelector/NodeSelector.vue:72
 #: src/views/dashboard/Environments.vue:100
@@ -909,7 +920,7 @@ msgstr "确定"
 msgid "Online"
 msgstr "在线"
 
-#: src/views/preference/Preference.vue:104
+#: src/views/preference/Preference.vue:102
 msgid "OpenAI"
 msgstr "OpenAI"
 
@@ -937,7 +948,7 @@ msgstr "参数"
 msgid "Password"
 msgstr "密码"
 
-#: src/views/other/Install.vue:111
+#: src/views/other/Install.vue:113
 msgid "Password (*)"
 msgstr "密码 (*)"
 
@@ -955,20 +966,13 @@ msgstr "执行核心升级错误"
 msgid "Performing core upgrade"
 msgstr "正在进行核心升级"
 
-#: src/views/cert/DNSCredential.vue:52
+#: src/views/certificate/DNSCredential.vue:52
 msgid ""
 "Please fill in the API authentication credentials provided by your DNS "
-"provider.\n"
-"We will add one or more TXT records to the DNS records of your domain for "
-"ownership verification.\n"
-"Once the verification is complete, the records will be removed.\n"
-"Please note that the time configurations below are all in seconds."
-msgstr ""
-"请填写您的DNS提供商提供的API认证凭证。我们将在你的域名的DNS记录中添加一个或多"
-"个TXT记录,以进行所有权验证。一旦验证完成,这些记录将被删除。请注意,下面的时"
-"间配置都是以秒为单位。"
+"provider."
+msgstr "请填写 DNS 提供商提供的 API 验证凭据。"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:49
+#: src/views/domain/cert/components/AutoCertStepOne.vue:55
 msgid ""
 "Please first add credentials in Certification > DNS Credentials, and then "
 "select one of the credentialsbelow to request the API of the DNS provider."
@@ -982,18 +986,23 @@ msgid ""
 "configuration!"
 msgstr "请输入名称,这将被用作新配置的文件名!"
 
-#: src/views/other/Install.vue:34
+#: src/views/other/Install.vue:35
 msgid "Please input your E-mail!"
 msgstr "请输入您的邮箱!"
 
-#: src/views/other/Install.vue:46 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:47 src/views/other/Login.vue:39
 msgid "Please input your password!"
 msgstr "请输入您的密码!"
 
-#: src/views/other/Install.vue:40 src/views/other/Login.vue:35
+#: src/views/other/Install.vue:41 src/views/other/Login.vue:33
 msgid "Please input your username!"
 msgstr "请输入您的用户名!"
 
+#: src/views/certificate/DNSCredential.vue:61
+msgid ""
+"Please note that the unit of time configurations below are all in seconds."
+msgstr "请注意,下面的时间单位配置均以秒为单位。"
+
 #: src/views/domain/components/SiteDuplicate.vue:47
 msgid "Please select at least one node!"
 msgstr "请至少选择一个节点!"
@@ -1002,7 +1011,7 @@ msgstr "请至少选择一个节点!"
 msgid "Pre-release"
 msgstr "预发布"
 
-#: src/routes/index.ts:168 src/views/preference/Preference.vue:87
+#: src/routes/index.ts:167 src/views/preference/Preference.vue:85
 msgid "Preference"
 msgstr "偏好设置"
 
@@ -1022,7 +1031,7 @@ msgstr "禁止删除默认用户"
 msgid "Project Team"
 msgstr "项目团队"
 
-#: src/views/cert/DNSCredential.vue:21
+#: src/views/certificate/DNSCredential.vue:21
 msgid "Provider"
 msgstr "提供商"
 
@@ -1090,9 +1099,9 @@ msgid "Running"
 msgstr "运行中"
 
 #: src/components/ChatGPT/ChatGPT.vue:259 src/views/config/ConfigEdit.vue:98
-#: src/views/domain/DomainEdit.vue:269
+#: src/views/domain/DomainEdit.vue:268
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:111
-#: src/views/preference/Preference.vue:115
+#: src/views/preference/Preference.vue:113
 msgid "Save"
 msgstr "保存"
 
@@ -1106,7 +1115,7 @@ msgid "Save error %{msg}"
 msgstr "保存错误 %{msg}"
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
-#: src/views/preference/Preference.vue:60
+#: src/views/preference/Preference.vue:58
 msgid "Save successfully"
 msgstr "保存成功"
 
@@ -1115,7 +1124,7 @@ msgid "Save Successfully"
 msgstr "保存成功"
 
 #: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:41
-#: src/views/domain/DomainEdit.vue:155
+#: src/views/domain/DomainEdit.vue:154
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
 msgid "Saved successfully"
 msgstr "保存成功"
@@ -1136,7 +1145,7 @@ msgstr "上传"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:45
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:157
 #: src/views/config/ConfigEdit.vue:42 src/views/domain/DomainList.vue:79
-#: src/views/other/Install.vue:71 src/views/preference/Preference.vue:62
+#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:60
 #: src/views/system/Upgrade.vue:45
 msgid "Server error"
 msgstr "服务器错误"
@@ -1145,11 +1154,11 @@ msgstr "服务器错误"
 msgid "Server Info"
 msgstr "服务器信息"
 
-#: src/views/domain/cert/components/ObtainCert.vue:164
+#: src/views/domain/cert/components/ObtainCert.vue:165
 msgid "server_name not found in directives"
 msgstr "未在指令集合中找到 server_name"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:22
+#: src/views/domain/cert/components/AutoCertStepOne.vue:27
 #: src/views/domain/DomainAdd.vue:119
 msgid "server_name parameter is required"
 msgstr "必须为 server_name 指令指明参数"
@@ -1162,30 +1171,30 @@ msgstr "正在设置环境变量"
 msgid "Single Directive"
 msgstr "单行指令"
 
-#: src/routes/index.ts:143
+#: src/routes/index.ts:142
 msgid "Site Logs"
 msgstr "站点列表"
 
-#: src/routes/index.ts:67
+#: src/routes/index.ts:66
 msgid "Sites List"
 msgstr "站点列表"
 
-#: src/views/cert/Cert.vue:64
+#: src/views/certificate/Certificate.vue:164
+msgid "SSL Certificate Content"
+msgstr "SSL 证书内容"
+
+#: src/views/certificate/Certificate.vue:171
+msgid "SSL Certificate Key Content"
+msgstr "SSL 证书密钥内容"
+
+#: src/views/certificate/Certificate.vue:73
 msgid "SSL Certificate Key Path"
 msgstr "SSL证书密钥路径"
 
-#: src/views/cert/Cert.vue:57
+#: src/views/certificate/Certificate.vue:65
 msgid "SSL Certificate Path"
 msgstr "SSL证书路径"
 
-#: src/views/cert/Cert.vue:139
-msgid "SSL Certification Content"
-msgstr "SSL证书内容"
-
-#: src/views/cert/Cert.vue:145
-msgid "SSL Certification Key Content"
-msgstr "SSL证书密钥内容"
-
 #: src/views/other/Login.vue:158
 msgid "SSO Login"
 msgstr "SSO 登录"
@@ -1206,7 +1215,7 @@ msgstr "已停止"
 msgid "Storage"
 msgstr "存储"
 
-#: src/views/domain/cert/CertInfo.vue:25
+#: src/views/domain/cert/CertInfo.vue:24
 msgid "Subject Name: %{subject}"
 msgstr "主体名称: %{subject}"
 
@@ -1222,7 +1231,7 @@ msgstr "切换到深色主题"
 msgid "Switch to light theme"
 msgstr "切换到浅色"
 
-#: src/routes/index.ts:176
+#: src/routes/index.ts:175
 msgid "System"
 msgstr "系统"
 
@@ -1234,7 +1243,7 @@ msgstr "列表"
 msgid "Target"
 msgstr "目标"
 
-#: src/routes/index.ts:121 src/views/pty/Terminal.vue:95
+#: src/routes/index.ts:120 src/views/pty/Terminal.vue:95
 msgid "Terminal"
 msgstr "终端"
 
@@ -1242,7 +1251,7 @@ msgstr "终端"
 msgid "Terminal Start Command"
 msgstr "终端启动命令"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:41
+#: src/views/domain/cert/components/AutoCertStepOne.vue:47
 msgid ""
 "The certificate for the domain will be checked 5 minutes, and will be "
 "renewed if it has been more than 1 week since it was last issued."
@@ -1250,11 +1259,11 @@ msgstr ""
 "域名证书将在 5 分钟内检查一次,如果距离上次签发证书已超过 1 周,则将更新证"
 "书。"
 
-#: src/views/other/Install.vue:52
+#: src/views/other/Install.vue:53
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr "文件名不能包含以下字符: %{c}"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:36
+#: src/views/domain/cert/components/AutoCertStepOne.vue:42
 msgid ""
 "The server_name in the current configuration must be the domain name you "
 "need to get the certificate, supportmultiple domains."
@@ -1264,8 +1273,8 @@ msgstr "当前配置中的 server_name 必须是获取证书所需的域名,
 msgid "The username or password is incorrect"
 msgstr "用户名或密码错误"
 
-#: src/views/cert/Cert.vue:102
-msgid "This auto-cert item is invalid, please remove it."
+#: src/views/certificate/Certificate.vue:115
+msgid "This Auto Cert item is invalid, please remove it."
 msgstr "这个证书自动续期项目是无效的,请删除。"
 
 #: src/components/StdDesign/StdDataEntry/StdFormItem.vue:31
@@ -1286,9 +1295,10 @@ msgstr ""
 msgid "Type"
 msgstr "类型"
 
-#: src/views/cert/Cert.vue:71 src/views/cert/DNSCredential.vue:26
-#: src/views/config/config.ts:29 src/views/config/ConfigEdit.vue:123
-#: src/views/domain/components/RightSettings.vue:82
+#: src/views/certificate/Certificate.vue:81
+#: src/views/certificate/DNSCredential.vue:26 src/views/config/config.ts:29
+#: src/views/config/ConfigEdit.vue:123
+#: src/views/domain/components/RightSettings.vue:84
 #: src/views/domain/DomainList.vue:44 src/views/environment/Environment.vue:98
 #: src/views/user/User.vue:40
 msgid "Updated at"
@@ -1298,7 +1308,7 @@ msgstr "修改时间"
 msgid "Updated successfully"
 msgstr "更新成功"
 
-#: src/routes/index.ts:187 src/views/system/Upgrade.vue:143
+#: src/routes/index.ts:186 src/views/system/Upgrade.vue:143
 #: src/views/system/Upgrade.vue:235
 msgid "Upgrade"
 msgstr "升级"
@@ -1327,7 +1337,7 @@ msgstr "用户"
 msgid "Username"
 msgstr "用户名"
 
-#: src/views/other/Install.vue:101
+#: src/views/other/Install.vue:103
 msgid "Username (*)"
 msgstr "用户名 (*)"
 
@@ -1343,13 +1353,19 @@ msgstr "使用 HTTP01 challenge provider"
 msgid "View"
 msgstr "查看"
 
-#: src/views/config/InspectConfig.vue:37
-#: src/views/domain/cert/components/AutoCertStepOne.vue:16
+#: src/views/config/InspectConfig.vue:36
+#: src/views/domain/cert/components/AutoCertStepOne.vue:21
 #: src/views/domain/DomainAdd.vue:114
 msgid "Warning"
 msgstr "警告"
 
-#: src/views/domain/cert/components/ObtainCert.vue:207
+#: src/views/certificate/DNSCredential.vue:55
+msgid ""
+"We will add one or more TXT records to the DNS records of your domain for "
+"ownership verification."
+msgstr "我们将在您域名的 DNS 记录中添加一个或多个 TXT 记录,以核实域名所有权。"
+
+#: src/views/domain/cert/components/ObtainCert.vue:208
 msgid ""
 "We will remove the HTTPChallenge configuration from this file and reload the "
 "Nginx. Are you sure you want to continue?"
@@ -1382,6 +1398,24 @@ msgstr "您使用的是最新版本"
 msgid "You can check Nginx UI upgrade at this page."
 msgstr "你可以在这个页面检查Nginx UI的升级。"
 
+#~ msgid "Auto cert is enabled, please do not modify this certification."
+#~ msgstr "自动更新已启用,请勿修改此证书配置。"
+
+#~ msgid ""
+#~ "Please fill in the API authentication credentials provided by your DNS "
+#~ "provider.\n"
+#~ "We will add one or more TXT records to the DNS records of your domain for "
+#~ "ownership verification.\n"
+#~ "Once the verification is complete, the records will be removed.\n"
+#~ "Please note that the unit of time configurations below are all in seconds."
+#~ msgstr ""
+#~ "请填写您的DNS提供商提供的API认证凭证。我们将在你的域名的DNS记录中添加一个"
+#~ "或多个TXT记录,以进行所有权验证。一旦验证完成,这些记录将被删除。请注意,"
+#~ "下面的时间配置都是以秒为单位。"
+
+#~ msgid "Certification"
+#~ msgstr "证书"
+
 #~ msgid "Delete ID: %{id}"
 #~ msgstr "删除 ID: %{id}"
 

+ 206 - 164
app/src/language/zh_TW/app.po

@@ -14,29 +14,25 @@ msgstr ""
 "Generated-By: easygettext\n"
 "X-Generator: Poedit 3.4.1\n"
 
-#: src/views/domain/cert/CertInfo.vue:28
-#, fuzzy
-msgid " Expiration Date: %{date}"
-msgstr "到期日期: %{date}"
-
-#: src/routes/index.ts:183
+#: src/routes/index.ts:182
 msgid "About"
 msgstr "關於"
 
-#: src/routes/index.ts:135 src/views/domain/ngx_conf/LogEntry.vue:78
+#: src/routes/index.ts:134 src/views/domain/ngx_conf/LogEntry.vue:78
 msgid "Access Logs"
 msgstr "存取日誌"
 
-#: src/views/cert/Cert.vue:77 src/views/cert/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/certificate/Certificate.vue:87
+#: 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
 msgid "Action"
 msgstr "操作"
 
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:114
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:115
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:307
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:308
 msgid "Add"
 msgstr "新增"
 
@@ -49,15 +45,15 @@ msgstr "在下方新增指令"
 msgid "Add Location"
 msgstr "新增 Location"
 
-#: src/routes/index.ts:71 src/views/domain/DomainAdd.vue:91
+#: src/routes/index.ts:70 src/views/domain/DomainAdd.vue:91
 msgid "Add Site"
 msgstr "新增網站"
 
-#: src/views/cert/DNSChallenge.vue:95
+#: src/views/certificate/DNSChallenge.vue:95
 msgid "Additional"
 msgstr "其他設定"
 
-#: src/views/domain/DomainEdit.vue:205
+#: src/views/domain/DomainEdit.vue:204
 msgid "Advance Mode"
 msgstr "進階模式"
 
@@ -107,32 +103,35 @@ msgstr "助理"
 msgid "Author"
 msgstr "作者"
 
-#: src/views/cert/Cert.vue:38 src/views/domain/cert/ChangeCert.vue:37
+#: src/views/certificate/Certificate.vue:46
+#: src/views/domain/cert/ChangeCert.vue:37
 msgid "Auto Cert"
 msgstr "自動憑證"
 
-#: src/views/cert/Cert.vue:92
-msgid "Auto cert is enabled, please do not modify this certification."
-msgstr "自動憑證已啟用,請勿修改此憑證。"
+#: src/views/certificate/Certificate.vue:105
+#, fuzzy
+msgid "Auto Cert is enabled"
+msgstr "自動憑證"
+
+#: src/views/certificate/Certificate.vue:135
+#, fuzzy
+msgid "Auto Cert Log"
+msgstr "自動憑證日誌"
 
-#: src/views/nginx_log/NginxLog.vue:150
+#: src/views/nginx_log/NginxLog.vue:149
 msgid "Auto Refresh"
 msgstr "自動重新整理"
 
-#: src/views/cert/Cert.vue:122
-msgid "Auto-Cert Log"
-msgstr "自動憑證日誌"
-
-#: src/views/domain/cert/components/ObtainCert.vue:125
+#: src/views/domain/cert/components/ObtainCert.vue:126
 msgid "Auto-renewal disabled for %{name}"
 msgstr "已關閉 %{name} 的自動續簽"
 
-#: src/views/domain/cert/components/ObtainCert.vue:118
+#: src/views/domain/cert/components/ObtainCert.vue:119
 msgid "Auto-renewal enabled for %{name}"
 msgstr "已啟用 %{name} 的自動續簽"
 
 #: src/views/config/Config.vue:75 src/views/config/ConfigEdit.vue:89
-#: src/views/domain/DomainEdit.vue:262 src/views/nginx_log/NginxLog.vue:171
+#: src/views/domain/DomainEdit.vue:261 src/views/nginx_log/NginxLog.vue:170
 msgid "Back"
 msgstr "返回"
 
@@ -145,12 +144,12 @@ msgid "Base information"
 msgstr "基本資訊"
 
 #: src/views/config/ConfigEdit.vue:117
-#: src/views/domain/components/RightSettings.vue:71
-#: src/views/preference/Preference.vue:92
+#: src/views/domain/components/RightSettings.vue:73
+#: src/views/preference/Preference.vue:90
 msgid "Basic"
 msgstr "基本"
 
-#: src/views/domain/DomainEdit.vue:208
+#: src/views/domain/DomainEdit.vue:207
 msgid "Basic Mode"
 msgstr "基本模式"
 
@@ -171,35 +170,38 @@ msgstr "CADir"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:58
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:139
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
-#: src/views/domain/cert/components/ObtainCert.vue:210
-#: src/views/domain/components/Deploy.vue:25
-#: src/views/domain/components/RightSettings.vue:51
+#: src/views/domain/cert/components/ObtainCert.vue:211
+#: src/views/domain/components/Deploy.vue:24
+#: src/views/domain/components/RightSettings.vue:52
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:216
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:48
 msgid "Cancel"
 msgstr "取消"
 
-#: src/views/domain/cert/CertInfo.vue:36
+#: src/views/domain/cert/CertInfo.vue:35
 msgid "Certificate has expired"
 msgstr "此憑證已過期"
 
-#: src/views/domain/cert/CertInfo.vue:40
+#: src/views/domain/cert/CertInfo.vue:39
 msgid "Certificate is valid"
 msgstr "此憑證有效"
 
-#: src/views/cert/Cert.vue:132 src/views/domain/cert/Cert.vue:35
+#: src/views/certificate/Certificate.vue:145 src/views/domain/cert/Cert.vue:35
 msgid "Certificate Status"
 msgstr "憑證狀態"
 
-#: src/routes/index.ts:101 src/views/cert/Cert.vue:84
-msgid "Certification"
-msgstr "憑證"
+#: src/routes/index.ts:100 src/views/certificate/Certificate.vue:96
+#, fuzzy
+msgid "Certificates"
+msgstr "憑證狀態"
 
-#: src/routes/index.ts:109
-msgid "Certification List"
+#: src/routes/index.ts:108
+#, fuzzy
+msgid "Certificates List"
 msgstr "憑證清單"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:57
+#: src/views/certificate/Certificate.vue:150
+#: src/views/domain/cert/components/AutoCertStepOne.vue:63
 msgid "Challenge Method"
 msgstr "驗證方式"
 
@@ -235,11 +237,11 @@ 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
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:283
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:284
 msgid "Comments"
 msgstr "備註"
 
-#: src/views/cert/Cert.vue:33
+#: src/views/certificate/Certificate.vue:41
 msgid "Config Name"
 msgstr "設定名稱"
 
@@ -247,7 +249,7 @@ msgstr "設定名稱"
 msgid "Config Templates"
 msgstr "設定模板"
 
-#: src/views/config/InspectConfig.vue:31
+#: src/views/config/InspectConfig.vue:30
 msgid "Configuration file is test successful"
 msgstr "設定檔案測試成功"
 
@@ -301,7 +303,7 @@ msgstr "建立客戶端方便與CA伺服器通訊"
 msgid "Credential"
 msgstr "認證"
 
-#: src/views/cert/DNSChallenge.vue:83
+#: src/views/certificate/DNSChallenge.vue:83
 msgid "Credentials"
 msgstr "認證資訊"
 
@@ -310,7 +312,7 @@ msgid "Current Version"
 msgstr "目前版本"
 
 #: src/views/domain/ngx_conf/config_template/ConfigTemplate.vue:122
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:240
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:241
 msgid "Custom"
 msgstr "自訂"
 
@@ -318,13 +320,13 @@ msgstr "自訂"
 msgid "Dashboard"
 msgstr "儀表板"
 
-#: src/views/other/Install.vue:122
+#: src/views/other/Install.vue:124
 msgid "Database (Optional, default: database)"
 msgstr "資料庫 (可選,預設: database)"
 
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:354
 #: src/views/domain/DomainList.vue:153
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:258
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:259
 msgid "Delete"
 msgstr "刪除"
 
@@ -338,19 +340,19 @@ msgid "Deleted successfully"
 msgstr "成功停用"
 
 #: src/views/domain/components/Deploy.vue:109
-#: src/views/domain/components/RightSettings.vue:89
+#: src/views/domain/components/RightSettings.vue:91
 msgid "Deploy"
 msgstr "部署"
 
-#: src/views/domain/components/Deploy.vue:67
+#: src/views/domain/components/Deploy.vue:66
 msgid "Deploy %{conf_name} to %{node_name} failed"
 msgstr "部署 %{conf_name} 至 %{node_name} 失敗"
 
-#: src/views/domain/components/Deploy.vue:41
+#: src/views/domain/components/Deploy.vue:40
 msgid "Deploy %{conf_name} to %{node_name} successfully"
 msgstr "成功部署 %{conf_name} 至 %{node_name}"
 
-#: src/views/domain/components/Deploy.vue:39
+#: src/views/domain/components/Deploy.vue:38
 msgid "Deploy successfully"
 msgstr "部署成功"
 
@@ -380,16 +382,17 @@ msgstr "指令"
 msgid "Disable"
 msgstr "停用"
 
-#: src/views/domain/cert/components/ObtainCert.vue:127
+#: src/views/domain/cert/components/ObtainCert.vue:128
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "關閉 %{name} 自動續簽失敗"
 
-#: src/views/cert/Cert.vue:49 src/views/domain/cert/ChangeCert.vue:48
-#: src/views/domain/DomainEdit.vue:191 src/views/domain/DomainList.vue:123
+#: src/views/certificate/Certificate.vue:57
+#: src/views/domain/cert/ChangeCert.vue:48 src/views/domain/DomainEdit.vue:190
+#: src/views/domain/DomainList.vue:123
 msgid "Disabled"
 msgstr "停用"
 
-#: src/views/domain/components/RightSettings.vue:38
+#: src/views/domain/components/RightSettings.vue:39
 #: src/views/domain/DomainList.vue:67
 msgid "Disabled successfully"
 msgstr "成功停用"
@@ -398,33 +401,33 @@ msgstr "成功停用"
 msgid "Disk IO"
 msgstr "磁碟 IO"
 
-#: src/routes/index.ts:114 src/views/cert/DNSCredential.vue:39
+#: src/routes/index.ts:113 src/views/certificate/DNSCredential.vue:39
 msgid "DNS Credentials"
 msgstr "DNS 認證"
 
-#: src/views/cert/DNSChallenge.vue:74
+#: src/views/certificate/DNSChallenge.vue:74
 #: src/views/domain/cert/components/DNSChallenge.vue:79
 msgid "DNS Provider"
 msgstr "DNS 供應商"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:63
+#: src/views/domain/cert/components/AutoCertStepOne.vue:69
 msgid "DNS01"
 msgstr "DNS01"
 
-#: src/views/domain/components/Deploy.vue:20
+#: src/views/domain/components/Deploy.vue:19
 msgid "Do you want to deploy this file to remote server?"
 msgid_plural "Do you want to deploy this file to remote servers?"
 msgstr[0] "您要將此檔案部署至遠端伺服器嗎?"
 
-#: src/views/domain/cert/components/ObtainCert.vue:206
+#: src/views/domain/cert/components/ObtainCert.vue:207
 msgid "Do you want to disable auto-cert renewal?"
 msgstr "您要停用自動憑證續訂嗎?"
 
-#: src/views/domain/components/RightSettings.vue:47
+#: src/views/domain/components/RightSettings.vue:48
 msgid "Do you want to disable this site?"
 msgstr "您想停用這個網站嗎?"
 
-#: src/views/domain/components/RightSettings.vue:47
+#: src/views/domain/components/RightSettings.vue:48
 msgid "Do you want to enable this site?"
 msgstr "您要啟用此網站嗎?"
 
@@ -440,8 +443,9 @@ msgstr "您要移除此伺服器嗎?"
 msgid "Domain Config Created Successfully"
 msgstr "網域設定檔成功建立"
 
-#: src/views/cert/Cert.vue:112
-msgid "Domains list is empty, try to reopen auto-cert for %{config}"
+#: src/views/certificate/Certificate.vue:125
+#, fuzzy
+msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr "網域列表為空,請嘗試重新開啟 %{config} 的自動憑證"
 
 #: src/language/constants.ts:29
@@ -477,19 +481,19 @@ msgstr "複製成功"
 msgid "Duplicate to local successfully"
 msgstr "成功複製至本機"
 
-#: src/views/domain/DomainEdit.vue:180
+#: src/views/domain/DomainEdit.vue:179
 msgid "Edit %{n}"
 msgstr "編輯 %{n}"
 
-#: src/routes/index.ts:93 src/views/config/ConfigEdit.vue:83
+#: src/routes/index.ts:92 src/views/config/ConfigEdit.vue:83
 msgid "Edit Configuration"
 msgstr "編輯設定"
 
-#: src/routes/index.ts:75
+#: src/routes/index.ts:74
 msgid "Edit Site"
 msgstr "編輯網站"
 
-#: src/views/other/Install.vue:91
+#: src/views/other/Install.vue:93
 msgid "Email (*)"
 msgstr "電子郵件 (*)"
 
@@ -497,15 +501,15 @@ msgstr "電子郵件 (*)"
 msgid "Enable"
 msgstr "啟用"
 
-#: src/views/domain/components/Deploy.vue:56
+#: src/views/domain/components/Deploy.vue:55
 msgid "Enable %{conf_name} in %{node_name} failed"
 msgstr "在 %{node_name} 啟用 %{conf_name} 失敗"
 
-#: src/views/domain/components/Deploy.vue:50
+#: src/views/domain/components/Deploy.vue:49
 msgid "Enable %{conf_name} in %{node_name} successfully"
 msgstr "成功在 %{node_name} 啟用 %{conf_name}"
 
-#: src/views/domain/cert/components/ObtainCert.vue:120
+#: src/views/domain/cert/components/ObtainCert.vue:121
 msgid "Enable auto-renewal failed for %{name}"
 msgstr "啟用 %{name} 自動續簽失敗"
 
@@ -513,22 +517,23 @@ msgstr "啟用 %{name} 自動續簽失敗"
 msgid "Enable failed"
 msgstr "啟用失敗"
 
-#: src/views/domain/components/Deploy.vue:48
+#: src/views/domain/components/Deploy.vue:47
 msgid "Enable successfully"
 msgstr "啟用成功"
 
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:235
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:236
 msgid "Enable TLS"
 msgstr "啟用 TLS"
 
-#: src/views/cert/Cert.vue:45 src/views/domain/cert/ChangeCert.vue:44
+#: src/views/certificate/Certificate.vue:53
+#: src/views/domain/cert/ChangeCert.vue:44
 #: src/views/domain/components/Deploy.vue:89
-#: src/views/domain/components/RightSettings.vue:73
-#: src/views/domain/DomainEdit.vue:185 src/views/domain/DomainList.vue:131
+#: src/views/domain/components/RightSettings.vue:75
+#: src/views/domain/DomainEdit.vue:184 src/views/domain/DomainList.vue:131
 msgid "Enabled"
 msgstr "已啟用"
 
-#: src/views/domain/components/RightSettings.vue:29
+#: src/views/domain/components/RightSettings.vue:30
 #: src/views/domain/components/SiteDuplicate.vue:100
 #: src/views/domain/DomainAdd.vue:45 src/views/domain/DomainList.vue:58
 msgid "Enabled successfully"
@@ -538,7 +543,7 @@ msgstr "成功啟用"
 msgid "Encrypt website with Let's Encrypt"
 msgstr "用 Let's Encrypt 對網站進行加密"
 
-#: src/routes/index.ts:152 src/views/environment/Environment.vue:113
+#: src/routes/index.ts:151 src/views/environment/Environment.vue:113
 msgid "Environment"
 msgstr "環境"
 
@@ -546,11 +551,11 @@ msgstr "環境"
 msgid "Environments"
 msgstr "環境"
 
-#: src/views/config/InspectConfig.vue:48
+#: src/views/config/InspectConfig.vue:47
 msgid "Error"
 msgstr "錯誤"
 
-#: src/routes/index.ts:139 src/views/domain/ngx_conf/LogEntry.vue:86
+#: src/routes/index.ts:138 src/views/domain/ngx_conf/LogEntry.vue:86
 msgid "Error Logs"
 msgstr "錯誤日誌"
 
@@ -558,17 +563,22 @@ msgstr "錯誤日誌"
 msgid "Executable Path"
 msgstr "可執行檔路徑"
 
+#: src/views/domain/cert/CertInfo.vue:27
+#, fuzzy
+msgid "Expired At: %{date}"
+msgstr "到期日期: %{date}"
+
 #: src/components/StdDesign/StdDataDisplay/methods/exportCsv.ts:68
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:296
 msgid "Export"
 msgstr "匯出"
 
-#: src/views/domain/components/RightSettings.vue:41
+#: src/views/domain/components/RightSettings.vue:42
 #: src/views/domain/DomainList.vue:70
 msgid "Failed to disable %{msg}"
 msgstr "停用 %{msg} 失敗"
 
-#: src/views/domain/components/RightSettings.vue:32
+#: src/views/domain/components/RightSettings.vue:33
 #: src/views/domain/DomainList.vue:61
 msgid "Failed to enable %{msg}"
 msgstr "啟用 %{msg} 失敗"
@@ -577,7 +587,7 @@ msgstr "啟用 %{msg} 失敗"
 msgid "Failed to get certificate information"
 msgstr "取得憑證資訊失敗"
 
-#: src/views/domain/DomainEdit.vue:139
+#: src/views/domain/DomainEdit.vue:138
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "儲存失敗,在設定中檢測到語法錯誤。"
 
@@ -593,7 +603,7 @@ msgstr "檔案已存在"
 msgid "File Not Found"
 msgstr "找不到檔案"
 
-#: src/views/nginx_log/NginxLog.vue:153
+#: src/views/nginx_log/NginxLog.vue:152
 msgid "Filter"
 msgstr "篩選"
 
@@ -625,7 +635,7 @@ msgstr "產生註冊帳號的私鑰"
 msgid "Get release information error"
 msgstr "取得發布資訊錯誤"
 
-#: src/views/domain/cert/components/ObtainCert.vue:63
+#: src/views/domain/cert/components/ObtainCert.vue:64
 msgid "Getting the certificate, please wait..."
 msgstr "正在取得憑證,請稍候..."
 
@@ -665,7 +675,7 @@ msgstr "HTTP 監聽主機"
 msgid "HTTP Port"
 msgstr "HTTP 監聽埠"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:60
+#: src/views/domain/cert/components/AutoCertStepOne.vue:66
 msgid "HTTP01"
 msgstr "HTTP01"
 
@@ -677,15 +687,15 @@ msgstr "初始化核心升級程式錯誤"
 msgid "Initialing core upgrader"
 msgstr "正在初始化核心升級程式"
 
-#: src/routes/index.ts:195 src/views/other/Install.vue:137
+#: src/routes/index.ts:194 src/views/other/Install.vue:139
 msgid "Install"
 msgstr "安裝"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:68
 msgid "Install successfully"
 msgstr "安裝成功"
 
-#: src/views/domain/cert/CertInfo.vue:22
+#: src/views/domain/cert/CertInfo.vue:21
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "中級憑證頒發機構: %{issuer}"
 
@@ -736,11 +746,11 @@ msgstr "Location"
 msgid "Locations"
 msgstr "Locations"
 
-#: src/routes/index.ts:201 src/views/other/Login.vue:147
+#: src/routes/index.ts:200 src/views/other/Login.vue:147
 msgid "Login"
 msgstr "登入"
 
-#: src/views/other/Login.vue:53 src/views/other/Login.vue:99
+#: src/views/other/Login.vue:51 src/views/other/Login.vue:97
 msgid "Login successful"
 msgstr "登入成功"
 
@@ -748,22 +758,22 @@ msgstr "登入成功"
 msgid "Logout successful"
 msgstr "登出成功"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:45
+#: src/views/domain/cert/components/AutoCertStepOne.vue:51
 msgid ""
 "Make sure you have configured a reverse proxy for .well-known directory to "
 "HTTPChallengePort before obtaining the certificate."
 msgstr ""
 "在取得憑證前,請確保您已將 .well-known 目錄反向代理到 HTTPChallengePort。"
 
-#: src/routes/index.ts:84
+#: src/routes/index.ts:83
 msgid "Manage Configs"
 msgstr "管理設定"
 
-#: src/routes/index.ts:59 src/views/domain/DomainList.vue:102
+#: src/routes/index.ts:58 src/views/domain/DomainList.vue:102
 msgid "Manage Sites"
 msgstr "管理網站"
 
-#: src/routes/index.ts:160 src/views/user/User.vue:53
+#: src/routes/index.ts:159 src/views/user/User.vue:53
 msgid "Manage Users"
 msgstr "管理使用者"
 
@@ -778,6 +788,7 @@ msgstr "記憶體與儲存"
 #: src/components/ChatGPT/ChatGPT.vue:256
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:137
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:336
+#: src/views/certificate/Certificate.vue:156
 msgid "Modify"
 msgstr "修改"
 
@@ -789,9 +800,10 @@ msgstr "修改設定"
 msgid "Multi-line Directive"
 msgstr "多行指令"
 
-#: src/views/cert/Cert.vue:17 src/views/cert/DNSCredential.vue:13
-#: src/views/config/config.ts:9 src/views/domain/cert/ChangeCert.vue:21
-#: src/views/domain/components/RightSettings.vue:79
+#: src/views/certificate/Certificate.vue:24
+#: 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
 #: src/views/domain/components/SiteDuplicate.vue:135
 #: src/views/domain/DomainList.vue:16 src/views/environment/Environment.vue:15
 msgid "Name"
@@ -817,12 +829,12 @@ msgstr "上傳流量"
 msgid "New version released"
 msgstr "新版本發布"
 
-#: src/views/domain/cert/components/ObtainCert.vue:278
+#: src/views/domain/cert/components/ObtainCert.vue:281
 #: src/views/domain/DomainAdd.vue:140
 msgid "Next"
 msgstr "下一步"
 
-#: src/views/preference/Preference.vue:98
+#: src/views/preference/Preference.vue:96
 msgid "Nginx"
 msgstr "Nginx"
 
@@ -830,7 +842,7 @@ msgstr "Nginx"
 msgid "Nginx Access Log Path"
 msgstr "Nginx 存取日誌路徑"
 
-#: src/views/domain/DomainEdit.vue:223
+#: src/views/domain/DomainEdit.vue:222
 msgid "Nginx Configuration Parse Error"
 msgstr "Nginx 設定解析錯誤"
 
@@ -842,7 +854,7 @@ msgstr "Nginx 控制元件"
 msgid "Nginx Error Log Path"
 msgstr "Nginx 錯誤日誌路徑"
 
-#: src/routes/index.ts:129 src/views/nginx_log/NginxLog.vue:146
+#: src/routes/index.ts:128 src/views/nginx_log/NginxLog.vue:145
 msgid "Nginx Log"
 msgstr "Nginx 日誌"
 
@@ -866,20 +878,20 @@ msgstr "取消"
 msgid "Node Secret"
 msgstr "Node Secret"
 
-#: src/routes/index.ts:207 src/routes/index.ts:209
+#: src/routes/index.ts:206 src/routes/index.ts:208
 msgid "Not Found"
 msgstr "找不到頁面"
 
-#: src/views/domain/cert/CertInfo.vue:31
+#: src/views/domain/cert/CertInfo.vue:30
 msgid "Not Valid Before: %{date}"
 msgstr "此前無效: %{date}"
 
-#: src/views/cert/DNSCredential.vue:48
-#: src/views/domain/cert/components/AutoCertStepOne.vue:32
+#: src/views/certificate/DNSCredential.vue:48
+#: src/views/domain/cert/components/AutoCertStepOne.vue:38
 msgid "Note"
 msgstr "備註"
 
-#: src/views/domain/cert/components/ObtainCert.vue:249
+#: src/views/domain/cert/components/ObtainCert.vue:252
 msgid "Obtain certificate"
 msgstr "取得憑證"
 
@@ -898,15 +910,19 @@ msgstr "離線"
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:140
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:346
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:104
-#: src/views/domain/cert/components/ObtainCert.vue:209
-#: src/views/domain/components/Deploy.vue:24
-#: src/views/domain/components/RightSettings.vue:50
+#: src/views/domain/cert/components/ObtainCert.vue:210
+#: src/views/domain/components/Deploy.vue:23
+#: src/views/domain/components/RightSettings.vue:51
 #: src/views/domain/DomainList.vue:144
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:215
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:47
 msgid "OK"
 msgstr "確定"
 
+#: src/views/certificate/DNSCredential.vue:58
+msgid "Once the verification is complete, the records will be removed."
+msgstr ""
+
 #: src/components/NodeSelector/NodeSelector.vue:57
 #: src/components/NodeSelector/NodeSelector.vue:72
 #: src/views/dashboard/Environments.vue:100
@@ -914,7 +930,7 @@ msgstr "確定"
 msgid "Online"
 msgstr "線上"
 
-#: src/views/preference/Preference.vue:104
+#: src/views/preference/Preference.vue:102
 msgid "OpenAI"
 msgstr "OpenAI"
 
@@ -942,7 +958,7 @@ msgstr "參數"
 msgid "Password"
 msgstr "密碼"
 
-#: src/views/other/Install.vue:111
+#: src/views/other/Install.vue:113
 msgid "Password (*)"
 msgstr "密碼 (*)"
 
@@ -960,21 +976,13 @@ msgstr "執行核心升級錯誤"
 msgid "Performing core upgrade"
 msgstr "正在執行核心升級"
 
-#: src/views/cert/DNSCredential.vue:52
-#, fuzzy
+#: src/views/certificate/DNSCredential.vue:52
 msgid ""
 "Please fill in the API authentication credentials provided by your DNS "
-"provider.\n"
-"We will add one or more TXT records to the DNS records of your domain for "
-"ownership verification.\n"
-"Once the verification is complete, the records will be removed.\n"
-"Please note that the time configurations below are all in seconds."
+"provider."
 msgstr ""
-"請填寫您的 DNS 供應商提供的 API 身份驗證認證。我們會將一個或多個 TXT 記錄新增"
-"到您網域的 DNS 記錄中以進行所有權驗證。驗證完成後,記錄將被刪除。請注意,以下"
-"時間設定均以秒為單位。"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:49
+#: src/views/domain/cert/components/AutoCertStepOne.vue:55
 #, fuzzy
 msgid ""
 "Please first add credentials in Certification > DNS Credentials, and then "
@@ -989,18 +997,23 @@ msgid ""
 "configuration!"
 msgstr "請輸入名稱,這將作為新設定的檔名!"
 
-#: src/views/other/Install.vue:34
+#: src/views/other/Install.vue:35
 msgid "Please input your E-mail!"
 msgstr "請輸入您的電子郵件!"
 
-#: src/views/other/Install.vue:46 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:47 src/views/other/Login.vue:39
 msgid "Please input your password!"
 msgstr "請輸入您的密碼!"
 
-#: src/views/other/Install.vue:40 src/views/other/Login.vue:35
+#: src/views/other/Install.vue:41 src/views/other/Login.vue:33
 msgid "Please input your username!"
 msgstr "請輸入您的使用者名稱!"
 
+#: src/views/certificate/DNSCredential.vue:61
+msgid ""
+"Please note that the unit of time configurations below are all in seconds."
+msgstr ""
+
 #: src/views/domain/components/SiteDuplicate.vue:47
 msgid "Please select at least one node!"
 msgstr "請至少選擇一個節點!"
@@ -1009,7 +1022,7 @@ msgstr "請至少選擇一個節點!"
 msgid "Pre-release"
 msgstr "預先發布"
 
-#: src/routes/index.ts:168 src/views/preference/Preference.vue:87
+#: src/routes/index.ts:167 src/views/preference/Preference.vue:85
 msgid "Preference"
 msgstr "偏好設定"
 
@@ -1029,7 +1042,7 @@ msgstr "禁止刪除預設使用者"
 msgid "Project Team"
 msgstr "專案團隊"
 
-#: src/views/cert/DNSCredential.vue:21
+#: src/views/certificate/DNSCredential.vue:21
 msgid "Provider"
 msgstr "供應商"
 
@@ -1097,9 +1110,9 @@ msgid "Running"
 msgstr "執行中"
 
 #: src/components/ChatGPT/ChatGPT.vue:259 src/views/config/ConfigEdit.vue:98
-#: src/views/domain/DomainEdit.vue:269
+#: src/views/domain/DomainEdit.vue:268
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:111
-#: src/views/preference/Preference.vue:115
+#: src/views/preference/Preference.vue:113
 msgid "Save"
 msgstr "儲存"
 
@@ -1113,7 +1126,7 @@ msgid "Save error %{msg}"
 msgstr "儲存錯誤 %{msg}"
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
-#: src/views/preference/Preference.vue:60
+#: src/views/preference/Preference.vue:58
 msgid "Save successfully"
 msgstr "儲存成功"
 
@@ -1122,7 +1135,7 @@ msgid "Save Successfully"
 msgstr "儲存成功"
 
 #: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:41
-#: src/views/domain/DomainEdit.vue:155
+#: src/views/domain/DomainEdit.vue:154
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
 msgid "Saved successfully"
 msgstr "儲存成功"
@@ -1143,7 +1156,7 @@ msgstr "傳送"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:45
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:157
 #: src/views/config/ConfigEdit.vue:42 src/views/domain/DomainList.vue:79
-#: src/views/other/Install.vue:71 src/views/preference/Preference.vue:62
+#: src/views/other/Install.vue:72 src/views/preference/Preference.vue:60
 #: src/views/system/Upgrade.vue:45
 msgid "Server error"
 msgstr "伺服器錯誤"
@@ -1152,11 +1165,11 @@ msgstr "伺服器錯誤"
 msgid "Server Info"
 msgstr "伺服器資訊"
 
-#: src/views/domain/cert/components/ObtainCert.vue:164
+#: src/views/domain/cert/components/ObtainCert.vue:165
 msgid "server_name not found in directives"
 msgstr "在指令中未找到 server_name"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:22
+#: src/views/domain/cert/components/AutoCertStepOne.vue:27
 #: src/views/domain/DomainAdd.vue:119
 msgid "server_name parameter is required"
 msgstr "必須提供 server_name 參數"
@@ -1169,30 +1182,32 @@ msgstr "設定環境變數中"
 msgid "Single Directive"
 msgstr "單一指令"
 
-#: src/routes/index.ts:143
+#: src/routes/index.ts:142
 msgid "Site Logs"
 msgstr "網站日誌"
 
-#: src/routes/index.ts:67
+#: src/routes/index.ts:66
 msgid "Sites List"
 msgstr "網站列表"
 
-#: src/views/cert/Cert.vue:64
+#: src/views/certificate/Certificate.vue:164
+#, fuzzy
+msgid "SSL Certificate Content"
+msgstr "SSL 認證內容"
+
+#: src/views/certificate/Certificate.vue:171
+#, fuzzy
+msgid "SSL Certificate Key Content"
+msgstr "SSL 憑證金鑰內容"
+
+#: src/views/certificate/Certificate.vue:73
 msgid "SSL Certificate Key Path"
 msgstr "SSL 憑證金鑰路徑"
 
-#: src/views/cert/Cert.vue:57
+#: src/views/certificate/Certificate.vue:65
 msgid "SSL Certificate Path"
 msgstr "SSL 憑證路徑"
 
-#: src/views/cert/Cert.vue:139
-msgid "SSL Certification Content"
-msgstr "SSL 認證內容"
-
-#: src/views/cert/Cert.vue:145
-msgid "SSL Certification Key Content"
-msgstr "SSL 憑證金鑰內容"
-
 #: src/views/other/Login.vue:158
 #, fuzzy
 msgid "SSO Login"
@@ -1214,7 +1229,7 @@ msgstr "已停止"
 msgid "Storage"
 msgstr "儲存空間"
 
-#: src/views/domain/cert/CertInfo.vue:25
+#: src/views/domain/cert/CertInfo.vue:24
 #, fuzzy
 msgid "Subject Name: %{subject}"
 msgstr "主體名稱: %{name}"
@@ -1231,7 +1246,7 @@ msgstr ""
 msgid "Switch to light theme"
 msgstr ""
 
-#: src/routes/index.ts:176
+#: src/routes/index.ts:175
 msgid "System"
 msgstr "系統"
 
@@ -1243,7 +1258,7 @@ msgstr "表格"
 msgid "Target"
 msgstr "目標"
 
-#: src/routes/index.ts:121 src/views/pty/Terminal.vue:95
+#: src/routes/index.ts:120 src/views/pty/Terminal.vue:95
 msgid "Terminal"
 msgstr "終端機"
 
@@ -1251,7 +1266,7 @@ msgstr "終端機"
 msgid "Terminal Start Command"
 msgstr "終端機啟動指令"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:41
+#: src/views/domain/cert/components/AutoCertStepOne.vue:47
 #, fuzzy
 msgid ""
 "The certificate for the domain will be checked 5 minutes, and will be "
@@ -1260,11 +1275,11 @@ msgstr ""
 "系統將會每小時檢測一次該域名的憑證,若距離上次簽發已超過 1 週,則將自動續簽。"
 "<br/>如果您之前沒有憑證,請先點選「從 Let's Encrypt 取得憑證」。"
 
-#: src/views/other/Install.vue:52
+#: src/views/other/Install.vue:53
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr "檔名不能包含以下字元: %{c}"
 
-#: src/views/domain/cert/components/AutoCertStepOne.vue:36
+#: src/views/domain/cert/components/AutoCertStepOne.vue:42
 #, fuzzy
 msgid ""
 "The server_name in the current configuration must be the domain name you "
@@ -1275,8 +1290,9 @@ msgstr "注意:目前設定中的 server_name 必須為需要申請憑證的
 msgid "The username or password is incorrect"
 msgstr "使用者名稱或密碼不正確"
 
-#: src/views/cert/Cert.vue:102
-msgid "This auto-cert item is invalid, please remove it."
+#: src/views/certificate/Certificate.vue:115
+#, fuzzy
+msgid "This Auto Cert item is invalid, please remove it."
 msgstr "此自動憑證項目無效,請將其移除。"
 
 #: src/components/StdDesign/StdDataEntry/StdFormItem.vue:31
@@ -1297,9 +1313,10 @@ msgstr ""
 msgid "Type"
 msgstr "類型"
 
-#: src/views/cert/Cert.vue:71 src/views/cert/DNSCredential.vue:26
-#: src/views/config/config.ts:29 src/views/config/ConfigEdit.vue:123
-#: src/views/domain/components/RightSettings.vue:82
+#: src/views/certificate/Certificate.vue:81
+#: src/views/certificate/DNSCredential.vue:26 src/views/config/config.ts:29
+#: src/views/config/ConfigEdit.vue:123
+#: src/views/domain/components/RightSettings.vue:84
 #: src/views/domain/DomainList.vue:44 src/views/environment/Environment.vue:98
 #: src/views/user/User.vue:40
 msgid "Updated at"
@@ -1309,7 +1326,7 @@ msgstr "更新時間"
 msgid "Updated successfully"
 msgstr "更新成功"
 
-#: src/routes/index.ts:187 src/views/system/Upgrade.vue:143
+#: src/routes/index.ts:186 src/views/system/Upgrade.vue:143
 #: src/views/system/Upgrade.vue:235
 msgid "Upgrade"
 msgstr "升級"
@@ -1338,7 +1355,7 @@ msgstr "使用者名稱"
 msgid "Username"
 msgstr "使用者名稱"
 
-#: src/views/other/Install.vue:101
+#: src/views/other/Install.vue:103
 msgid "Username (*)"
 msgstr "使用者名稱 (*)"
 
@@ -1354,13 +1371,19 @@ msgstr "使用 HTTP01 挑戰提供者"
 msgid "View"
 msgstr "檢視"
 
-#: src/views/config/InspectConfig.vue:37
-#: src/views/domain/cert/components/AutoCertStepOne.vue:16
+#: src/views/config/InspectConfig.vue:36
+#: src/views/domain/cert/components/AutoCertStepOne.vue:21
 #: src/views/domain/DomainAdd.vue:114
 msgid "Warning"
 msgstr "警告"
 
-#: src/views/domain/cert/components/ObtainCert.vue:207
+#: src/views/certificate/DNSCredential.vue:55
+msgid ""
+"We will add one or more TXT records to the DNS records of your domain for "
+"ownership verification."
+msgstr ""
+
+#: src/views/domain/cert/components/ObtainCert.vue:208
 msgid ""
 "We will remove the HTTPChallenge configuration from this file and reload the "
 "Nginx. Are you sure you want to continue?"
@@ -1394,6 +1417,25 @@ msgstr "您正在使用最新版本"
 msgid "You can check Nginx UI upgrade at this page."
 msgstr "您可以在此頁面檢查 Nginx UI 的升級。"
 
+#~ msgid "Auto cert is enabled, please do not modify this certification."
+#~ msgstr "自動憑證已啟用,請勿修改此憑證。"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please fill in the API authentication credentials provided by your DNS "
+#~ "provider.\n"
+#~ "We will add one or more TXT records to the DNS records of your domain for "
+#~ "ownership verification.\n"
+#~ "Once the verification is complete, the records will be removed.\n"
+#~ "Please note that the unit of time configurations below are all in seconds."
+#~ msgstr ""
+#~ "請填寫您的 DNS 供應商提供的 API 身份驗證認證。我們會將一個或多個 TXT 記錄"
+#~ "新增到您網域的 DNS 記錄中以進行所有權驗證。驗證完成後,記錄將被刪除。請注"
+#~ "意,以下時間設定均以秒為單位。"
+
+#~ msgid "Certification"
+#~ msgstr "憑證"
+
 #~ msgid "Delete ID: %{id}"
 #~ msgstr "刪除 ID: %{id}"
 

+ 5 - 5
app/src/routes/index.ts

@@ -96,8 +96,8 @@ export const routes: Route[] = [
         },
       },
       {
-        path: 'cert',
-        name: () => $gettext('Certification'),
+        path: 'certificates',
+        name: () => $gettext('Certificates'),
         component: () => import('@/layouts/BaseRouterView.vue'),
         meta: {
           icon: SafetyCertificateOutlined,
@@ -105,13 +105,13 @@ export const routes: Route[] = [
         children: [
           {
             path: 'list',
-            name: () => $gettext('Certification List'),
-            component: () => import('@/views/cert/Cert.vue'),
+            name: () => $gettext('Certificates List'),
+            component: () => import('@/views/certificate/Certificate.vue'),
           },
           {
             path: 'dns_credential',
             name: () => $gettext('DNS Credentials'),
-            component: () => import('@/views/cert/DNSCredential.vue'),
+            component: () => import('@/views/certificate/DNSCredential.vue'),
           },
         ],
       },

+ 39 - 18
app/src/views/cert/Cert.vue → app/src/views/certificate/Certificate.vue

@@ -1,7 +1,7 @@
 <script setup lang="tsx">
 import { useGettext } from 'vue3-gettext'
 import { Badge } from 'ant-design-vue'
-import { h } from 'vue'
+import { h, provide } from 'vue'
 import { input } from '@/components/StdDesign/StdDataEntry'
 import type { customRender } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer'
 import { datetime } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer'
@@ -10,9 +10,16 @@ import StdCurd from '@/components/StdDesign/StdDataDisplay/StdCurd.vue'
 import CodeEditor from '@/components/CodeEditor/CodeEditor.vue'
 import CertInfo from '@/views/domain/cert/CertInfo.vue'
 import type { Column } from '@/components/StdDesign/types'
+import type { Cert } from '@/api/cert'
+import { AutoCertState } from '@/constants'
+import AutoCertStepOne from '@/views/domain/cert/components/AutoCertStepOne.vue'
 
 const { $gettext } = useGettext()
 
+function notShowInAutoCert(record: Cert) {
+  return record.auto_cert !== AutoCertState.Enable
+}
+
 const columns: Column[] = [{
   title: () => $gettext('Name'),
   dataIndex: 'name',
@@ -27,6 +34,7 @@ const columns: Column[] = [{
   },
   edit: {
     type: input,
+    show: notShowInAutoCert,
   },
   search: true,
 }, {
@@ -58,6 +66,7 @@ const columns: Column[] = [{
   dataIndex: 'ssl_certificate_path',
   edit: {
     type: input,
+    show: notShowInAutoCert,
   },
   hidden: true,
 }, {
@@ -65,6 +74,7 @@ const columns: Column[] = [{
   dataIndex: 'ssl_certificate_key_path',
   edit: {
     type: input,
+    show: notShowInAutoCert,
   },
   hidden: true,
 }, {
@@ -77,49 +87,56 @@ const columns: Column[] = [{
   title: () => $gettext('Action'),
   dataIndex: 'action',
 }]
+
+const no_server_name = computed(() => {
+  return false
+})
+
+provide('no_server_name', no_server_name)
 </script>
 
 <template>
   <StdCurd
-    :title="$gettext('Certification')"
+    :title="$gettext('Certificates')"
     :api="cert"
     :columns="columns"
+    :modal-max-width="600"
   >
-    <template #beforeEdit="{ data }">
-      <template v-if="data.auto_cert === 1">
-        <div style="margin-bottom: 15px">
+    <template #beforeEdit="{ data }: {data: Cert}">
+      <template v-if="data.auto_cert === AutoCertState.Enable">
+        <div class="mt-4 mb-4">
           <AAlert
-            :message="$gettext('Auto cert is enabled, please do not modify this certification.')"
-            type="info"
+            :message="$gettext('Auto Cert is enabled')"
+            type="success"
             show-icon
           />
         </div>
         <div
           v-if="!data.filename"
-          style="margin-bottom: 15px"
+          class="mt-4 mb-4"
         >
           <AAlert
-            :message="$gettext('This auto-cert item is invalid, please remove it.')"
+            :message="$gettext('This Auto Cert item is invalid, please remove it.')"
             type="error"
             show-icon
           />
         </div>
         <div
           v-else-if="!data.domains"
-          style="margin-bottom: 15px"
+          class="mt-4 mb-4"
         >
           <AAlert
-            :message="$gettext('Domains list is empty, try to reopen auto-cert for %{config}', { config: data.filename })"
+            :message="$gettext('Domains list is empty, try to reopen Auto Cert for %{config}', { config: data.filename })"
             type="error"
             show-icon
           />
         </div>
         <div
           v-if="data.log"
-          style="margin-bottom: 15px"
+          class="mt-4 mb-4"
         >
           <AForm layout="vertical">
-            <AFormItem :label="$gettext('Auto-Cert Log')">
+            <AFormItem :label="$gettext('Auto Cert Log')">
               <p>{{ data.log }}</p>
             </AFormItem>
           </AForm>
@@ -133,19 +150,23 @@ const columns: Column[] = [{
           <CertInfo :cert="data.certificate_info" />
         </AFormItem>
       </AForm>
+
+      <AutoCertStepOne hide-note />
     </template>
-    <template #edit="{ data }">
+    <template #edit="{ data }: {data: Cert}">
       <AForm layout="vertical">
-        <AFormItem :label="$gettext('SSL Certification Content')">
+        <AFormItem :label="$gettext('SSL Certificate Content')">
           <CodeEditor
-            v-model:content="data.ssl_certification"
+            v-model:content="data.ssl_certificate"
             default-height="200px"
+            :readonly="!notShowInAutoCert(data)"
           />
         </AFormItem>
-        <AFormItem :label="$gettext('SSL Certification Key Content')">
+        <AFormItem :label="$gettext('SSL Certificate Key Content')">
           <CodeEditor
-            v-model:content="data.ssl_certification_key"
+            v-model:content="data.ssl_certificate_key"
             default-height="200px"
+            :readonly="!notShowInAutoCert(data)"
           />
         </AFormItem>
       </AForm>

+ 3 - 3
app/src/views/cert/DNSChallenge.vue → app/src/views/certificate/DNSChallenge.vue

@@ -24,8 +24,8 @@ function init() {
       additional: {},
     }
   }
-  providers.value?.forEach((v: { code: string }, k: number) => {
-    if (v.code === code.value)
+  providers.value?.forEach((v: { code?: string }, k: number) => {
+    if (v?.code === code.value)
       provider_idx.value = k
   })
 }
@@ -46,7 +46,7 @@ watch(current, () => {
   data.code = current.value.code
   data.provider = current.value.name
 
-  auto_cert.get_dns_provider(current.value.code).then(r => {
+  auto_cert.get_dns_provider(current.value.code!).then(r => {
     Object.assign(current.value, r)
   })
 })

+ 10 - 4
app/src/views/cert/DNSCredential.vue → app/src/views/certificate/DNSCredential.vue

@@ -49,10 +49,16 @@ const columns: Column[] = [{
       >
         <template #description>
           <p>
-            {{ $gettext('Please fill in the API authentication credentials provided by your DNS provider.\n'
-              + 'We will add one or more TXT records to the DNS records of your domain for ownership verification.\n'
-              + 'Once the verification is complete, the records will be removed.\n'
-              + 'Please note that the time configurations below are all in seconds.') }}
+            {{ $gettext('Please fill in the API authentication credentials provided by your DNS provider.') }}
+          </p>
+          <p>
+            {{ $gettext('We will add one or more TXT records to the DNS records of your domain for ownership verification.') }}
+          </p>
+          <p>
+            {{ $gettext('Once the verification is complete, the records will be removed.') }}
+          </p>
+          <p>
+            {{ $gettext('Please note that the unit of time configurations below are all in seconds.') }}
           </p>
         </template>
       </AAlert>

+ 1 - 1
app/src/views/domain/cert/CertInfo.vue

@@ -24,7 +24,7 @@ const { $gettext } = useGettext()
       {{ $gettext('Subject Name: %{subject}', { subject: cert.subject_name }) }}
     </p>
     <p>
-      {{ $gettext('Expiration Date: %{date}', { date: dayjs(cert.not_after).format('YYYY-MM-DD HH:mm:ss').toString() }) }}
+      {{ $gettext('Expired At: %{date}', { date: dayjs(cert.not_after).format('YYYY-MM-DD HH:mm:ss').toString() }) }}
     </p>
     <p>
       {{ $gettext('Not Valid Before: %{date}', { date: dayjs(cert.not_before).format('YYYY-MM-DD HH:mm:ss').toString() }) }}

+ 7 - 1
app/src/views/domain/cert/components/AutoCertStepOne.vue

@@ -3,7 +3,12 @@ import { useGettext } from 'vue3-gettext'
 import type { DnsChallenge } from '@/api/auto_cert'
 import DNSChallenge from '@/views/domain/cert/components/DNSChallenge.vue'
 
+defineProps<{
+  hideNote?: boolean
+}>()
+
 const { $gettext } = useGettext()
+
 const no_server_name = inject('no_server_name')
 
 // Provide by ObtainCert.vue
@@ -27,9 +32,11 @@ const data = inject('data') as DnsChallenge
   </template>
 
   <AAlert
+    v-if="!hideNote"
     type="info"
     show-icon
     :message="$gettext('Note')"
+    class="mb-4"
   >
     <template #description>
       <p>
@@ -52,7 +59,6 @@ const data = inject('data') as DnsChallenge
       </p>
     </template>
   </AAlert>
-  <br>
   <AForm layout="vertical">
     <AFormItem :label="$gettext('Challenge Method')">
       <ASelect v-model:value="data.challenge_method">

+ 23 - 7
app/src/views/domain/cert/components/DNSChallenge.vue

@@ -28,23 +28,20 @@ function init() {
   })
 }
 
-auto_cert.get_dns_providers().then(r => {
-  providers.value = r
-}).then(() => {
-  init()
-})
-
 const current = computed(() => {
   return providers.value?.[provider_idx.value]
 })
 
+const mounted = ref(false)
+
 watch(code, init)
 
 watch(current, () => {
   credentials.value = []
   data.code = current.value.code
   data.provider = current.value.name
-  data.dns_credential_id = null
+  if (mounted.value)
+    data.dns_credential_id = null
 
   dns_credential.get_list({ provider: data.provider }).then(r => {
     r.data.forEach(v => {
@@ -56,6 +53,25 @@ watch(current, () => {
   })
 })
 
+onMounted(async () => {
+  await auto_cert.get_dns_providers().then(r => {
+    providers.value = r
+  }).then(() => {
+    init()
+  })
+
+  if (data.dns_credential_id) {
+    await dns_credential.get(data.dns_credential_id).then(r => {
+      data.code = r.code
+      data.provider = r.provider
+      provider_idx.value = providers.value.findIndex(v => v.code === r.code)
+    })
+  }
+
+  // prevent the dns_credential_id from being overwritten
+  mounted.value = true
+})
+
 const options = computed<SelectProps['options']>(() => {
   const list: SelectProps['options'] = []
 

+ 0 - 18
model/auth.go

@@ -2,7 +2,6 @@ package model
 
 import (
 	"github.com/0xJacky/Nginx-UI/settings"
-	"github.com/gin-gonic/gin"
 	"github.com/golang-jwt/jwt"
 	"time"
 )
@@ -31,23 +30,6 @@ func GetUser(name string) (user Auth, err error) {
 	return user, err
 }
 
-func GetUserList(c *gin.Context, username interface{}) (data DataList) {
-	var total int64
-	db.Model(&Auth{}).Count(&total)
-	var users []Auth
-
-	result := db.Model(&Auth{}).Scopes(orderAndPaginate(c))
-
-	if username != "" {
-		result = result.Where("name LIKE ?", "%"+username.(string)+"%")
-	}
-
-	result.Find(&users)
-
-	data = GetListWithPagination(&users, c, total)
-	return
-}
-
 func DeleteToken(token string) error {
 	return db.Where("token = ?", token).Delete(&AuthToken{}).Error
 }

+ 181 - 35
model/model.go

@@ -11,6 +11,7 @@ import (
 	"gorm.io/gorm"
 	gormlogger "gorm.io/gorm/logger"
 	"path"
+	"strings"
 	"time"
 )
 
@@ -74,11 +75,36 @@ func Init() *gorm.DB {
 	return db
 }
 
-func orderAndPaginate(c *gin.Context) func(db *gorm.DB) *gorm.DB {
+type Pagination struct {
+	Total       int64 `json:"total"`
+	PerPage     int   `json:"per_page"`
+	CurrentPage int   `json:"current_page"`
+	TotalPages  int64 `json:"total_pages"`
+}
+
+type DataList struct {
+	Data       interface{} `json:"data"`
+	Pagination Pagination  `json:"pagination,omitempty"`
+}
+
+func SortOrder(c *gin.Context) func(db *gorm.DB) *gorm.DB {
+	return func(db *gorm.DB) *gorm.DB {
+		sort := c.DefaultQuery("order", "desc")
+		order := fmt.Sprintf("`%s` %s", DefaultQuery(c, "sort_by", "id"), sort)
+		return db.Order(order)
+	}
+}
+
+func OrderAndPaginate(c *gin.Context) func(db *gorm.DB) *gorm.DB {
 	return func(db *gorm.DB) *gorm.DB {
-		sort := c.DefaultQuery("sort", "desc")
-		order := c.DefaultQuery("order_by", "id") +
-			" " + sort
+		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)
+		}
 
 		page := cast.ToInt(c.Query("page"))
 		if page == 0 {
@@ -91,56 +117,176 @@ func orderAndPaginate(c *gin.Context) func(db *gorm.DB) *gorm.DB {
 		}
 		offset := (page - 1) * pageSize
 
-		return db.Order(order).Offset(offset).Limit(pageSize)
+		return db.Offset(offset).Limit(pageSize)
 	}
 }
 
-func totalPage(total int64, pageSize int) int64 {
-	n := total / int64(pageSize)
-	if total%int64(pageSize) > 0 {
-		n++
+func QueryToInSearch(c *gin.Context, db *gorm.DB, keys ...string) *gorm.DB {
+	for _, v := range keys {
+		queryArray := c.QueryArray(v + "[]")
+		if len(queryArray) == 0 {
+			queryArray = c.QueryArray(v)
+		}
+		if len(queryArray) > 0 {
+			var sb strings.Builder
+
+			_, err := fmt.Fprintf(&sb, "`%s` IN ?", v)
+			if err != nil {
+				logger.Error(err)
+				continue
+			}
+
+			db = db.Where(sb.String(), queryArray)
+		}
 	}
-	return n
+	return db
 }
 
-type Pagination struct {
-	Total       int64 `json:"total"`
-	PerPage     int   `json:"per_page"`
-	CurrentPage int   `json:"current_page"`
-	TotalPages  int64 `json:"total_pages"`
+func QueryToEqualSearch(c *gin.Context, db *gorm.DB, keys ...string) *gorm.DB {
+	for _, v := range keys {
+		if c.Query(v) != "" {
+			var sb strings.Builder
+
+			_, err := fmt.Fprintf(&sb, "`%s` = ?", v)
+			if err != nil {
+				logger.Error(err)
+				continue
+			}
+
+			db = db.Where(sb.String(), c.Query(v))
+		}
+	}
+	return db
 }
 
-type DataList struct {
-	Data       interface{} `json:"data"`
-	Pagination Pagination  `json:"pagination,omitempty"`
+func QueryToFussySearch(c *gin.Context, db *gorm.DB, keys ...string) *gorm.DB {
+	for _, v := range keys {
+		if c.Query(v) != "" {
+			var sb strings.Builder
+
+			_, err := fmt.Fprintf(&sb, "`%s` LIKE ?", v)
+			if err != nil {
+				logger.Error(err)
+				continue
+			}
+
+			var sbValue strings.Builder
+
+			_, err = fmt.Fprintf(&sbValue, "%%%s%%", c.Query(v))
+
+			if err != nil {
+				logger.Error(err)
+				continue
+			}
+
+			db = db.Where(sb.String(), sbValue.String())
+		}
+	}
+	return db
 }
 
-func GetListWithPagination(models interface{},
-	c *gin.Context, totalRecords int64) (result DataList) {
+func QueryToFussyKeysSearch(c *gin.Context, db *gorm.DB, value string, keys ...string) *gorm.DB {
+	if c.Query(value) == "" {
+		return db
+	}
+
+	var condition *gorm.DB
+	for i, v := range keys {
+		sb := v + " LIKE ?"
+		sv := "%" + c.Query(value) + "%"
 
-	page := cast.ToInt(c.Query("page"))
-	if page == 0 {
-		page = 1
+		switch i {
+		case 0:
+			condition = db.Where(db.Where(sb, sv))
+		default:
+			condition = condition.Or(sb, sv)
+		}
 	}
 
-	result = DataList{}
+	return db.Where(condition)
+}
 
-	result.Data = models
+func QueryToOrInSearch(c *gin.Context, db *gorm.DB, keys ...string) *gorm.DB {
+	for _, v := range keys {
+		queryArray := c.QueryArray(v + "[]")
+		if len(queryArray) == 0 {
+			queryArray = c.QueryArray(v)
+		}
+		if len(queryArray) > 0 {
+			var sb strings.Builder
+
+			_, err := fmt.Fprintf(&sb, "`%s` IN ?", v)
+			if err != nil {
+				logger.Error(err)
+				continue
+			}
 
-	pageSize := settings.ServerSettings.PageSize
-	reqPageSize := c.Query("page_size")
-	if reqPageSize != "" {
-		pageSize = cast.ToInt(reqPageSize)
+			db = db.Or(sb.String(), queryArray)
+		}
 	}
+	return db
+}
 
-	result.Pagination = Pagination{
-		Total:       totalRecords,
-		PerPage:     pageSize,
-		CurrentPage: page,
-		TotalPages:  totalPage(totalRecords, pageSize),
+func QueryToOrEqualSearch(c *gin.Context, db *gorm.DB, keys ...string) *gorm.DB {
+	for _, v := range keys {
+		if c.Query(v) != "" {
+			var sb strings.Builder
+
+			_, err := fmt.Fprintf(&sb, "`%s` = ?", v)
+			if err != nil {
+				logger.Error(err)
+				continue
+			}
+
+			db = db.Or(sb.String(), c.Query(v))
+		}
 	}
+	return db
+}
+
+func QueryToOrFussySearch(c *gin.Context, db *gorm.DB, keys ...string) *gorm.DB {
+	for _, v := range keys {
+		if c.Query(v) != "" {
+			var sb strings.Builder
+
+			_, err := fmt.Fprintf(&sb, "`%s` LIKE ?", v)
+			if err != nil {
+				logger.Error(err)
+				continue
+			}
+
+			var sbValue strings.Builder
+
+			_, err = fmt.Fprintf(&sbValue, "%%%s%%", c.Query(v))
+
+			if err != nil {
+				logger.Error(err)
+				continue
+			}
+
+			db = db.Or(sb.String(), sbValue.String())
+		}
+	}
+	return db
+}
+
+func TotalPage(total int64, pageSize int) int64 {
+	n := total / int64(pageSize)
+	if total%int64(pageSize) > 0 {
+		n++
+	}
+	return n
+}
+
+func DefaultValue(c *gin.Context, key string, defaultValue any) any {
+	if value, ok := c.Get(key); ok {
+		return value
+	}
+	return defaultValue
+}
 
-	return
+func DefaultQuery(c *gin.Context, key string, defaultValue any) string {
+	return c.DefaultQuery(key, DefaultValue(c, key, defaultValue).(string))
 }
 
 type Method interface {

Some files were not shown because too many files changed in this diff