Selaa lähdekoodia

enhance: translations

Jacky 1 viikko sitten
vanhempi
commit
e8f1321e0c
45 muutettua tiedostoa jossa 3558 lisäystä ja 1503 poistoa
  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"
 
 	"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/query"
 	"github.com/gin-gonic/gin"
@@ -27,27 +29,6 @@ type IssueCertResponse struct {
 	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) {
 	name := c.Param("name")
 	var upGrader = websocket.Upgrader{
@@ -63,9 +44,7 @@ func IssueCert(c *gin.Context) {
 		return
 	}
 
-	defer func(ws *websocket.Conn) {
-		_ = ws.Close()
-	}(ws)
+	defer ws.Close()
 
 	// read
 	payload := &cert.ConfigPayload{}
@@ -92,30 +71,28 @@ func IssueCert(c *gin.Context) {
 		}
 	}
 
-	logChan := make(chan string, 1)
 	errChan := make(chan error, 1)
 
-	log := &cert.Logger{}
+	log := cert.NewLogger()
 	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
-	for err = range errChan {
+	if err := <-errChan; err != nil {
 		log.Error(err)
-		// Save logs to db
-		log.Exit()
 		err = ws.WriteJSON(IssueCertResponse{
 			Status:  Error,
 			Message: err.Error(),
 		})
 		if err != nil {
-			logger.Error(err)
+			if helper.IsUnexpectedWebsocketError(err) {
+				logger.Error(err)
+			}
 			return
 		}
-		return
 	}
 
 	cert := query.Cert
@@ -142,19 +119,17 @@ func IssueCert(c *gin.Context) {
 		})
 		return
 	}
-
-	// Save logs to db
-	log.Exit()
-
 	err = ws.WriteJSON(IssueCertResponse{
 		Status:            Success,
-		Message:           "Issued certificate successfully",
+		Message:           translation.C("[Nginx UI] Issued certificate successfully").ToString(),
 		SSLCertificate:    payload.GetCertificatePath(),
 		SSLCertificateKey: payload.GetCertificateKeyPath(),
 		KeyType:           payload.GetKeyType(),
 	})
 	if err != nil {
-		logger.Error(err)
+		if helper.IsUnexpectedWebsocketError(err) {
+			logger.Error(err)
+		}
 		return
 	}
 }

+ 23 - 13
api/certificate/revoke.go

@@ -4,6 +4,7 @@ import (
 	"net/http"
 
 	"github.com/0xJacky/Nginx-UI/internal/cert"
+	"github.com/0xJacky/Nginx-UI/internal/translation"
 	"github.com/0xJacky/Nginx-UI/query"
 	"github.com/gin-gonic/gin"
 	"github.com/gorilla/websocket"
@@ -12,8 +13,8 @@ import (
 )
 
 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) {
@@ -25,8 +26,8 @@ func handleRevokeCertLogChan(conn *websocket.Conn, logChan chan string) {
 
 	for logString := range logChan {
 		err := conn.WriteJSON(RevokeCertResponse{
-			Status:  Info,
-			Message: logString,
+			Status:    Info,
+			Container: translation.C(logString),
 		})
 		if err != nil {
 			logger.Error(err)
@@ -62,8 +63,10 @@ func RevokeCert(c *gin.Context) {
 	if err != nil {
 		logger.Error(err)
 		_ = 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
 	}
@@ -82,7 +85,10 @@ func RevokeCert(c *gin.Context) {
 	logChan := make(chan string, 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)
 
@@ -90,8 +96,10 @@ func RevokeCert(c *gin.Context) {
 	for err = range errChan {
 		logger.Error(err)
 		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 {
 			logger.Error(err)
@@ -105,15 +113,17 @@ func RevokeCert(c *gin.Context) {
 	if err != nil {
 		logger.Error(err)
 		_ = 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
 	}
 
 	err = ws.WriteJSON(RevokeCertResponse{
-		Status:  Success,
-		Message: "Certificate revoked successfully",
+		Status:    Success,
+		Container: translation.C("Certificate revoked successfully"),
 	})
 	if err != nil {
 		logger.Error(err)

+ 22 - 16
api/nginx_log/nginx_log.go

@@ -7,6 +7,7 @@ import (
 	"strings"
 
 	"github.com/0xJacky/Nginx-UI/internal/nginx_log"
+	"github.com/0xJacky/Nginx-UI/internal/translation"
 	"github.com/gin-gonic/gin"
 	"github.com/pkg/errors"
 	"github.com/spf13/cast"
@@ -27,9 +28,9 @@ type controlStruct struct {
 
 // nginxLogPageResp represents the response format for log content
 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
@@ -47,7 +48,7 @@ func GetNginxLogPage(c *gin.Context) {
 	logPath, err := getLogPath(&control)
 	if err != nil {
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
-			Error: err.Error(),
+			Error: translation.C(err.Error()),
 		})
 		logger.Error(err)
 		return
@@ -56,7 +57,7 @@ func GetNginxLogPage(c *gin.Context) {
 	logFileStat, err := os.Stat(logPath)
 	if err != nil {
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
-			Error: err.Error(),
+			Error: translation.C(err.Error()),
 		})
 		logger.Error(err)
 		return
@@ -64,9 +65,14 @@ func GetNginxLogPage(c *gin.Context) {
 
 	if !logFileStat.Mode().IsRegular() {
 		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
 	}
 
@@ -82,7 +88,7 @@ func GetNginxLogPage(c *gin.Context) {
 	f, err := os.Open(logPath)
 	if err != nil {
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
-			Error: err.Error(),
+			Error: translation.C(err.Error()),
 		})
 		logger.Error(err)
 		return
@@ -108,7 +114,7 @@ func GetNginxLogPage(c *gin.Context) {
 	_, err = f.Seek(offset, io.SeekStart)
 	if err != nil && err != io.EOF {
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
-			Error: err.Error(),
+			Error: translation.C(err.Error()),
 		})
 		logger.Error(err)
 		return
@@ -117,7 +123,7 @@ func GetNginxLogPage(c *gin.Context) {
 	n, err := f.Read(buf)
 	if err != nil && !errors.Is(err, io.EOF) {
 		c.JSON(http.StatusInternalServerError, nginxLogPageResp{
-			Error: err.Error(),
+			Error: translation.C(err.Error()),
 		})
 		logger.Error(err)
 		return
@@ -133,21 +139,21 @@ func GetNginxLogPage(c *gin.Context) {
 func GetLogList(c *gin.Context) {
 	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 {
-			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 {
-			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 {
-			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"
 	"net/http"
 	"os"
+	"runtime"
 
 	"github.com/0xJacky/Nginx-UI/internal/helper"
 	"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) {
 	defer func() {
 		if err := recover(); err != nil {
+			buf := make([]byte, 1024)
+			runtime.Stack(buf, false)
 			logger.Error(err)
 			return
 		}
@@ -91,16 +94,13 @@ func tailNginxLog(ws *websocket.Conn, controlChan chan controlStruct, errChan ch
 		}
 
 		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
 		}
 
 		// Create a tail
 		t, err := tail.TailFile(logPath, tail.Config{Follow: true,
 			ReOpen: true, Location: &seek})
-
 		if err != nil {
 			errChan <- errors.Wrap(err, "error tailing log")
 			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) {
 	defer func() {
 		if err := recover(); err != nil {
+			buf := make([]byte, 1024)
+			runtime.Stack(buf, false)
 			logger.Error(err)
 			return
 		}

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

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

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

@@ -11,6 +11,7 @@ declare global {
   const $npgettext: typeof import('@/gettext')['$npgettext']
   const $pgettext: typeof import('@/gettext')['$pgettext']
   const EffectScope: typeof import('vue')['EffectScope']
+  const T: typeof import('@/language')['T']
   const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate']
   const computed: typeof import('vue')['computed']
   const createApp: typeof import('vue')['createApp']
@@ -101,6 +102,7 @@ declare module 'vue' {
     readonly $npgettext: UnwrapRef<typeof import('@/gettext')['$npgettext']>
     readonly $pgettext: UnwrapRef<typeof import('@/gettext')['$pgettext']>
     readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
+    readonly T: UnwrapRef<typeof import('@/language')['T']>
     readonly acceptHMRUpdate: UnwrapRef<typeof import('pinia')['acceptHMRUpdate']>
     readonly computed: UnwrapRef<typeof import('vue')['computed']>
     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'),
   4049: () => $gettext('Streams-enabled directory not exist'),
   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"
 "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
 msgid "2FA"
 msgstr "المصادقة الثنائية"
@@ -105,7 +197,7 @@ msgstr "أضف Stream"
 msgid "Added successfully"
 msgstr "تمت الإضافة بنجاح"
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgstr "إضافي"
 
@@ -132,7 +224,7 @@ msgstr "تم استخدام جميع رموز الاسترداد"
 msgid "API Base Url"
 msgstr "عنوان URL الأساسي لAPI"
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgstr "ملف API"
 
@@ -280,7 +372,7 @@ msgstr "آلي"
 msgid "auto = CPU cores"
 msgstr "Auto = CPU Cores"
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgstr "التحديث التلقائي"
 
@@ -300,11 +392,9 @@ msgstr "\"إعادة التشغيل التلقائي\""
 msgid "Automatically indexed from site and stream configurations."
 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/stream/components/StreamEditor.vue:106
 msgid "Back"
@@ -511,42 +601,40 @@ msgid "Certificate %{name} will expire in 1 day"
 msgstr "ستنتهي صلاحية الشهادة %{name} خلال يوم واحد"
 
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 msgid "Certificate decode error"
-msgstr "خطأ في مزامنة الشهادة"
+msgstr "خطأ في فك تشفير الشهادة"
 
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
-msgstr "نماذج التكوين"
+msgstr "إشعار انتهاء صلاحية الشهادة"
 
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
-msgstr "قائمة الشهادات"
+msgstr "انتهت صلاحية الشهادة"
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 msgid "Certificate Expiring Soon"
-msgstr "خطأ في مزامنة الشهادة"
+msgstr "شهادة على وشك الانتهاء"
 
-#: src/constants/errors/cert.ts:5
+#: src/language/generate.ts:5
 #, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "خطأ في فك تشفير الشهادة"
+
+#: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
-msgstr "خطأ في مزامنة الشهادة"
+msgstr "خطأ في تحليل الشهادة"
 
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 msgid "Certificate path is empty"
-msgstr "نماذج التكوين"
+msgstr "مسار الشهادة فارغ"
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
-#, fuzzy
 msgid "Certificate removed successfully"
-msgstr "تم المسح بنجاح"
+msgstr "تمت إزالة الشهادة بنجاح"
 
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
@@ -557,7 +645,12 @@ msgstr "الفاصل الزمني لتجديد الشهادة"
 msgid "Certificate renewed successfully"
 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
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
@@ -603,12 +696,12 @@ msgstr "المسار المتغير"
 #: src/views/environments/list/BatchUpgrader.vue:159
 #: src/views/system/Upgrade.vue:188
 msgid "Channel"
-msgstr "قناة"
+msgstr "القناة"
 
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
-msgstr ""
+msgstr "محادثة"
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -626,40 +719,49 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 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
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 msgstr ""
+"تحقق مما إذا كان HTTPS ممكّنًا. استخدام HTTP خارج localhost غير آمن ويمنع "
+"استخدام ميزات Passkeys والحافظة."
 
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 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
 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
 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
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 msgstr ""
+"تحقق مما إذا كانت الدلائل sites-available و sites-enabled موجودة ضمن دليل "
+"تكوين nginx."
 
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 msgstr ""
+"تحقق مما إذا كانت الدلائل streams-available و streams-enabled موجودة ضمن "
+"دليل تكوين nginx."
 
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "النص المشفر قصير جدًا"
 
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
@@ -679,44 +781,43 @@ msgstr "تم المسح بنجاح"
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
-msgstr ""
+msgstr "انقر فوق أو اسحب ملف النسخ الاحتياطي إلى هذه المنطقة للتحميل"
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
-msgstr ""
+msgstr "انقر لنسخ"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "حجم العميل العازلة للعميل"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "حجم مخزن رأس العميل"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "الحد الأقصى لحجم جسم العميل"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 msgid "Client request body buffer size"
-msgstr ""
+msgstr "حجم مخزن طلب جسم العميل"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "حجم مخزن رأس طلب العميل"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
-msgstr ""
+msgstr "إغلاق"
 
 #: src/constants/errors/llm.ts:2
-#, fuzzy
 msgid "Code completion is not enabled"
-msgstr "TOTP معطل للحساب الحالي."
+msgstr "إكمال الكود غير مفعّل"
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
-msgstr ""
+msgstr "نموذج إكمال التعليمات البرمجية"
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
@@ -724,7 +825,7 @@ msgstr "أمر"
 
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr ""
+msgstr "انتهت الأمر برمز خروج غير متوقع: {0}، خطأ: {1}"
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
@@ -735,7 +836,7 @@ msgstr "تعليقات"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
-msgstr ""
+msgstr "يقارن"
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
@@ -744,15 +845,15 @@ msgstr "التكوينات"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
-msgstr ""
+msgstr "قارن المحدد"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
-msgstr ""
+msgstr "قارن مع التيار"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 msgid "Compression level, 1 is lowest, 9 is highest"
-msgstr ""
+msgstr "مستوى الضغط ، 1 هو أدنى ، 9 هو الأعلى"
 
 #: src/constants/errors/backup.ts:14
 #, fuzzy
@@ -796,7 +897,7 @@ msgstr "متصل"
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "خطأ في الاتصال، جاري محاولة إعادة الاتصال..."
 
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
@@ -804,11 +905,11 @@ msgstr "تم فقدان الاتصال، يرجى تحديث الصفحة."
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
-msgstr ""
+msgstr "فترة مهلة الاتصال"
 
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
-msgstr ""
+msgstr "حالة الحاوية غير معروفة"
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -904,7 +1005,7 @@ msgstr "يؤدي إنشاء العميل إلى تسهيل الاتصال بخا
 msgid "Credential"
 msgstr "بيان الاعتماد"
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgstr "بيانات الاعتماد"
 
@@ -1199,7 +1300,7 @@ msgid "DNS Credentials"
 msgstr "بيانات اعتماد DNS"
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgstr "مزود DNS"
 
@@ -1249,6 +1350,10 @@ msgstr ""
 msgid "Docker Socket"
 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/DirectiveDocuments.vue:16
 #, fuzzy
@@ -1265,7 +1370,7 @@ msgstr[5] "ملف API"
 msgid "Domain"
 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}"
 msgstr "قائمة النطاقات فارغة، حاول إعادة فتح Auto Cert لـ %{config}"
 
@@ -1526,7 +1631,7 @@ msgstr ""
 msgid "External Notify"
 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"
 msgstr "فشل في الحصول على الشهادة"
 
@@ -1680,6 +1785,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 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/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
@@ -1847,6 +1957,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgstr "فشل في الحصول على الشهادة"
 
+#: src/language/generate.ts:17
+#, fuzzy
+msgid "Failed to revoke certificate: %{error}"
+msgstr "فشل في الحصول على الشهادة"
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #, fuzzy
 msgid "Failed to save Nginx performance settings"
@@ -1886,7 +2001,7 @@ msgstr "لم يتم العثور على الملف"
 msgid "Filename is empty"
 msgstr ""
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgstr "تصفيه"
 
@@ -2077,7 +2192,7 @@ msgid "Import"
 msgstr "استيراد"
 
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgstr "استيراد شهادة"
 
@@ -2306,8 +2421,8 @@ msgstr "اتركه فارغًا إذا كنت لا تريد التعديل"
 msgid "Leave blank if you don't need this."
 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"
 msgstr "تركه فارغًا لن يغير شيئًا"
 
@@ -2380,10 +2495,14 @@ msgstr "مكان"
 msgid "Locations"
 msgstr "أماكن"
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 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
 #, fuzzy
 msgid "Log List"
@@ -2587,7 +2706,7 @@ msgid "Modify"
 msgstr "تعديل"
 
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgstr "تعديل الشهادة"
 
@@ -2605,8 +2724,8 @@ msgstr "توجيه متعدد الأسطر"
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: 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/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2769,7 +2888,7 @@ msgstr "Nginx لا يعمل"
 msgid "Nginx is running"
 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"
 msgstr "سجل Nginx"
 
@@ -3775,7 +3894,7 @@ msgstr "يعمل"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: 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/ConfigEditor.vue:275
 #: 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/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 msgid "Save successfully"
 msgstr "تم الحفظ بنجاح"
@@ -3853,7 +3972,7 @@ msgstr "تم الحفظ بنجاح"
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr "امسح رمز الاستجابة السريعة بهاتفك المحمول لإضافة الحساب إلى التطبيق."
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgstr "حزمة تطوير البرمجيات SDK"
 
@@ -4036,7 +4155,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgstr "محتوى شهادة SSL"
 
@@ -4049,15 +4168,15 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgstr "محتوى مفتاح شهادة SSL"
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgstr "محتوى مفتاح شهادة SSL"
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgstr "مسار مفتاح شهادة SSL"
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgstr "مسار شهادة SSL"
@@ -4230,7 +4349,7 @@ msgstr "مزامنة العقد"
 msgid "Sync strategy"
 msgstr "استراتيجية المزامنة"
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 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"
 msgstr "الإدخال ليس شهادة SSL"
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgstr "المدخل ليس مفتاح شهادة SSL"
 
@@ -4348,11 +4467,11 @@ msgstr ""
 msgid "The parameter of server_name is required"
 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"
 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"
 msgstr "المسار موجود، لكن الملف ليس مفتاحًا خاصًا"
 
@@ -4411,17 +4530,17 @@ msgid ""
 "lose access to your account."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr "هذا العنصر في الشهادة التلقائية غير صالح، يرجى إزالته."
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by 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"
 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"
 "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
 msgid "2FA"
 msgstr "2FA"
@@ -105,7 +199,7 @@ msgstr "Seite hinzufügen"
 msgid "Added successfully"
 msgstr "Speichern erfolgreich"
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 #, fuzzy
 msgid "Additional"
 msgstr "Ort hinzufügen"
@@ -135,7 +229,7 @@ msgstr "Alle Wiederherstellungscodes wurden verwendet"
 msgid "API Base Url"
 msgstr "API-Basis-URL"
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgstr "API-Dokument"
 
@@ -293,7 +387,7 @@ msgstr "Auto"
 msgid "auto = CPU cores"
 msgstr "Auto = CPU -Kerne"
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgstr "Automatische Aktualisierung"
 
@@ -313,11 +407,9 @@ msgstr "\"Automatischer Neustart\""
 msgid "Automatically indexed from site and stream configurations."
 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/stream/components/StreamEditor.vue:106
 msgid "Back"
@@ -531,42 +623,40 @@ msgid "Certificate %{name} will expire in 1 day"
 msgstr "Das Zertifikat %{name} läuft in 1 Tag ab"
 
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 msgid "Certificate decode error"
-msgstr "Zertifikat ist gültig"
+msgstr "Fehler beim Dekodieren des Zertifikats"
 
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
-msgstr "Konfigurationen"
+msgstr "Hinweis zum Zertifikatsablauf"
 
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
-msgstr "Zertifikat ist gültig"
+msgstr "Zertifikat abgelaufen"
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 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
+msgid "Certificate not found: %{error}"
+msgstr "Fehler beim Dekodieren des Zertifikats"
+
+#: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
-msgstr "Certificate has expired"
+msgstr "Fehler beim Parsen des Zertifikats"
 
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 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:61
-#, fuzzy
 msgid "Certificate removed successfully"
-msgstr "Erfolgreich deaktiviert"
+msgstr "Zertifikat erfolgreich entfernt"
 
 #: src/views/preference/tabs/CertSettings.vue:27
 #, fuzzy
@@ -578,7 +668,12 @@ msgstr "Zeitifikat ist gültig"
 msgid "Certificate renewed successfully"
 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
 #, fuzzy
 msgid "Certificate Status"
@@ -627,7 +722,7 @@ msgstr "Kanal"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
-msgstr ""
+msgstr "Chat"
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -645,40 +740,50 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 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
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 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
 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
 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
 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
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 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
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 msgstr ""
+"Überprüfen Sie, ob die Verzeichnisse streams-available und streams-enabled "
+"im nginx-Konfigurationsverzeichnis enthalten sind."
 
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "Der verschlüsselte Text ist zu kurz"
 
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
@@ -700,43 +805,44 @@ msgstr "Erfolgreich deaktiviert"
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
 msgstr ""
+"Klicken Sie auf oder ziehen Sie die Sicherungsdatei in diesen Bereich, um "
+"hochzuladen"
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
-msgstr ""
+msgstr "Klicken Sie hier, um zu kopieren"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "Client Body Puffer Größe"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "Client-Header-Puffergröße"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "Maximale Client-Körpergröße"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 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
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "Größe des Puffers für Client-Anfrageheader"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
-msgstr ""
+msgstr "Schließen"
 
 #: src/constants/errors/llm.ts:2
-#, fuzzy
 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
 msgid "Code Completion Model"
-msgstr ""
+msgstr "Code-Vervollständigungsmodell"
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #, fuzzy
@@ -745,7 +851,7 @@ msgstr "Kommando"
 
 #: src/constants/errors/docker.ts:6
 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/LocationEditor.vue:104
@@ -756,7 +862,7 @@ msgstr "Kom"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
-msgstr ""
+msgstr "Vergleichen"
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
@@ -765,15 +871,15 @@ msgstr "Konfigurationen"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
-msgstr ""
+msgstr "Vergleiche ausgewählt"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
-msgstr ""
+msgstr "Vergleiche mit Strom"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 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
 #, fuzzy
@@ -817,7 +923,7 @@ msgstr "Verbunden"
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "Verbindungsfehler, versuche erneut zu verbinden..."
 
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
@@ -825,11 +931,11 @@ msgstr "Ver"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
-msgstr ""
+msgstr "Verbindungs-Timeout-Zeitraum"
 
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
-msgstr ""
+msgstr "Container-Status unbekannt"
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -929,7 +1035,7 @@ msgstr "Er"
 msgid "Credential"
 msgstr "Zugangsdaten"
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgstr "Zugangsdaten"
 
@@ -1230,7 +1336,7 @@ msgid "DNS Credentials"
 msgstr "DNS-Zugangsdaten"
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgstr "DNS-Anbieter"
 
@@ -1287,6 +1393,10 @@ msgstr ""
 msgid "Docker Socket"
 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/DirectiveDocuments.vue:16
 #, fuzzy
@@ -1299,7 +1409,7 @@ msgstr[1] "API-Dokument"
 msgid "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}"
 msgstr ""
 "Domänenliste ist leer, versuche Auto-Zertifikat für %{config} erneut zu "
@@ -1573,7 +1683,7 @@ msgstr ""
 msgid "External Notify"
 msgstr ""
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 #, fuzzy
 msgid "Fail to obtain certificate"
 msgstr "Zertifikat ist gültig"
@@ -1727,6 +1837,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 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/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
@@ -1890,6 +2005,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 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
 #, fuzzy
 msgid "Failed to save Nginx performance settings"
@@ -1929,7 +2049,7 @@ msgstr "FDatei nicht gefunden"
 msgid "Filename is empty"
 msgstr ""
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgstr "Filter"
 
@@ -2125,7 +2245,7 @@ msgid "Import"
 msgstr "Import"
 
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 #, fuzzy
 msgid "Import Certificate"
 msgstr "Zertifikatsstatus"
@@ -2361,8 +2481,8 @@ msgstr "Leer lassen für keine Änderung"
 msgid "Leave blank if you don't need this."
 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
 msgid "Leave blank will not change anything"
 msgstr "Leeer lassen, wenn du dies nicht benötigst."
@@ -2440,11 +2560,15 @@ msgstr "Ort"
 msgid "Locations"
 msgstr "Orte"
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 #, fuzzy
 msgid "Log"
 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
 #, fuzzy
 msgid "Log List"
@@ -2654,7 +2778,7 @@ msgid "Modify"
 msgstr "Konfiguration bearbeiten"
 
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 #, fuzzy
 msgid "Modify Certificate"
 msgstr "Zertifikatsstatus"
@@ -2675,8 +2799,8 @@ msgstr "Einzelne Anweisung"
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: 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/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2843,7 +2967,7 @@ msgstr "Nginx läuft nicht"
 msgid "Nginx is running"
 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"
 msgstr "Nginx-Log"
 
@@ -3892,7 +4016,7 @@ msgstr "Arbeite"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: 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/ConfigEditor.vue:275
 #: 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/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #, fuzzy
 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."
 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"
 msgstr "SDK"
 
@@ -4155,7 +4279,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 #, fuzzy
 msgid "SSL Certificate Content"
 msgstr "Zertifikatsstatus"
@@ -4169,17 +4293,17 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgstr "Zertifikatsstatus"
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 #, fuzzy
 msgid "SSL Certificate Key Content"
 msgstr "Zertifikatsstatus"
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 #, fuzzy
 msgid "SSL Certificate Key Path"
 msgstr "Zertifikatsstatus"
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 #, fuzzy
 msgid "SSL Certificate Path"
@@ -4360,7 +4484,7 @@ msgstr "Synchrone Knoten"
 msgid "Sync strategy"
 msgstr "Zertifikat ist gültig"
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgstr "Synchronisieren mit"
 
@@ -4438,11 +4562,11 @@ msgstr ""
 "Die ICP-Nummer sollte nur Buchstaben, Unicode, Zahlen, Bindestriche, "
 "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"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 #, fuzzy
 msgid "The input is not a SSL Certificate Key"
 msgstr "Zertifikatsstatus"
@@ -4479,12 +4603,12 @@ msgstr ""
 msgid "The parameter of server_name is required"
 msgstr "server_name-Parameter ist erforderlich"
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 #, fuzzy
 msgid "The path exists, but the file is not a certificate"
 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"
 msgstr "Der Pfad existiert, aber die Datei ist kein privater Schlüssel"
 
@@ -4544,17 +4668,17 @@ msgid ""
 "lose access to your account."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 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"
 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"
 msgstr "Dieses Feld ist erforderlich"
 

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 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"
 "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
 msgid "2FA"
 msgstr "2FA"
@@ -108,7 +204,7 @@ msgstr "Agregar Stream"
 msgid "Added successfully"
 msgstr "Agregado exitoso"
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgstr "Adicional"
 
@@ -137,7 +233,7 @@ msgstr "Todos los códigos de recuperación han sido utilizados"
 msgid "API Base Url"
 msgstr "URL Base de la API"
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgstr "Documento de la API"
 
@@ -285,7 +381,7 @@ msgstr "Automático"
 msgid "auto = CPU cores"
 msgstr "auto = núcleos de CPU"
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgstr "Actualización automática"
 
@@ -305,11 +401,9 @@ msgstr "\"Reinicio Automático\""
 msgid "Automatically indexed from site and stream configurations."
 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/stream/components/StreamEditor.vue:106
 msgid "Back"
@@ -524,42 +618,40 @@ msgid "Certificate %{name} will expire in 1 day"
 msgstr "El certificado %{name} expirará en 1 día"
 
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 msgid "Certificate decode error"
-msgstr "Error de Certificado de Sincronización"
+msgstr "Error de decodificación del certificado"
 
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
-msgstr "Plantillas de configuración"
+msgstr "Aviso de caducidad del certificado"
 
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
-msgstr "Lista de Certificados"
+msgstr "Certificado caducado"
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 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
+msgid "Certificate not found: %{error}"
+msgstr "Error de decodificación del certificado"
+
+#: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
-msgstr "El certificado expiró"
+msgstr "Error al analizar el certificado"
 
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 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:61
-#, fuzzy
 msgid "Certificate removed successfully"
-msgstr "Limpiado exitoso"
+msgstr "Certificado eliminado correctamente"
 
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
@@ -570,7 +662,12 @@ msgstr "Intervalo de renovación del Certificado"
 msgid "Certificate renewed successfully"
 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
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
@@ -613,7 +710,7 @@ msgstr "Canal"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
-msgstr ""
+msgstr "Chat"
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -631,40 +728,49 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 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
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 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
 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
 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
 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
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 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
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 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
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "El texto cifrado es demasiado corto"
 
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
@@ -685,43 +791,44 @@ msgstr "Limpiado exitoso"
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
 msgstr ""
+"Haga clic o arrastre el archivo de copia de seguridad a esta área para "
+"cargar"
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
-msgstr ""
+msgstr "Haga clic para copiar"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "Tamaño del búfer del cuerpo del cliente"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "Tamaño del búfer de cabecera del cliente"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "Tamaño máximo del cuerpo del cliente"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 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
 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
 msgid "Close"
-msgstr ""
+msgstr "Cerrar"
 
 #: src/constants/errors/llm.ts:2
-#, fuzzy
 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
 msgid "Code Completion Model"
-msgstr ""
+msgstr "Modelo de finalización de código"
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
@@ -729,7 +836,7 @@ msgstr "Comando"
 
 #: src/constants/errors/docker.ts:6
 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/LocationEditor.vue:104
@@ -740,7 +847,7 @@ msgstr "Comentarios"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
-msgstr ""
+msgstr "Comparar"
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
@@ -749,15 +856,15 @@ msgstr "Configuraciones"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
-msgstr ""
+msgstr "Comparar seleccionado"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
-msgstr ""
+msgstr "Comparar con la corriente"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 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
 #, fuzzy
@@ -801,7 +908,7 @@ msgstr "Conectado"
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "Error de conexión, intentando reconectar..."
 
 #: src/views/terminal/Terminal.vue:142
 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
 msgid "Connection timeout period"
-msgstr ""
+msgstr "Período de tiempo de espera de conexión"
 
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
-msgstr ""
+msgstr "Estado del contenedor desconocido"
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: 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"
 msgstr "Credencial"
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgstr "Credenciales"
 
@@ -1206,7 +1313,7 @@ msgid "DNS Credentials"
 msgstr "Credenciales de DNS"
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgstr "Proveedor DNS"
 
@@ -1256,6 +1363,10 @@ msgstr ""
 msgid "Docker Socket"
 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/DirectiveDocuments.vue:16
 #, fuzzy
@@ -1268,7 +1379,7 @@ msgstr[1] "Documento de la API"
 msgid "Domain"
 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}"
 msgstr ""
 "La lista de dominios está vacía, intente reabrir la certificación "
@@ -1535,7 +1646,7 @@ msgstr ""
 msgid "External Notify"
 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"
 msgstr "Falla al obtener el certificado"
 
@@ -1688,6 +1799,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 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/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
@@ -1851,6 +1967,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 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
 #, fuzzy
 msgid "Failed to save Nginx performance settings"
@@ -1890,7 +2011,7 @@ msgstr "Archivo no encontrado"
 msgid "Filename is empty"
 msgstr ""
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgstr "Filtro"
 
@@ -2084,7 +2205,7 @@ msgid "Import"
 msgstr "Importar"
 
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgstr "Importar Certificado"
 
@@ -2312,8 +2433,8 @@ msgstr "Para no modificar dejar en blanco"
 msgid "Leave blank if you don't need this."
 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"
 msgstr "Dejarlo en blanco no cambiará nada"
 
@@ -2386,10 +2507,14 @@ msgstr "Ubicación"
 msgid "Locations"
 msgstr "Ubicaciones"
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 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
 #, fuzzy
 msgid "Log List"
@@ -2594,7 +2719,7 @@ msgid "Modify"
 msgstr "Modificar"
 
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgstr "Modificar Certificado"
 
@@ -2612,8 +2737,8 @@ msgstr "Directiva multilínea"
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: 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/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2777,7 +2902,7 @@ msgstr "Nginx no se está ejecutando"
 msgid "Nginx is running"
 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"
 msgstr "Registro Nginx"
 
@@ -3808,7 +3933,7 @@ msgstr "Corriendo"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: 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/ConfigEditor.vue:275
 #: 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/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 msgid "Save successfully"
 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 "
 "aplicación."
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgstr "SDK"
 
@@ -4071,7 +4196,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgstr "Contenido de certificado SSL"
 
@@ -4084,15 +4209,15 @@ msgstr ""
 msgid "SSL certificate file not found"
 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"
 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"
 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
 msgid "SSL Certificate Path"
 msgstr "Ruta del certificado SSL"
@@ -4266,7 +4391,7 @@ msgstr "Sincronizar con"
 msgid "Sync strategy"
 msgstr "Sincronizar Certificado"
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgstr "Sincronizar con"
 
@@ -4345,11 +4470,11 @@ msgstr ""
 "El nombre del modelo solo debe contener letras, unicode, números, guiones, "
 "rayas y puntos."
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 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"
 msgstr "La entrada no es una clave de certificado SSL"
 
@@ -4387,11 +4512,11 @@ msgstr ""
 msgid "The parameter of server_name is required"
 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"
 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"
 msgstr "La ruta existe, pero el archivo no es una clave privada"
 
@@ -4451,17 +4576,17 @@ msgid ""
 "lose access to your account."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr "Este elemento de Auto Cert es inválido, elimínelo por favor."
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by 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"
 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"
 "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
 msgid "2FA"
 msgstr "2fa"
@@ -110,7 +204,7 @@ msgstr "Ajouter un site"
 msgid "Added successfully"
 msgstr "Mis à jour avec succés"
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 #, fuzzy
 msgid "Additional"
 msgstr "Supplémentaire"
@@ -140,7 +234,7 @@ msgstr "Tous les codes de récupération ont été utilisés"
 msgid "API Base Url"
 msgstr "URL de base de l'API"
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 #, fuzzy
 msgid "API Document"
 msgstr "Jeton d'API"
@@ -297,7 +391,7 @@ msgstr "Auto"
 msgid "auto = CPU cores"
 msgstr "auto = cœurs CPU"
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgstr "Actualisation automatique"
 
@@ -317,11 +411,9 @@ msgstr "\"Redémarrage Automatique\""
 msgid "Automatically indexed from site and stream configurations."
 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/stream/components/StreamEditor.vue:106
 msgid "Back"
@@ -533,42 +625,40 @@ msgid "Certificate %{name} will expire in 1 day"
 msgstr "Le certificat %{name} expirera dans 1 jour"
 
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 msgid "Certificate decode error"
-msgstr "Changer de certificat"
+msgstr "Erreur de décodage du certificat"
 
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
-msgstr "Modèles de configuration"
+msgstr "Avis d'expiration du certificat"
 
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
-msgstr "Liste des certifications"
+msgstr "Certificat expiré"
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 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
+msgid "Certificate not found: %{error}"
+msgstr "Erreur de décodage du certificat"
+
+#: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
-msgstr "Le certificat a expiré"
+msgstr "Erreur d'analyse du certificat"
 
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 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:61
-#, fuzzy
 msgid "Certificate removed successfully"
-msgstr "Désactivé avec succès"
+msgstr "Certificat supprimé avec succès"
 
 #: src/views/preference/tabs/CertSettings.vue:27
 #, fuzzy
@@ -580,7 +670,12 @@ msgstr "Le certificat est valide"
 msgid "Certificate renewed successfully"
 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
 #, fuzzy
 msgid "Certificate Status"
@@ -628,7 +723,7 @@ msgstr "Canal"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
-msgstr ""
+msgstr "Chat"
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -646,12 +741,18 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 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
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 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
 #, fuzzy
@@ -706,6 +807,8 @@ msgstr "Désactivé avec succès"
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
 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
 msgid "Click to copy"
@@ -713,36 +816,35 @@ msgstr "Clique pour copier"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "Taille du tampon du corps client"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "Taille du tampon d'en-tête client"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "Taille maximale du corps du client"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 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
 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
 msgid "Close"
-msgstr ""
+msgstr "Fermer"
 
 #: src/constants/errors/llm.ts:2
-#, fuzzy
 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
 msgid "Code Completion Model"
-msgstr ""
+msgstr "Modèle de complétion de code"
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #, fuzzy
@@ -752,6 +854,8 @@ msgstr "Commentaires"
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
 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/LocationEditor.vue:104
@@ -762,7 +866,7 @@ msgstr "Commentaires"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
-msgstr ""
+msgstr "Comparer"
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
@@ -771,15 +875,15 @@ msgstr "Configurations"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
-msgstr ""
+msgstr "Comparez sélectionné"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
-msgstr ""
+msgstr "Comparez avec le courant"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 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
 #, fuzzy
@@ -823,7 +927,7 @@ msgstr "Connecté"
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "Erreur de connexion, tentative de reconnexion..."
 
 #: src/views/terminal/Terminal.vue:142
 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
 msgid "Connection timeout period"
-msgstr ""
+msgstr "Période de délai de connexion"
 
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
-msgstr ""
+msgstr "Statut du conteneur inconnu"
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: 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"
 msgstr "Identifiant"
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgstr "Identifiants"
 
@@ -1239,7 +1343,7 @@ msgid "DNS Credentials"
 msgstr "Identifiants DNS"
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgstr "Fournisseur DNS"
 
@@ -1292,6 +1396,10 @@ msgstr ""
 msgid "Docker Socket"
 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/DirectiveDocuments.vue:16
 #, fuzzy
@@ -1304,7 +1412,7 @@ msgstr[1] "Jeton d'API"
 msgid "Domain"
 msgstr "Domaine"
 
-#: src/views/certificate/components/CertificateEditor.vue:112
+#: src/views/certificate/CertificateEditor.vue:112
 #, fuzzy
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
 msgstr ""
@@ -1581,7 +1689,7 @@ msgstr ""
 msgid "External Notify"
 msgstr ""
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 #, fuzzy
 msgid "Fail to obtain certificate"
 msgstr "Obtenir un certificat"
@@ -1736,6 +1844,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 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/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
@@ -1905,6 +2018,11 @@ msgstr "Erreur lecture nginx.conf"
 msgid "Failed to revoke certificate"
 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
 #, fuzzy
 msgid "Failed to save Nginx performance settings"
@@ -1944,7 +2062,7 @@ msgstr "Fichier introuvable"
 msgid "Filename is empty"
 msgstr "Nom du fichier vide"
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgstr "Filtrer"
 
@@ -2144,7 +2262,7 @@ msgid "Import"
 msgstr "Exporter"
 
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 #, fuzzy
 msgid "Import Certificate"
 msgstr "État du certificat"
@@ -2380,8 +2498,8 @@ msgstr "Laisser vide pour aucun changement"
 msgid "Leave blank if you don't need this."
 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
 msgid "Leave blank will not change anything"
 msgstr "Laisser vide pour aucun changement"
@@ -2461,11 +2579,15 @@ msgstr "Localisation"
 msgid "Locations"
 msgstr "Localisations"
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 #, fuzzy
 msgid "Log"
 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
 #, fuzzy
 msgid "Log List"
@@ -2667,7 +2789,7 @@ msgid "Modify"
 msgstr "Modifier"
 
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 #, fuzzy
 msgid "Modify Certificate"
 msgstr "État du certificat"
@@ -2687,8 +2809,8 @@ msgstr "Directive multiligne"
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: 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/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2853,7 +2975,7 @@ msgstr ""
 msgid "Nginx is running"
 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"
 msgstr "Journal Nginx"
 
@@ -3885,7 +4007,7 @@ msgstr "En cours d'éxécution"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: 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/ConfigEditor.vue:275
 #: 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/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 msgid "Save successfully"
 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."
 msgstr ""
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgstr ""
 
@@ -4148,7 +4270,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 #, fuzzy
 msgid "SSL Certificate Content"
 msgstr "Contenu de la certification SSL"
@@ -4162,16 +4284,16 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgstr "Contenu de la clé de certification SSL"
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 #, fuzzy
 msgid "SSL Certificate Key Content"
 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"
 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
 msgid "SSL Certificate Path"
 msgstr "Chemin du certificat SSL"
@@ -4354,7 +4476,7 @@ msgstr ""
 msgid "Sync strategy"
 msgstr "Changer de certificat"
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 #, fuzzy
 msgid "Sync to"
 msgstr "Changer de certificat"
@@ -4431,12 +4553,12 @@ msgid ""
 "dashes, colons, and dots."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 #, fuzzy
 msgid "The input is not a SSL Certificate"
 msgstr "Chemin de la clé du certificat SSL"
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 #, fuzzy
 msgid "The input is not a SSL Certificate Key"
 msgstr "Chemin de la clé du certificat SSL"
@@ -4469,12 +4591,12 @@ msgstr ""
 msgid "The parameter of server_name is required"
 msgstr "Le paramètre server_name est obligatoire"
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 #, fuzzy
 msgid "The path exists, but the file is not a certificate"
 msgstr "Chemin de la clé du certificat SSL"
 
-#: src/views/certificate/components/CertificateEditor.vue:196
+#: src/views/certificate/CertificateEditor.vue:196
 #, fuzzy
 msgid "The path exists, but the file is not a private key"
 msgstr "Chemin de la clé du certificat SSL"
@@ -4531,20 +4653,20 @@ msgid ""
 "lose access to your account."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 #, fuzzy
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr ""
 "Cet élément de certification automatique n'est pas valide, veuillez le "
 "supprimer."
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 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"
 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"
 "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
 msgid "2FA"
 msgstr "二要素認証"
@@ -105,7 +194,7 @@ msgstr "Streamを追加"
 msgid "Added successfully"
 msgstr "正常に追加されました"
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgstr "追加設定"
 
@@ -132,7 +221,7 @@ msgstr "すべてのリカバリーコードが使用済みです"
 msgid "API Base Url"
 msgstr "APIベースURL"
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgstr "APIドキュメント"
 
@@ -281,7 +370,7 @@ msgstr "自動"
 msgid "auto = CPU cores"
 msgstr "自動 = CPUコア数"
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgstr "自動更新"
 
@@ -301,9 +390,9 @@ msgstr "自動再起動"
 msgid "Automatically indexed from site and stream configurations."
 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/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/stream/components/StreamEditor.vue:106
 msgid "Back"
@@ -507,42 +596,40 @@ msgid "Certificate %{name} will expire in 1 day"
 msgstr "証明書 %{name} は1日で期限切れになります"
 
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 msgid "Certificate decode error"
-msgstr "証明書更新間隔"
+msgstr "証明書のデコードエラー"
 
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
-msgstr "証明書リスト"
+msgstr "証明書有効期限のお知らせ"
 
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
-msgstr "証明書リスト"
+msgstr "証明書の有効期限が切れました"
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 msgid "Certificate Expiring Soon"
-msgstr "証明書リスト"
+msgstr "証明書の有効期限が近づいています"
 
-#: src/constants/errors/cert.ts:5
+#: src/language/generate.ts:5
 #, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "証明書のデコードエラー"
+
+#: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
-msgstr "証明書"
+msgstr "証明書の解析エラー"
 
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 msgid "Certificate path is empty"
-msgstr "証明書リスト"
+msgstr "証明書のパスが空です"
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
-#, fuzzy
 msgid "Certificate removed successfully"
-msgstr "正常に削除しました"
+msgstr "証明書の削除に成功しました"
 
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
@@ -553,7 +640,12 @@ msgstr "証明書更新間隔"
 msgid "Certificate renewed successfully"
 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
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
@@ -594,7 +686,7 @@ msgstr "チャンネル"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
-msgstr ""
+msgstr "チャット"
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -612,40 +704,45 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 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
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 msgstr ""
+"HTTPS が有効かどうかを確認します。localhost 以外で HTTP を使用すると安全ではなく、Passkeys "
+"やクリップボード機能の使用が妨げられます。"
 
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 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
 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
 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
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
-msgstr ""
+msgstr "sites-available と sites-enabled ディレクトリが nginx の設定ディレクトリ配下にあるか確認します。"
 
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
-msgstr ""
+msgstr "streams-available と streams-enabled ディレクトリが nginx の設定ディレクトリ配下にあるか確認します。"
 
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "暗号文が短すぎます"
 
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
@@ -665,43 +762,43 @@ msgstr "正常に削除しました"
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
-msgstr ""
+msgstr "この領域にバックアップファイルをクリックまたはドラッグしてアップロードします"
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
-msgstr ""
+msgstr "クリックしてコピーします"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "クライアントボディバッファサイズ"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "クライアントヘッダーバッファサイズ"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "クライアント最大ボディサイズ"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 msgid "Client request body buffer size"
-msgstr ""
+msgstr "クライアントリクエストボディのバッファサイズ"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "クライアントリクエストヘッダーバッファサイズ"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
-msgstr ""
+msgstr "閉じる"
 
 #: src/constants/errors/llm.ts:2
 msgid "Code completion is not enabled"
-msgstr ""
+msgstr "コード補完が有効になっていません"
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
-msgstr ""
+msgstr "コード補完モデル"
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
@@ -709,7 +806,7 @@ msgstr "コマンド"
 
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr ""
+msgstr "コマンドが予期しない終了コードで終了しました: {0}、エラー: {1}"
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
@@ -720,7 +817,7 @@ msgstr "コメント"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
-msgstr ""
+msgstr "比較する"
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
@@ -729,15 +826,15 @@ msgstr "設定"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
-msgstr ""
+msgstr "選択したものを比較します"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
-msgstr ""
+msgstr "電流と比較してください"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 msgid "Compression level, 1 is lowest, 9 is highest"
-msgstr ""
+msgstr "圧縮レベル、1は最も低く、9は最高です"
 
 #: src/constants/errors/backup.ts:14
 #, fuzzy
@@ -781,7 +878,7 @@ msgstr "接続済み"
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "接続エラー、再接続を試みています..."
 
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
@@ -789,11 +886,11 @@ msgstr "接続が失われました。ページを再読み込みしてくださ
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
-msgstr ""
+msgstr "接続タイムアウト期間"
 
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
-msgstr ""
+msgstr "コンテナの状態が不明です"
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -819,7 +916,7 @@ msgstr "コピー"
 
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 msgid "Copy Codes"
-msgstr ""
+msgstr "コードをコピー"
 
 #: src/views/system/Upgrade.vue:146
 msgid "Core Upgrade"
@@ -888,7 +985,7 @@ msgstr ""
 msgid "Credential"
 msgstr "認証情報"
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgstr "認証情報"
 
@@ -1165,7 +1262,7 @@ msgid "DNS Credentials"
 msgstr ""
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgstr ""
 
@@ -1215,6 +1312,10 @@ msgstr ""
 msgid "Docker Socket"
 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/DirectiveDocuments.vue:16
 #, fuzzy
@@ -1226,7 +1327,7 @@ msgstr[0] "APIドキュメント"
 msgid "Domain"
 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}"
 msgstr ""
 
@@ -1471,7 +1572,7 @@ msgstr ""
 msgid "External Notify"
 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"
 msgstr ""
 
@@ -1603,6 +1704,10 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgstr ""
 
+#: src/language/generate.ts:9
+msgid "Failed to delete certificate from database: %{error}"
+msgstr ""
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
@@ -1743,6 +1848,10 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgstr ""
 
+#: src/language/generate.ts:17
+msgid "Failed to revoke certificate: %{error}"
+msgstr ""
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 msgid "Failed to save Nginx performance settings"
 msgstr ""
@@ -1779,7 +1888,7 @@ msgstr ""
 msgid "Filename is empty"
 msgstr ""
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgstr ""
 
@@ -1957,7 +2066,7 @@ msgid "Import"
 msgstr ""
 
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgstr ""
 
@@ -2176,8 +2285,8 @@ msgstr ""
 msgid "Leave blank if you don't need this."
 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"
 msgstr ""
 
@@ -2250,10 +2359,14 @@ msgstr ""
 msgid "Locations"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 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
 msgid "Log List"
 msgstr ""
@@ -2445,7 +2558,7 @@ msgid "Modify"
 msgstr ""
 
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgstr ""
 
@@ -2463,8 +2576,8 @@ msgstr ""
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: 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/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2620,7 +2733,7 @@ msgstr ""
 msgid "Nginx is running"
 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"
 msgstr ""
 
@@ -3435,7 +3548,7 @@ msgstr ""
 #: src/views/certificate/components/RenewCert.vue:27
 #: src/views/certificate/components/WildcardCertificate.vue:46
 msgid "Renew successfully"
-msgstr ""
+msgstr "証明書の更新に成功しました"
 
 #: src/views/dashboard/components/PerformanceTablesCard.vue:141
 msgid "Request statistics"
@@ -3576,7 +3689,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: 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/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
@@ -3633,7 +3746,7 @@ msgstr ""
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: 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
 msgid "Save successfully"
 msgstr ""
@@ -3648,7 +3761,7 @@ msgstr ""
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr ""
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgstr ""
 
@@ -3819,7 +3932,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgstr ""
 
@@ -3831,15 +3944,15 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgstr ""
@@ -4003,7 +4116,7 @@ msgstr ""
 msgid "Sync strategy"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgstr ""
 
@@ -4075,11 +4188,11 @@ msgid ""
 "dashes, colons, and dots."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgstr ""
 
@@ -4110,11 +4223,11 @@ msgstr ""
 msgid "The parameter of server_name is required"
 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"
 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"
 msgstr ""
 
@@ -4166,17 +4279,17 @@ msgid ""
 "lose access to your account."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 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"
 msgstr ""
 
@@ -4606,7 +4719,7 @@ msgstr ""
 #: src/views/preference/tabs/AuthSettings.vue:163
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
-msgstr ""
+msgstr "はい"
 
 #: src/views/terminal/Terminal.vue:135
 msgid ""

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

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

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

@@ -2,6 +2,90 @@ msgid ""
 msgstr ""
 "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
 msgid "2FA"
 msgstr ""
@@ -97,7 +181,7 @@ msgstr ""
 msgid "Added successfully"
 msgstr ""
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgstr ""
 
@@ -124,7 +208,7 @@ msgstr ""
 msgid "API Base Url"
 msgstr ""
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgstr ""
 
@@ -264,7 +348,7 @@ msgstr ""
 msgid "auto = CPU cores"
 msgstr ""
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgstr ""
 
@@ -284,11 +368,11 @@ msgstr ""
 msgid "Automatically indexed from site and stream configurations."
 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/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/stream/components/StreamEditor.vue:106
 msgid "Back"
@@ -501,6 +585,10 @@ msgstr ""
 msgid "Certificate Expiring Soon"
 msgstr ""
 
+#: src/language/generate.ts:5
+msgid "Certificate not found: %{error}"
+msgstr ""
+
 #: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgstr ""
@@ -522,7 +610,11 @@ msgstr ""
 msgid "Certificate renewed successfully"
 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
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
@@ -841,7 +933,7 @@ msgstr ""
 msgid "Credential"
 msgstr ""
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgstr ""
 
@@ -1120,7 +1212,7 @@ msgid "DNS Credentials"
 msgstr ""
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgstr ""
 
@@ -1169,6 +1261,10 @@ msgstr ""
 msgid "Docker Socket"
 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/DirectiveDocuments.vue:16
 msgid "Document"
@@ -1180,7 +1276,7 @@ msgstr[1] ""
 msgid "Domain"
 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}"
 msgstr ""
 
@@ -1428,7 +1524,7 @@ msgstr ""
 msgid "External Notify"
 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"
 msgstr ""
 
@@ -1560,6 +1656,10 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgstr ""
 
+#: src/language/generate.ts:9
+msgid "Failed to delete certificate from database: %{error}"
+msgstr ""
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
@@ -1700,6 +1800,10 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgstr ""
 
+#: src/language/generate.ts:17
+msgid "Failed to revoke certificate: %{error}"
+msgstr ""
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 msgid "Failed to save Nginx performance settings"
 msgstr ""
@@ -1736,7 +1840,7 @@ msgstr ""
 msgid "Filename is empty"
 msgstr ""
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgstr ""
 
@@ -1903,7 +2007,7 @@ msgid "Import"
 msgstr ""
 
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgstr ""
 
@@ -2117,8 +2221,8 @@ msgstr ""
 msgid "Leave blank if you don't need this."
 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"
 msgstr ""
 
@@ -2189,10 +2293,14 @@ msgstr ""
 msgid "Locations"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 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
 msgid "Log List"
@@ -2380,7 +2488,7 @@ msgid "Modify"
 msgstr ""
 
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgstr ""
 
@@ -2398,8 +2506,8 @@ msgstr ""
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: 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/config/configColumns.tsx:7
@@ -2557,7 +2665,7 @@ msgid "Nginx is running"
 msgstr ""
 
 #: src/routes/modules/nginx_log.ts:9
-#: src/views/nginx_log/NginxLog.vue:143
+#: src/views/nginx_log/NginxLog.vue:144
 msgid "Nginx Log"
 msgstr ""
 
@@ -3482,7 +3590,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: 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/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
@@ -3539,7 +3647,7 @@ msgstr ""
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: 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
 msgid "Save successfully"
 msgstr ""
@@ -3555,7 +3663,7 @@ msgstr ""
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr ""
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgstr ""
 
@@ -3720,7 +3828,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgstr ""
 
@@ -3732,15 +3840,15 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgstr ""
@@ -3906,7 +4014,7 @@ msgstr ""
 msgid "Sync strategy"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgstr ""
 
@@ -3970,11 +4078,11 @@ msgstr ""
 msgid "The ICP Number should only contain letters, unicode, numbers, hyphens, dashes, colons, and dots."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgstr ""
 
@@ -3999,11 +4107,11 @@ msgstr ""
 msgid "The parameter of server_name is required"
 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"
 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"
 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."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 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"
 msgstr ""
 

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

@@ -12,6 +12,100 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n > 1;\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
 msgid "2FA"
 msgstr "2FA"
@@ -104,7 +198,7 @@ msgstr "Adicionar Stream"
 msgid "Added successfully"
 msgstr "Adicionado com sucesso"
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgstr "Adicional"
 
@@ -133,7 +227,7 @@ msgstr "Todos os Códigos de Recuperação Foram Utilizados"
 msgid "API Base Url"
 msgstr "Url Base da API"
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgstr "Documento da API"
 
@@ -282,7 +376,7 @@ msgstr "Automático"
 msgid "auto = CPU cores"
 msgstr "auto = núcleos da CPU"
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgstr "Actualizar Automaticamente"
 
@@ -302,9 +396,9 @@ msgstr "Reinício Automático"
 msgid "Automatically indexed from site and stream configurations."
 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/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/stream/components/StreamEditor.vue:106
 msgid "Back"
@@ -516,42 +610,40 @@ msgid "Certificate %{name} will expire in 1 day"
 msgstr "O certificado %{name} irá expirar em 1 dia"
 
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 msgid "Certificate decode error"
-msgstr "Erro ao Sincronizar Certificado"
+msgstr "Erro de descodificação do certificado"
 
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
-msgstr "Conteúdo do Certificado SSL"
+msgstr "Aviso de Expiração do Certificado"
 
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
-msgstr "Lista de Certificados"
+msgstr "Certificado expirado"
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 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
+msgid "Certificate not found: %{error}"
+msgstr "Erro de descodificação do certificado"
+
+#: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
-msgstr "Erro ao Sincronizar Certificado"
+msgstr "Erro de análise do certificado"
 
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 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:61
-#, fuzzy
 msgid "Certificate removed successfully"
-msgstr "Removido com sucesso"
+msgstr "Certificado removido com sucesso"
 
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
@@ -562,7 +654,12 @@ msgstr "Intervalo de Renovação do Certificado"
 msgid "Certificate renewed successfully"
 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
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
@@ -605,7 +702,7 @@ msgstr "Canal"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
-msgstr ""
+msgstr "Chat"
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -623,40 +720,49 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 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
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 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
 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
 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
 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
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 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
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 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
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "O texto cifrado é demasiado curto"
 
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
@@ -676,44 +782,43 @@ msgstr "Limpo com sucesso"
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 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
 msgid "Click to copy"
-msgstr ""
+msgstr "Clique para copiar"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "Tamanho do buffer do corpo do cliente"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "Tamanho do buffer de cabeçalho do cliente"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "Tamanho máximo do corpo do cliente"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 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
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "Tamanho do buffer de cabeçalho de pedido do cliente"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
-msgstr ""
+msgstr "Fechar"
 
 #: src/constants/errors/llm.ts:2
-#, fuzzy
 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
 msgid "Code Completion Model"
-msgstr ""
+msgstr "Modelo de conclusão de código"
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
@@ -721,7 +826,7 @@ msgstr "Comando"
 
 #: src/constants/errors/docker.ts:6
 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/LocationEditor.vue:104
@@ -732,7 +837,7 @@ msgstr "Comentários"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
-msgstr ""
+msgstr "Comparar"
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
@@ -741,15 +846,15 @@ msgstr "Configurações"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
-msgstr ""
+msgstr "Compare selecionado"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
-msgstr ""
+msgstr "Compare com a corrente"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 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
 #, fuzzy
@@ -793,7 +898,7 @@ msgstr "Conectado"
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "Erro de conexão, tentando reconectar..."
 
 #: src/views/terminal/Terminal.vue:142
 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
 msgid "Connection timeout period"
-msgstr ""
+msgstr "Período de tempo limite de conexão"
 
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
-msgstr ""
+msgstr "Estado do contentor desconhecido"
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -901,7 +1006,7 @@ msgstr "Criar cliente facilita comunicação com o servidor CA"
 msgid "Credential"
 msgstr "Credencial"
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgstr "Credenciais"
 
@@ -1203,7 +1308,7 @@ msgid "DNS Credentials"
 msgstr "Credenciais DNS"
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgstr "Provedor DNS"
 
@@ -1253,6 +1358,10 @@ msgstr ""
 msgid "Docker Socket"
 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/DirectiveDocuments.vue:16
 #, fuzzy
@@ -1265,7 +1374,7 @@ msgstr[1] "Documento da API"
 msgid "Domain"
 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}"
 msgstr "A lista de domínios está vazia, tente reabrir o Auto Cert para %{config}"
 
@@ -1526,7 +1635,7 @@ msgstr ""
 msgid "External Notify"
 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"
 msgstr "Obtenção de Certificado Falhou"
 
@@ -1667,6 +1776,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 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/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
@@ -1827,6 +1941,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 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
 msgid "Failed to save Nginx performance settings"
 msgstr ""
@@ -1864,7 +1983,7 @@ msgstr "Ficheiro Não Encontrado"
 msgid "Filename is empty"
 msgstr ""
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgstr "Filtro"
 
@@ -2057,7 +2176,7 @@ msgid "Import"
 msgstr "Importar"
 
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgstr "Importar Certificados"
 
@@ -2285,8 +2404,8 @@ msgstr "Deixe em branco para não alterar"
 msgid "Leave blank if you don't need this."
 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"
 msgstr "Deixar em branco não vai mudar nada"
 
@@ -2359,10 +2478,14 @@ msgstr "Localização"
 msgid "Locations"
 msgstr "Localizações"
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "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
 #, fuzzy
 msgid "Log List"
@@ -2564,7 +2687,7 @@ msgid "Modify"
 msgstr "Modificar"
 
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgstr "Modificar Certificado"
 
@@ -2582,8 +2705,8 @@ msgstr "Diretiva Multilinha"
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: 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/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2742,7 +2865,7 @@ msgstr ""
 msgid "Nginx is running"
 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"
 msgstr "Logs do Nginx"
 
@@ -3762,7 +3885,7 @@ msgstr "Executando"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: 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/ConfigEditor.vue:275
 #: 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/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 msgid "Save successfully"
 msgstr "Salvo com sucesso"
@@ -3844,7 +3967,7 @@ msgstr ""
 "Digitalize o código QR com o seu telemóvel para adicionar a conta à "
 "aplicação."
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgstr "SDK"
 
@@ -4021,7 +4144,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgstr "Conteúdo do Certificado SSL"
 
@@ -4034,15 +4157,15 @@ msgstr ""
 msgid "SSL certificate file not found"
 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"
 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"
 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
 msgid "SSL Certificate Path"
 msgstr "Caminho para o Certificado SSL"
@@ -4218,7 +4341,7 @@ msgstr "Sincronizar para"
 msgid "Sync strategy"
 msgstr "Sincronizar Certificado"
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgstr "Sincronizar para"
 
@@ -4297,11 +4420,11 @@ msgstr ""
 "O nome do modelo deve conter apenas letras, unicode, números, hífens, "
 "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"
 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"
 msgstr "O valor introduzido não é uma Chave de Certificado SSL"
 
@@ -4339,11 +4462,11 @@ msgstr ""
 msgid "The parameter of server_name is required"
 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"
 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"
 msgstr "O caminho existe, mas o ficheiro não é uma chave privada"
 
@@ -4403,17 +4526,17 @@ msgid ""
 "lose access to your account."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 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"
 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"
 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"
 "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
 msgid "2FA"
 msgstr "2FA"
@@ -108,7 +202,7 @@ msgstr "Добавить поток"
 msgid "Added successfully"
 msgstr "Добавлено успешно"
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgstr "Дополнительно"
 
@@ -135,7 +229,7 @@ msgstr "Все коды восстановления были использов
 msgid "API Base Url"
 msgstr "Базовый URL API"
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgstr "API Документ"
 
@@ -278,7 +372,7 @@ msgstr "Авто"
 msgid "auto = CPU cores"
 msgstr "Auto = ядра процессора"
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgstr "Автообновление"
 
@@ -298,11 +392,9 @@ msgstr "\"Автоматическая перезагрузка\""
 msgid "Automatically indexed from site and stream configurations."
 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/stream/components/StreamEditor.vue:106
 msgid "Back"
@@ -516,36 +608,36 @@ msgid "Certificate decode error"
 msgstr "Ошибка декодирования сертификата"
 
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
-msgstr "Шаблоны конфигурации"
+msgstr "Уведомление об истечении срока действия сертификата"
 
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
-msgstr "Список сертификатов"
+msgstr "Сертификат истёк"
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 msgid "Certificate Expiring Soon"
-msgstr "Ошибка анализа сертификата"
+msgstr "Сертификат скоро истекает"
+
+#: src/language/generate.ts:5
+#, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "Ошибка декодирования сертификата"
 
 #: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
-msgstr "Ошибка анализа сертификата"
+msgstr "Ошибка разбора сертификата"
 
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 msgid "Certificate path is empty"
-msgstr "Шаблоны конфигурации"
+msgstr "Путь к сертификату пуст"
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
-#, fuzzy
 msgid "Certificate removed successfully"
-msgstr "Сертификат успешно продлен"
+msgstr "Сертификат успешно удален"
 
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
@@ -555,7 +647,12 @@ msgstr "Интервал обновления сертификата"
 msgid "Certificate renewed successfully"
 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
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
@@ -598,7 +695,7 @@ msgstr "Канал"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
-msgstr ""
+msgstr "Чат"
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -616,40 +713,49 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 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
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 msgstr ""
+"Проверьте, включён ли HTTPS. Использование HTTP вне localhost небезопасно и "
+"блокирует функции Passkeys и буфера обмена."
 
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 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
 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
 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
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 msgstr ""
+"Проверьте, находятся ли каталоги sites-available и sites-enabled в каталоге "
+"конфигурации nginx."
 
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 msgstr ""
+"Проверьте, находятся ли каталоги streams-available и streams-enabled в "
+"директории конфигурации nginx."
 
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "Зашифрованный текст слишком короткий"
 
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
@@ -670,43 +776,44 @@ msgstr "Очищено успешно"
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
 msgstr ""
+"Нажмите или перетащите файл резервного копирования в эту область, чтобы "
+"загрузить"
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
-msgstr ""
+msgstr "Нажмите, чтобы скопировать"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "Размер буфера корпуса клиента"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "Размер буфера заголовков клиента"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "Максимальный размер тела клиента"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 msgid "Client request body buffer size"
-msgstr ""
+msgstr "Размер буфера тела запроса клиента"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "Размер буфера заголовков запроса клиента"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
-msgstr ""
+msgstr "Закрыть"
 
 #: src/constants/errors/llm.ts:2
-#, fuzzy
 msgid "Code completion is not enabled"
-msgstr "Для текущей учетной записи TOTP не включен."
+msgstr "Автодополнение кода не включено"
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
-msgstr ""
+msgstr "Модель автодополнения кода"
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
@@ -714,7 +821,7 @@ msgstr "Команда"
 
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr ""
+msgstr "Команда завершилась с неожиданным кодом выхода: {0}, ошибка: {1}"
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
@@ -725,7 +832,7 @@ msgstr "Комментарии"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
-msgstr ""
+msgstr "Сравнивать"
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
@@ -734,15 +841,15 @@ msgstr "Конфигурации"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
-msgstr ""
+msgstr "Сравните выбранный"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
-msgstr ""
+msgstr "Сравните с током"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 msgid "Compression level, 1 is lowest, 9 is highest"
-msgstr ""
+msgstr "Уровень сжатия, 1 самый низкий, 9 - самый высокий"
 
 #: src/constants/errors/backup.ts:14
 #, fuzzy
@@ -786,7 +893,7 @@ msgstr "Подключено"
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "Ошибка соединения, попытка переподключения..."
 
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
@@ -794,11 +901,11 @@ msgstr "Соединение потеряно, пожалуйста, обнов
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
-msgstr ""
+msgstr "Период таймаута соединения"
 
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
-msgstr ""
+msgstr "Статус контейнера неизвестен"
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -893,7 +1000,7 @@ msgstr "Создание клиента облегчает связь с сер
 msgid "Credential"
 msgstr "Учетные данные"
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgstr "Учетные данные"
 
@@ -1190,7 +1297,7 @@ msgid "DNS Credentials"
 msgstr "DNS учетные данные"
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgstr "Провайдер DNS"
 
@@ -1241,6 +1348,10 @@ msgstr ""
 msgid "Docker Socket"
 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/DirectiveDocuments.vue:16
 #, fuzzy
@@ -1253,7 +1364,7 @@ msgstr[1] "API Документ"
 msgid "Domain"
 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}"
 msgstr "Список доменов пуст, попробуйте заново создать авто-сертификат для %{config}"
 
@@ -1515,7 +1626,7 @@ msgstr ""
 msgid "External Notify"
 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"
 msgstr "Не удалось получить сертификат"
 
@@ -1668,6 +1779,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 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/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
@@ -1831,6 +1947,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgstr "Не удалось получить сертификат"
 
+#: src/language/generate.ts:17
+#, fuzzy
+msgid "Failed to revoke certificate: %{error}"
+msgstr "Не удалось получить сертификат"
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 #, fuzzy
 msgid "Failed to save Nginx performance settings"
@@ -1870,7 +1991,7 @@ msgstr "Файл не найден"
 msgid "Filename is empty"
 msgstr ""
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgstr "Фильтр"
 
@@ -2064,7 +2185,7 @@ msgid "Import"
 msgstr "Импорт"
 
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgstr "Импортировать сертификат"
 
@@ -2290,8 +2411,8 @@ msgstr "Оставьте пустым без изменений"
 msgid "Leave blank if you don't need this."
 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"
 msgstr "Если оставить пустым, ничего не изменится"
 
@@ -2364,10 +2485,14 @@ msgstr "Локация"
 msgid "Locations"
 msgstr "Локации"
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 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
 #, fuzzy
 msgid "Log List"
@@ -2571,7 +2696,7 @@ msgid "Modify"
 msgstr "Изменить"
 
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgstr "Изменить сертификат"
 
@@ -2589,8 +2714,8 @@ msgstr "Многострочная директива"
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: 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/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2754,7 +2879,7 @@ msgstr "Nginx не работает"
 msgid "Nginx is running"
 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"
 msgstr "Журнал"
 
@@ -3772,7 +3897,7 @@ msgstr "Выполняется"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: 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/ConfigEditor.vue:275
 #: 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/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 msgid "Save successfully"
 msgstr "Сохранено успешно"
@@ -3852,7 +3977,7 @@ msgstr ""
 "Отсканируйте QR-код с помощью мобильного телефона, чтобы добавить учетную "
 "запись в приложение."
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgstr "SDK"
 
@@ -4032,7 +4157,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgstr "Содержимое SSL-сертификата"
 
@@ -4045,15 +4170,15 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgstr "Содержимое ключа SSL-сертификата"
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgstr "Содержимое ключа SSL-сертификата"
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgstr "Путь к ключу SSL-сертификата"
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgstr "Путь к SSL сертификату"
@@ -4227,7 +4352,7 @@ msgstr "Синхронизировать с"
 msgid "Sync strategy"
 msgstr "Синхронизировать сертификат"
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 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"
 msgstr "Входные данные не являются SSL-сертификатом"
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgstr "Введенные данные не являются ключом SSL сертификата"
 
@@ -4348,11 +4473,11 @@ msgstr ""
 msgid "The parameter of server_name is required"
 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"
 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"
 msgstr "Путь существует, но файл не является приватным ключом"
 
@@ -4412,17 +4537,17 @@ msgid ""
 "lose access to your account."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr "Этот элемент автосертификата недействителен, удалите его.."
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by 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"
 msgstr "Это поле обязательно для заполнения"
 

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

@@ -14,6 +14,98 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\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
 msgid "2FA"
 msgstr "İki aşamalı kimlik doğrulaması(2FA)"
@@ -105,7 +197,7 @@ msgstr "Akış Ekle"
 msgid "Added successfully"
 msgstr "Başarıyla eklendi"
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgstr "İlave bilgi"
 
@@ -132,7 +224,7 @@ msgstr "Tüm Kurtarma Kodları Kullanıldı"
 msgid "API Base Url"
 msgstr "API Temel Bağlantı Adresi"
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgstr "API Dökümanı"
 
@@ -275,7 +367,7 @@ msgstr "Otomobil"
 msgid "auto = CPU cores"
 msgstr "Auto = CPU Çekirdekleri"
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgstr "Otomatik Yenileme"
 
@@ -295,11 +387,9 @@ msgstr "\"Otomatik Yeniden Başlatma\""
 msgid "Automatically indexed from site and stream configurations."
 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/stream/components/StreamEditor.vue:106
 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"
 
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 msgid "Certificate decode error"
-msgstr "Senkronizasyon Sertifikası Hatası"
+msgstr "Sertifika çözme hatası"
 
 #: src/components/Notification/notifications.ts:29
-#, fuzzy
 msgid "Certificate Expiration Notice"
-msgstr "Yapılandırma Şablonları"
+msgstr "Sertifika Son Kullanma Bildirimi"
 
 #: src/components/Notification/notifications.ts:25
-#, fuzzy
 msgid "Certificate Expired"
-msgstr "Sertifika Listesi"
+msgstr "Sertifikanın süresi doldu"
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 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
+msgid "Certificate not found: %{error}"
+msgstr "Sertifika çözme hatası"
+
+#: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
-msgstr "Senkronizasyon Sertifikası Hatası"
+msgstr "Sertifika ayrıştırma hatası"
 
 #: src/constants/errors/cert.ts:8
-#, fuzzy
 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:61
-#, fuzzy
 msgid "Certificate removed successfully"
-msgstr "Başarıyla temizlendi"
+msgstr "Sertifika başarıyla kaldırıldı"
 
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
@@ -552,7 +640,12 @@ msgstr "Sertifika Yenileme Aralığı"
 msgid "Certificate renewed successfully"
 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
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
@@ -595,7 +688,7 @@ msgstr "Kanal"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
-msgstr ""
+msgstr "Sohbet"
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -613,40 +706,54 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 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
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 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
 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
 msgid "Check if the nginx.conf includes the sites-enabled directory."
 msgstr ""
+"nginx.conf dosyasının sites-enabled dizinini içerip içermediğini kontrol "
+"edin."
 
 #: src/components/SelfCheck/tasks/backend/index.ts:21
 msgid "Check if the nginx.conf includes the streams-enabled directory."
 msgstr ""
+"nginx.conf dosyasının streams-enabled dizinini içerip içermediğini kontrol "
+"edin."
 
 #: src/components/SelfCheck/tasks/backend/index.ts:6
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 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
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 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
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "Şifreli metin çok kısa"
 
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
@@ -666,44 +773,43 @@ msgstr "Başarıyla temizlendi"
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 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
 msgid "Click to copy"
-msgstr ""
+msgstr "Kopyala için tıklayın"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "İstemci gövdesi arabellek boyutu"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "İstemci Başlık Arabellek Boyutu"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "İstemci Maksimum Gövde Boyutu"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 msgid "Client request body buffer size"
-msgstr ""
+msgstr "İstemci istek gövdesi tampon boyutu"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "İstemci istek başlığı arabellek boyutu"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
-msgstr ""
+msgstr "Kapat"
 
 #: src/constants/errors/llm.ts:2
-#, fuzzy
 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
 msgid "Code Completion Model"
-msgstr ""
+msgstr "Kod Tamamlama Modeli"
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
@@ -711,7 +817,7 @@ msgstr "Komut"
 
 #: src/constants/errors/docker.ts:6
 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/LocationEditor.vue:104
@@ -722,7 +828,7 @@ msgstr "Yorumlar"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
-msgstr ""
+msgstr "Karşılaştırmak"
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
@@ -731,15 +837,15 @@ msgstr "Yapılandırmalar"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
-msgstr ""
+msgstr "Seçili karşılaştırın"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
-msgstr ""
+msgstr "Mevcut ile karşılaştırın"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 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
 #, fuzzy
@@ -783,7 +889,7 @@ msgstr "Bağlandı"
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "Bağlantı hatası, yeniden bağlanılmaya çalışılıyor..."
 
 #: src/views/terminal/Terminal.vue:142
 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
 msgid "Connection timeout period"
-msgstr ""
+msgstr "Bağlantı zaman aşımı süresi"
 
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
-msgstr ""
+msgstr "Kapsayıcı durumu bilinmiyor"
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -891,7 +997,7 @@ msgstr "İstemci oluşturmak, CA sunucusuyla iletişimi kolaylaştırır"
 msgid "Credential"
 msgstr "Kimlik bilgisi"
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgstr "Kimlik bilgileri"
 
@@ -1203,7 +1309,7 @@ msgid "DNS Credentials"
 msgstr "DNS Kimlik Bilgileri"
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgstr "DNS Sağlayıcısı"
 
@@ -1253,6 +1359,10 @@ msgstr ""
 msgid "Docker Socket"
 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/DirectiveDocuments.vue:16
 #, fuzzy
@@ -1265,7 +1375,7 @@ msgstr[1] "API Dökümanı"
 msgid "Domain"
 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}"
 msgstr ""
 "Alan adları listesi boş, %{config} için Otomatik Sertifikayı yeniden açmayı "
@@ -1543,7 +1653,7 @@ msgstr ""
 msgid "External Notify"
 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"
 msgstr "Sertifika alınamadı"
 
@@ -1696,6 +1806,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 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/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
@@ -1859,6 +1974,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 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
 #, fuzzy
 msgid "Failed to save Nginx performance settings"
@@ -1898,7 +2018,7 @@ msgstr "Dosya Bulunamadı"
 msgid "Filename is empty"
 msgstr ""
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgstr "Filtre"
 
@@ -2094,7 +2214,7 @@ msgid "Import"
 msgstr "İçe Aktar"
 
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 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."
 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"
 msgstr "Boş bırakmak hiçbir şeyi değiştirmeyecektir"
 
@@ -2395,10 +2515,14 @@ msgstr "Konum"
 msgid "Locations"
 msgstr "Konumlar"
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 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
 #, fuzzy
 msgid "Log List"
@@ -2614,7 +2738,7 @@ msgid "Modify"
 msgstr "Değiştir"
 
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 #, fuzzy
 msgid "Modify Certificate"
 msgstr "Sertifika Değiştirme"
@@ -2636,8 +2760,8 @@ msgstr "Çok Hatlı Direktif"
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: 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/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2816,7 +2940,7 @@ msgstr "Nginx çalışmıyor"
 msgid "Nginx is running"
 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
 msgid "Nginx Log"
 msgstr "Nginx Günlüğü"
@@ -3933,7 +4057,7 @@ msgstr "Çalışıyor"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: 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/ConfigEditor.vue:275
 #: 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/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #, fuzzy
 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."
 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
 msgid "SDK"
 msgstr "SDK"
@@ -4215,7 +4339,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 #, fuzzy
 msgid "SSL Certificate Content"
 msgstr "SSL Sertifika İçeriği"
@@ -4229,17 +4353,17 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgstr "SSL Sertifika Anahtarı İçeriği"
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 #, fuzzy
 msgid "SSL Certificate Key Content"
 msgstr "SSL Sertifika Anahtarı İçeriği"
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 #, fuzzy
 msgid "SSL Certificate Key Path"
 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
 #, fuzzy
 msgid "SSL Certificate Path"
@@ -4430,7 +4554,7 @@ msgstr "Şununla senkronize et"
 msgid "Sync strategy"
 msgstr "Senkronizasyon Sertifikası"
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 #, fuzzy
 msgid "Sync to"
 msgstr "Şununla senkronize et"
@@ -4514,12 +4638,12 @@ msgid ""
 "dashes, colons, and dots."
 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
 msgid "The input is not a SSL Certificate"
 msgstr "Giriş bir SSL Sertifikası değil"
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 #, fuzzy
 msgid "The input is not a SSL Certificate Key"
 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"
 msgstr "server_name parametresi gereklidir"
 
-#: src/views/certificate/components/CertificateEditor.vue:181
+#: src/views/certificate/CertificateEditor.vue:181
 #, fuzzy
 msgid "The path exists, but the file is not a certificate"
 msgstr "Yol var, ancak dosya bir sertifika değil"
 
-#: src/views/certificate/components/CertificateEditor.vue:196
+#: src/views/certificate/CertificateEditor.vue:196
 #, fuzzy
 msgid "The path exists, but the file is not a private key"
 msgstr "Yol var, ancak dosya bir özel anahtar değil"
@@ -4625,19 +4749,19 @@ msgid ""
 "lose access to your account."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 #, fuzzy
 msgid "This Auto Cert item is invalid, please remove it."
 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
 msgid "This certificate is managed by Nginx UI"
 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
 msgid "This field is required"
 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"
 "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
 msgid "2FA"
 msgstr "2FA"
@@ -105,7 +200,7 @@ msgstr "Додати стрім"
 msgid "Added successfully"
 msgstr "Успішно додано"
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgstr "Додатково"
 
@@ -132,7 +227,7 @@ msgstr "Усі коди відновлення використано"
 msgid "API Base Url"
 msgstr "Базова URL-адреса API"
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgstr "API Документація"
 
@@ -276,7 +371,7 @@ msgstr "Автоматичний"
 msgid "auto = CPU cores"
 msgstr "Auto = CPU ядра"
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgstr "Автоматичне оновлення"
 
@@ -296,11 +391,9 @@ msgstr "\"Автоматичний перезапуск\""
 msgid "Automatically indexed from site and stream configurations."
 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/stream/components/StreamEditor.vue:106
 msgid "Back"
@@ -502,98 +595,110 @@ msgstr "Термін дії сертифіката %{name} закінчитьс
 
 #: src/constants/errors/cert.ts:4
 msgid "Certificate decode error"
-msgstr ""
+msgstr "Помилка декодування сертифіката"
 
 #: src/components/Notification/notifications.ts:29
 msgid "Certificate Expiration Notice"
-msgstr ""
+msgstr "Повідомлення про закінчення терміну дії сертифіката"
 
 #: src/components/Notification/notifications.ts:25
 msgid "Certificate Expired"
-msgstr ""
+msgstr "Термін дії сертифіката закінчився"
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
 msgid "Certificate Expiring Soon"
-msgstr ""
+msgstr "Сертифікат незабаром закінчується"
+
+#: src/language/generate.ts:5
+#, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "Помилка декодування сертифіката"
 
 #: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
-msgstr ""
+msgstr "Помилка аналізу сертифіката"
 
 #: src/constants/errors/cert.ts:8
 msgid "Certificate path is empty"
-msgstr ""
+msgstr "Шлях до сертифіката порожній"
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
 msgid "Certificate removed successfully"
-msgstr ""
+msgstr "Сертифікат успішно видалено"
 
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
-msgstr ""
+msgstr "Інтервал оновлення сертифіката"
 
 #: src/language/constants.ts:21
 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
+#, fuzzy
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Статус сертифіката"
+msgstr[1] "Статус сертифіката"
+msgstr[2] "Статус сертифіката"
 
 #: src/routes/modules/certificates.ts:11
 #: src/views/certificate/CertificateList/Certificate.vue:14
 msgid "Certificates"
-msgstr ""
+msgstr "Сертифікати"
 
 #: src/routes/modules/certificates.ts:28
 msgid "Certificates List"
-msgstr ""
+msgstr "Список сертифікатів"
 
 #: src/components/AutoCertForm/AutoCertForm.vue:65
 msgid "Challenge Method"
-msgstr ""
+msgstr "Метод перевірки"
 
 #: src/views/site/site_edit/components/Cert/ChangeCert.vue:49
 #: src/views/site/site_edit/components/Cert/ChangeCert.vue:53
 msgid "Change Certificate"
-msgstr ""
+msgstr "Змінити сертифікат"
 
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
+#, fuzzy
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Змінено сертифікат"
+msgstr[1] "Змінено сертифікат"
+msgstr[2] "Змінено сертифікат"
 
 #: src/views/config/ConfigEditor.vue:322
 msgid "Changed Path"
-msgstr ""
+msgstr "Змінений шлях"
 
 #: src/views/environments/list/BatchUpgrader.vue:159
 #: src/views/system/Upgrade.vue:188
 msgid "Channel"
-msgstr ""
+msgstr "Канал"
 
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
-msgstr ""
+msgstr "Чат"
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
 msgid "Check"
-msgstr ""
+msgstr "Перевірити"
 
 #: src/views/system/Upgrade.vue:185
 msgid "Check again"
-msgstr ""
+msgstr "Перевірте ще раз"
 
 #: src/components/SelfCheck/tasks/backend/index.ts:31
 msgid ""
@@ -601,171 +706,182 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 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
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 msgstr ""
+"Перевірте, чи ввімкнено HTTPS. Використання HTTP поза localhost є "
+"небезпечним і блокує функції Passkeys та буфера обміну."
 
 #: src/components/SelfCheck/tasks/backend/index.ts:26
 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
 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
 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
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 msgstr ""
+"Перевірте, чи знаходяться каталоги sites-available та sites-enabled у "
+"каталозі конфігурації nginx."
 
 #: src/components/SelfCheck/tasks/backend/index.ts:11
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 msgstr ""
+"Перевірте, чи каталоги streams-available та streams-enabled знаходяться в "
+"каталозі конфігурації nginx."
 
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "Зашифрований текст занадто короткий"
 
 #: src/language/constants.ts:13
 msgid "Cleaning environment variables"
-msgstr ""
+msgstr "Змінні навколишнього середовища очищення"
 
 #: src/components/ChatGPT/ChatGPT.vue:380
 #: src/components/Notification/Notification.vue:140
 #: src/views/notification/Notification.vue:44
 msgid "Clear"
-msgstr ""
+msgstr "Чіткий"
 
 #: src/components/Notification/Notification.vue:93
 #: src/views/notification/Notification.vue:13
 msgid "Cleared successfully"
-msgstr ""
+msgstr "Успішно очищено"
 
 #: src/components/SystemRestore/SystemRestoreContent.vue:194
 #: src/components/SystemRestore/SystemRestoreContent.vue:271
 msgid "Click or drag backup file to this area to upload"
 msgstr ""
+"Клацніть або перетягніть файл резервного копіювання в цю область, щоб "
+"завантажити"
 
 #: src/views/preference/components/AuthSettings/TOTP.vue:110
 msgid "Click to copy"
-msgstr ""
+msgstr "Клацніть, щоб скопіювати"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 msgid "Client Body Buffer Size"
-msgstr ""
+msgstr "Розмір буфера кузова клієнта"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:113
 msgid "Client Header Buffer Size"
-msgstr ""
+msgstr "Розмір буфера заголовків клієнта"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:99
 msgid "Client Max Body Size"
-msgstr ""
+msgstr "Максимальний розмір тіла клієнта"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:121
 msgid "Client request body buffer size"
-msgstr ""
+msgstr "Розмір буфера тіла запиту клієнта"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:114
 msgid "Client request header buffer size"
-msgstr ""
+msgstr "Розмір буфера заголовка запиту клієнта"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:169
 msgid "Close"
-msgstr ""
+msgstr "Закрити"
 
 #: src/constants/errors/llm.ts:2
 msgid "Code completion is not enabled"
-msgstr ""
+msgstr "Автозавершення коду не ввімкнено"
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
-msgstr ""
+msgstr "Модель автодоповнення коду"
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
-msgstr ""
+msgstr "Команда"
 
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr ""
+msgstr "Команда завершилася з неочікуваним кодом виходу: {0}, помилка: {1}"
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
 #: src/components/NgxConfigEditor/LocationEditor.vue:135
 #: src/components/NgxConfigEditor/NgxServer.vue:91
 msgid "Comments"
-msgstr ""
+msgstr "Коментарі"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
-msgstr ""
+msgstr "Порівнювати"
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 msgid "Compare Configurations"
-msgstr ""
+msgstr "Порівняйте конфігурації"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
-msgstr ""
+msgstr "Порівняйте вибрані"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
-msgstr ""
+msgstr "Порівняйте з струмом"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 msgid "Compression level, 1 is lowest, 9 is highest"
-msgstr ""
+msgstr "Рівень стиснення, 1 найнижчий, 9 - найвищий"
 
 #: src/constants/errors/backup.ts:14
 msgid "Config path is empty"
-msgstr ""
+msgstr "Конфігурація порожній"
 
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:36
 msgid "Config Template"
-msgstr ""
+msgstr "Шаблон конфігурації"
 
 #: src/views/config/InspectConfig.vue:27
 msgid "Configuration file is test successful"
-msgstr ""
+msgstr "Файл конфігурації успішно протестовано"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:138
 msgid "Configuration History"
-msgstr ""
+msgstr "Історія конфігурації"
 
 #: src/views/dashboard/components/PerformanceTablesCard.vue:167
 msgid "Configuration information"
-msgstr ""
+msgstr "Інформація про конфігурацію"
 
 #: src/views/site/site_add/SiteAdd.vue:85
 msgid "Configuration Name"
-msgstr ""
+msgstr "Назва конфігурації"
 
 #: src/views/config/ConfigList.vue:104
 msgid "Configurations"
-msgstr ""
+msgstr "Конфігурації"
 
 #: src/views/site/site_add/SiteAdd.vue:80
 msgid "Configure SSL"
-msgstr ""
+msgstr "Налаштувати SSL"
 
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
-msgstr ""
+msgstr "Підключено"
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
-msgstr ""
+msgstr "Помилка з'єднання, спроба повторного підключення..."
 
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
@@ -773,36 +889,36 @@ msgstr "З'єднання, будь ласка, оновіть сторінку.
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
-msgstr ""
+msgstr "Період таймауту з'єднання"
 
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
-msgstr ""
+msgstr "Стан контейнера невідомий"
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
 #: src/components/NgxConfigEditor/LocationEditor.vue:144
 msgid "Content"
-msgstr ""
+msgstr "Вміст"
 
 #: src/components/SensitiveString/SensitiveString.vue:37
 #: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 msgid "Copied"
-msgstr ""
+msgstr "Скопійовано"
 
 #: src/views/system/Backup/BackupCreator.vue:128
 msgid "Copied!"
-msgstr ""
+msgstr "Скопійовано!"
 
 #: src/components/SensitiveString/SensitiveString.vue:37
 #: src/views/system/Backup/BackupCreator.vue:128
 msgid "Copy"
-msgstr ""
+msgstr "Копіювати"
 
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 msgid "Copy Codes"
-msgstr ""
+msgstr "Копіювати коди"
 
 #: src/views/system/Upgrade.vue:146
 msgid "Core Upgrade"
@@ -870,7 +986,7 @@ msgstr ""
 msgid "Credential"
 msgstr ""
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgstr ""
 
@@ -1143,7 +1259,7 @@ msgid "DNS Credentials"
 msgstr ""
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgstr ""
 
@@ -1192,6 +1308,10 @@ msgstr ""
 msgid "Docker Socket"
 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/DirectiveDocuments.vue:16
 msgid "Document"
@@ -1204,7 +1324,7 @@ msgstr[2] ""
 msgid "Domain"
 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}"
 msgstr ""
 
@@ -1449,7 +1569,7 @@ msgstr ""
 msgid "External Notify"
 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"
 msgstr ""
 
@@ -1581,6 +1701,10 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgstr ""
 
+#: src/language/generate.ts:9
+msgid "Failed to delete certificate from database: %{error}"
+msgstr ""
+
 #: src/views/site/components/SiteStatusSegmented.vue:46
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
@@ -1721,6 +1845,10 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgstr ""
 
+#: src/language/generate.ts:17
+msgid "Failed to revoke certificate: %{error}"
+msgstr ""
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 msgid "Failed to save Nginx performance settings"
 msgstr ""
@@ -1757,7 +1885,7 @@ msgstr ""
 msgid "Filename is empty"
 msgstr ""
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgstr ""
 
@@ -1933,7 +2061,7 @@ msgid "Import"
 msgstr ""
 
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgstr ""
 
@@ -2150,8 +2278,8 @@ msgstr ""
 msgid "Leave blank if you don't need this."
 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"
 msgstr ""
 
@@ -2222,10 +2350,14 @@ msgstr ""
 msgid "Locations"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 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
 msgid "Log List"
 msgstr ""
@@ -2413,7 +2545,7 @@ msgid "Modify"
 msgstr ""
 
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgstr ""
 
@@ -2431,8 +2563,8 @@ msgstr ""
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: 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/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2586,7 +2718,7 @@ msgstr ""
 msgid "Nginx is running"
 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"
 msgstr ""
 
@@ -3394,7 +3526,7 @@ msgstr ""
 #: src/views/certificate/components/RenewCert.vue:27
 #: src/views/certificate/components/WildcardCertificate.vue:46
 msgid "Renew successfully"
-msgstr ""
+msgstr "Оновлення успішне"
 
 #: src/views/dashboard/components/PerformanceTablesCard.vue:141
 msgid "Request statistics"
@@ -3532,7 +3664,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: 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/ConfigEditor.vue:275
 #: src/views/preference/components/AuthSettings/Passkey.vue:130
@@ -3589,7 +3721,7 @@ msgstr ""
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: 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
 msgid "Save successfully"
 msgstr ""
@@ -3604,7 +3736,7 @@ msgstr ""
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr ""
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgstr ""
 
@@ -3773,7 +3905,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgstr ""
 
@@ -3785,15 +3917,15 @@ msgstr ""
 msgid "SSL certificate file not found"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgstr ""
@@ -3956,7 +4088,7 @@ msgstr ""
 msgid "Sync strategy"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgstr ""
 
@@ -4024,11 +4156,11 @@ msgid ""
 "dashes, colons, and dots."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgstr ""
 
@@ -4059,11 +4191,11 @@ msgstr ""
 msgid "The parameter of server_name is required"
 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"
 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"
 msgstr ""
 
@@ -4115,17 +4247,17 @@ msgid ""
 "lose access to your account."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
 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"
 msgstr ""
 
@@ -4555,7 +4687,7 @@ msgstr ""
 #: src/views/preference/tabs/AuthSettings.vue:163
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
-msgstr ""
+msgstr "Так"
 
 #: src/views/terminal/Terminal.vue:135
 msgid ""

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

@@ -9,6 +9,98 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\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
 msgid "2FA"
 msgstr "2fa"
@@ -105,7 +197,7 @@ msgstr "Thêm Website"
 msgid "Added successfully"
 msgstr "Cập nhật thành công"
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 #, fuzzy
 msgid "Additional"
 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"
 msgstr "URL Cơ sở API"
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgstr "Tài liệu API"
 
@@ -291,7 +383,7 @@ msgstr "Tự động"
 msgid "auto = CPU cores"
 msgstr "auto = lõi cpu"
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 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."
 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/stream/components/StreamEditor.vue:106
 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"
 
 #: src/constants/errors/cert.ts:4
-#, fuzzy
 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
-#, fuzzy
 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
-#, fuzzy
 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:37
 #: src/components/Notification/notifications.ts:41
-#, fuzzy
 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
+msgid "Certificate not found: %{error}"
+msgstr "Lỗi giải mã chứng chỉ"
+
+#: src/constants/errors/cert.ts:5
 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
-#, fuzzy
 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:61
-#, fuzzy
 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
 #, fuzzy
@@ -572,7 +660,12 @@ msgstr "Chứng chỉ SSL hợp lệ"
 msgid "Certificate renewed successfully"
 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
 #, fuzzy
 msgid "Certificate Status"
@@ -621,7 +714,7 @@ msgstr "Kênh"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
-msgstr ""
+msgstr "Trò chuyện"
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -639,40 +732,49 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 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
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features."
 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
 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
 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
 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
 msgid ""
 "Check if the sites-available and sites-enabled directories are under the "
 "nginx configuration directory."
 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
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
 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
 msgid "Cipher text is too short"
-msgstr ""
+msgstr "Văn bản mã hóa quá ngắn"
 
 #: src/language/constants.ts:13
 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:271
 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
 msgid "Click to copy"
-msgstr ""
+msgstr "Bấm để sao chép"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:120
 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
 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
 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
 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
 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
 msgid "Close"
-msgstr ""
+msgstr "Đóng"
 
 #: src/constants/errors/llm.ts:2
 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
 msgid "Code Completion Model"
-msgstr ""
+msgstr "Mô hình hoàn thành mã"
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 #, fuzzy
@@ -738,7 +840,7 @@ msgstr "Bình luận"
 
 #: src/constants/errors/docker.ts:6
 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/LocationEditor.vue:104
@@ -749,7 +851,7 @@ msgstr "Bình luận"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:127
 msgid "Compare"
-msgstr ""
+msgstr "So sánh"
 
 #: src/components/ConfigHistory/DiffViewer.vue:388
 #, fuzzy
@@ -758,15 +860,15 @@ msgstr "Cấu hình"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:130
 msgid "Compare Selected"
-msgstr ""
+msgstr "So sánh đã chọn"
 
 #: src/components/ConfigHistory/ConfigHistory.vue:129
 msgid "Compare with Current"
-msgstr ""
+msgstr "So sánh với hiện tại"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:88
 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
 #, fuzzy
@@ -810,7 +912,7 @@ msgstr "Đã kết nối"
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 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
 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
 msgid "Connection timeout period"
-msgstr ""
+msgstr "Khoảng thời gian chờ kết nối"
 
 #: src/constants/errors/docker.ts:7
 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/LocationEditor.vue:116
@@ -834,20 +936,20 @@ msgstr "Nội dung"
 #: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 msgid "Copied"
-msgstr ""
+msgstr "Đã sao chép"
 
 #: src/views/system/Backup/BackupCreator.vue:128
 msgid "Copied!"
-msgstr ""
+msgstr "Đã sao chép!"
 
 #: src/components/SensitiveString/SensitiveString.vue:37
 #: src/views/system/Backup/BackupCreator.vue:128
 msgid "Copy"
-msgstr ""
+msgstr "Sao chép"
 
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:121
 msgid "Copy Codes"
-msgstr ""
+msgstr "Sao chép mã"
 
 #: src/views/system/Upgrade.vue:146
 msgid "Core Upgrade"
@@ -920,7 +1022,7 @@ msgstr "Tạo client để giao tiếp với CA server"
 msgid "Credential"
 msgstr "Chứng chỉ"
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgstr "Chứng chỉ"
 
@@ -1222,7 +1324,7 @@ msgid "DNS Credentials"
 msgstr "Xác thực DNS"
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgstr "Nhà cung cấp DNS"
 
@@ -1277,6 +1379,10 @@ msgstr ""
 msgid "Docker Socket"
 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/DirectiveDocuments.vue:16
 #, fuzzy
@@ -1289,7 +1395,7 @@ msgstr[1] "Bình luận"
 msgid "Domain"
 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}"
 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 "
@@ -1561,7 +1667,7 @@ msgstr ""
 msgid "External Notify"
 msgstr ""
 
-#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:96
+#: src/views/site/site_edit/components/Cert/ObtainCertLive.vue:80
 #, fuzzy
 msgid "Fail to obtain certificate"
 msgstr "Nhận chứng chỉ"
@@ -1715,6 +1821,11 @@ msgstr ""
 msgid "Failed to delete certificate"
 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/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
@@ -1878,6 +1989,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 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
 #, fuzzy
 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"
 msgstr ""
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgstr "Lọc"
 
@@ -2102,7 +2218,7 @@ msgid "Import"
 msgstr "Xuất"
 
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 #, fuzzy
 msgid "Import Certificate"
 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."
 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
 msgid "Leave blank will not change anything"
 msgstr "Bỏ trống nếu không thay đổi"
@@ -2415,11 +2531,15 @@ msgstr "Location"
 msgid "Locations"
 msgstr "Locations"
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 #, fuzzy
 msgid "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
 msgid "Log List"
 msgstr ""
@@ -2621,7 +2741,7 @@ msgid "Modify"
 msgstr "Sửa"
 
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 #, fuzzy
 msgid "Modify Certificate"
 msgstr "Sửa chứng chỉ"
@@ -2642,8 +2762,8 @@ msgstr "Single Directive"
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: 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/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2806,7 +2926,7 @@ msgstr ""
 msgid "Nginx is running"
 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"
 msgstr ""
 
@@ -3832,7 +3952,7 @@ msgstr "Running"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: 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/ConfigEditor.vue:275
 #: 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/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 #, fuzzy
 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."
 msgstr ""
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgstr ""
 
@@ -4093,7 +4213,7 @@ msgstr ""
 msgid "Sleep time between cache manager iterations"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgstr ""
 
@@ -4106,15 +4226,15 @@ msgstr ""
 msgid "SSL certificate file not found"
 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"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgstr ""
@@ -4294,7 +4414,7 @@ msgstr ""
 msgid "Sync strategy"
 msgstr "Gia hạn chứng chỉ SSL"
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgstr ""
 
@@ -4370,11 +4490,11 @@ msgid ""
 "dashes, colons, and dots."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgstr ""
 
@@ -4406,11 +4526,11 @@ msgstr ""
 msgid "The parameter of server_name is required"
 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"
 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"
 msgstr ""
 
@@ -4463,17 +4583,17 @@ msgid ""
 "lose access to your account."
 msgstr ""
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 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ó"
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by 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"
 msgstr ""
 

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

@@ -15,6 +15,96 @@ msgstr ""
 "X-Generator: Poedit 3.6\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
 msgid "2FA"
 msgstr "2FA"
@@ -31,7 +121,8 @@ msgstr "关于"
 msgid "Access Log"
 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"
 msgstr "访问日志"
 
@@ -42,7 +133,8 @@ msgstr "ACME 用户"
 
 #: src/views/certificate/ACMEUser.vue:95
 #: 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/list/envColumns.tsx:97
 #: src/views/nginx_log/NginxLogList.vue:49
@@ -104,7 +196,7 @@ msgstr "添加 Stream"
 msgid "Added successfully"
 msgstr "添加成功"
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgstr "额外选项"
 
@@ -122,7 +214,8 @@ msgstr "之后,请刷新此页面并再次点击添加通行密钥。"
 msgid "All"
 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"
 msgstr "所有恢复代码已用完"
 
@@ -130,7 +223,7 @@ msgstr "所有恢复代码已用完"
 msgid "API Base Url"
 msgstr "API 地址"
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgstr "API 文档"
 
@@ -199,7 +292,8 @@ msgstr "您确定要永久删除此项目吗?"
 msgid "Are you sure you want to delete this item?"
 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?"
 msgstr "您确定要删除吗?"
 
@@ -269,7 +363,7 @@ msgstr "自动"
 msgid "auto = CPU cores"
 msgstr "自动 = CPU 线程数"
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgstr "自动刷新"
 
@@ -289,9 +383,9 @@ msgstr "\"自动重启\""
 msgid "Automatically indexed from site and stream configurations."
 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/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/stream/components/StreamEditor.vue:106
 msgid "Back"
@@ -498,13 +592,18 @@ msgstr "证书到期通知"
 
 #: src/components/Notification/notifications.ts:25
 msgid "Certificate Expired"
-msgstr "证书过期"
+msgstr "证书过期"
 
 #: src/components/Notification/notifications.ts:33
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
 msgid "Certificate Expiring Soon"
-msgstr "证书即将到期"
+msgstr "证书即将过期"
+
+#: src/language/generate.ts:5
+#, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "证书解码错误"
 
 #: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
@@ -517,7 +616,7 @@ msgstr "证书路径为空"
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
 msgid "Certificate removed successfully"
-msgstr "成功删除证书"
+msgstr "证书已成功移除"
 
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
@@ -527,7 +626,12 @@ msgstr "证书续期间隔"
 msgid "Certificate renewed successfully"
 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
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
@@ -560,7 +664,8 @@ msgstr[0] "变更证书"
 msgid "Changed Path"
 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"
 msgstr "通道"
 
@@ -615,7 +720,7 @@ msgstr "检查 sites-available 和 sites-enabled 目录是否位于 nginx 配置
 msgid ""
 "Check if the streams-available and streams-enabled directories are under "
 "the nginx configuration directory."
-msgstr "检查 nginx 配置目录下是否有 streams-available 和 streams-enabled 目录。"
+msgstr "检查 Nginx 配置目录下是否有 streams-available 和 streams-enabled 目录。"
 
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
@@ -671,7 +776,7 @@ msgstr "关闭"
 
 #: src/constants/errors/llm.ts:2
 msgid "Code completion is not enabled"
-msgstr "未启用代码自动完成功能"
+msgstr "代码补全未启用"
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
@@ -683,7 +788,7 @@ msgstr "命令"
 
 #: src/constants/errors/docker.ts:6
 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/LocationEditor.vue:104
@@ -750,7 +855,7 @@ msgstr "已连接"
 
 #: src/views/dashboard/NginxDashBoard.vue:85
 msgid "Connection error, trying to reconnect..."
-msgstr "连接错误,尝试重新连接..."
+msgstr "连接错误,正在尝试重新连接..."
 
 #: src/views/terminal/Terminal.vue:142
 msgid "Connection lost, please refresh the page."
@@ -758,11 +863,11 @@ msgstr "连接中断,请刷新页面。"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
-msgstr "连接超时时间"
+msgstr "连接超时期限"
 
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
-msgstr "未知容器状态"
+msgstr "容器状态未知"
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -855,7 +960,7 @@ msgstr "正在创建客户端用于与 CA 服务器通信"
 msgid "Credential"
 msgstr "DNS 凭证"
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgstr "凭证"
 
@@ -920,7 +1025,8 @@ msgstr "定义共享内存区名称和大小,例如 proxy_cache:10m"
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:21
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: 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"
 msgstr "删除"
 
@@ -1106,8 +1212,8 @@ msgstr "在 %{node} 上禁用 %{name} 成功"
 #: src/views/site/components/SiteStatusSegmented.vue:134
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: 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"
 msgstr "禁用"
 
@@ -1121,12 +1227,13 @@ msgstr "禁用成功"
 msgid "Disk 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"
 msgstr "DNS 凭证"
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgstr "DNS 提供商"
 
@@ -1175,6 +1282,11 @@ msgstr "Docker 客户端未初始化"
 msgid "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/DirectiveDocuments.vue:16
 msgid "Document"
@@ -1185,7 +1297,7 @@ msgstr[0] "文档"
 msgid "Domain"
 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}"
 msgstr "域名列表为空,请尝试为 %{config} 重新打开证书自动续期"
 
@@ -1197,7 +1309,8 @@ msgstr "下载最新版本错误"
 msgid "Downloading latest release"
 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"
 msgstr "试运行模式已启动"
 
@@ -1240,7 +1353,8 @@ msgstr "编辑站点"
 msgid "Edit 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"
 msgstr "邮箱"
 
@@ -1354,8 +1468,8 @@ msgstr "启用 TOTP"
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110
 #: 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"
 msgstr "启用"
 
@@ -1374,7 +1488,8 @@ msgstr "用 Let's Encrypt 对网站进行加密"
 msgid "Environment variables cleaned"
 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
 msgid "Environments"
 msgstr "环境"
@@ -1392,7 +1507,8 @@ msgstr "差异查看器初始化出错"
 msgid "Error Log"
 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"
 msgstr "错误日志"
 
@@ -1426,7 +1542,7 @@ msgstr "外部 Docker 容器"
 msgid "External Notify"
 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"
 msgstr "获取证书失败"
 
@@ -1558,6 +1674,11 @@ msgstr "解密 Nginx UI 目录失败:{0}"
 msgid "Failed to delete certificate"
 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/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
@@ -1698,6 +1819,11 @@ msgstr "恢复 Nginx UI 文件失败:{0}"
 msgid "Failed to revoke certificate"
 msgstr "证书撤销失败"
 
+#: src/language/generate.ts:17
+#, fuzzy
+msgid "Failed to revoke certificate: %{error}"
+msgstr "证书撤销失败"
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 msgid "Failed to save Nginx performance settings"
 msgstr "保存 Nginx 性能参数失败"
@@ -1734,7 +1860,7 @@ msgstr "未找到文件"
 msgid "Filename is empty"
 msgstr "文件名为空"
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgstr "过滤"
 
@@ -1802,7 +1928,8 @@ msgstr "正在生成私钥用于注册账户"
 msgid "Get data failed"
 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"
 msgstr "获取发布信息错误"
 
@@ -1909,7 +2036,7 @@ msgid "Import"
 msgstr "导入"
 
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgstr "导入证书"
 
@@ -1923,13 +2050,13 @@ msgid ""
 "processes"
 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"
 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..."
 msgstr "索引中..."
 
@@ -1937,8 +2064,8 @@ msgstr "索引中..."
 msgid "Indicator"
 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"
 msgstr "信息"
 
@@ -1962,7 +2089,8 @@ msgstr "输入恢复代码:"
 msgid "Insecure Skip Verify"
 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
 msgid "Install"
 msgstr "安装"
@@ -2009,7 +2137,8 @@ msgstr "无效文件对象"
 msgid "Invalid file path: {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"
 msgstr "文件名无效"
 
@@ -2124,8 +2253,8 @@ msgstr "如果不想修改,请留空"
 msgid "Leave blank if you don't need this."
 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"
 msgstr "留空不做任何更改"
 
@@ -2141,7 +2270,8 @@ msgstr "Lego 禁用 CNAME 支持"
 msgid "License"
 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"
 msgstr "链接"
 
@@ -2195,10 +2325,14 @@ msgstr "Location"
 msgid "Locations"
 msgstr "Locations"
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 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
 msgid "Log List"
 msgstr "日志列表"
@@ -2389,7 +2523,7 @@ msgid "Modify"
 msgstr "修改"
 
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgstr "修改证书"
 
@@ -2407,9 +2541,10 @@ msgstr "多行指令"
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: 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/environments/group/columns.ts:8
 #: src/views/environments/list/envColumns.tsx:9
@@ -2561,7 +2696,7 @@ msgstr "Nginx 未在另一个容器中运行"
 msgid "Nginx is running"
 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"
 msgstr "Nginx 日志"
 
@@ -2648,7 +2783,8 @@ msgstr "Nginx UI 配置已恢复,几秒钟后将自动重启。"
 #: src/views/notification/Notification.vue:37
 #: src/views/preference/tabs/AuthSettings.vue:164
 #: 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"
 msgstr "取消"
 
@@ -2676,7 +2812,8 @@ msgstr "节点"
 msgid "Node Group"
 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"
 msgstr "环境组"
 
@@ -2798,7 +2935,8 @@ msgstr "确定"
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
 #: src/views/site/site_list/SiteList.vue:121
 #: 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"
 msgstr "确定"
 
@@ -2915,7 +3053,8 @@ msgstr "密码长度不能超过 20 个字符"
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: 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"
 msgstr "路径"
 
@@ -2996,13 +3135,15 @@ msgid ""
 "select one of the credentialsbelow to request the API of the DNS provider."
 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 ""
 "Please generate new recovery codes in the preferences immediately to "
 "prevent lockout."
 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"
 msgstr "请输入文件名"
 
@@ -3083,8 +3224,8 @@ msgid "Post-sync Action"
 msgstr "同步后操作"
 
 #: 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"
 msgstr "预发布"
 
@@ -3280,7 +3421,8 @@ msgstr "删除成功"
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:126
 #: 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/stream/components/ConfigName.vue:44
 msgid "Rename"
@@ -3302,11 +3444,13 @@ msgstr "远程配置重命名错误"
 msgid "Rename Remote Config Success"
 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"
 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"
 msgstr "重命名远程站点成功"
 
@@ -3498,8 +3642,9 @@ msgstr "运行中"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: 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/Preference.vue:117
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52
@@ -3518,11 +3663,13 @@ msgstr "保存指令"
 msgid "Save error %{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"
 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"
 msgstr "保存远程站点成功"
 
@@ -3552,7 +3699,7 @@ msgstr "成功将站点 %{name} 保存到 %{node} 中"
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47
 #: 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
 msgid "Save successfully"
 msgstr "保存成功"
@@ -3567,7 +3714,7 @@ msgstr "保存成功"
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr "用手机扫描二维码,将账户添加到应用程序中。"
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgstr "SDK"
 
@@ -3740,7 +3887,7 @@ msgstr "缓存加载器迭代之间的休眠时间"
 msgid "Sleep time between cache manager iterations"
 msgstr "缓存管理器迭代之间的休眠时间"
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgstr "SSL 证书内容"
 
@@ -3752,15 +3899,15 @@ msgstr "SSL 证书文件必须位于 Nginx 配置目录下:{0}"
 msgid "SSL certificate file not found"
 msgstr "未找到 SSL 证书文件"
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgstr "SSL 证书密钥内容"
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgstr "SSL证书密钥路径"
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgstr "SSL证书路径"
@@ -3790,8 +3937,8 @@ msgid "SSO Login"
 msgstr "SSO 登录"
 
 #: 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"
 msgstr "稳定"
 
@@ -3925,7 +4072,7 @@ msgstr "同步节点"
 msgid "Sync strategy"
 msgstr "同步策略"
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgstr "同步到"
 
@@ -3993,11 +4140,11 @@ msgid ""
 "dashes, colons, and dots."
 msgstr "ICP 备案号只能包含字母、单码、数字、连字符、破折号、冒号和点。"
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgstr "输入的内容不是 SSL 证书"
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgstr "输入的内容不是 SSL 证书密钥"
 
@@ -4028,11 +4175,11 @@ msgstr "节点名称只能包含字母、统一码、数字、连字符、破折
 msgid "The parameter of server_name is required"
 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"
 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"
 msgstr "路径存在,但文件不是私钥"
 
@@ -4084,17 +4231,17 @@ msgid ""
 "lose access to your account."
 msgstr "这些代码是在您丢失密码和双重身份验证方式时,访问账户的最后手段。如果找不到这些代码,您将无法再访问您的账户。"
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr "这个证书自动续期项目是无效的,请删除。"
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by 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"
 msgstr "此字段必填"
 
@@ -4289,7 +4436,8 @@ msgstr "未知问题"
 msgid "Update successfully"
 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/environments/group/columns.ts:37
 #: src/views/environments/list/envColumns.tsx:90
@@ -4304,9 +4452,10 @@ msgstr "修改时间"
 msgid "Updated successfully"
 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"
 msgstr "升级"
 
@@ -4318,7 +4467,8 @@ msgstr "成功升级 %{node} 上的 Nginx UI 🎉"
 msgid "Upgraded successfully"
 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..."
 msgstr "正在升级 Nginx UI,请等待..."
 
@@ -4366,7 +4516,8 @@ msgstr "用户名"
 msgid "Username (*)"
 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
 msgid "Valid"
 msgstr "有效的"

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

@@ -19,6 +19,96 @@ msgstr ""
 "X-Generator: Weblate 5.10.4\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
 msgid "2FA"
 msgstr "雙因素驗證"
@@ -110,7 +200,7 @@ msgstr "新增 Stream"
 msgid "Added successfully"
 msgstr "新增成功"
 
-#: src/views/certificate/DNSChallenge.vue:110
+#: src/views/certificate/components/DNSChallenge.vue:110
 msgid "Additional"
 msgstr "其他設定"
 
@@ -137,7 +227,7 @@ msgstr "所有恢復代碼已用完"
 msgid "API Base Url"
 msgstr "API 基礎網址"
 
-#: src/views/certificate/DNSChallenge.vue:83
+#: src/views/certificate/components/DNSChallenge.vue:83
 msgid "API Document"
 msgstr "API 文件"
 
@@ -277,7 +367,7 @@ msgstr "自動"
 msgid "auto = CPU cores"
 msgstr "auto = CPU 核心數"
 
-#: src/views/nginx_log/NginxLog.vue:149
+#: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
 msgstr "自動重新整理"
 
@@ -297,11 +387,9 @@ msgstr "\"自動重啟\""
 msgid "Automatically indexed from site and stream configurations."
 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/stream/components/StreamEditor.vue:106
 msgid "Back"
@@ -504,7 +592,7 @@ msgstr "證書解碼錯誤"
 
 #: src/components/Notification/notifications.ts:29
 msgid "Certificate Expiration Notice"
-msgstr "證到期通知"
+msgstr "證到期通知"
 
 #: src/components/Notification/notifications.ts:25
 msgid "Certificate Expired"
@@ -514,20 +602,25 @@ msgstr "憑證已過期"
 #: src/components/Notification/notifications.ts:37
 #: src/components/Notification/notifications.ts:41
 msgid "Certificate Expiring Soon"
-msgstr "證書即將到期"
+msgstr "憑證即將到期"
+
+#: src/language/generate.ts:5
+#, fuzzy
+msgid "Certificate not found: %{error}"
+msgstr "證書解碼錯誤"
 
 #: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
-msgstr "證書解析錯誤"
+msgstr "證解析錯誤"
 
 #: src/constants/errors/cert.ts:8
 msgid "Certificate path is empty"
-msgstr "證路徑為空"
+msgstr "證路徑為空"
 
 #: src/views/certificate/components/RemoveCert.vue:41
 #: src/views/certificate/components/RemoveCert.vue:61
 msgid "Certificate removed successfully"
-msgstr "憑證成功移除"
+msgstr "憑證成功移除"
 
 #: src/views/preference/tabs/CertSettings.vue:27
 msgid "Certificate Renewal Interval"
@@ -537,7 +630,12 @@ msgstr "憑證更新間隔"
 msgid "Certificate renewed successfully"
 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
 msgid "Certificate Status"
 msgid_plural "Certificates Status"
@@ -578,7 +676,7 @@ msgstr "通道"
 #: src/views/site/site_edit/components/RightPanel/RightPanel.vue:40
 #: src/views/stream/components/RightPanel/RightPanel.vue:22
 msgid "Chat"
-msgstr ""
+msgstr "聊天"
 
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:40
 #: src/components/SelfCheck/SelfCheckHeaderBanner.vue:64
@@ -596,6 +694,8 @@ msgid ""
 "Docker Image, please make sure the docker socket is mounted like this: `-v "
 "/var/run/docker.sock:/var/run/docker.sock`."
 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
 msgid ""
@@ -681,13 +781,12 @@ msgid "Close"
 msgstr "關閉"
 
 #: src/constants/errors/llm.ts:2
-#, fuzzy
 msgid "Code completion is not enabled"
-msgstr "目前帳戶未啟用 TOTP。"
+msgstr "程式碼補全未啟用"
 
 #: src/views/preference/tabs/OpenAISettings.vue:86
 msgid "Code Completion Model"
-msgstr ""
+msgstr "程式碼補全模型"
 
 #: src/views/preference/tabs/LogrotateSettings.vue:23
 msgid "Command"
@@ -695,7 +794,7 @@ msgstr "命令"
 
 #: src/constants/errors/docker.ts:6
 msgid "Command exited with unexpected exit code: {0}, error: {1}"
-msgstr ""
+msgstr "命令以意外退出代碼結束:{0},錯誤:{1}"
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:115
 #: src/components/NgxConfigEditor/LocationEditor.vue:104
@@ -771,11 +870,11 @@ msgstr "連線中斷,請重新整理此頁面。"
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:61
 msgid "Connection timeout period"
-msgstr "連線逾時時間"
+msgstr "連接逾時期限"
 
 #: src/constants/errors/docker.ts:7
 msgid "Container status unknown"
-msgstr ""
+msgstr "容器狀態未知"
 
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:120
 #: src/components/NgxConfigEditor/LocationEditor.vue:116
@@ -868,7 +967,7 @@ msgstr "建立客戶端方便與 CA 伺服器通訊"
 msgid "Credential"
 msgstr "認證"
 
-#: src/views/certificate/DNSChallenge.vue:99
+#: src/views/certificate/components/DNSChallenge.vue:99
 msgid "Credentials"
 msgstr "認證資訊"
 
@@ -1142,7 +1241,7 @@ msgid "DNS Credentials"
 msgstr "DNS 認證"
 
 #: src/components/AutoCertForm/DNSChallenge.vue:94
-#: src/views/certificate/DNSChallenge.vue:72
+#: src/views/certificate/components/DNSChallenge.vue:72
 msgid "DNS Provider"
 msgstr "DNS 供應商"
 
@@ -1191,6 +1290,10 @@ msgstr ""
 msgid "Docker Socket"
 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/DirectiveDocuments.vue:16
 msgid "Document"
@@ -1201,7 +1304,7 @@ msgstr[0] "檔案"
 msgid "Domain"
 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}"
 msgstr "網域列表為空,請嘗試重新開啟 %{config} 的自動憑證"
 
@@ -1447,7 +1550,7 @@ msgstr "外部通知"
 msgid "External Notify"
 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"
 msgstr "取得憑證失敗"
 
@@ -1581,6 +1684,11 @@ msgstr "解密 Nginx UI 目錄失敗:{0}"
 msgid "Failed to delete certificate"
 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/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:102
@@ -1727,6 +1835,11 @@ msgstr "還原 Nginx UI 檔案失敗:{0}"
 msgid "Failed to revoke certificate"
 msgstr "撤銷憑證失敗"
 
+#: src/language/generate.ts:17
+#, fuzzy
+msgid "Failed to revoke certificate: %{error}"
+msgstr "撤銷憑證失敗"
+
 #: src/views/dashboard/components/ParamsOptimization.vue:90
 msgid "Failed to save Nginx performance settings"
 msgstr "儲存 Nginx 效能設定失敗"
@@ -1764,7 +1877,7 @@ msgstr "找不到檔案"
 msgid "Filename is empty"
 msgstr "檔名空白"
 
-#: src/views/nginx_log/NginxLog.vue:155
+#: src/views/nginx_log/NginxLog.vue:156
 msgid "Filter"
 msgstr "篩選"
 
@@ -1940,7 +2053,7 @@ msgid "Import"
 msgstr "匯入"
 
 #: src/routes/modules/certificates.ts:46
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Import Certificate"
 msgstr "匯入憑證"
 
@@ -2158,8 +2271,8 @@ msgstr "留空表示不修改"
 msgid "Leave blank if you don't need this."
 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"
 msgstr "留空將不會改變任何內容"
 
@@ -2232,10 +2345,14 @@ msgstr "Location"
 msgid "Locations"
 msgstr "Locations"
 
-#: src/views/certificate/components/CertificateEditor.vue:247
+#: src/views/certificate/CertificateEditor.vue:247
 msgid "Log"
 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
 msgid "Log List"
 msgstr "日誌列表"
@@ -2426,7 +2543,7 @@ msgid "Modify"
 msgstr "修改"
 
 #: src/routes/modules/certificates.ts:36
-#: src/views/certificate/components/CertificateEditor.vue:85
+#: src/views/certificate/CertificateEditor.vue:85
 msgid "Modify Certificate"
 msgstr "修改憑證"
 
@@ -2444,8 +2561,8 @@ msgstr "多行指令"
 
 #: src/components/NgxConfigEditor/NgxUpstream.vue:178
 #: src/views/certificate/ACMEUser.vue:13
+#: src/views/certificate/CertificateEditor.vue:162
 #: 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/config/configColumns.tsx:7 src/views/config/ConfigEditor.vue:309
@@ -2603,7 +2720,7 @@ msgstr "Nginx 未執行"
 msgid "Nginx is running"
 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"
 msgstr "Nginx 日誌"
 
@@ -3554,7 +3671,7 @@ msgstr "執行中"
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:129
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:64
 #: 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/ConfigEditor.vue:275
 #: 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/StdCurd.vue:97
-#: src/views/certificate/components/CertificateEditor.vue:49
+#: src/views/certificate/CertificateEditor.vue:49
 #: src/views/preference/store/index.ts:118
 msgid "Save successfully"
 msgstr "儲存成功"
@@ -3626,7 +3743,7 @@ msgstr "儲存成功"
 msgid "Scan the QR code with your mobile phone to add the account to the app."
 msgstr "用手機掃描二維碼將賬戶新增到應用程式中。"
 
-#: src/views/certificate/DNSChallenge.vue:90
+#: src/views/certificate/components/DNSChallenge.vue:90
 msgid "SDK"
 msgstr "SDK"
 
@@ -3799,7 +3916,7 @@ msgstr "快取載入器迭代間的休眠時間"
 msgid "Sleep time between cache manager iterations"
 msgstr "快取管理器迭代間的休眠時間"
 
-#: src/views/certificate/components/CertificateEditor.vue:213
+#: src/views/certificate/CertificateEditor.vue:213
 msgid "SSL Certificate Content"
 msgstr "SSL 憑證內容"
 
@@ -3811,15 +3928,15 @@ msgstr "SSL 憑證檔案必須位於 Nginx 設定目錄下:{0}"
 msgid "SSL certificate file not found"
 msgstr "SSL 憑證檔案未找到"
 
-#: src/views/certificate/components/CertificateEditor.vue:227
+#: src/views/certificate/CertificateEditor.vue:227
 msgid "SSL Certificate Key Content"
 msgstr "SSL 憑證金鑰內容"
 
-#: src/views/certificate/components/CertificateEditor.vue:192
+#: src/views/certificate/CertificateEditor.vue:192
 msgid "SSL Certificate Key Path"
 msgstr "SSL 憑證金鑰路徑"
 
-#: src/views/certificate/components/CertificateEditor.vue:177
+#: src/views/certificate/CertificateEditor.vue:177
 #: src/views/preference/tabs/ServerSettings.vue:37
 msgid "SSL Certificate Path"
 msgstr "SSL 憑證路徑"
@@ -3984,7 +4101,7 @@ msgstr "同步節點"
 msgid "Sync strategy"
 msgstr "同步策略"
 
-#: src/views/certificate/components/CertificateEditor.vue:206
+#: src/views/certificate/CertificateEditor.vue:206
 msgid "Sync to"
 msgstr "同步到"
 
@@ -4053,11 +4170,11 @@ msgid ""
 "dashes, colons, and dots."
 msgstr "ICP 編號僅能包含字母、Unicode 字元、數字、連字號、破折號、冒號和句點。"
 
-#: src/views/certificate/components/CertificateEditor.vue:216
+#: src/views/certificate/CertificateEditor.vue:216
 msgid "The input is not a SSL Certificate"
 msgstr "輸入的不是 SSL 憑證"
 
-#: src/views/certificate/components/CertificateEditor.vue:230
+#: src/views/certificate/CertificateEditor.vue:230
 msgid "The input is not a SSL Certificate Key"
 msgstr "輸入的不是 SSL 憑證金鑰"
 
@@ -4088,11 +4205,11 @@ msgstr "節點名稱僅能包含字母、Unicode 字元、數字、連字號、
 msgid "The parameter of server_name is required"
 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"
 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"
 msgstr "路徑存在,但檔案不是金鑰"
 
@@ -4144,17 +4261,17 @@ msgid ""
 "lose access to your account."
 msgstr "這些代碼是您在遺失密碼和第二重驗證因素時,存取帳戶的最後手段。如果您找不到這些代碼,您將無法再存取您的帳戶。"
 
-#: src/views/certificate/components/CertificateEditor.vue:102
+#: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr "此自動憑證項目無效,請將其移除。"
 
-#: src/views/certificate/components/CertificateEditor.vue:92
+#: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by 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"
 msgstr "此欄位為必填項"
 

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

@@ -31,7 +31,7 @@ export const certificatesRoutes: RouteRecordRaw[] = [
       {
         path: ':id',
         name: 'Modify Certificate',
-        component: () => import('@/views/certificate/components/CertificateEditor.vue'),
+        component: () => import('@/views/certificate/CertificateEditor.vue'),
         meta: {
           name: () => $gettext('Modify Certificate'),
           hiddenInSidebar: true,
@@ -41,7 +41,7 @@ export const certificatesRoutes: RouteRecordRaw[] = [
       {
         path: 'import',
         name: 'Import Certificate',
-        component: () => import('@/views/certificate/components/CertificateEditor.vue'),
+        component: () => import('@/views/certificate/CertificateEditor.vue'),
         meta: {
           name: () => $gettext('Import Certificate'),
           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 { Ref } from 'vue'
 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 { message } from 'ant-design-vue'
-import RenewCert from './RenewCert.vue'
+import RenewCert from './components/RenewCert.vue'
 
 const route = useRoute()
 
@@ -59,21 +59,21 @@ async function save() {
 provide('saveCert', save)
 
 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(() => {

+ 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 { datetime } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer'
 import { input } from '@/components/StdDesign/StdDataEntry'
-import DNSChallenge from './DNSChallenge.vue'
+import DNSChallenge from './components/DNSChallenge.vue'
 
 const columns: Column[] = [{
   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)
     openWs()
   }).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 => {
       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) {
-        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
           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'
             progressPercent.value = 100
             resolve({
@@ -91,10 +74,15 @@ async function issue_cert(config_name: string, server_name: string[], 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
       }
     }

+ 3 - 0
app/vite.config.ts

@@ -55,6 +55,9 @@ export default defineConfig(({ mode }) => {
               '$npgettext',
             ],
           },
+          {
+            '@/language': ['T'],
+          },
         ],
         vueTemplate: true,
         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
 
 import (
+	"runtime"
+	"strings"
+	"time"
+
 	"github.com/0xJacky/Nginx-UI/internal/notification"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/settings"
 	"github.com/pkg/errors"
 	"github.com/uozi-tech/cosy/logger"
-	"runtime"
-	"strings"
-	"time"
 )
 
 func AutoCert() {
@@ -30,9 +31,9 @@ func AutoCert() {
 func autoCert(certModel *model.Cert) {
 	confName := certModel.Filename
 
-	log := &Logger{}
+	log := NewLogger()
 	log.SetCertModel(certModel)
-	defer log.Exit()
+	defer log.Close()
 
 	if len(certModel.Filename) == 0 {
 		log.Error(ErrCertModelFilenameEmpty)
@@ -93,13 +94,7 @@ func autoCert(certModel *model.Cert) {
 	}
 
 	// 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
 	for err := range errChan {

+ 25 - 16
internal/cert/issue.go

@@ -3,10 +3,12 @@ package cert
 import (
 	"log"
 	"os"
+	"runtime"
 	"time"
 
 	"github.com/0xJacky/Nginx-UI/internal/cert/dns"
 	"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/model"
 	"github.com/0xJacky/Nginx-UI/query"
@@ -26,9 +28,11 @@ const (
 	DNS01  = "dns01"
 )
 
-func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error) {
+func IssueCert(payload *ConfigPayload, certLogger *Logger, errChan chan error) {
 	defer func() {
 		if err := recover(); err != nil {
+			buf := make([]byte, 1024)
+			runtime.Stack(buf, false)
 			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)
 	}()
 
-	l.Println("[INFO] [Nginx UI] Preparing lego configurations")
+	certLogger.Info(translation.C("[Nginx UI] Preparing lego configurations"))
 	user, err := payload.GetACMEUser()
 	if err != nil {
 		errChan <- errors.Wrap(err, "issue cert get acme user error")
 		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
 	go func() {
 		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()
 
-	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.
 	client, err := lego.NewClient(config)
 	if err != nil {
@@ -92,7 +101,7 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 	default:
 		fallthrough
 	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(
 			http01.NewProviderServer("",
 				settings.CertSettings.HTTPChallengePort,
@@ -106,14 +115,14 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 			return
 		}
 
-		l.Println("[INFO] [Nginx UI] Setting DNS01 challenge provider")
+		certLogger.Info(translation.C("[Nginx UI] Setting DNS01 challenge provider"))
 		code := dnsCredential.Config.Code
 		pConfig, ok := dns.GetProvider(code)
 		if !ok {
 			errChan <- errors.Wrap(err, "provider not found")
 			return
 		}
-		l.Println("[INFO] [Nginx UI] Setting environment variables")
+		certLogger.Info(translation.C("[Nginx UI] Setting environment variables"))
 		if dnsCredential.Config.Configuration != nil {
 			err = pConfig.SetEnv(*dnsCredential.Config.Configuration)
 			if err != nil {
@@ -123,7 +132,7 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 			}
 			defer func() {
 				pConfig.CleanEnv()
-				l.Println("[INFO] [Nginx UI] Environment variables cleaned")
+				certLogger.Info(translation.C("[Nginx UI] Environment variables cleaned"))
 			}()
 			provider, err := dnsproviders.NewDNSChallengeProviderByName(code)
 			if err != nil {
@@ -167,7 +176,7 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 	var oldResource *model.CertificateResource
 
 	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
 		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 &&
 		payload.Resource != nil && payload.Resource.Certificate != nil {
-		renew(payload, client, l, errChan)
+		renew(payload, client, certLogger, errChan)
 	} 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()
 
-	l.Println("[INFO] [Nginx UI] Finished")
+	certLogger.Info(translation.C("[Nginx UI] Finished"))
 
 	if payload.GetCertificatePath() == cSettings.ServerSettings.SSLCert &&
 		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
 	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
 		revokePayload := &ConfigPayload{
@@ -211,7 +220,7 @@ func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 		}
 
 		// Revoke the old certificate
-		revoke(revokePayload, client, l, errChan)
+		revoke(revokePayload, client, certLogger, errChan)
 	}
 
 	// Wait log to be written

+ 70 - 7
internal/cert/logger.go

@@ -2,35 +2,95 @@ package cert
 
 import (
 	"fmt"
-	"github.com/0xJacky/Nginx-UI/model"
-	"github.com/uozi-tech/cosy/logger"
 	"strings"
+	"sync"
 	"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 {
 	buffer []string
 	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) {
+	t.mu.Lock()
+	defer t.mu.Unlock()
 	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) {
+	t.mu.Lock()
 	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()),
 	))
+	t.mu.Unlock()
+
 	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 {
 		return
 	}
@@ -41,6 +101,9 @@ func (t *Logger) Exit() {
 }
 
 func (t *Logger) ToString() (content string) {
+	t.mu.Lock()
+	defer t.mu.Unlock()
+
 	content = strings.Join(t.buffer, "\n")
 	return
 }

+ 3 - 3
internal/cert/obtain.go

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

+ 4 - 4
internal/cert/payload.go

@@ -1,7 +1,6 @@
 package cert
 
 import (
-	"log"
 	"os"
 	"path/filepath"
 	"strings"
@@ -9,6 +8,7 @@ import (
 
 	"github.com/0xJacky/Nginx-UI/internal/helper"
 	"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/query"
 	"github.com/go-acme/lego/v4/certcrypto"
@@ -76,7 +76,7 @@ func (c *ConfigPayload) mkCertificateDir() (err error) {
 	return
 }
 
-func (c *ConfigPayload) WriteFile(l *log.Logger, errChan chan error) {
+func (c *ConfigPayload) WriteFile(l *Logger, errChan chan error) {
 	err := c.mkCertificateDir()
 	if err != nil {
 		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
 	// 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(),
 		c.Resource.Certificate, 0644)
 
@@ -94,7 +94,7 @@ func (c *ConfigPayload) WriteFile(l *log.Logger, errChan chan error) {
 		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(),
 		c.Resource.PrivateKey, 0644)
 

+ 3 - 3
internal/cert/renew.go

@@ -1,14 +1,14 @@
 package cert
 
 import (
+	"github.com/0xJacky/Nginx-UI/internal/translation"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/go-acme/lego/v4/certificate"
 	"github.com/go-acme/lego/v4/lego"
 	"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 {
 		errChan <- ErrPayloadResourceIsNil
 		return
@@ -35,5 +35,5 @@ func renew(payload *ConfigPayload, client *lego.Client, l *log.Logger, errChan c
 
 	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 (
 	"log"
 	"os"
+	"runtime"
 	"time"
 
+	"github.com/0xJacky/Nginx-UI/internal/translation"
 	"github.com/0xJacky/Nginx-UI/internal/transport"
 	"github.com/go-acme/lego/v4/lego"
 	legolog "github.com/go-acme/lego/v4/log"
@@ -14,9 +16,11 @@ import (
 )
 
 // 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() {
 		if err := recover(); err != nil {
+			buf := make([]byte, 1024)
+			runtime.Stack(buf, false)
 			logger.Error(err)
 		}
 	}()
@@ -46,7 +50,7 @@ func RevokeCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 	}()
 
 	// 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()
 	if err != nil {
 		errChan <- errors.Wrap(err, "get ACME user error")
@@ -76,30 +80,30 @@ func RevokeCert(payload *ConfigPayload, logChan chan string, errChan chan error)
 		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 payload.GetCertificatePath() == cSettings.ServerSettings.SSLCert &&
 		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()
 	}
 
-	l.Println("[INFO] [Nginx UI] Revocation completed")
+	certLogger.Info(translation.C("[Nginx UI] Revocation completed"))
 
 	// Wait for logs to be written
 	time.Sleep(2 * time.Second)
 }
 
 // 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)
 	if err != nil {
 		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 (
 	"errors"
 
-	"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,
-		})
-	}
-}
 
 func Run() (reports Reports) {
 	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 (
 	"encoding/json"
 	"fmt"
+	"io"
+	"log"
+
 	"github.com/0xJacky/Nginx-UI/app"
 	"github.com/0xJacky/pofile"
 	"github.com/samber/lo"
-	"io"
-	"log"
 )
 
 var Dict map[string]pofile.Dict

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä