Browse Source

enhance: translations

Jacky 2 months ago
parent
commit
e8f1321e0c
45 changed files with 3558 additions and 1503 deletions
  1. 15 40
      api/certificate/issue.go
  2. 23 13
      api/certificate/revoke.go
  3. 22 16
      api/nginx_log/nginx_log.go
  4. 6 4
      api/nginx_log/websocket.go
  5. 1 0
      app/.eslint-auto-import.mjs
  6. 2 0
      app/auto-imports.d.ts
  7. 1 0
      app/src/constants/errors/self_check.ts
  8. 196 77
      app/src/language/ar/app.po
  9. 11 0
      app/src/language/container.ts
  10. 199 75
      app/src/language/de_DE/app.po
  11. 231 237
      app/src/language/en/app.po
  12. 200 75
      app/src/language/es/app.po
  13. 191 69
      app/src/language/fr_FR/app.po
  14. 30 0
      app/src/language/generate.ts
  15. 1 0
      app/src/language/index.ts
  16. 190 77
      app/src/language/ja_JP/app.po
  17. 194 81
      app/src/language/ko_KR/app.po
  18. 143 35
      app/src/language/messages.pot
  19. 196 73
      app/src/language/pt_PT/app.po
  20. 197 72
      app/src/language/ru_RU/app.po
  21. 198 74
      app/src/language/tr_TR/app.po
  22. 237 105
      app/src/language/uk_UA/app.po
  23. 199 79
      app/src/language/vi_VN/app.po
  24. 243 92
      app/src/language/zh_CN/app.po
  25. 167 50
      app/src/language/zh_TW/app.po
  26. 2 2
      app/src/routes/modules/certificates.ts
  27. 19 19
      app/src/views/certificate/CertificateEditor.vue
  28. 1 1
      app/src/views/certificate/DNSCredential.vue
  29. 0 0
      app/src/views/certificate/components/DNSChallenge.vue
  30. 2 1
      app/src/views/nginx_log/NginxLog.vue
  31. 12 24
      app/src/views/site/site_edit/components/Cert/ObtainCertLive.vue
  32. 3 0
      app/vite.config.ts
  33. 196 0
      cmd/translation/gettext.go
  34. 7 12
      internal/cert/auto_cert.go
  35. 25 16
      internal/cert/issue.go
  36. 70 7
      internal/cert/logger.go
  37. 3 3
      internal/cert/obtain.go
  38. 4 4
      internal/cert/payload.go
  39. 3 3
      internal/cert/renew.go
  40. 14 10
      internal/cert/revoke.go
  41. 0 54
      internal/self_check/self_check.go
  42. 61 0
      internal/self_check/tasks.go
  43. 0 1
      internal/self_check/websocket.go
  44. 40 0
      internal/translation/container.go
  45. 3 2
      internal/translation/translation.go

+ 15 - 40
api/certificate/issue.go

@@ -4,6 +4,8 @@ import (
 	"net/http"
 	"net/http"
 
 
 	"github.com/0xJacky/Nginx-UI/internal/cert"
 	"github.com/0xJacky/Nginx-UI/internal/cert"
+	"github.com/0xJacky/Nginx-UI/internal/helper"
+	"github.com/0xJacky/Nginx-UI/internal/translation"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/query"
 	"github.com/0xJacky/Nginx-UI/query"
 	"github.com/gin-gonic/gin"
 	"github.com/gin-gonic/gin"
@@ -27,27 +29,6 @@ type IssueCertResponse struct {
 	KeyType           certcrypto.KeyType `json:"key_type"`
 	KeyType           certcrypto.KeyType `json:"key_type"`
 }
 }
 
 
-func handleIssueCertLogChan(conn *websocket.Conn, log *cert.Logger, logChan chan string) {
-	defer func() {
-		if err := recover(); err != nil {
-			logger.Error(err)
-		}
-	}()
-
-	for logString := range logChan {
-		log.Info(logString)
-
-		err := conn.WriteJSON(IssueCertResponse{
-			Status:  Info,
-			Message: logString,
-		})
-		if err != nil {
-			logger.Error(err)
-			return
-		}
-	}
-}
-
 func IssueCert(c *gin.Context) {
 func IssueCert(c *gin.Context) {
 	name := c.Param("name")
 	name := c.Param("name")
 	var upGrader = websocket.Upgrader{
 	var upGrader = websocket.Upgrader{
@@ -63,9 +44,7 @@ func IssueCert(c *gin.Context) {
 		return
 		return
 	}
 	}
 
 
-	defer func(ws *websocket.Conn) {
-		_ = ws.Close()
-	}(ws)
+	defer ws.Close()
 
 
 	// read
 	// read
 	payload := &cert.ConfigPayload{}
 	payload := &cert.ConfigPayload{}
@@ -92,30 +71,28 @@ func IssueCert(c *gin.Context) {
 		}
 		}
 	}
 	}
 
 
-	logChan := make(chan string, 1)
 	errChan := make(chan error, 1)
 	errChan := make(chan error, 1)
 
 
-	log := &cert.Logger{}
+	log := cert.NewLogger()
 	log.SetCertModel(&certModel)
 	log.SetCertModel(&certModel)
+	log.SetWebSocket(ws)
+	defer log.Close()
 
 
-	go cert.IssueCert(payload, logChan, errChan)
-
-	go handleIssueCertLogChan(ws, log, logChan)
+	go cert.IssueCert(payload, log, errChan)
 
 
 	// block, until errChan closes
 	// block, until errChan closes
-	for err = range errChan {
+	if err := <-errChan; err != nil {
 		log.Error(err)
 		log.Error(err)
-		// Save logs to db
-		log.Exit()
 		err = ws.WriteJSON(IssueCertResponse{
 		err = ws.WriteJSON(IssueCertResponse{
 			Status:  Error,
 			Status:  Error,
 			Message: err.Error(),
 			Message: err.Error(),
 		})
 		})
 		if err != nil {
 		if err != nil {
-			logger.Error(err)
+			if helper.IsUnexpectedWebsocketError(err) {
+				logger.Error(err)
+			}
 			return
 			return
 		}
 		}
-		return
 	}
 	}
 
 
 	cert := query.Cert
 	cert := query.Cert
@@ -142,19 +119,17 @@ func IssueCert(c *gin.Context) {
 		})
 		})
 		return
 		return
 	}
 	}
-
-	// Save logs to db
-	log.Exit()
-
 	err = ws.WriteJSON(IssueCertResponse{
 	err = ws.WriteJSON(IssueCertResponse{
 		Status:            Success,
 		Status:            Success,
-		Message:           "Issued certificate successfully",
+		Message:           translation.C("[Nginx UI] Issued certificate successfully").ToString(),
 		SSLCertificate:    payload.GetCertificatePath(),
 		SSLCertificate:    payload.GetCertificatePath(),
 		SSLCertificateKey: payload.GetCertificateKeyPath(),
 		SSLCertificateKey: payload.GetCertificateKeyPath(),
 		KeyType:           payload.GetKeyType(),
 		KeyType:           payload.GetKeyType(),
 	})
 	})
 	if err != nil {
 	if err != nil {
-		logger.Error(err)
+		if helper.IsUnexpectedWebsocketError(err) {
+			logger.Error(err)
+		}
 		return
 		return
 	}
 	}
 }
 }

+ 23 - 13
api/certificate/revoke.go

@@ -4,6 +4,7 @@ import (
 	"net/http"
 	"net/http"
 
 
 	"github.com/0xJacky/Nginx-UI/internal/cert"
 	"github.com/0xJacky/Nginx-UI/internal/cert"
+	"github.com/0xJacky/Nginx-UI/internal/translation"
 	"github.com/0xJacky/Nginx-UI/query"
 	"github.com/0xJacky/Nginx-UI/query"
 	"github.com/gin-gonic/gin"
 	"github.com/gin-gonic/gin"
 	"github.com/gorilla/websocket"
 	"github.com/gorilla/websocket"
@@ -12,8 +13,8 @@ import (
 )
 )
 
 
 type RevokeCertResponse struct {
 type RevokeCertResponse struct {
-	Status  string `json:"status"`
-	Message string `json:"message"`
+	Status string `json:"status"`
+	*translation.Container
 }
 }
 
 
 func handleRevokeCertLogChan(conn *websocket.Conn, logChan chan string) {
 func handleRevokeCertLogChan(conn *websocket.Conn, logChan chan string) {
@@ -25,8 +26,8 @@ func handleRevokeCertLogChan(conn *websocket.Conn, logChan chan string) {
 
 
 	for logString := range logChan {
 	for logString := range logChan {
 		err := conn.WriteJSON(RevokeCertResponse{
 		err := conn.WriteJSON(RevokeCertResponse{
-			Status:  Info,
-			Message: logString,
+			Status:    Info,
+			Container: translation.C(logString),
 		})
 		})
 		if err != nil {
 		if err != nil {
 			logger.Error(err)
 			logger.Error(err)
@@ -62,8 +63,10 @@ func RevokeCert(c *gin.Context) {
 	if err != nil {
 	if err != nil {
 		logger.Error(err)
 		logger.Error(err)
 		_ = ws.WriteJSON(RevokeCertResponse{
 		_ = ws.WriteJSON(RevokeCertResponse{
-			Status:  Error,
-			Message: "Certificate not found: " + err.Error(),
+			Status: Error,
+			Container: translation.C("Certificate not found: %{error}", map[string]any{
+				"error": err.Error(),
+			}),
 		})
 		})
 		return
 		return
 	}
 	}
@@ -82,7 +85,10 @@ func RevokeCert(c *gin.Context) {
 	logChan := make(chan string, 1)
 	logChan := make(chan string, 1)
 	errChan := make(chan error, 1)
 	errChan := make(chan error, 1)
 
 
-	go cert.RevokeCert(payload, logChan, errChan)
+	certLogger := &cert.Logger{}
+	certLogger.SetWebSocket(ws)
+
+	go cert.RevokeCert(payload, certLogger, logChan, errChan)
 
 
 	go handleRevokeCertLogChan(ws, logChan)
 	go handleRevokeCertLogChan(ws, logChan)
 
 
@@ -90,8 +96,10 @@ func RevokeCert(c *gin.Context) {
 	for err = range errChan {
 	for err = range errChan {
 		logger.Error(err)
 		logger.Error(err)
 		err = ws.WriteJSON(RevokeCertResponse{
 		err = ws.WriteJSON(RevokeCertResponse{
-			Status:  Error,
-			Message: err.Error(),
+			Status: Error,
+			Container: translation.C("Failed to revoke certificate: %{error}", map[string]any{
+				"error": err.Error(),
+			}),
 		})
 		})
 		if err != nil {
 		if err != nil {
 			logger.Error(err)
 			logger.Error(err)
@@ -105,15 +113,17 @@ func RevokeCert(c *gin.Context) {
 	if err != nil {
 	if err != nil {
 		logger.Error(err)
 		logger.Error(err)
 		_ = ws.WriteJSON(RevokeCertResponse{
 		_ = ws.WriteJSON(RevokeCertResponse{
-			Status:  Error,
-			Message: "Failed to delete certificate from database: " + err.Error(),
+			Status: Error,
+			Container: translation.C("Failed to delete certificate from database: %{error}", map[string]any{
+				"error": err.Error(),
+			}),
 		})
 		})
 		return
 		return
 	}
 	}
 
 
 	err = ws.WriteJSON(RevokeCertResponse{
 	err = ws.WriteJSON(RevokeCertResponse{
-		Status:  Success,
-		Message: "Certificate revoked successfully",
+		Status:    Success,
+		Container: translation.C("Certificate revoked successfully"),
 	})
 	})
 	if err != nil {
 	if err != nil {
 		logger.Error(err)
 		logger.Error(err)

+ 22 - 16
api/nginx_log/nginx_log.go

@@ -7,6 +7,7 @@ import (
 	"strings"
 	"strings"
 
 
 	"github.com/0xJacky/Nginx-UI/internal/nginx_log"
 	"github.com/0xJacky/Nginx-UI/internal/nginx_log"
+	"github.com/0xJacky/Nginx-UI/internal/translation"
 	"github.com/gin-gonic/gin"
 	"github.com/gin-gonic/gin"
 	"github.com/pkg/errors"
 	"github.com/pkg/errors"
 	"github.com/spf13/cast"
 	"github.com/spf13/cast"
@@ -27,9 +28,9 @@ type controlStruct struct {
 
 
 // nginxLogPageResp represents the response format for log content
 // nginxLogPageResp represents the response format for log content
 type nginxLogPageResp struct {
 type nginxLogPageResp struct {
-	Content string `json:"content"`         // Log content
-	Page    int64  `json:"page"`            // Current page number
-	Error   string `json:"error,omitempty"` // Error message if any
+	Content string                 `json:"content"`         // Log content
+	Page    int64                  `json:"page"`            // Current page number
+	Error   *translation.Container `json:"error,omitempty"` // Error message if any
 }
 }
 
 
 // GetNginxLogPage handles retrieving a page of log content from a log file
 // GetNginxLogPage handles retrieving a page of log content from a log file
@@ -47,7 +48,7 @@ func GetNginxLogPage(c *gin.Context) {
 	logPath, err := getLogPath(&control)
 	logPath, err := getLogPath(&control)
 	if err != nil {
 	if err != nil {
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
-			Error: err.Error(),
+			Error: translation.C(err.Error()),
 		})
 		})
 		logger.Error(err)
 		logger.Error(err)
 		return
 		return
@@ -56,7 +57,7 @@ func GetNginxLogPage(c *gin.Context) {
 	logFileStat, err := os.Stat(logPath)
 	logFileStat, err := os.Stat(logPath)
 	if err != nil {
 	if err != nil {
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
-			Error: err.Error(),
+			Error: translation.C(err.Error()),
 		})
 		})
 		logger.Error(err)
 		logger.Error(err)
 		return
 		return
@@ -64,9 +65,14 @@ func GetNginxLogPage(c *gin.Context) {
 
 
 	if !logFileStat.Mode().IsRegular() {
 	if !logFileStat.Mode().IsRegular() {
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
-			Error: "log file is not regular file",
+			Error: translation.C("Log file %{log_path} is not a regular file. "+
+				"If you are using nginx-ui in docker container, please refer to "+
+				"https://nginxui.com/zh_CN/guide/config-nginx-log.html for more information.",
+				map[string]any{
+					"log_path": logPath,
+				}),
 		})
 		})
-		logger.Errorf("log file is not regular file: %s", logPath)
+		logger.Errorf("log file is not a regular file: %s", logPath)
 		return
 		return
 	}
 	}
 
 
@@ -82,7 +88,7 @@ func GetNginxLogPage(c *gin.Context) {
 	f, err := os.Open(logPath)
 	f, err := os.Open(logPath)
 	if err != nil {
 	if err != nil {
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
-			Error: err.Error(),
+			Error: translation.C(err.Error()),
 		})
 		})
 		logger.Error(err)
 		logger.Error(err)
 		return
 		return
@@ -108,7 +114,7 @@ func GetNginxLogPage(c *gin.Context) {
 	_, err = f.Seek(offset, io.SeekStart)
 	_, err = f.Seek(offset, io.SeekStart)
 	if err != nil && err != io.EOF {
 	if err != nil && err != io.EOF {
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
-			Error: err.Error(),
+			Error: translation.C(err.Error()),
 		})
 		})
 		logger.Error(err)
 		logger.Error(err)
 		return
 		return
@@ -117,7 +123,7 @@ func GetNginxLogPage(c *gin.Context) {
 	n, err := f.Read(buf)
 	n, err := f.Read(buf)
 	if err != nil && !errors.Is(err, io.EOF) {
 	if err != nil && !errors.Is(err, io.EOF) {
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
-			Error: err.Error(),
+			Error: translation.C(err.Error()),
 		})
 		})
 		logger.Error(err)
 		logger.Error(err)
 		return
 		return
@@ -133,21 +139,21 @@ func GetNginxLogPage(c *gin.Context) {
 func GetLogList(c *gin.Context) {
 func GetLogList(c *gin.Context) {
 	filters := []func(*nginx_log.NginxLogCache) bool{}
 	filters := []func(*nginx_log.NginxLogCache) bool{}
 
 
-	if c.Query("type") != "" {
+	if logType := c.Query("type"); logType != "" {
 		filters = append(filters, func(entry *nginx_log.NginxLogCache) bool {
 		filters = append(filters, func(entry *nginx_log.NginxLogCache) bool {
-			return entry.Type == c.Query("type")
+			return entry.Type == logType
 		})
 		})
 	}
 	}
 
 
-	if c.Query("name") != "" {
+	if name := c.Query("name"); name != "" {
 		filters = append(filters, func(entry *nginx_log.NginxLogCache) bool {
 		filters = append(filters, func(entry *nginx_log.NginxLogCache) bool {
-			return strings.Contains(entry.Name, c.Query("name"))
+			return strings.Contains(entry.Name, name)
 		})
 		})
 	}
 	}
 
 
-	if c.Query("path") != "" {
+	if path := c.Query("path"); path != "" {
 		filters = append(filters, func(entry *nginx_log.NginxLogCache) bool {
 		filters = append(filters, func(entry *nginx_log.NginxLogCache) bool {
-			return strings.Contains(entry.Path, c.Query("path"))
+			return strings.Contains(entry.Path, path)
 		})
 		})
 	}
 	}
 
 

+ 6 - 4
api/nginx_log/websocket.go

@@ -5,6 +5,7 @@ import (
 	"io"
 	"io"
 	"net/http"
 	"net/http"
 	"os"
 	"os"
+	"runtime"
 
 
 	"github.com/0xJacky/Nginx-UI/internal/helper"
 	"github.com/0xJacky/Nginx-UI/internal/helper"
 	"github.com/0xJacky/Nginx-UI/internal/nginx"
 	"github.com/0xJacky/Nginx-UI/internal/nginx"
@@ -64,6 +65,8 @@ func getLogPath(control *controlStruct) (logPath string, err error) {
 func tailNginxLog(ws *websocket.Conn, controlChan chan controlStruct, errChan chan error) {
 func tailNginxLog(ws *websocket.Conn, controlChan chan controlStruct, errChan chan error) {
 	defer func() {
 	defer func() {
 		if err := recover(); err != nil {
 		if err := recover(); err != nil {
+			buf := make([]byte, 1024)
+			runtime.Stack(buf, false)
 			logger.Error(err)
 			logger.Error(err)
 			return
 			return
 		}
 		}
@@ -91,16 +94,13 @@ func tailNginxLog(ws *websocket.Conn, controlChan chan controlStruct, errChan ch
 		}
 		}
 
 
 		if !stat.Mode().IsRegular() {
 		if !stat.Mode().IsRegular() {
-			errChan <- errors.New("[error] " + logPath + " is not a regular file. " +
-				"If you are using nginx-ui in docker container, please refer to " +
-				"https://nginxui.com/zh_CN/guide/config-nginx-log.html for more information.")
+			errChan <- errors.Errorf("[error] %s is not a regular file. If you are using nginx-ui in docker container, please refer to https://nginxui.com/zh_CN/guide/config-nginx-log.html for more information.", logPath)
 			return
 			return
 		}
 		}
 
 
 		// Create a tail
 		// Create a tail
 		t, err := tail.TailFile(logPath, tail.Config{Follow: true,
 		t, err := tail.TailFile(logPath, tail.Config{Follow: true,
 			ReOpen: true, Location: &seek})
 			ReOpen: true, Location: &seek})
-
 		if err != nil {
 		if err != nil {
 			errChan <- errors.Wrap(err, "error tailing log")
 			errChan <- errors.Wrap(err, "error tailing log")
 			return
 			return
@@ -137,6 +137,8 @@ func tailNginxLog(ws *websocket.Conn, controlChan chan controlStruct, errChan ch
 func handleLogControl(ws *websocket.Conn, controlChan chan controlStruct, errChan chan error) {
 func handleLogControl(ws *websocket.Conn, controlChan chan controlStruct, errChan chan error) {
 	defer func() {
 	defer func() {
 		if err := recover(); err != nil {
 		if err := recover(); err != nil {
+			buf := make([]byte, 1024)
+			runtime.Stack(buf, false)
 			logger.Error(err)
 			logger.Error(err)
 			return
 			return
 		}
 		}

+ 1 - 0
app/.eslint-auto-import.mjs

@@ -19,6 +19,7 @@ export default {
     "Ref": true,
     "Ref": true,
     "Slot": true,
     "Slot": true,
     "Slots": true,
     "Slots": true,
+    "T": true,
     "VNode": true,
     "VNode": true,
     "WritableComputedRef": true,
     "WritableComputedRef": true,
     "acceptHMRUpdate": true,
     "acceptHMRUpdate": true,

+ 2 - 0
app/auto-imports.d.ts

@@ -11,6 +11,7 @@ declare global {
   const $npgettext: typeof import('@/gettext')['$npgettext']
   const $npgettext: typeof import('@/gettext')['$npgettext']
   const $pgettext: typeof import('@/gettext')['$pgettext']
   const $pgettext: typeof import('@/gettext')['$pgettext']
   const EffectScope: typeof import('vue')['EffectScope']
   const EffectScope: typeof import('vue')['EffectScope']
+  const T: typeof import('@/language')['T']
   const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate']
   const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate']
   const computed: typeof import('vue')['computed']
   const computed: typeof import('vue')['computed']
   const createApp: typeof import('vue')['createApp']
   const createApp: typeof import('vue')['createApp']
@@ -101,6 +102,7 @@ declare module 'vue' {
     readonly $npgettext: UnwrapRef<typeof import('@/gettext')['$npgettext']>
     readonly $npgettext: UnwrapRef<typeof import('@/gettext')['$npgettext']>
     readonly $pgettext: UnwrapRef<typeof import('@/gettext')['$pgettext']>
     readonly $pgettext: UnwrapRef<typeof import('@/gettext')['$pgettext']>
     readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
     readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
+    readonly T: UnwrapRef<typeof import('@/language')['T']>
     readonly acceptHMRUpdate: UnwrapRef<typeof import('pinia')['acceptHMRUpdate']>
     readonly acceptHMRUpdate: UnwrapRef<typeof import('pinia')['acceptHMRUpdate']>
     readonly computed: UnwrapRef<typeof import('vue')['computed']>
     readonly computed: UnwrapRef<typeof import('vue')['computed']>
     readonly createApp: UnwrapRef<typeof import('vue')['createApp']>
     readonly createApp: UnwrapRef<typeof import('vue')['createApp']>

+ 1 - 0
app/src/constants/errors/self_check.ts

@@ -12,4 +12,5 @@ export default {
   4048: () => $gettext('Streams-available directory not exist'),
   4048: () => $gettext('Streams-available directory not exist'),
   4049: () => $gettext('Streams-enabled directory not exist'),
   4049: () => $gettext('Streams-enabled directory not exist'),
   4050: () => $gettext('Nginx conf not include conf.d directory'),
   4050: () => $gettext('Nginx conf not include conf.d directory'),
+  4051: () => $gettext('Docker socket not exist'),
 }
 }

+ 196 - 77
app/src/language/ar/app.po

@@ -13,6 +13,98 @@ msgstr ""
 "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
 "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
 "X-Generator: Weblate 5.6.2\n"
 "X-Generator: Weblate 5.6.2\n"
 
 
+#: src/language/generate.ts:19
+msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
+msgstr ""
+"[Nginx UI] مستخدم ACME: %{name}، البريد الإلكتروني: %{email}، دليل CA: "
+"%{caDir}"
+
+#: src/language/generate.ts:13
+msgid "[Nginx UI] Backing up current certificate for later revocation"
+msgstr "[Nginx UI] يتم إنشاء نسخة احتياطية من الشهادة الحالية لإلغائها لاحقًا"
+
+#: src/language/generate.ts:28
+#, fuzzy
+msgid "[Nginx UI] Certificate renewed successfully"
+msgstr "تم المسح بنجاح"
+
+#: src/language/generate.ts:8
+#, fuzzy
+msgid "[Nginx UI] Certificate successfully revoked"
+msgstr "تم إعادة تشغيل Nginx بنجاح"
+
+#: src/language/generate.ts:29
+msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgstr "[Nginx UI] تم استخدام الشهادة للخادم، إعادة تحميل شهادة TLS للخادم"
+
+#: src/language/generate.ts:24
+#, fuzzy
+msgid "[Nginx UI] Creating client facilitates communication with the CA server"
+msgstr "يؤدي إنشاء العميل إلى تسهيل الاتصال بخادم CA"
+
+#: src/language/generate.ts:12
+#, fuzzy
+msgid "[Nginx UI] Environment variables cleaned"
+msgstr "تم تنظيف متغيرات البيئة"
+
+#: src/language/generate.ts:21
+msgid "[Nginx UI] Finished"
+msgstr "[Nginx UI] تم الانتهاء"
+
+#: src/language/generate.ts:4
+#, fuzzy
+msgid "[Nginx UI] Issued certificate successfully"
+msgstr "تم إصدار الشهادة بنجاح"
+
+#: src/language/generate.ts:14
+msgid "[Nginx UI] Obtaining certificate"
+msgstr "[Nginx UI] الحصول على الشهادة"
+
+#: src/language/generate.ts:22
+msgid "[Nginx UI] Preparing for certificate revocation"
+msgstr "[Nginx UI] التحضير لإلغاء الشهادة"
+
+#: src/language/generate.ts:18
+msgid "[Nginx UI] Preparing lego configurations"
+msgstr "[Nginx UI] إعداد تكوينات ليغو"
+
+#: src/language/generate.ts:25
+msgid "[Nginx UI] Reloading nginx"
+msgstr "[Nginx UI] إعادة تحميل nginx"
+
+#: src/language/generate.ts:16
+msgid "[Nginx UI] Revocation completed"
+msgstr "[Nginx UI] اكتمال الإلغاء"
+
+#: src/language/generate.ts:7
+msgid "[Nginx UI] Revoking certificate"
+msgstr "[Nginx UI] إلغاء الشهادة"
+
+#: src/language/generate.ts:26
+msgid "[Nginx UI] Revoking old certificate"
+msgstr "[Nginx UI] إبطال الشهادة القديمة"
+
+#: src/language/generate.ts:20
+msgid "[Nginx UI] Setting DNS01 challenge provider"
+msgstr "[Nginx UI] تعيين موفر تحدي DNS01"
+
+#: src/language/generate.ts:6
+#, fuzzy
+msgid "[Nginx UI] Setting environment variables"
+msgstr "تعيين متغيرات البيئة"
+
+#: src/language/generate.ts:11
+msgid "[Nginx UI] Setting HTTP01 challenge provider"
+msgstr "[Nginx UI] تعيين موفر تحدي HTTP01"
+
+#: src/language/generate.ts:15
+msgid "[Nginx UI] Writing certificate private key to disk"
+msgstr "[Nginx UI] كتابة مفتاح الشهادة الخاص إلى القرص"
+
+#: src/language/generate.ts:27
+msgid "[Nginx UI] Writing certificate to disk"
+msgstr "[Nginx UI] كتابة الشهادة على القرص"
+
 #: src/views/user/userColumns.tsx:32
 #: src/views/user/userColumns.tsx:32
 msgid "2FA"
 msgid "2FA"
 msgstr "المصادقة الثنائية"
 msgstr "المصادقة الثنائية"
@@ -105,7 +197,7 @@ msgstr "أضف Stream"
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "تمت الإضافة بنجاح"
 msgstr "تمت الإضافة بنجاح"
 
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgid "Additional"
 msgstr "إضافي"
 msgstr "إضافي"
 
 
@@ -132,7 +224,7 @@ msgstr "تم استخدام جميع رموز الاسترداد"
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "عنوان URL الأساسي لAPI"
 msgstr "عنوان URL الأساسي لAPI"
 
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgid "API Document"
 msgstr "ملف API"
 msgstr "ملف API"
 
 
@@ -280,7 +372,7 @@ msgstr "آلي"
 msgid "auto = CPU cores"
 msgid "auto = CPU cores"
 msgstr "Auto = CPU Cores"
 msgstr "Auto = CPU Cores"
 
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgid "Auto Refresh"
 msgstr "التحديث التلقائي"
 msgstr "التحديث التلقائي"
 
 
@@ -300,11 +392,9 @@ msgstr "\"إعادة التشغيل التلقائي\""
 msgid "Automatically indexed from site and stream configurations."
 msgid "Automatically indexed from site and stream configurations."
 msgstr "\"تمت الفهرسة تلقائيًا من تكوينات الموقع والدفق.\""
 msgstr "\"تمت الفهرسة تلقائيًا من تكوينات الموقع والدفق.\""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:259
-#: src/views/config/ConfigEditor.vue:266
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
-#: src/views/nginx_log/NginxLog.vue:173
+#: src/views/certificate/CertificateEditor.vue:259
+#: src/views/config/ConfigEditor.vue:266 src/views/config/ConfigList.vue:112
+#: src/views/config/ConfigList.vue:195 src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/stream/components/StreamEditor.vue:106
 #: src/views/stream/components/StreamEditor.vue:106
 msgid "Back"
 msgid "Back"
@@ -511,42 +601,40 @@ msgid "Certificate %{name} will expire in 1 day"
 msgstr "ستنتهي صلاحية الشهادة %{name} خلال يوم واحد"
 msgstr "ستنتهي صلاحية الشهادة %{name} خلال يوم واحد"
 
 
 #: src/constants/errors/cert.ts:4
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 msgid "Certificate decode error"
 msgid "Certificate decode error"
-msgstr "خطأ في مزامنة الشهادة"
+msgstr "خطأ في فك تشفير الشهادة"
 
 
 #: src/components/Notification/notifications.ts:29
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
 msgid "Certificate Expiration Notice"
-msgstr "نماذج التكوين"
+msgstr "إشعار انتهاء صلاحية الشهادة"
 
 
 #: src/components/Notification/notifications.ts:25
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
 msgid "Certificate Expired"
-msgstr "قائمة الشهادات"
+msgstr "انتهت صلاحية الشهادة"
 
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 msgid "Certificate Expiring Soon"
 msgid "Certificate Expiring Soon"
-msgstr "خطأ في مزامنة الشهادة"
+msgstr "شهادة على وشك الانتهاء"
 
 
-#: src/constants/errors/cert.ts:5
+#: src/language/generate.ts:5
 #, fuzzy
 #, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "خطأ في فك تشفير الشهادة"
+
+#: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgid "Certificate parse error"
-msgstr "خطأ في مزامنة الشهادة"
+msgstr "خطأ في تحليل الشهادة"
 
 
 #: src/constants/errors/cert.ts:8
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 msgid "Certificate path is empty"
 msgid "Certificate path is empty"
-msgstr "نماذج التكوين"
+msgstr "مسار الشهادة فارغ"
 
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
 #: src/views/certificate/components/RemoveCert.vue:61
-#, fuzzy
 msgid "Certificate removed successfully"
 msgid "Certificate removed successfully"
-msgstr "تم المسح بنجاح"
+msgstr "تمت إزالة الشهادة بنجاح"
 
 
 #: src/views/preference/tabs/CertSettings.vue:27
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
 msgid "Certificate Renewal Interval"
@@ -557,7 +645,12 @@ msgstr "الفاصل الزمني لتجديد الشهادة"
 msgid "Certificate renewed successfully"
 msgid "Certificate renewed successfully"
 msgstr "تم المسح بنجاح"
 msgstr "تم المسح بنجاح"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:128
+#: src/language/generate.ts:10
+#, fuzzy
+msgid "Certificate revoked successfully"
+msgstr "تمت إزالة الشهادة بنجاح"
+
+#: src/views/certificate/CertificateEditor.vue:128
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 msgid "Certificate Status"
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
 msgid_plural "Certificates Status"
@@ -603,12 +696,12 @@ msgstr "المسار المتغير"
 #: src/views/environments/list/BatchUpgrader.vue:159
 #: src/views/environments/list/BatchUpgrader.vue:159
 #: src/views/system/Upgrade.vue:188
 #: src/views/system/Upgrade.vue:188
 msgid "Channel"
 msgid "Channel"
-msgstr "قناة"
+msgstr "القناة"
 
 
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
 msgid "Chat"
-msgstr ""
+msgstr "محادثة"
 
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -626,40 +719,49 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 "/var/run/docker.sock:/var/run/docker.sock`."
 msgstr ""
 msgstr ""
+"تحقق مما إذا كان /var/run/docker.sock موجودًا. إذا كنت تستخدم صورة Docker "
+"الرسمية لـ Nginx UI، يرجى التأكد من أن مقبس Docker مثبت بهذه الطريقة: `-v "
+"/var/run/docker.sock:/var/run/docker.sock`."
 
 
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 msgid ""
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 "prevents using Passkeys and clipboard features."
 msgstr ""
 msgstr ""
+"تحقق مما إذا كان HTTPS ممكّنًا. استخدام HTTP خارج localhost غير آمن ويمنع "
+"استخدام ميزات Passkeys والحافظة."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 msgid "Check if the nginx.conf includes the conf.d directory."
 msgid "Check if the nginx.conf includes the conf.d directory."
-msgstr ""
+msgstr "تحقق مما إذا كان ملف nginx.conf يتضمن دليل conf.d."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgid "Check if the nginx.conf includes the sites-enabled directory."
-msgstr ""
+msgstr "تحقق مما إذا كان ملف nginx.conf يتضمن دليل sites-enabled."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgid "Check if the nginx.conf includes the streams-enabled directory."
-msgstr ""
+msgstr "تحقق مما إذا كان ملف nginx.conf يتضمن دليل streams-enabled."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 "nginx configuration directory."
 msgstr ""
 msgstr ""
+"تحقق مما إذا كانت الدلائل sites-available و sites-enabled موجودة ضمن دليل "
+"تكوين nginx."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 "the nginx configuration directory."
 msgstr ""
 msgstr ""
+"تحقق مما إذا كانت الدلائل streams-available و streams-enabled موجودة ضمن "
+"دليل تكوين nginx."
 
 
 #: src/constants/errors/crypto.ts:3
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "النص المشفر قصير جدًا"
 
 
 #: src/language/constants.ts:13
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
 msgid "Cleaning environment variables"
@@ -679,44 +781,43 @@ msgstr "تم المسح بنجاح"
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
 msgid "Click or drag backup file to this area to upload"
-msgstr ""
+msgstr "انقر فوق أو اسحب ملف النسخ الاحتياطي إلى هذه المنطقة للتحميل"
 
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
 msgid "Click to copy"
-msgstr ""
+msgstr "انقر لنسخ"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "حجم العميل العازلة للعميل"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "حجم مخزن رأس العميل"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "الحد الأقصى لحجم جسم العميل"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 msgid "Client request body buffer size"
 msgid "Client request body buffer size"
-msgstr ""
+msgstr "حجم مخزن طلب جسم العميل"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 msgid "Client request header buffer size"
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "حجم مخزن رأس طلب العميل"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
 msgid "Close"
-msgstr ""
+msgstr "إغلاق"
 
 
 #: src/constants/errors/llm.ts:2
 #: src/constants/errors/llm.ts:2
-#, fuzzy
 msgid "Code completion is not enabled"
 msgid "Code completion is not enabled"
-msgstr "TOTP معطل للحساب الحالي."
+msgstr "إكمال الكود غير مفعّل"
 
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
 msgid "Code Completion Model"
-msgstr ""
+msgstr "نموذج إكمال التعليمات البرمجية"
 
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
 msgid "Command"
@@ -724,7 +825,7 @@ msgstr "أمر"
 
 
 #: src/constants/errors/docker.ts:6
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr ""
+msgstr "انتهت الأمر برمز خروج غير متوقع: {0}، خطأ: {1}"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
@@ -735,7 +836,7 @@ msgstr "تعليقات"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
 msgid "Compare"
-msgstr ""
+msgstr "يقارن"
 
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
 #, fuzzy
@@ -744,15 +845,15 @@ msgstr "التكوينات"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
 msgid "Compare Selected"
-msgstr ""
+msgstr "قارن المحدد"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
 msgid "Compare with Current"
-msgstr ""
+msgstr "قارن مع التيار"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 msgid "Compression level, 1 is lowest, 9 is highest"
 msgid "Compression level, 1 is lowest, 9 is highest"
-msgstr ""
+msgstr "مستوى الضغط ، 1 هو أدنى ، 9 هو الأعلى"
 
 
 #: src/constants/errors/backup.ts:14
 #: src/constants/errors/backup.ts:14
 #, fuzzy
 #, fuzzy
@@ -796,7 +897,7 @@ msgstr "متصل"
 
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "خطأ في الاتصال، جاري محاولة إعادة الاتصال..."
 
 
 #: src/views/terminal/Terminal.vue:142
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
 msgid "Connection lost, please refresh the page."
@@ -804,11 +905,11 @@ msgstr "تم فقدان الاتصال، يرجى تحديث الصفحة."
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
 msgid "Connection timeout period"
-msgstr ""
+msgstr "فترة مهلة الاتصال"
 
 
 #: src/constants/errors/docker.ts:7
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
 msgid "Container status unknown"
-msgstr ""
+msgstr "حالة الحاوية غير معروفة"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -904,7 +1005,7 @@ msgstr "يؤدي إنشاء العميل إلى تسهيل الاتصال بخا
 msgid "Credential"
 msgid "Credential"
 msgstr "بيان الاعتماد"
 msgstr "بيان الاعتماد"
 
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgid "Credentials"
 msgstr "بيانات الاعتماد"
 msgstr "بيانات الاعتماد"
 
 
@@ -1199,7 +1300,7 @@ msgid "DNS Credentials"
 msgstr "بيانات اعتماد DNS"
 msgstr "بيانات اعتماد DNS"
 
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgid "DNS Provider"
 msgstr "مزود DNS"
 msgstr "مزود DNS"
 
 
@@ -1249,6 +1350,10 @@ msgstr ""
 msgid "Docker Socket"
 msgid "Docker Socket"
 msgstr ""
 msgstr ""
 
 
+#: src/constants/errors/self_check.ts:15
+msgid "Docker socket not exist"
+msgstr ""
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #, fuzzy
 #, fuzzy
@@ -1265,7 +1370,7 @@ msgstr[5] "ملف API"
 msgid "Domain"
 msgid "Domain"
 msgstr "نطاق"
 msgstr "نطاق"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:112
+#: src/views/certificate/CertificateEditor.vue:112
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr "قائمة النطاقات فارغة، حاول إعادة فتح Auto Cert لـ %{config}"
 msgstr "قائمة النطاقات فارغة، حاول إعادة فتح Auto Cert لـ %{config}"
 
 
@@ -1526,7 +1631,7 @@ msgstr ""
 msgid "External Notify"
 msgid "External Notify"
 msgstr ""
 msgstr ""
 
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 msgid "Fail to obtain certificate"
 msgid "Fail to obtain certificate"
 msgstr "فشل في الحصول على الشهادة"
 msgstr "فشل في الحصول على الشهادة"
 
 
@@ -1680,6 +1785,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgid "Failed to delete certificate"
 msgstr "فشل في الحصول على الشهادة"
 msgstr "فشل في الحصول على الشهادة"
 
 
+#: src/language/generate.ts:9
+#, fuzzy
+msgid "Failed to delete certificate from database: %{error}"
+msgstr "فشل في الحصول على الشهادة"
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
 #: src/views/stream/StreamList.vue:102
@@ -1847,6 +1957,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgid "Failed to revoke certificate"
 msgstr "فشل في الحصول على الشهادة"
 msgstr "فشل في الحصول على الشهادة"
 
 
+#: src/language/generate.ts:17
+#, fuzzy
+msgid "Failed to revoke certificate: %{error}"
+msgstr "فشل في الحصول على الشهادة"
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #, fuzzy
 #, fuzzy
 msgid "Failed to save Nginx performance settings"
 msgid "Failed to save Nginx performance settings"
@@ -1886,7 +2001,7 @@ msgstr "لم يتم العثور على الملف"
 msgid "Filename is empty"
 msgid "Filename is empty"
 msgstr ""
 msgstr ""
 
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgid "Filter"
 msgstr "تصفيه"
 msgstr "تصفيه"
 
 
@@ -2077,7 +2192,7 @@ msgid "Import"
 msgstr "استيراد"
 msgstr "استيراد"
 
 
 #: src/routes/modules/certificates.ts:46
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgid "Import Certificate"
 msgstr "استيراد شهادة"
 msgstr "استيراد شهادة"
 
 
@@ -2306,8 +2421,8 @@ msgstr "اتركه فارغًا إذا كنت لا تريد التعديل"
 msgid "Leave blank if you don't need this."
 msgid "Leave blank if you don't need this."
 msgstr "اتركه فارغًا إذا لم تكن بحاجة إلى ذلك."
 msgstr "اتركه فارغًا إذا لم تكن بحاجة إلى ذلك."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:223
-#: src/views/certificate/components/CertificateEditor.vue:237
+#: src/views/certificate/CertificateEditor.vue:223
+#: src/views/certificate/CertificateEditor.vue:237
 msgid "Leave blank will not change anything"
 msgid "Leave blank will not change anything"
 msgstr "تركه فارغًا لن يغير شيئًا"
 msgstr "تركه فارغًا لن يغير شيئًا"
 
 
@@ -2380,10 +2495,14 @@ msgstr "مكان"
 msgid "Locations"
 msgid "Locations"
 msgstr "أماكن"
 msgstr "أماكن"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 msgid "Log"
 msgstr "سجل"
 msgstr "سجل"
 
 
+#: src/language/generate.ts:23
+msgid "Log file %{log_path} is not a regular file. "
+msgstr ""
+
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #, fuzzy
 #, fuzzy
 msgid "Log List"
 msgid "Log List"
@@ -2587,7 +2706,7 @@ msgid "Modify"
 msgstr "تعديل"
 msgstr "تعديل"
 
 
 #: src/routes/modules/certificates.ts:36
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgid "Modify Certificate"
 msgstr "تعديل الشهادة"
 msgstr "تعديل الشهادة"
 
 
@@ -2605,8 +2724,8 @@ msgstr "توجيه متعدد الأسطر"
 
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:10
 #: src/views/certificate/CertificateList/certColumns.tsx:10
-#: src/views/certificate/components/CertificateEditor.vue:162
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2769,7 +2888,7 @@ msgstr "Nginx لا يعمل"
 msgid "Nginx is running"
 msgid "Nginx is running"
 msgstr "Nginx لا يعمل"
 msgstr "Nginx لا يعمل"
 
 
-#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:143
+#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:144
 msgid "Nginx Log"
 msgid "Nginx Log"
 msgstr "سجل Nginx"
 msgstr "سجل Nginx"
 
 
@@ -3775,7 +3894,7 @@ msgstr "يعمل"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
-#: src/views/certificate/components/CertificateEditor.vue:266
+#: src/views/certificate/CertificateEditor.vue:266
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
@@ -3838,7 +3957,7 @@ msgstr "تم حفظ الموقع %{site} إلى %{node} بنجاح"
 
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #: src/views/preference/store/index.ts:118
 msgid "Save successfully"
 msgid "Save successfully"
 msgstr "تم الحفظ بنجاح"
 msgstr "تم الحفظ بنجاح"
@@ -3853,7 +3972,7 @@ msgstr "تم الحفظ بنجاح"
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr "امسح رمز الاستجابة السريعة بهاتفك المحمول لإضافة الحساب إلى التطبيق."
 msgstr "امسح رمز الاستجابة السريعة بهاتفك المحمول لإضافة الحساب إلى التطبيق."
 
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgid "SDK"
 msgstr "حزمة تطوير البرمجيات SDK"
 msgstr "حزمة تطوير البرمجيات SDK"
 
 
@@ -4036,7 +4155,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgid "SSL Certificate Content"
 msgstr "محتوى شهادة SSL"
 msgstr "محتوى شهادة SSL"
 
 
@@ -4049,15 +4168,15 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgid "SSL certificate file not found"
 msgstr "محتوى مفتاح شهادة SSL"
 msgstr "محتوى مفتاح شهادة SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgid "SSL Certificate Key Content"
 msgstr "محتوى مفتاح شهادة SSL"
 msgstr "محتوى مفتاح شهادة SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgid "SSL Certificate Key Path"
 msgstr "مسار مفتاح شهادة SSL"
 msgstr "مسار مفتاح شهادة SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgid "SSL Certificate Path"
 msgstr "مسار شهادة SSL"
 msgstr "مسار شهادة SSL"
@@ -4230,7 +4349,7 @@ msgstr "مزامنة العقد"
 msgid "Sync strategy"
 msgid "Sync strategy"
 msgstr "استراتيجية المزامنة"
 msgstr "استراتيجية المزامنة"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgid "Sync to"
 msgstr "مزامنة إلى"
 msgstr "مزامنة إلى"
 
 
@@ -4308,11 +4427,11 @@ msgstr ""
 "يجب أن يحتوي اسم العقدة على حروف وأحرف يونيكود وأرقام وشرطات وعلامات وصل "
 "يجب أن يحتوي اسم العقدة على حروف وأحرف يونيكود وأرقام وشرطات وعلامات وصل "
 "ونقاط فقط."
 "ونقاط فقط."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgid "The input is not a SSL Certificate"
 msgstr "الإدخال ليس شهادة SSL"
 msgstr "الإدخال ليس شهادة SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgid "The input is not a SSL Certificate Key"
 msgstr "المدخل ليس مفتاح شهادة SSL"
 msgstr "المدخل ليس مفتاح شهادة SSL"
 
 
@@ -4348,11 +4467,11 @@ msgstr ""
 msgid "The parameter of server_name is required"
 msgid "The parameter of server_name is required"
 msgstr "عامل server_name مطلوب"
 msgstr "عامل server_name مطلوب"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 msgid "The path exists, but the file is not a certificate"
 msgid "The path exists, but the file is not a certificate"
 msgstr "المسار موجود، لكن الملف ليس شهادة"
 msgstr "المسار موجود، لكن الملف ليس شهادة"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:196
+#: src/views/certificate/CertificateEditor.vue:196
 msgid "The path exists, but the file is not a private key"
 msgid "The path exists, but the file is not a private key"
 msgstr "المسار موجود، لكن الملف ليس مفتاحًا خاصًا"
 msgstr "المسار موجود، لكن الملف ليس مفتاحًا خاصًا"
 
 
@@ -4411,17 +4530,17 @@ msgid ""
 "lose access to your account."
 "lose access to your account."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr "هذا العنصر في الشهادة التلقائية غير صالح، يرجى إزالته."
 msgstr "هذا العنصر في الشهادة التلقائية غير صالح، يرجى إزالته."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 msgid "This certificate is managed by Nginx UI"
 msgstr "يتم إدارة هذه الشهادة بواسطة Nginx UI"
 msgstr "يتم إدارة هذه الشهادة بواسطة Nginx UI"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:165
-#: src/views/certificate/components/CertificateEditor.vue:179
-#: src/views/certificate/components/CertificateEditor.vue:194
+#: src/views/certificate/CertificateEditor.vue:165
+#: src/views/certificate/CertificateEditor.vue:179
+#: src/views/certificate/CertificateEditor.vue:194
 msgid "This field is required"
 msgid "This field is required"
 msgstr "هذا الحقل مطلوب"
 msgstr "هذا الحقل مطلوب"
 
 

+ 11 - 0
app/src/language/container.ts

@@ -0,0 +1,11 @@
+export interface Container {
+  message: string
+  // eslint-disable-next-line ts/no-explicit-any
+  args: Record<string, any>
+}
+
+function T(container: Container): string {
+  return $gettext(container.message, container.args)
+}
+
+export default T

+ 199 - 75
app/src/language/de_DE/app.po

@@ -9,6 +9,100 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
+#: src/language/generate.ts:19
+msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
+msgstr ""
+"[Nginx UI] ACME-Benutzer: %{name}, E-Mail: %{email}, CA-Verzeichnis: "
+"%{caDir}"
+
+#: src/language/generate.ts:13
+msgid "[Nginx UI] Backing up current certificate for later revocation"
+msgstr "[Nginx UI] Aktuelles Zertifikat wird für spätere Widerrufung gesichert"
+
+#: src/language/generate.ts:28
+#, fuzzy
+msgid "[Nginx UI] Certificate renewed successfully"
+msgstr "Erfolgreich deaktiviert"
+
+#: src/language/generate.ts:8
+#, fuzzy
+msgid "[Nginx UI] Certificate successfully revoked"
+msgstr "Speichern erfolgreich"
+
+#: src/language/generate.ts:29
+msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgstr ""
+"[Nginx UI] Zertifikat wurde für den Server verwendet, Server-TLS-Zertifikat "
+"wird neu geladen"
+
+#: src/language/generate.ts:24
+#, fuzzy
+msgid "[Nginx UI] Creating client facilitates communication with the CA server"
+msgstr "Er"
+
+#: src/language/generate.ts:12
+#, fuzzy
+msgid "[Nginx UI] Environment variables cleaned"
+msgstr "Umgebungsvariablen gesäubert"
+
+#: src/language/generate.ts:21
+msgid "[Nginx UI] Finished"
+msgstr "[Nginx UI] Abgeschlossen"
+
+#: src/language/generate.ts:4
+#, fuzzy
+msgid "[Nginx UI] Issued certificate successfully"
+msgstr "Aktivieren erfolgreich"
+
+#: src/language/generate.ts:14
+msgid "[Nginx UI] Obtaining certificate"
+msgstr "[Nginx UI] Zertifikat wird abgerufen"
+
+#: src/language/generate.ts:22
+msgid "[Nginx UI] Preparing for certificate revocation"
+msgstr "[Nginx UI] Vorbereitung auf den Widerruf des Zertifikats"
+
+#: src/language/generate.ts:18
+msgid "[Nginx UI] Preparing lego configurations"
+msgstr "[Nginx UI] Vorbereiten der Lego-Konfigurationen"
+
+#: src/language/generate.ts:25
+msgid "[Nginx UI] Reloading nginx"
+msgstr "[Nginx UI] Nginx wird neu geladen"
+
+#: src/language/generate.ts:16
+msgid "[Nginx UI] Revocation completed"
+msgstr "[Nginx UI] Widerruf abgeschlossen"
+
+#: src/language/generate.ts:7
+msgid "[Nginx UI] Revoking certificate"
+msgstr "[Nginx UI] Zertifikat wird widerrufen"
+
+#: src/language/generate.ts:26
+msgid "[Nginx UI] Revoking old certificate"
+msgstr "[Nginx UI] Altes Zertifikat wird widerrufen"
+
+#: src/language/generate.ts:20
+msgid "[Nginx UI] Setting DNS01 challenge provider"
+msgstr "[Nginx UI] DNS01-Herausforderungsanbieter wird eingerichtet"
+
+#: src/language/generate.ts:6
+#, fuzzy
+msgid "[Nginx UI] Setting environment variables"
+msgstr "Setze Umgebungsvariablen"
+
+#: src/language/generate.ts:11
+msgid "[Nginx UI] Setting HTTP01 challenge provider"
+msgstr "[Nginx UI] HTTP01-Herausforderungsanbieter wird eingerichtet"
+
+#: src/language/generate.ts:15
+msgid "[Nginx UI] Writing certificate private key to disk"
+msgstr "[Nginx UI] Schreibe privaten Zertifikatsschlüssel auf die Festplatte"
+
+#: src/language/generate.ts:27
+msgid "[Nginx UI] Writing certificate to disk"
+msgstr "[Nginx UI] Zertifikat wird auf die Festplatte geschrieben"
+
 #: src/views/user/userColumns.tsx:32
 #: src/views/user/userColumns.tsx:32
 msgid "2FA"
 msgid "2FA"
 msgstr "2FA"
 msgstr "2FA"
@@ -105,7 +199,7 @@ msgstr "Seite hinzufügen"
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 #, fuzzy
 #, fuzzy
 msgid "Additional"
 msgid "Additional"
 msgstr "Ort hinzufügen"
 msgstr "Ort hinzufügen"
@@ -135,7 +229,7 @@ msgstr "Alle Wiederherstellungscodes wurden verwendet"
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "API-Basis-URL"
 msgstr "API-Basis-URL"
 
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgid "API Document"
 msgstr "API-Dokument"
 msgstr "API-Dokument"
 
 
@@ -293,7 +387,7 @@ msgstr "Auto"
 msgid "auto = CPU cores"
 msgid "auto = CPU cores"
 msgstr "Auto = CPU -Kerne"
 msgstr "Auto = CPU -Kerne"
 
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgid "Auto Refresh"
 msgstr "Automatische Aktualisierung"
 msgstr "Automatische Aktualisierung"
 
 
@@ -313,11 +407,9 @@ msgstr "\"Automatischer Neustart\""
 msgid "Automatically indexed from site and stream configurations."
 msgid "Automatically indexed from site and stream configurations."
 msgstr "\"Automatisch aus Site- und Stream-Konfigurationen indiziert.\""
 msgstr "\"Automatisch aus Site- und Stream-Konfigurationen indiziert.\""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:259
-#: src/views/config/ConfigEditor.vue:266
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
-#: src/views/nginx_log/NginxLog.vue:173
+#: src/views/certificate/CertificateEditor.vue:259
+#: src/views/config/ConfigEditor.vue:266 src/views/config/ConfigList.vue:112
+#: src/views/config/ConfigList.vue:195 src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/stream/components/StreamEditor.vue:106
 #: src/views/stream/components/StreamEditor.vue:106
 msgid "Back"
 msgid "Back"
@@ -531,42 +623,40 @@ msgid "Certificate %{name} will expire in 1 day"
 msgstr "Das Zertifikat %{name} läuft in 1 Tag ab"
 msgstr "Das Zertifikat %{name} läuft in 1 Tag ab"
 
 
 #: src/constants/errors/cert.ts:4
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 msgid "Certificate decode error"
 msgid "Certificate decode error"
-msgstr "Zertifikat ist gültig"
+msgstr "Fehler beim Dekodieren des Zertifikats"
 
 
 #: src/components/Notification/notifications.ts:29
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
 msgid "Certificate Expiration Notice"
-msgstr "Konfigurationen"
+msgstr "Hinweis zum Zertifikatsablauf"
 
 
 #: src/components/Notification/notifications.ts:25
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
 msgid "Certificate Expired"
-msgstr "Zertifikat ist gültig"
+msgstr "Zertifikat abgelaufen"
 
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 msgid "Certificate Expiring Soon"
 msgid "Certificate Expiring Soon"
-msgstr "Certificate has expired"
+msgstr "Zertifikat läuft bald ab"
 
 
-#: src/constants/errors/cert.ts:5
+#: src/language/generate.ts:5
 #, fuzzy
 #, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "Fehler beim Dekodieren des Zertifikats"
+
+#: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgid "Certificate parse error"
-msgstr "Certificate has expired"
+msgstr "Fehler beim Parsen des Zertifikats"
 
 
 #: src/constants/errors/cert.ts:8
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 msgid "Certificate path is empty"
 msgid "Certificate path is empty"
-msgstr "Konfigurationen"
+msgstr "Der Zertifikatspfad ist leer"
 
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
 #: src/views/certificate/components/RemoveCert.vue:61
-#, fuzzy
 msgid "Certificate removed successfully"
 msgid "Certificate removed successfully"
-msgstr "Erfolgreich deaktiviert"
+msgstr "Zertifikat erfolgreich entfernt"
 
 
 #: src/views/preference/tabs/CertSettings.vue:27
 #: src/views/preference/tabs/CertSettings.vue:27
 #, fuzzy
 #, fuzzy
@@ -578,7 +668,12 @@ msgstr "Zeitifikat ist gültig"
 msgid "Certificate renewed successfully"
 msgid "Certificate renewed successfully"
 msgstr "Erfolgreich deaktiviert"
 msgstr "Erfolgreich deaktiviert"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:128
+#: src/language/generate.ts:10
+#, fuzzy
+msgid "Certificate revoked successfully"
+msgstr "Zertifikat erfolgreich entfernt"
+
+#: src/views/certificate/CertificateEditor.vue:128
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #, fuzzy
 #, fuzzy
 msgid "Certificate Status"
 msgid "Certificate Status"
@@ -627,7 +722,7 @@ msgstr "Kanal"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
 msgid "Chat"
-msgstr ""
+msgstr "Chat"
 
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -645,40 +740,50 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 "/var/run/docker.sock:/var/run/docker.sock`."
 msgstr ""
 msgstr ""
+"Überprüfen Sie, ob /var/run/docker.sock existiert. Wenn Sie das offizielle "
+"Nginx UI Docker-Image verwenden, stellen Sie sicher, dass der Docker-Socket "
+"wie folgt eingehängt ist: `-v /var/run/docker.sock:/var/run/docker.sock`."
 
 
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 msgid ""
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 "prevents using Passkeys and clipboard features."
 msgstr ""
 msgstr ""
+"Überprüfen Sie, ob HTTPS aktiviert ist. Die Verwendung von HTTP außerhalb "
+"von localhost ist unsicher und verhindert die Nutzung von Passkeys und "
+"Zwischenablage-Funktionen."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 msgid "Check if the nginx.conf includes the conf.d directory."
 msgid "Check if the nginx.conf includes the conf.d directory."
-msgstr ""
+msgstr "Überprüfen Sie, ob die nginx.conf das conf.d-Verzeichnis enthält."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgid "Check if the nginx.conf includes the sites-enabled directory."
-msgstr ""
+msgstr "Überprüfen Sie, ob die nginx.conf das Verzeichnis sites-enabled enthält."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgid "Check if the nginx.conf includes the streams-enabled directory."
-msgstr ""
+msgstr "Überprüfen Sie, ob die nginx.conf das Verzeichnis streams-enabled enthält."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 "nginx configuration directory."
 msgstr ""
 msgstr ""
+"Überprüfen Sie, ob die Verzeichnisse sites-available und sites-enabled im "
+"nginx-Konfigurationsverzeichnis enthalten sind."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 "the nginx configuration directory."
 msgstr ""
 msgstr ""
+"Überprüfen Sie, ob die Verzeichnisse streams-available und streams-enabled "
+"im nginx-Konfigurationsverzeichnis enthalten sind."
 
 
 #: src/constants/errors/crypto.ts:3
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "Der verschlüsselte Text ist zu kurz"
 
 
 #: src/language/constants.ts:13
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
 msgid "Cleaning environment variables"
@@ -700,43 +805,44 @@ msgstr "Erfolgreich deaktiviert"
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
 msgid "Click or drag backup file to this area to upload"
 msgstr ""
 msgstr ""
+"Klicken Sie auf oder ziehen Sie die Sicherungsdatei in diesen Bereich, um "
+"hochzuladen"
 
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
 msgid "Click to copy"
-msgstr ""
+msgstr "Klicken Sie hier, um zu kopieren"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "Client Body Puffer Größe"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "Client-Header-Puffergröße"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "Maximale Client-Körpergröße"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 msgid "Client request body buffer size"
 msgid "Client request body buffer size"
-msgstr ""
+msgstr "Puffergröße für den Anforderungskörper des Clients"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 msgid "Client request header buffer size"
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "Größe des Puffers für Client-Anfrageheader"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
 msgid "Close"
-msgstr ""
+msgstr "Schließen"
 
 
 #: src/constants/errors/llm.ts:2
 #: src/constants/errors/llm.ts:2
-#, fuzzy
 msgid "Code completion is not enabled"
 msgid "Code completion is not enabled"
-msgstr "Aktuelles Konto ist nicht TOTP aktiviert."
+msgstr "Code-Vervollständigung ist nicht aktiviert"
 
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
 msgid "Code Completion Model"
-msgstr ""
+msgstr "Code-Vervollständigungsmodell"
 
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #, fuzzy
 #, fuzzy
@@ -745,7 +851,7 @@ msgstr "Kommando"
 
 
 #: src/constants/errors/docker.ts:6
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr ""
+msgstr "Befehl wurde mit unerwartetem Exit-Code beendet: {0}, Fehler: {1}"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
@@ -756,7 +862,7 @@ msgstr "Kom"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
 msgid "Compare"
-msgstr ""
+msgstr "Vergleichen"
 
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
 #, fuzzy
@@ -765,15 +871,15 @@ msgstr "Konfigurationen"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
 msgid "Compare Selected"
-msgstr ""
+msgstr "Vergleiche ausgewählt"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
 msgid "Compare with Current"
-msgstr ""
+msgstr "Vergleiche mit Strom"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 msgid "Compression level, 1 is lowest, 9 is highest"
 msgid "Compression level, 1 is lowest, 9 is highest"
-msgstr ""
+msgstr "Kompressionsniveau, 1 ist am niedrigsten, 9 ist am höchsten"
 
 
 #: src/constants/errors/backup.ts:14
 #: src/constants/errors/backup.ts:14
 #, fuzzy
 #, fuzzy
@@ -817,7 +923,7 @@ msgstr "Verbunden"
 
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "Verbindungsfehler, versuche erneut zu verbinden..."
 
 
 #: src/views/terminal/Terminal.vue:142
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
 msgid "Connection lost, please refresh the page."
@@ -825,11 +931,11 @@ msgstr "Ver"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
 msgid "Connection timeout period"
-msgstr ""
+msgstr "Verbindungs-Timeout-Zeitraum"
 
 
 #: src/constants/errors/docker.ts:7
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
 msgid "Container status unknown"
-msgstr ""
+msgstr "Container-Status unbekannt"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -929,7 +1035,7 @@ msgstr "Er"
 msgid "Credential"
 msgid "Credential"
 msgstr "Zugangsdaten"
 msgstr "Zugangsdaten"
 
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgid "Credentials"
 msgstr "Zugangsdaten"
 msgstr "Zugangsdaten"
 
 
@@ -1230,7 +1336,7 @@ msgid "DNS Credentials"
 msgstr "DNS-Zugangsdaten"
 msgstr "DNS-Zugangsdaten"
 
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgid "DNS Provider"
 msgstr "DNS-Anbieter"
 msgstr "DNS-Anbieter"
 
 
@@ -1287,6 +1393,10 @@ msgstr ""
 msgid "Docker Socket"
 msgid "Docker Socket"
 msgstr ""
 msgstr ""
 
 
+#: src/constants/errors/self_check.ts:15
+msgid "Docker socket not exist"
+msgstr ""
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #, fuzzy
 #, fuzzy
@@ -1299,7 +1409,7 @@ msgstr[1] "API-Dokument"
 msgid "Domain"
 msgid "Domain"
 msgstr "Domain"
 msgstr "Domain"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:112
+#: src/views/certificate/CertificateEditor.vue:112
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr ""
 msgstr ""
 "Domänenliste ist leer, versuche Auto-Zertifikat für %{config} erneut zu "
 "Domänenliste ist leer, versuche Auto-Zertifikat für %{config} erneut zu "
@@ -1573,7 +1683,7 @@ msgstr ""
 msgid "External Notify"
 msgid "External Notify"
 msgstr ""
 msgstr ""
 
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 #, fuzzy
 #, fuzzy
 msgid "Fail to obtain certificate"
 msgid "Fail to obtain certificate"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
@@ -1727,6 +1837,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgid "Failed to delete certificate"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
+#: src/language/generate.ts:9
+#, fuzzy
+msgid "Failed to delete certificate from database: %{error}"
+msgstr "Zertifikat ist gültig"
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
 #: src/views/stream/StreamList.vue:102
@@ -1890,6 +2005,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgid "Failed to revoke certificate"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
+#: src/language/generate.ts:17
+#, fuzzy
+msgid "Failed to revoke certificate: %{error}"
+msgstr "Zertifikat ist gültig"
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #, fuzzy
 #, fuzzy
 msgid "Failed to save Nginx performance settings"
 msgid "Failed to save Nginx performance settings"
@@ -1929,7 +2049,7 @@ msgstr "FDatei nicht gefunden"
 msgid "Filename is empty"
 msgid "Filename is empty"
 msgstr ""
 msgstr ""
 
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgid "Filter"
 msgstr "Filter"
 msgstr "Filter"
 
 
@@ -2125,7 +2245,7 @@ msgid "Import"
 msgstr "Import"
 msgstr "Import"
 
 
 #: src/routes/modules/certificates.ts:46
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 #, fuzzy
 #, fuzzy
 msgid "Import Certificate"
 msgid "Import Certificate"
 msgstr "Zertifikatsstatus"
 msgstr "Zertifikatsstatus"
@@ -2361,8 +2481,8 @@ msgstr "Leer lassen für keine Änderung"
 msgid "Leave blank if you don't need this."
 msgid "Leave blank if you don't need this."
 msgstr "Leeer lassen, wenn du dies nicht benötigst."
 msgstr "Leeer lassen, wenn du dies nicht benötigst."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:223
-#: src/views/certificate/components/CertificateEditor.vue:237
+#: src/views/certificate/CertificateEditor.vue:223
+#: src/views/certificate/CertificateEditor.vue:237
 #, fuzzy
 #, fuzzy
 msgid "Leave blank will not change anything"
 msgid "Leave blank will not change anything"
 msgstr "Leeer lassen, wenn du dies nicht benötigst."
 msgstr "Leeer lassen, wenn du dies nicht benötigst."
@@ -2440,11 +2560,15 @@ msgstr "Ort"
 msgid "Locations"
 msgid "Locations"
 msgstr "Orte"
 msgstr "Orte"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 #, fuzzy
 #, fuzzy
 msgid "Log"
 msgid "Log"
 msgstr "Login"
 msgstr "Login"
 
 
+#: src/language/generate.ts:23
+msgid "Log file %{log_path} is not a regular file. "
+msgstr ""
+
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #, fuzzy
 #, fuzzy
 msgid "Log List"
 msgid "Log List"
@@ -2654,7 +2778,7 @@ msgid "Modify"
 msgstr "Konfiguration bearbeiten"
 msgstr "Konfiguration bearbeiten"
 
 
 #: src/routes/modules/certificates.ts:36
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 #, fuzzy
 #, fuzzy
 msgid "Modify Certificate"
 msgid "Modify Certificate"
 msgstr "Zertifikatsstatus"
 msgstr "Zertifikatsstatus"
@@ -2675,8 +2799,8 @@ msgstr "Einzelne Anweisung"
 
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:10
 #: src/views/certificate/CertificateList/certColumns.tsx:10
-#: src/views/certificate/components/CertificateEditor.vue:162
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2843,7 +2967,7 @@ msgstr "Nginx läuft nicht"
 msgid "Nginx is running"
 msgid "Nginx is running"
 msgstr "Nginx läuft nicht"
 msgstr "Nginx läuft nicht"
 
 
-#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:143
+#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:144
 msgid "Nginx Log"
 msgid "Nginx Log"
 msgstr "Nginx-Log"
 msgstr "Nginx-Log"
 
 
@@ -3892,7 +4016,7 @@ msgstr "Arbeite"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
-#: src/views/certificate/components/CertificateEditor.vue:266
+#: src/views/certificate/CertificateEditor.vue:266
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
@@ -3957,7 +4081,7 @@ msgstr "Speichern erfolgreich"
 
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #: src/views/preference/store/index.ts:118
 #, fuzzy
 #, fuzzy
 msgid "Save successfully"
 msgid "Save successfully"
@@ -3973,7 +4097,7 @@ msgstr "Speichern erfolgreich"
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr "Scanne den QR-Code mit deinem Handy, um das Konto zur App hinzuzufügen."
 msgstr "Scanne den QR-Code mit deinem Handy, um das Konto zur App hinzuzufügen."
 
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgid "SDK"
 msgstr "SDK"
 msgstr "SDK"
 
 
@@ -4155,7 +4279,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 #, fuzzy
 #, fuzzy
 msgid "SSL Certificate Content"
 msgid "SSL Certificate Content"
 msgstr "Zertifikatsstatus"
 msgstr "Zertifikatsstatus"
@@ -4169,17 +4293,17 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgid "SSL certificate file not found"
 msgstr "Zertifikatsstatus"
 msgstr "Zertifikatsstatus"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 #, fuzzy
 #, fuzzy
 msgid "SSL Certificate Key Content"
 msgid "SSL Certificate Key Content"
 msgstr "Zertifikatsstatus"
 msgstr "Zertifikatsstatus"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 #, fuzzy
 #, fuzzy
 msgid "SSL Certificate Key Path"
 msgid "SSL Certificate Key Path"
 msgstr "Zertifikatsstatus"
 msgstr "Zertifikatsstatus"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 #: src/views/preference/tabs/ServerSettings.vue:37
 #, fuzzy
 #, fuzzy
 msgid "SSL Certificate Path"
 msgid "SSL Certificate Path"
@@ -4360,7 +4484,7 @@ msgstr "Synchrone Knoten"
 msgid "Sync strategy"
 msgid "Sync strategy"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgid "Sync to"
 msgstr "Synchronisieren mit"
 msgstr "Synchronisieren mit"
 
 
@@ -4438,11 +4562,11 @@ msgstr ""
 "Die ICP-Nummer sollte nur Buchstaben, Unicode, Zahlen, Bindestriche, "
 "Die ICP-Nummer sollte nur Buchstaben, Unicode, Zahlen, Bindestriche, "
 "Doppelpunkte und Punkte enthalten."
 "Doppelpunkte und Punkte enthalten."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgid "The input is not a SSL Certificate"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 #, fuzzy
 #, fuzzy
 msgid "The input is not a SSL Certificate Key"
 msgid "The input is not a SSL Certificate Key"
 msgstr "Zertifikatsstatus"
 msgstr "Zertifikatsstatus"
@@ -4479,12 +4603,12 @@ msgstr ""
 msgid "The parameter of server_name is required"
 msgid "The parameter of server_name is required"
 msgstr "server_name-Parameter ist erforderlich"
 msgstr "server_name-Parameter ist erforderlich"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 #, fuzzy
 #, fuzzy
 msgid "The path exists, but the file is not a certificate"
 msgid "The path exists, but the file is not a certificate"
 msgstr "Zertifikatsstatus"
 msgstr "Zertifikatsstatus"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:196
+#: src/views/certificate/CertificateEditor.vue:196
 msgid "The path exists, but the file is not a private key"
 msgid "The path exists, but the file is not a private key"
 msgstr "Der Pfad existiert, aber die Datei ist kein privater Schlüssel"
 msgstr "Der Pfad existiert, aber die Datei ist kein privater Schlüssel"
 
 
@@ -4544,17 +4668,17 @@ msgid ""
 "lose access to your account."
 "lose access to your account."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr "Dieses Auto-Zertifikatselement ist ungültig, bitte entferne es."
 msgstr "Dieses Auto-Zertifikatselement ist ungültig, bitte entferne es."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 msgid "This certificate is managed by Nginx UI"
 msgstr "Dieses Zertifikat wird von Nginx UI verwaltet"
 msgstr "Dieses Zertifikat wird von Nginx UI verwaltet"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:165
-#: src/views/certificate/components/CertificateEditor.vue:179
-#: src/views/certificate/components/CertificateEditor.vue:194
+#: src/views/certificate/CertificateEditor.vue:165
+#: src/views/certificate/CertificateEditor.vue:179
+#: src/views/certificate/CertificateEditor.vue:194
 msgid "This field is required"
 msgid "This field is required"
 msgstr "Dieses Feld ist erforderlich"
 msgstr "Dieses Feld ist erforderlich"
 
 

File diff suppressed because it is too large
+ 231 - 237
app/src/language/en/app.po


+ 200 - 75
app/src/language/es/app.po

@@ -16,6 +16,102 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 5.6.2\n"
 "X-Generator: Weblate 5.6.2\n"
 
 
+#: src/language/generate.ts:19
+msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
+msgstr ""
+"[Nginx UI] Usuario ACME: %{name}, Correo electrónico: %{email}, Directorio "
+"CA: %{caDir}"
+
+#: src/language/generate.ts:13
+msgid "[Nginx UI] Backing up current certificate for later revocation"
+msgstr ""
+"[Nginx UI] Haciendo copia de seguridad del certificado actual para su "
+"posterior revocación"
+
+#: src/language/generate.ts:28
+#, fuzzy
+msgid "[Nginx UI] Certificate renewed successfully"
+msgstr "Limpiado exitoso"
+
+#: src/language/generate.ts:8
+#, fuzzy
+msgid "[Nginx UI] Certificate successfully revoked"
+msgstr "Nginx reiniciado con éxito"
+
+#: src/language/generate.ts:29
+msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgstr ""
+"[Nginx UI] El certificado se utilizó para el servidor, recargando el "
+"certificado TLS del servidor"
+
+#: src/language/generate.ts:24
+#, fuzzy
+msgid "[Nginx UI] Creating client facilitates communication with the CA server"
+msgstr "La creación de un cliente facilita la comunicación con el servidor CA"
+
+#: src/language/generate.ts:12
+#, fuzzy
+msgid "[Nginx UI] Environment variables cleaned"
+msgstr "Variables de entorno limpiadas"
+
+#: src/language/generate.ts:21
+msgid "[Nginx UI] Finished"
+msgstr "[Nginx UI] Finalizado"
+
+#: src/language/generate.ts:4
+#, fuzzy
+msgid "[Nginx UI] Issued certificate successfully"
+msgstr "Certificado emitido con éxito"
+
+#: src/language/generate.ts:14
+msgid "[Nginx UI] Obtaining certificate"
+msgstr "[Nginx UI] Obteniendo certificado"
+
+#: src/language/generate.ts:22
+msgid "[Nginx UI] Preparing for certificate revocation"
+msgstr "[Nginx UI] Preparándose para la revocación del certificado"
+
+#: src/language/generate.ts:18
+msgid "[Nginx UI] Preparing lego configurations"
+msgstr "[Nginx UI] Preparando configuraciones de lego"
+
+#: src/language/generate.ts:25
+msgid "[Nginx UI] Reloading nginx"
+msgstr "[Nginx UI] Recargando nginx"
+
+#: src/language/generate.ts:16
+msgid "[Nginx UI] Revocation completed"
+msgstr "[Nginx UI] Revocación completada"
+
+#: src/language/generate.ts:7
+msgid "[Nginx UI] Revoking certificate"
+msgstr "[Nginx UI] Revocando certificado"
+
+#: src/language/generate.ts:26
+msgid "[Nginx UI] Revoking old certificate"
+msgstr "[Nginx UI] Revocando certificado antiguo"
+
+#: src/language/generate.ts:20
+msgid "[Nginx UI] Setting DNS01 challenge provider"
+msgstr "[Nginx UI] Configurando el proveedor de desafío DNS01"
+
+#: src/language/generate.ts:6
+#, fuzzy
+msgid "[Nginx UI] Setting environment variables"
+msgstr "Configuración de variables de entorno"
+
+#: src/language/generate.ts:11
+msgid "[Nginx UI] Setting HTTP01 challenge provider"
+msgstr "[Nginx UI] Configurando el proveedor de desafío HTTP01"
+
+#: src/language/generate.ts:15
+msgid "[Nginx UI] Writing certificate private key to disk"
+msgstr "[Nginx UI] Escribiendo la clave privada del certificado en el disco"
+
+#: src/language/generate.ts:27
+msgid "[Nginx UI] Writing certificate to disk"
+msgstr "[Nginx UI] Escribiendo certificado en el disco"
+
 #: src/views/user/userColumns.tsx:32
 #: src/views/user/userColumns.tsx:32
 msgid "2FA"
 msgid "2FA"
 msgstr "2FA"
 msgstr "2FA"
@@ -108,7 +204,7 @@ msgstr "Agregar Stream"
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "Agregado exitoso"
 msgstr "Agregado exitoso"
 
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgid "Additional"
 msgstr "Adicional"
 msgstr "Adicional"
 
 
@@ -137,7 +233,7 @@ msgstr "Todos los códigos de recuperación han sido utilizados"
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "URL Base de la API"
 msgstr "URL Base de la API"
 
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgid "API Document"
 msgstr "Documento de la API"
 msgstr "Documento de la API"
 
 
@@ -285,7 +381,7 @@ msgstr "Automático"
 msgid "auto = CPU cores"
 msgid "auto = CPU cores"
 msgstr "auto = núcleos de CPU"
 msgstr "auto = núcleos de CPU"
 
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgid "Auto Refresh"
 msgstr "Actualización automática"
 msgstr "Actualización automática"
 
 
@@ -305,11 +401,9 @@ msgstr "\"Reinicio Automático\""
 msgid "Automatically indexed from site and stream configurations."
 msgid "Automatically indexed from site and stream configurations."
 msgstr "\"Indexado automáticamente desde configuraciones de sitio y transmisión.\""
 msgstr "\"Indexado automáticamente desde configuraciones de sitio y transmisión.\""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:259
-#: src/views/config/ConfigEditor.vue:266
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
-#: src/views/nginx_log/NginxLog.vue:173
+#: src/views/certificate/CertificateEditor.vue:259
+#: src/views/config/ConfigEditor.vue:266 src/views/config/ConfigList.vue:112
+#: src/views/config/ConfigList.vue:195 src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/stream/components/StreamEditor.vue:106
 #: src/views/stream/components/StreamEditor.vue:106
 msgid "Back"
 msgid "Back"
@@ -524,42 +618,40 @@ msgid "Certificate %{name} will expire in 1 day"
 msgstr "El certificado %{name} expirará en 1 día"
 msgstr "El certificado %{name} expirará en 1 día"
 
 
 #: src/constants/errors/cert.ts:4
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 msgid "Certificate decode error"
 msgid "Certificate decode error"
-msgstr "Error de Certificado de Sincronización"
+msgstr "Error de decodificación del certificado"
 
 
 #: src/components/Notification/notifications.ts:29
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
 msgid "Certificate Expiration Notice"
-msgstr "Plantillas de configuración"
+msgstr "Aviso de caducidad del certificado"
 
 
 #: src/components/Notification/notifications.ts:25
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
 msgid "Certificate Expired"
-msgstr "Lista de Certificados"
+msgstr "Certificado caducado"
 
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 msgid "Certificate Expiring Soon"
 msgid "Certificate Expiring Soon"
-msgstr "El certificado expiró"
+msgstr "Certificado a punto de expirar"
 
 
-#: src/constants/errors/cert.ts:5
+#: src/language/generate.ts:5
 #, fuzzy
 #, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "Error de decodificación del certificado"
+
+#: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgid "Certificate parse error"
-msgstr "El certificado expiró"
+msgstr "Error al analizar el certificado"
 
 
 #: src/constants/errors/cert.ts:8
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 msgid "Certificate path is empty"
 msgid "Certificate path is empty"
-msgstr "Plantillas de configuración"
+msgstr "La ruta del certificado está vacía"
 
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
 #: src/views/certificate/components/RemoveCert.vue:61
-#, fuzzy
 msgid "Certificate removed successfully"
 msgid "Certificate removed successfully"
-msgstr "Limpiado exitoso"
+msgstr "Certificado eliminado correctamente"
 
 
 #: src/views/preference/tabs/CertSettings.vue:27
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
 msgid "Certificate Renewal Interval"
@@ -570,7 +662,12 @@ msgstr "Intervalo de renovación del Certificado"
 msgid "Certificate renewed successfully"
 msgid "Certificate renewed successfully"
 msgstr "Limpiado exitoso"
 msgstr "Limpiado exitoso"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:128
+#: src/language/generate.ts:10
+#, fuzzy
+msgid "Certificate revoked successfully"
+msgstr "Certificado eliminado correctamente"
+
+#: src/views/certificate/CertificateEditor.vue:128
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 msgid "Certificate Status"
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
 msgid_plural "Certificates Status"
@@ -613,7 +710,7 @@ msgstr "Canal"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
 msgid "Chat"
-msgstr ""
+msgstr "Chat"
 
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -631,40 +728,49 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 "/var/run/docker.sock:/var/run/docker.sock`."
 msgstr ""
 msgstr ""
+"Verifique si /var/run/docker.sock existe. Si está utilizando la imagen "
+"oficial de Docker de Nginx UI, asegúrese de que el socket de Docker esté "
+"montado de esta manera: `-v /var/run/docker.sock:/var/run/docker.sock`."
 
 
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 msgid ""
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 "prevents using Passkeys and clipboard features."
 msgstr ""
 msgstr ""
+"Verifica si HTTPS está habilitado. Usar HTTP fuera de localhost es inseguro "
+"e impide el uso de Passkeys y funciones del portapapeles."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 msgid "Check if the nginx.conf includes the conf.d directory."
 msgid "Check if the nginx.conf includes the conf.d directory."
-msgstr ""
+msgstr "Verifique si el archivo nginx.conf incluye el directorio conf.d."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgid "Check if the nginx.conf includes the sites-enabled directory."
-msgstr ""
+msgstr "Verifica si el archivo nginx.conf incluye el directorio sites-enabled."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgid "Check if the nginx.conf includes the streams-enabled directory."
-msgstr ""
+msgstr "Verifique si el archivo nginx.conf incluye el directorio streams-enabled."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 "nginx configuration directory."
 msgstr ""
 msgstr ""
+"Verifique si los directorios sites-available y sites-enabled están dentro "
+"del directorio de configuración de nginx."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 "the nginx configuration directory."
 msgstr ""
 msgstr ""
+"Verifique si los directorios streams-available y streams-enabled están "
+"dentro del directorio de configuración de nginx."
 
 
 #: src/constants/errors/crypto.ts:3
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "El texto cifrado es demasiado corto"
 
 
 #: src/language/constants.ts:13
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
 msgid "Cleaning environment variables"
@@ -685,43 +791,44 @@ msgstr "Limpiado exitoso"
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
 msgid "Click or drag backup file to this area to upload"
 msgstr ""
 msgstr ""
+"Haga clic o arrastre el archivo de copia de seguridad a esta área para "
+"cargar"
 
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
 msgid "Click to copy"
-msgstr ""
+msgstr "Haga clic para copiar"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "Tamaño del búfer del cuerpo del cliente"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "Tamaño del búfer de cabecera del cliente"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "Tamaño máximo del cuerpo del cliente"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 msgid "Client request body buffer size"
 msgid "Client request body buffer size"
-msgstr ""
+msgstr "Tamaño del búfer del cuerpo de la solicitud del cliente"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 msgid "Client request header buffer size"
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "Tamaño del búfer de cabecera de solicitud del cliente"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
 msgid "Close"
-msgstr ""
+msgstr "Cerrar"
 
 
 #: src/constants/errors/llm.ts:2
 #: src/constants/errors/llm.ts:2
-#, fuzzy
 msgid "Code completion is not enabled"
 msgid "Code completion is not enabled"
-msgstr "La cuenta actual no tiene habilitada TOTP."
+msgstr "La finalización de código no está habilitada"
 
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
 msgid "Code Completion Model"
-msgstr ""
+msgstr "Modelo de finalización de código"
 
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
 msgid "Command"
@@ -729,7 +836,7 @@ msgstr "Comando"
 
 
 #: src/constants/errors/docker.ts:6
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr ""
+msgstr "El comando terminó con un código de salida inesperado: {0}, error: {1}"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
@@ -740,7 +847,7 @@ msgstr "Comentarios"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
 msgid "Compare"
-msgstr ""
+msgstr "Comparar"
 
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
 #, fuzzy
@@ -749,15 +856,15 @@ msgstr "Configuraciones"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
 msgid "Compare Selected"
-msgstr ""
+msgstr "Comparar seleccionado"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
 msgid "Compare with Current"
-msgstr ""
+msgstr "Comparar con la corriente"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 msgid "Compression level, 1 is lowest, 9 is highest"
 msgid "Compression level, 1 is lowest, 9 is highest"
-msgstr ""
+msgstr "Nivel de compresión, 1 es más bajo, 9 es más alto"
 
 
 #: src/constants/errors/backup.ts:14
 #: src/constants/errors/backup.ts:14
 #, fuzzy
 #, fuzzy
@@ -801,7 +908,7 @@ msgstr "Conectado"
 
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "Error de conexión, intentando reconectar..."
 
 
 #: src/views/terminal/Terminal.vue:142
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
 msgid "Connection lost, please refresh the page."
@@ -809,11 +916,11 @@ msgstr "Conexión perdida, por favor actualice la página."
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
 msgid "Connection timeout period"
-msgstr ""
+msgstr "Período de tiempo de espera de conexión"
 
 
 #: src/constants/errors/docker.ts:7
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
 msgid "Container status unknown"
-msgstr ""
+msgstr "Estado del contenedor desconocido"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -909,7 +1016,7 @@ msgstr "La creación de un cliente facilita la comunicación con el servidor CA"
 msgid "Credential"
 msgid "Credential"
 msgstr "Credencial"
 msgstr "Credencial"
 
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgid "Credentials"
 msgstr "Credenciales"
 msgstr "Credenciales"
 
 
@@ -1206,7 +1313,7 @@ msgid "DNS Credentials"
 msgstr "Credenciales de DNS"
 msgstr "Credenciales de DNS"
 
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgid "DNS Provider"
 msgstr "Proveedor DNS"
 msgstr "Proveedor DNS"
 
 
@@ -1256,6 +1363,10 @@ msgstr ""
 msgid "Docker Socket"
 msgid "Docker Socket"
 msgstr ""
 msgstr ""
 
 
+#: src/constants/errors/self_check.ts:15
+msgid "Docker socket not exist"
+msgstr ""
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #, fuzzy
 #, fuzzy
@@ -1268,7 +1379,7 @@ msgstr[1] "Documento de la API"
 msgid "Domain"
 msgid "Domain"
 msgstr "Dominio"
 msgstr "Dominio"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:112
+#: src/views/certificate/CertificateEditor.vue:112
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr ""
 msgstr ""
 "La lista de dominios está vacía, intente reabrir la certificación "
 "La lista de dominios está vacía, intente reabrir la certificación "
@@ -1535,7 +1646,7 @@ msgstr ""
 msgid "External Notify"
 msgid "External Notify"
 msgstr ""
 msgstr ""
 
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 msgid "Fail to obtain certificate"
 msgid "Fail to obtain certificate"
 msgstr "Falla al obtener el certificado"
 msgstr "Falla al obtener el certificado"
 
 
@@ -1688,6 +1799,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgid "Failed to delete certificate"
 msgstr "Falla al obtener el certificado"
 msgstr "Falla al obtener el certificado"
 
 
+#: src/language/generate.ts:9
+#, fuzzy
+msgid "Failed to delete certificate from database: %{error}"
+msgstr "Falla al obtener el certificado"
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
 #: src/views/stream/StreamList.vue:102
@@ -1851,6 +1967,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgid "Failed to revoke certificate"
 msgstr "Falla al obtener el certificado"
 msgstr "Falla al obtener el certificado"
 
 
+#: src/language/generate.ts:17
+#, fuzzy
+msgid "Failed to revoke certificate: %{error}"
+msgstr "Falla al obtener el certificado"
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #, fuzzy
 #, fuzzy
 msgid "Failed to save Nginx performance settings"
 msgid "Failed to save Nginx performance settings"
@@ -1890,7 +2011,7 @@ msgstr "Archivo no encontrado"
 msgid "Filename is empty"
 msgid "Filename is empty"
 msgstr ""
 msgstr ""
 
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgid "Filter"
 msgstr "Filtro"
 msgstr "Filtro"
 
 
@@ -2084,7 +2205,7 @@ msgid "Import"
 msgstr "Importar"
 msgstr "Importar"
 
 
 #: src/routes/modules/certificates.ts:46
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgid "Import Certificate"
 msgstr "Importar Certificado"
 msgstr "Importar Certificado"
 
 
@@ -2312,8 +2433,8 @@ msgstr "Para no modificar dejar en blanco"
 msgid "Leave blank if you don't need this."
 msgid "Leave blank if you don't need this."
 msgstr "Déjelo en blanco si no lo necesita."
 msgstr "Déjelo en blanco si no lo necesita."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:223
-#: src/views/certificate/components/CertificateEditor.vue:237
+#: src/views/certificate/CertificateEditor.vue:223
+#: src/views/certificate/CertificateEditor.vue:237
 msgid "Leave blank will not change anything"
 msgid "Leave blank will not change anything"
 msgstr "Dejarlo en blanco no cambiará nada"
 msgstr "Dejarlo en blanco no cambiará nada"
 
 
@@ -2386,10 +2507,14 @@ msgstr "Ubicación"
 msgid "Locations"
 msgid "Locations"
 msgstr "Ubicaciones"
 msgstr "Ubicaciones"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 msgid "Log"
 msgstr "Registro"
 msgstr "Registro"
 
 
+#: src/language/generate.ts:23
+msgid "Log file %{log_path} is not a regular file. "
+msgstr ""
+
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #, fuzzy
 #, fuzzy
 msgid "Log List"
 msgid "Log List"
@@ -2594,7 +2719,7 @@ msgid "Modify"
 msgstr "Modificar"
 msgstr "Modificar"
 
 
 #: src/routes/modules/certificates.ts:36
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgid "Modify Certificate"
 msgstr "Modificar Certificado"
 msgstr "Modificar Certificado"
 
 
@@ -2612,8 +2737,8 @@ msgstr "Directiva multilínea"
 
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:10
 #: src/views/certificate/CertificateList/certColumns.tsx:10
-#: src/views/certificate/components/CertificateEditor.vue:162
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2777,7 +2902,7 @@ msgstr "Nginx no se está ejecutando"
 msgid "Nginx is running"
 msgid "Nginx is running"
 msgstr "Nginx no se está ejecutando"
 msgstr "Nginx no se está ejecutando"
 
 
-#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:143
+#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:144
 msgid "Nginx Log"
 msgid "Nginx Log"
 msgstr "Registro Nginx"
 msgstr "Registro Nginx"
 
 
@@ -3808,7 +3933,7 @@ msgstr "Corriendo"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
-#: src/views/certificate/components/CertificateEditor.vue:266
+#: src/views/certificate/CertificateEditor.vue:266
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
@@ -3873,7 +3998,7 @@ msgstr "Duplicado con éxito de %{conf_name} a %{node_name}"
 
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #: src/views/preference/store/index.ts:118
 msgid "Save successfully"
 msgid "Save successfully"
 msgstr "Guardado con éxito"
 msgstr "Guardado con éxito"
@@ -3890,7 +4015,7 @@ msgstr ""
 "Escanee el código QR con su teléfono móvil para agregar la cuenta a la "
 "Escanee el código QR con su teléfono móvil para agregar la cuenta a la "
 "aplicación."
 "aplicación."
 
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgid "SDK"
 msgstr "SDK"
 msgstr "SDK"
 
 
@@ -4071,7 +4196,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgid "SSL Certificate Content"
 msgstr "Contenido de certificado SSL"
 msgstr "Contenido de certificado SSL"
 
 
@@ -4084,15 +4209,15 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgid "SSL certificate file not found"
 msgstr "Contenido de la llave del certificado SSL"
 msgstr "Contenido de la llave del certificado SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgid "SSL Certificate Key Content"
 msgstr "Contenido de la llave del certificado SSL"
 msgstr "Contenido de la llave del certificado SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgid "SSL Certificate Key Path"
 msgstr "Ruta de la llave del certificado SSL"
 msgstr "Ruta de la llave del certificado SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgid "SSL Certificate Path"
 msgstr "Ruta del certificado SSL"
 msgstr "Ruta del certificado SSL"
@@ -4266,7 +4391,7 @@ msgstr "Sincronizar con"
 msgid "Sync strategy"
 msgid "Sync strategy"
 msgstr "Sincronizar Certificado"
 msgstr "Sincronizar Certificado"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgid "Sync to"
 msgstr "Sincronizar con"
 msgstr "Sincronizar con"
 
 
@@ -4345,11 +4470,11 @@ msgstr ""
 "El nombre del modelo solo debe contener letras, unicode, números, guiones, "
 "El nombre del modelo solo debe contener letras, unicode, números, guiones, "
 "rayas y puntos."
 "rayas y puntos."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgid "The input is not a SSL Certificate"
 msgstr "La entrada no es un Certificado SSL"
 msgstr "La entrada no es un Certificado SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgid "The input is not a SSL Certificate Key"
 msgstr "La entrada no es una clave de certificado SSL"
 msgstr "La entrada no es una clave de certificado SSL"
 
 
@@ -4387,11 +4512,11 @@ msgstr ""
 msgid "The parameter of server_name is required"
 msgid "The parameter of server_name is required"
 msgstr "Se requiere el parámetro server_name"
 msgstr "Se requiere el parámetro server_name"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 msgid "The path exists, but the file is not a certificate"
 msgid "The path exists, but the file is not a certificate"
 msgstr "La ruta existe, pero el archivo no es un certificado"
 msgstr "La ruta existe, pero el archivo no es un certificado"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:196
+#: src/views/certificate/CertificateEditor.vue:196
 msgid "The path exists, but the file is not a private key"
 msgid "The path exists, but the file is not a private key"
 msgstr "La ruta existe, pero el archivo no es una clave privada"
 msgstr "La ruta existe, pero el archivo no es una clave privada"
 
 
@@ -4451,17 +4576,17 @@ msgid ""
 "lose access to your account."
 "lose access to your account."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr "Este elemento de Auto Cert es inválido, elimínelo por favor."
 msgstr "Este elemento de Auto Cert es inválido, elimínelo por favor."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 msgid "This certificate is managed by Nginx UI"
 msgstr "Este certificado es administrado por Nginx UI"
 msgstr "Este certificado es administrado por Nginx UI"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:165
-#: src/views/certificate/components/CertificateEditor.vue:179
-#: src/views/certificate/components/CertificateEditor.vue:194
+#: src/views/certificate/CertificateEditor.vue:165
+#: src/views/certificate/CertificateEditor.vue:179
+#: src/views/certificate/CertificateEditor.vue:194
 msgid "This field is required"
 msgid "This field is required"
 msgstr "Este campo es obligatorio"
 msgstr "Este campo es obligatorio"
 
 

+ 191 - 69
app/src/language/fr_FR/app.po

@@ -14,6 +14,100 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
 "X-Generator: Weblate 5.9.2\n"
 "X-Generator: Weblate 5.9.2\n"
 
 
+#: src/language/generate.ts:19
+msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
+msgstr ""
+"[Nginx UI] Utilisateur ACME : %{name}, Email : %{email}, Répertoire CA : "
+"%{caDir}"
+
+#: src/language/generate.ts:13
+msgid "[Nginx UI] Backing up current certificate for later revocation"
+msgstr "[Nginx UI] Sauvegarde du certificat actuel pour une révocation ultérieure"
+
+#: src/language/generate.ts:28
+#, fuzzy
+msgid "[Nginx UI] Certificate renewed successfully"
+msgstr "Désactivé avec succès"
+
+#: src/language/generate.ts:8
+#, fuzzy
+msgid "[Nginx UI] Certificate successfully revoked"
+msgstr "Nginx a redémarré avec succès"
+
+#: src/language/generate.ts:29
+msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgstr ""
+"[Nginx UI] Le certificat a été utilisé pour le serveur, rechargement du "
+"certificat TLS du serveur"
+
+#: src/language/generate.ts:24
+#, fuzzy
+msgid "[Nginx UI] Creating client facilitates communication with the CA server"
+msgstr "La création du client facilite la communication avec le serveur CA"
+
+#: src/language/generate.ts:12
+#, fuzzy
+msgid "[Nginx UI] Environment variables cleaned"
+msgstr "Définition des variables d'environnement"
+
+#: src/language/generate.ts:21
+msgid "[Nginx UI] Finished"
+msgstr "[Nginx UI] Terminé"
+
+#: src/language/generate.ts:4
+#, fuzzy
+msgid "[Nginx UI] Issued certificate successfully"
+msgstr "Certificat délivré avec succès"
+
+#: src/language/generate.ts:14
+msgid "[Nginx UI] Obtaining certificate"
+msgstr "[Nginx UI] Obtention du certificat"
+
+#: src/language/generate.ts:22
+msgid "[Nginx UI] Preparing for certificate revocation"
+msgstr "[Nginx UI] Préparation de la révocation du certificat"
+
+#: src/language/generate.ts:18
+msgid "[Nginx UI] Preparing lego configurations"
+msgstr "[Nginx UI] Préparation des configurations lego"
+
+#: src/language/generate.ts:25
+msgid "[Nginx UI] Reloading nginx"
+msgstr "[Nginx UI] Rechargement de nginx"
+
+#: src/language/generate.ts:16
+msgid "[Nginx UI] Revocation completed"
+msgstr "[Nginx UI] Révocation terminée"
+
+#: src/language/generate.ts:7
+msgid "[Nginx UI] Revoking certificate"
+msgstr "[Nginx UI] Révoquer le certificat"
+
+#: src/language/generate.ts:26
+msgid "[Nginx UI] Revoking old certificate"
+msgstr "[Nginx UI] Révoquer l'ancien certificat"
+
+#: src/language/generate.ts:20
+msgid "[Nginx UI] Setting DNS01 challenge provider"
+msgstr "[Nginx UI] Configuration du fournisseur de défi DNS01"
+
+#: src/language/generate.ts:6
+#, fuzzy
+msgid "[Nginx UI] Setting environment variables"
+msgstr "Définition des variables d'environnement"
+
+#: src/language/generate.ts:11
+msgid "[Nginx UI] Setting HTTP01 challenge provider"
+msgstr "[Nginx UI] Configuration du fournisseur de défi HTTP01"
+
+#: src/language/generate.ts:15
+msgid "[Nginx UI] Writing certificate private key to disk"
+msgstr "[Nginx UI] Écriture de la clé privée du certificat sur le disque"
+
+#: src/language/generate.ts:27
+msgid "[Nginx UI] Writing certificate to disk"
+msgstr "[Nginx UI] Écriture du certificat sur le disque"
+
 #: src/views/user/userColumns.tsx:32
 #: src/views/user/userColumns.tsx:32
 msgid "2FA"
 msgid "2FA"
 msgstr "2fa"
 msgstr "2fa"
@@ -110,7 +204,7 @@ msgstr "Ajouter un site"
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "Mis à jour avec succés"
 msgstr "Mis à jour avec succés"
 
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 #, fuzzy
 #, fuzzy
 msgid "Additional"
 msgid "Additional"
 msgstr "Supplémentaire"
 msgstr "Supplémentaire"
@@ -140,7 +234,7 @@ msgstr "Tous les codes de récupération ont été utilisés"
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "URL de base de l'API"
 msgstr "URL de base de l'API"
 
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 #, fuzzy
 #, fuzzy
 msgid "API Document"
 msgid "API Document"
 msgstr "Jeton d'API"
 msgstr "Jeton d'API"
@@ -297,7 +391,7 @@ msgstr "Auto"
 msgid "auto = CPU cores"
 msgid "auto = CPU cores"
 msgstr "auto = cœurs CPU"
 msgstr "auto = cœurs CPU"
 
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgid "Auto Refresh"
 msgstr "Actualisation automatique"
 msgstr "Actualisation automatique"
 
 
@@ -317,11 +411,9 @@ msgstr "\"Redémarrage Automatique\""
 msgid "Automatically indexed from site and stream configurations."
 msgid "Automatically indexed from site and stream configurations."
 msgstr "\"Indexé automatiquement à partir des configurations de site et de flux.\""
 msgstr "\"Indexé automatiquement à partir des configurations de site et de flux.\""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:259
-#: src/views/config/ConfigEditor.vue:266
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
-#: src/views/nginx_log/NginxLog.vue:173
+#: src/views/certificate/CertificateEditor.vue:259
+#: src/views/config/ConfigEditor.vue:266 src/views/config/ConfigList.vue:112
+#: src/views/config/ConfigList.vue:195 src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/stream/components/StreamEditor.vue:106
 #: src/views/stream/components/StreamEditor.vue:106
 msgid "Back"
 msgid "Back"
@@ -533,42 +625,40 @@ msgid "Certificate %{name} will expire in 1 day"
 msgstr "Le certificat %{name} expirera dans 1 jour"
 msgstr "Le certificat %{name} expirera dans 1 jour"
 
 
 #: src/constants/errors/cert.ts:4
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 msgid "Certificate decode error"
 msgid "Certificate decode error"
-msgstr "Changer de certificat"
+msgstr "Erreur de décodage du certificat"
 
 
 #: src/components/Notification/notifications.ts:29
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
 msgid "Certificate Expiration Notice"
-msgstr "Modèles de configuration"
+msgstr "Avis d'expiration du certificat"
 
 
 #: src/components/Notification/notifications.ts:25
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
 msgid "Certificate Expired"
-msgstr "Liste des certifications"
+msgstr "Certificat expiré"
 
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 msgid "Certificate Expiring Soon"
 msgid "Certificate Expiring Soon"
-msgstr "Le certificat a expiré"
+msgstr "Certificat expirant bientôt"
 
 
-#: src/constants/errors/cert.ts:5
+#: src/language/generate.ts:5
 #, fuzzy
 #, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "Erreur de décodage du certificat"
+
+#: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgid "Certificate parse error"
-msgstr "Le certificat a expiré"
+msgstr "Erreur d'analyse du certificat"
 
 
 #: src/constants/errors/cert.ts:8
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 msgid "Certificate path is empty"
 msgid "Certificate path is empty"
-msgstr "Modèles de configuration"
+msgstr "Le chemin du certificat est vide"
 
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
 #: src/views/certificate/components/RemoveCert.vue:61
-#, fuzzy
 msgid "Certificate removed successfully"
 msgid "Certificate removed successfully"
-msgstr "Désactivé avec succès"
+msgstr "Certificat supprimé avec succès"
 
 
 #: src/views/preference/tabs/CertSettings.vue:27
 #: src/views/preference/tabs/CertSettings.vue:27
 #, fuzzy
 #, fuzzy
@@ -580,7 +670,12 @@ msgstr "Le certificat est valide"
 msgid "Certificate renewed successfully"
 msgid "Certificate renewed successfully"
 msgstr "Désactivé avec succès"
 msgstr "Désactivé avec succès"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:128
+#: src/language/generate.ts:10
+#, fuzzy
+msgid "Certificate revoked successfully"
+msgstr "Certificat supprimé avec succès"
+
+#: src/views/certificate/CertificateEditor.vue:128
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #, fuzzy
 #, fuzzy
 msgid "Certificate Status"
 msgid "Certificate Status"
@@ -628,7 +723,7 @@ msgstr "Canal"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
 msgid "Chat"
-msgstr ""
+msgstr "Chat"
 
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -646,12 +741,18 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 "/var/run/docker.sock:/var/run/docker.sock`."
 msgstr ""
 msgstr ""
+"Vérifiez si /var/run/docker.sock existe. Si vous utilisez l'image Docker "
+"officielle de Nginx UI, assurez-vous que le socket Docker est monté comme "
+"ceci : `-v /var/run/docker.sock:/var/run/docker.sock`."
 
 
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 msgid ""
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 "prevents using Passkeys and clipboard features."
 msgstr ""
 msgstr ""
+"Vérifiez si HTTPS est activé. L'utilisation de HTTP en dehors de localhost "
+"est non sécurisée et empêche l'utilisation des fonctionnalités Passkeys et "
+"presse-papiers."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 #, fuzzy
 #, fuzzy
@@ -706,6 +807,8 @@ msgstr "Désactivé avec succès"
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
 msgid "Click or drag backup file to this area to upload"
 msgstr ""
 msgstr ""
+"Cliquez sur ou faites glisser le fichier de sauvegarde vers cette zone pour "
+"télécharger"
 
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
 msgid "Click to copy"
@@ -713,36 +816,35 @@ msgstr "Clique pour copier"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "Taille du tampon du corps client"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "Taille du tampon d'en-tête client"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "Taille maximale du corps du client"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 msgid "Client request body buffer size"
 msgid "Client request body buffer size"
-msgstr ""
+msgstr "Taille du tampon du corps de la requête client"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 msgid "Client request header buffer size"
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "Taille du tampon d'en-tête de requête client"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
 msgid "Close"
-msgstr ""
+msgstr "Fermer"
 
 
 #: src/constants/errors/llm.ts:2
 #: src/constants/errors/llm.ts:2
-#, fuzzy
 msgid "Code completion is not enabled"
 msgid "Code completion is not enabled"
-msgstr "Le compte actuel n'a pas le TOTP d'activé."
+msgstr "La complétion de code n'est pas activée"
 
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
 msgid "Code Completion Model"
-msgstr ""
+msgstr "Modèle de complétion de code"
 
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #, fuzzy
 #, fuzzy
@@ -752,6 +854,8 @@ msgstr "Commentaires"
 #: src/constants/errors/docker.ts:6
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
 msgstr ""
 msgstr ""
+"La commande s'est terminée avec un code de sortie inattendu : {0}, erreur : "
+"{1}"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
@@ -762,7 +866,7 @@ msgstr "Commentaires"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
 msgid "Compare"
-msgstr ""
+msgstr "Comparer"
 
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
 #, fuzzy
@@ -771,15 +875,15 @@ msgstr "Configurations"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
 msgid "Compare Selected"
-msgstr ""
+msgstr "Comparez sélectionné"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
 msgid "Compare with Current"
-msgstr ""
+msgstr "Comparez avec le courant"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 msgid "Compression level, 1 is lowest, 9 is highest"
 msgid "Compression level, 1 is lowest, 9 is highest"
-msgstr ""
+msgstr "Le niveau de compression, 1 est le plus bas, 9 est le plus élevé"
 
 
 #: src/constants/errors/backup.ts:14
 #: src/constants/errors/backup.ts:14
 #, fuzzy
 #, fuzzy
@@ -823,7 +927,7 @@ msgstr "Connecté"
 
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "Erreur de connexion, tentative de reconnexion..."
 
 
 #: src/views/terminal/Terminal.vue:142
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
 msgid "Connection lost, please refresh the page."
@@ -831,11 +935,11 @@ msgstr "Connexion perdue, merci de recharger la page."
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
 msgid "Connection timeout period"
-msgstr ""
+msgstr "Période de délai de connexion"
 
 
 #: src/constants/errors/docker.ts:7
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
 msgid "Container status unknown"
-msgstr ""
+msgstr "Statut du conteneur inconnu"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -934,7 +1038,7 @@ msgstr "La création du client facilite la communication avec le serveur CA"
 msgid "Credential"
 msgid "Credential"
 msgstr "Identifiant"
 msgstr "Identifiant"
 
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgid "Credentials"
 msgstr "Identifiants"
 msgstr "Identifiants"
 
 
@@ -1239,7 +1343,7 @@ msgid "DNS Credentials"
 msgstr "Identifiants DNS"
 msgstr "Identifiants DNS"
 
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgid "DNS Provider"
 msgstr "Fournisseur DNS"
 msgstr "Fournisseur DNS"
 
 
@@ -1292,6 +1396,10 @@ msgstr ""
 msgid "Docker Socket"
 msgid "Docker Socket"
 msgstr ""
 msgstr ""
 
 
+#: src/constants/errors/self_check.ts:15
+msgid "Docker socket not exist"
+msgstr ""
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #, fuzzy
 #, fuzzy
@@ -1304,7 +1412,7 @@ msgstr[1] "Jeton d'API"
 msgid "Domain"
 msgid "Domain"
 msgstr "Domaine"
 msgstr "Domaine"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:112
+#: src/views/certificate/CertificateEditor.vue:112
 #, fuzzy
 #, fuzzy
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr ""
 msgstr ""
@@ -1581,7 +1689,7 @@ msgstr ""
 msgid "External Notify"
 msgid "External Notify"
 msgstr ""
 msgstr ""
 
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 #, fuzzy
 #, fuzzy
 msgid "Fail to obtain certificate"
 msgid "Fail to obtain certificate"
 msgstr "Obtenir un certificat"
 msgstr "Obtenir un certificat"
@@ -1736,6 +1844,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgid "Failed to delete certificate"
 msgstr "Obtenir un certificat"
 msgstr "Obtenir un certificat"
 
 
+#: src/language/generate.ts:9
+#, fuzzy
+msgid "Failed to delete certificate from database: %{error}"
+msgstr "Obtenir un certificat"
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
 #: src/views/stream/StreamList.vue:102
@@ -1905,6 +2018,11 @@ msgstr "Erreur lecture nginx.conf"
 msgid "Failed to revoke certificate"
 msgid "Failed to revoke certificate"
 msgstr "Obtenir un certificat"
 msgstr "Obtenir un certificat"
 
 
+#: src/language/generate.ts:17
+#, fuzzy
+msgid "Failed to revoke certificate: %{error}"
+msgstr "Obtenir un certificat"
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #, fuzzy
 #, fuzzy
 msgid "Failed to save Nginx performance settings"
 msgid "Failed to save Nginx performance settings"
@@ -1944,7 +2062,7 @@ msgstr "Fichier introuvable"
 msgid "Filename is empty"
 msgid "Filename is empty"
 msgstr "Nom du fichier vide"
 msgstr "Nom du fichier vide"
 
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgid "Filter"
 msgstr "Filtrer"
 msgstr "Filtrer"
 
 
@@ -2144,7 +2262,7 @@ msgid "Import"
 msgstr "Exporter"
 msgstr "Exporter"
 
 
 #: src/routes/modules/certificates.ts:46
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 #, fuzzy
 #, fuzzy
 msgid "Import Certificate"
 msgid "Import Certificate"
 msgstr "État du certificat"
 msgstr "État du certificat"
@@ -2380,8 +2498,8 @@ msgstr "Laisser vide pour aucun changement"
 msgid "Leave blank if you don't need this."
 msgid "Leave blank if you don't need this."
 msgstr "Laisser vide pour aucun changement"
 msgstr "Laisser vide pour aucun changement"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:223
-#: src/views/certificate/components/CertificateEditor.vue:237
+#: src/views/certificate/CertificateEditor.vue:223
+#: src/views/certificate/CertificateEditor.vue:237
 #, fuzzy
 #, fuzzy
 msgid "Leave blank will not change anything"
 msgid "Leave blank will not change anything"
 msgstr "Laisser vide pour aucun changement"
 msgstr "Laisser vide pour aucun changement"
@@ -2461,11 +2579,15 @@ msgstr "Localisation"
 msgid "Locations"
 msgid "Locations"
 msgstr "Localisations"
 msgstr "Localisations"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 #, fuzzy
 #, fuzzy
 msgid "Log"
 msgid "Log"
 msgstr "Connexion"
 msgstr "Connexion"
 
 
+#: src/language/generate.ts:23
+msgid "Log file %{log_path} is not a regular file. "
+msgstr ""
+
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #, fuzzy
 #, fuzzy
 msgid "Log List"
 msgid "Log List"
@@ -2667,7 +2789,7 @@ msgid "Modify"
 msgstr "Modifier"
 msgstr "Modifier"
 
 
 #: src/routes/modules/certificates.ts:36
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 #, fuzzy
 #, fuzzy
 msgid "Modify Certificate"
 msgid "Modify Certificate"
 msgstr "État du certificat"
 msgstr "État du certificat"
@@ -2687,8 +2809,8 @@ msgstr "Directive multiligne"
 
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:10
 #: src/views/certificate/CertificateList/certColumns.tsx:10
-#: src/views/certificate/components/CertificateEditor.vue:162
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2853,7 +2975,7 @@ msgstr ""
 msgid "Nginx is running"
 msgid "Nginx is running"
 msgstr ""
 msgstr ""
 
 
-#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:143
+#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:144
 msgid "Nginx Log"
 msgid "Nginx Log"
 msgstr "Journal Nginx"
 msgstr "Journal Nginx"
 
 
@@ -3885,7 +4007,7 @@ msgstr "En cours d'éxécution"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
-#: src/views/certificate/components/CertificateEditor.vue:266
+#: src/views/certificate/CertificateEditor.vue:266
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
@@ -3950,7 +4072,7 @@ msgstr "Dupliqué avec succès"
 
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #: src/views/preference/store/index.ts:118
 msgid "Save successfully"
 msgid "Save successfully"
 msgstr "Sauvegarde réussie"
 msgstr "Sauvegarde réussie"
@@ -3965,7 +4087,7 @@ msgstr "Enregistré avec succès"
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgid "SDK"
 msgstr ""
 msgstr ""
 
 
@@ -4148,7 +4270,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 #, fuzzy
 #, fuzzy
 msgid "SSL Certificate Content"
 msgid "SSL Certificate Content"
 msgstr "Contenu de la certification SSL"
 msgstr "Contenu de la certification SSL"
@@ -4162,16 +4284,16 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgid "SSL certificate file not found"
 msgstr "Contenu de la clé de certification SSL"
 msgstr "Contenu de la clé de certification SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 #, fuzzy
 #, fuzzy
 msgid "SSL Certificate Key Content"
 msgid "SSL Certificate Key Content"
 msgstr "Contenu de la clé de certification SSL"
 msgstr "Contenu de la clé de certification SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgid "SSL Certificate Key Path"
 msgstr "Chemin de la clé du certificat SSL"
 msgstr "Chemin de la clé du certificat SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgid "SSL Certificate Path"
 msgstr "Chemin du certificat SSL"
 msgstr "Chemin du certificat SSL"
@@ -4354,7 +4476,7 @@ msgstr ""
 msgid "Sync strategy"
 msgid "Sync strategy"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 #, fuzzy
 #, fuzzy
 msgid "Sync to"
 msgid "Sync to"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
@@ -4431,12 +4553,12 @@ msgid ""
 "dashes, colons, and dots."
 "dashes, colons, and dots."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 #, fuzzy
 #, fuzzy
 msgid "The input is not a SSL Certificate"
 msgid "The input is not a SSL Certificate"
 msgstr "Chemin de la clé du certificat SSL"
 msgstr "Chemin de la clé du certificat SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 #, fuzzy
 #, fuzzy
 msgid "The input is not a SSL Certificate Key"
 msgid "The input is not a SSL Certificate Key"
 msgstr "Chemin de la clé du certificat SSL"
 msgstr "Chemin de la clé du certificat SSL"
@@ -4469,12 +4591,12 @@ msgstr ""
 msgid "The parameter of server_name is required"
 msgid "The parameter of server_name is required"
 msgstr "Le paramètre server_name est obligatoire"
 msgstr "Le paramètre server_name est obligatoire"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 #, fuzzy
 #, fuzzy
 msgid "The path exists, but the file is not a certificate"
 msgid "The path exists, but the file is not a certificate"
 msgstr "Chemin de la clé du certificat SSL"
 msgstr "Chemin de la clé du certificat SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:196
+#: src/views/certificate/CertificateEditor.vue:196
 #, fuzzy
 #, fuzzy
 msgid "The path exists, but the file is not a private key"
 msgid "The path exists, but the file is not a private key"
 msgstr "Chemin de la clé du certificat SSL"
 msgstr "Chemin de la clé du certificat SSL"
@@ -4531,20 +4653,20 @@ msgid ""
 "lose access to your account."
 "lose access to your account."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 #, fuzzy
 #, fuzzy
 msgid "This Auto Cert item is invalid, please remove it."
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr ""
 msgstr ""
 "Cet élément de certification automatique n'est pas valide, veuillez le "
 "Cet élément de certification automatique n'est pas valide, veuillez le "
 "supprimer."
 "supprimer."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 msgid "This certificate is managed by Nginx UI"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:165
-#: src/views/certificate/components/CertificateEditor.vue:179
-#: src/views/certificate/components/CertificateEditor.vue:194
+#: src/views/certificate/CertificateEditor.vue:165
+#: src/views/certificate/CertificateEditor.vue:179
+#: src/views/certificate/CertificateEditor.vue:194
 msgid "This field is required"
 msgid "This field is required"
 msgstr ""
 msgstr ""
 
 

+ 30 - 0
app/src/language/generate.ts

@@ -0,0 +1,30 @@
+// This file is auto-generated. DO NOT EDIT MANUALLY.
+
+export const msg = [
+  $gettext('[Nginx UI] Issued certificate successfully'),
+  $gettext('Certificate not found: %{error}'),
+  $gettext('[Nginx UI] Setting environment variables'),
+  $gettext('[Nginx UI] Revoking certificate'),
+  $gettext('[Nginx UI] Certificate successfully revoked'),
+  $gettext('Failed to delete certificate from database: %{error}'),
+  $gettext('Certificate revoked successfully'),
+  $gettext('[Nginx UI] Setting HTTP01 challenge provider'),
+  $gettext('[Nginx UI] Environment variables cleaned'),
+  $gettext('[Nginx UI] Backing up current certificate for later revocation'),
+  $gettext('[Nginx UI] Obtaining certificate'),
+  $gettext('[Nginx UI] Writing certificate private key to disk'),
+  $gettext('[Nginx UI] Revocation completed'),
+  $gettext('Failed to revoke certificate: %{error}'),
+  $gettext('[Nginx UI] Preparing lego configurations'),
+  $gettext('[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}'),
+  $gettext('[Nginx UI] Setting DNS01 challenge provider'),
+  $gettext('[Nginx UI] Finished'),
+  $gettext('[Nginx UI] Preparing for certificate revocation'),
+  $gettext('Log file %{log_path} is not a regular file. '),
+  $gettext('[Nginx UI] Creating client facilitates communication with the CA server'),
+  $gettext('[Nginx UI] Reloading nginx'),
+  $gettext('[Nginx UI] Revoking old certificate'),
+  $gettext('[Nginx UI] Writing certificate to disk'),
+  $gettext('[Nginx UI] Certificate renewed successfully'),
+  $gettext('[Nginx UI] Certificate was used for server, reloading server TLS certificate'),
+]

+ 1 - 0
app/src/language/index.ts

@@ -0,0 +1 @@
+export { default as T } from './container'

+ 190 - 77
app/src/language/ja_JP/app.po

@@ -13,6 +13,95 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Weblate 5.6.2\n"
 "X-Generator: Weblate 5.6.2\n"
 
 
+#: src/language/generate.ts:19
+msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
+msgstr "[Nginx UI] ACME ユーザー: %{name}、メール: %{email}、CA ディレクトリ: %{caDir}"
+
+#: src/language/generate.ts:13
+msgid "[Nginx UI] Backing up current certificate for later revocation"
+msgstr "[Nginx UI] 現在の証明書を後で失効させるためにバックアップ中"
+
+#: src/language/generate.ts:28
+#, fuzzy
+msgid "[Nginx UI] Certificate renewed successfully"
+msgstr "正常に削除しました"
+
+#: src/language/generate.ts:8
+#, fuzzy
+msgid "[Nginx UI] Certificate successfully revoked"
+msgstr "証明書の削除に成功しました"
+
+#: src/language/generate.ts:29
+msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgstr "[Nginx UI] サーバーで証明書が使用されました、サーバーのTLS証明書を再読み込み中"
+
+#: src/language/generate.ts:24
+msgid "[Nginx UI] Creating client facilitates communication with the CA server"
+msgstr "[Nginx UI] CA サーバーとの通信を容易にするクライアントを作成中"
+
+#: src/language/generate.ts:12
+#, fuzzy
+msgid "[Nginx UI] Environment variables cleaned"
+msgstr "環境変数を削除する"
+
+#: src/language/generate.ts:21
+msgid "[Nginx UI] Finished"
+msgstr "[Nginx UI] 完了しました"
+
+#: src/language/generate.ts:4
+#, fuzzy
+msgid "[Nginx UI] Issued certificate successfully"
+msgstr "証明書の削除に成功しました"
+
+#: src/language/generate.ts:14
+msgid "[Nginx UI] Obtaining certificate"
+msgstr "[Nginx UI] 証明書を取得中"
+
+#: src/language/generate.ts:22
+msgid "[Nginx UI] Preparing for certificate revocation"
+msgstr "[Nginx UI] 証明書の失効準備中"
+
+#: src/language/generate.ts:18
+msgid "[Nginx UI] Preparing lego configurations"
+msgstr "[Nginx UI] Lego 設定の準備中"
+
+#: src/language/generate.ts:25
+msgid "[Nginx UI] Reloading nginx"
+msgstr "[Nginx UI] Nginx を再読み込み中"
+
+#: src/language/generate.ts:16
+msgid "[Nginx UI] Revocation completed"
+msgstr "[Nginx UI] 失効が完了しました"
+
+#: src/language/generate.ts:7
+msgid "[Nginx UI] Revoking certificate"
+msgstr "[Nginx UI] 証明書を失効中"
+
+#: src/language/generate.ts:26
+msgid "[Nginx UI] Revoking old certificate"
+msgstr "[Nginx UI] 古い証明書を失効中"
+
+#: src/language/generate.ts:20
+msgid "[Nginx UI] Setting DNS01 challenge provider"
+msgstr "[Nginx UI] DNS01 チャレンジプロバイダーを設定中"
+
+#: src/language/generate.ts:6
+#, fuzzy
+msgid "[Nginx UI] Setting environment variables"
+msgstr "環境変数を削除する"
+
+#: src/language/generate.ts:11
+msgid "[Nginx UI] Setting HTTP01 challenge provider"
+msgstr "[Nginx UI] HTTP01 チャレンジプロバイダーの設定"
+
+#: src/language/generate.ts:15
+msgid "[Nginx UI] Writing certificate private key to disk"
+msgstr "[Nginx UI] 証明書の秘密鍵をディスクに書き込んでいます"
+
+#: src/language/generate.ts:27
+msgid "[Nginx UI] Writing certificate to disk"
+msgstr "[Nginx UI] 証明書をディスクに書き込み中"
+
 #: src/views/user/userColumns.tsx:32
 #: src/views/user/userColumns.tsx:32
 msgid "2FA"
 msgid "2FA"
 msgstr "二要素認証"
 msgstr "二要素認証"
@@ -105,7 +194,7 @@ msgstr "Streamを追加"
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "正常に追加されました"
 msgstr "正常に追加されました"
 
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgid "Additional"
 msgstr "追加設定"
 msgstr "追加設定"
 
 
@@ -132,7 +221,7 @@ msgstr "すべてのリカバリーコードが使用済みです"
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "APIベースURL"
 msgstr "APIベースURL"
 
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgid "API Document"
 msgstr "APIドキュメント"
 msgstr "APIドキュメント"
 
 
@@ -281,7 +370,7 @@ msgstr "自動"
 msgid "auto = CPU cores"
 msgid "auto = CPU cores"
 msgstr "自動 = CPUコア数"
 msgstr "自動 = CPUコア数"
 
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgid "Auto Refresh"
 msgstr "自動更新"
 msgstr "自動更新"
 
 
@@ -301,9 +390,9 @@ msgstr "自動再起動"
 msgid "Automatically indexed from site and stream configurations."
 msgid "Automatically indexed from site and stream configurations."
 msgstr "「サイトおよびストリーム設定から自動的にインデックス化されました。」"
 msgstr "「サイトおよびストリーム設定から自動的にインデックス化されました。」"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:259
+#: src/views/certificate/CertificateEditor.vue:259
 #: src/views/config/ConfigEditor.vue:266 src/views/config/ConfigList.vue:112
 #: src/views/config/ConfigEditor.vue:266 src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195 src/views/nginx_log/NginxLog.vue:173
+#: src/views/config/ConfigList.vue:195 src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/stream/components/StreamEditor.vue:106
 #: src/views/stream/components/StreamEditor.vue:106
 msgid "Back"
 msgid "Back"
@@ -507,42 +596,40 @@ msgid "Certificate %{name} will expire in 1 day"
 msgstr "証明書 %{name} は1日で期限切れになります"
 msgstr "証明書 %{name} は1日で期限切れになります"
 
 
 #: src/constants/errors/cert.ts:4
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 msgid "Certificate decode error"
 msgid "Certificate decode error"
-msgstr "証明書更新間隔"
+msgstr "証明書のデコードエラー"
 
 
 #: src/components/Notification/notifications.ts:29
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
 msgid "Certificate Expiration Notice"
-msgstr "証明書リスト"
+msgstr "証明書有効期限のお知らせ"
 
 
 #: src/components/Notification/notifications.ts:25
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
 msgid "Certificate Expired"
-msgstr "証明書リスト"
+msgstr "証明書の有効期限が切れました"
 
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 msgid "Certificate Expiring Soon"
 msgid "Certificate Expiring Soon"
-msgstr "証明書リスト"
+msgstr "証明書の有効期限が近づいています"
 
 
-#: src/constants/errors/cert.ts:5
+#: src/language/generate.ts:5
 #, fuzzy
 #, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "証明書のデコードエラー"
+
+#: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgid "Certificate parse error"
-msgstr "証明書"
+msgstr "証明書の解析エラー"
 
 
 #: src/constants/errors/cert.ts:8
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 msgid "Certificate path is empty"
 msgid "Certificate path is empty"
-msgstr "証明書リスト"
+msgstr "証明書のパスが空です"
 
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
 #: src/views/certificate/components/RemoveCert.vue:61
-#, fuzzy
 msgid "Certificate removed successfully"
 msgid "Certificate removed successfully"
-msgstr "正常に削除しました"
+msgstr "証明書の削除に成功しました"
 
 
 #: src/views/preference/tabs/CertSettings.vue:27
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
 msgid "Certificate Renewal Interval"
@@ -553,7 +640,12 @@ msgstr "証明書更新間隔"
 msgid "Certificate renewed successfully"
 msgid "Certificate renewed successfully"
 msgstr "正常に削除しました"
 msgstr "正常に削除しました"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:128
+#: src/language/generate.ts:10
+#, fuzzy
+msgid "Certificate revoked successfully"
+msgstr "証明書の削除に成功しました"
+
+#: src/views/certificate/CertificateEditor.vue:128
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 msgid "Certificate Status"
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
 msgid_plural "Certificates Status"
@@ -594,7 +686,7 @@ msgstr "チャンネル"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
 msgid "Chat"
-msgstr ""
+msgstr "チャット"
 
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -612,40 +704,45 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 "/var/run/docker.sock:/var/run/docker.sock`."
 msgstr ""
 msgstr ""
+"/var/run/docker.sock が存在するか確認してください。Nginx UI 公式 Docker "
+"イメージを使用している場合は、Docker ソケットが次のようにマウントされていることを確認してください: `-v "
+"/var/run/docker.sock:/var/run/docker.sock`."
 
 
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 msgid ""
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 "prevents using Passkeys and clipboard features."
 msgstr ""
 msgstr ""
+"HTTPS が有効かどうかを確認します。localhost 以外で HTTP を使用すると安全ではなく、Passkeys "
+"やクリップボード機能の使用が妨げられます。"
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 msgid "Check if the nginx.conf includes the conf.d directory."
 msgid "Check if the nginx.conf includes the conf.d directory."
-msgstr ""
+msgstr "nginx.conf に conf.d ディレクトリが含まれているか確認します。"
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgid "Check if the nginx.conf includes the sites-enabled directory."
-msgstr ""
+msgstr "nginx.conf に sites-enabled ディレクトリが含まれているか確認します。"
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgid "Check if the nginx.conf includes the streams-enabled directory."
-msgstr ""
+msgstr "nginx.conf に streams-enabled ディレクトリが含まれているか確認します。"
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 "nginx configuration directory."
-msgstr ""
+msgstr "sites-available と sites-enabled ディレクトリが nginx の設定ディレクトリ配下にあるか確認します。"
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 "the nginx configuration directory."
-msgstr ""
+msgstr "streams-available と streams-enabled ディレクトリが nginx の設定ディレクトリ配下にあるか確認します。"
 
 
 #: src/constants/errors/crypto.ts:3
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "暗号文が短すぎます"
 
 
 #: src/language/constants.ts:13
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
 msgid "Cleaning environment variables"
@@ -665,43 +762,43 @@ msgstr "正常に削除しました"
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
 msgid "Click or drag backup file to this area to upload"
-msgstr ""
+msgstr "この領域にバックアップファイルをクリックまたはドラッグしてアップロードします"
 
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
 msgid "Click to copy"
-msgstr ""
+msgstr "クリックしてコピーします"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "クライアントボディバッファサイズ"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "クライアントヘッダーバッファサイズ"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "クライアント最大ボディサイズ"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 msgid "Client request body buffer size"
 msgid "Client request body buffer size"
-msgstr ""
+msgstr "クライアントリクエストボディのバッファサイズ"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 msgid "Client request header buffer size"
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "クライアントリクエストヘッダーバッファサイズ"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
 msgid "Close"
-msgstr ""
+msgstr "閉じる"
 
 
 #: src/constants/errors/llm.ts:2
 #: src/constants/errors/llm.ts:2
 msgid "Code completion is not enabled"
 msgid "Code completion is not enabled"
-msgstr ""
+msgstr "コード補完が有効になっていません"
 
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
 msgid "Code Completion Model"
-msgstr ""
+msgstr "コード補完モデル"
 
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
 msgid "Command"
@@ -709,7 +806,7 @@ msgstr "コマンド"
 
 
 #: src/constants/errors/docker.ts:6
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr ""
+msgstr "コマンドが予期しない終了コードで終了しました: {0}、エラー: {1}"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
@@ -720,7 +817,7 @@ msgstr "コメント"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
 msgid "Compare"
-msgstr ""
+msgstr "比較する"
 
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
 #, fuzzy
@@ -729,15 +826,15 @@ msgstr "設定"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
 msgid "Compare Selected"
-msgstr ""
+msgstr "選択したものを比較します"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
 msgid "Compare with Current"
-msgstr ""
+msgstr "電流と比較してください"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 msgid "Compression level, 1 is lowest, 9 is highest"
 msgid "Compression level, 1 is lowest, 9 is highest"
-msgstr ""
+msgstr "圧縮レベル、1は最も低く、9は最高です"
 
 
 #: src/constants/errors/backup.ts:14
 #: src/constants/errors/backup.ts:14
 #, fuzzy
 #, fuzzy
@@ -781,7 +878,7 @@ msgstr "接続済み"
 
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "接続エラー、再接続を試みています..."
 
 
 #: src/views/terminal/Terminal.vue:142
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
 msgid "Connection lost, please refresh the page."
@@ -789,11 +886,11 @@ msgstr "接続が失われました。ページを再読み込みしてくださ
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
 msgid "Connection timeout period"
-msgstr ""
+msgstr "接続タイムアウト期間"
 
 
 #: src/constants/errors/docker.ts:7
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
 msgid "Container status unknown"
-msgstr ""
+msgstr "コンテナの状態が不明です"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -819,7 +916,7 @@ msgstr "コピー"
 
 
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 msgid "Copy Codes"
 msgid "Copy Codes"
-msgstr ""
+msgstr "コードをコピー"
 
 
 #: src/views/system/Upgrade.vue:146
 #: src/views/system/Upgrade.vue:146
 msgid "Core Upgrade"
 msgid "Core Upgrade"
@@ -888,7 +985,7 @@ msgstr ""
 msgid "Credential"
 msgid "Credential"
 msgstr "認証情報"
 msgstr "認証情報"
 
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgid "Credentials"
 msgstr "認証情報"
 msgstr "認証情報"
 
 
@@ -1165,7 +1262,7 @@ msgid "DNS Credentials"
 msgstr ""
 msgstr ""
 
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgid "DNS Provider"
 msgstr ""
 msgstr ""
 
 
@@ -1215,6 +1312,10 @@ msgstr ""
 msgid "Docker Socket"
 msgid "Docker Socket"
 msgstr ""
 msgstr ""
 
 
+#: src/constants/errors/self_check.ts:15
+msgid "Docker socket not exist"
+msgstr ""
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #, fuzzy
 #, fuzzy
@@ -1226,7 +1327,7 @@ msgstr[0] "APIドキュメント"
 msgid "Domain"
 msgid "Domain"
 msgstr "ドメイン"
 msgstr "ドメイン"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:112
+#: src/views/certificate/CertificateEditor.vue:112
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr ""
 msgstr ""
 
 
@@ -1471,7 +1572,7 @@ msgstr ""
 msgid "External Notify"
 msgid "External Notify"
 msgstr ""
 msgstr ""
 
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 msgid "Fail to obtain certificate"
 msgid "Fail to obtain certificate"
 msgstr ""
 msgstr ""
 
 
@@ -1603,6 +1704,10 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgid "Failed to delete certificate"
 msgstr ""
 msgstr ""
 
 
+#: src/language/generate.ts:9
+msgid "Failed to delete certificate from database: %{error}"
+msgstr ""
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
 #: src/views/stream/StreamList.vue:102
@@ -1743,6 +1848,10 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgid "Failed to revoke certificate"
 msgstr ""
 msgstr ""
 
 
+#: src/language/generate.ts:17
+msgid "Failed to revoke certificate: %{error}"
+msgstr ""
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 msgid "Failed to save Nginx performance settings"
 msgid "Failed to save Nginx performance settings"
 msgstr ""
 msgstr ""
@@ -1779,7 +1888,7 @@ msgstr ""
 msgid "Filename is empty"
 msgid "Filename is empty"
 msgstr ""
 msgstr ""
 
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgid "Filter"
 msgstr ""
 msgstr ""
 
 
@@ -1957,7 +2066,7 @@ msgid "Import"
 msgstr ""
 msgstr ""
 
 
 #: src/routes/modules/certificates.ts:46
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgid "Import Certificate"
 msgstr ""
 msgstr ""
 
 
@@ -2176,8 +2285,8 @@ msgstr ""
 msgid "Leave blank if you don't need this."
 msgid "Leave blank if you don't need this."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:223
-#: src/views/certificate/components/CertificateEditor.vue:237
+#: src/views/certificate/CertificateEditor.vue:223
+#: src/views/certificate/CertificateEditor.vue:237
 msgid "Leave blank will not change anything"
 msgid "Leave blank will not change anything"
 msgstr ""
 msgstr ""
 
 
@@ -2250,10 +2359,14 @@ msgstr ""
 msgid "Locations"
 msgid "Locations"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 msgid "Log"
 msgstr ""
 msgstr ""
 
 
+#: src/language/generate.ts:23
+msgid "Log file %{log_path} is not a regular file. "
+msgstr ""
+
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 msgid "Log List"
 msgid "Log List"
 msgstr ""
 msgstr ""
@@ -2445,7 +2558,7 @@ msgid "Modify"
 msgstr ""
 msgstr ""
 
 
 #: src/routes/modules/certificates.ts:36
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgid "Modify Certificate"
 msgstr ""
 msgstr ""
 
 
@@ -2463,8 +2576,8 @@ msgstr ""
 
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:10
 #: src/views/certificate/CertificateList/certColumns.tsx:10
-#: src/views/certificate/components/CertificateEditor.vue:162
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2620,7 +2733,7 @@ msgstr ""
 msgid "Nginx is running"
 msgid "Nginx is running"
 msgstr ""
 msgstr ""
 
 
-#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:143
+#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:144
 msgid "Nginx Log"
 msgid "Nginx Log"
 msgstr ""
 msgstr ""
 
 
@@ -3435,7 +3548,7 @@ msgstr ""
 #: src/views/certificate/components/RenewCert.vue:27
 #: src/views/certificate/components/RenewCert.vue:27
 #: src/views/certificate/components/WildcardCertificate.vue:46
 #: src/views/certificate/components/WildcardCertificate.vue:46
 msgid "Renew successfully"
 msgid "Renew successfully"
-msgstr ""
+msgstr "証明書の更新に成功しました"
 
 
 #: src/views/dashboard/components/PerformanceTablesCard.vue:141
 #: src/views/dashboard/components/PerformanceTablesCard.vue:141
 msgid "Request statistics"
 msgid "Request statistics"
@@ -3576,7 +3689,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
-#: src/views/certificate/components/CertificateEditor.vue:266
+#: src/views/certificate/CertificateEditor.vue:266
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
@@ -3633,7 +3746,7 @@ msgstr ""
 
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #: src/views/preference/store/index.ts:118
 msgid "Save successfully"
 msgid "Save successfully"
 msgstr ""
 msgstr ""
@@ -3648,7 +3761,7 @@ msgstr ""
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgid "SDK"
 msgstr ""
 msgstr ""
 
 
@@ -3819,7 +3932,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgid "SSL Certificate Content"
 msgstr ""
 msgstr ""
 
 
@@ -3831,15 +3944,15 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgid "SSL certificate file not found"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgid "SSL Certificate Key Content"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgid "SSL Certificate Key Path"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgid "SSL Certificate Path"
 msgstr ""
 msgstr ""
@@ -4003,7 +4116,7 @@ msgstr ""
 msgid "Sync strategy"
 msgid "Sync strategy"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgid "Sync to"
 msgstr ""
 msgstr ""
 
 
@@ -4075,11 +4188,11 @@ msgid ""
 "dashes, colons, and dots."
 "dashes, colons, and dots."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgid "The input is not a SSL Certificate"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgid "The input is not a SSL Certificate Key"
 msgstr ""
 msgstr ""
 
 
@@ -4110,11 +4223,11 @@ msgstr ""
 msgid "The parameter of server_name is required"
 msgid "The parameter of server_name is required"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 msgid "The path exists, but the file is not a certificate"
 msgid "The path exists, but the file is not a certificate"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:196
+#: src/views/certificate/CertificateEditor.vue:196
 msgid "The path exists, but the file is not a private key"
 msgid "The path exists, but the file is not a private key"
 msgstr ""
 msgstr ""
 
 
@@ -4166,17 +4279,17 @@ msgid ""
 "lose access to your account."
 "lose access to your account."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 msgid "This certificate is managed by Nginx UI"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:165
-#: src/views/certificate/components/CertificateEditor.vue:179
-#: src/views/certificate/components/CertificateEditor.vue:194
+#: src/views/certificate/CertificateEditor.vue:165
+#: src/views/certificate/CertificateEditor.vue:179
+#: src/views/certificate/CertificateEditor.vue:194
 msgid "This field is required"
 msgid "This field is required"
 msgstr ""
 msgstr ""
 
 
@@ -4606,7 +4719,7 @@ msgstr ""
 #: src/views/preference/tabs/AuthSettings.vue:163
 #: src/views/preference/tabs/AuthSettings.vue:163
 #: src/views/preference/tabs/CertSettings.vue:72
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgid "Yes"
-msgstr ""
+msgstr "はい"
 
 
 #: src/views/terminal/Terminal.vue:135
 #: src/views/terminal/Terminal.vue:135
 msgid ""
 msgid ""

+ 194 - 81
app/src/language/ko_KR/app.po

@@ -14,6 +14,96 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Weblate 5.10.4\n"
 "X-Generator: Weblate 5.10.4\n"
 
 
+#: src/language/generate.ts:19
+msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
+msgstr "[Nginx UI] ACME 사용자: %{name}, 이메일: %{email}, CA 디렉터리: %{caDir}"
+
+#: src/language/generate.ts:13
+msgid "[Nginx UI] Backing up current certificate for later revocation"
+msgstr "[Nginx UI] 현재 인증서를 나중에 취소하기 위해 백업 중"
+
+#: src/language/generate.ts:28
+#, fuzzy
+msgid "[Nginx UI] Certificate renewed successfully"
+msgstr "성공적으로 제거됨"
+
+#: src/language/generate.ts:8
+#, fuzzy
+msgid "[Nginx UI] Certificate successfully revoked"
+msgstr "Nginx가 성공적으로 재시작됨"
+
+#: src/language/generate.ts:29
+msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgstr "[Nginx UI] 서버에 인증서가 사용되었습니다, 서버 TLS 인증서 다시 불러오는 중"
+
+#: src/language/generate.ts:24
+#, fuzzy
+msgid "[Nginx UI] Creating client facilitates communication with the CA server"
+msgstr "클라이언트 생성은 CA 서버와의 통신을 용이하게 합니다"
+
+#: src/language/generate.ts:12
+#, fuzzy
+msgid "[Nginx UI] Environment variables cleaned"
+msgstr "환경 변수 설정"
+
+#: src/language/generate.ts:21
+msgid "[Nginx UI] Finished"
+msgstr "[Nginx UI] 완료됨"
+
+#: src/language/generate.ts:4
+#, fuzzy
+msgid "[Nginx UI] Issued certificate successfully"
+msgstr "성공적으로 활성화됨"
+
+#: src/language/generate.ts:14
+msgid "[Nginx UI] Obtaining certificate"
+msgstr "[Nginx UI] 인증서 획득 중"
+
+#: src/language/generate.ts:22
+msgid "[Nginx UI] Preparing for certificate revocation"
+msgstr "[Nginx UI] 인증서 해지 준비 중"
+
+#: src/language/generate.ts:18
+msgid "[Nginx UI] Preparing lego configurations"
+msgstr "[Nginx UI] 레고 구성 준비 중"
+
+#: src/language/generate.ts:25
+msgid "[Nginx UI] Reloading nginx"
+msgstr "[Nginx UI] Nginx 다시 로드 중"
+
+#: src/language/generate.ts:16
+msgid "[Nginx UI] Revocation completed"
+msgstr "[Nginx UI] 해지 완료"
+
+#: src/language/generate.ts:7
+msgid "[Nginx UI] Revoking certificate"
+msgstr "[Nginx UI] 인증서 취소 중"
+
+#: src/language/generate.ts:26
+msgid "[Nginx UI] Revoking old certificate"
+msgstr "[Nginx UI] 이전 인증서 취소 중"
+
+#: src/language/generate.ts:20
+msgid "[Nginx UI] Setting DNS01 challenge provider"
+msgstr "[Nginx UI] DNS01 챌린지 공급자 설정 중"
+
+#: src/language/generate.ts:6
+#, fuzzy
+msgid "[Nginx UI] Setting environment variables"
+msgstr "환경 변수 설정"
+
+#: src/language/generate.ts:11
+msgid "[Nginx UI] Setting HTTP01 challenge provider"
+msgstr "[Nginx UI] HTTP01 챌린지 공급자 설정 중"
+
+#: src/language/generate.ts:15
+msgid "[Nginx UI] Writing certificate private key to disk"
+msgstr "[Nginx UI] 인증서 개인 키를 디스크에 기록 중"
+
+#: src/language/generate.ts:27
+msgid "[Nginx UI] Writing certificate to disk"
+msgstr "[Nginx UI] 인증서를 디스크에 작성 중"
+
 #: src/views/user/userColumns.tsx:32
 #: src/views/user/userColumns.tsx:32
 msgid "2FA"
 msgid "2FA"
 msgstr "2FA"
 msgstr "2FA"
@@ -106,7 +196,7 @@ msgstr "스트림 추가"
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "성공적으로 추가됨"
 msgstr "성공적으로 추가됨"
 
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgid "Additional"
 msgstr "추가적인"
 msgstr "추가적인"
 
 
@@ -133,7 +223,7 @@ msgstr "모든 복구 코드가 사용되었습니다"
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "API 기본 URL"
 msgstr "API 기본 URL"
 
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgid "API Document"
 msgstr "API 문서"
 msgstr "API 문서"
 
 
@@ -275,7 +365,7 @@ msgstr "자동"
 msgid "auto = CPU cores"
 msgid "auto = CPU cores"
 msgstr "자동 = CPU 코어"
 msgstr "자동 = CPU 코어"
 
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgid "Auto Refresh"
 msgstr "자동 새로고침"
 msgstr "자동 새로고침"
 
 
@@ -295,11 +385,9 @@ msgstr "\"자동 재시작\""
 msgid "Automatically indexed from site and stream configurations."
 msgid "Automatically indexed from site and stream configurations."
 msgstr "\"사이트 및 스트림 구성에서 자동으로 인덱싱되었습니다.\""
 msgstr "\"사이트 및 스트림 구성에서 자동으로 인덱싱되었습니다.\""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:259
-#: src/views/config/ConfigEditor.vue:266
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
-#: src/views/nginx_log/NginxLog.vue:173
+#: src/views/certificate/CertificateEditor.vue:259
+#: src/views/config/ConfigEditor.vue:266 src/views/config/ConfigList.vue:112
+#: src/views/config/ConfigList.vue:195 src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/stream/components/StreamEditor.vue:106
 #: src/views/stream/components/StreamEditor.vue:106
 msgid "Back"
 msgid "Back"
@@ -506,42 +594,40 @@ msgid "Certificate %{name} will expire in 1 day"
 msgstr "인증서 %{name}의 유효 기간이 1일 남았습니다"
 msgstr "인증서 %{name}의 유효 기간이 1일 남았습니다"
 
 
 #: src/constants/errors/cert.ts:4
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 msgid "Certificate decode error"
 msgid "Certificate decode error"
-msgstr "인증서 갱신 오류"
+msgstr "인증서 디코드 오류"
 
 
 #: src/components/Notification/notifications.ts:29
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
 msgid "Certificate Expiration Notice"
-msgstr "구성 템플릿"
+msgstr "인증서 만료 알림"
 
 
 #: src/components/Notification/notifications.ts:25
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
 msgid "Certificate Expired"
-msgstr "인증서 목록"
+msgstr "인증서 만료됨"
 
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 msgid "Certificate Expiring Soon"
 msgid "Certificate Expiring Soon"
-msgstr "인증서가 만료되었습니다"
+msgstr "인증서 만료 임박"
 
 
-#: src/constants/errors/cert.ts:5
+#: src/language/generate.ts:5
 #, fuzzy
 #, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "인증서 디코드 오류"
+
+#: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgid "Certificate parse error"
-msgstr "인증서가 만료되었습니다"
+msgstr "인증서 파싱 오류"
 
 
 #: src/constants/errors/cert.ts:8
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 msgid "Certificate path is empty"
 msgid "Certificate path is empty"
-msgstr "구성 템플릿"
+msgstr "인증서 경로가 비어 있습니다"
 
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
 #: src/views/certificate/components/RemoveCert.vue:61
-#, fuzzy
 msgid "Certificate removed successfully"
 msgid "Certificate removed successfully"
-msgstr "성공적으로 제거됨"
+msgstr "인증서가 성공적으로 제거되었습니다"
 
 
 #: src/views/preference/tabs/CertSettings.vue:27
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
 msgid "Certificate Renewal Interval"
@@ -552,7 +638,12 @@ msgstr "인증서 갱신 간격"
 msgid "Certificate renewed successfully"
 msgid "Certificate renewed successfully"
 msgstr "성공적으로 제거됨"
 msgstr "성공적으로 제거됨"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:128
+#: src/language/generate.ts:10
+#, fuzzy
+msgid "Certificate revoked successfully"
+msgstr "인증서가 성공적으로 제거되었습니다"
+
+#: src/views/certificate/CertificateEditor.vue:128
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 msgid "Certificate Status"
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
 msgid_plural "Certificates Status"
@@ -597,7 +688,7 @@ msgstr "채널"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
 msgid "Chat"
-msgstr ""
+msgstr "채팅"
 
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -615,40 +706,44 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 "/var/run/docker.sock:/var/run/docker.sock`."
 msgstr ""
 msgstr ""
+"/var/run/docker.sock이 존재하는지 확인하세요. Nginx UI 공식 Docker 이미지를 사용 중이라면 Docker "
+"소켓이 다음과 같이 마운트되었는지 확인하세요: `-v /var/run/docker.sock:/var/run/docker.sock`."
 
 
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 msgid ""
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 "prevents using Passkeys and clipboard features."
 msgstr ""
 msgstr ""
+"HTTPS가 활성화되었는지 확인하세요. localhost 외부에서 HTTP를 사용하는 것은 안전하지 않으며 Passkeys 및 클립보드 "
+"기능 사용을 방해요."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 msgid "Check if the nginx.conf includes the conf.d directory."
 msgid "Check if the nginx.conf includes the conf.d directory."
-msgstr ""
+msgstr "nginx.conf에 conf.d 디렉터리가 포함되어 있는지 확인하세요."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgid "Check if the nginx.conf includes the sites-enabled directory."
-msgstr ""
+msgstr "nginx.conf에 sites-enabled 디렉터리가 포함되어 있는지 확인하세요."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgid "Check if the nginx.conf includes the streams-enabled directory."
-msgstr ""
+msgstr "nginx.conf에 streams-enabled 디렉터리가 포함되어 있는지 확인하세요."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 "nginx configuration directory."
-msgstr ""
+msgstr "sites-available 및 sites-enabled 디렉터리가 nginx 구성 디렉터리 아래에 있는지 확인합니다."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 "the nginx configuration directory."
-msgstr ""
+msgstr "streams-available 및 streams-enabled 디렉터리가 nginx 구성 디렉터리 아래에 있는지 확인합니다."
 
 
 #: src/constants/errors/crypto.ts:3
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "암호문이 너무 짧습니다"
 
 
 #: src/language/constants.ts:13
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
 msgid "Cleaning environment variables"
@@ -668,43 +763,43 @@ msgstr "성공적으로 제거됨"
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
 msgid "Click or drag backup file to this area to upload"
-msgstr ""
+msgstr "이 영역으로 백업 파일을 클릭하거나 드래그하여 업로드하십시오."
 
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
 msgid "Click to copy"
-msgstr ""
+msgstr "복사하려면 클릭하십시오"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "클라이언트 신체 버퍼 크기"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "클라이언트 헤더 버퍼 크기"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "클라이언트 최대 본문 크기"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 msgid "Client request body buffer size"
 msgid "Client request body buffer size"
-msgstr ""
+msgstr "클라이언트 요청 본문 버퍼 크기"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 msgid "Client request header buffer size"
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "클라이언트 요청 헤더 버퍼 크기"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
 msgid "Close"
-msgstr ""
+msgstr "닫기"
 
 
 #: src/constants/errors/llm.ts:2
 #: src/constants/errors/llm.ts:2
 msgid "Code completion is not enabled"
 msgid "Code completion is not enabled"
-msgstr ""
+msgstr "코드 완성이 활성화되지 않았습니다"
 
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
 msgid "Code Completion Model"
-msgstr ""
+msgstr "코드 완성 모델"
 
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
 msgid "Command"
@@ -712,7 +807,7 @@ msgstr "명령어"
 
 
 #: src/constants/errors/docker.ts:6
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr ""
+msgstr "명령이 예상치 못한 종료 코드로 종료되었습니다: {0}, 오류: {1}"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
@@ -723,7 +818,7 @@ msgstr "댓글"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
 msgid "Compare"
-msgstr ""
+msgstr "비교하다"
 
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
 #, fuzzy
@@ -732,15 +827,15 @@ msgstr "구성들"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
 msgid "Compare Selected"
-msgstr ""
+msgstr "선택된 비교"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
 msgid "Compare with Current"
-msgstr ""
+msgstr "현재와 ​​비교하십시오"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 msgid "Compression level, 1 is lowest, 9 is highest"
 msgid "Compression level, 1 is lowest, 9 is highest"
-msgstr ""
+msgstr "압축 수준, 1은 가장 낮고 9는 가장 높습니다"
 
 
 #: src/constants/errors/backup.ts:14
 #: src/constants/errors/backup.ts:14
 #, fuzzy
 #, fuzzy
@@ -784,7 +879,7 @@ msgstr "연결됨"
 
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "연결 오류, 다시 연결 시도 중..."
 
 
 #: src/views/terminal/Terminal.vue:142
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
 msgid "Connection lost, please refresh the page."
@@ -792,11 +887,11 @@ msgstr "연결이 끊어졌습니다. 페이지를 새로 고침하세요."
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
 msgid "Connection timeout period"
-msgstr ""
+msgstr "연결 시간 초과 기간"
 
 
 #: src/constants/errors/docker.ts:7
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
 msgid "Container status unknown"
-msgstr ""
+msgstr "컨테이너 상태를 알 수 없음"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -808,20 +903,20 @@ msgstr "내용"
 #: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
 #: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 msgid "Copied"
 msgid "Copied"
-msgstr ""
+msgstr "복사됨"
 
 
 #: src/views/system/Backup/BackupCreator.vue:128
 #: src/views/system/Backup/BackupCreator.vue:128
 msgid "Copied!"
 msgid "Copied!"
-msgstr ""
+msgstr "복사 완료!"
 
 
 #: src/components/SensitiveString/SensitiveString.vue:37
 #: src/components/SensitiveString/SensitiveString.vue:37
 #: src/views/system/Backup/BackupCreator.vue:128
 #: src/views/system/Backup/BackupCreator.vue:128
 msgid "Copy"
 msgid "Copy"
-msgstr ""
+msgstr "복사"
 
 
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 msgid "Copy Codes"
 msgid "Copy Codes"
-msgstr ""
+msgstr "코드 복사"
 
 
 #: src/views/system/Upgrade.vue:146
 #: src/views/system/Upgrade.vue:146
 msgid "Core Upgrade"
 msgid "Core Upgrade"
@@ -893,7 +988,7 @@ msgstr "클라이언트 생성은 CA 서버와의 통신을 용이하게 합니
 msgid "Credential"
 msgid "Credential"
 msgstr "인증 정보"
 msgstr "인증 정보"
 
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgid "Credentials"
 msgstr "인증 정보들"
 msgstr "인증 정보들"
 
 
@@ -1192,7 +1287,7 @@ msgid "DNS Credentials"
 msgstr "DNS 인증 정보"
 msgstr "DNS 인증 정보"
 
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgid "DNS Provider"
 msgstr "DNS 제공자"
 msgstr "DNS 제공자"
 
 
@@ -1242,6 +1337,10 @@ msgstr ""
 msgid "Docker Socket"
 msgid "Docker Socket"
 msgstr ""
 msgstr ""
 
 
+#: src/constants/errors/self_check.ts:15
+msgid "Docker socket not exist"
+msgstr ""
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #, fuzzy
 #, fuzzy
@@ -1254,7 +1353,7 @@ msgstr[1] "API 문서"
 msgid "Domain"
 msgid "Domain"
 msgstr "도메인"
 msgstr "도메인"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:112
+#: src/views/certificate/CertificateEditor.vue:112
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr "도메인 목록이 비어 있습니다. %{config}에 대한 자동 인증서를 다시 열어보세요"
 msgstr "도메인 목록이 비어 있습니다. %{config}에 대한 자동 인증서를 다시 열어보세요"
 
 
@@ -1520,7 +1619,7 @@ msgstr ""
 msgid "External Notify"
 msgid "External Notify"
 msgstr ""
 msgstr ""
 
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 #, fuzzy
 #, fuzzy
 msgid "Fail to obtain certificate"
 msgid "Fail to obtain certificate"
 msgstr "인증서 획득 실패"
 msgstr "인증서 획득 실패"
@@ -1674,6 +1773,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgid "Failed to delete certificate"
 msgstr "인증서 획득 실패"
 msgstr "인증서 획득 실패"
 
 
+#: src/language/generate.ts:9
+#, fuzzy
+msgid "Failed to delete certificate from database: %{error}"
+msgstr "인증서 획득 실패"
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
 #: src/views/stream/StreamList.vue:102
@@ -1837,6 +1941,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgid "Failed to revoke certificate"
 msgstr "인증서 획득 실패"
 msgstr "인증서 획득 실패"
 
 
+#: src/language/generate.ts:17
+#, fuzzy
+msgid "Failed to revoke certificate: %{error}"
+msgstr "인증서 획득 실패"
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #, fuzzy
 #, fuzzy
 msgid "Failed to save Nginx performance settings"
 msgid "Failed to save Nginx performance settings"
@@ -1876,7 +1985,7 @@ msgstr "파일을 찾을 수 없음"
 msgid "Filename is empty"
 msgid "Filename is empty"
 msgstr ""
 msgstr ""
 
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgid "Filter"
 msgstr "필터"
 msgstr "필터"
 
 
@@ -2061,7 +2170,7 @@ msgid "Import"
 msgstr "가져오기"
 msgstr "가져오기"
 
 
 #: src/routes/modules/certificates.ts:46
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 #, fuzzy
 #, fuzzy
 msgid "Import Certificate"
 msgid "Import Certificate"
 msgstr "인증서 상태"
 msgstr "인증서 상태"
@@ -2295,8 +2404,8 @@ msgstr "Leave blank for no change"
 msgid "Leave blank if you don't need this."
 msgid "Leave blank if you don't need this."
 msgstr "Leave blank for no change"
 msgstr "Leave blank for no change"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:223
-#: src/views/certificate/components/CertificateEditor.vue:237
+#: src/views/certificate/CertificateEditor.vue:223
+#: src/views/certificate/CertificateEditor.vue:237
 #, fuzzy
 #, fuzzy
 msgid "Leave blank will not change anything"
 msgid "Leave blank will not change anything"
 msgstr "변경사항이 없으면 비워두세요"
 msgstr "변경사항이 없으면 비워두세요"
@@ -2374,11 +2483,15 @@ msgstr "위치"
 msgid "Locations"
 msgid "Locations"
 msgstr "위치들"
 msgstr "위치들"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 #, fuzzy
 #, fuzzy
 msgid "Log"
 msgid "Log"
 msgstr "로그인"
 msgstr "로그인"
 
 
+#: src/language/generate.ts:23
+msgid "Log file %{log_path} is not a regular file. "
+msgstr ""
+
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 msgid "Log List"
 msgid "Log List"
 msgstr ""
 msgstr ""
@@ -2583,7 +2696,7 @@ msgid "Modify"
 msgstr "설정 수정"
 msgstr "설정 수정"
 
 
 #: src/routes/modules/certificates.ts:36
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 #, fuzzy
 #, fuzzy
 msgid "Modify Certificate"
 msgid "Modify Certificate"
 msgstr "인증서 상태"
 msgstr "인증서 상태"
@@ -2604,8 +2717,8 @@ msgstr "단일 지시문"
 
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:10
 #: src/views/certificate/CertificateList/certColumns.tsx:10
-#: src/views/certificate/components/CertificateEditor.vue:162
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2770,7 +2883,7 @@ msgstr ""
 msgid "Nginx is running"
 msgid "Nginx is running"
 msgstr ""
 msgstr ""
 
 
-#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:143
+#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:144
 msgid "Nginx Log"
 msgid "Nginx Log"
 msgstr "Nginx 로그"
 msgstr "Nginx 로그"
 
 
@@ -3801,7 +3914,7 @@ msgstr "실행 중"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
-#: src/views/certificate/components/CertificateEditor.vue:266
+#: src/views/certificate/CertificateEditor.vue:266
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
@@ -3866,7 +3979,7 @@ msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #: src/views/preference/store/index.ts:118
 #, fuzzy
 #, fuzzy
 msgid "Save successfully"
 msgid "Save successfully"
@@ -3882,7 +3995,7 @@ msgstr "성공적으로 저장됨"
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgid "SDK"
 msgstr ""
 msgstr ""
 
 
@@ -4061,7 +4174,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 #, fuzzy
 #, fuzzy
 msgid "SSL Certificate Content"
 msgid "SSL Certificate Content"
 msgstr "인증서 상태"
 msgstr "인증서 상태"
@@ -4075,16 +4188,16 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgid "SSL certificate file not found"
 msgstr "SSL 인증서키 콘텐츠"
 msgstr "SSL 인증서키 콘텐츠"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgid "SSL Certificate Key Content"
 msgstr "SSL 인증서키 콘텐츠"
 msgstr "SSL 인증서키 콘텐츠"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 #, fuzzy
 #, fuzzy
 msgid "SSL Certificate Key Path"
 msgid "SSL Certificate Key Path"
 msgstr "SSL 인증서 키 경로"
 msgstr "SSL 인증서 키 경로"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 #: src/views/preference/tabs/ServerSettings.vue:37
 #, fuzzy
 #, fuzzy
 msgid "SSL Certificate Path"
 msgid "SSL Certificate Path"
@@ -4266,7 +4379,7 @@ msgstr ""
 msgid "Sync strategy"
 msgid "Sync strategy"
 msgstr "인증서 갱신"
 msgstr "인증서 갱신"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgid "Sync to"
 msgstr ""
 msgstr ""
 
 
@@ -4340,11 +4453,11 @@ msgid ""
 "dashes, colons, and dots."
 "dashes, colons, and dots."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgid "The input is not a SSL Certificate"
 msgstr "입력이 SSL 인증서가 아닙니다"
 msgstr "입력이 SSL 인증서가 아닙니다"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 #, fuzzy
 #, fuzzy
 msgid "The input is not a SSL Certificate Key"
 msgid "The input is not a SSL Certificate Key"
 msgstr "Certificate Status"
 msgstr "Certificate Status"
@@ -4377,12 +4490,12 @@ msgstr ""
 msgid "The parameter of server_name is required"
 msgid "The parameter of server_name is required"
 msgstr "server_name 매개변수가 필요합니다"
 msgstr "server_name 매개변수가 필요합니다"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 #, fuzzy
 #, fuzzy
 msgid "The path exists, but the file is not a certificate"
 msgid "The path exists, but the file is not a certificate"
 msgstr "Certificate Status"
 msgstr "Certificate Status"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:196
+#: src/views/certificate/CertificateEditor.vue:196
 msgid "The path exists, but the file is not a private key"
 msgid "The path exists, but the file is not a private key"
 msgstr "경로는 존재하지만 파일은 개인 키가 아닙니다"
 msgstr "경로는 존재하지만 파일은 개인 키가 아닙니다"
 
 
@@ -4439,17 +4552,17 @@ msgid ""
 "lose access to your account."
 "lose access to your account."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr "이 자동 인증 항목이 유효하지 않습니다. 제거해주세요."
 msgstr "이 자동 인증 항목이 유효하지 않습니다. 제거해주세요."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 msgid "This certificate is managed by Nginx UI"
 msgstr "이 인증서는 Nginx UI에서 관리됩니다"
 msgstr "이 인증서는 Nginx UI에서 관리됩니다"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:165
-#: src/views/certificate/components/CertificateEditor.vue:179
-#: src/views/certificate/components/CertificateEditor.vue:194
+#: src/views/certificate/CertificateEditor.vue:165
+#: src/views/certificate/CertificateEditor.vue:179
+#: src/views/certificate/CertificateEditor.vue:194
 msgid "This field is required"
 msgid "This field is required"
 msgstr "이 필드는 필수입니다"
 msgstr "이 필드는 필수입니다"
 
 

+ 143 - 35
app/src/language/messages.pot

@@ -2,6 +2,90 @@ msgid ""
 msgstr ""
 msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 
 
+#: src/language/generate.ts:19
+msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
+msgstr ""
+
+#: src/language/generate.ts:13
+msgid "[Nginx UI] Backing up current certificate for later revocation"
+msgstr ""
+
+#: src/language/generate.ts:28
+msgid "[Nginx UI] Certificate renewed successfully"
+msgstr ""
+
+#: src/language/generate.ts:8
+msgid "[Nginx UI] Certificate successfully revoked"
+msgstr ""
+
+#: src/language/generate.ts:29
+msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgstr ""
+
+#: src/language/generate.ts:24
+msgid "[Nginx UI] Creating client facilitates communication with the CA server"
+msgstr ""
+
+#: src/language/generate.ts:12
+msgid "[Nginx UI] Environment variables cleaned"
+msgstr ""
+
+#: src/language/generate.ts:21
+msgid "[Nginx UI] Finished"
+msgstr ""
+
+#: src/language/generate.ts:4
+msgid "[Nginx UI] Issued certificate successfully"
+msgstr ""
+
+#: src/language/generate.ts:14
+msgid "[Nginx UI] Obtaining certificate"
+msgstr ""
+
+#: src/language/generate.ts:22
+msgid "[Nginx UI] Preparing for certificate revocation"
+msgstr ""
+
+#: src/language/generate.ts:18
+msgid "[Nginx UI] Preparing lego configurations"
+msgstr ""
+
+#: src/language/generate.ts:25
+msgid "[Nginx UI] Reloading nginx"
+msgstr ""
+
+#: src/language/generate.ts:16
+msgid "[Nginx UI] Revocation completed"
+msgstr ""
+
+#: src/language/generate.ts:7
+msgid "[Nginx UI] Revoking certificate"
+msgstr ""
+
+#: src/language/generate.ts:26
+msgid "[Nginx UI] Revoking old certificate"
+msgstr ""
+
+#: src/language/generate.ts:20
+msgid "[Nginx UI] Setting DNS01 challenge provider"
+msgstr ""
+
+#: src/language/generate.ts:6
+msgid "[Nginx UI] Setting environment variables"
+msgstr ""
+
+#: src/language/generate.ts:11
+msgid "[Nginx UI] Setting HTTP01 challenge provider"
+msgstr ""
+
+#: src/language/generate.ts:15
+msgid "[Nginx UI] Writing certificate private key to disk"
+msgstr ""
+
+#: src/language/generate.ts:27
+msgid "[Nginx UI] Writing certificate to disk"
+msgstr ""
+
 #: src/views/user/userColumns.tsx:32
 #: src/views/user/userColumns.tsx:32
 msgid "2FA"
 msgid "2FA"
 msgstr ""
 msgstr ""
@@ -97,7 +181,7 @@ msgstr ""
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgid "Additional"
 msgstr ""
 msgstr ""
 
 
@@ -124,7 +208,7 @@ msgstr ""
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgid "API Document"
 msgstr ""
 msgstr ""
 
 
@@ -264,7 +348,7 @@ msgstr ""
 msgid "auto = CPU cores"
 msgid "auto = CPU cores"
 msgstr ""
 msgstr ""
 
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgid "Auto Refresh"
 msgstr ""
 msgstr ""
 
 
@@ -284,11 +368,11 @@ msgstr ""
 msgid "Automatically indexed from site and stream configurations."
 msgid "Automatically indexed from site and stream configurations."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:259
+#: src/views/certificate/CertificateEditor.vue:259
 #: src/views/config/ConfigEditor.vue:266
 #: src/views/config/ConfigEditor.vue:266
 #: src/views/config/ConfigList.vue:112
 #: src/views/config/ConfigList.vue:112
 #: src/views/config/ConfigList.vue:195
 #: src/views/config/ConfigList.vue:195
-#: src/views/nginx_log/NginxLog.vue:173
+#: src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/stream/components/StreamEditor.vue:106
 #: src/views/stream/components/StreamEditor.vue:106
 msgid "Back"
 msgid "Back"
@@ -501,6 +585,10 @@ msgstr ""
 msgid "Certificate Expiring Soon"
 msgid "Certificate Expiring Soon"
 msgstr ""
 msgstr ""
 
 
+#: src/language/generate.ts:5
+msgid "Certificate not found: %{error}"
+msgstr ""
+
 #: src/constants/errors/cert.ts:5
 #: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgid "Certificate parse error"
 msgstr ""
 msgstr ""
@@ -522,7 +610,11 @@ msgstr ""
 msgid "Certificate renewed successfully"
 msgid "Certificate renewed successfully"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:128
+#: src/language/generate.ts:10
+msgid "Certificate revoked successfully"
+msgstr ""
+
+#: src/views/certificate/CertificateEditor.vue:128
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 msgid "Certificate Status"
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
 msgid_plural "Certificates Status"
@@ -841,7 +933,7 @@ msgstr ""
 msgid "Credential"
 msgid "Credential"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgid "Credentials"
 msgstr ""
 msgstr ""
 
 
@@ -1120,7 +1212,7 @@ msgid "DNS Credentials"
 msgstr ""
 msgstr ""
 
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgid "DNS Provider"
 msgstr ""
 msgstr ""
 
 
@@ -1169,6 +1261,10 @@ msgstr ""
 msgid "Docker Socket"
 msgid "Docker Socket"
 msgstr ""
 msgstr ""
 
 
+#: src/constants/errors/self_check.ts:15
+msgid "Docker socket not exist"
+msgstr ""
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 msgid "Document"
 msgid "Document"
@@ -1180,7 +1276,7 @@ msgstr[1] ""
 msgid "Domain"
 msgid "Domain"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:112
+#: src/views/certificate/CertificateEditor.vue:112
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr ""
 msgstr ""
 
 
@@ -1428,7 +1524,7 @@ msgstr ""
 msgid "External Notify"
 msgid "External Notify"
 msgstr ""
 msgstr ""
 
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 msgid "Fail to obtain certificate"
 msgid "Fail to obtain certificate"
 msgstr ""
 msgstr ""
 
 
@@ -1560,6 +1656,10 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgid "Failed to delete certificate"
 msgstr ""
 msgstr ""
 
 
+#: src/language/generate.ts:9
+msgid "Failed to delete certificate from database: %{error}"
+msgstr ""
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
 #: src/views/stream/StreamList.vue:102
@@ -1700,6 +1800,10 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgid "Failed to revoke certificate"
 msgstr ""
 msgstr ""
 
 
+#: src/language/generate.ts:17
+msgid "Failed to revoke certificate: %{error}"
+msgstr ""
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 msgid "Failed to save Nginx performance settings"
 msgid "Failed to save Nginx performance settings"
 msgstr ""
 msgstr ""
@@ -1736,7 +1840,7 @@ msgstr ""
 msgid "Filename is empty"
 msgid "Filename is empty"
 msgstr ""
 msgstr ""
 
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgid "Filter"
 msgstr ""
 msgstr ""
 
 
@@ -1903,7 +2007,7 @@ msgid "Import"
 msgstr ""
 msgstr ""
 
 
 #: src/routes/modules/certificates.ts:46
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgid "Import Certificate"
 msgstr ""
 msgstr ""
 
 
@@ -2117,8 +2221,8 @@ msgstr ""
 msgid "Leave blank if you don't need this."
 msgid "Leave blank if you don't need this."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:223
-#: src/views/certificate/components/CertificateEditor.vue:237
+#: src/views/certificate/CertificateEditor.vue:223
+#: src/views/certificate/CertificateEditor.vue:237
 msgid "Leave blank will not change anything"
 msgid "Leave blank will not change anything"
 msgstr ""
 msgstr ""
 
 
@@ -2189,10 +2293,14 @@ msgstr ""
 msgid "Locations"
 msgid "Locations"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 msgid "Log"
 msgstr ""
 msgstr ""
 
 
+#: src/language/generate.ts:23
+msgid "Log file %{log_path} is not a regular file. "
+msgstr ""
+
 #: src/routes/modules/nginx_log.ts:39
 #: src/routes/modules/nginx_log.ts:39
 #: src/views/nginx_log/NginxLogList.vue:67
 #: src/views/nginx_log/NginxLogList.vue:67
 msgid "Log List"
 msgid "Log List"
@@ -2380,7 +2488,7 @@ msgid "Modify"
 msgstr ""
 msgstr ""
 
 
 #: src/routes/modules/certificates.ts:36
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgid "Modify Certificate"
 msgstr ""
 msgstr ""
 
 
@@ -2398,8 +2506,8 @@ msgstr ""
 
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:10
 #: src/views/certificate/CertificateList/certColumns.tsx:10
-#: src/views/certificate/components/CertificateEditor.vue:162
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:7
 #: src/views/config/configColumns.tsx:7
@@ -2557,7 +2665,7 @@ msgid "Nginx is running"
 msgstr ""
 msgstr ""
 
 
 #: src/routes/modules/nginx_log.ts:9
 #: src/routes/modules/nginx_log.ts:9
-#: src/views/nginx_log/NginxLog.vue:143
+#: src/views/nginx_log/NginxLog.vue:144
 msgid "Nginx Log"
 msgid "Nginx Log"
 msgstr ""
 msgstr ""
 
 
@@ -3482,7 +3590,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
-#: src/views/certificate/components/CertificateEditor.vue:266
+#: src/views/certificate/CertificateEditor.vue:266
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
@@ -3539,7 +3647,7 @@ msgstr ""
 
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #: src/views/preference/store/index.ts:118
 msgid "Save successfully"
 msgid "Save successfully"
 msgstr ""
 msgstr ""
@@ -3555,7 +3663,7 @@ msgstr ""
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgid "SDK"
 msgstr ""
 msgstr ""
 
 
@@ -3720,7 +3828,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgid "SSL Certificate Content"
 msgstr ""
 msgstr ""
 
 
@@ -3732,15 +3840,15 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgid "SSL certificate file not found"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgid "SSL Certificate Key Content"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgid "SSL Certificate Key Path"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgid "SSL Certificate Path"
 msgstr ""
 msgstr ""
@@ -3906,7 +4014,7 @@ msgstr ""
 msgid "Sync strategy"
 msgid "Sync strategy"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgid "Sync to"
 msgstr ""
 msgstr ""
 
 
@@ -3970,11 +4078,11 @@ msgstr ""
 msgid "The ICP Number should only contain letters, unicode, numbers, hyphens, dashes, colons, and dots."
 msgid "The ICP Number should only contain letters, unicode, numbers, hyphens, dashes, colons, and dots."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgid "The input is not a SSL Certificate"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgid "The input is not a SSL Certificate Key"
 msgstr ""
 msgstr ""
 
 
@@ -3999,11 +4107,11 @@ msgstr ""
 msgid "The parameter of server_name is required"
 msgid "The parameter of server_name is required"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 msgid "The path exists, but the file is not a certificate"
 msgid "The path exists, but the file is not a certificate"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:196
+#: src/views/certificate/CertificateEditor.vue:196
 msgid "The path exists, but the file is not a private key"
 msgid "The path exists, but the file is not a private key"
 msgstr ""
 msgstr ""
 
 
@@ -4045,17 +4153,17 @@ msgstr ""
 msgid "These codes are the last resort for accessing your account in case you lose your password and second factors. If you cannot find these codes, you will lose access to your account."
 msgid "These codes are the last resort for accessing your account in case you lose your password and second factors. If you cannot find these codes, you will lose access to your account."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 msgid "This certificate is managed by Nginx UI"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:165
-#: src/views/certificate/components/CertificateEditor.vue:179
-#: src/views/certificate/components/CertificateEditor.vue:194
+#: src/views/certificate/CertificateEditor.vue:165
+#: src/views/certificate/CertificateEditor.vue:179
+#: src/views/certificate/CertificateEditor.vue:194
 msgid "This field is required"
 msgid "This field is required"
 msgstr ""
 msgstr ""
 
 

+ 196 - 73
app/src/language/pt_PT/app.po

@@ -12,6 +12,100 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
 "X-Generator: Weblate 5.6.2\n"
 "X-Generator: Weblate 5.6.2\n"
 
 
+#: src/language/generate.ts:19
+msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
+msgstr "[Nginx UI] Utilizador ACME: %{name}, Email: %{email}, Diretório CA: %{caDir}"
+
+#: src/language/generate.ts:13
+msgid "[Nginx UI] Backing up current certificate for later revocation"
+msgstr ""
+"[Nginx UI] A fazer cópia de segurança do certificado atual para posterior "
+"revogação"
+
+#: src/language/generate.ts:28
+#, fuzzy
+msgid "[Nginx UI] Certificate renewed successfully"
+msgstr "Limpo com sucesso"
+
+#: src/language/generate.ts:8
+#, fuzzy
+msgid "[Nginx UI] Certificate successfully revoked"
+msgstr "Nginx reiniciado com sucesso"
+
+#: src/language/generate.ts:29
+msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgstr ""
+"[Nginx UI] O certificado foi usado para o servidor, a recarregar o "
+"certificado TLS do servidor"
+
+#: src/language/generate.ts:24
+#, fuzzy
+msgid "[Nginx UI] Creating client facilitates communication with the CA server"
+msgstr "Criar cliente facilita comunicação com o servidor CA"
+
+#: src/language/generate.ts:12
+#, fuzzy
+msgid "[Nginx UI] Environment variables cleaned"
+msgstr "Variáveis de ambiente limpas"
+
+#: src/language/generate.ts:21
+msgid "[Nginx UI] Finished"
+msgstr "[Nginx UI] Concluído"
+
+#: src/language/generate.ts:4
+#, fuzzy
+msgid "[Nginx UI] Issued certificate successfully"
+msgstr "Certificado emitido com sucesso"
+
+#: src/language/generate.ts:14
+msgid "[Nginx UI] Obtaining certificate"
+msgstr "[Nginx UI] A obter certificado"
+
+#: src/language/generate.ts:22
+msgid "[Nginx UI] Preparing for certificate revocation"
+msgstr "[Nginx UI] Preparando para a revogação do certificado"
+
+#: src/language/generate.ts:18
+msgid "[Nginx UI] Preparing lego configurations"
+msgstr "[Nginx UI] A preparar configurações do lego"
+
+#: src/language/generate.ts:25
+msgid "[Nginx UI] Reloading nginx"
+msgstr "[Nginx UI] A recarregar o nginx"
+
+#: src/language/generate.ts:16
+msgid "[Nginx UI] Revocation completed"
+msgstr "[Nginx UI] Revogação concluída"
+
+#: src/language/generate.ts:7
+msgid "[Nginx UI] Revoking certificate"
+msgstr "[Nginx UI] Revogar certificado"
+
+#: src/language/generate.ts:26
+msgid "[Nginx UI] Revoking old certificate"
+msgstr "[Nginx UI] Revogar certificado antigo"
+
+#: src/language/generate.ts:20
+msgid "[Nginx UI] Setting DNS01 challenge provider"
+msgstr "[Nginx UI] A configurar o fornecedor de desafio DNS01"
+
+#: src/language/generate.ts:6
+#, fuzzy
+msgid "[Nginx UI] Setting environment variables"
+msgstr "Definindo variáveis de ambiente"
+
+#: src/language/generate.ts:11
+msgid "[Nginx UI] Setting HTTP01 challenge provider"
+msgstr "[Nginx UI] A configurar o fornecedor de desafio HTTP01"
+
+#: src/language/generate.ts:15
+msgid "[Nginx UI] Writing certificate private key to disk"
+msgstr "[Nginx UI] A gravar a chave privada do certificado no disco"
+
+#: src/language/generate.ts:27
+msgid "[Nginx UI] Writing certificate to disk"
+msgstr "[Nginx UI] A escrever o certificado no disco"
+
 #: src/views/user/userColumns.tsx:32
 #: src/views/user/userColumns.tsx:32
 msgid "2FA"
 msgid "2FA"
 msgstr "2FA"
 msgstr "2FA"
@@ -104,7 +198,7 @@ msgstr "Adicionar Stream"
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "Adicionado com sucesso"
 msgstr "Adicionado com sucesso"
 
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgid "Additional"
 msgstr "Adicional"
 msgstr "Adicional"
 
 
@@ -133,7 +227,7 @@ msgstr "Todos os Códigos de Recuperação Foram Utilizados"
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "Url Base da API"
 msgstr "Url Base da API"
 
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgid "API Document"
 msgstr "Documento da API"
 msgstr "Documento da API"
 
 
@@ -282,7 +376,7 @@ msgstr "Automático"
 msgid "auto = CPU cores"
 msgid "auto = CPU cores"
 msgstr "auto = núcleos da CPU"
 msgstr "auto = núcleos da CPU"
 
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgid "Auto Refresh"
 msgstr "Actualizar Automaticamente"
 msgstr "Actualizar Automaticamente"
 
 
@@ -302,9 +396,9 @@ msgstr "Reinício Automático"
 msgid "Automatically indexed from site and stream configurations."
 msgid "Automatically indexed from site and stream configurations."
 msgstr "Indexado automaticamente a partir das configurações de site e stream."
 msgstr "Indexado automaticamente a partir das configurações de site e stream."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:259
+#: src/views/certificate/CertificateEditor.vue:259
 #: src/views/config/ConfigEditor.vue:266 src/views/config/ConfigList.vue:112
 #: src/views/config/ConfigEditor.vue:266 src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195 src/views/nginx_log/NginxLog.vue:173
+#: src/views/config/ConfigList.vue:195 src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/stream/components/StreamEditor.vue:106
 #: src/views/stream/components/StreamEditor.vue:106
 msgid "Back"
 msgid "Back"
@@ -516,42 +610,40 @@ msgid "Certificate %{name} will expire in 1 day"
 msgstr "O certificado %{name} irá expirar em 1 dia"
 msgstr "O certificado %{name} irá expirar em 1 dia"
 
 
 #: src/constants/errors/cert.ts:4
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 msgid "Certificate decode error"
 msgid "Certificate decode error"
-msgstr "Erro ao Sincronizar Certificado"
+msgstr "Erro de descodificação do certificado"
 
 
 #: src/components/Notification/notifications.ts:29
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
 msgid "Certificate Expiration Notice"
-msgstr "Conteúdo do Certificado SSL"
+msgstr "Aviso de Expiração do Certificado"
 
 
 #: src/components/Notification/notifications.ts:25
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
 msgid "Certificate Expired"
-msgstr "Lista de Certificados"
+msgstr "Certificado expirado"
 
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 msgid "Certificate Expiring Soon"
 msgid "Certificate Expiring Soon"
-msgstr "Erro ao Sincronizar Certificado"
+msgstr "Certificado a expirar em breve"
 
 
-#: src/constants/errors/cert.ts:5
+#: src/language/generate.ts:5
 #, fuzzy
 #, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "Erro de descodificação do certificado"
+
+#: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgid "Certificate parse error"
-msgstr "Erro ao Sincronizar Certificado"
+msgstr "Erro de análise do certificado"
 
 
 #: src/constants/errors/cert.ts:8
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 msgid "Certificate path is empty"
 msgid "Certificate path is empty"
-msgstr "Lista de Certificados"
+msgstr "O caminho do certificado está vazio"
 
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
 #: src/views/certificate/components/RemoveCert.vue:61
-#, fuzzy
 msgid "Certificate removed successfully"
 msgid "Certificate removed successfully"
-msgstr "Removido com sucesso"
+msgstr "Certificado removido com sucesso"
 
 
 #: src/views/preference/tabs/CertSettings.vue:27
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
 msgid "Certificate Renewal Interval"
@@ -562,7 +654,12 @@ msgstr "Intervalo de Renovação do Certificado"
 msgid "Certificate renewed successfully"
 msgid "Certificate renewed successfully"
 msgstr "Limpo com sucesso"
 msgstr "Limpo com sucesso"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:128
+#: src/language/generate.ts:10
+#, fuzzy
+msgid "Certificate revoked successfully"
+msgstr "Certificado removido com sucesso"
+
+#: src/views/certificate/CertificateEditor.vue:128
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 msgid "Certificate Status"
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
 msgid_plural "Certificates Status"
@@ -605,7 +702,7 @@ msgstr "Canal"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
 msgid "Chat"
-msgstr ""
+msgstr "Chat"
 
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -623,40 +720,49 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 "/var/run/docker.sock:/var/run/docker.sock`."
 msgstr ""
 msgstr ""
+"Verifique se /var/run/docker.sock existe. Se estiver a utilizar a imagem "
+"Docker oficial do Nginx UI, certifique-se de que o socket Docker está "
+"montado da seguinte forma: `-v /var/run/docker.sock:/var/run/docker.sock`."
 
 
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 msgid ""
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 "prevents using Passkeys and clipboard features."
 msgstr ""
 msgstr ""
+"Verifique se o HTTPS está ativado. Usar HTTP fora do localhost é inseguro e "
+"impede a utilização de Passkeys e funcionalidades da área de transferência."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 msgid "Check if the nginx.conf includes the conf.d directory."
 msgid "Check if the nginx.conf includes the conf.d directory."
-msgstr ""
+msgstr "Verifique se o nginx.conf inclui o diretório conf.d."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgid "Check if the nginx.conf includes the sites-enabled directory."
-msgstr ""
+msgstr "Verifique se o nginx.conf inclui o diretório sites-enabled."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgid "Check if the nginx.conf includes the streams-enabled directory."
-msgstr ""
+msgstr "Verifique se o nginx.conf inclui o diretório streams-enabled."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 "nginx configuration directory."
 msgstr ""
 msgstr ""
+"Verifique se os diretórios sites-available e sites-enabled estão no "
+"diretório de configuração do nginx."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 "the nginx configuration directory."
 msgstr ""
 msgstr ""
+"Verifique se os diretórios streams-available e streams-enabled estão no "
+"diretório de configuração do nginx."
 
 
 #: src/constants/errors/crypto.ts:3
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "O texto cifrado é demasiado curto"
 
 
 #: src/language/constants.ts:13
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
 msgid "Cleaning environment variables"
@@ -676,44 +782,43 @@ msgstr "Limpo com sucesso"
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
 msgid "Click or drag backup file to this area to upload"
-msgstr ""
+msgstr "Clique ou arraste o arquivo de backup para esta área para fazer o upload"
 
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
 msgid "Click to copy"
-msgstr ""
+msgstr "Clique para copiar"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "Tamanho do buffer do corpo do cliente"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "Tamanho do buffer de cabeçalho do cliente"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "Tamanho máximo do corpo do cliente"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 msgid "Client request body buffer size"
 msgid "Client request body buffer size"
-msgstr ""
+msgstr "Tamanho do buffer do corpo da solicitação do cliente"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 msgid "Client request header buffer size"
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "Tamanho do buffer de cabeçalho de pedido do cliente"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
 msgid "Close"
-msgstr ""
+msgstr "Fechar"
 
 
 #: src/constants/errors/llm.ts:2
 #: src/constants/errors/llm.ts:2
-#, fuzzy
 msgid "Code completion is not enabled"
 msgid "Code completion is not enabled"
-msgstr "2FA não habilitado para conta actual."
+msgstr "A conclusão de código não está ativada"
 
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
 msgid "Code Completion Model"
-msgstr ""
+msgstr "Modelo de conclusão de código"
 
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
 msgid "Command"
@@ -721,7 +826,7 @@ msgstr "Comando"
 
 
 #: src/constants/errors/docker.ts:6
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr ""
+msgstr "O comando terminou com um código de saída inesperado: {0}, erro: {1}"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
@@ -732,7 +837,7 @@ msgstr "Comentários"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
 msgid "Compare"
-msgstr ""
+msgstr "Comparar"
 
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
 #, fuzzy
@@ -741,15 +846,15 @@ msgstr "Configurações"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
 msgid "Compare Selected"
-msgstr ""
+msgstr "Compare selecionado"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
 msgid "Compare with Current"
-msgstr ""
+msgstr "Compare com a corrente"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 msgid "Compression level, 1 is lowest, 9 is highest"
 msgid "Compression level, 1 is lowest, 9 is highest"
-msgstr ""
+msgstr "O nível de compressão, 1 é mais baixo, 9 é mais alto"
 
 
 #: src/constants/errors/backup.ts:14
 #: src/constants/errors/backup.ts:14
 #, fuzzy
 #, fuzzy
@@ -793,7 +898,7 @@ msgstr "Conectado"
 
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "Erro de conexão, tentando reconectar..."
 
 
 #: src/views/terminal/Terminal.vue:142
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
 msgid "Connection lost, please refresh the page."
@@ -801,11 +906,11 @@ msgstr "Ligação perdida, por favor actualize a página."
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
 msgid "Connection timeout period"
-msgstr ""
+msgstr "Período de tempo limite de conexão"
 
 
 #: src/constants/errors/docker.ts:7
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
 msgid "Container status unknown"
-msgstr ""
+msgstr "Estado do contentor desconhecido"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -901,7 +1006,7 @@ msgstr "Criar cliente facilita comunicação com o servidor CA"
 msgid "Credential"
 msgid "Credential"
 msgstr "Credencial"
 msgstr "Credencial"
 
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgid "Credentials"
 msgstr "Credenciais"
 msgstr "Credenciais"
 
 
@@ -1203,7 +1308,7 @@ msgid "DNS Credentials"
 msgstr "Credenciais DNS"
 msgstr "Credenciais DNS"
 
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgid "DNS Provider"
 msgstr "Provedor DNS"
 msgstr "Provedor DNS"
 
 
@@ -1253,6 +1358,10 @@ msgstr ""
 msgid "Docker Socket"
 msgid "Docker Socket"
 msgstr ""
 msgstr ""
 
 
+#: src/constants/errors/self_check.ts:15
+msgid "Docker socket not exist"
+msgstr ""
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #, fuzzy
 #, fuzzy
@@ -1265,7 +1374,7 @@ msgstr[1] "Documento da API"
 msgid "Domain"
 msgid "Domain"
 msgstr "Domínio"
 msgstr "Domínio"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:112
+#: src/views/certificate/CertificateEditor.vue:112
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr "A lista de domínios está vazia, tente reabrir o Auto Cert para %{config}"
 msgstr "A lista de domínios está vazia, tente reabrir o Auto Cert para %{config}"
 
 
@@ -1526,7 +1635,7 @@ msgstr ""
 msgid "External Notify"
 msgid "External Notify"
 msgstr ""
 msgstr ""
 
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 msgid "Fail to obtain certificate"
 msgid "Fail to obtain certificate"
 msgstr "Obtenção de Certificado Falhou"
 msgstr "Obtenção de Certificado Falhou"
 
 
@@ -1667,6 +1776,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgid "Failed to delete certificate"
 msgstr "Obtenção de Certificado Falhou"
 msgstr "Obtenção de Certificado Falhou"
 
 
+#: src/language/generate.ts:9
+#, fuzzy
+msgid "Failed to delete certificate from database: %{error}"
+msgstr "Obtenção de Certificado Falhou"
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
 #: src/views/stream/StreamList.vue:102
@@ -1827,6 +1941,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgid "Failed to revoke certificate"
 msgstr "Obtenção de Certificado Falhou"
 msgstr "Obtenção de Certificado Falhou"
 
 
+#: src/language/generate.ts:17
+#, fuzzy
+msgid "Failed to revoke certificate: %{error}"
+msgstr "Obtenção de Certificado Falhou"
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 msgid "Failed to save Nginx performance settings"
 msgid "Failed to save Nginx performance settings"
 msgstr ""
 msgstr ""
@@ -1864,7 +1983,7 @@ msgstr "Ficheiro Não Encontrado"
 msgid "Filename is empty"
 msgid "Filename is empty"
 msgstr ""
 msgstr ""
 
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgid "Filter"
 msgstr "Filtro"
 msgstr "Filtro"
 
 
@@ -2057,7 +2176,7 @@ msgid "Import"
 msgstr "Importar"
 msgstr "Importar"
 
 
 #: src/routes/modules/certificates.ts:46
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgid "Import Certificate"
 msgstr "Importar Certificados"
 msgstr "Importar Certificados"
 
 
@@ -2285,8 +2404,8 @@ msgstr "Deixe em branco para não alterar"
 msgid "Leave blank if you don't need this."
 msgid "Leave blank if you don't need this."
 msgstr "Deixar em branco não vai mudar nada"
 msgstr "Deixar em branco não vai mudar nada"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:223
-#: src/views/certificate/components/CertificateEditor.vue:237
+#: src/views/certificate/CertificateEditor.vue:223
+#: src/views/certificate/CertificateEditor.vue:237
 msgid "Leave blank will not change anything"
 msgid "Leave blank will not change anything"
 msgstr "Deixar em branco não vai mudar nada"
 msgstr "Deixar em branco não vai mudar nada"
 
 
@@ -2359,10 +2478,14 @@ msgstr "Localização"
 msgid "Locations"
 msgid "Locations"
 msgstr "Localizações"
 msgstr "Localizações"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 msgid "Log"
 msgstr "Log"
 msgstr "Log"
 
 
+#: src/language/generate.ts:23
+msgid "Log file %{log_path} is not a regular file. "
+msgstr ""
+
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #, fuzzy
 #, fuzzy
 msgid "Log List"
 msgid "Log List"
@@ -2564,7 +2687,7 @@ msgid "Modify"
 msgstr "Modificar"
 msgstr "Modificar"
 
 
 #: src/routes/modules/certificates.ts:36
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgid "Modify Certificate"
 msgstr "Modificar Certificado"
 msgstr "Modificar Certificado"
 
 
@@ -2582,8 +2705,8 @@ msgstr "Diretiva Multilinha"
 
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:10
 #: src/views/certificate/CertificateList/certColumns.tsx:10
-#: src/views/certificate/components/CertificateEditor.vue:162
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2742,7 +2865,7 @@ msgstr ""
 msgid "Nginx is running"
 msgid "Nginx is running"
 msgstr ""
 msgstr ""
 
 
-#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:143
+#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:144
 msgid "Nginx Log"
 msgid "Nginx Log"
 msgstr "Logs do Nginx"
 msgstr "Logs do Nginx"
 
 
@@ -3762,7 +3885,7 @@ msgstr "Executando"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
-#: src/views/certificate/components/CertificateEditor.vue:266
+#: src/views/certificate/CertificateEditor.vue:266
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
@@ -3827,7 +3950,7 @@ msgstr "%{conf_name} duplicado para %{node_name} com sucesso"
 
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #: src/views/preference/store/index.ts:118
 msgid "Save successfully"
 msgid "Save successfully"
 msgstr "Salvo com sucesso"
 msgstr "Salvo com sucesso"
@@ -3844,7 +3967,7 @@ msgstr ""
 "Digitalize o código QR com o seu telemóvel para adicionar a conta à "
 "Digitalize o código QR com o seu telemóvel para adicionar a conta à "
 "aplicação."
 "aplicação."
 
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgid "SDK"
 msgstr "SDK"
 msgstr "SDK"
 
 
@@ -4021,7 +4144,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgid "SSL Certificate Content"
 msgstr "Conteúdo do Certificado SSL"
 msgstr "Conteúdo do Certificado SSL"
 
 
@@ -4034,15 +4157,15 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgid "SSL certificate file not found"
 msgstr "Conteúdo da Chave do Certificado SSL"
 msgstr "Conteúdo da Chave do Certificado SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgid "SSL Certificate Key Content"
 msgstr "Conteúdo da Chave do Certificado SSL"
 msgstr "Conteúdo da Chave do Certificado SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgid "SSL Certificate Key Path"
 msgstr "Caminho para a Chave do Certificado SSL"
 msgstr "Caminho para a Chave do Certificado SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgid "SSL Certificate Path"
 msgstr "Caminho para o Certificado SSL"
 msgstr "Caminho para o Certificado SSL"
@@ -4218,7 +4341,7 @@ msgstr "Sincronizar para"
 msgid "Sync strategy"
 msgid "Sync strategy"
 msgstr "Sincronizar Certificado"
 msgstr "Sincronizar Certificado"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgid "Sync to"
 msgstr "Sincronizar para"
 msgstr "Sincronizar para"
 
 
@@ -4297,11 +4420,11 @@ msgstr ""
 "O nome do modelo deve conter apenas letras, unicode, números, hífens, "
 "O nome do modelo deve conter apenas letras, unicode, números, hífens, "
 "travessões e pontos."
 "travessões e pontos."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgid "The input is not a SSL Certificate"
 msgstr "A valor introduzido não é um certificado SSL"
 msgstr "A valor introduzido não é um certificado SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgid "The input is not a SSL Certificate Key"
 msgstr "O valor introduzido não é uma Chave de Certificado SSL"
 msgstr "O valor introduzido não é uma Chave de Certificado SSL"
 
 
@@ -4339,11 +4462,11 @@ msgstr ""
 msgid "The parameter of server_name is required"
 msgid "The parameter of server_name is required"
 msgstr "Parâmetro server_name é obrigatório"
 msgstr "Parâmetro server_name é obrigatório"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 msgid "The path exists, but the file is not a certificate"
 msgid "The path exists, but the file is not a certificate"
 msgstr "O caminho existe, mas o ficheiro não é um certificado"
 msgstr "O caminho existe, mas o ficheiro não é um certificado"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:196
+#: src/views/certificate/CertificateEditor.vue:196
 msgid "The path exists, but the file is not a private key"
 msgid "The path exists, but the file is not a private key"
 msgstr "O caminho existe, mas o ficheiro não é uma chave privada"
 msgstr "O caminho existe, mas o ficheiro não é uma chave privada"
 
 
@@ -4403,17 +4526,17 @@ msgid ""
 "lose access to your account."
 "lose access to your account."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr "Este item Auto Cert é inválido, por favor remova-o."
 msgstr "Este item Auto Cert é inválido, por favor remova-o."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 msgid "This certificate is managed by Nginx UI"
 msgstr "Este certificado é gerido pelo Nginx UI"
 msgstr "Este certificado é gerido pelo Nginx UI"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:165
-#: src/views/certificate/components/CertificateEditor.vue:179
-#: src/views/certificate/components/CertificateEditor.vue:194
+#: src/views/certificate/CertificateEditor.vue:165
+#: src/views/certificate/CertificateEditor.vue:179
+#: src/views/certificate/CertificateEditor.vue:194
 msgid "This field is required"
 msgid "This field is required"
 msgstr "Este campo é mantatório"
 msgstr "Este campo é mantatório"
 
 

+ 197 - 72
app/src/language/ru_RU/app.po

@@ -16,6 +16,100 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Poedit 3.5\n"
 "X-Generator: Poedit 3.5\n"
 
 
+#: src/language/generate.ts:19
+msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
+msgstr "[Nginx UI] Пользователь ACME: %{name}, Email: %{email}, Каталог CA: %{caDir}"
+
+#: src/language/generate.ts:13
+msgid "[Nginx UI] Backing up current certificate for later revocation"
+msgstr ""
+"[Nginx UI] Резервное копирование текущего сертификата для последующего "
+"отзыва"
+
+#: src/language/generate.ts:28
+#, fuzzy
+msgid "[Nginx UI] Certificate renewed successfully"
+msgstr "Сертификат успешно продлен"
+
+#: src/language/generate.ts:8
+#, fuzzy
+msgid "[Nginx UI] Certificate successfully revoked"
+msgstr "Nginx успешно перезапущен"
+
+#: src/language/generate.ts:29
+msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgstr ""
+"[Nginx UI] Сертификат использовался для сервера, перезагрузка "
+"TLS-сертификата сервера"
+
+#: src/language/generate.ts:24
+#, fuzzy
+msgid "[Nginx UI] Creating client facilitates communication with the CA server"
+msgstr "Создание клиента облегчает связь с сервером CA"
+
+#: src/language/generate.ts:12
+#, fuzzy
+msgid "[Nginx UI] Environment variables cleaned"
+msgstr "Переменные окружения очищены"
+
+#: src/language/generate.ts:21
+msgid "[Nginx UI] Finished"
+msgstr "[Nginx UI] Завершено"
+
+#: src/language/generate.ts:4
+#, fuzzy
+msgid "[Nginx UI] Issued certificate successfully"
+msgstr "Сертификат успешно выдан"
+
+#: src/language/generate.ts:14
+msgid "[Nginx UI] Obtaining certificate"
+msgstr "[Nginx UI] Получение сертификата"
+
+#: src/language/generate.ts:22
+msgid "[Nginx UI] Preparing for certificate revocation"
+msgstr "[Nginx UI] Подготовка к отзыву сертификата"
+
+#: src/language/generate.ts:18
+msgid "[Nginx UI] Preparing lego configurations"
+msgstr "[Nginx UI] Подготовка конфигураций lego"
+
+#: src/language/generate.ts:25
+msgid "[Nginx UI] Reloading nginx"
+msgstr "[Nginx UI] Перезагрузка nginx"
+
+#: src/language/generate.ts:16
+msgid "[Nginx UI] Revocation completed"
+msgstr "[Nginx UI] Отзыв завершен"
+
+#: src/language/generate.ts:7
+msgid "[Nginx UI] Revoking certificate"
+msgstr "[Nginx UI] Отзыв сертификата"
+
+#: src/language/generate.ts:26
+msgid "[Nginx UI] Revoking old certificate"
+msgstr "[Nginx UI] Отзыв старого сертификата"
+
+#: src/language/generate.ts:20
+msgid "[Nginx UI] Setting DNS01 challenge provider"
+msgstr "[Nginx UI] Настройка провайдера проверки DNS01"
+
+#: src/language/generate.ts:6
+#, fuzzy
+msgid "[Nginx UI] Setting environment variables"
+msgstr "Настройка переменных сред"
+
+#: src/language/generate.ts:11
+msgid "[Nginx UI] Setting HTTP01 challenge provider"
+msgstr "[Nginx UI] Настройка провайдера HTTP01-проверки"
+
+#: src/language/generate.ts:15
+msgid "[Nginx UI] Writing certificate private key to disk"
+msgstr "[Nginx UI] Запись закрытого ключа сертификата на диск"
+
+#: src/language/generate.ts:27
+msgid "[Nginx UI] Writing certificate to disk"
+msgstr "[Nginx UI] Запись сертификата на диск"
+
 #: src/views/user/userColumns.tsx:32
 #: src/views/user/userColumns.tsx:32
 msgid "2FA"
 msgid "2FA"
 msgstr "2FA"
 msgstr "2FA"
@@ -108,7 +202,7 @@ msgstr "Добавить поток"
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "Добавлено успешно"
 msgstr "Добавлено успешно"
 
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgid "Additional"
 msgstr "Дополнительно"
 msgstr "Дополнительно"
 
 
@@ -135,7 +229,7 @@ msgstr "Все коды восстановления были использов
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "Базовый URL API"
 msgstr "Базовый URL API"
 
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgid "API Document"
 msgstr "API Документ"
 msgstr "API Документ"
 
 
@@ -278,7 +372,7 @@ msgstr "Авто"
 msgid "auto = CPU cores"
 msgid "auto = CPU cores"
 msgstr "Auto = ядра процессора"
 msgstr "Auto = ядра процессора"
 
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgid "Auto Refresh"
 msgstr "Автообновление"
 msgstr "Автообновление"
 
 
@@ -298,11 +392,9 @@ msgstr "\"Автоматическая перезагрузка\""
 msgid "Automatically indexed from site and stream configurations."
 msgid "Automatically indexed from site and stream configurations."
 msgstr "\"Автоматически проиндексировано из конфигураций сайта и потока.\""
 msgstr "\"Автоматически проиндексировано из конфигураций сайта и потока.\""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:259
-#: src/views/config/ConfigEditor.vue:266
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
-#: src/views/nginx_log/NginxLog.vue:173
+#: src/views/certificate/CertificateEditor.vue:259
+#: src/views/config/ConfigEditor.vue:266 src/views/config/ConfigList.vue:112
+#: src/views/config/ConfigList.vue:195 src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/stream/components/StreamEditor.vue:106
 #: src/views/stream/components/StreamEditor.vue:106
 msgid "Back"
 msgid "Back"
@@ -516,36 +608,36 @@ msgid "Certificate decode error"
 msgstr "Ошибка декодирования сертификата"
 msgstr "Ошибка декодирования сертификата"
 
 
 #: src/components/Notification/notifications.ts:29
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
 msgid "Certificate Expiration Notice"
-msgstr "Шаблоны конфигурации"
+msgstr "Уведомление об истечении срока действия сертификата"
 
 
 #: src/components/Notification/notifications.ts:25
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
 msgid "Certificate Expired"
-msgstr "Список сертификатов"
+msgstr "Сертификат истёк"
 
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 msgid "Certificate Expiring Soon"
 msgid "Certificate Expiring Soon"
-msgstr "Ошибка анализа сертификата"
+msgstr "Сертификат скоро истекает"
+
+#: src/language/generate.ts:5
+#, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "Ошибка декодирования сертификата"
 
 
 #: src/constants/errors/cert.ts:5
 #: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgid "Certificate parse error"
-msgstr "Ошибка анализа сертификата"
+msgstr "Ошибка разбора сертификата"
 
 
 #: src/constants/errors/cert.ts:8
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 msgid "Certificate path is empty"
 msgid "Certificate path is empty"
-msgstr "Шаблоны конфигурации"
+msgstr "Путь к сертификату пуст"
 
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
 #: src/views/certificate/components/RemoveCert.vue:61
-#, fuzzy
 msgid "Certificate removed successfully"
 msgid "Certificate removed successfully"
-msgstr "Сертификат успешно продлен"
+msgstr "Сертификат успешно удален"
 
 
 #: src/views/preference/tabs/CertSettings.vue:27
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
 msgid "Certificate Renewal Interval"
@@ -555,7 +647,12 @@ msgstr "Интервал обновления сертификата"
 msgid "Certificate renewed successfully"
 msgid "Certificate renewed successfully"
 msgstr "Сертификат успешно продлен"
 msgstr "Сертификат успешно продлен"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:128
+#: src/language/generate.ts:10
+#, fuzzy
+msgid "Certificate revoked successfully"
+msgstr "Сертификат успешно удален"
+
+#: src/views/certificate/CertificateEditor.vue:128
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 msgid "Certificate Status"
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
 msgid_plural "Certificates Status"
@@ -598,7 +695,7 @@ msgstr "Канал"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
 msgid "Chat"
-msgstr ""
+msgstr "Чат"
 
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -616,40 +713,49 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 "/var/run/docker.sock:/var/run/docker.sock`."
 msgstr ""
 msgstr ""
+"Проверьте, существует ли /var/run/docker.sock. Если вы используете "
+"официальный образ Docker Nginx UI, убедитесь, что сокет Docker подключен "
+"следующим образом: `-v /var/run/docker.sock:/var/run/docker.sock`."
 
 
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 msgid ""
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 "prevents using Passkeys and clipboard features."
 msgstr ""
 msgstr ""
+"Проверьте, включён ли HTTPS. Использование HTTP вне localhost небезопасно и "
+"блокирует функции Passkeys и буфера обмена."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 msgid "Check if the nginx.conf includes the conf.d directory."
 msgid "Check if the nginx.conf includes the conf.d directory."
-msgstr ""
+msgstr "Проверьте, включает ли файл nginx.conf каталог conf.d."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgid "Check if the nginx.conf includes the sites-enabled directory."
-msgstr ""
+msgstr "Проверьте, включает ли файл nginx.conf каталог sites-enabled."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgid "Check if the nginx.conf includes the streams-enabled directory."
-msgstr ""
+msgstr "Проверьте, включает ли файл nginx.conf каталог streams-enabled."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 "nginx configuration directory."
 msgstr ""
 msgstr ""
+"Проверьте, находятся ли каталоги sites-available и sites-enabled в каталоге "
+"конфигурации nginx."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 "the nginx configuration directory."
 msgstr ""
 msgstr ""
+"Проверьте, находятся ли каталоги streams-available и streams-enabled в "
+"директории конфигурации nginx."
 
 
 #: src/constants/errors/crypto.ts:3
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "Зашифрованный текст слишком короткий"
 
 
 #: src/language/constants.ts:13
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
 msgid "Cleaning environment variables"
@@ -670,43 +776,44 @@ msgstr "Очищено успешно"
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
 msgid "Click or drag backup file to this area to upload"
 msgstr ""
 msgstr ""
+"Нажмите или перетащите файл резервного копирования в эту область, чтобы "
+"загрузить"
 
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
 msgid "Click to copy"
-msgstr ""
+msgstr "Нажмите, чтобы скопировать"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "Размер буфера корпуса клиента"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "Размер буфера заголовков клиента"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "Максимальный размер тела клиента"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 msgid "Client request body buffer size"
 msgid "Client request body buffer size"
-msgstr ""
+msgstr "Размер буфера тела запроса клиента"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 msgid "Client request header buffer size"
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "Размер буфера заголовков запроса клиента"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
 msgid "Close"
-msgstr ""
+msgstr "Закрыть"
 
 
 #: src/constants/errors/llm.ts:2
 #: src/constants/errors/llm.ts:2
-#, fuzzy
 msgid "Code completion is not enabled"
 msgid "Code completion is not enabled"
-msgstr "Для текущей учетной записи TOTP не включен."
+msgstr "Автодополнение кода не включено"
 
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
 msgid "Code Completion Model"
-msgstr ""
+msgstr "Модель автодополнения кода"
 
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
 msgid "Command"
@@ -714,7 +821,7 @@ msgstr "Команда"
 
 
 #: src/constants/errors/docker.ts:6
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr ""
+msgstr "Команда завершилась с неожиданным кодом выхода: {0}, ошибка: {1}"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
@@ -725,7 +832,7 @@ msgstr "Комментарии"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
 msgid "Compare"
-msgstr ""
+msgstr "Сравнивать"
 
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
 #, fuzzy
@@ -734,15 +841,15 @@ msgstr "Конфигурации"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
 msgid "Compare Selected"
-msgstr ""
+msgstr "Сравните выбранный"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
 msgid "Compare with Current"
-msgstr ""
+msgstr "Сравните с током"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 msgid "Compression level, 1 is lowest, 9 is highest"
 msgid "Compression level, 1 is lowest, 9 is highest"
-msgstr ""
+msgstr "Уровень сжатия, 1 самый низкий, 9 - самый высокий"
 
 
 #: src/constants/errors/backup.ts:14
 #: src/constants/errors/backup.ts:14
 #, fuzzy
 #, fuzzy
@@ -786,7 +893,7 @@ msgstr "Подключено"
 
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "Ошибка соединения, попытка переподключения..."
 
 
 #: src/views/terminal/Terminal.vue:142
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
 msgid "Connection lost, please refresh the page."
@@ -794,11 +901,11 @@ msgstr "Соединение потеряно, пожалуйста, обнов
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
 msgid "Connection timeout period"
-msgstr ""
+msgstr "Период таймаута соединения"
 
 
 #: src/constants/errors/docker.ts:7
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
 msgid "Container status unknown"
-msgstr ""
+msgstr "Статус контейнера неизвестен"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -893,7 +1000,7 @@ msgstr "Создание клиента облегчает связь с сер
 msgid "Credential"
 msgid "Credential"
 msgstr "Учетные данные"
 msgstr "Учетные данные"
 
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgid "Credentials"
 msgstr "Учетные данные"
 msgstr "Учетные данные"
 
 
@@ -1190,7 +1297,7 @@ msgid "DNS Credentials"
 msgstr "DNS учетные данные"
 msgstr "DNS учетные данные"
 
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgid "DNS Provider"
 msgstr "Провайдер DNS"
 msgstr "Провайдер DNS"
 
 
@@ -1241,6 +1348,10 @@ msgstr ""
 msgid "Docker Socket"
 msgid "Docker Socket"
 msgstr ""
 msgstr ""
 
 
+#: src/constants/errors/self_check.ts:15
+msgid "Docker socket not exist"
+msgstr ""
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #, fuzzy
 #, fuzzy
@@ -1253,7 +1364,7 @@ msgstr[1] "API Документ"
 msgid "Domain"
 msgid "Domain"
 msgstr "Домен"
 msgstr "Домен"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:112
+#: src/views/certificate/CertificateEditor.vue:112
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr "Список доменов пуст, попробуйте заново создать авто-сертификат для %{config}"
 msgstr "Список доменов пуст, попробуйте заново создать авто-сертификат для %{config}"
 
 
@@ -1515,7 +1626,7 @@ msgstr ""
 msgid "External Notify"
 msgid "External Notify"
 msgstr ""
 msgstr ""
 
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 msgid "Fail to obtain certificate"
 msgid "Fail to obtain certificate"
 msgstr "Не удалось получить сертификат"
 msgstr "Не удалось получить сертификат"
 
 
@@ -1668,6 +1779,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgid "Failed to delete certificate"
 msgstr "Не удалось получить сертификат"
 msgstr "Не удалось получить сертификат"
 
 
+#: src/language/generate.ts:9
+#, fuzzy
+msgid "Failed to delete certificate from database: %{error}"
+msgstr "Не удалось получить сертификат"
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
 #: src/views/stream/StreamList.vue:102
@@ -1831,6 +1947,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgid "Failed to revoke certificate"
 msgstr "Не удалось получить сертификат"
 msgstr "Не удалось получить сертификат"
 
 
+#: src/language/generate.ts:17
+#, fuzzy
+msgid "Failed to revoke certificate: %{error}"
+msgstr "Не удалось получить сертификат"
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #, fuzzy
 #, fuzzy
 msgid "Failed to save Nginx performance settings"
 msgid "Failed to save Nginx performance settings"
@@ -1870,7 +1991,7 @@ msgstr "Файл не найден"
 msgid "Filename is empty"
 msgid "Filename is empty"
 msgstr ""
 msgstr ""
 
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgid "Filter"
 msgstr "Фильтр"
 msgstr "Фильтр"
 
 
@@ -2064,7 +2185,7 @@ msgid "Import"
 msgstr "Импорт"
 msgstr "Импорт"
 
 
 #: src/routes/modules/certificates.ts:46
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgid "Import Certificate"
 msgstr "Импортировать сертификат"
 msgstr "Импортировать сертификат"
 
 
@@ -2290,8 +2411,8 @@ msgstr "Оставьте пустым без изменений"
 msgid "Leave blank if you don't need this."
 msgid "Leave blank if you don't need this."
 msgstr "Оставьте пустым без изменений."
 msgstr "Оставьте пустым без изменений."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:223
-#: src/views/certificate/components/CertificateEditor.vue:237
+#: src/views/certificate/CertificateEditor.vue:223
+#: src/views/certificate/CertificateEditor.vue:237
 msgid "Leave blank will not change anything"
 msgid "Leave blank will not change anything"
 msgstr "Если оставить пустым, ничего не изменится"
 msgstr "Если оставить пустым, ничего не изменится"
 
 
@@ -2364,10 +2485,14 @@ msgstr "Локация"
 msgid "Locations"
 msgid "Locations"
 msgstr "Локации"
 msgstr "Локации"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 msgid "Log"
 msgstr "Журнал"
 msgstr "Журнал"
 
 
+#: src/language/generate.ts:23
+msgid "Log file %{log_path} is not a regular file. "
+msgstr ""
+
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #, fuzzy
 #, fuzzy
 msgid "Log List"
 msgid "Log List"
@@ -2571,7 +2696,7 @@ msgid "Modify"
 msgstr "Изменить"
 msgstr "Изменить"
 
 
 #: src/routes/modules/certificates.ts:36
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgid "Modify Certificate"
 msgstr "Изменить сертификат"
 msgstr "Изменить сертификат"
 
 
@@ -2589,8 +2714,8 @@ msgstr "Многострочная директива"
 
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:10
 #: src/views/certificate/CertificateList/certColumns.tsx:10
-#: src/views/certificate/components/CertificateEditor.vue:162
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2754,7 +2879,7 @@ msgstr "Nginx не работает"
 msgid "Nginx is running"
 msgid "Nginx is running"
 msgstr "Nginx не работает"
 msgstr "Nginx не работает"
 
 
-#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:143
+#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:144
 msgid "Nginx Log"
 msgid "Nginx Log"
 msgstr "Журнал"
 msgstr "Журнал"
 
 
@@ -3772,7 +3897,7 @@ msgstr "Выполняется"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
-#: src/views/certificate/components/CertificateEditor.vue:266
+#: src/views/certificate/CertificateEditor.vue:266
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
@@ -3835,7 +3960,7 @@ msgstr "Поток %{name} успешно сохранён на %{node}"
 
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #: src/views/preference/store/index.ts:118
 msgid "Save successfully"
 msgid "Save successfully"
 msgstr "Сохранено успешно"
 msgstr "Сохранено успешно"
@@ -3852,7 +3977,7 @@ msgstr ""
 "Отсканируйте QR-код с помощью мобильного телефона, чтобы добавить учетную "
 "Отсканируйте QR-код с помощью мобильного телефона, чтобы добавить учетную "
 "запись в приложение."
 "запись в приложение."
 
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgid "SDK"
 msgstr "SDK"
 msgstr "SDK"
 
 
@@ -4032,7 +4157,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgid "SSL Certificate Content"
 msgstr "Содержимое SSL-сертификата"
 msgstr "Содержимое SSL-сертификата"
 
 
@@ -4045,15 +4170,15 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgid "SSL certificate file not found"
 msgstr "Содержимое ключа SSL-сертификата"
 msgstr "Содержимое ключа SSL-сертификата"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgid "SSL Certificate Key Content"
 msgstr "Содержимое ключа SSL-сертификата"
 msgstr "Содержимое ключа SSL-сертификата"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgid "SSL Certificate Key Path"
 msgstr "Путь к ключу SSL-сертификата"
 msgstr "Путь к ключу SSL-сертификата"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgid "SSL Certificate Path"
 msgstr "Путь к SSL сертификату"
 msgstr "Путь к SSL сертификату"
@@ -4227,7 +4352,7 @@ msgstr "Синхронизировать с"
 msgid "Sync strategy"
 msgid "Sync strategy"
 msgstr "Синхронизировать сертификат"
 msgstr "Синхронизировать сертификат"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgid "Sync to"
 msgstr "Синхронизировать с"
 msgstr "Синхронизировать с"
 
 
@@ -4306,11 +4431,11 @@ msgstr ""
 "Имя модели должно содержать только буквы, юникод, цифры, дефисы, тире и "
 "Имя модели должно содержать только буквы, юникод, цифры, дефисы, тире и "
 "точки."
 "точки."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgid "The input is not a SSL Certificate"
 msgstr "Входные данные не являются SSL-сертификатом"
 msgstr "Входные данные не являются SSL-сертификатом"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgid "The input is not a SSL Certificate Key"
 msgstr "Введенные данные не являются ключом SSL сертификата"
 msgstr "Введенные данные не являются ключом SSL сертификата"
 
 
@@ -4348,11 +4473,11 @@ msgstr ""
 msgid "The parameter of server_name is required"
 msgid "The parameter of server_name is required"
 msgstr "server_name параметр обязателен"
 msgstr "server_name параметр обязателен"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 msgid "The path exists, but the file is not a certificate"
 msgid "The path exists, but the file is not a certificate"
 msgstr "Путь существует, но файл не является сертификатом"
 msgstr "Путь существует, но файл не является сертификатом"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:196
+#: src/views/certificate/CertificateEditor.vue:196
 msgid "The path exists, but the file is not a private key"
 msgid "The path exists, but the file is not a private key"
 msgstr "Путь существует, но файл не является приватным ключом"
 msgstr "Путь существует, но файл не является приватным ключом"
 
 
@@ -4412,17 +4537,17 @@ msgid ""
 "lose access to your account."
 "lose access to your account."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr "Этот элемент автосертификата недействителен, удалите его.."
 msgstr "Этот элемент автосертификата недействителен, удалите его.."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 msgid "This certificate is managed by Nginx UI"
 msgstr "Этот сертификат под управлением Nginx UI"
 msgstr "Этот сертификат под управлением Nginx UI"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:165
-#: src/views/certificate/components/CertificateEditor.vue:179
-#: src/views/certificate/components/CertificateEditor.vue:194
+#: src/views/certificate/CertificateEditor.vue:165
+#: src/views/certificate/CertificateEditor.vue:179
+#: src/views/certificate/CertificateEditor.vue:194
 msgid "This field is required"
 msgid "This field is required"
 msgstr "Это поле обязательно для заполнения"
 msgstr "Это поле обязательно для заполнения"
 
 

+ 198 - 74
app/src/language/tr_TR/app.po

@@ -14,6 +14,98 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 5.10.4\n"
 "X-Generator: Weblate 5.10.4\n"
 
 
+#: src/language/generate.ts:19
+msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
+msgstr "[Nginx UI] ACME Kullanıcısı: %{name}, E-posta: %{email}, CA Dizini: %{caDir}"
+
+#: src/language/generate.ts:13
+msgid "[Nginx UI] Backing up current certificate for later revocation"
+msgstr "[Nginx UI] Geçerli sertifika daha sonra iptal edilmek üzere yedekleniyor"
+
+#: src/language/generate.ts:28
+#, fuzzy
+msgid "[Nginx UI] Certificate renewed successfully"
+msgstr "Başarıyla temizlendi"
+
+#: src/language/generate.ts:8
+#, fuzzy
+msgid "[Nginx UI] Certificate successfully revoked"
+msgstr "Nginx başarıyla yeniden başlatıldı"
+
+#: src/language/generate.ts:29
+msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgstr ""
+"[Nginx UI] Sertifika sunucu için kullanıldı, sunucu TLS sertifikası yeniden "
+"yükleniyor"
+
+#: src/language/generate.ts:24
+#, fuzzy
+msgid "[Nginx UI] Creating client facilitates communication with the CA server"
+msgstr "İstemci oluşturmak, CA sunucusuyla iletişimi kolaylaştırır"
+
+#: src/language/generate.ts:12
+#, fuzzy
+msgid "[Nginx UI] Environment variables cleaned"
+msgstr "Ortam değişkenleri temizlendi"
+
+#: src/language/generate.ts:21
+msgid "[Nginx UI] Finished"
+msgstr "[Nginx UI] Tamamlandı"
+
+#: src/language/generate.ts:4
+#, fuzzy
+msgid "[Nginx UI] Issued certificate successfully"
+msgstr "Sertifika başarıyla yayınlandı"
+
+#: src/language/generate.ts:14
+msgid "[Nginx UI] Obtaining certificate"
+msgstr "[Nginx UI] Sertifika alınıyor"
+
+#: src/language/generate.ts:22
+msgid "[Nginx UI] Preparing for certificate revocation"
+msgstr "[Nginx UI] Sertifika iptali için hazırlanıyor"
+
+#: src/language/generate.ts:18
+msgid "[Nginx UI] Preparing lego configurations"
+msgstr "[Nginx UI] Lego yapılandırmaları hazırlanıyor"
+
+#: src/language/generate.ts:25
+msgid "[Nginx UI] Reloading nginx"
+msgstr "[Nginx UI] Nginx yeniden yükleniyor"
+
+#: src/language/generate.ts:16
+msgid "[Nginx UI] Revocation completed"
+msgstr "[Nginx UI] İptal tamamlandı"
+
+#: src/language/generate.ts:7
+msgid "[Nginx UI] Revoking certificate"
+msgstr "[Nginx UI] Sertifika iptal ediliyor"
+
+#: src/language/generate.ts:26
+msgid "[Nginx UI] Revoking old certificate"
+msgstr "[Nginx UI] Eski sertifika iptal ediliyor"
+
+#: src/language/generate.ts:20
+msgid "[Nginx UI] Setting DNS01 challenge provider"
+msgstr "[Nginx UI] DNS01 meydan okuma sağlayıcısı ayarlanıyor"
+
+#: src/language/generate.ts:6
+#, fuzzy
+msgid "[Nginx UI] Setting environment variables"
+msgstr "Ortam değişkenlerini ayarlama"
+
+#: src/language/generate.ts:11
+msgid "[Nginx UI] Setting HTTP01 challenge provider"
+msgstr "[Nginx UI] HTTP01 meydan okuma sağlayıcısı ayarlanıyor"
+
+#: src/language/generate.ts:15
+msgid "[Nginx UI] Writing certificate private key to disk"
+msgstr "[Nginx UI] Sertifika özel anahtarı diske yazılıyor"
+
+#: src/language/generate.ts:27
+msgid "[Nginx UI] Writing certificate to disk"
+msgstr "[Nginx UI] Sertifika diske yazılıyor"
+
 #: src/views/user/userColumns.tsx:32
 #: src/views/user/userColumns.tsx:32
 msgid "2FA"
 msgid "2FA"
 msgstr "İki aşamalı kimlik doğrulaması(2FA)"
 msgstr "İki aşamalı kimlik doğrulaması(2FA)"
@@ -105,7 +197,7 @@ msgstr "Akış Ekle"
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "Başarıyla eklendi"
 msgstr "Başarıyla eklendi"
 
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgid "Additional"
 msgstr "İlave bilgi"
 msgstr "İlave bilgi"
 
 
@@ -132,7 +224,7 @@ msgstr "Tüm Kurtarma Kodları Kullanıldı"
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "API Temel Bağlantı Adresi"
 msgstr "API Temel Bağlantı Adresi"
 
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgid "API Document"
 msgstr "API Dökümanı"
 msgstr "API Dökümanı"
 
 
@@ -275,7 +367,7 @@ msgstr "Otomobil"
 msgid "auto = CPU cores"
 msgid "auto = CPU cores"
 msgstr "Auto = CPU Çekirdekleri"
 msgstr "Auto = CPU Çekirdekleri"
 
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgid "Auto Refresh"
 msgstr "Otomatik Yenileme"
 msgstr "Otomatik Yenileme"
 
 
@@ -295,11 +387,9 @@ msgstr "\"Otomatik Yeniden Başlatma\""
 msgid "Automatically indexed from site and stream configurations."
 msgid "Automatically indexed from site and stream configurations."
 msgstr "\"Site ve akış yapılandırmalarından otomatik olarak dizinlendi.\""
 msgstr "\"Site ve akış yapılandırmalarından otomatik olarak dizinlendi.\""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:259
-#: src/views/config/ConfigEditor.vue:266
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
-#: src/views/nginx_log/NginxLog.vue:173
+#: src/views/certificate/CertificateEditor.vue:259
+#: src/views/config/ConfigEditor.vue:266 src/views/config/ConfigList.vue:112
+#: src/views/config/ConfigList.vue:195 src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/stream/components/StreamEditor.vue:106
 #: src/views/stream/components/StreamEditor.vue:106
 msgid "Back"
 msgid "Back"
@@ -506,42 +596,40 @@ msgid "Certificate %{name} will expire in 1 day"
 msgstr "%{name} sertifikasının süresi 1 gün sonra dolacak"
 msgstr "%{name} sertifikasının süresi 1 gün sonra dolacak"
 
 
 #: src/constants/errors/cert.ts:4
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 msgid "Certificate decode error"
 msgid "Certificate decode error"
-msgstr "Senkronizasyon Sertifikası Hatası"
+msgstr "Sertifika çözme hatası"
 
 
 #: src/components/Notification/notifications.ts:29
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
 msgid "Certificate Expiration Notice"
-msgstr "Yapılandırma Şablonları"
+msgstr "Sertifika Son Kullanma Bildirimi"
 
 
 #: src/components/Notification/notifications.ts:25
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
 msgid "Certificate Expired"
-msgstr "Sertifika Listesi"
+msgstr "Sertifikanın süresi doldu"
 
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 msgid "Certificate Expiring Soon"
 msgid "Certificate Expiring Soon"
-msgstr "Senkronizasyon Sertifikası Hatası"
+msgstr "Sertifika Yakında Sona Eriyor"
 
 
-#: src/constants/errors/cert.ts:5
+#: src/language/generate.ts:5
 #, fuzzy
 #, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "Sertifika çözme hatası"
+
+#: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgid "Certificate parse error"
-msgstr "Senkronizasyon Sertifikası Hatası"
+msgstr "Sertifika ayrıştırma hatası"
 
 
 #: src/constants/errors/cert.ts:8
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 msgid "Certificate path is empty"
 msgid "Certificate path is empty"
-msgstr "Yapılandırma Şablonları"
+msgstr "Sertifika yolu boş"
 
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
 #: src/views/certificate/components/RemoveCert.vue:61
-#, fuzzy
 msgid "Certificate removed successfully"
 msgid "Certificate removed successfully"
-msgstr "Başarıyla temizlendi"
+msgstr "Sertifika başarıyla kaldırıldı"
 
 
 #: src/views/preference/tabs/CertSettings.vue:27
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
 msgid "Certificate Renewal Interval"
@@ -552,7 +640,12 @@ msgstr "Sertifika Yenileme Aralığı"
 msgid "Certificate renewed successfully"
 msgid "Certificate renewed successfully"
 msgstr "Başarıyla temizlendi"
 msgstr "Başarıyla temizlendi"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:128
+#: src/language/generate.ts:10
+#, fuzzy
+msgid "Certificate revoked successfully"
+msgstr "Sertifika başarıyla kaldırıldı"
+
+#: src/views/certificate/CertificateEditor.vue:128
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 msgid "Certificate Status"
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
 msgid_plural "Certificates Status"
@@ -595,7 +688,7 @@ msgstr "Kanal"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
 msgid "Chat"
-msgstr ""
+msgstr "Sohbet"
 
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -613,40 +706,54 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 "/var/run/docker.sock:/var/run/docker.sock`."
 msgstr ""
 msgstr ""
+"/var/run/docker.sock dosyasının var olup olmadığını kontrol edin. Nginx UI "
+"Resmi Docker Image'ını kullanıyorsanız, docker soketinin şu şekilde "
+"bağlandığından emin olun: `-v /var/run/docker.sock:/var/run/docker.sock`."
 
 
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 msgid ""
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 "prevents using Passkeys and clipboard features."
 msgstr ""
 msgstr ""
+"HTTPS'nin etkin olup olmadığını kontrol edin. localhost dışında HTTP "
+"kullanmak güvensizdir ve Passkeys ile panosu özelliklerini kullanmayı "
+"engeller."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 msgid "Check if the nginx.conf includes the conf.d directory."
 msgid "Check if the nginx.conf includes the conf.d directory."
-msgstr ""
+msgstr "nginx.conf dosyasının conf.d dizinini içerip içermediğini kontrol edin."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgstr ""
 msgstr ""
+"nginx.conf dosyasının sites-enabled dizinini içerip içermediğini kontrol "
+"edin."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgstr ""
 msgstr ""
+"nginx.conf dosyasının streams-enabled dizinini içerip içermediğini kontrol "
+"edin."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 "nginx configuration directory."
 msgstr ""
 msgstr ""
+"sites-available ve sites-enabled dizinlerinin nginx yapılandırma dizini "
+"altında olup olmadığını kontrol edin."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 "the nginx configuration directory."
 msgstr ""
 msgstr ""
+"streams-available ve streams-enabled dizinlerinin nginx yapılandırma dizini "
+"altında olup olmadığını kontrol edin."
 
 
 #: src/constants/errors/crypto.ts:3
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "Şifreli metin çok kısa"
 
 
 #: src/language/constants.ts:13
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
 msgid "Cleaning environment variables"
@@ -666,44 +773,43 @@ msgstr "Başarıyla temizlendi"
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
 msgid "Click or drag backup file to this area to upload"
-msgstr ""
+msgstr "Yüklemek için bu alana yedekleme dosyasını tıklayın veya sürükleyin"
 
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
 msgid "Click to copy"
-msgstr ""
+msgstr "Kopyala için tıklayın"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "İstemci gövdesi arabellek boyutu"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "İstemci Başlık Arabellek Boyutu"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "İstemci Maksimum Gövde Boyutu"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 msgid "Client request body buffer size"
 msgid "Client request body buffer size"
-msgstr ""
+msgstr "İstemci istek gövdesi tampon boyutu"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 msgid "Client request header buffer size"
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "İstemci istek başlığı arabellek boyutu"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
 msgid "Close"
-msgstr ""
+msgstr "Kapat"
 
 
 #: src/constants/errors/llm.ts:2
 #: src/constants/errors/llm.ts:2
-#, fuzzy
 msgid "Code completion is not enabled"
 msgid "Code completion is not enabled"
-msgstr "Mevcut hesap için TOTP etkin değil."
+msgstr "Kod tamamlama etkin değil"
 
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
 msgid "Code Completion Model"
-msgstr ""
+msgstr "Kod Tamamlama Modeli"
 
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
 msgid "Command"
@@ -711,7 +817,7 @@ msgstr "Komut"
 
 
 #: src/constants/errors/docker.ts:6
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr ""
+msgstr "Komut beklenmeyen çıkış kodu ile sonlandı: {0}, hata: {1}"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
@@ -722,7 +828,7 @@ msgstr "Yorumlar"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
 msgid "Compare"
-msgstr ""
+msgstr "Karşılaştırmak"
 
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
 #, fuzzy
@@ -731,15 +837,15 @@ msgstr "Yapılandırmalar"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
 msgid "Compare Selected"
-msgstr ""
+msgstr "Seçili karşılaştırın"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
 msgid "Compare with Current"
-msgstr ""
+msgstr "Mevcut ile karşılaştırın"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 msgid "Compression level, 1 is lowest, 9 is highest"
 msgid "Compression level, 1 is lowest, 9 is highest"
-msgstr ""
+msgstr "Sıkıştırma seviyesi, 1 en düşük, 9 en yüksek"
 
 
 #: src/constants/errors/backup.ts:14
 #: src/constants/errors/backup.ts:14
 #, fuzzy
 #, fuzzy
@@ -783,7 +889,7 @@ msgstr "Bağlandı"
 
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "Bağlantı hatası, yeniden bağlanılmaya çalışılıyor..."
 
 
 #: src/views/terminal/Terminal.vue:142
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
 msgid "Connection lost, please refresh the page."
@@ -791,11 +897,11 @@ msgstr "Bağlantı kesildi, lütfen sayfayı yenileyin."
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
 msgid "Connection timeout period"
-msgstr ""
+msgstr "Bağlantı zaman aşımı süresi"
 
 
 #: src/constants/errors/docker.ts:7
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
 msgid "Container status unknown"
-msgstr ""
+msgstr "Kapsayıcı durumu bilinmiyor"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -891,7 +997,7 @@ msgstr "İstemci oluşturmak, CA sunucusuyla iletişimi kolaylaştırır"
 msgid "Credential"
 msgid "Credential"
 msgstr "Kimlik bilgisi"
 msgstr "Kimlik bilgisi"
 
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgid "Credentials"
 msgstr "Kimlik bilgileri"
 msgstr "Kimlik bilgileri"
 
 
@@ -1203,7 +1309,7 @@ msgid "DNS Credentials"
 msgstr "DNS Kimlik Bilgileri"
 msgstr "DNS Kimlik Bilgileri"
 
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgid "DNS Provider"
 msgstr "DNS Sağlayıcısı"
 msgstr "DNS Sağlayıcısı"
 
 
@@ -1253,6 +1359,10 @@ msgstr ""
 msgid "Docker Socket"
 msgid "Docker Socket"
 msgstr ""
 msgstr ""
 
 
+#: src/constants/errors/self_check.ts:15
+msgid "Docker socket not exist"
+msgstr ""
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #, fuzzy
 #, fuzzy
@@ -1265,7 +1375,7 @@ msgstr[1] "API Dökümanı"
 msgid "Domain"
 msgid "Domain"
 msgstr "Alan Adı"
 msgstr "Alan Adı"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:112
+#: src/views/certificate/CertificateEditor.vue:112
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr ""
 msgstr ""
 "Alan adları listesi boş, %{config} için Otomatik Sertifikayı yeniden açmayı "
 "Alan adları listesi boş, %{config} için Otomatik Sertifikayı yeniden açmayı "
@@ -1543,7 +1653,7 @@ msgstr ""
 msgid "External Notify"
 msgid "External Notify"
 msgstr ""
 msgstr ""
 
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 msgid "Fail to obtain certificate"
 msgid "Fail to obtain certificate"
 msgstr "Sertifika alınamadı"
 msgstr "Sertifika alınamadı"
 
 
@@ -1696,6 +1806,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgid "Failed to delete certificate"
 msgstr "Sertifika alınamadı"
 msgstr "Sertifika alınamadı"
 
 
+#: src/language/generate.ts:9
+#, fuzzy
+msgid "Failed to delete certificate from database: %{error}"
+msgstr "Sertifika alınamadı"
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
 #: src/views/stream/StreamList.vue:102
@@ -1859,6 +1974,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgid "Failed to revoke certificate"
 msgstr "Sertifika alınamadı"
 msgstr "Sertifika alınamadı"
 
 
+#: src/language/generate.ts:17
+#, fuzzy
+msgid "Failed to revoke certificate: %{error}"
+msgstr "Sertifika alınamadı"
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #, fuzzy
 #, fuzzy
 msgid "Failed to save Nginx performance settings"
 msgid "Failed to save Nginx performance settings"
@@ -1898,7 +2018,7 @@ msgstr "Dosya Bulunamadı"
 msgid "Filename is empty"
 msgid "Filename is empty"
 msgstr ""
 msgstr ""
 
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgid "Filter"
 msgstr "Filtre"
 msgstr "Filtre"
 
 
@@ -2094,7 +2214,7 @@ msgid "Import"
 msgstr "İçe Aktar"
 msgstr "İçe Aktar"
 
 
 #: src/routes/modules/certificates.ts:46
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgid "Import Certificate"
 msgstr "Sertifika İçe Aktar"
 msgstr "Sertifika İçe Aktar"
 
 
@@ -2321,8 +2441,8 @@ msgstr "Buna ihtiyacınız yoksa boş bırakın."
 msgid "Leave blank if you don't need this."
 msgid "Leave blank if you don't need this."
 msgstr "Buna ihtiyacınız yoksa boş bırakın."
 msgstr "Buna ihtiyacınız yoksa boş bırakın."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:223
-#: src/views/certificate/components/CertificateEditor.vue:237
+#: src/views/certificate/CertificateEditor.vue:223
+#: src/views/certificate/CertificateEditor.vue:237
 msgid "Leave blank will not change anything"
 msgid "Leave blank will not change anything"
 msgstr "Boş bırakmak hiçbir şeyi değiştirmeyecektir"
 msgstr "Boş bırakmak hiçbir şeyi değiştirmeyecektir"
 
 
@@ -2395,10 +2515,14 @@ msgstr "Konum"
 msgid "Locations"
 msgid "Locations"
 msgstr "Konumlar"
 msgstr "Konumlar"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 msgid "Log"
 msgstr "Günlük"
 msgstr "Günlük"
 
 
+#: src/language/generate.ts:23
+msgid "Log file %{log_path} is not a regular file. "
+msgstr ""
+
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #, fuzzy
 #, fuzzy
 msgid "Log List"
 msgid "Log List"
@@ -2614,7 +2738,7 @@ msgid "Modify"
 msgstr "Değiştir"
 msgstr "Değiştir"
 
 
 #: src/routes/modules/certificates.ts:36
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 #, fuzzy
 #, fuzzy
 msgid "Modify Certificate"
 msgid "Modify Certificate"
 msgstr "Sertifika Değiştirme"
 msgstr "Sertifika Değiştirme"
@@ -2636,8 +2760,8 @@ msgstr "Çok Hatlı Direktif"
 
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:10
 #: src/views/certificate/CertificateList/certColumns.tsx:10
-#: src/views/certificate/components/CertificateEditor.vue:162
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2816,7 +2940,7 @@ msgstr "Nginx çalışmıyor"
 msgid "Nginx is running"
 msgid "Nginx is running"
 msgstr "Nginx çalışmıyor"
 msgstr "Nginx çalışmıyor"
 
 
-#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:143
+#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:144
 #, fuzzy
 #, fuzzy
 msgid "Nginx Log"
 msgid "Nginx Log"
 msgstr "Nginx Günlüğü"
 msgstr "Nginx Günlüğü"
@@ -3933,7 +4057,7 @@ msgstr "Çalışıyor"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
-#: src/views/certificate/components/CertificateEditor.vue:266
+#: src/views/certificate/CertificateEditor.vue:266
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
@@ -4001,7 +4125,7 @@ msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı"
 
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #: src/views/preference/store/index.ts:118
 #, fuzzy
 #, fuzzy
 msgid "Save successfully"
 msgid "Save successfully"
@@ -4019,7 +4143,7 @@ msgstr "Başarıyla Kaydedildi"
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr "Hesabı uygulamaya eklemek için QR kodunu cep telefonunuzla tarayın."
 msgstr "Hesabı uygulamaya eklemek için QR kodunu cep telefonunuzla tarayın."
 
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 #, fuzzy
 #, fuzzy
 msgid "SDK"
 msgid "SDK"
 msgstr "SDK"
 msgstr "SDK"
@@ -4215,7 +4339,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 #, fuzzy
 #, fuzzy
 msgid "SSL Certificate Content"
 msgid "SSL Certificate Content"
 msgstr "SSL Sertifika İçeriği"
 msgstr "SSL Sertifika İçeriği"
@@ -4229,17 +4353,17 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgid "SSL certificate file not found"
 msgstr "SSL Sertifika Anahtarı İçeriği"
 msgstr "SSL Sertifika Anahtarı İçeriği"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 #, fuzzy
 #, fuzzy
 msgid "SSL Certificate Key Content"
 msgid "SSL Certificate Key Content"
 msgstr "SSL Sertifika Anahtarı İçeriği"
 msgstr "SSL Sertifika Anahtarı İçeriği"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 #, fuzzy
 #, fuzzy
 msgid "SSL Certificate Key Path"
 msgid "SSL Certificate Key Path"
 msgstr "SSL Sertifikası Anahtar Yolu"
 msgstr "SSL Sertifikası Anahtar Yolu"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 #: src/views/preference/tabs/ServerSettings.vue:37
 #, fuzzy
 #, fuzzy
 msgid "SSL Certificate Path"
 msgid "SSL Certificate Path"
@@ -4430,7 +4554,7 @@ msgstr "Şununla senkronize et"
 msgid "Sync strategy"
 msgid "Sync strategy"
 msgstr "Senkronizasyon Sertifikası"
 msgstr "Senkronizasyon Sertifikası"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 #, fuzzy
 #, fuzzy
 msgid "Sync to"
 msgid "Sync to"
 msgstr "Şununla senkronize et"
 msgstr "Şununla senkronize et"
@@ -4514,12 +4638,12 @@ msgid ""
 "dashes, colons, and dots."
 "dashes, colons, and dots."
 msgstr "Model adı yalnızca harf, unicode, sayı, tire, çizgi ve nokta içermelidir."
 msgstr "Model adı yalnızca harf, unicode, sayı, tire, çizgi ve nokta içermelidir."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 #, fuzzy
 #, fuzzy
 msgid "The input is not a SSL Certificate"
 msgid "The input is not a SSL Certificate"
 msgstr "Giriş bir SSL Sertifikası değil"
 msgstr "Giriş bir SSL Sertifikası değil"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 #, fuzzy
 #, fuzzy
 msgid "The input is not a SSL Certificate Key"
 msgid "The input is not a SSL Certificate Key"
 msgstr "Girdi bir SSL Sertifika Anahtarı değil"
 msgstr "Girdi bir SSL Sertifika Anahtarı değil"
@@ -4554,12 +4678,12 @@ msgstr "Model adı yalnızca harf, unicode, sayı, tire, çizgi ve nokta içerme
 msgid "The parameter of server_name is required"
 msgid "The parameter of server_name is required"
 msgstr "server_name parametresi gereklidir"
 msgstr "server_name parametresi gereklidir"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 #, fuzzy
 #, fuzzy
 msgid "The path exists, but the file is not a certificate"
 msgid "The path exists, but the file is not a certificate"
 msgstr "Yol var, ancak dosya bir sertifika değil"
 msgstr "Yol var, ancak dosya bir sertifika değil"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:196
+#: src/views/certificate/CertificateEditor.vue:196
 #, fuzzy
 #, fuzzy
 msgid "The path exists, but the file is not a private key"
 msgid "The path exists, but the file is not a private key"
 msgstr "Yol var, ancak dosya bir özel anahtar değil"
 msgstr "Yol var, ancak dosya bir özel anahtar değil"
@@ -4625,19 +4749,19 @@ msgid ""
 "lose access to your account."
 "lose access to your account."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 #, fuzzy
 #, fuzzy
 msgid "This Auto Cert item is invalid, please remove it."
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr "Bu Otomatik Sertifika öğesi geçersizdir, lütfen kaldırın."
 msgstr "Bu Otomatik Sertifika öğesi geçersizdir, lütfen kaldırın."
 
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 #, fuzzy
 #, fuzzy
 msgid "This certificate is managed by Nginx UI"
 msgid "This certificate is managed by Nginx UI"
 msgstr "Bu sertifika Nginx UI tarafından yönetilir"
 msgstr "Bu sertifika Nginx UI tarafından yönetilir"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:165
-#: src/views/certificate/components/CertificateEditor.vue:179
-#: src/views/certificate/components/CertificateEditor.vue:194
+#: src/views/certificate/CertificateEditor.vue:165
+#: src/views/certificate/CertificateEditor.vue:179
+#: src/views/certificate/CertificateEditor.vue:194
 #, fuzzy
 #, fuzzy
 msgid "This field is required"
 msgid "This field is required"
 msgstr "Bu alan gereklidir"
 msgstr "Bu alan gereklidir"

+ 237 - 105
app/src/language/uk_UA/app.po

@@ -14,6 +14,101 @@ msgstr ""
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 "X-Generator: Weblate 5.11\n"
 "X-Generator: Weblate 5.11\n"
 
 
+#: src/language/generate.ts:19
+msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
+msgstr ""
+"[Nginx UI] Користувач ACME: %{name}, Електронна пошта: %{email}, Каталог "
+"CA: %{caDir}"
+
+#: src/language/generate.ts:13
+msgid "[Nginx UI] Backing up current certificate for later revocation"
+msgstr ""
+"[Nginx UI] Резервне копіювання поточного сертифіката для подальшого "
+"відкликання"
+
+#: src/language/generate.ts:28
+#, fuzzy
+msgid "[Nginx UI] Certificate renewed successfully"
+msgstr "Сертифікат успішно поновлено"
+
+#: src/language/generate.ts:8
+#, fuzzy
+msgid "[Nginx UI] Certificate successfully revoked"
+msgstr "Сертифікат успішно видалено"
+
+#: src/language/generate.ts:29
+msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgstr ""
+"[Nginx UI] Сертифікат використовувався для сервера, перезавантаження "
+"TLS-сертифіката сервера"
+
+#: src/language/generate.ts:24
+msgid "[Nginx UI] Creating client facilitates communication with the CA server"
+msgstr "[Nginx UI] Створення клієнта для спрощення зв’язку з сервером CA"
+
+#: src/language/generate.ts:12
+#, fuzzy
+msgid "[Nginx UI] Environment variables cleaned"
+msgstr "Змінні навколишнього середовища очищення"
+
+#: src/language/generate.ts:21
+msgid "[Nginx UI] Finished"
+msgstr "[Nginx UI] Завершено"
+
+#: src/language/generate.ts:4
+#, fuzzy
+msgid "[Nginx UI] Issued certificate successfully"
+msgstr "Сертифікат успішно видалено"
+
+#: src/language/generate.ts:14
+msgid "[Nginx UI] Obtaining certificate"
+msgstr "[Nginx UI] Отримання сертифіката"
+
+#: src/language/generate.ts:22
+msgid "[Nginx UI] Preparing for certificate revocation"
+msgstr "[Nginx UI] Підготовка до відкликання сертифіката"
+
+#: src/language/generate.ts:18
+msgid "[Nginx UI] Preparing lego configurations"
+msgstr "[Nginx UI] Підготовка конфігурацій lego"
+
+#: src/language/generate.ts:25
+msgid "[Nginx UI] Reloading nginx"
+msgstr "[Nginx UI] Перезавантаження nginx"
+
+#: src/language/generate.ts:16
+msgid "[Nginx UI] Revocation completed"
+msgstr "[Nginx UI] Відкликання завершено"
+
+#: src/language/generate.ts:7
+msgid "[Nginx UI] Revoking certificate"
+msgstr "[Nginx UI] Відкликання сертифіката"
+
+#: src/language/generate.ts:26
+msgid "[Nginx UI] Revoking old certificate"
+msgstr "[Nginx UI] Відкликання старого сертифіката"
+
+#: src/language/generate.ts:20
+msgid "[Nginx UI] Setting DNS01 challenge provider"
+msgstr "[Nginx UI] Налаштування провайдера виклику DNS01"
+
+#: src/language/generate.ts:6
+#, fuzzy
+msgid "[Nginx UI] Setting environment variables"
+msgstr "Змінні навколишнього середовища очищення"
+
+#: src/language/generate.ts:11
+msgid "[Nginx UI] Setting HTTP01 challenge provider"
+msgstr "[Nginx UI] Налаштування провайдера HTTP01-виклику"
+
+#: src/language/generate.ts:15
+msgid "[Nginx UI] Writing certificate private key to disk"
+msgstr "[Nginx UI] Запис приватного ключа сертифіката на диск"
+
+#: src/language/generate.ts:27
+msgid "[Nginx UI] Writing certificate to disk"
+msgstr "[Nginx UI] Запис сертифіката на диск"
+
 #: src/views/user/userColumns.tsx:32
 #: src/views/user/userColumns.tsx:32
 msgid "2FA"
 msgid "2FA"
 msgstr "2FA"
 msgstr "2FA"
@@ -105,7 +200,7 @@ msgstr "Додати стрім"
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "Успішно додано"
 msgstr "Успішно додано"
 
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgid "Additional"
 msgstr "Додатково"
 msgstr "Додатково"
 
 
@@ -132,7 +227,7 @@ msgstr "Усі коди відновлення використано"
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "Базова URL-адреса API"
 msgstr "Базова URL-адреса API"
 
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgid "API Document"
 msgstr "API Документація"
 msgstr "API Документація"
 
 
@@ -276,7 +371,7 @@ msgstr "Автоматичний"
 msgid "auto = CPU cores"
 msgid "auto = CPU cores"
 msgstr "Auto = CPU ядра"
 msgstr "Auto = CPU ядра"
 
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgid "Auto Refresh"
 msgstr "Автоматичне оновлення"
 msgstr "Автоматичне оновлення"
 
 
@@ -296,11 +391,9 @@ msgstr "\"Автоматичний перезапуск\""
 msgid "Automatically indexed from site and stream configurations."
 msgid "Automatically indexed from site and stream configurations."
 msgstr "\"Автоматично проіндексовано з конфігурацій сайту та потоку.\""
 msgstr "\"Автоматично проіндексовано з конфігурацій сайту та потоку.\""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:259
-#: src/views/config/ConfigEditor.vue:266
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
-#: src/views/nginx_log/NginxLog.vue:173
+#: src/views/certificate/CertificateEditor.vue:259
+#: src/views/config/ConfigEditor.vue:266 src/views/config/ConfigList.vue:112
+#: src/views/config/ConfigList.vue:195 src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/stream/components/StreamEditor.vue:106
 #: src/views/stream/components/StreamEditor.vue:106
 msgid "Back"
 msgid "Back"
@@ -502,98 +595,110 @@ msgstr "Термін дії сертифіката %{name} закінчитьс
 
 
 #: src/constants/errors/cert.ts:4
 #: src/constants/errors/cert.ts:4
 msgid "Certificate decode error"
 msgid "Certificate decode error"
-msgstr ""
+msgstr "Помилка декодування сертифіката"
 
 
 #: src/components/Notification/notifications.ts:29
 #: src/components/Notification/notifications.ts:29
 msgid "Certificate Expiration Notice"
 msgid "Certificate Expiration Notice"
-msgstr ""
+msgstr "Повідомлення про закінчення терміну дії сертифіката"
 
 
 #: src/components/Notification/notifications.ts:25
 #: src/components/Notification/notifications.ts:25
 msgid "Certificate Expired"
 msgid "Certificate Expired"
-msgstr ""
+msgstr "Термін дії сертифіката закінчився"
 
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
 #: src/components/Notification/notifications.ts:41
 msgid "Certificate Expiring Soon"
 msgid "Certificate Expiring Soon"
-msgstr ""
+msgstr "Сертифікат незабаром закінчується"
+
+#: src/language/generate.ts:5
+#, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "Помилка декодування сертифіката"
 
 
 #: src/constants/errors/cert.ts:5
 #: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgid "Certificate parse error"
-msgstr ""
+msgstr "Помилка аналізу сертифіката"
 
 
 #: src/constants/errors/cert.ts:8
 #: src/constants/errors/cert.ts:8
 msgid "Certificate path is empty"
 msgid "Certificate path is empty"
-msgstr ""
+msgstr "Шлях до сертифіката порожній"
 
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
 #: src/views/certificate/components/RemoveCert.vue:61
 msgid "Certificate removed successfully"
 msgid "Certificate removed successfully"
-msgstr ""
+msgstr "Сертифікат успішно видалено"
 
 
 #: src/views/preference/tabs/CertSettings.vue:27
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
 msgid "Certificate Renewal Interval"
-msgstr ""
+msgstr "Інтервал оновлення сертифіката"
 
 
 #: src/language/constants.ts:21
 #: src/language/constants.ts:21
 msgid "Certificate renewed successfully"
 msgid "Certificate renewed successfully"
-msgstr ""
+msgstr "Сертифікат успішно поновлено"
+
+#: src/language/generate.ts:10
+#, fuzzy
+msgid "Certificate revoked successfully"
+msgstr "Сертифікат успішно видалено"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:128
+#: src/views/certificate/CertificateEditor.vue:128
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
+#, fuzzy
 msgid "Certificate Status"
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
 msgid_plural "Certificates Status"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Статус сертифіката"
+msgstr[1] "Статус сертифіката"
+msgstr[2] "Статус сертифіката"
 
 
 #: src/routes/modules/certificates.ts:11
 #: src/routes/modules/certificates.ts:11
 #: src/views/certificate/CertificateList/Certificate.vue:14
 #: src/views/certificate/CertificateList/Certificate.vue:14
 msgid "Certificates"
 msgid "Certificates"
-msgstr ""
+msgstr "Сертифікати"
 
 
 #: src/routes/modules/certificates.ts:28
 #: src/routes/modules/certificates.ts:28
 msgid "Certificates List"
 msgid "Certificates List"
-msgstr ""
+msgstr "Список сертифікатів"
 
 
 #: src/components/AutoCertForm/AutoCertForm.vue:65
 #: src/components/AutoCertForm/AutoCertForm.vue:65
 msgid "Challenge Method"
 msgid "Challenge Method"
-msgstr ""
+msgstr "Метод перевірки"
 
 
 #: src/views/site/site_edit/components/Cert/ChangeCert.vue:49
 #: src/views/site/site_edit/components/Cert/ChangeCert.vue:49
 #: src/views/site/site_edit/components/Cert/ChangeCert.vue:53
 #: src/views/site/site_edit/components/Cert/ChangeCert.vue:53
 msgid "Change Certificate"
 msgid "Change Certificate"
-msgstr ""
+msgstr "Змінити сертифікат"
 
 
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
+#, fuzzy
 msgid "Changed Certificate"
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
 msgid_plural "Changed Certificates"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Змінено сертифікат"
+msgstr[1] "Змінено сертифікат"
+msgstr[2] "Змінено сертифікат"
 
 
 #: src/views/config/ConfigEditor.vue:322
 #: src/views/config/ConfigEditor.vue:322
 msgid "Changed Path"
 msgid "Changed Path"
-msgstr ""
+msgstr "Змінений шлях"
 
 
 #: src/views/environments/list/BatchUpgrader.vue:159
 #: src/views/environments/list/BatchUpgrader.vue:159
 #: src/views/system/Upgrade.vue:188
 #: src/views/system/Upgrade.vue:188
 msgid "Channel"
 msgid "Channel"
-msgstr ""
+msgstr "Канал"
 
 
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
 msgid "Chat"
-msgstr ""
+msgstr "Чат"
 
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
 msgid "Check"
 msgid "Check"
-msgstr ""
+msgstr "Перевірити"
 
 
 #: src/views/system/Upgrade.vue:185
 #: src/views/system/Upgrade.vue:185
 msgid "Check again"
 msgid "Check again"
-msgstr ""
+msgstr "Перевірте ще раз"
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:31
 #: src/components/SelfCheck/tasks/backend/index.ts:31
 msgid ""
 msgid ""
@@ -601,171 +706,182 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 "/var/run/docker.sock:/var/run/docker.sock`."
 msgstr ""
 msgstr ""
+"Перевірте, чи існує /var/run/docker.sock. Якщо ви використовуєте офіційний "
+"Docker-образ Nginx UI, переконайтеся, що сокет Docker підключено таким "
+"чином: `-v /var/run/docker.sock:/var/run/docker.sock`."
 
 
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 msgid ""
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 "prevents using Passkeys and clipboard features."
 msgstr ""
 msgstr ""
+"Перевірте, чи ввімкнено HTTPS. Використання HTTP поза localhost є "
+"небезпечним і блокує функції Passkeys та буфера обміну."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 msgid "Check if the nginx.conf includes the conf.d directory."
 msgid "Check if the nginx.conf includes the conf.d directory."
-msgstr ""
+msgstr "Перевірте, чи файл nginx.conf містить каталог conf.d."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgid "Check if the nginx.conf includes the sites-enabled directory."
-msgstr ""
+msgstr "Перевірте, чи включає файл nginx.conf каталог sites-enabled."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgid "Check if the nginx.conf includes the streams-enabled directory."
-msgstr ""
+msgstr "Перевірте, чи включає файл nginx.conf каталог streams-enabled."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 "nginx configuration directory."
 msgstr ""
 msgstr ""
+"Перевірте, чи знаходяться каталоги sites-available та sites-enabled у "
+"каталозі конфігурації nginx."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 "the nginx configuration directory."
 msgstr ""
 msgstr ""
+"Перевірте, чи каталоги streams-available та streams-enabled знаходяться в "
+"каталозі конфігурації nginx."
 
 
 #: src/constants/errors/crypto.ts:3
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "Зашифрований текст занадто короткий"
 
 
 #: src/language/constants.ts:13
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
 msgid "Cleaning environment variables"
-msgstr ""
+msgstr "Змінні навколишнього середовища очищення"
 
 
 #: src/components/ChatGPT/ChatGPT.vue:380
 #: src/components/ChatGPT/ChatGPT.vue:380
 #: src/components/Notification/Notification.vue:140
 #: src/components/Notification/Notification.vue:140
 #: src/views/notification/Notification.vue:44
 #: src/views/notification/Notification.vue:44
 msgid "Clear"
 msgid "Clear"
-msgstr ""
+msgstr "Чіткий"
 
 
 #: src/components/Notification/Notification.vue:93
 #: src/components/Notification/Notification.vue:93
 #: src/views/notification/Notification.vue:13
 #: src/views/notification/Notification.vue:13
 msgid "Cleared successfully"
 msgid "Cleared successfully"
-msgstr ""
+msgstr "Успішно очищено"
 
 
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
 msgid "Click or drag backup file to this area to upload"
 msgstr ""
 msgstr ""
+"Клацніть або перетягніть файл резервного копіювання в цю область, щоб "
+"завантажити"
 
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
 msgid "Click to copy"
-msgstr ""
+msgstr "Клацніть, щоб скопіювати"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "Розмір буфера кузова клієнта"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "Розмір буфера заголовків клієнта"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "Максимальний розмір тіла клієнта"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 msgid "Client request body buffer size"
 msgid "Client request body buffer size"
-msgstr ""
+msgstr "Розмір буфера тіла запиту клієнта"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 msgid "Client request header buffer size"
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "Розмір буфера заголовка запиту клієнта"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
 msgid "Close"
-msgstr ""
+msgstr "Закрити"
 
 
 #: src/constants/errors/llm.ts:2
 #: src/constants/errors/llm.ts:2
 msgid "Code completion is not enabled"
 msgid "Code completion is not enabled"
-msgstr ""
+msgstr "Автозавершення коду не ввімкнено"
 
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
 msgid "Code Completion Model"
-msgstr ""
+msgstr "Модель автодоповнення коду"
 
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
 msgid "Command"
-msgstr ""
+msgstr "Команда"
 
 
 #: src/constants/errors/docker.ts:6
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr ""
+msgstr "Команда завершилася з неочікуваним кодом виходу: {0}, помилка: {1}"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
 #: src/components/NgxConfigEditor/LocationEditor.vue:135
 #: src/components/NgxConfigEditor/LocationEditor.vue:135
 #: src/components/NgxConfigEditor/NgxServer.vue:91
 #: src/components/NgxConfigEditor/NgxServer.vue:91
 msgid "Comments"
 msgid "Comments"
-msgstr ""
+msgstr "Коментарі"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
 msgid "Compare"
-msgstr ""
+msgstr "Порівнювати"
 
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #: src/components/ConfigHistory/DiffViewer.vue:388
 msgid "Compare Configurations"
 msgid "Compare Configurations"
-msgstr ""
+msgstr "Порівняйте конфігурації"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
 msgid "Compare Selected"
-msgstr ""
+msgstr "Порівняйте вибрані"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
 msgid "Compare with Current"
-msgstr ""
+msgstr "Порівняйте з струмом"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 msgid "Compression level, 1 is lowest, 9 is highest"
 msgid "Compression level, 1 is lowest, 9 is highest"
-msgstr ""
+msgstr "Рівень стиснення, 1 найнижчий, 9 - найвищий"
 
 
 #: src/constants/errors/backup.ts:14
 #: src/constants/errors/backup.ts:14
 msgid "Config path is empty"
 msgid "Config path is empty"
-msgstr ""
+msgstr "Конфігурація порожній"
 
 
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:36
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:36
 msgid "Config Template"
 msgid "Config Template"
-msgstr ""
+msgstr "Шаблон конфігурації"
 
 
 #: src/views/config/InspectConfig.vue:27
 #: src/views/config/InspectConfig.vue:27
 msgid "Configuration file is test successful"
 msgid "Configuration file is test successful"
-msgstr ""
+msgstr "Файл конфігурації успішно протестовано"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:138
 #: src/components/ConfigHistory/ConfigHistory.vue:138
 msgid "Configuration History"
 msgid "Configuration History"
-msgstr ""
+msgstr "Історія конфігурації"
 
 
 #: src/views/dashboard/components/PerformanceTablesCard.vue:167
 #: src/views/dashboard/components/PerformanceTablesCard.vue:167
 msgid "Configuration information"
 msgid "Configuration information"
-msgstr ""
+msgstr "Інформація про конфігурацію"
 
 
 #: src/views/site/site_add/SiteAdd.vue:85
 #: src/views/site/site_add/SiteAdd.vue:85
 msgid "Configuration Name"
 msgid "Configuration Name"
-msgstr ""
+msgstr "Назва конфігурації"
 
 
 #: src/views/config/ConfigList.vue:104
 #: src/views/config/ConfigList.vue:104
 msgid "Configurations"
 msgid "Configurations"
-msgstr ""
+msgstr "Конфігурації"
 
 
 #: src/views/site/site_add/SiteAdd.vue:80
 #: src/views/site/site_add/SiteAdd.vue:80
 msgid "Configure SSL"
 msgid "Configure SSL"
-msgstr ""
+msgstr "Налаштувати SSL"
 
 
 #: src/views/dashboard/Environments.vue:141
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
 msgid "Connected"
-msgstr ""
+msgstr "Підключено"
 
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "Помилка з'єднання, спроба повторного підключення..."
 
 
 #: src/views/terminal/Terminal.vue:142
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
 msgid "Connection lost, please refresh the page."
@@ -773,36 +889,36 @@ msgstr "З'єднання, будь ласка, оновіть сторінку.
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
 msgid "Connection timeout period"
-msgstr ""
+msgstr "Період таймауту з'єднання"
 
 
 #: src/constants/errors/docker.ts:7
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
 msgid "Container status unknown"
-msgstr ""
+msgstr "Стан контейнера невідомий"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
 #: src/components/NgxConfigEditor/LocationEditor.vue:144
 #: src/components/NgxConfigEditor/LocationEditor.vue:144
 msgid "Content"
 msgid "Content"
-msgstr ""
+msgstr "Вміст"
 
 
 #: src/components/SensitiveString/SensitiveString.vue:37
 #: src/components/SensitiveString/SensitiveString.vue:37
 #: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
 #: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 msgid "Copied"
 msgid "Copied"
-msgstr ""
+msgstr "Скопійовано"
 
 
 #: src/views/system/Backup/BackupCreator.vue:128
 #: src/views/system/Backup/BackupCreator.vue:128
 msgid "Copied!"
 msgid "Copied!"
-msgstr ""
+msgstr "Скопійовано!"
 
 
 #: src/components/SensitiveString/SensitiveString.vue:37
 #: src/components/SensitiveString/SensitiveString.vue:37
 #: src/views/system/Backup/BackupCreator.vue:128
 #: src/views/system/Backup/BackupCreator.vue:128
 msgid "Copy"
 msgid "Copy"
-msgstr ""
+msgstr "Копіювати"
 
 
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 msgid "Copy Codes"
 msgid "Copy Codes"
-msgstr ""
+msgstr "Копіювати коди"
 
 
 #: src/views/system/Upgrade.vue:146
 #: src/views/system/Upgrade.vue:146
 msgid "Core Upgrade"
 msgid "Core Upgrade"
@@ -870,7 +986,7 @@ msgstr ""
 msgid "Credential"
 msgid "Credential"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgid "Credentials"
 msgstr ""
 msgstr ""
 
 
@@ -1143,7 +1259,7 @@ msgid "DNS Credentials"
 msgstr ""
 msgstr ""
 
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgid "DNS Provider"
 msgstr ""
 msgstr ""
 
 
@@ -1192,6 +1308,10 @@ msgstr ""
 msgid "Docker Socket"
 msgid "Docker Socket"
 msgstr ""
 msgstr ""
 
 
+#: src/constants/errors/self_check.ts:15
+msgid "Docker socket not exist"
+msgstr ""
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 msgid "Document"
 msgid "Document"
@@ -1204,7 +1324,7 @@ msgstr[2] ""
 msgid "Domain"
 msgid "Domain"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:112
+#: src/views/certificate/CertificateEditor.vue:112
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr ""
 msgstr ""
 
 
@@ -1449,7 +1569,7 @@ msgstr ""
 msgid "External Notify"
 msgid "External Notify"
 msgstr ""
 msgstr ""
 
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 msgid "Fail to obtain certificate"
 msgid "Fail to obtain certificate"
 msgstr ""
 msgstr ""
 
 
@@ -1581,6 +1701,10 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgid "Failed to delete certificate"
 msgstr ""
 msgstr ""
 
 
+#: src/language/generate.ts:9
+msgid "Failed to delete certificate from database: %{error}"
+msgstr ""
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
 #: src/views/stream/StreamList.vue:102
@@ -1721,6 +1845,10 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgid "Failed to revoke certificate"
 msgstr ""
 msgstr ""
 
 
+#: src/language/generate.ts:17
+msgid "Failed to revoke certificate: %{error}"
+msgstr ""
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 msgid "Failed to save Nginx performance settings"
 msgid "Failed to save Nginx performance settings"
 msgstr ""
 msgstr ""
@@ -1757,7 +1885,7 @@ msgstr ""
 msgid "Filename is empty"
 msgid "Filename is empty"
 msgstr ""
 msgstr ""
 
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgid "Filter"
 msgstr ""
 msgstr ""
 
 
@@ -1933,7 +2061,7 @@ msgid "Import"
 msgstr ""
 msgstr ""
 
 
 #: src/routes/modules/certificates.ts:46
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgid "Import Certificate"
 msgstr ""
 msgstr ""
 
 
@@ -2150,8 +2278,8 @@ msgstr ""
 msgid "Leave blank if you don't need this."
 msgid "Leave blank if you don't need this."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:223
-#: src/views/certificate/components/CertificateEditor.vue:237
+#: src/views/certificate/CertificateEditor.vue:223
+#: src/views/certificate/CertificateEditor.vue:237
 msgid "Leave blank will not change anything"
 msgid "Leave blank will not change anything"
 msgstr ""
 msgstr ""
 
 
@@ -2222,10 +2350,14 @@ msgstr ""
 msgid "Locations"
 msgid "Locations"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 msgid "Log"
 msgstr ""
 msgstr ""
 
 
+#: src/language/generate.ts:23
+msgid "Log file %{log_path} is not a regular file. "
+msgstr ""
+
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 msgid "Log List"
 msgid "Log List"
 msgstr ""
 msgstr ""
@@ -2413,7 +2545,7 @@ msgid "Modify"
 msgstr ""
 msgstr ""
 
 
 #: src/routes/modules/certificates.ts:36
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgid "Modify Certificate"
 msgstr ""
 msgstr ""
 
 
@@ -2431,8 +2563,8 @@ msgstr ""
 
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:10
 #: src/views/certificate/CertificateList/certColumns.tsx:10
-#: src/views/certificate/components/CertificateEditor.vue:162
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2586,7 +2718,7 @@ msgstr ""
 msgid "Nginx is running"
 msgid "Nginx is running"
 msgstr ""
 msgstr ""
 
 
-#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:143
+#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:144
 msgid "Nginx Log"
 msgid "Nginx Log"
 msgstr ""
 msgstr ""
 
 
@@ -3394,7 +3526,7 @@ msgstr ""
 #: src/views/certificate/components/RenewCert.vue:27
 #: src/views/certificate/components/RenewCert.vue:27
 #: src/views/certificate/components/WildcardCertificate.vue:46
 #: src/views/certificate/components/WildcardCertificate.vue:46
 msgid "Renew successfully"
 msgid "Renew successfully"
-msgstr ""
+msgstr "Оновлення успішне"
 
 
 #: src/views/dashboard/components/PerformanceTablesCard.vue:141
 #: src/views/dashboard/components/PerformanceTablesCard.vue:141
 msgid "Request statistics"
 msgid "Request statistics"
@@ -3532,7 +3664,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
-#: src/views/certificate/components/CertificateEditor.vue:266
+#: src/views/certificate/CertificateEditor.vue:266
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
@@ -3589,7 +3721,7 @@ msgstr ""
 
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #: src/views/preference/store/index.ts:118
 msgid "Save successfully"
 msgid "Save successfully"
 msgstr ""
 msgstr ""
@@ -3604,7 +3736,7 @@ msgstr ""
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgid "SDK"
 msgstr ""
 msgstr ""
 
 
@@ -3773,7 +3905,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgid "SSL Certificate Content"
 msgstr ""
 msgstr ""
 
 
@@ -3785,15 +3917,15 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgid "SSL certificate file not found"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgid "SSL Certificate Key Content"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgid "SSL Certificate Key Path"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgid "SSL Certificate Path"
 msgstr ""
 msgstr ""
@@ -3956,7 +4088,7 @@ msgstr ""
 msgid "Sync strategy"
 msgid "Sync strategy"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgid "Sync to"
 msgstr ""
 msgstr ""
 
 
@@ -4024,11 +4156,11 @@ msgid ""
 "dashes, colons, and dots."
 "dashes, colons, and dots."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgid "The input is not a SSL Certificate"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgid "The input is not a SSL Certificate Key"
 msgstr ""
 msgstr ""
 
 
@@ -4059,11 +4191,11 @@ msgstr ""
 msgid "The parameter of server_name is required"
 msgid "The parameter of server_name is required"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 msgid "The path exists, but the file is not a certificate"
 msgid "The path exists, but the file is not a certificate"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:196
+#: src/views/certificate/CertificateEditor.vue:196
 msgid "The path exists, but the file is not a private key"
 msgid "The path exists, but the file is not a private key"
 msgstr ""
 msgstr ""
 
 
@@ -4115,17 +4247,17 @@ msgid ""
 "lose access to your account."
 "lose access to your account."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 msgid "This certificate is managed by Nginx UI"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:165
-#: src/views/certificate/components/CertificateEditor.vue:179
-#: src/views/certificate/components/CertificateEditor.vue:194
+#: src/views/certificate/CertificateEditor.vue:165
+#: src/views/certificate/CertificateEditor.vue:179
+#: src/views/certificate/CertificateEditor.vue:194
 msgid "This field is required"
 msgid "This field is required"
 msgstr ""
 msgstr ""
 
 
@@ -4555,7 +4687,7 @@ msgstr ""
 #: src/views/preference/tabs/AuthSettings.vue:163
 #: src/views/preference/tabs/AuthSettings.vue:163
 #: src/views/preference/tabs/CertSettings.vue:72
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgid "Yes"
-msgstr ""
+msgstr "Так"
 
 
 #: src/views/terminal/Terminal.vue:135
 #: src/views/terminal/Terminal.vue:135
 msgid ""
 msgid ""

+ 199 - 79
app/src/language/vi_VN/app.po

@@ -9,6 +9,98 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 
+#: src/language/generate.ts:19
+msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
+msgstr "[Nginx UI] Người dùng ACME: %{name}, Email: %{email}, Thư mục CA: %{caDir}"
+
+#: src/language/generate.ts:13
+msgid "[Nginx UI] Backing up current certificate for later revocation"
+msgstr "[Nginx UI] Đang sao lưu chứng chỉ hiện tại để thu hồi sau này"
+
+#: src/language/generate.ts:28
+#, fuzzy
+msgid "[Nginx UI] Certificate renewed successfully"
+msgstr "Đã xóa thành công"
+
+#: src/language/generate.ts:8
+#, fuzzy
+msgid "[Nginx UI] Certificate successfully revoked"
+msgstr "Restart Nginx thành công"
+
+#: src/language/generate.ts:29
+msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgstr ""
+"[Nginx UI] Chứng chỉ đã được sử dụng cho máy chủ, đang tải lại chứng chỉ "
+"TLS của máy chủ"
+
+#: src/language/generate.ts:24
+#, fuzzy
+msgid "[Nginx UI] Creating client facilitates communication with the CA server"
+msgstr "Tạo client để giao tiếp với CA server"
+
+#: src/language/generate.ts:12
+#, fuzzy
+msgid "[Nginx UI] Environment variables cleaned"
+msgstr "Đặt biến môi trường"
+
+#: src/language/generate.ts:21
+msgid "[Nginx UI] Finished"
+msgstr "[Nginx UI] Đã hoàn thành"
+
+#: src/language/generate.ts:4
+#, fuzzy
+msgid "[Nginx UI] Issued certificate successfully"
+msgstr "Cấp chứng chỉ thành công"
+
+#: src/language/generate.ts:14
+msgid "[Nginx UI] Obtaining certificate"
+msgstr "[Nginx UI] Đang lấy chứng chỉ"
+
+#: src/language/generate.ts:22
+msgid "[Nginx UI] Preparing for certificate revocation"
+msgstr "[Nginx UI] Chuẩn bị thu hồi chứng chỉ"
+
+#: src/language/generate.ts:18
+msgid "[Nginx UI] Preparing lego configurations"
+msgstr "[Nginx UI] Đang chuẩn bị cấu hình lego"
+
+#: src/language/generate.ts:25
+msgid "[Nginx UI] Reloading nginx"
+msgstr "[Nginx UI] Đang tải lại nginx"
+
+#: src/language/generate.ts:16
+msgid "[Nginx UI] Revocation completed"
+msgstr "[Nginx UI] Đã hoàn tất thu hồi"
+
+#: src/language/generate.ts:7
+msgid "[Nginx UI] Revoking certificate"
+msgstr "[Nginx UI] Đang thu hồi chứng chỉ"
+
+#: src/language/generate.ts:26
+msgid "[Nginx UI] Revoking old certificate"
+msgstr "[Nginx UI] Đang thu hồi chứng chỉ cũ"
+
+#: src/language/generate.ts:20
+msgid "[Nginx UI] Setting DNS01 challenge provider"
+msgstr "[Nginx UI] Đang thiết lập nhà cung cấp thử thách DNS01"
+
+#: src/language/generate.ts:6
+#, fuzzy
+msgid "[Nginx UI] Setting environment variables"
+msgstr "Đặt biến môi trường"
+
+#: src/language/generate.ts:11
+msgid "[Nginx UI] Setting HTTP01 challenge provider"
+msgstr "[Nginx UI] Đang thiết lập nhà cung cấp thử thách HTTP01"
+
+#: src/language/generate.ts:15
+msgid "[Nginx UI] Writing certificate private key to disk"
+msgstr "[Nginx UI] Đang ghi khóa riêng của chứng chỉ vào ổ đĩa"
+
+#: src/language/generate.ts:27
+msgid "[Nginx UI] Writing certificate to disk"
+msgstr "[Nginx UI] Đang ghi chứng chỉ vào ổ đĩa"
+
 #: src/views/user/userColumns.tsx:32
 #: src/views/user/userColumns.tsx:32
 msgid "2FA"
 msgid "2FA"
 msgstr "2fa"
 msgstr "2fa"
@@ -105,7 +197,7 @@ msgstr "Thêm Website"
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "Cập nhật thành công"
 msgstr "Cập nhật thành công"
 
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 #, fuzzy
 #, fuzzy
 msgid "Additional"
 msgid "Additional"
 msgstr "Tùy chọn bổ sung"
 msgstr "Tùy chọn bổ sung"
@@ -133,7 +225,7 @@ msgstr "Tất cả mã khôi phục đã được sử dụng"
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "URL Cơ sở API"
 msgstr "URL Cơ sở API"
 
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgid "API Document"
 msgstr "Tài liệu API"
 msgstr "Tài liệu API"
 
 
@@ -291,7 +383,7 @@ msgstr "Tự động"
 msgid "auto = CPU cores"
 msgid "auto = CPU cores"
 msgstr "auto = lõi cpu"
 msgstr "auto = lõi cpu"
 
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgid "Auto Refresh"
 msgstr "Tự động làm mới"
 msgstr "Tự động làm mới"
 
 
@@ -311,11 +403,9 @@ msgstr "\"Khởi động lại Tự động\""
 msgid "Automatically indexed from site and stream configurations."
 msgid "Automatically indexed from site and stream configurations."
 msgstr "\"Được lập chỉ mục tự động từ cấu hình trang web và luồng.\""
 msgstr "\"Được lập chỉ mục tự động từ cấu hình trang web và luồng.\""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:259
-#: src/views/config/ConfigEditor.vue:266
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
-#: src/views/nginx_log/NginxLog.vue:173
+#: src/views/certificate/CertificateEditor.vue:259
+#: src/views/config/ConfigEditor.vue:266 src/views/config/ConfigList.vue:112
+#: src/views/config/ConfigList.vue:195 src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/stream/components/StreamEditor.vue:106
 #: src/views/stream/components/StreamEditor.vue:106
 msgid "Back"
 msgid "Back"
@@ -525,42 +615,40 @@ msgid "Certificate %{name} will expire in 1 day"
 msgstr "Chứng chỉ %{name} sẽ hết hạn trong 1 ngày"
 msgstr "Chứng chỉ %{name} sẽ hết hạn trong 1 ngày"
 
 
 #: src/constants/errors/cert.ts:4
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 msgid "Certificate decode error"
 msgid "Certificate decode error"
-msgstr "Gia hạn chứng chỉ SSL thất bại"
+msgstr "Lỗi giải mã chứng chỉ"
 
 
 #: src/components/Notification/notifications.ts:29
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
 msgid "Certificate Expiration Notice"
-msgstr "Mẫu Cấu hình"
+msgstr "Thông báo hết hạn chứng chỉ"
 
 
 #: src/components/Notification/notifications.ts:25
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
 msgid "Certificate Expired"
-msgstr "Danh sách chứng chỉ"
+msgstr "Chứng chỉ đã hết hạn"
 
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 msgid "Certificate Expiring Soon"
 msgid "Certificate Expiring Soon"
-msgstr "Chứng chỉ đã hết hạn"
+msgstr "Chứng chỉ sắp hết hạn"
 
 
-#: src/constants/errors/cert.ts:5
+#: src/language/generate.ts:5
 #, fuzzy
 #, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "Lỗi giải mã chứng chỉ"
+
+#: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgid "Certificate parse error"
-msgstr "Chứng chỉ đã hết hạn"
+msgstr "Lỗi phân tích chứng chỉ"
 
 
 #: src/constants/errors/cert.ts:8
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 msgid "Certificate path is empty"
 msgid "Certificate path is empty"
-msgstr "Mẫu Cấu hình"
+msgstr "Đường dẫn chứng chỉ trống"
 
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
 #: src/views/certificate/components/RemoveCert.vue:61
-#, fuzzy
 msgid "Certificate removed successfully"
 msgid "Certificate removed successfully"
-msgstr "Đã xóa thành công"
+msgstr "Đã xóa chứng chỉ thành công"
 
 
 #: src/views/preference/tabs/CertSettings.vue:27
 #: src/views/preference/tabs/CertSettings.vue:27
 #, fuzzy
 #, fuzzy
@@ -572,7 +660,12 @@ msgstr "Chứng chỉ SSL hợp lệ"
 msgid "Certificate renewed successfully"
 msgid "Certificate renewed successfully"
 msgstr "Đã xóa thành công"
 msgstr "Đã xóa thành công"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:128
+#: src/language/generate.ts:10
+#, fuzzy
+msgid "Certificate revoked successfully"
+msgstr "Đã xóa chứng chỉ thành công"
+
+#: src/views/certificate/CertificateEditor.vue:128
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #, fuzzy
 #, fuzzy
 msgid "Certificate Status"
 msgid "Certificate Status"
@@ -621,7 +714,7 @@ msgstr "Kênh"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
 msgid "Chat"
-msgstr ""
+msgstr "Trò chuyện"
 
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -639,40 +732,49 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 "/var/run/docker.sock:/var/run/docker.sock`."
 msgstr ""
 msgstr ""
+"Kiểm tra xem /var/run/docker.sock có tồn tại không. Nếu bạn đang sử dụng "
+"Docker Image chính thức của Nginx UI, hãy đảm bảo rằng ổ cắm Docker được "
+"gắn như sau: `-v /var/run/docker.sock:/var/run/docker.sock`."
 
 
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 msgid ""
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 "prevents using Passkeys and clipboard features."
 msgstr ""
 msgstr ""
+"Kiểm tra xem HTTPS đã được bật chưa. Sử dụng HTTP bên ngoài localhost không "
+"an toàn và ngăn chặn việc sử dụng tính năng Passkeys cùng khay nhớ tạm."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 msgid "Check if the nginx.conf includes the conf.d directory."
 msgid "Check if the nginx.conf includes the conf.d directory."
-msgstr ""
+msgstr "Kiểm tra xem tệp nginx.conf có bao gồm thư mục conf.d không."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 #: src/components/SelfCheck/tasks/backend/index.ts:16
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgid "Check if the nginx.conf includes the sites-enabled directory."
-msgstr ""
+msgstr "Kiểm tra xem tệp nginx.conf có bao gồm thư mục sites-enabled không."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgid "Check if the nginx.conf includes the streams-enabled directory."
-msgstr ""
+msgstr "Kiểm tra xem tệp nginx.conf có bao gồm thư mục streams-enabled không."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 "nginx configuration directory."
 msgstr ""
 msgstr ""
+"Kiểm tra xem các thư mục sites-available và sites-enabled có nằm trong thư "
+"mục cấu hình nginx hay không."
 
 
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 "the nginx configuration directory."
 msgstr ""
 msgstr ""
+"Kiểm tra xem các thư mục streams-available và streams-enabled có nằm trong "
+"thư mục cấu hình nginx hay không."
 
 
 #: src/constants/errors/crypto.ts:3
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "Văn bản mã hóa quá ngắn"
 
 
 #: src/language/constants.ts:13
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
 msgid "Cleaning environment variables"
@@ -693,43 +795,43 @@ msgstr "Đã xóa thành công"
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
 msgid "Click or drag backup file to this area to upload"
-msgstr ""
+msgstr "Nhấp hoặc kéo tệp sao lưu vào khu vực này để tải lên"
 
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
 msgid "Click to copy"
-msgstr ""
+msgstr "Bấm để sao chép"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "Kích thước bộ đệm thân máy khách"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "Kích thước bộ đệm tiêu đề máy khách"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "Kích thước tối đa của phần thân máy khách"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 msgid "Client request body buffer size"
 msgid "Client request body buffer size"
-msgstr ""
+msgstr "Kích thước bộ đệm nội dung yêu cầu của máy khách"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 msgid "Client request header buffer size"
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "Kích thước bộ đệm tiêu đề yêu cầu của máy khách"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
 msgid "Close"
-msgstr ""
+msgstr "Đóng"
 
 
 #: src/constants/errors/llm.ts:2
 #: src/constants/errors/llm.ts:2
 msgid "Code completion is not enabled"
 msgid "Code completion is not enabled"
-msgstr ""
+msgstr "Hoàn thành mã không được bật"
 
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
 msgid "Code Completion Model"
-msgstr ""
+msgstr "Mô hình hoàn thành mã"
 
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #, fuzzy
 #, fuzzy
@@ -738,7 +840,7 @@ msgstr "Bình luận"
 
 
 #: src/constants/errors/docker.ts:6
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr ""
+msgstr "Lệnh thoát với mã lỗi không mong muốn: {0}, lỗi: {1}"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
@@ -749,7 +851,7 @@ msgstr "Bình luận"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
 msgid "Compare"
-msgstr ""
+msgstr "So sánh"
 
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
 #, fuzzy
@@ -758,15 +860,15 @@ msgstr "Cấu hình"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
 msgid "Compare Selected"
-msgstr ""
+msgstr "So sánh đã chọn"
 
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
 msgid "Compare with Current"
-msgstr ""
+msgstr "So sánh với hiện tại"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 msgid "Compression level, 1 is lowest, 9 is highest"
 msgid "Compression level, 1 is lowest, 9 is highest"
-msgstr ""
+msgstr "Mức nén, 1 là thấp nhất, 9 là cao nhất"
 
 
 #: src/constants/errors/backup.ts:14
 #: src/constants/errors/backup.ts:14
 #, fuzzy
 #, fuzzy
@@ -810,7 +912,7 @@ msgstr "Đã kết nối"
 
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "Lỗi kết nối, đang thử kết nối lại..."
 
 
 #: src/views/terminal/Terminal.vue:142
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
 msgid "Connection lost, please refresh the page."
@@ -818,11 +920,11 @@ msgstr "Kết nối bị mất, xin vui lòng làm mới trang."
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
 msgid "Connection timeout period"
-msgstr ""
+msgstr "Khoảng thời gian chờ kết nối"
 
 
 #: src/constants/errors/docker.ts:7
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
 msgid "Container status unknown"
-msgstr ""
+msgstr "Trạng thái container không xác định"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -834,20 +936,20 @@ msgstr "Nội dung"
 #: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
 #: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 msgid "Copied"
 msgid "Copied"
-msgstr ""
+msgstr "Đã sao chép"
 
 
 #: src/views/system/Backup/BackupCreator.vue:128
 #: src/views/system/Backup/BackupCreator.vue:128
 msgid "Copied!"
 msgid "Copied!"
-msgstr ""
+msgstr "Đã sao chép!"
 
 
 #: src/components/SensitiveString/SensitiveString.vue:37
 #: src/components/SensitiveString/SensitiveString.vue:37
 #: src/views/system/Backup/BackupCreator.vue:128
 #: src/views/system/Backup/BackupCreator.vue:128
 msgid "Copy"
 msgid "Copy"
-msgstr ""
+msgstr "Sao chép"
 
 
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 msgid "Copy Codes"
 msgid "Copy Codes"
-msgstr ""
+msgstr "Sao chép mã"
 
 
 #: src/views/system/Upgrade.vue:146
 #: src/views/system/Upgrade.vue:146
 msgid "Core Upgrade"
 msgid "Core Upgrade"
@@ -920,7 +1022,7 @@ msgstr "Tạo client để giao tiếp với CA server"
 msgid "Credential"
 msgid "Credential"
 msgstr "Chứng chỉ"
 msgstr "Chứng chỉ"
 
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgid "Credentials"
 msgstr "Chứng chỉ"
 msgstr "Chứng chỉ"
 
 
@@ -1222,7 +1324,7 @@ msgid "DNS Credentials"
 msgstr "Xác thực DNS"
 msgstr "Xác thực DNS"
 
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgid "DNS Provider"
 msgstr "Nhà cung cấp DNS"
 msgstr "Nhà cung cấp DNS"
 
 
@@ -1277,6 +1379,10 @@ msgstr ""
 msgid "Docker Socket"
 msgid "Docker Socket"
 msgstr ""
 msgstr ""
 
 
+#: src/constants/errors/self_check.ts:15
+msgid "Docker socket not exist"
+msgstr ""
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #, fuzzy
 #, fuzzy
@@ -1289,7 +1395,7 @@ msgstr[1] "Bình luận"
 msgid "Domain"
 msgid "Domain"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:112
+#: src/views/certificate/CertificateEditor.vue:112
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr ""
 msgstr ""
 "Danh sách tên miền rỗng, hãy thử mở lại chức năng Tạo chứng chỉ tự động cho "
 "Danh sách tên miền rỗng, hãy thử mở lại chức năng Tạo chứng chỉ tự động cho "
@@ -1561,7 +1667,7 @@ msgstr ""
 msgid "External Notify"
 msgid "External Notify"
 msgstr ""
 msgstr ""
 
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 #, fuzzy
 #, fuzzy
 msgid "Fail to obtain certificate"
 msgid "Fail to obtain certificate"
 msgstr "Nhận chứng chỉ"
 msgstr "Nhận chứng chỉ"
@@ -1715,6 +1821,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgid "Failed to delete certificate"
 msgstr "Nhận chứng chỉ"
 msgstr "Nhận chứng chỉ"
 
 
+#: src/language/generate.ts:9
+#, fuzzy
+msgid "Failed to delete certificate from database: %{error}"
+msgstr "Nhận chứng chỉ"
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
 #: src/views/stream/StreamList.vue:102
@@ -1878,6 +1989,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgid "Failed to revoke certificate"
 msgstr "Nhận chứng chỉ"
 msgstr "Nhận chứng chỉ"
 
 
+#: src/language/generate.ts:17
+#, fuzzy
+msgid "Failed to revoke certificate: %{error}"
+msgstr "Nhận chứng chỉ"
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #, fuzzy
 #, fuzzy
 msgid "Failed to save Nginx performance settings"
 msgid "Failed to save Nginx performance settings"
@@ -1917,7 +2033,7 @@ msgstr "Không tìm thấy tệp tin"
 msgid "Filename is empty"
 msgid "Filename is empty"
 msgstr ""
 msgstr ""
 
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgid "Filter"
 msgstr "Lọc"
 msgstr "Lọc"
 
 
@@ -2102,7 +2218,7 @@ msgid "Import"
 msgstr "Xuất"
 msgstr "Xuất"
 
 
 #: src/routes/modules/certificates.ts:46
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 #, fuzzy
 #, fuzzy
 msgid "Import Certificate"
 msgid "Import Certificate"
 msgstr "Chứng chỉ"
 msgstr "Chứng chỉ"
@@ -2337,8 +2453,8 @@ msgstr "Bỏ trống nếu không thay đổi"
 msgid "Leave blank if you don't need this."
 msgid "Leave blank if you don't need this."
 msgstr "Bỏ trống nếu không thay đổi"
 msgstr "Bỏ trống nếu không thay đổi"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:223
-#: src/views/certificate/components/CertificateEditor.vue:237
+#: src/views/certificate/CertificateEditor.vue:223
+#: src/views/certificate/CertificateEditor.vue:237
 #, fuzzy
 #, fuzzy
 msgid "Leave blank will not change anything"
 msgid "Leave blank will not change anything"
 msgstr "Bỏ trống nếu không thay đổi"
 msgstr "Bỏ trống nếu không thay đổi"
@@ -2415,11 +2531,15 @@ msgstr "Location"
 msgid "Locations"
 msgid "Locations"
 msgstr "Locations"
 msgstr "Locations"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 #, fuzzy
 #, fuzzy
 msgid "Log"
 msgid "Log"
 msgstr "Log"
 msgstr "Log"
 
 
+#: src/language/generate.ts:23
+msgid "Log file %{log_path} is not a regular file. "
+msgstr ""
+
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 msgid "Log List"
 msgid "Log List"
 msgstr ""
 msgstr ""
@@ -2621,7 +2741,7 @@ msgid "Modify"
 msgstr "Sửa"
 msgstr "Sửa"
 
 
 #: src/routes/modules/certificates.ts:36
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 #, fuzzy
 #, fuzzy
 msgid "Modify Certificate"
 msgid "Modify Certificate"
 msgstr "Sửa chứng chỉ"
 msgstr "Sửa chứng chỉ"
@@ -2642,8 +2762,8 @@ msgstr "Single Directive"
 
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:10
 #: src/views/certificate/CertificateList/certColumns.tsx:10
-#: src/views/certificate/components/CertificateEditor.vue:162
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2806,7 +2926,7 @@ msgstr ""
 msgid "Nginx is running"
 msgid "Nginx is running"
 msgstr ""
 msgstr ""
 
 
-#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:143
+#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:144
 msgid "Nginx Log"
 msgid "Nginx Log"
 msgstr ""
 msgstr ""
 
 
@@ -3832,7 +3952,7 @@ msgstr "Running"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
-#: src/views/certificate/components/CertificateEditor.vue:266
+#: src/views/certificate/CertificateEditor.vue:266
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
@@ -3897,7 +4017,7 @@ msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #: src/views/preference/store/index.ts:118
 #, fuzzy
 #, fuzzy
 msgid "Save successfully"
 msgid "Save successfully"
@@ -3913,7 +4033,7 @@ msgstr "Lưu thành công"
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgid "SDK"
 msgstr ""
 msgstr ""
 
 
@@ -4093,7 +4213,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgid "SSL Certificate Content"
 msgstr ""
 msgstr ""
 
 
@@ -4106,15 +4226,15 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgid "SSL certificate file not found"
 msgstr "Không tìm thấy tệp tin"
 msgstr "Không tìm thấy tệp tin"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgid "SSL Certificate Key Content"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgid "SSL Certificate Key Path"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgid "SSL Certificate Path"
 msgstr ""
 msgstr ""
@@ -4294,7 +4414,7 @@ msgstr ""
 msgid "Sync strategy"
 msgid "Sync strategy"
 msgstr "Gia hạn chứng chỉ SSL"
 msgstr "Gia hạn chứng chỉ SSL"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgid "Sync to"
 msgstr ""
 msgstr ""
 
 
@@ -4370,11 +4490,11 @@ msgid ""
 "dashes, colons, and dots."
 "dashes, colons, and dots."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgid "The input is not a SSL Certificate"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgid "The input is not a SSL Certificate Key"
 msgstr ""
 msgstr ""
 
 
@@ -4406,11 +4526,11 @@ msgstr ""
 msgid "The parameter of server_name is required"
 msgid "The parameter of server_name is required"
 msgstr "Tham số server_name là bắt buộc"
 msgstr "Tham số server_name là bắt buộc"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 msgid "The path exists, but the file is not a certificate"
 msgid "The path exists, but the file is not a certificate"
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:196
+#: src/views/certificate/CertificateEditor.vue:196
 msgid "The path exists, but the file is not a private key"
 msgid "The path exists, but the file is not a private key"
 msgstr ""
 msgstr ""
 
 
@@ -4463,17 +4583,17 @@ msgid ""
 "lose access to your account."
 "lose access to your account."
 msgstr ""
 msgstr ""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr "Mục Chứng chỉ tự động này không hợp lệ, vui lòng xóa nó"
 msgstr "Mục Chứng chỉ tự động này không hợp lệ, vui lòng xóa nó"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 msgid "This certificate is managed by Nginx UI"
 msgstr "Chứng chỉ này được quản lý bởi Nginx UI"
 msgstr "Chứng chỉ này được quản lý bởi Nginx UI"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:165
-#: src/views/certificate/components/CertificateEditor.vue:179
-#: src/views/certificate/components/CertificateEditor.vue:194
+#: src/views/certificate/CertificateEditor.vue:165
+#: src/views/certificate/CertificateEditor.vue:179
+#: src/views/certificate/CertificateEditor.vue:194
 msgid "This field is required"
 msgid "This field is required"
 msgstr ""
 msgstr ""
 
 

+ 243 - 92
app/src/language/zh_CN/app.po

@@ -15,6 +15,96 @@ msgstr ""
 "X-Generator: Poedit 3.6\n"
 "X-Generator: Poedit 3.6\n"
 "Generated-By: easygettext\n"
 "Generated-By: easygettext\n"
 
 
+#: src/language/generate.ts:19
+msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
+msgstr "[Nginx UI] ACME 用户:%{name},邮箱:%{email},CA 目录:%{caDir}"
+
+#: src/language/generate.ts:13
+msgid "[Nginx UI] Backing up current certificate for later revocation"
+msgstr "[Nginx UI] 正在备份当前证书以便后续撤销"
+
+#: src/language/generate.ts:28
+#, fuzzy
+msgid "[Nginx UI] Certificate renewed successfully"
+msgstr "证书更新成功"
+
+#: src/language/generate.ts:8
+#, fuzzy
+msgid "[Nginx UI] Certificate successfully revoked"
+msgstr "Nginx 重启成功"
+
+#: src/language/generate.ts:29
+msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgstr "[Nginx UI] 证书已用于服务器,正在重新加载服务器 TLS 证书"
+
+#: src/language/generate.ts:24
+#, fuzzy
+msgid "[Nginx UI] Creating client facilitates communication with the CA server"
+msgstr "正在创建客户端用于与 CA 服务器通信"
+
+#: src/language/generate.ts:12
+#, fuzzy
+msgid "[Nginx UI] Environment variables cleaned"
+msgstr "环境变量已清理"
+
+#: src/language/generate.ts:21
+msgid "[Nginx UI] Finished"
+msgstr "[Nginx UI] 已完成"
+
+#: src/language/generate.ts:4
+#, fuzzy
+msgid "[Nginx UI] Issued certificate successfully"
+msgstr "证书申请成功"
+
+#: src/language/generate.ts:14
+msgid "[Nginx UI] Obtaining certificate"
+msgstr "[Nginx UI] 正在获取证书"
+
+#: src/language/generate.ts:22
+msgid "[Nginx UI] Preparing for certificate revocation"
+msgstr "[Nginx UI] 准备撤销证书"
+
+#: src/language/generate.ts:18
+msgid "[Nginx UI] Preparing lego configurations"
+msgstr "[Nginx UI] 正在准备 lego 配置"
+
+#: src/language/generate.ts:25
+msgid "[Nginx UI] Reloading nginx"
+msgstr "[Nginx UI] 重新加载 Nginx"
+
+#: src/language/generate.ts:16
+msgid "[Nginx UI] Revocation completed"
+msgstr "[Nginx UI] 吊销完成"
+
+#: src/language/generate.ts:7
+msgid "[Nginx UI] Revoking certificate"
+msgstr "[Nginx UI] 正在撤销证书"
+
+#: src/language/generate.ts:26
+msgid "[Nginx UI] Revoking old certificate"
+msgstr "[Nginx UI] 正在撤销旧证书"
+
+#: src/language/generate.ts:20
+msgid "[Nginx UI] Setting DNS01 challenge provider"
+msgstr "[Nginx UI] 正在设置 DNS01 验证提供程序"
+
+#: src/language/generate.ts:6
+#, fuzzy
+msgid "[Nginx UI] Setting environment variables"
+msgstr "正在设置环境变量"
+
+#: src/language/generate.ts:11
+msgid "[Nginx UI] Setting HTTP01 challenge provider"
+msgstr "[Nginx UI] 正在设置 HTTP01 验证提供程序"
+
+#: src/language/generate.ts:15
+msgid "[Nginx UI] Writing certificate private key to disk"
+msgstr "[Nginx UI] 正在将证书私钥写入磁盘"
+
+#: src/language/generate.ts:27
+msgid "[Nginx UI] Writing certificate to disk"
+msgstr "[Nginx UI] 正在将证书写入磁盘"
+
 #: src/views/user/userColumns.tsx:32
 #: src/views/user/userColumns.tsx:32
 msgid "2FA"
 msgid "2FA"
 msgstr "2FA"
 msgstr "2FA"
@@ -31,7 +121,8 @@ msgstr "关于"
 msgid "Access Log"
 msgid "Access Log"
 msgstr "访问日志"
 msgstr "访问日志"
 
 
-#: src/components/NgxConfigEditor/LogEntry.vue:90 src/routes/modules/nginx_log.ts:17
+#: src/components/NgxConfigEditor/LogEntry.vue:90
+#: src/routes/modules/nginx_log.ts:17
 msgid "Access Logs"
 msgid "Access Logs"
 msgstr "访问日志"
 msgstr "访问日志"
 
 
@@ -42,7 +133,8 @@ msgstr "ACME 用户"
 
 
 #: src/views/certificate/ACMEUser.vue:95
 #: src/views/certificate/ACMEUser.vue:95
 #: src/views/certificate/CertificateList/certColumns.tsx:94
 #: src/views/certificate/CertificateList/certColumns.tsx:94
-#: src/views/certificate/DNSCredential.vue:33 src/views/config/configColumns.tsx:44
+#: src/views/certificate/DNSCredential.vue:33
+#: src/views/config/configColumns.tsx:44
 #: src/views/environments/group/columns.ts:43
 #: src/views/environments/group/columns.ts:43
 #: src/views/environments/list/envColumns.tsx:97
 #: src/views/environments/list/envColumns.tsx:97
 #: src/views/nginx_log/NginxLogList.vue:49
 #: src/views/nginx_log/NginxLogList.vue:49
@@ -104,7 +196,7 @@ msgstr "添加 Stream"
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "添加成功"
 msgstr "添加成功"
 
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgid "Additional"
 msgstr "额外选项"
 msgstr "额外选项"
 
 
@@ -122,7 +214,8 @@ msgstr "之后,请刷新此页面并再次点击添加通行密钥。"
 msgid "All"
 msgid "All"
 msgstr "全部"
 msgstr "全部"
 
 
-#: src/components/Notification/notifications.ts:165 src/language/constants.ts:58
+#: src/components/Notification/notifications.ts:165
+#: src/language/constants.ts:58
 msgid "All Recovery Codes Have Been Used"
 msgid "All Recovery Codes Have Been Used"
 msgstr "所有恢复代码已用完"
 msgstr "所有恢复代码已用完"
 
 
@@ -130,7 +223,7 @@ msgstr "所有恢复代码已用完"
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "API 地址"
 msgstr "API 地址"
 
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgid "API Document"
 msgstr "API 文档"
 msgstr "API 文档"
 
 
@@ -199,7 +292,8 @@ msgstr "您确定要永久删除此项目吗?"
 msgid "Are you sure you want to delete this item?"
 msgid "Are you sure you want to delete this item?"
 msgstr "你确定要删除这个项目吗?"
 msgstr "你确定要删除这个项目吗?"
 
 
-#: src/views/site/site_list/SiteList.vue:122 src/views/stream/StreamList.vue:239
+#: src/views/site/site_list/SiteList.vue:122
+#: src/views/stream/StreamList.vue:239
 msgid "Are you sure you want to delete?"
 msgid "Are you sure you want to delete?"
 msgstr "您确定要删除吗?"
 msgstr "您确定要删除吗?"
 
 
@@ -269,7 +363,7 @@ msgstr "自动"
 msgid "auto = CPU cores"
 msgid "auto = CPU cores"
 msgstr "自动 = CPU 线程数"
 msgstr "自动 = CPU 线程数"
 
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgid "Auto Refresh"
 msgstr "自动刷新"
 msgstr "自动刷新"
 
 
@@ -289,9 +383,9 @@ msgstr "\"自动重启\""
 msgid "Automatically indexed from site and stream configurations."
 msgid "Automatically indexed from site and stream configurations."
 msgstr "自动从站点和流配置中索引。"
 msgstr "自动从站点和流配置中索引。"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:259
+#: src/views/certificate/CertificateEditor.vue:259
 #: src/views/config/ConfigEditor.vue:266 src/views/config/ConfigList.vue:112
 #: src/views/config/ConfigEditor.vue:266 src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195 src/views/nginx_log/NginxLog.vue:173
+#: src/views/config/ConfigList.vue:195 src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/stream/components/StreamEditor.vue:106
 #: src/views/stream/components/StreamEditor.vue:106
 msgid "Back"
 msgid "Back"
@@ -498,13 +592,18 @@ msgstr "证书到期通知"
 
 
 #: src/components/Notification/notifications.ts:25
 #: src/components/Notification/notifications.ts:25
 msgid "Certificate Expired"
 msgid "Certificate Expired"
-msgstr "证书过期"
+msgstr "证书过期"
 
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
 #: src/components/Notification/notifications.ts:41
 msgid "Certificate Expiring Soon"
 msgid "Certificate Expiring Soon"
-msgstr "证书即将到期"
+msgstr "证书即将过期"
+
+#: src/language/generate.ts:5
+#, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "证书解码错误"
 
 
 #: src/constants/errors/cert.ts:5
 #: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgid "Certificate parse error"
@@ -517,7 +616,7 @@ msgstr "证书路径为空"
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
 #: src/views/certificate/components/RemoveCert.vue:61
 msgid "Certificate removed successfully"
 msgid "Certificate removed successfully"
-msgstr "成功删除证书"
+msgstr "证书已成功移除"
 
 
 #: src/views/preference/tabs/CertSettings.vue:27
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
 msgid "Certificate Renewal Interval"
@@ -527,7 +626,12 @@ msgstr "证书续期间隔"
 msgid "Certificate renewed successfully"
 msgid "Certificate renewed successfully"
 msgstr "证书更新成功"
 msgstr "证书更新成功"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:128
+#: src/language/generate.ts:10
+#, fuzzy
+msgid "Certificate revoked successfully"
+msgstr "证书已成功移除"
+
+#: src/views/certificate/CertificateEditor.vue:128
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 msgid "Certificate Status"
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
 msgid_plural "Certificates Status"
@@ -560,7 +664,8 @@ msgstr[0] "变更证书"
 msgid "Changed Path"
 msgid "Changed Path"
 msgstr "变更后的路径"
 msgstr "变更后的路径"
 
 
-#: src/views/environments/list/BatchUpgrader.vue:159 src/views/system/Upgrade.vue:188
+#: src/views/environments/list/BatchUpgrader.vue:159
+#: src/views/system/Upgrade.vue:188
 msgid "Channel"
 msgid "Channel"
 msgstr "通道"
 msgstr "通道"
 
 
@@ -615,7 +720,7 @@ msgstr "检查 sites-available 和 sites-enabled 目录是否位于 nginx 配置
 msgid ""
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 "the nginx configuration directory."
-msgstr "检查 nginx 配置目录下是否有 streams-available 和 streams-enabled 目录。"
+msgstr "检查 Nginx 配置目录下是否有 streams-available 和 streams-enabled 目录。"
 
 
 #: src/constants/errors/crypto.ts:3
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
 msgid "Cipher text is too short"
@@ -671,7 +776,7 @@ msgstr "关闭"
 
 
 #: src/constants/errors/llm.ts:2
 #: src/constants/errors/llm.ts:2
 msgid "Code completion is not enabled"
 msgid "Code completion is not enabled"
-msgstr "未启用代码自动完成功能"
+msgstr "代码补全未启用"
 
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
 msgid "Code Completion Model"
@@ -683,7 +788,7 @@ msgstr "命令"
 
 
 #: src/constants/errors/docker.ts:6
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr "命令以意外退出代码退出:{0},错误:{1}"
+msgstr "命令以意外退出代码结束:{0},错误:{1}"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
@@ -750,7 +855,7 @@ msgstr "已连接"
 
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
 msgid "Connection error, trying to reconnect..."
-msgstr "连接错误,尝试重新连接..."
+msgstr "连接错误,正在尝试重新连接..."
 
 
 #: src/views/terminal/Terminal.vue:142
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
 msgid "Connection lost, please refresh the page."
@@ -758,11 +863,11 @@ msgstr "连接中断,请刷新页面。"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
 msgid "Connection timeout period"
-msgstr "连接超时时间"
+msgstr "连接超时期限"
 
 
 #: src/constants/errors/docker.ts:7
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
 msgid "Container status unknown"
-msgstr "未知容器状态"
+msgstr "容器状态未知"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -855,7 +960,7 @@ msgstr "正在创建客户端用于与 CA 服务器通信"
 msgid "Credential"
 msgid "Credential"
 msgstr "DNS 凭证"
 msgstr "DNS 凭证"
 
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgid "Credentials"
 msgstr "凭证"
 msgstr "凭证"
 
 
@@ -920,7 +1025,8 @@ msgstr "定义共享内存区名称和大小,例如 proxy_cache:10m"
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:21
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:21
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/views/certificate/components/RemoveCert.vue:87
 #: src/views/certificate/components/RemoveCert.vue:87
-#: src/views/site/site_list/SiteList.vue:131 src/views/stream/StreamList.vue:248
+#: src/views/site/site_list/SiteList.vue:131
+#: src/views/stream/StreamList.vue:248
 msgid "Delete"
 msgid "Delete"
 msgstr "删除"
 msgstr "删除"
 
 
@@ -1106,8 +1212,8 @@ msgstr "在 %{node} 上禁用 %{name} 成功"
 #: src/views/site/components/SiteStatusSegmented.vue:134
 #: src/views/site/components/SiteStatusSegmented.vue:134
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_list/columns.tsx:111
 #: src/views/site/site_list/columns.tsx:111
-#: src/views/stream/components/StreamEditor.vue:30 src/views/stream/StreamList.vue:60
-#: src/views/user/userColumns.tsx:41
+#: src/views/stream/components/StreamEditor.vue:30
+#: src/views/stream/StreamList.vue:60 src/views/user/userColumns.tsx:41
 msgid "Disabled"
 msgid "Disabled"
 msgstr "禁用"
 msgstr "禁用"
 
 
@@ -1121,12 +1227,13 @@ msgstr "禁用成功"
 msgid "Disk IO"
 msgid "Disk IO"
 msgstr "磁盘 IO"
 msgstr "磁盘 IO"
 
 
-#: src/routes/modules/certificates.ts:56 src/views/certificate/DNSCredential.vue:40
+#: src/routes/modules/certificates.ts:56
+#: src/views/certificate/DNSCredential.vue:40
 msgid "DNS Credentials"
 msgid "DNS Credentials"
 msgstr "DNS 凭证"
 msgstr "DNS 凭证"
 
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgid "DNS Provider"
 msgstr "DNS 提供商"
 msgstr "DNS 提供商"
 
 
@@ -1175,6 +1282,11 @@ msgstr "Docker 客户端未初始化"
 msgid "Docker Socket"
 msgid "Docker Socket"
 msgstr "Docker Socket"
 msgstr "Docker Socket"
 
 
+#: src/constants/errors/self_check.ts:15
+#, fuzzy
+msgid "Docker socket not exist"
+msgstr "Docker Socket"
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 msgid "Document"
 msgid "Document"
@@ -1185,7 +1297,7 @@ msgstr[0] "文档"
 msgid "Domain"
 msgid "Domain"
 msgstr "域名"
 msgstr "域名"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:112
+#: src/views/certificate/CertificateEditor.vue:112
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr "域名列表为空,请尝试为 %{config} 重新打开证书自动续期"
 msgstr "域名列表为空,请尝试为 %{config} 重新打开证书自动续期"
 
 
@@ -1197,7 +1309,8 @@ msgstr "下载最新版本错误"
 msgid "Downloading latest release"
 msgid "Downloading latest release"
 msgstr "下载最新版本"
 msgstr "下载最新版本"
 
 
-#: src/views/environments/list/BatchUpgrader.vue:188 src/views/system/Upgrade.vue:215
+#: src/views/environments/list/BatchUpgrader.vue:188
+#: src/views/system/Upgrade.vue:215
 msgid "Dry run mode enabled"
 msgid "Dry run mode enabled"
 msgstr "试运行模式已启动"
 msgstr "试运行模式已启动"
 
 
@@ -1240,7 +1353,8 @@ msgstr "编辑站点"
 msgid "Edit Stream"
 msgid "Edit Stream"
 msgstr "编辑 Stream"
 msgstr "编辑 Stream"
 
 
-#: src/views/certificate/ACMEUser.vue:25 src/views/preference/tabs/CertSettings.vue:12
+#: src/views/certificate/ACMEUser.vue:25
+#: src/views/preference/tabs/CertSettings.vue:12
 msgid "Email"
 msgid "Email"
 msgstr "邮箱"
 msgstr "邮箱"
 
 
@@ -1354,8 +1468,8 @@ msgstr "启用 TOTP"
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110
 #: src/views/site/site_list/columns.tsx:110
 #: src/views/stream/components/RightPanel/Basic.vue:62
 #: src/views/stream/components/RightPanel/Basic.vue:62
-#: src/views/stream/components/StreamEditor.vue:24 src/views/stream/StreamList.vue:56
-#: src/views/user/userColumns.tsx:38
+#: src/views/stream/components/StreamEditor.vue:24
+#: src/views/stream/StreamList.vue:56 src/views/user/userColumns.tsx:38
 msgid "Enabled"
 msgid "Enabled"
 msgstr "启用"
 msgstr "启用"
 
 
@@ -1374,7 +1488,8 @@ msgstr "用 Let's Encrypt 对网站进行加密"
 msgid "Environment variables cleaned"
 msgid "Environment variables cleaned"
 msgstr "环境变量已清理"
 msgstr "环境变量已清理"
 
 
-#: src/routes/modules/environments.ts:11 src/views/dashboard/Environments.vue:83
+#: src/routes/modules/environments.ts:11
+#: src/views/dashboard/Environments.vue:83
 #: src/views/environments/list/Environment.vue:74
 #: src/views/environments/list/Environment.vue:74
 msgid "Environments"
 msgid "Environments"
 msgstr "环境"
 msgstr "环境"
@@ -1392,7 +1507,8 @@ msgstr "差异查看器初始化出错"
 msgid "Error Log"
 msgid "Error Log"
 msgstr "错误日志"
 msgstr "错误日志"
 
 
-#: src/components/NgxConfigEditor/LogEntry.vue:98 src/routes/modules/nginx_log.ts:24
+#: src/components/NgxConfigEditor/LogEntry.vue:98
+#: src/routes/modules/nginx_log.ts:24
 msgid "Error Logs"
 msgid "Error Logs"
 msgstr "错误日志"
 msgstr "错误日志"
 
 
@@ -1426,7 +1542,7 @@ msgstr "外部 Docker 容器"
 msgid "External Notify"
 msgid "External Notify"
 msgstr "外部通知"
 msgstr "外部通知"
 
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 msgid "Fail to obtain certificate"
 msgid "Fail to obtain certificate"
 msgstr "获取证书失败"
 msgstr "获取证书失败"
 
 
@@ -1558,6 +1674,11 @@ msgstr "解密 Nginx UI 目录失败:{0}"
 msgid "Failed to delete certificate"
 msgid "Failed to delete certificate"
 msgstr "删除证书失败"
 msgstr "删除证书失败"
 
 
+#: src/language/generate.ts:9
+#, fuzzy
+msgid "Failed to delete certificate from database: %{error}"
+msgstr "删除证书失败"
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
 #: src/views/stream/StreamList.vue:102
@@ -1698,6 +1819,11 @@ msgstr "恢复 Nginx UI 文件失败:{0}"
 msgid "Failed to revoke certificate"
 msgid "Failed to revoke certificate"
 msgstr "证书撤销失败"
 msgstr "证书撤销失败"
 
 
+#: src/language/generate.ts:17
+#, fuzzy
+msgid "Failed to revoke certificate: %{error}"
+msgstr "证书撤销失败"
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 msgid "Failed to save Nginx performance settings"
 msgid "Failed to save Nginx performance settings"
 msgstr "保存 Nginx 性能参数失败"
 msgstr "保存 Nginx 性能参数失败"
@@ -1734,7 +1860,7 @@ msgstr "未找到文件"
 msgid "Filename is empty"
 msgid "Filename is empty"
 msgstr "文件名为空"
 msgstr "文件名为空"
 
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgid "Filter"
 msgstr "过滤"
 msgstr "过滤"
 
 
@@ -1802,7 +1928,8 @@ msgstr "正在生成私钥用于注册账户"
 msgid "Get data failed"
 msgid "Get data failed"
 msgstr "获取数据失败"
 msgstr "获取数据失败"
 
 
-#: src/views/environments/list/BatchUpgrader.vue:177 src/views/system/Upgrade.vue:169
+#: src/views/environments/list/BatchUpgrader.vue:177
+#: src/views/system/Upgrade.vue:169
 msgid "Get release information error"
 msgid "Get release information error"
 msgstr "获取发布信息错误"
 msgstr "获取发布信息错误"
 
 
@@ -1909,7 +2036,7 @@ msgid "Import"
 msgstr "导入"
 msgstr "导入"
 
 
 #: src/routes/modules/certificates.ts:46
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgid "Import Certificate"
 msgstr "导入证书"
 msgstr "导入证书"
 
 
@@ -1923,13 +2050,13 @@ msgid ""
 "processes"
 "processes"
 msgstr "包括主进程、工作进程、缓存进程和其他 Nginx 进程"
 msgstr "包括主进程、工作进程、缓存进程和其他 Nginx 进程"
 
 
-#: src/views/nginx_log/NginxLogList.vue:89 src/views/site/site_list/SiteList.vue:87
-#: src/views/stream/StreamList.vue:187
+#: src/views/nginx_log/NginxLogList.vue:89
+#: src/views/site/site_list/SiteList.vue:87 src/views/stream/StreamList.vue:187
 msgid "Indexed"
 msgid "Indexed"
 msgstr "已索引"
 msgstr "已索引"
 
 
-#: src/views/nginx_log/NginxLogList.vue:86 src/views/site/site_list/SiteList.vue:84
-#: src/views/stream/StreamList.vue:184
+#: src/views/nginx_log/NginxLogList.vue:86
+#: src/views/site/site_list/SiteList.vue:84 src/views/stream/StreamList.vue:184
 msgid "Indexing..."
 msgid "Indexing..."
 msgstr "索引中..."
 msgstr "索引中..."
 
 
@@ -1937,8 +2064,8 @@ msgstr "索引中..."
 msgid "Indicator"
 msgid "Indicator"
 msgstr "指示器"
 msgstr "指示器"
 
 
-#: src/components/StdDesign/StdDetail/StdDetail.vue:81 src/constants/index.ts:24
-#: src/views/notification/notificationColumns.tsx:29
+#: src/components/StdDesign/StdDetail/StdDetail.vue:81
+#: src/constants/index.ts:24 src/views/notification/notificationColumns.tsx:29
 msgid "Info"
 msgid "Info"
 msgstr "信息"
 msgstr "信息"
 
 
@@ -1962,7 +2089,8 @@ msgstr "输入恢复代码:"
 msgid "Insecure Skip Verify"
 msgid "Insecure Skip Verify"
 msgstr "跳过证书认证"
 msgstr "跳过证书认证"
 
 
-#: src/routes/modules/auth.ts:8 src/views/install/components/InstallForm.vue:124
+#: src/routes/modules/auth.ts:8
+#: src/views/install/components/InstallForm.vue:124
 #: src/views/install/components/InstallHeader.vue:9
 #: src/views/install/components/InstallHeader.vue:9
 msgid "Install"
 msgid "Install"
 msgstr "安装"
 msgstr "安装"
@@ -2009,7 +2137,8 @@ msgstr "无效文件对象"
 msgid "Invalid file path: {0}"
 msgid "Invalid file path: {0}"
 msgstr "文件路径无效:{0}"
 msgstr "文件路径无效:{0}"
 
 
-#: src/views/config/components/Rename.vue:66 src/views/config/ConfigEditor.vue:303
+#: src/views/config/components/Rename.vue:66
+#: src/views/config/ConfigEditor.vue:303
 msgid "Invalid filename"
 msgid "Invalid filename"
 msgstr "文件名无效"
 msgstr "文件名无效"
 
 
@@ -2124,8 +2253,8 @@ msgstr "如果不想修改,请留空"
 msgid "Leave blank if you don't need this."
 msgid "Leave blank if you don't need this."
 msgstr "如果不需要,请留空。"
 msgstr "如果不需要,请留空。"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:223
-#: src/views/certificate/components/CertificateEditor.vue:237
+#: src/views/certificate/CertificateEditor.vue:223
+#: src/views/certificate/CertificateEditor.vue:237
 msgid "Leave blank will not change anything"
 msgid "Leave blank will not change anything"
 msgstr "留空不做任何更改"
 msgstr "留空不做任何更改"
 
 
@@ -2141,7 +2270,8 @@ msgstr "Lego 禁用 CNAME 支持"
 msgid "License"
 msgid "License"
 msgstr "开源许可"
 msgstr "开源许可"
 
 
-#: src/views/dashboard/Environments.vue:141 src/views/dashboard/Environments.vue:156
+#: src/views/dashboard/Environments.vue:141
+#: src/views/dashboard/Environments.vue:156
 msgid "Link Start"
 msgid "Link Start"
 msgstr "链接"
 msgstr "链接"
 
 
@@ -2195,10 +2325,14 @@ msgstr "Location"
 msgid "Locations"
 msgid "Locations"
 msgstr "Locations"
 msgstr "Locations"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 msgid "Log"
 msgstr "日志"
 msgstr "日志"
 
 
+#: src/language/generate.ts:23
+msgid "Log file %{log_path} is not a regular file. "
+msgstr ""
+
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 msgid "Log List"
 msgid "Log List"
 msgstr "日志列表"
 msgstr "日志列表"
@@ -2389,7 +2523,7 @@ msgid "Modify"
 msgstr "修改"
 msgstr "修改"
 
 
 #: src/routes/modules/certificates.ts:36
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgid "Modify Certificate"
 msgstr "修改证书"
 msgstr "修改证书"
 
 
@@ -2407,9 +2541,10 @@ msgstr "多行指令"
 
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:10
 #: src/views/certificate/CertificateList/certColumns.tsx:10
-#: src/views/certificate/components/CertificateEditor.vue:162
-#: src/views/certificate/DNSCredential.vue:11 src/views/config/components/Mkdir.vue:64
+#: src/views/certificate/DNSCredential.vue:11
+#: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
 #: src/views/environments/group/columns.ts:8
 #: src/views/environments/group/columns.ts:8
 #: src/views/environments/list/envColumns.tsx:9
 #: src/views/environments/list/envColumns.tsx:9
@@ -2561,7 +2696,7 @@ msgstr "Nginx 未在另一个容器中运行"
 msgid "Nginx is running"
 msgid "Nginx is running"
 msgstr "Nginx 正在运行"
 msgstr "Nginx 正在运行"
 
 
-#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:143
+#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:144
 msgid "Nginx Log"
 msgid "Nginx Log"
 msgstr "Nginx 日志"
 msgstr "Nginx 日志"
 
 
@@ -2648,7 +2783,8 @@ msgstr "Nginx UI 配置已恢复,几秒钟后将自动重启。"
 #: src/views/notification/Notification.vue:37
 #: src/views/notification/Notification.vue:37
 #: src/views/preference/tabs/AuthSettings.vue:164
 #: src/views/preference/tabs/AuthSettings.vue:164
 #: src/views/preference/tabs/CertSettings.vue:73
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:120 src/views/stream/StreamList.vue:237
+#: src/views/site/site_list/SiteList.vue:120
+#: src/views/stream/StreamList.vue:237
 msgid "No"
 msgid "No"
 msgstr "取消"
 msgstr "取消"
 
 
@@ -2676,7 +2812,8 @@ msgstr "节点"
 msgid "Node Group"
 msgid "Node Group"
 msgstr "节点组"
 msgstr "节点组"
 
 
-#: src/routes/modules/environments.ts:33 src/views/environments/group/EnvGroup.vue:10
+#: src/routes/modules/environments.ts:33
+#: src/views/environments/group/EnvGroup.vue:10
 msgid "Node Groups"
 msgid "Node Groups"
 msgstr "环境组"
 msgstr "环境组"
 
 
@@ -2798,7 +2935,8 @@ msgstr "确定"
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
 #: src/views/site/site_list/SiteList.vue:121
 #: src/views/site/site_list/SiteList.vue:121
 #: src/views/stream/components/RightPanel/Basic.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:46
-#: src/views/stream/StreamList.vue:238 src/views/system/Backup/BackupCreator.vue:149
+#: src/views/stream/StreamList.vue:238
+#: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgid "OK"
 msgstr "确定"
 msgstr "确定"
 
 
@@ -2915,7 +3053,8 @@ msgstr "密码长度不能超过 20 个字符"
 
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/views/config/ConfigEditor.vue:316 src/views/nginx_log/NginxLogList.vue:41
+#: src/views/config/ConfigEditor.vue:316
+#: src/views/nginx_log/NginxLogList.vue:41
 msgid "Path"
 msgid "Path"
 msgstr "路径"
 msgstr "路径"
 
 
@@ -2996,13 +3135,15 @@ msgid ""
 "select one of the credentialsbelow to request the API of the DNS provider."
 "select one of the credentialsbelow to request the API of the DNS provider."
 msgstr "请首先在 “证书”> “DNS 凭证” 中添加凭证,然后在下方选择一个凭证,请求 DNS 提供商的 API。"
 msgstr "请首先在 “证书”> “DNS 凭证” 中添加凭证,然后在下方选择一个凭证,请求 DNS 提供商的 API。"
 
 
-#: src/components/Notification/notifications.ts:166 src/language/constants.ts:59
+#: src/components/Notification/notifications.ts:166
+#: src/language/constants.ts:59
 msgid ""
 msgid ""
 "Please generate new recovery codes in the preferences immediately to "
 "Please generate new recovery codes in the preferences immediately to "
 "prevent lockout."
 "prevent lockout."
 msgstr "请立即在偏好设置中生成新的恢复码,以防止无法访问您的账户。"
 msgstr "请立即在偏好设置中生成新的恢复码,以防止无法访问您的账户。"
 
 
-#: src/views/config/components/Rename.vue:65 src/views/config/ConfigEditor.vue:302
+#: src/views/config/components/Rename.vue:65
+#: src/views/config/ConfigEditor.vue:302
 msgid "Please input a filename"
 msgid "Please input a filename"
 msgstr "请输入文件名"
 msgstr "请输入文件名"
 
 
@@ -3083,8 +3224,8 @@ msgid "Post-sync Action"
 msgstr "同步后操作"
 msgstr "同步后操作"
 
 
 #: src/views/environments/list/BatchUpgrader.vue:167
 #: src/views/environments/list/BatchUpgrader.vue:167
-#: src/views/environments/list/BatchUpgrader.vue:220 src/views/system/Upgrade.vue:194
-#: src/views/system/Upgrade.vue:245
+#: src/views/environments/list/BatchUpgrader.vue:220
+#: src/views/system/Upgrade.vue:194 src/views/system/Upgrade.vue:245
 msgid "Pre-release"
 msgid "Pre-release"
 msgstr "预发布"
 msgstr "预发布"
 
 
@@ -3280,7 +3421,8 @@ msgstr "删除成功"
 
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:126
 #: src/components/NgxConfigEditor/NgxUpstream.vue:126
 #: src/views/config/components/ConfigName.vue:51
 #: src/views/config/components/ConfigName.vue:51
-#: src/views/config/components/Rename.vue:56 src/views/config/ConfigList.vue:181
+#: src/views/config/components/Rename.vue:56
+#: src/views/config/ConfigList.vue:181
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 msgid "Rename"
 msgid "Rename"
@@ -3302,11 +3444,13 @@ msgstr "远程配置重命名错误"
 msgid "Rename Remote Config Success"
 msgid "Rename Remote Config Success"
 msgstr "重命名远程配置成功"
 msgstr "重命名远程配置成功"
 
 
-#: src/components/Notification/notifications.ts:109 src/language/constants.ts:56
+#: src/components/Notification/notifications.ts:109
+#: src/language/constants.ts:56
 msgid "Rename Remote Site Error"
 msgid "Rename Remote Site Error"
 msgstr "重命名远程站点错误"
 msgstr "重命名远程站点错误"
 
 
-#: src/components/Notification/notifications.ts:113 src/language/constants.ts:55
+#: src/components/Notification/notifications.ts:113
+#: src/language/constants.ts:55
 msgid "Rename Remote Site Success"
 msgid "Rename Remote Site Success"
 msgstr "重命名远程站点成功"
 msgstr "重命名远程站点成功"
 
 
@@ -3498,8 +3642,9 @@ msgstr "运行中"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
-#: src/views/certificate/components/CertificateEditor.vue:266
-#: src/views/config/components/ConfigName.vue:59 src/views/config/ConfigEditor.vue:275
+#: src/views/certificate/CertificateEditor.vue:266
+#: src/views/config/components/ConfigName.vue:59
+#: src/views/config/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
 #: src/views/preference/Preference.vue:117
 #: src/views/preference/Preference.vue:117
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52
@@ -3518,11 +3663,13 @@ msgstr "保存指令"
 msgid "Save error %{msg}"
 msgid "Save error %{msg}"
 msgstr "保存错误 %{msg}"
 msgstr "保存错误 %{msg}"
 
 
-#: src/components/Notification/notifications.ts:117 src/language/constants.ts:48
+#: src/components/Notification/notifications.ts:117
+#: src/language/constants.ts:48
 msgid "Save Remote Site Error"
 msgid "Save Remote Site Error"
 msgstr "保存远程站点错误"
 msgstr "保存远程站点错误"
 
 
-#: src/components/Notification/notifications.ts:121 src/language/constants.ts:47
+#: src/components/Notification/notifications.ts:121
+#: src/language/constants.ts:47
 msgid "Save Remote Site Success"
 msgid "Save Remote Site Success"
 msgstr "保存远程站点成功"
 msgstr "保存远程站点成功"
 
 
@@ -3552,7 +3699,7 @@ msgstr "成功将站点 %{name} 保存到 %{node} 中"
 
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #: src/views/preference/store/index.ts:118
 msgid "Save successfully"
 msgid "Save successfully"
 msgstr "保存成功"
 msgstr "保存成功"
@@ -3567,7 +3714,7 @@ msgstr "保存成功"
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr "用手机扫描二维码,将账户添加到应用程序中。"
 msgstr "用手机扫描二维码,将账户添加到应用程序中。"
 
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgid "SDK"
 msgstr "SDK"
 msgstr "SDK"
 
 
@@ -3740,7 +3887,7 @@ msgstr "缓存加载器迭代之间的休眠时间"
 msgid "Sleep time between cache manager iterations"
 msgid "Sleep time between cache manager iterations"
 msgstr "缓存管理器迭代之间的休眠时间"
 msgstr "缓存管理器迭代之间的休眠时间"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgid "SSL Certificate Content"
 msgstr "SSL 证书内容"
 msgstr "SSL 证书内容"
 
 
@@ -3752,15 +3899,15 @@ msgstr "SSL 证书文件必须位于 Nginx 配置目录下:{0}"
 msgid "SSL certificate file not found"
 msgid "SSL certificate file not found"
 msgstr "未找到 SSL 证书文件"
 msgstr "未找到 SSL 证书文件"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgid "SSL Certificate Key Content"
 msgstr "SSL 证书密钥内容"
 msgstr "SSL 证书密钥内容"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgid "SSL Certificate Key Path"
 msgstr "SSL证书密钥路径"
 msgstr "SSL证书密钥路径"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgid "SSL Certificate Path"
 msgstr "SSL证书路径"
 msgstr "SSL证书路径"
@@ -3790,8 +3937,8 @@ msgid "SSO Login"
 msgstr "SSO 登录"
 msgstr "SSO 登录"
 
 
 #: src/views/environments/list/BatchUpgrader.vue:164
 #: src/views/environments/list/BatchUpgrader.vue:164
-#: src/views/environments/list/BatchUpgrader.vue:214 src/views/system/Upgrade.vue:191
-#: src/views/system/Upgrade.vue:239
+#: src/views/environments/list/BatchUpgrader.vue:214
+#: src/views/system/Upgrade.vue:191 src/views/system/Upgrade.vue:239
 msgid "Stable"
 msgid "Stable"
 msgstr "稳定"
 msgstr "稳定"
 
 
@@ -3925,7 +4072,7 @@ msgstr "同步节点"
 msgid "Sync strategy"
 msgid "Sync strategy"
 msgstr "同步策略"
 msgstr "同步策略"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgid "Sync to"
 msgstr "同步到"
 msgstr "同步到"
 
 
@@ -3993,11 +4140,11 @@ msgid ""
 "dashes, colons, and dots."
 "dashes, colons, and dots."
 msgstr "ICP 备案号只能包含字母、单码、数字、连字符、破折号、冒号和点。"
 msgstr "ICP 备案号只能包含字母、单码、数字、连字符、破折号、冒号和点。"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgid "The input is not a SSL Certificate"
 msgstr "输入的内容不是 SSL 证书"
 msgstr "输入的内容不是 SSL 证书"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgid "The input is not a SSL Certificate Key"
 msgstr "输入的内容不是 SSL 证书密钥"
 msgstr "输入的内容不是 SSL 证书密钥"
 
 
@@ -4028,11 +4175,11 @@ msgstr "节点名称只能包含字母、统一码、数字、连字符、破折
 msgid "The parameter of server_name is required"
 msgid "The parameter of server_name is required"
 msgstr "必须为 server_name 指令指明参数"
 msgstr "必须为 server_name 指令指明参数"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 msgid "The path exists, but the file is not a certificate"
 msgid "The path exists, but the file is not a certificate"
 msgstr "路径存在,但文件不是证书"
 msgstr "路径存在,但文件不是证书"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:196
+#: src/views/certificate/CertificateEditor.vue:196
 msgid "The path exists, but the file is not a private key"
 msgid "The path exists, but the file is not a private key"
 msgstr "路径存在,但文件不是私钥"
 msgstr "路径存在,但文件不是私钥"
 
 
@@ -4084,17 +4231,17 @@ msgid ""
 "lose access to your account."
 "lose access to your account."
 msgstr "这些代码是在您丢失密码和双重身份验证方式时,访问账户的最后手段。如果找不到这些代码,您将无法再访问您的账户。"
 msgstr "这些代码是在您丢失密码和双重身份验证方式时,访问账户的最后手段。如果找不到这些代码,您将无法再访问您的账户。"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr "这个证书自动续期项目是无效的,请删除。"
 msgstr "这个证书自动续期项目是无效的,请删除。"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 msgid "This certificate is managed by Nginx UI"
 msgstr "该证书由 Nginx UI 托管"
 msgstr "该证书由 Nginx UI 托管"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:165
-#: src/views/certificate/components/CertificateEditor.vue:179
-#: src/views/certificate/components/CertificateEditor.vue:194
+#: src/views/certificate/CertificateEditor.vue:165
+#: src/views/certificate/CertificateEditor.vue:179
+#: src/views/certificate/CertificateEditor.vue:194
 msgid "This field is required"
 msgid "This field is required"
 msgstr "此字段必填"
 msgstr "此字段必填"
 
 
@@ -4289,7 +4436,8 @@ msgstr "未知问题"
 msgid "Update successfully"
 msgid "Update successfully"
 msgstr "更新成功"
 msgstr "更新成功"
 
 
-#: src/views/certificate/ACMEUser.vue:88 src/views/certificate/DNSCredential.vue:27
+#: src/views/certificate/ACMEUser.vue:88
+#: src/views/certificate/DNSCredential.vue:27
 #: src/views/config/configColumns.tsx:36 src/views/config/ConfigEditor.vue:329
 #: src/views/config/configColumns.tsx:36 src/views/config/ConfigEditor.vue:329
 #: src/views/environments/group/columns.ts:37
 #: src/views/environments/group/columns.ts:37
 #: src/views/environments/list/envColumns.tsx:90
 #: src/views/environments/list/envColumns.tsx:90
@@ -4304,9 +4452,10 @@ msgstr "修改时间"
 msgid "Updated successfully"
 msgid "Updated successfully"
 msgstr "更新成功"
 msgstr "更新成功"
 
 
-#: src/routes/modules/system.ts:33 src/views/environments/list/Environment.vue:107
-#: src/views/environments/list/Environment.vue:99 src/views/system/Upgrade.vue:143
-#: src/views/system/Upgrade.vue:226
+#: src/routes/modules/system.ts:33
+#: src/views/environments/list/Environment.vue:107
+#: src/views/environments/list/Environment.vue:99
+#: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 msgid "Upgrade"
 msgid "Upgrade"
 msgstr "升级"
 msgstr "升级"
 
 
@@ -4318,7 +4467,8 @@ msgstr "成功升级 %{node} 上的 Nginx UI 🎉"
 msgid "Upgraded successfully"
 msgid "Upgraded successfully"
 msgstr "升级成功"
 msgstr "升级成功"
 
 
-#: src/views/environments/list/BatchUpgrader.vue:88 src/views/system/Upgrade.vue:77
+#: src/views/environments/list/BatchUpgrader.vue:88
+#: src/views/system/Upgrade.vue:77
 msgid "Upgrading Nginx UI, please wait..."
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "正在升级 Nginx UI,请等待..."
 msgstr "正在升级 Nginx UI,请等待..."
 
 
@@ -4366,7 +4516,8 @@ msgstr "用户名"
 msgid "Username (*)"
 msgid "Username (*)"
 msgstr "用户名 (*)"
 msgstr "用户名 (*)"
 
 
-#: src/components/CertInfo/CertInfo.vue:24 src/views/certificate/ACMEUser.vue:124
+#: src/components/CertInfo/CertInfo.vue:24
+#: src/views/certificate/ACMEUser.vue:124
 #: src/views/certificate/CertificateList/certColumns.tsx:78
 #: src/views/certificate/CertificateList/certColumns.tsx:78
 msgid "Valid"
 msgid "Valid"
 msgstr "有效的"
 msgstr "有效的"

+ 167 - 50
app/src/language/zh_TW/app.po

@@ -19,6 +19,96 @@ msgstr ""
 "X-Generator: Weblate 5.10.4\n"
 "X-Generator: Weblate 5.10.4\n"
 "Generated-By: easygettext\n"
 "Generated-By: easygettext\n"
 
 
+#: src/language/generate.ts:19
+msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
+msgstr "[Nginx UI] ACME 使用者:%{name},電子郵件:%{email},CA 目錄:%{caDir}"
+
+#: src/language/generate.ts:13
+msgid "[Nginx UI] Backing up current certificate for later revocation"
+msgstr "[Nginx UI] 正在備份當前憑證以便後續撤銷"
+
+#: src/language/generate.ts:28
+#, fuzzy
+msgid "[Nginx UI] Certificate renewed successfully"
+msgstr "憑證更新成功"
+
+#: src/language/generate.ts:8
+#, fuzzy
+msgid "[Nginx UI] Certificate successfully revoked"
+msgstr "Nginx 重啟成功"
+
+#: src/language/generate.ts:29
+msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgstr "[Nginx UI] 憑證已用於伺服器,正在重新載入伺服器 TLS 憑證"
+
+#: src/language/generate.ts:24
+#, fuzzy
+msgid "[Nginx UI] Creating client facilitates communication with the CA server"
+msgstr "建立客戶端方便與 CA 伺服器通訊"
+
+#: src/language/generate.ts:12
+#, fuzzy
+msgid "[Nginx UI] Environment variables cleaned"
+msgstr "環境變數已清理"
+
+#: src/language/generate.ts:21
+msgid "[Nginx UI] Finished"
+msgstr "[Nginx UI] 已完成"
+
+#: src/language/generate.ts:4
+#, fuzzy
+msgid "[Nginx UI] Issued certificate successfully"
+msgstr "憑證簽發成功"
+
+#: src/language/generate.ts:14
+msgid "[Nginx UI] Obtaining certificate"
+msgstr "[Nginx UI] 正在取得憑證"
+
+#: src/language/generate.ts:22
+msgid "[Nginx UI] Preparing for certificate revocation"
+msgstr "[Nginx UI] 準備撤銷憑證"
+
+#: src/language/generate.ts:18
+msgid "[Nginx UI] Preparing lego configurations"
+msgstr "[Nginx UI] 正在準備 lego 配置"
+
+#: src/language/generate.ts:25
+msgid "[Nginx UI] Reloading nginx"
+msgstr "[Nginx UI] 重新載入 Nginx"
+
+#: src/language/generate.ts:16
+msgid "[Nginx UI] Revocation completed"
+msgstr "[Nginx UI] 撤銷完成"
+
+#: src/language/generate.ts:7
+msgid "[Nginx UI] Revoking certificate"
+msgstr "[Nginx UI] 正在撤銷證書"
+
+#: src/language/generate.ts:26
+msgid "[Nginx UI] Revoking old certificate"
+msgstr "[Nginx UI] 正在撤銷舊憑證"
+
+#: src/language/generate.ts:20
+msgid "[Nginx UI] Setting DNS01 challenge provider"
+msgstr "[Nginx UI] 正在設定 DNS01 驗證提供者"
+
+#: src/language/generate.ts:6
+#, fuzzy
+msgid "[Nginx UI] Setting environment variables"
+msgstr "設定環境變數中"
+
+#: src/language/generate.ts:11
+msgid "[Nginx UI] Setting HTTP01 challenge provider"
+msgstr "[Nginx UI] 正在設定 HTTP01 驗證提供者"
+
+#: src/language/generate.ts:15
+msgid "[Nginx UI] Writing certificate private key to disk"
+msgstr "[Nginx UI] 正在將證書私鑰寫入磁碟"
+
+#: src/language/generate.ts:27
+msgid "[Nginx UI] Writing certificate to disk"
+msgstr "[Nginx UI] 正在將憑證寫入磁碟"
+
 #: src/views/user/userColumns.tsx:32
 #: src/views/user/userColumns.tsx:32
 msgid "2FA"
 msgid "2FA"
 msgstr "雙因素驗證"
 msgstr "雙因素驗證"
@@ -110,7 +200,7 @@ msgstr "新增 Stream"
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "新增成功"
 msgstr "新增成功"
 
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgid "Additional"
 msgstr "其他設定"
 msgstr "其他設定"
 
 
@@ -137,7 +227,7 @@ msgstr "所有恢復代碼已用完"
 msgid "API Base Url"
 msgid "API Base Url"
 msgstr "API 基礎網址"
 msgstr "API 基礎網址"
 
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgid "API Document"
 msgstr "API 文件"
 msgstr "API 文件"
 
 
@@ -277,7 +367,7 @@ msgstr "自動"
 msgid "auto = CPU cores"
 msgid "auto = CPU cores"
 msgstr "auto = CPU 核心數"
 msgstr "auto = CPU 核心數"
 
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgid "Auto Refresh"
 msgstr "自動重新整理"
 msgstr "自動重新整理"
 
 
@@ -297,11 +387,9 @@ msgstr "\"自動重啟\""
 msgid "Automatically indexed from site and stream configurations."
 msgid "Automatically indexed from site and stream configurations."
 msgstr "\"自動從站點和流配置中索引。\""
 msgstr "\"自動從站點和流配置中索引。\""
 
 
-#: src/views/certificate/components/CertificateEditor.vue:259
-#: src/views/config/ConfigEditor.vue:266
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
-#: src/views/nginx_log/NginxLog.vue:173
+#: src/views/certificate/CertificateEditor.vue:259
+#: src/views/config/ConfigEditor.vue:266 src/views/config/ConfigList.vue:112
+#: src/views/config/ConfigList.vue:195 src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:150
 #: src/views/stream/components/StreamEditor.vue:106
 #: src/views/stream/components/StreamEditor.vue:106
 msgid "Back"
 msgid "Back"
@@ -504,7 +592,7 @@ msgstr "證書解碼錯誤"
 
 
 #: src/components/Notification/notifications.ts:29
 #: src/components/Notification/notifications.ts:29
 msgid "Certificate Expiration Notice"
 msgid "Certificate Expiration Notice"
-msgstr "證到期通知"
+msgstr "證到期通知"
 
 
 #: src/components/Notification/notifications.ts:25
 #: src/components/Notification/notifications.ts:25
 msgid "Certificate Expired"
 msgid "Certificate Expired"
@@ -514,20 +602,25 @@ msgstr "憑證已過期"
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
 #: src/components/Notification/notifications.ts:41
 msgid "Certificate Expiring Soon"
 msgid "Certificate Expiring Soon"
-msgstr "證書即將到期"
+msgstr "憑證即將到期"
+
+#: src/language/generate.ts:5
+#, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "證書解碼錯誤"
 
 
 #: src/constants/errors/cert.ts:5
 #: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgid "Certificate parse error"
-msgstr "證書解析錯誤"
+msgstr "證解析錯誤"
 
 
 #: src/constants/errors/cert.ts:8
 #: src/constants/errors/cert.ts:8
 msgid "Certificate path is empty"
 msgid "Certificate path is empty"
-msgstr "證路徑為空"
+msgstr "證路徑為空"
 
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
 #: src/views/certificate/components/RemoveCert.vue:61
 msgid "Certificate removed successfully"
 msgid "Certificate removed successfully"
-msgstr "憑證成功移除"
+msgstr "憑證成功移除"
 
 
 #: src/views/preference/tabs/CertSettings.vue:27
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
 msgid "Certificate Renewal Interval"
@@ -537,7 +630,12 @@ msgstr "憑證更新間隔"
 msgid "Certificate renewed successfully"
 msgid "Certificate renewed successfully"
 msgstr "憑證更新成功"
 msgstr "憑證更新成功"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:128
+#: src/language/generate.ts:10
+#, fuzzy
+msgid "Certificate revoked successfully"
+msgstr "憑證已成功移除"
+
+#: src/views/certificate/CertificateEditor.vue:128
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 msgid "Certificate Status"
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
 msgid_plural "Certificates Status"
@@ -578,7 +676,7 @@ msgstr "通道"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
 msgid "Chat"
-msgstr ""
+msgstr "聊天"
 
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -596,6 +694,8 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 "/var/run/docker.sock:/var/run/docker.sock`."
 msgstr ""
 msgstr ""
+"檢查 /var/run/docker.sock 是否存在。如果您正在使用 Nginx UI 官方 Docker 映像,請確保 Docker "
+"通訊端已掛載如下:`-v /var/run/docker.sock:/var/run/docker.sock`。"
 
 
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:11
 msgid ""
 msgid ""
@@ -681,13 +781,12 @@ msgid "Close"
 msgstr "關閉"
 msgstr "關閉"
 
 
 #: src/constants/errors/llm.ts:2
 #: src/constants/errors/llm.ts:2
-#, fuzzy
 msgid "Code completion is not enabled"
 msgid "Code completion is not enabled"
-msgstr "目前帳戶未啟用 TOTP。"
+msgstr "程式碼補全未啟用"
 
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
 msgid "Code Completion Model"
-msgstr ""
+msgstr "程式碼補全模型"
 
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
 msgid "Command"
@@ -695,7 +794,7 @@ msgstr "命令"
 
 
 #: src/constants/errors/docker.ts:6
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr ""
+msgstr "命令以意外退出代碼結束:{0},錯誤:{1}"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
@@ -771,11 +870,11 @@ msgstr "連線中斷,請重新整理此頁面。"
 
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
 msgid "Connection timeout period"
-msgstr "連線逾時時間"
+msgstr "連接逾時期限"
 
 
 #: src/constants/errors/docker.ts:7
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
 msgid "Container status unknown"
-msgstr ""
+msgstr "容器狀態未知"
 
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -868,7 +967,7 @@ msgstr "建立客戶端方便與 CA 伺服器通訊"
 msgid "Credential"
 msgid "Credential"
 msgstr "認證"
 msgstr "認證"
 
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgid "Credentials"
 msgstr "認證資訊"
 msgstr "認證資訊"
 
 
@@ -1142,7 +1241,7 @@ msgid "DNS Credentials"
 msgstr "DNS 認證"
 msgstr "DNS 認證"
 
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgid "DNS Provider"
 msgstr "DNS 供應商"
 msgstr "DNS 供應商"
 
 
@@ -1191,6 +1290,10 @@ msgstr ""
 msgid "Docker Socket"
 msgid "Docker Socket"
 msgstr ""
 msgstr ""
 
 
+#: src/constants/errors/self_check.ts:15
+msgid "Docker socket not exist"
+msgstr ""
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:88
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 #: src/components/NgxConfigEditor/directive/DirectiveDocuments.vue:16
 msgid "Document"
 msgid "Document"
@@ -1201,7 +1304,7 @@ msgstr[0] "檔案"
 msgid "Domain"
 msgid "Domain"
 msgstr "網域"
 msgstr "網域"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:112
+#: src/views/certificate/CertificateEditor.vue:112
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr "網域列表為空,請嘗試重新開啟 %{config} 的自動憑證"
 msgstr "網域列表為空,請嘗試重新開啟 %{config} 的自動憑證"
 
 
@@ -1447,7 +1550,7 @@ msgstr "外部通知"
 msgid "External Notify"
 msgid "External Notify"
 msgstr "外部通知"
 msgstr "外部通知"
 
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 msgid "Fail to obtain certificate"
 msgid "Fail to obtain certificate"
 msgstr "取得憑證失敗"
 msgstr "取得憑證失敗"
 
 
@@ -1581,6 +1684,11 @@ msgstr "解密 Nginx UI 目錄失敗:{0}"
 msgid "Failed to delete certificate"
 msgid "Failed to delete certificate"
 msgstr "憑證刪除失敗"
 msgstr "憑證刪除失敗"
 
 
+#: src/language/generate.ts:9
+#, fuzzy
+msgid "Failed to delete certificate from database: %{error}"
+msgstr "憑證刪除失敗"
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
 #: src/views/stream/StreamList.vue:102
@@ -1727,6 +1835,11 @@ msgstr "還原 Nginx UI 檔案失敗:{0}"
 msgid "Failed to revoke certificate"
 msgid "Failed to revoke certificate"
 msgstr "撤銷憑證失敗"
 msgstr "撤銷憑證失敗"
 
 
+#: src/language/generate.ts:17
+#, fuzzy
+msgid "Failed to revoke certificate: %{error}"
+msgstr "撤銷憑證失敗"
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 msgid "Failed to save Nginx performance settings"
 msgid "Failed to save Nginx performance settings"
 msgstr "儲存 Nginx 效能設定失敗"
 msgstr "儲存 Nginx 效能設定失敗"
@@ -1764,7 +1877,7 @@ msgstr "找不到檔案"
 msgid "Filename is empty"
 msgid "Filename is empty"
 msgstr "檔名空白"
 msgstr "檔名空白"
 
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgid "Filter"
 msgstr "篩選"
 msgstr "篩選"
 
 
@@ -1940,7 +2053,7 @@ msgid "Import"
 msgstr "匯入"
 msgstr "匯入"
 
 
 #: src/routes/modules/certificates.ts:46
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgid "Import Certificate"
 msgstr "匯入憑證"
 msgstr "匯入憑證"
 
 
@@ -2158,8 +2271,8 @@ msgstr "留空表示不修改"
 msgid "Leave blank if you don't need this."
 msgid "Leave blank if you don't need this."
 msgstr "留空表示不需要此項目。"
 msgstr "留空表示不需要此項目。"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:223
-#: src/views/certificate/components/CertificateEditor.vue:237
+#: src/views/certificate/CertificateEditor.vue:223
+#: src/views/certificate/CertificateEditor.vue:237
 msgid "Leave blank will not change anything"
 msgid "Leave blank will not change anything"
 msgstr "留空將不會改變任何內容"
 msgstr "留空將不會改變任何內容"
 
 
@@ -2232,10 +2345,14 @@ msgstr "Location"
 msgid "Locations"
 msgid "Locations"
 msgstr "Locations"
 msgstr "Locations"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 msgid "Log"
 msgstr "日誌"
 msgstr "日誌"
 
 
+#: src/language/generate.ts:23
+msgid "Log file %{log_path} is not a regular file. "
+msgstr ""
+
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:67
 msgid "Log List"
 msgid "Log List"
 msgstr "日誌列表"
 msgstr "日誌列表"
@@ -2426,7 +2543,7 @@ msgid "Modify"
 msgstr "修改"
 msgstr "修改"
 
 
 #: src/routes/modules/certificates.ts:36
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgid "Modify Certificate"
 msgstr "修改憑證"
 msgstr "修改憑證"
 
 
@@ -2444,8 +2561,8 @@ msgstr "多行指令"
 
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:10
 #: src/views/certificate/CertificateList/certColumns.tsx:10
-#: src/views/certificate/components/CertificateEditor.vue:162
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/certificate/DNSCredential.vue:11
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
 #: src/views/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2603,7 +2720,7 @@ msgstr "Nginx 未執行"
 msgid "Nginx is running"
 msgid "Nginx is running"
 msgstr "Nginx 執行中"
 msgstr "Nginx 執行中"
 
 
-#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:143
+#: src/routes/modules/nginx_log.ts:9 src/views/nginx_log/NginxLog.vue:144
 msgid "Nginx Log"
 msgid "Nginx Log"
 msgstr "Nginx 日誌"
 msgstr "Nginx 日誌"
 
 
@@ -3554,7 +3671,7 @@ msgstr "執行中"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
 #: src/components/StdDesign/StdDetail/StdDetail.vue:93
-#: src/views/certificate/components/CertificateEditor.vue:266
+#: src/views/certificate/CertificateEditor.vue:266
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/components/ConfigName.vue:59
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/config/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
@@ -3611,7 +3728,7 @@ msgstr "串流 %{name} 成功儲存至 %{node}"
 
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #: src/views/preference/store/index.ts:118
 msgid "Save successfully"
 msgid "Save successfully"
 msgstr "儲存成功"
 msgstr "儲存成功"
@@ -3626,7 +3743,7 @@ msgstr "儲存成功"
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr "用手機掃描二維碼將賬戶新增到應用程式中。"
 msgstr "用手機掃描二維碼將賬戶新增到應用程式中。"
 
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgid "SDK"
 msgstr "SDK"
 msgstr "SDK"
 
 
@@ -3799,7 +3916,7 @@ msgstr "快取載入器迭代間的休眠時間"
 msgid "Sleep time between cache manager iterations"
 msgid "Sleep time between cache manager iterations"
 msgstr "快取管理器迭代間的休眠時間"
 msgstr "快取管理器迭代間的休眠時間"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgid "SSL Certificate Content"
 msgstr "SSL 憑證內容"
 msgstr "SSL 憑證內容"
 
 
@@ -3811,15 +3928,15 @@ msgstr "SSL 憑證檔案必須位於 Nginx 設定目錄下:{0}"
 msgid "SSL certificate file not found"
 msgid "SSL certificate file not found"
 msgstr "SSL 憑證檔案未找到"
 msgstr "SSL 憑證檔案未找到"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgid "SSL Certificate Key Content"
 msgstr "SSL 憑證金鑰內容"
 msgstr "SSL 憑證金鑰內容"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgid "SSL Certificate Key Path"
 msgstr "SSL 憑證金鑰路徑"
 msgstr "SSL 憑證金鑰路徑"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgid "SSL Certificate Path"
 msgstr "SSL 憑證路徑"
 msgstr "SSL 憑證路徑"
@@ -3984,7 +4101,7 @@ msgstr "同步節點"
 msgid "Sync strategy"
 msgid "Sync strategy"
 msgstr "同步策略"
 msgstr "同步策略"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgid "Sync to"
 msgstr "同步到"
 msgstr "同步到"
 
 
@@ -4053,11 +4170,11 @@ msgid ""
 "dashes, colons, and dots."
 "dashes, colons, and dots."
 msgstr "ICP 編號僅能包含字母、Unicode 字元、數字、連字號、破折號、冒號和句點。"
 msgstr "ICP 編號僅能包含字母、Unicode 字元、數字、連字號、破折號、冒號和句點。"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgid "The input is not a SSL Certificate"
 msgstr "輸入的不是 SSL 憑證"
 msgstr "輸入的不是 SSL 憑證"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgid "The input is not a SSL Certificate Key"
 msgstr "輸入的不是 SSL 憑證金鑰"
 msgstr "輸入的不是 SSL 憑證金鑰"
 
 
@@ -4088,11 +4205,11 @@ msgstr "節點名稱僅能包含字母、Unicode 字元、數字、連字號、
 msgid "The parameter of server_name is required"
 msgid "The parameter of server_name is required"
 msgstr "必須提供 server_name 參數"
 msgstr "必須提供 server_name 參數"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 msgid "The path exists, but the file is not a certificate"
 msgid "The path exists, but the file is not a certificate"
 msgstr "路徑存在,但檔案不是憑證"
 msgstr "路徑存在,但檔案不是憑證"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:196
+#: src/views/certificate/CertificateEditor.vue:196
 msgid "The path exists, but the file is not a private key"
 msgid "The path exists, but the file is not a private key"
 msgstr "路徑存在,但檔案不是金鑰"
 msgstr "路徑存在,但檔案不是金鑰"
 
 
@@ -4144,17 +4261,17 @@ msgid ""
 "lose access to your account."
 "lose access to your account."
 msgstr "這些代碼是您在遺失密碼和第二重驗證因素時,存取帳戶的最後手段。如果您找不到這些代碼,您將無法再存取您的帳戶。"
 msgstr "這些代碼是您在遺失密碼和第二重驗證因素時,存取帳戶的最後手段。如果您找不到這些代碼,您將無法再存取您的帳戶。"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr "此自動憑證項目無效,請將其移除。"
 msgstr "此自動憑證項目無效,請將其移除。"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 msgid "This certificate is managed by Nginx UI"
 msgstr "此憑證由 Nginx UI 管理"
 msgstr "此憑證由 Nginx UI 管理"
 
 
-#: src/views/certificate/components/CertificateEditor.vue:165
-#: src/views/certificate/components/CertificateEditor.vue:179
-#: src/views/certificate/components/CertificateEditor.vue:194
+#: src/views/certificate/CertificateEditor.vue:165
+#: src/views/certificate/CertificateEditor.vue:179
+#: src/views/certificate/CertificateEditor.vue:194
 msgid "This field is required"
 msgid "This field is required"
 msgstr "此欄位為必填項"
 msgstr "此欄位為必填項"
 
 

+ 2 - 2
app/src/routes/modules/certificates.ts

@@ -31,7 +31,7 @@ export const certificatesRoutes: RouteRecordRaw[] = [
       {
       {
         path: ':id',
         path: ':id',
         name: 'Modify Certificate',
         name: 'Modify Certificate',
-        component: () => import('@/views/certificate/components/CertificateEditor.vue'),
+        component: () => import('@/views/certificate/CertificateEditor.vue'),
         meta: {
         meta: {
           name: () => $gettext('Modify Certificate'),
           name: () => $gettext('Modify Certificate'),
           hiddenInSidebar: true,
           hiddenInSidebar: true,
@@ -41,7 +41,7 @@ export const certificatesRoutes: RouteRecordRaw[] = [
       {
       {
         path: 'import',
         path: 'import',
         name: 'Import Certificate',
         name: 'Import Certificate',
-        component: () => import('@/views/certificate/components/CertificateEditor.vue'),
+        component: () => import('@/views/certificate/CertificateEditor.vue'),
         meta: {
         meta: {
           name: () => $gettext('Import Certificate'),
           name: () => $gettext('Import Certificate'),
           hiddenInSidebar: true,
           hiddenInSidebar: true,

+ 19 - 19
app/src/views/certificate/components/CertificateEditor.vue → app/src/views/certificate/CertificateEditor.vue

@@ -2,14 +2,14 @@
 import type { Cert } from '@/api/cert'
 import type { Cert } from '@/api/cert'
 import type { Ref } from 'vue'
 import type { Ref } from 'vue'
 import cert from '@/api/cert'
 import cert from '@/api/cert'
-import AutoCertForm from '@/components/AutoCertForm/AutoCertForm.vue'
-import CertInfo from '@/components/CertInfo/CertInfo.vue'
-import CodeEditor from '@/components/CodeEditor/CodeEditor.vue'
-import FooterToolBar from '@/components/FooterToolbar/FooterToolBar.vue'
-import NodeSelector from '@/components/NodeSelector/NodeSelector.vue'
+import AutoCertForm from '@/components/AutoCertForm'
+import CertInfo from '@/components/CertInfo'
+import CodeEditor from '@/components/CodeEditor'
+import FooterToolBar from '@/components/FooterToolbar'
+import NodeSelector from '@/components/NodeSelector'
 import { AutoCertState } from '@/constants'
 import { AutoCertState } from '@/constants'
 import { message } from 'ant-design-vue'
 import { message } from 'ant-design-vue'
-import RenewCert from './RenewCert.vue'
+import RenewCert from './components/RenewCert.vue'
 
 
 const route = useRoute()
 const route = useRoute()
 
 
@@ -59,21 +59,21 @@ async function save() {
 provide('saveCert', save)
 provide('saveCert', save)
 
 
 const log = computed(() => {
 const log = computed(() => {
-  const logs = data.value.log?.split('\n')
+  if (!data.value.log)
+    return ''
 
 
-  logs.forEach((line, idx, lines) => {
-    const regex = /\[Nginx UI\] (.*)/
-
-    const matches = line.match(regex)
-
-    if (matches && matches.length > 1) {
-      const extractedText = matches[1]
-
-      lines[idx] = line.replaceAll(extractedText, $gettext(extractedText))
+  return data.value.log.split('\n').map(line => {
+    try {
+      return T(JSON.parse(line))
     }
     }
-  })
-
-  return logs.join('\n')
+    catch {
+      // fallback to legacy log format
+      const matches = line.match(/\[Nginx UI\] (.*)/)
+      if (matches?.[1])
+        return line.replaceAll(matches[1], $gettext(matches[1]))
+      return line
+    }
+  }).join('\n')
 })
 })
 
 
 const isManaged = computed(() => {
 const isManaged = computed(() => {

+ 1 - 1
app/src/views/certificate/DNSCredential.vue

@@ -5,7 +5,7 @@ import dns_credential from '@/api/dns_credential'
 import StdCurd from '@/components/StdDesign/StdDataDisplay/StdCurd.vue'
 import StdCurd from '@/components/StdDesign/StdDataDisplay/StdCurd.vue'
 import { datetime } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer'
 import { datetime } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer'
 import { input } from '@/components/StdDesign/StdDataEntry'
 import { input } from '@/components/StdDesign/StdDataEntry'
-import DNSChallenge from './DNSChallenge.vue'
+import DNSChallenge from './components/DNSChallenge.vue'
 
 
 const columns: Column[] = [{
 const columns: Column[] = [{
   title: () => $gettext('Name'),
   title: () => $gettext('Name'),

+ 0 - 0
app/src/views/certificate/DNSChallenge.vue → app/src/views/certificate/components/DNSChallenge.vue


+ 2 - 1
app/src/views/nginx_log/NginxLog.vue

@@ -60,7 +60,8 @@ function init() {
     addLog(r.content)
     addLog(r.content)
     openWs()
     openWs()
   }).catch(e => {
   }).catch(e => {
-    addLog(e.error)
+    if (e.error)
+      addLog(T(e.error))
   })
   })
 }
 }
 
 

+ 12 - 24
app/src/views/site/site_edit/components/Cert/ObtainCertLive.vue

@@ -58,31 +58,14 @@ async function issue_cert(config_name: string, server_name: string[], key_type:
     ws.onmessage = async m => {
     ws.onmessage = async m => {
       const r = JSON.parse(m.data)
       const r = JSON.parse(m.data)
 
 
-      const regex = /\[Nginx UI\] (.*)/
+      log(T(r))
 
 
-      const matches = r.message.match(regex)
-
-      if (matches && matches.length > 1) {
-        const extractedText = matches[1]
-
-        r.message = r.message.replaceAll(extractedText, $gettext(extractedText))
-      }
-
-      log(r.message)
-
-      // eslint-disable-next-line sonarjs/no-small-switch
       switch (r.status) {
       switch (r.status) {
-        case 'info':
-          // If it is a nginx ui log, increase the percent.
-          if (r.message.includes('[Nginx UI]'))
-            progressPercent.value += 8
-
-          break
-        default:
+        case 'success':
           modalClosable.value = true
           modalClosable.value = true
           issuingCert.value = false
           issuingCert.value = false
 
 
-          if (r.status === 'success' && r.ssl_certificate !== undefined && r.ssl_certificate_key !== undefined) {
+          if (r.ssl_certificate !== undefined && r.ssl_certificate_key !== undefined) {
             progressStatus.value = 'success'
             progressStatus.value = 'success'
             progressPercent.value = 100
             progressPercent.value = 100
             resolve({
             resolve({
@@ -91,10 +74,15 @@ async function issue_cert(config_name: string, server_name: string[], key_type:
               key_type: r.key_type,
               key_type: r.key_type,
             })
             })
           }
           }
-          else {
-            progressStatus.value = 'exception'
-            reject($gettext('Fail to obtain certificate'))
-          }
+          break
+        case 'error':
+          progressStatus.value = 'exception'
+          reject($gettext('Fail to obtain certificate'))
+          break
+        default:
+          // If it is a nginx ui log, increase the percent.
+          if (r.message.includes('[Nginx UI]'))
+            progressPercent.value += 8
           break
           break
       }
       }
     }
     }

+ 3 - 0
app/vite.config.ts

@@ -55,6 +55,9 @@ export default defineConfig(({ mode }) => {
               '$npgettext',
               '$npgettext',
             ],
             ],
           },
           },
+          {
+            '@/language': ['T'],
+          },
         ],
         ],
         vueTemplate: true,
         vueTemplate: true,
         eslintrc: {
         eslintrc: {

+ 196 - 0
cmd/translation/gettext.go

@@ -0,0 +1,196 @@
+// go run .
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"os"
+	"path/filepath"
+	"regexp"
+	"runtime"
+	"strings"
+
+	"github.com/uozi-tech/cosy/logger"
+)
+
+// Directories to exclude
+var excludeDirs = []string{
+	".devcontainer", ".github", ".idea", ".pnpm-store",
+	".vscode", "app", "query", "tmp", "cmd",
+}
+
+// Regular expression to match import statements for translation package
+var importRegex = regexp.MustCompile(`import\s+\(\s*((?:.|\n)*?)\s*\)|\s*import\s+(.*?)\s+".*?(?:internal/translation|github\.com/0xJacky/Nginx-UI/internal/translation)"`)
+var singleImportRegex = regexp.MustCompile(`\s*(?:(\w+)\s+)?".*?(?:internal/translation|github\.com/0xJacky/Nginx-UI/internal/translation)"`)
+
+func main() {
+	logger.Init("release")
+	// Start scanning from the project root
+	_, file, _, ok := runtime.Caller(0)
+	if !ok {
+		logger.Error("Unable to get the current file")
+		return
+	}
+
+	root := filepath.Join(filepath.Dir(file), "../../")
+	calls := make(map[string]bool)
+
+	// Scan all Go files
+	err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
+		if err != nil {
+			return err
+		}
+
+		// Skip excluded directories
+		for _, dir := range excludeDirs {
+			if strings.Contains(path, dir) {
+				if info.IsDir() {
+					return filepath.SkipDir
+				}
+				return nil
+			}
+		}
+
+		// Only process Go files
+		if !info.IsDir() && strings.HasSuffix(path, ".go") {
+			findTranslationC(path, calls)
+		}
+
+		return nil
+	})
+
+	if err != nil {
+		logger.Errorf("Error walking the path: %v\n", err)
+		return
+	}
+
+	// Generate a single TS file
+	generateSingleTSFile(root, calls)
+
+	logger.Infof("Found %d translation messages\n", len(calls))
+}
+
+// findTranslationC finds all translation.C calls in a file and adds them to the calls map
+func findTranslationC(filePath string, calls map[string]bool) {
+	// Read the entire file content
+	content, err := os.ReadFile(filePath)
+	if err != nil {
+		logger.Errorf("Error reading file %s: %v\n", filePath, err)
+		return
+	}
+
+	fileContent := string(content)
+
+	// Find the translation package alias from import statements
+	alias := findTranslationAlias(fileContent)
+	if alias == "" {
+		// No translation package imported, skip this file
+		return
+	}
+
+	// Create regex pattern based on the alias
+	pattern := fmt.Sprintf(`%s\.C\(\s*["']([^"']*(?:\\["'][^"']*)*)["']`, alias)
+	cCallRegex := regexp.MustCompile(pattern)
+
+	// Handle backtick strings separately (multi-line strings)
+	backtickPattern := fmt.Sprintf(`%s\.C\(\s*\x60([^\x60]*)\x60`, alias)
+	backtickRegex := regexp.MustCompile(backtickPattern)
+
+	// Find all matches with regular quotes
+	matches := cCallRegex.FindAllStringSubmatch(fileContent, -1)
+	for _, match := range matches {
+		if len(match) >= 2 {
+			message := match[1]
+			// Clean up the message (remove escaped quotes, etc.)
+			message = strings.ReplaceAll(message, "\\\"", "\"")
+			message = strings.ReplaceAll(message, "\\'", "'")
+
+			// Add to the map if not already present
+			if _, exists := calls[message]; !exists {
+				calls[message] = true
+			}
+		}
+	}
+
+	// Find all matches with backticks
+	backtickMatches := backtickRegex.FindAllStringSubmatch(fileContent, -1)
+	for _, match := range backtickMatches {
+		if len(match) >= 2 {
+			message := match[1]
+
+			// Add to the map if not already present
+			if _, exists := calls[message]; !exists {
+				calls[message] = true
+			}
+		}
+	}
+}
+
+// findTranslationAlias finds the alias for the translation package in import statements
+func findTranslationAlias(fileContent string) string {
+	// Default alias
+	alias := "translation"
+
+	// Find import blocks
+	matches := importRegex.FindAllStringSubmatch(fileContent, -1)
+	for _, match := range matches {
+		if len(match) >= 3 && match[1] != "" {
+			// This is a block import, search inside it
+			imports := match[1]
+			singleMatches := singleImportRegex.FindAllStringSubmatch(imports, -1)
+			for _, singleMatch := range singleMatches {
+				if len(singleMatch) >= 2 && singleMatch[1] != "" {
+					// Custom alias found
+					return singleMatch[1]
+				}
+			}
+		} else if len(match) >= 3 && match[2] != "" {
+			// This is a single-line import
+			singleMatch := singleImportRegex.FindAllStringSubmatch(match[2], -1)
+			if len(singleMatch) > 0 && len(singleMatch[0]) >= 2 && singleMatch[0][1] != "" {
+				// Custom alias found
+				return singleMatch[0][1]
+			}
+		}
+	}
+
+	return alias
+}
+
+// generateSingleTSFile generates a single TS file with all translation messages
+func generateSingleTSFile(root string, calls map[string]bool) {
+	outputPath := filepath.Join(root, "app/src/language/generate.ts")
+
+	// Create the directory if it doesn't exist
+	err := os.MkdirAll(filepath.Dir(outputPath), 0755)
+	if err != nil {
+		logger.Errorf("Error creating directory: %v\n", err)
+		return
+	}
+
+	// Create the output file
+	file, err := os.Create(outputPath)
+	if err != nil {
+		logger.Errorf("Error creating file: %v\n", err)
+		return
+	}
+	defer file.Close()
+
+	writer := bufio.NewWriter(file)
+
+	// Write the header
+	writer.WriteString("// This file is auto-generated. DO NOT EDIT MANUALLY.\n\n")
+	writer.WriteString("export const msg = [\n")
+
+	// Write each translation message
+	for message := range calls {
+		// Escape single quotes in the message for JavaScript
+		escapedMessage := strings.ReplaceAll(message, "'", "\\'")
+		writer.WriteString(fmt.Sprintf("  $gettext('%s'),\n", escapedMessage))
+	}
+
+	writer.WriteString("]\n")
+	writer.Flush()
+
+	logger.Infof("Generated TS file at %s\n", outputPath)
+}

+ 7 - 12
internal/cert/auto_cert.go

@@ -1,14 +1,15 @@
 package cert
 package cert
 
 
 import (
 import (
+	"runtime"
+	"strings"
+	"time"
+
 	"github.com/0xJacky/Nginx-UI/internal/notification"
 	"github.com/0xJacky/Nginx-UI/internal/notification"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/settings"
 	"github.com/0xJacky/Nginx-UI/settings"
 	"github.com/pkg/errors"
 	"github.com/pkg/errors"
 	"github.com/uozi-tech/cosy/logger"
 	"github.com/uozi-tech/cosy/logger"
-	"runtime"
-	"strings"
-	"time"
 )
 )
 
 
 func AutoCert() {
 func AutoCert() {
@@ -30,9 +31,9 @@ func AutoCert() {
 func autoCert(certModel *model.Cert) {
 func autoCert(certModel *model.Cert) {
 	confName := certModel.Filename
 	confName := certModel.Filename
 
 
-	log := &Logger{}
+	log := NewLogger()
 	log.SetCertModel(certModel)
 	log.SetCertModel(certModel)
-	defer log.Exit()
+	defer log.Close()
 
 
 	if len(certModel.Filename) == 0 {
 	if len(certModel.Filename) == 0 {
 		log.Error(ErrCertModelFilenameEmpty)
 		log.Error(ErrCertModelFilenameEmpty)
@@ -93,13 +94,7 @@ func autoCert(certModel *model.Cert) {
 	}
 	}
 
 
 	// errChan will be closed inside IssueCert
 	// errChan will be closed inside IssueCert
-	go IssueCert(payload, logChan, errChan)
-
-	go func() {
-		for logString := range logChan {
-			log.Info(strings.TrimSpace(logString))
-		}
-	}()
+	go IssueCert(payload, log, errChan)
 
 
 	// block, unless errChan closed
 	// block, unless errChan closed
 	for err := range errChan {
 	for err := range errChan {

+ 25 - 16
internal/cert/issue.go

@@ -3,10 +3,12 @@ package cert
 import (
 import (
 	"log"
 	"log"
 	"os"
 	"os"
+	"runtime"
 	"time"
 	"time"
 
 
 	"github.com/0xJacky/Nginx-UI/internal/cert/dns"
 	"github.com/0xJacky/Nginx-UI/internal/cert/dns"
 	"github.com/0xJacky/Nginx-UI/internal/nginx"
 	"github.com/0xJacky/Nginx-UI/internal/nginx"
+	"github.com/0xJacky/Nginx-UI/internal/translation"
 	"github.com/0xJacky/Nginx-UI/internal/transport"
 	"github.com/0xJacky/Nginx-UI/internal/transport"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/query"
 	"github.com/0xJacky/Nginx-UI/query"
@@ -26,9 +28,11 @@ const (
 	DNS01  = "dns01"
 	DNS01  = "dns01"
 )
 )
 
 
-func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error) {
+func IssueCert(payload *ConfigPayload, certLogger *Logger, errChan chan error) {
 	defer func() {
 	defer func() {
 		if err := recover(); err != nil {
 		if err := recover(); err != nil {
+			buf := make([]byte, 1024)
+			runtime.Stack(buf, false)
 			logger.Error(err)
 			logger.Error(err)
 		}
 		}
 	}()
 	}()
@@ -49,18 +53,23 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 		legolog.Logger = log.New(os.Stderr, "", log.LstdFlags)
 		legolog.Logger = log.New(os.Stderr, "", log.LstdFlags)
 	}()
 	}()
 
 
-	l.Println("[INFO] [Nginx UI] Preparing lego configurations")
+	certLogger.Info(translation.C("[Nginx UI] Preparing lego configurations"))
 	user, err := payload.GetACMEUser()
 	user, err := payload.GetACMEUser()
 	if err != nil {
 	if err != nil {
 		errChan <- errors.Wrap(err, "issue cert get acme user error")
 		errChan <- errors.Wrap(err, "issue cert get acme user error")
 		return
 		return
 	}
 	}
-	l.Printf("[INFO] [Nginx UI] ACME User: %s, Email: %s, CA Dir: %s\n", user.Name, user.Email, user.CADir)
+
+	certLogger.Info(translation.C("[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}", map[string]any{
+		"name":  user.Name,
+		"email": user.Email,
+		"caDir": user.CADir,
+	}))
 
 
 	// Start a goroutine to fetch and process logs from channel
 	// Start a goroutine to fetch and process logs from channel
 	go func() {
 	go func() {
 		for msg := range cw.Ch {
 		for msg := range cw.Ch {
-			logChan <- string(msg)
+			certLogger.Info(translation.C(string(msg)))
 		}
 		}
 	}()
 	}()
 
 
@@ -80,7 +89,7 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 
 
 	config.Certificate.KeyType = payload.GetKeyType()
 	config.Certificate.KeyType = payload.GetKeyType()
 
 
-	l.Println("[INFO] [Nginx UI] Creating client facilitates communication with the CA server")
+	certLogger.Info(translation.C("[Nginx UI] Creating client facilitates communication with the CA server"))
 	// A client facilitates communication with the CA server.
 	// A client facilitates communication with the CA server.
 	client, err := lego.NewClient(config)
 	client, err := lego.NewClient(config)
 	if err != nil {
 	if err != nil {
@@ -92,7 +101,7 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 	default:
 	default:
 		fallthrough
 		fallthrough
 	case HTTP01:
 	case HTTP01:
-		l.Println("[INFO] [Nginx UI] Setting HTTP01 challenge provider")
+		certLogger.Info(translation.C("[Nginx UI] Setting HTTP01 challenge provider"))
 		err = client.Challenge.SetHTTP01Provider(
 		err = client.Challenge.SetHTTP01Provider(
 			http01.NewProviderServer("",
 			http01.NewProviderServer("",
 				settings.CertSettings.HTTPChallengePort,
 				settings.CertSettings.HTTPChallengePort,
@@ -106,14 +115,14 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 			return
 			return
 		}
 		}
 
 
-		l.Println("[INFO] [Nginx UI] Setting DNS01 challenge provider")
+		certLogger.Info(translation.C("[Nginx UI] Setting DNS01 challenge provider"))
 		code := dnsCredential.Config.Code
 		code := dnsCredential.Config.Code
 		pConfig, ok := dns.GetProvider(code)
 		pConfig, ok := dns.GetProvider(code)
 		if !ok {
 		if !ok {
 			errChan <- errors.Wrap(err, "provider not found")
 			errChan <- errors.Wrap(err, "provider not found")
 			return
 			return
 		}
 		}
-		l.Println("[INFO] [Nginx UI] Setting environment variables")
+		certLogger.Info(translation.C("[Nginx UI] Setting environment variables"))
 		if dnsCredential.Config.Configuration != nil {
 		if dnsCredential.Config.Configuration != nil {
 			err = pConfig.SetEnv(*dnsCredential.Config.Configuration)
 			err = pConfig.SetEnv(*dnsCredential.Config.Configuration)
 			if err != nil {
 			if err != nil {
@@ -123,7 +132,7 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 			}
 			}
 			defer func() {
 			defer func() {
 				pConfig.CleanEnv()
 				pConfig.CleanEnv()
-				l.Println("[INFO] [Nginx UI] Environment variables cleaned")
+				certLogger.Info(translation.C("[Nginx UI] Environment variables cleaned"))
 			}()
 			}()
 			provider, err := dnsproviders.NewDNSChallengeProviderByName(code)
 			provider, err := dnsproviders.NewDNSChallengeProviderByName(code)
 			if err != nil {
 			if err != nil {
@@ -167,7 +176,7 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 	var oldResource *model.CertificateResource
 	var oldResource *model.CertificateResource
 
 
 	if payload.RevokeOld && payload.Resource != nil && payload.Resource.Certificate != nil {
 	if payload.RevokeOld && payload.Resource != nil && payload.Resource.Certificate != nil {
-		l.Println("[INFO] [Nginx UI] Backing up current certificate for later revocation")
+		certLogger.Info(translation.C("[Nginx UI] Backing up current certificate for later revocation"))
 
 
 		// Save a copy of the old certificate and key
 		// Save a copy of the old certificate and key
 		oldResource = &model.CertificateResource{
 		oldResource = &model.CertificateResource{
@@ -179,16 +188,16 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 
 
 	if time.Now().Sub(payload.NotBefore).Hours()/24 <= 21 &&
 	if time.Now().Sub(payload.NotBefore).Hours()/24 <= 21 &&
 		payload.Resource != nil && payload.Resource.Certificate != nil {
 		payload.Resource != nil && payload.Resource.Certificate != nil {
-		renew(payload, client, l, errChan)
+		renew(payload, client, certLogger, errChan)
 	} else {
 	} else {
-		obtain(payload, client, l, errChan)
+		obtain(payload, client, certLogger, errChan)
 	}
 	}
 
 
-	l.Println("[INFO] [Nginx UI] Reloading nginx")
+	certLogger.Info(translation.C("[Nginx UI] Reloading nginx"))
 
 
 	nginx.Reload()
 	nginx.Reload()
 
 
-	l.Println("[INFO] [Nginx UI] Finished")
+	certLogger.Info(translation.C("[Nginx UI] Finished"))
 
 
 	if payload.GetCertificatePath() == cSettings.ServerSettings.SSLCert &&
 	if payload.GetCertificatePath() == cSettings.ServerSettings.SSLCert &&
 		payload.GetCertificateKeyPath() == cSettings.ServerSettings.SSLKey {
 		payload.GetCertificateKeyPath() == cSettings.ServerSettings.SSLKey {
@@ -197,7 +206,7 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 
 
 	// Revoke old certificate if requested and we have a backup
 	// Revoke old certificate if requested and we have a backup
 	if payload.RevokeOld && oldResource != nil && len(oldResource.Certificate) > 0 {
 	if payload.RevokeOld && oldResource != nil && len(oldResource.Certificate) > 0 {
-		l.Println("[INFO] [Nginx UI] Revoking old certificate")
+		certLogger.Info(translation.C("[Nginx UI] Revoking old certificate"))
 
 
 		// Create a payload for revocation using old certificate
 		// Create a payload for revocation using old certificate
 		revokePayload := &ConfigPayload{
 		revokePayload := &ConfigPayload{
@@ -211,7 +220,7 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 		}
 		}
 
 
 		// Revoke the old certificate
 		// Revoke the old certificate
-		revoke(revokePayload, client, l, errChan)
+		revoke(revokePayload, client, certLogger, errChan)
 	}
 	}
 
 
 	// Wait log to be written
 	// Wait log to be written

+ 70 - 7
internal/cert/logger.go

@@ -2,35 +2,95 @@ package cert
 
 
 import (
 import (
 	"fmt"
 	"fmt"
-	"github.com/0xJacky/Nginx-UI/model"
-	"github.com/uozi-tech/cosy/logger"
 	"strings"
 	"strings"
+	"sync"
 	"time"
 	"time"
+
+	"github.com/0xJacky/Nginx-UI/internal/translation"
+	"github.com/0xJacky/Nginx-UI/model"
+	"github.com/gorilla/websocket"
+	"github.com/uozi-tech/cosy/logger"
 )
 )
 
 
 type Logger struct {
 type Logger struct {
 	buffer []string
 	buffer []string
 	cert   *model.Cert
 	cert   *model.Cert
+	ws     *websocket.Conn
+	trans  *translation.Container
+	mu     sync.Mutex
+	msgCh  chan []byte
+	done   chan struct{}
+}
+
+func NewLogger() *Logger {
+	l := &Logger{
+		msgCh: make(chan []byte, 100),
+		done:  make(chan struct{}),
+	}
+	go l.processMessages()
+	return l
+}
+
+func (t *Logger) processMessages() {
+	for {
+		select {
+		case msg := <-t.msgCh:
+			t.mu.Lock()
+			if t.ws != nil {
+				_ = t.ws.WriteMessage(websocket.TextMessage, msg)
+			}
+			t.mu.Unlock()
+		case <-t.done:
+			return
+		}
+	}
 }
 }
 
 
 func (t *Logger) SetCertModel(cert *model.Cert) {
 func (t *Logger) SetCertModel(cert *model.Cert) {
+	t.mu.Lock()
+	defer t.mu.Unlock()
 	t.cert = cert
 	t.cert = cert
 }
 }
 
 
-func (t *Logger) Info(text string) {
-	t.buffer = append(t.buffer, strings.TrimSpace(text))
-	logger.Info("AutoCert", strings.TrimSpace(text))
+func (t *Logger) SetWebSocket(ws *websocket.Conn) {
+	t.mu.Lock()
+	defer t.mu.Unlock()
+	t.ws = ws
+}
+
+func (t *Logger) Info(c *translation.Container) {
+	result, err := c.ToJSON()
+	if err != nil {
+		return
+	}
+
+	t.mu.Lock()
+	t.buffer = append(t.buffer, string(result))
+	t.mu.Unlock()
+
+	logger.Info("AutoCert", c.ToString())
+
+	t.msgCh <- result
 }
 }
 
 
 func (t *Logger) Error(err error) {
 func (t *Logger) Error(err error) {
+	t.mu.Lock()
 	t.buffer = append(t.buffer, fmt.Sprintf("%s [Error] %s",
 	t.buffer = append(t.buffer, fmt.Sprintf("%s [Error] %s",
-		time.Now().Format("2006/01/02 15:04:05"),
+		time.Now().Format(time.DateTime),
 		strings.TrimSpace(err.Error()),
 		strings.TrimSpace(err.Error()),
 	))
 	))
+	t.mu.Unlock()
+
 	logger.Error("AutoCert", err)
 	logger.Error("AutoCert", err)
 }
 }
 
 
-func (t *Logger) Exit() {
+func (t *Logger) Close() {
+	t.mu.Lock()
+	defer t.mu.Unlock()
+
+	close(t.msgCh)
+	close(t.done)
+
 	if t.cert == nil {
 	if t.cert == nil {
 		return
 		return
 	}
 	}
@@ -41,6 +101,9 @@ func (t *Logger) Exit() {
 }
 }
 
 
 func (t *Logger) ToString() (content string) {
 func (t *Logger) ToString() (content string) {
+	t.mu.Lock()
+	defer t.mu.Unlock()
+
 	content = strings.Join(t.buffer, "\n")
 	content = strings.Join(t.buffer, "\n")
 	return
 	return
 }
 }

+ 3 - 3
internal/cert/obtain.go

@@ -1,21 +1,21 @@
 package cert
 package cert
 
 
 import (
 import (
+	"github.com/0xJacky/Nginx-UI/internal/translation"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/go-acme/lego/v4/certificate"
 	"github.com/go-acme/lego/v4/certificate"
 	"github.com/go-acme/lego/v4/lego"
 	"github.com/go-acme/lego/v4/lego"
 	"github.com/pkg/errors"
 	"github.com/pkg/errors"
-	"log"
 )
 )
 
 
-func obtain(payload *ConfigPayload, client *lego.Client, l *log.Logger, errChan chan error) {
+func obtain(payload *ConfigPayload, client *lego.Client, l *Logger, errChan chan error) {
 	request := certificate.ObtainRequest{
 	request := certificate.ObtainRequest{
 		Domains:    payload.ServerName,
 		Domains:    payload.ServerName,
 		Bundle:     true,
 		Bundle:     true,
 		MustStaple: payload.MustStaple,
 		MustStaple: payload.MustStaple,
 	}
 	}
 
 
-	l.Println("[INFO] [Nginx UI] Obtaining certificate")
+	l.Info(translation.C("[Nginx UI] Obtaining certificate"))
 	certificates, err := client.Certificate.Obtain(request)
 	certificates, err := client.Certificate.Obtain(request)
 	if err != nil {
 	if err != nil {
 		errChan <- errors.Wrap(err, "obtain certificate error")
 		errChan <- errors.Wrap(err, "obtain certificate error")

+ 4 - 4
internal/cert/payload.go

@@ -1,7 +1,6 @@
 package cert
 package cert
 
 
 import (
 import (
-	"log"
 	"os"
 	"os"
 	"path/filepath"
 	"path/filepath"
 	"strings"
 	"strings"
@@ -9,6 +8,7 @@ import (
 
 
 	"github.com/0xJacky/Nginx-UI/internal/helper"
 	"github.com/0xJacky/Nginx-UI/internal/helper"
 	"github.com/0xJacky/Nginx-UI/internal/nginx"
 	"github.com/0xJacky/Nginx-UI/internal/nginx"
+	"github.com/0xJacky/Nginx-UI/internal/translation"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/query"
 	"github.com/0xJacky/Nginx-UI/query"
 	"github.com/go-acme/lego/v4/certcrypto"
 	"github.com/go-acme/lego/v4/certcrypto"
@@ -76,7 +76,7 @@ func (c *ConfigPayload) mkCertificateDir() (err error) {
 	return
 	return
 }
 }
 
 
-func (c *ConfigPayload) WriteFile(l *log.Logger, errChan chan error) {
+func (c *ConfigPayload) WriteFile(l *Logger, errChan chan error) {
 	err := c.mkCertificateDir()
 	err := c.mkCertificateDir()
 	if err != nil {
 	if err != nil {
 		errChan <- errors.Wrap(err, "make certificate dir error")
 		errChan <- errors.Wrap(err, "make certificate dir error")
@@ -85,7 +85,7 @@ func (c *ConfigPayload) WriteFile(l *log.Logger, errChan chan error) {
 
 
 	// Each certificate comes back with the cert bytes, the bytes of the client's
 	// Each certificate comes back with the cert bytes, the bytes of the client's
 	// private key, and a certificate URL. SAVE THESE TO DISK.
 	// private key, and a certificate URL. SAVE THESE TO DISK.
-	l.Println("[INFO] [Nginx UI] Writing certificate to disk")
+	l.Info(translation.C("[Nginx UI] Writing certificate to disk"))
 	err = os.WriteFile(c.GetCertificatePath(),
 	err = os.WriteFile(c.GetCertificatePath(),
 		c.Resource.Certificate, 0644)
 		c.Resource.Certificate, 0644)
 
 
@@ -94,7 +94,7 @@ func (c *ConfigPayload) WriteFile(l *log.Logger, errChan chan error) {
 		return
 		return
 	}
 	}
 
 
-	l.Println("[INFO] [Nginx UI] Writing certificate private key to disk")
+	l.Info(translation.C("[Nginx UI] Writing certificate private key to disk"))
 	err = os.WriteFile(c.GetCertificateKeyPath(),
 	err = os.WriteFile(c.GetCertificateKeyPath(),
 		c.Resource.PrivateKey, 0644)
 		c.Resource.PrivateKey, 0644)
 
 

+ 3 - 3
internal/cert/renew.go

@@ -1,14 +1,14 @@
 package cert
 package cert
 
 
 import (
 import (
+	"github.com/0xJacky/Nginx-UI/internal/translation"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/go-acme/lego/v4/certificate"
 	"github.com/go-acme/lego/v4/certificate"
 	"github.com/go-acme/lego/v4/lego"
 	"github.com/go-acme/lego/v4/lego"
 	"github.com/pkg/errors"
 	"github.com/pkg/errors"
-	"log"
 )
 )
 
 
-func renew(payload *ConfigPayload, client *lego.Client, l *log.Logger, errChan chan error) {
+func renew(payload *ConfigPayload, client *lego.Client, l *Logger, errChan chan error) {
 	if payload.Resource == nil {
 	if payload.Resource == nil {
 		errChan <- ErrPayloadResourceIsNil
 		errChan <- ErrPayloadResourceIsNil
 		return
 		return
@@ -35,5 +35,5 @@ func renew(payload *ConfigPayload, client *lego.Client, l *log.Logger, errChan c
 
 
 	payload.WriteFile(l, errChan)
 	payload.WriteFile(l, errChan)
 
 
-	l.Println("[INFO] [Nginx UI] Certificate renewed successfully")
+	l.Info(translation.C("[Nginx UI] Certificate renewed successfully"))
 }
 }

+ 14 - 10
internal/cert/revoke.go

@@ -3,8 +3,10 @@ package cert
 import (
 import (
 	"log"
 	"log"
 	"os"
 	"os"
+	"runtime"
 	"time"
 	"time"
 
 
+	"github.com/0xJacky/Nginx-UI/internal/translation"
 	"github.com/0xJacky/Nginx-UI/internal/transport"
 	"github.com/0xJacky/Nginx-UI/internal/transport"
 	"github.com/go-acme/lego/v4/lego"
 	"github.com/go-acme/lego/v4/lego"
 	legolog "github.com/go-acme/lego/v4/log"
 	legolog "github.com/go-acme/lego/v4/log"
@@ -14,9 +16,11 @@ import (
 )
 )
 
 
 // RevokeCert revokes a certificate and provides log messages through channels
 // RevokeCert revokes a certificate and provides log messages through channels
-func RevokeCert(payload *ConfigPayload, logChan chan string, errChan chan error) {
+func RevokeCert(payload *ConfigPayload, certLogger *Logger, logChan chan string, errChan chan error) {
 	defer func() {
 	defer func() {
 		if err := recover(); err != nil {
 		if err := recover(); err != nil {
+			buf := make([]byte, 1024)
+			runtime.Stack(buf, false)
 			logger.Error(err)
 			logger.Error(err)
 		}
 		}
 	}()
 	}()
@@ -46,7 +50,7 @@ func RevokeCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 	}()
 	}()
 
 
 	// Create client for communication with CA server
 	// Create client for communication with CA server
-	l.Println("[INFO] [Nginx UI] Preparing for certificate revocation")
+	certLogger.Info(translation.C("[Nginx UI] Preparing for certificate revocation"))
 	user, err := payload.GetACMEUser()
 	user, err := payload.GetACMEUser()
 	if err != nil {
 	if err != nil {
 		errChan <- errors.Wrap(err, "get ACME user error")
 		errChan <- errors.Wrap(err, "get ACME user error")
@@ -76,30 +80,30 @@ func RevokeCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 		return
 		return
 	}
 	}
 
 
-	revoke(payload, client, l, errChan)
+	revoke(payload, client, certLogger, errChan)
 
 
 	// If the revoked certificate was used for the server itself, reload server TLS certificate
 	// If the revoked certificate was used for the server itself, reload server TLS certificate
 	if payload.GetCertificatePath() == cSettings.ServerSettings.SSLCert &&
 	if payload.GetCertificatePath() == cSettings.ServerSettings.SSLCert &&
 		payload.GetCertificateKeyPath() == cSettings.ServerSettings.SSLKey {
 		payload.GetCertificateKeyPath() == cSettings.ServerSettings.SSLKey {
-		l.Println("[INFO] [Nginx UI] Certificate was used for server, reloading server TLS certificate")
+		certLogger.Info(translation.C("[Nginx UI] Certificate was used for server, reloading server TLS certificate"))
 		ReloadServerTLSCertificate()
 		ReloadServerTLSCertificate()
 	}
 	}
 
 
-	l.Println("[INFO] [Nginx UI] Revocation completed")
+	certLogger.Info(translation.C("[Nginx UI] Revocation completed"))
 
 
 	// Wait for logs to be written
 	// Wait for logs to be written
 	time.Sleep(2 * time.Second)
 	time.Sleep(2 * time.Second)
 }
 }
 
 
 // revoke implements the internal certificate revocation logic
 // revoke implements the internal certificate revocation logic
-func revoke(payload *ConfigPayload, client *lego.Client, l *log.Logger, errChan chan error) {
-	l.Println("[INFO] [Nginx UI] Revoking certificate")
+func revoke(payload *ConfigPayload, client *lego.Client, l *Logger, errChan chan error) {
+	l.Info(translation.C("[Nginx UI] Revoking certificate"))
 	err := client.Certificate.Revoke(payload.Resource.Certificate)
 	err := client.Certificate.Revoke(payload.Resource.Certificate)
 	if err != nil {
 	if err != nil {
 		errChan <- errors.Wrap(err, "revoke certificate error")
 		errChan <- errors.Wrap(err, "revoke certificate error")
-		return 
+		return
 	}
 	}
 
 
-	l.Println("[INFO] [Nginx UI] Certificate successfully revoked")
-	return 
+	l.Info(translation.C("[Nginx UI] Certificate successfully revoked"))
+	return
 }
 }

+ 0 - 54
internal/self_check/self_check.go

@@ -3,64 +3,10 @@ package self_check
 import (
 import (
 	"errors"
 	"errors"
 
 
-	"github.com/0xJacky/Nginx-UI/internal/helper"
 	"github.com/uozi-tech/cosy"
 	"github.com/uozi-tech/cosy"
 )
 )
 
 
-type Task struct {
-	Name      string
-	CheckFunc func() error
-	FixFunc   func() error
-}
-
-type Report struct {
-	Name string      `json:"name"`
-	Err  *cosy.Error `json:"err,omitempty"`
-}
-
-type Reports []*Report
-
-var selfCheckTasks = []*Task{
-	{
-		Name:      "Directory-Sites",
-		CheckFunc: CheckSitesDirectory,
-		FixFunc:   FixSitesDirectory,
-	},
-	{
-		Name:      "Directory-Streams",
-		CheckFunc: CheckStreamDirectory,
-		FixFunc:   FixStreamDirectory,
-	},
-	{
-		Name:      "NginxConf-Sites-Enabled",
-		CheckFunc: CheckNginxConfIncludeSites,
-		FixFunc:   FixNginxConfIncludeSites,
-	},
-	{
-		Name:      "NginxConf-Streams-Enabled",
-		CheckFunc: CheckNginxConfIncludeStreams,
-		FixFunc:   FixNginxConfIncludeStreams,
-	},
-	{
-		Name:      "NginxConf-ConfD",
-		CheckFunc: CheckNginxConfIncludeConfD,
-		FixFunc:   FixNginxConfIncludeConfD,
-	},
-}
 
 
-var selfCheckTaskMap = make(map[string]*Task)
-
-func init() {
-	for _, task := range selfCheckTasks {
-		selfCheckTaskMap[task.Name] = task
-	}
-	if helper.InNginxUIOfficialDocker() {
-		selfCheckTasks = append(selfCheckTasks, &Task{
-			Name:      "Docker-Socket",
-			CheckFunc: CheckDockerSocket,
-		})
-	}
-}
 
 
 func Run() (reports Reports) {
 func Run() (reports Reports) {
 	reports = make(Reports, 0)
 	reports = make(Reports, 0)

+ 61 - 0
internal/self_check/tasks.go

@@ -0,0 +1,61 @@
+package self_check
+
+import (
+	"github.com/0xJacky/Nginx-UI/internal/helper"
+	"github.com/uozi-tech/cosy"
+)
+
+type Task struct {
+	Name      string
+	CheckFunc func() error
+	FixFunc   func() error
+}
+
+type Report struct {
+	Name string      `json:"name"`
+	Err  *cosy.Error `json:"err,omitempty"`
+}
+
+type Reports []*Report
+
+var selfCheckTasks = []*Task{
+	{
+		Name:      "Directory-Sites",
+		CheckFunc: CheckSitesDirectory,
+		FixFunc:   FixSitesDirectory,
+	},
+	{
+		Name:      "Directory-Streams",
+		CheckFunc: CheckStreamDirectory,
+		FixFunc:   FixStreamDirectory,
+	},
+	{
+		Name:      "NginxConf-Sites-Enabled",
+		CheckFunc: CheckNginxConfIncludeSites,
+		FixFunc:   FixNginxConfIncludeSites,
+	},
+	{
+		Name:      "NginxConf-Streams-Enabled",
+		CheckFunc: CheckNginxConfIncludeStreams,
+		FixFunc:   FixNginxConfIncludeStreams,
+	},
+	{
+		Name:      "NginxConf-ConfD",
+		CheckFunc: CheckNginxConfIncludeConfD,
+		FixFunc:   FixNginxConfIncludeConfD,
+	},
+}
+
+var selfCheckTaskMap = make(map[string]*Task)
+
+func init() {
+	for _, task := range selfCheckTasks {
+		selfCheckTaskMap[task.Name] = task
+	}
+	if helper.InNginxUIOfficialDocker() {
+		selfCheckTasks = append(selfCheckTasks, &Task{
+			Name:      "Docker-Socket",
+			CheckFunc: CheckDockerSocket,
+		})
+	}
+}

+ 0 - 1
internal/self_check/websocket.go

@@ -1 +0,0 @@
-package self_check

+ 40 - 0
internal/translation/container.go

@@ -0,0 +1,40 @@
+package translation
+
+import (
+	"encoding/json"
+	"fmt"
+	"strings"
+)
+
+// Container contains a source string and a map of arguments.
+type Container struct {
+	Message string         `json:"message"`
+	Args    map[string]any `json:"args,omitempty"`
+}
+
+// C creates a new Container.
+func C(message string, args ...map[string]any) *Container {
+	if len(args) == 0 {
+		return &Container{
+			Message: message,
+		}
+	}
+	return &Container{
+		Message: message,
+		Args:    args[0],
+	}
+}
+
+// ToString returns the source string with the arguments replaced.
+func (c *Container) ToString() (result string) {
+	result = c.Message
+	for k, v := range c.Args {
+		result = strings.ReplaceAll(result, "%{"+k+"}", fmt.Sprintf("%v", v))
+	}
+	return
+}
+
+// ToJSON returns the arguments as a JSON object.
+func (c *Container) ToJSON() (result []byte, err error) {
+	return json.Marshal(c)
+}

+ 3 - 2
internal/translation/translation.go

@@ -3,11 +3,12 @@ package translation
 import (
 import (
 	"encoding/json"
 	"encoding/json"
 	"fmt"
 	"fmt"
+	"io"
+	"log"
+
 	"github.com/0xJacky/Nginx-UI/app"
 	"github.com/0xJacky/Nginx-UI/app"
 	"github.com/0xJacky/pofile"
 	"github.com/0xJacky/pofile"
 	"github.com/samber/lo"
 	"github.com/samber/lo"
-	"io"
-	"log"
 )
 )
 
 
 var Dict map[string]pofile.Dict
 var Dict map[string]pofile.Dict

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