Browse Source

feat(config): supports delete file or directory

Jacky 2 weeks ago
parent
commit
d64990ec4f

+ 3 - 0
.cursor/rules/frontend.mdc

@@ -4,6 +4,9 @@ globs: app/**/*.tsx,app/**/*.vue,app/**/*.ts,app/**/*.js,app/**/*.json
 alwaysApply: false
 ---
 You are an expert in TypeScript, Node.js, Vite, Vue.js, Vue Router, Pinia, VueUse, Ant Design Vue, and UnoCSS, with a deep understanding of best practices and performance optimization techniques in these technologies.
+
+Package manager: pnpm
+- pnpm typecheck
   
     Code Style and Structure
     - Write concise, maintainable, and technically accurate TypeScript code with relevant examples.

+ 0 - 1
.devcontainer/devcontainer.json

@@ -28,7 +28,6 @@
         "antfu.unocss",
         "github.copilot",
         "golang.go",
-        "vue.volar",
         "ms-azuretools.vscode-docker",
         "akino.i18n-gettext",
         "github.vscode-github-actions"

+ 75 - 0
api/config/delete.go

@@ -0,0 +1,75 @@
+package config
+
+import (
+	"net/http"
+	"os"
+
+	"github.com/0xJacky/Nginx-UI/internal/config"
+	"github.com/0xJacky/Nginx-UI/internal/helper"
+	"github.com/0xJacky/Nginx-UI/internal/nginx"
+	"github.com/gin-gonic/gin"
+	"github.com/uozi-tech/cosy"
+)
+
+// DeleteConfig handles the deletion of configuration files or directories
+func DeleteConfig(c *gin.Context) {
+	var json struct {
+		BasePath    string   `json:"base_path"`
+		Name        string   `json:"name" binding:"required"`
+		SyncNodeIds []uint64 `json:"sync_node_ids" gorm:"serializer:json"`
+	}
+	if !cosy.BindAndValid(c, &json) {
+		return
+	}
+
+	// Decode paths from URL encoding
+	decodedBasePath := helper.UnescapeURL(json.BasePath)
+	decodedName := helper.UnescapeURL(json.Name)
+
+	fullPath := nginx.GetConfPath(decodedBasePath, decodedName)
+
+	// Check if path is under nginx config directory
+	if err := config.ValidateDeletePath(fullPath); err != nil {
+		cosy.ErrHandler(c, err)
+		return
+	}
+
+	// Check if trying to delete protected paths
+	if config.IsProtectedPath(fullPath, decodedName) {
+		cosy.ErrHandler(c, config.ErrCannotDeleteProtectedPath)
+		return
+	}
+
+	// Check if file/directory exists
+	stat, err := config.CheckFileExists(fullPath)
+	if err != nil {
+		cosy.ErrHandler(c, err)
+		return
+	}
+
+	// Delete the file or directory
+	err = os.RemoveAll(fullPath)
+	if err != nil {
+		cosy.ErrHandler(c, err)
+		return
+	}
+
+	// Clean up database records
+	if err := config.CleanupDatabaseRecords(fullPath, stat.IsDir()); err != nil {
+		cosy.ErrHandler(c, err)
+		return
+	}
+
+	// Sync deletion to remote servers if configured
+	if len(json.SyncNodeIds) > 0 {
+		err = config.SyncDeleteOnRemoteServer(fullPath, json.SyncNodeIds)
+		if err != nil {
+			cosy.ErrHandler(c, err)
+			return
+		}
+	}
+
+	c.JSON(http.StatusOK, gin.H{
+		"message": "deleted successfully",
+	})
+}

+ 1 - 0
api/config/router.go

@@ -17,6 +17,7 @@ func InitRouter(r *gin.RouterGroup) {
 	{
 		o.POST("config_mkdir", Mkdir)
 		o.POST("config_rename", Rename)
+		o.POST("config_delete", DeleteConfig)
 	}
 
 	r.GET("config_histories", GetConfigHistory)

+ 5 - 0
app/src/api/config.ts

@@ -34,6 +34,11 @@ const config = extendCurdApi(useCurdApi<Config>('/configs'), {
     new_name: newName,
     sync_node_ids: syncNodeIds,
   }),
+  delete: (basePath: string, name: string, syncNodeIds?: number[]) => http.post('/config_delete', {
+    base_path: basePath,
+    name,
+    sync_node_ids: syncNodeIds,
+  }),
   get_history: (filepath: string, params?: { page: number, page_size: number }) => {
     return http.get<GetListResponse<ConfigBackup>>('/config_histories', { params: { filepath, ...params } })
   },

+ 71 - 26
app/src/language/ar/app.po

@@ -161,7 +161,7 @@ msgstr "النسبة الفعلية للعامل إلى المُهيأ"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:166 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:102
+#: src/views/site/site_list/SiteList.vue:95 src/views/stream/StreamList.vue:103
 msgid "Add"
 msgstr "إضافة"
 
@@ -197,7 +197,7 @@ msgstr "إضافة خادم"
 msgid "Add Site"
 msgstr "أضف موقع"
 
-#: src/views/stream/StreamList.vue:139
+#: src/views/stream/StreamList.vue:140
 msgid "Add Stream"
 msgstr "أضف Stream"
 
@@ -296,8 +296,8 @@ msgstr "هل أنت متأكد أنك تريد مسح سجل المحادثة؟"
 msgid "Are you sure you want to delete permanently?"
 msgstr "هل أنت متأكد أنك تريد الحذف نهائيًا؟"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
-#: src/views/stream/StreamList.vue:122
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:113
+#: src/views/stream/StreamList.vue:123
 msgid "Are you sure you want to delete?"
 msgstr "هل أنت متأكد أنك تريد الحذف؟"
 
@@ -415,8 +415,7 @@ msgstr "إعادة التشغيل التلقائي"
 
 #: src/views/certificate/CertificateEditor.vue:256
 #: src/views/config/components/ConfigLeftPanel.vue:273
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
+#: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217
 #: src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:156
 #: src/views/stream/components/StreamEditor.vue:111
@@ -606,6 +605,7 @@ msgstr ""
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
@@ -1043,7 +1043,7 @@ msgstr "معلومات التكوين"
 msgid "Configuration Name"
 msgstr "اسم التكوين"
 
-#: src/views/config/ConfigList.vue:104
+#: src/views/config/ConfigList.vue:112
 msgid "Configurations"
 msgstr "التكوينات"
 
@@ -1127,11 +1127,11 @@ msgstr "إنشاء آخر"
 msgid "Create Backup"
 msgstr "إنشاء نسخة احتياطية"
 
-#: src/views/config/ConfigList.vue:122
+#: src/views/config/ConfigList.vue:130
 msgid "Create File"
 msgstr "إنشاء ملف"
 
-#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:129
+#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:137
 msgid "Create Folder"
 msgstr "إنشاء مجلد"
 
@@ -1239,7 +1239,7 @@ msgstr "يوميًا في الساعة %{time}"
 #: src/routes/modules/dashboard.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:109
 #: src/views/config/components/ConfigLeftPanel.vue:159
-#: src/views/config/ConfigList.vue:67
+#: src/views/config/ConfigList.vue:69
 msgid "Dashboard"
 msgstr "لوحة المعلومات"
 
@@ -1266,8 +1266,11 @@ msgstr "حدد اسم منطقة الذاكرة المشتركة والحجم،
 #: src/components/NgxConfigEditor/NgxServer.vue:110
 #: src/components/NgxConfigEditor/NgxUpstream.vue:134 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:109
-#: src/views/stream/StreamList.vue:131
+#: src/views/config/components/Delete.vue:65
+#: src/views/config/components/Delete.vue:97
+#: src/views/config/ConfigList.vue:199
+#: src/views/site/site_list/SiteList.vue:122
+#: src/views/stream/StreamList.vue:132
 msgid "Delete"
 msgstr "حذف"
 
@@ -1275,6 +1278,10 @@ msgstr "حذف"
 msgid "Delete Certificate"
 msgstr "حذف الشهادة"
 
+#: src/views/config/components/Delete.vue:96
+msgid "Delete Confirmation"
+msgstr "تأكيد الحذف"
+
 #: src/language/curd.ts:11
 msgid "Delete Permanently"
 msgstr "حذف نهائي"
@@ -1319,7 +1326,7 @@ msgstr "تم حذف الدفق %{name} من %{node} بنجاح"
 msgid "Delete stream: %{stream_name}"
 msgstr "حذف البث: ‎%{stream_name}"
 
-#: src/language/curd.ts:29
+#: src/language/curd.ts:29 src/views/config/components/Delete.vue:80
 msgid "Deleted successfully"
 msgstr "تم الحذف بنجاح"
 
@@ -1559,9 +1566,9 @@ msgstr ""
 "مواقع الويب غير HTTPS، إلا عند التشغيل على localhost."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:95
+#: src/views/site/site_list/SiteList.vue:108
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:117
+#: src/views/stream/StreamList.vue:118
 msgid "Duplicate"
 msgstr "مكرر"
 
@@ -2144,6 +2151,14 @@ msgstr "فشل في كتابة ملف مفتاح الأمان: {0}"
 msgid "Failed to write to zip buffer: {0}"
 msgstr "فشل الكتابة إلى مخزن zip المؤقت: {0}"
 
+#: src/views/config/components/Delete.vue:116
+msgid "file"
+msgstr "ملف"
+
+#: src/views/config/components/Delete.vue:122
+msgid "File"
+msgstr "ملف"
+
 #: src/language/constants.ts:32
 msgid "File exists"
 msgstr "الملف موجود"
@@ -2168,6 +2183,14 @@ msgstr "انتهى"
 msgid "First View"
 msgstr "المشاهدة الأولى"
 
+#: src/views/config/components/Delete.vue:116
+msgid "folder"
+msgstr "مجلد"
+
+#: src/views/config/components/Delete.vue:122
+msgid "Folder"
+msgstr "مجلد"
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:71
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
@@ -2754,7 +2777,7 @@ msgstr ""
 #: src/routes/modules/config.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:114
 #: src/views/config/components/ConfigLeftPanel.vue:164
-#: src/views/config/ConfigList.vue:72
+#: src/views/config/ConfigList.vue:74
 msgid "Manage Configs"
 msgstr "إدارة التكوينات"
 
@@ -2887,7 +2910,7 @@ msgid "Modified At"
 msgstr "تم التعديل في"
 
 #: src/components/ChatGPT/ChatMessage.vue:212
-#: src/views/config/ConfigList.vue:174
+#: src/views/config/ConfigList.vue:182
 msgid "Modify"
 msgstr "تعديل"
 
@@ -2931,6 +2954,7 @@ msgstr "توجيه متعدد الأسطر"
 #: src/views/certificate/CertificateList/certColumns.tsx:9
 #: src/views/certificate/DNSCredential.vue:9
 #: src/views/config/components/ConfigRightPanel/Basic.vue:34
+#: src/views/config/components/Delete.vue:123
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:5
 #: src/views/environments/group/columns.ts:7
@@ -2943,7 +2967,7 @@ msgstr "توجيه متعدد الأسطر"
 #: src/views/stream/columns.tsx:12
 #: src/views/stream/components/RightPanel/Basic.vue:30
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Name"
 msgstr "اسم"
 
@@ -3211,7 +3235,8 @@ msgstr "يتضمن Nginx.conf دليل streams-enabled"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:120
+#: src/views/site/site_list/SiteList.vue:111
+#: src/views/stream/StreamList.vue:121
 msgid "No"
 msgstr "لا"
 
@@ -3374,9 +3399,9 @@ msgstr "غير متصل"
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:99
+#: src/views/site/site_list/SiteList.vue:112
 #: src/views/stream/components/StreamStatusSelect.vue:60
-#: src/views/stream/StreamList.vue:121
+#: src/views/stream/StreamList.vue:122
 msgid "OK"
 msgstr "حسنًا"
 
@@ -3510,6 +3535,7 @@ msgstr "كلمات المرور غير متطابقة"
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
+#: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:44
 msgid "Path"
 msgstr "مسار"
@@ -3707,6 +3733,10 @@ msgstr "يرجى اختيار عقدة واحدة على الأقل للترقي
 msgid "Please type \"Revoke\" to confirm"
 msgstr "يرجى كتابة \"إلغاء\" للتأكيد"
 
+#: src/views/config/components/Delete.vue:70
+msgid "Please type the exact confirmation text"
+msgstr "الرجاء كتابة نص التأكيد بالضبط"
+
 #: src/components/PortScanner/PortScannerCompact.vue:31
 #: src/views/preference/tabs/ServerSettings.vue:22
 msgid "Port"
@@ -3764,6 +3794,10 @@ msgstr "حظر حذف المستخدم الافتراضي"
 msgid "Project Team"
 msgstr "فريق المشروع"
 
+#: src/views/config/components/Delete.vue:107
+msgid "Protected Directory"
+msgstr "دليل محمي"
+
 #: src/views/certificate/DNSCredential.vue:17
 msgid "Provider"
 msgstr "مزود"
@@ -3939,7 +3973,7 @@ msgstr "تمت الإزالة بنجاح"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:131
 #: src/views/config/components/ConfigName.vue:51
 #: src/views/config/components/Rename.vue:56
-#: src/views/config/ConfigList.vue:181
+#: src/views/config/ConfigList.vue:190
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 msgid "Rename"
@@ -4799,6 +4833,7 @@ msgstr "التبديل إلى الوضع الداكن"
 msgid "Switch to light theme"
 msgstr "التبديل إلى الوضع الفاتح"
 
+#: src/views/config/components/Delete.vue:141
 #: src/views/config/components/Rename.vue:81
 msgid "Sync"
 msgstr "مزامنة"
@@ -5042,6 +5077,10 @@ msgstr "هذا العنصر في الشهادة التلقائية غير صال
 msgid "This certificate is managed by Nginx UI"
 msgstr "يتم إدارة هذه الشهادة بواسطة Nginx UI"
 
+#: src/views/config/components/Delete.vue:108
+msgid "This directory is protected and cannot be deleted for system safety."
+msgstr "هذا الدليل محمي ولا يمكن حذفه لأمان النظام."
+
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateEditor.vue:176
 #: src/views/certificate/CertificateEditor.vue:191
@@ -5098,6 +5137,10 @@ msgstr ""
 msgid "This value is already taken"
 msgstr "هذه القيمة مستخدمة مسبقا"
 
+#: src/views/config/components/Delete.vue:116
+msgid "This will permanently delete the %{type}."
+msgstr "سيتم حذف %{type} نهائيًا."
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:227
 #: src/components/SystemRestore/SystemRestoreContent.vue:304
 msgid ""
@@ -5254,6 +5297,7 @@ msgstr "يتطلب المصادقة الثنائية"
 
 #: src/components/ProxyTargets/ProxyTargets.vue:48
 #: src/views/certificate/CertificateList/certColumns.tsx:24
+#: src/views/config/components/Delete.vue:122
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:12
 #: src/views/notification/notificationColumns.tsx:8
@@ -5261,6 +5305,10 @@ msgstr "يتطلب المصادقة الثنائية"
 msgid "Type"
 msgstr "نوع"
 
+#: src/views/config/components/Delete.vue:129
+msgid "Type %{delete} to confirm"
+msgstr "اكتب %{delete} للتأكيد"
+
 #: src/components/PortScanner/PortScannerCompact.vue:47
 #: src/composables/useNginxPerformance.ts:18
 msgid "Unknown"
@@ -5408,7 +5456,7 @@ msgstr "تحقق من متطلبات النظام"
 msgid "Version"
 msgstr "إصدار"
 
-#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:83
+#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:84
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:83
 msgid "View"
 msgstr "عرض"
@@ -5864,9 +5912,6 @@ msgstr "مفاتيح المرور الخاصة بك"
 #~ msgid "Can't scan? Use text key binding"
 #~ msgstr "لا يمكن المسح؟ استخدم ربط مفتاح النص"
 
-#~ msgid "File"
-#~ msgstr "ملف"
-
 #~ msgid "Incorrect username or password"
 #~ msgstr "اسم المستخدم أو كلمة المرور غير صحيحة"
 

+ 73 - 26
app/src/language/de_DE/app.po

@@ -161,7 +161,7 @@ msgstr "Tatsächliches Verhältnis von Arbeitern zu konfigurierten"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:166 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:102
+#: src/views/site/site_list/SiteList.vue:95 src/views/stream/StreamList.vue:103
 msgid "Add"
 msgstr "Hinzufügen"
 
@@ -197,7 +197,7 @@ msgstr "Server hinzufügen"
 msgid "Add Site"
 msgstr "Seite hinzufügen"
 
-#: src/views/stream/StreamList.vue:139
+#: src/views/stream/StreamList.vue:140
 msgid "Add Stream"
 msgstr "Stream hinzufügen"
 
@@ -298,8 +298,8 @@ msgstr "Sind Sie sicher, dass Sie den Chatverlauf löschen möchten?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "Sind Sie sicher, dass Sie dauerhaft löschen möchten?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
-#: src/views/stream/StreamList.vue:122
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:113
+#: src/views/stream/StreamList.vue:123
 msgid "Are you sure you want to delete?"
 msgstr "Sind Sie sicher, dass Sie löschen möchten?"
 
@@ -421,8 +421,7 @@ msgstr "Automatischer Neustart"
 
 #: src/views/certificate/CertificateEditor.vue:256
 #: src/views/config/components/ConfigLeftPanel.vue:273
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
+#: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217
 #: src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:156
 #: src/views/stream/components/StreamEditor.vue:111
@@ -622,6 +621,7 @@ msgstr ""
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
@@ -1057,7 +1057,7 @@ msgstr "Konfigurationsinformationen"
 msgid "Configuration Name"
 msgstr "Konf"
 
-#: src/views/config/ConfigList.vue:104
+#: src/views/config/ConfigList.vue:112
 msgid "Configurations"
 msgstr "Konfigurationen"
 
@@ -1143,11 +1143,11 @@ msgstr "Weiteres erstellen"
 msgid "Create Backup"
 msgstr "Backup erstellen"
 
-#: src/views/config/ConfigList.vue:122
+#: src/views/config/ConfigList.vue:130
 msgid "Create File"
 msgstr "Datei erstellen"
 
-#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:129
+#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:137
 msgid "Create Folder"
 msgstr "Ordner erstellen"
 
@@ -1256,7 +1256,7 @@ msgstr "Täglich um %{time}"
 #: src/routes/modules/dashboard.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:109
 #: src/views/config/components/ConfigLeftPanel.vue:159
-#: src/views/config/ConfigList.vue:67
+#: src/views/config/ConfigList.vue:69
 msgid "Dashboard"
 msgstr "Übersicht"
 
@@ -1285,8 +1285,11 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:110
 #: src/components/NgxConfigEditor/NgxUpstream.vue:134 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:109
-#: src/views/stream/StreamList.vue:131
+#: src/views/config/components/Delete.vue:65
+#: src/views/config/components/Delete.vue:97
+#: src/views/config/ConfigList.vue:199
+#: src/views/site/site_list/SiteList.vue:122
+#: src/views/stream/StreamList.vue:132
 msgid "Delete"
 msgstr "Löschen"
 
@@ -1294,6 +1297,10 @@ msgstr "Löschen"
 msgid "Delete Certificate"
 msgstr "Zertifikat löschen"
 
+#: src/views/config/components/Delete.vue:96
+msgid "Delete Confirmation"
+msgstr "Löschbestätigung"
+
 #: src/language/curd.ts:11
 msgid "Delete Permanently"
 msgstr "Permanent löschen"
@@ -1338,7 +1345,7 @@ msgstr "Stream %{name} wurde erfolgreich von %{node} gelöscht"
 msgid "Delete stream: %{stream_name}"
 msgstr "Stream löschen: %{stream_name}"
 
-#: src/language/curd.ts:29
+#: src/language/curd.ts:29 src/views/config/components/Delete.vue:80
 msgid "Deleted successfully"
 msgstr "Erfolgreich gelöscht"
 
@@ -1583,9 +1590,9 @@ msgstr ""
 "ausgeführt werden."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:95
+#: src/views/site/site_list/SiteList.vue:108
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:117
+#: src/views/stream/StreamList.vue:118
 msgid "Duplicate"
 msgstr "Duplizieren"
 
@@ -2168,6 +2175,14 @@ msgstr "Fehler beim Schreiben der Sicherheitsschlüsseldatei: {0}"
 msgid "Failed to write to zip buffer: {0}"
 msgstr "Fehler beim Schreiben in den Zip-Puffer: {0}"
 
+#: src/views/config/components/Delete.vue:116
+msgid "file"
+msgstr "Datei"
+
+#: src/views/config/components/Delete.vue:122
+msgid "File"
+msgstr "Datei"
+
 #: src/language/constants.ts:32
 msgid "File exists"
 msgstr "Datei existiert"
@@ -2192,6 +2207,14 @@ msgstr "Erledigt"
 msgid "First View"
 msgstr "Erste Ansicht"
 
+#: src/views/config/components/Delete.vue:116
+msgid "folder"
+msgstr "Ordner"
+
+#: src/views/config/components/Delete.vue:122
+msgid "Folder"
+msgstr "Ordner"
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:71
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
@@ -2786,7 +2809,7 @@ msgstr ""
 #: src/routes/modules/config.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:114
 #: src/views/config/components/ConfigLeftPanel.vue:164
-#: src/views/config/ConfigList.vue:72
+#: src/views/config/ConfigList.vue:74
 msgid "Manage Configs"
 msgstr "Verwalte Konfigurationen"
 
@@ -2919,7 +2942,7 @@ msgid "Modified At"
 msgstr "Geändert am"
 
 #: src/components/ChatGPT/ChatMessage.vue:212
-#: src/views/config/ConfigList.vue:174
+#: src/views/config/ConfigList.vue:182
 msgid "Modify"
 msgstr "Ändern"
 
@@ -2963,6 +2986,7 @@ msgstr "Mehrzeilige Direktive"
 #: src/views/certificate/CertificateList/certColumns.tsx:9
 #: src/views/certificate/DNSCredential.vue:9
 #: src/views/config/components/ConfigRightPanel/Basic.vue:34
+#: src/views/config/components/Delete.vue:123
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:5
 #: src/views/environments/group/columns.ts:7
@@ -2975,7 +2999,7 @@ msgstr "Mehrzeilige Direktive"
 #: src/views/stream/columns.tsx:12
 #: src/views/stream/components/RightPanel/Basic.vue:30
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Name"
 msgstr "Name"
 
@@ -3245,7 +3269,8 @@ msgstr "Nginx.conf enthält das streams-enabled-Verzeichnis"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:120
+#: src/views/site/site_list/SiteList.vue:111
+#: src/views/stream/StreamList.vue:121
 msgid "No"
 msgstr "Nein"
 
@@ -3411,9 +3436,9 @@ msgstr "Offline"
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:99
+#: src/views/site/site_list/SiteList.vue:112
 #: src/views/stream/components/StreamStatusSelect.vue:60
-#: src/views/stream/StreamList.vue:121
+#: src/views/stream/StreamList.vue:122
 msgid "OK"
 msgstr "OK"
 
@@ -3547,6 +3572,7 @@ msgstr "Passwörter stimmen nicht überein"
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
+#: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:44
 msgid "Path"
 msgstr "Pfad"
@@ -3759,6 +3785,10 @@ msgstr "Bitte wähle mindestens einen Knoten zum Upgrade aus"
 msgid "Please type \"Revoke\" to confirm"
 msgstr "Bitte geben Sie \"Widerrufen\" ein, um zu bestätigen"
 
+#: src/views/config/components/Delete.vue:70
+msgid "Please type the exact confirmation text"
+msgstr "Bitte geben Sie den genauen Bestätigungstext ein"
+
 #: src/components/PortScanner/PortScannerCompact.vue:31
 #: src/views/preference/tabs/ServerSettings.vue:22
 msgid "Port"
@@ -3816,6 +3846,10 @@ msgstr "Verhindere das Löschen des Standardbenutzers"
 msgid "Project Team"
 msgstr "Projektteam"
 
+#: src/views/config/components/Delete.vue:107
+msgid "Protected Directory"
+msgstr "Geschützter Ordner"
+
 #: src/views/certificate/DNSCredential.vue:17
 msgid "Provider"
 msgstr "Anbieter"
@@ -3996,7 +4030,7 @@ msgstr "Erfolgreich entfernt"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:131
 #: src/views/config/components/ConfigName.vue:51
 #: src/views/config/components/Rename.vue:56
-#: src/views/config/ConfigList.vue:181
+#: src/views/config/ConfigList.vue:190
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 msgid "Rename"
@@ -4870,6 +4904,7 @@ msgstr "Zum dunklen Thema wechseln"
 msgid "Switch to light theme"
 msgstr "Zum hellen Thema wechseln"
 
+#: src/views/config/components/Delete.vue:141
 #: src/views/config/components/Rename.vue:81
 msgid "Sync"
 msgstr "Synchronisieren"
@@ -5117,6 +5152,12 @@ msgstr "Dieses Auto-Zertifikatselement ist ungültig, bitte entferne es."
 msgid "This certificate is managed by Nginx UI"
 msgstr "Dieses Zertifikat wird von Nginx UI verwaltet"
 
+#: src/views/config/components/Delete.vue:108
+msgid "This directory is protected and cannot be deleted for system safety."
+msgstr ""
+"Dieses Verzeichnis ist geschützt und kann aus Sicherheitsgründen nicht "
+"gelöscht werden."
+
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateEditor.vue:176
 #: src/views/certificate/CertificateEditor.vue:191
@@ -5174,6 +5215,10 @@ msgstr ""
 msgid "This value is already taken"
 msgstr "Dieser Wert ist bereits vergeben"
 
+#: src/views/config/components/Delete.vue:116
+msgid "This will permanently delete the %{type}."
+msgstr "Dadurch wird %{type} dauerhaft gelöscht."
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:227
 #: src/components/SystemRestore/SystemRestoreContent.vue:304
 msgid ""
@@ -5335,6 +5380,7 @@ msgstr "Zwei-Faktor-Authentifizierung erforderlich"
 
 #: src/components/ProxyTargets/ProxyTargets.vue:48
 #: src/views/certificate/CertificateList/certColumns.tsx:24
+#: src/views/config/components/Delete.vue:122
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:12
 #: src/views/notification/notificationColumns.tsx:8
@@ -5342,6 +5388,10 @@ msgstr "Zwei-Faktor-Authentifizierung erforderlich"
 msgid "Type"
 msgstr "Typ"
 
+#: src/views/config/components/Delete.vue:129
+msgid "Type %{delete} to confirm"
+msgstr "Geben Sie %{delete} zur Bestätigung ein"
+
 #: src/components/PortScanner/PortScannerCompact.vue:47
 #: src/composables/useNginxPerformance.ts:18
 msgid "Unknown"
@@ -5489,7 +5539,7 @@ msgstr "Überprüfen Sie die Systemanforderungen"
 msgid "Version"
 msgstr "Version"
 
-#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:83
+#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:84
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:83
 msgid "View"
 msgstr "Anzeigen"
@@ -5956,9 +6006,6 @@ msgstr "Deine Passkeys"
 #~ msgid "Can't scan? Use text key binding"
 #~ msgstr "Scannt nicht möglich? Verwenden Sie die Texttastenbindung"
 
-#~ msgid "File"
-#~ msgstr "Datei"
-
 #~ msgid ""
 #~ "If you lose your mobile phone, you can use the recovery code to reset your "
 #~ "2FA."

+ 71 - 22
app/src/language/en/app.po

@@ -145,7 +145,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxUpstream.vue:166 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:102
+#: src/views/site/site_list/SiteList.vue:95 src/views/stream/StreamList.vue:103
 msgid "Add"
 msgstr ""
 
@@ -181,7 +181,7 @@ msgstr ""
 msgid "Add Site"
 msgstr ""
 
-#: src/views/stream/StreamList.vue:139
+#: src/views/stream/StreamList.vue:140
 msgid "Add Stream"
 msgstr ""
 
@@ -278,8 +278,8 @@ msgstr ""
 msgid "Are you sure you want to delete permanently?"
 msgstr ""
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
-#: src/views/stream/StreamList.vue:122
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:113
+#: src/views/stream/StreamList.vue:123
 msgid "Are you sure you want to delete?"
 msgstr ""
 
@@ -397,7 +397,7 @@ msgstr ""
 
 #: src/views/certificate/CertificateEditor.vue:256
 #: src/views/config/components/ConfigLeftPanel.vue:273
-#: src/views/config/ConfigList.vue:112 src/views/config/ConfigList.vue:195
+#: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217
 #: src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:156
 #: src/views/stream/components/StreamEditor.vue:111
@@ -584,6 +584,7 @@ msgstr ""
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
@@ -982,7 +983,7 @@ msgstr ""
 msgid "Configuration Name"
 msgstr ""
 
-#: src/views/config/ConfigList.vue:104
+#: src/views/config/ConfigList.vue:112
 msgid "Configurations"
 msgstr ""
 
@@ -1066,11 +1067,11 @@ msgstr ""
 msgid "Create Backup"
 msgstr ""
 
-#: src/views/config/ConfigList.vue:122
+#: src/views/config/ConfigList.vue:130
 msgid "Create File"
 msgstr ""
 
-#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:129
+#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:137
 msgid "Create Folder"
 msgstr ""
 
@@ -1176,7 +1177,7 @@ msgstr ""
 #: src/routes/modules/dashboard.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:109
 #: src/views/config/components/ConfigLeftPanel.vue:159
-#: src/views/config/ConfigList.vue:67
+#: src/views/config/ConfigList.vue:69
 msgid "Dashboard"
 msgstr ""
 
@@ -1203,8 +1204,11 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:110
 #: src/components/NgxConfigEditor/NgxUpstream.vue:134 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:109
-#: src/views/stream/StreamList.vue:131
+#: src/views/config/components/Delete.vue:65
+#: src/views/config/components/Delete.vue:97
+#: src/views/config/ConfigList.vue:199
+#: src/views/site/site_list/SiteList.vue:122
+#: src/views/stream/StreamList.vue:132
 msgid "Delete"
 msgstr ""
 
@@ -1212,6 +1216,10 @@ msgstr ""
 msgid "Delete Certificate"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:96
+msgid "Delete Confirmation"
+msgstr ""
+
 #: src/language/curd.ts:11
 msgid "Delete Permanently"
 msgstr ""
@@ -1256,7 +1264,7 @@ msgstr ""
 msgid "Delete stream: %{stream_name}"
 msgstr ""
 
-#: src/language/curd.ts:29
+#: src/language/curd.ts:29 src/views/config/components/Delete.vue:80
 msgid "Deleted successfully"
 msgstr ""
 
@@ -1495,9 +1503,9 @@ msgid ""
 msgstr ""
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:95
+#: src/views/site/site_list/SiteList.vue:108
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:117
+#: src/views/stream/StreamList.vue:118
 msgid "Duplicate"
 msgstr ""
 
@@ -2080,6 +2088,14 @@ msgstr ""
 msgid "Failed to write to zip buffer: {0}"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:116
+msgid "file"
+msgstr ""
+
+#: src/views/config/components/Delete.vue:122
+msgid "File"
+msgstr ""
+
 #: src/language/constants.ts:32
 msgid "File exists"
 msgstr ""
@@ -2104,6 +2120,14 @@ msgstr ""
 msgid "First View"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:116
+msgid "folder"
+msgstr ""
+
+#: src/views/config/components/Delete.vue:122
+msgid "Folder"
+msgstr ""
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:71
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
@@ -2669,7 +2693,7 @@ msgstr ""
 #: src/routes/modules/config.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:114
 #: src/views/config/components/ConfigLeftPanel.vue:164
-#: src/views/config/ConfigList.vue:72
+#: src/views/config/ConfigList.vue:74
 msgid "Manage Configs"
 msgstr ""
 
@@ -2802,7 +2826,7 @@ msgid "Modified At"
 msgstr ""
 
 #: src/components/ChatGPT/ChatMessage.vue:212
-#: src/views/config/ConfigList.vue:174
+#: src/views/config/ConfigList.vue:182
 msgid "Modify"
 msgstr ""
 
@@ -2846,6 +2870,7 @@ msgstr ""
 #: src/views/certificate/CertificateList/certColumns.tsx:9
 #: src/views/certificate/DNSCredential.vue:9
 #: src/views/config/components/ConfigRightPanel/Basic.vue:34
+#: src/views/config/components/Delete.vue:123
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:5
 #: src/views/environments/group/columns.ts:7
@@ -2858,7 +2883,7 @@ msgstr ""
 #: src/views/stream/columns.tsx:12
 #: src/views/stream/components/RightPanel/Basic.vue:30
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Name"
 msgstr ""
 
@@ -3126,7 +3151,8 @@ msgstr ""
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:120
+#: src/views/site/site_list/SiteList.vue:111
+#: src/views/stream/StreamList.vue:121
 msgid "No"
 msgstr ""
 
@@ -3285,9 +3311,9 @@ msgstr ""
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:99
+#: src/views/site/site_list/SiteList.vue:112
 #: src/views/stream/components/StreamStatusSelect.vue:60
-#: src/views/stream/StreamList.vue:121
+#: src/views/stream/StreamList.vue:122
 msgid "OK"
 msgstr ""
 
@@ -3418,6 +3444,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
+#: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:44
 msgid "Path"
 msgstr ""
@@ -3612,6 +3639,10 @@ msgstr ""
 msgid "Please type \"Revoke\" to confirm"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:70
+msgid "Please type the exact confirmation text"
+msgstr ""
+
 #: src/components/PortScanner/PortScannerCompact.vue:31
 #: src/views/preference/tabs/ServerSettings.vue:22
 msgid "Port"
@@ -3669,6 +3700,10 @@ msgstr ""
 msgid "Project Team"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:107
+msgid "Protected Directory"
+msgstr ""
+
 #: src/views/certificate/DNSCredential.vue:17
 msgid "Provider"
 msgstr ""
@@ -3842,7 +3877,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxUpstream.vue:131
 #: src/views/config/components/ConfigName.vue:51
 #: src/views/config/components/Rename.vue:56
-#: src/views/config/ConfigList.vue:181
+#: src/views/config/ConfigList.vue:190
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 msgid "Rename"
@@ -4684,6 +4719,7 @@ msgstr ""
 msgid "Switch to light theme"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:141
 #: src/views/config/components/Rename.vue:81
 msgid "Sync"
 msgstr ""
@@ -4906,6 +4942,10 @@ msgstr ""
 msgid "This certificate is managed by Nginx UI"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:108
+msgid "This directory is protected and cannot be deleted for system safety."
+msgstr ""
+
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateEditor.vue:176
 #: src/views/certificate/CertificateEditor.vue:191
@@ -4957,6 +4997,10 @@ msgstr ""
 msgid "This value is already taken"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:116
+msgid "This will permanently delete the %{type}."
+msgstr ""
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:227
 #: src/components/SystemRestore/SystemRestoreContent.vue:304
 msgid ""
@@ -5096,6 +5140,7 @@ msgstr ""
 
 #: src/components/ProxyTargets/ProxyTargets.vue:48
 #: src/views/certificate/CertificateList/certColumns.tsx:24
+#: src/views/config/components/Delete.vue:122
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:12
 #: src/views/notification/notificationColumns.tsx:8
@@ -5103,6 +5148,10 @@ msgstr ""
 msgid "Type"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:129
+msgid "Type %{delete} to confirm"
+msgstr ""
+
 #: src/components/PortScanner/PortScannerCompact.vue:47
 #: src/composables/useNginxPerformance.ts:18
 msgid "Unknown"
@@ -5250,7 +5299,7 @@ msgstr ""
 msgid "Version"
 msgstr ""
 
-#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:83
+#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:84
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:83
 msgid "View"
 msgstr ""

+ 73 - 26
app/src/language/es/app.po

@@ -168,7 +168,7 @@ msgstr "Proporción real de trabajadores a configurados"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:166 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:102
+#: src/views/site/site_list/SiteList.vue:95 src/views/stream/StreamList.vue:103
 msgid "Add"
 msgstr "Agregar"
 
@@ -204,7 +204,7 @@ msgstr "Agregar servidor"
 msgid "Add Site"
 msgstr "Agregar Sitio"
 
-#: src/views/stream/StreamList.vue:139
+#: src/views/stream/StreamList.vue:140
 msgid "Add Stream"
 msgstr "Agregar Stream"
 
@@ -305,8 +305,8 @@ msgstr "¿Está seguro de que desea borrar el registro del chat?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "¿Estás seguro de que quieres eliminar permanentemente?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
-#: src/views/stream/StreamList.vue:122
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:113
+#: src/views/stream/StreamList.vue:123
 msgid "Are you sure you want to delete?"
 msgstr "¿Está seguro de que quiere borrar?"
 
@@ -428,8 +428,7 @@ msgstr "Reinicio automático"
 
 #: src/views/certificate/CertificateEditor.vue:256
 #: src/views/config/components/ConfigLeftPanel.vue:273
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
+#: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217
 #: src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:156
 #: src/views/stream/components/StreamEditor.vue:111
@@ -631,6 +630,7 @@ msgstr ""
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
@@ -1066,7 +1066,7 @@ msgstr "Información de configuración"
 msgid "Configuration Name"
 msgstr "Nombre de la configuración"
 
-#: src/views/config/ConfigList.vue:104
+#: src/views/config/ConfigList.vue:112
 msgid "Configurations"
 msgstr "Configuraciones"
 
@@ -1152,11 +1152,11 @@ msgstr "Crear otro"
 msgid "Create Backup"
 msgstr "Crear copia de seguridad"
 
-#: src/views/config/ConfigList.vue:122
+#: src/views/config/ConfigList.vue:130
 msgid "Create File"
 msgstr "Crear Archivo"
 
-#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:129
+#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:137
 msgid "Create Folder"
 msgstr "Crear carpeta"
 
@@ -1267,7 +1267,7 @@ msgstr "Diariamente a las %{time}"
 #: src/routes/modules/dashboard.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:109
 #: src/views/config/components/ConfigLeftPanel.vue:159
-#: src/views/config/ConfigList.vue:67
+#: src/views/config/ConfigList.vue:69
 msgid "Dashboard"
 msgstr "Panel"
 
@@ -1296,8 +1296,11 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:110
 #: src/components/NgxConfigEditor/NgxUpstream.vue:134 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:109
-#: src/views/stream/StreamList.vue:131
+#: src/views/config/components/Delete.vue:65
+#: src/views/config/components/Delete.vue:97
+#: src/views/config/ConfigList.vue:199
+#: src/views/site/site_list/SiteList.vue:122
+#: src/views/stream/StreamList.vue:132
 msgid "Delete"
 msgstr "Eliminar"
 
@@ -1305,6 +1308,10 @@ msgstr "Eliminar"
 msgid "Delete Certificate"
 msgstr "Eliminar certificado"
 
+#: src/views/config/components/Delete.vue:96
+msgid "Delete Confirmation"
+msgstr "Confirmación de eliminación"
+
 #: src/language/curd.ts:11
 msgid "Delete Permanently"
 msgstr "Eliminar Permanentemente"
@@ -1349,7 +1356,7 @@ msgstr "Se eliminó el flujo %{name} de %{node} correctamente"
 msgid "Delete stream: %{stream_name}"
 msgstr "Eliminar stream: %{site_name}"
 
-#: src/language/curd.ts:29
+#: src/language/curd.ts:29 src/views/config/components/Delete.vue:80
 msgid "Deleted successfully"
 msgstr "Borrado exitoso"
 
@@ -1592,9 +1599,9 @@ msgstr ""
 "se ejecutan en el host local."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:95
+#: src/views/site/site_list/SiteList.vue:108
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:117
+#: src/views/stream/StreamList.vue:118
 msgid "Duplicate"
 msgstr "Duplicar"
 
@@ -2179,6 +2186,14 @@ msgstr "Error al escribir el archivo de clave de seguridad: {0}"
 msgid "Failed to write to zip buffer: {0}"
 msgstr "Error al escribir en el búfer ZIP: {0}"
 
+#: src/views/config/components/Delete.vue:116
+msgid "file"
+msgstr "archivo"
+
+#: src/views/config/components/Delete.vue:122
+msgid "File"
+msgstr "Archivo"
+
 #: src/language/constants.ts:32
 msgid "File exists"
 msgstr "El archivo existe"
@@ -2203,6 +2218,14 @@ msgstr "Terminado"
 msgid "First View"
 msgstr "Primera vista"
 
+#: src/views/config/components/Delete.vue:116
+msgid "folder"
+msgstr "carpeta"
+
+#: src/views/config/components/Delete.vue:122
+msgid "Folder"
+msgstr "Carpeta"
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:71
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
@@ -2794,7 +2817,7 @@ msgstr ""
 #: src/routes/modules/config.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:114
 #: src/views/config/components/ConfigLeftPanel.vue:164
-#: src/views/config/ConfigList.vue:72
+#: src/views/config/ConfigList.vue:74
 msgid "Manage Configs"
 msgstr "Administrar configuraciones"
 
@@ -2927,7 +2950,7 @@ msgid "Modified At"
 msgstr "Modificado el"
 
 #: src/components/ChatGPT/ChatMessage.vue:212
-#: src/views/config/ConfigList.vue:174
+#: src/views/config/ConfigList.vue:182
 msgid "Modify"
 msgstr "Modificar"
 
@@ -2971,6 +2994,7 @@ msgstr "Directiva multilínea"
 #: src/views/certificate/CertificateList/certColumns.tsx:9
 #: src/views/certificate/DNSCredential.vue:9
 #: src/views/config/components/ConfigRightPanel/Basic.vue:34
+#: src/views/config/components/Delete.vue:123
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:5
 #: src/views/environments/group/columns.ts:7
@@ -2983,7 +3007,7 @@ msgstr "Directiva multilínea"
 #: src/views/stream/columns.tsx:12
 #: src/views/stream/components/RightPanel/Basic.vue:30
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Name"
 msgstr "Nombre"
 
@@ -3253,7 +3277,8 @@ msgstr "Nginx.conf incluye el directorio streams-enabled"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:120
+#: src/views/site/site_list/SiteList.vue:111
+#: src/views/stream/StreamList.vue:121
 msgid "No"
 msgstr "No"
 
@@ -3419,9 +3444,9 @@ msgstr "Desconectado"
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:99
+#: src/views/site/site_list/SiteList.vue:112
 #: src/views/stream/components/StreamStatusSelect.vue:60
-#: src/views/stream/StreamList.vue:121
+#: src/views/stream/StreamList.vue:122
 msgid "OK"
 msgstr "OK"
 
@@ -3556,6 +3581,7 @@ msgstr "Las contraseñas no coinciden"
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
+#: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:44
 msgid "Path"
 msgstr "Ruta"
@@ -3770,6 +3796,10 @@ msgstr "Seleccione al menos un nodo para actualizar"
 msgid "Please type \"Revoke\" to confirm"
 msgstr "Por favor, escriba \"Revocar\" para confirmar"
 
+#: src/views/config/components/Delete.vue:70
+msgid "Please type the exact confirmation text"
+msgstr "Por favor, escriba el texto de confirmación exacto"
+
 #: src/components/PortScanner/PortScannerCompact.vue:31
 #: src/views/preference/tabs/ServerSettings.vue:22
 msgid "Port"
@@ -3827,6 +3857,10 @@ msgstr "Prohibir la eliminación del usuario predeterminado"
 msgid "Project Team"
 msgstr "Grupo del proyecto"
 
+#: src/views/config/components/Delete.vue:107
+msgid "Protected Directory"
+msgstr "Directorio protegido"
+
 #: src/views/certificate/DNSCredential.vue:17
 msgid "Provider"
 msgstr "Proveedor"
@@ -4005,7 +4039,7 @@ msgstr "Eliminado con éxito"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:131
 #: src/views/config/components/ConfigName.vue:51
 #: src/views/config/components/Rename.vue:56
-#: src/views/config/ConfigList.vue:181
+#: src/views/config/ConfigList.vue:190
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 msgid "Rename"
@@ -4879,6 +4913,7 @@ msgstr "Cambiar al tema oscuro"
 msgid "Switch to light theme"
 msgstr "Cambiar al tema claro"
 
+#: src/views/config/components/Delete.vue:141
 #: src/views/config/components/Rename.vue:81
 msgid "Sync"
 msgstr "Sincronizar"
@@ -5124,6 +5159,12 @@ msgstr "Este elemento de Auto Cert es inválido, elimínelo por favor."
 msgid "This certificate is managed by Nginx UI"
 msgstr "Este certificado es administrado por Nginx UI"
 
+#: src/views/config/components/Delete.vue:108
+msgid "This directory is protected and cannot be deleted for system safety."
+msgstr ""
+"Este directorio está protegido y no se puede eliminar por seguridad del "
+"sistema."
+
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateEditor.vue:176
 #: src/views/certificate/CertificateEditor.vue:191
@@ -5181,6 +5222,10 @@ msgstr ""
 msgid "This value is already taken"
 msgstr "Este valor ya está elegido"
 
+#: src/views/config/components/Delete.vue:116
+msgid "This will permanently delete the %{type}."
+msgstr "Esto eliminará permanentemente %{type}."
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:227
 #: src/components/SystemRestore/SystemRestoreContent.vue:304
 msgid ""
@@ -5343,6 +5388,7 @@ msgstr "Se requiere autenticación de dos factores"
 
 #: src/components/ProxyTargets/ProxyTargets.vue:48
 #: src/views/certificate/CertificateList/certColumns.tsx:24
+#: src/views/config/components/Delete.vue:122
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:12
 #: src/views/notification/notificationColumns.tsx:8
@@ -5350,6 +5396,10 @@ msgstr "Se requiere autenticación de dos factores"
 msgid "Type"
 msgstr "Tipo"
 
+#: src/views/config/components/Delete.vue:129
+msgid "Type %{delete} to confirm"
+msgstr "Escriba %{delete} para confirmar"
+
 #: src/components/PortScanner/PortScannerCompact.vue:47
 #: src/composables/useNginxPerformance.ts:18
 msgid "Unknown"
@@ -5497,7 +5547,7 @@ msgstr "Verificar los requisitos del sistema"
 msgid "Version"
 msgstr "Versión"
 
-#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:83
+#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:84
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:83
 msgid "View"
 msgstr "Ver"
@@ -5947,9 +5997,6 @@ msgstr "Sus llaves de acceso"
 #~ msgid "Can't scan? Use text key binding"
 #~ msgstr "¿No puede escanear? Utilice la vinculación con una llave de texto"
 
-#~ msgid "File"
-#~ msgstr "Archivo"
-
 #~ msgid ""
 #~ "If you lose your mobile phone, you can use the recovery code to reset your "
 #~ "2FA."

+ 73 - 26
app/src/language/fr_FR/app.po

@@ -166,7 +166,7 @@ msgstr "Ratio réel des travailleurs par rapport à la configuration"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:166 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:102
+#: src/views/site/site_list/SiteList.vue:95 src/views/stream/StreamList.vue:103
 msgid "Add"
 msgstr "Ajouter"
 
@@ -202,7 +202,7 @@ msgstr "Ajouter un serveur"
 msgid "Add Site"
 msgstr "Ajouter un site"
 
-#: src/views/stream/StreamList.vue:139
+#: src/views/stream/StreamList.vue:140
 msgid "Add Stream"
 msgstr "Ajouter un flux"
 
@@ -303,8 +303,8 @@ msgstr "Voulez-vous vraiment effacer l'historique du chat ?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "Êtes-vous sûr de vouloir supprimer définitivement ?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
-#: src/views/stream/StreamList.vue:122
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:113
+#: src/views/stream/StreamList.vue:123
 msgid "Are you sure you want to delete?"
 msgstr "Etes-vous sûr que vous voulez supprimer ?"
 
@@ -426,8 +426,7 @@ msgstr "Redémarrage automatique"
 
 #: src/views/certificate/CertificateEditor.vue:256
 #: src/views/config/components/ConfigLeftPanel.vue:273
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
+#: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217
 #: src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:156
 #: src/views/stream/components/StreamEditor.vue:111
@@ -626,6 +625,7 @@ msgstr ""
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
@@ -1062,7 +1062,7 @@ msgstr "Informations de configuration"
 msgid "Configuration Name"
 msgstr "Nom de la configuration"
 
-#: src/views/config/ConfigList.vue:104
+#: src/views/config/ConfigList.vue:112
 msgid "Configurations"
 msgstr "Configurations"
 
@@ -1148,11 +1148,11 @@ msgstr "Créer un autre"
 msgid "Create Backup"
 msgstr "Créer une sauvegarde"
 
-#: src/views/config/ConfigList.vue:122
+#: src/views/config/ConfigList.vue:130
 msgid "Create File"
 msgstr "Créer un fichier"
 
-#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:129
+#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:137
 msgid "Create Folder"
 msgstr "Créer un dossier"
 
@@ -1263,7 +1263,7 @@ msgstr "Quotidiennement à %{time}"
 #: src/routes/modules/dashboard.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:109
 #: src/views/config/components/ConfigLeftPanel.vue:159
-#: src/views/config/ConfigList.vue:67
+#: src/views/config/ConfigList.vue:69
 msgid "Dashboard"
 msgstr "Dashboard"
 
@@ -1292,8 +1292,11 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:110
 #: src/components/NgxConfigEditor/NgxUpstream.vue:134 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:109
-#: src/views/stream/StreamList.vue:131
+#: src/views/config/components/Delete.vue:65
+#: src/views/config/components/Delete.vue:97
+#: src/views/config/ConfigList.vue:199
+#: src/views/site/site_list/SiteList.vue:122
+#: src/views/stream/StreamList.vue:132
 msgid "Delete"
 msgstr "Supprimer"
 
@@ -1301,6 +1304,10 @@ msgstr "Supprimer"
 msgid "Delete Certificate"
 msgstr "Supprimer le certificat"
 
+#: src/views/config/components/Delete.vue:96
+msgid "Delete Confirmation"
+msgstr "Confirmation de suppression"
+
 #: src/language/curd.ts:11
 msgid "Delete Permanently"
 msgstr "Supprimer définitivement"
@@ -1345,7 +1352,7 @@ msgstr "Le flux %{name} a été supprimé de %{node} avec succès"
 msgid "Delete stream: %{stream_name}"
 msgstr "Supprimer le flux : %{stream_name}"
 
-#: src/language/curd.ts:29
+#: src/language/curd.ts:29 src/views/config/components/Delete.vue:80
 msgid "Deleted successfully"
 msgstr "Supprimé avec succès"
 
@@ -1586,9 +1593,9 @@ msgstr ""
 "exécuté sur localhost."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:95
+#: src/views/site/site_list/SiteList.vue:108
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:117
+#: src/views/stream/StreamList.vue:118
 msgid "Duplicate"
 msgstr "Dupliquer"
 
@@ -2173,6 +2180,14 @@ msgstr "Échec de l'écriture du fichier de clé de sécurité : {0}"
 msgid "Failed to write to zip buffer: {0}"
 msgstr "Échec de l'écriture dans le tampon ZIP : {0}"
 
+#: src/views/config/components/Delete.vue:116
+msgid "file"
+msgstr "fichier"
+
+#: src/views/config/components/Delete.vue:122
+msgid "File"
+msgstr "Fichier"
+
 #: src/language/constants.ts:32
 msgid "File exists"
 msgstr "Le fichier existe"
@@ -2197,6 +2212,14 @@ msgstr "Finie"
 msgid "First View"
 msgstr "Première vue"
 
+#: src/views/config/components/Delete.vue:116
+msgid "folder"
+msgstr "dossier"
+
+#: src/views/config/components/Delete.vue:122
+msgid "Folder"
+msgstr "Dossier"
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:71
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
@@ -2792,7 +2815,7 @@ msgstr ""
 #: src/routes/modules/config.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:114
 #: src/views/config/components/ConfigLeftPanel.vue:164
-#: src/views/config/ConfigList.vue:72
+#: src/views/config/ConfigList.vue:74
 msgid "Manage Configs"
 msgstr "Gérer les configurations"
 
@@ -2925,7 +2948,7 @@ msgid "Modified At"
 msgstr "Modifié le"
 
 #: src/components/ChatGPT/ChatMessage.vue:212
-#: src/views/config/ConfigList.vue:174
+#: src/views/config/ConfigList.vue:182
 msgid "Modify"
 msgstr "Modifier"
 
@@ -2969,6 +2992,7 @@ msgstr "Directive multiligne"
 #: src/views/certificate/CertificateList/certColumns.tsx:9
 #: src/views/certificate/DNSCredential.vue:9
 #: src/views/config/components/ConfigRightPanel/Basic.vue:34
+#: src/views/config/components/Delete.vue:123
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:5
 #: src/views/environments/group/columns.ts:7
@@ -2981,7 +3005,7 @@ msgstr "Directive multiligne"
 #: src/views/stream/columns.tsx:12
 #: src/views/stream/components/RightPanel/Basic.vue:30
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Name"
 msgstr "Nom"
 
@@ -3251,7 +3275,8 @@ msgstr "Nginx.conf inclut le répertoire streams-enabled"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:120
+#: src/views/site/site_list/SiteList.vue:111
+#: src/views/stream/StreamList.vue:121
 msgid "No"
 msgstr "Non"
 
@@ -3416,9 +3441,9 @@ msgstr "Hors ligne"
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:99
+#: src/views/site/site_list/SiteList.vue:112
 #: src/views/stream/components/StreamStatusSelect.vue:60
-#: src/views/stream/StreamList.vue:121
+#: src/views/stream/StreamList.vue:122
 msgid "OK"
 msgstr "OK"
 
@@ -3553,6 +3578,7 @@ msgstr "Les mots de passe ne correspondent pas"
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
+#: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:44
 msgid "Path"
 msgstr "Chemin"
@@ -3767,6 +3793,10 @@ msgstr "Veuillez sélectionner au moins un nœud à mettre à niveau"
 msgid "Please type \"Revoke\" to confirm"
 msgstr "Veuillez taper \"Révoquer\" pour confirmer"
 
+#: src/views/config/components/Delete.vue:70
+msgid "Please type the exact confirmation text"
+msgstr "Veuillez saisir le texte de confirmation exact"
+
 #: src/components/PortScanner/PortScannerCompact.vue:31
 #: src/views/preference/tabs/ServerSettings.vue:22
 msgid "Port"
@@ -3824,6 +3854,10 @@ msgstr "Interdire la suppression de l'utilisateur par défaut"
 msgid "Project Team"
 msgstr "Groupe de projet"
 
+#: src/views/config/components/Delete.vue:107
+msgid "Protected Directory"
+msgstr "Répertoire protégé"
+
 #: src/views/certificate/DNSCredential.vue:17
 msgid "Provider"
 msgstr "Fournisseur"
@@ -4004,7 +4038,7 @@ msgstr "Supprimé avec succès"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:131
 #: src/views/config/components/ConfigName.vue:51
 #: src/views/config/components/Rename.vue:56
-#: src/views/config/ConfigList.vue:181
+#: src/views/config/ConfigList.vue:190
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 msgid "Rename"
@@ -4878,6 +4912,7 @@ msgstr "Passer au thème sombre"
 msgid "Switch to light theme"
 msgstr "Passer au thème clair"
 
+#: src/views/config/components/Delete.vue:141
 #: src/views/config/components/Rename.vue:81
 msgid "Sync"
 msgstr "Synchroniser"
@@ -5126,6 +5161,12 @@ msgstr "Cet élément de certificat automatique est invalide, veuillez le suppri
 msgid "This certificate is managed by Nginx UI"
 msgstr "Ce certificat est géré par Nginx UI"
 
+#: src/views/config/components/Delete.vue:108
+msgid "This directory is protected and cannot be deleted for system safety."
+msgstr ""
+"Ce répertoire est protégé et ne peut pas être supprimé pour la sécurité du "
+"système."
+
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateEditor.vue:176
 #: src/views/certificate/CertificateEditor.vue:191
@@ -5188,6 +5229,10 @@ msgstr ""
 msgid "This value is already taken"
 msgstr "Cette valeur est déjà utilisée"
 
+#: src/views/config/components/Delete.vue:116
+msgid "This will permanently delete the %{type}."
+msgstr "Cela supprimera définitivement %{type}."
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:227
 #: src/components/SystemRestore/SystemRestoreContent.vue:304
 msgid ""
@@ -5351,6 +5396,7 @@ msgstr "Authentification à deux facteurs requise"
 
 #: src/components/ProxyTargets/ProxyTargets.vue:48
 #: src/views/certificate/CertificateList/certColumns.tsx:24
+#: src/views/config/components/Delete.vue:122
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:12
 #: src/views/notification/notificationColumns.tsx:8
@@ -5358,6 +5404,10 @@ msgstr "Authentification à deux facteurs requise"
 msgid "Type"
 msgstr "Type"
 
+#: src/views/config/components/Delete.vue:129
+msgid "Type %{delete} to confirm"
+msgstr "Tapez %{delete} pour confirmer"
+
 #: src/components/PortScanner/PortScannerCompact.vue:47
 #: src/composables/useNginxPerformance.ts:18
 msgid "Unknown"
@@ -5505,7 +5555,7 @@ msgstr "Vérifiez les exigences du système"
 msgid "Version"
 msgstr "Version"
 
-#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:83
+#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:84
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:83
 msgid "View"
 msgstr "Voir"
@@ -5946,9 +5996,6 @@ msgstr "Vos clés d'accès"
 #~ msgid "Sync config %{config_name} to %{env_name} failed, response: %{resp}"
 #~ msgstr "Dupliqué avec succès"
 
-#~ msgid "File"
-#~ msgstr "Fichier"
-
 #, fuzzy
 #~ msgid "Incorrect username or password"
 #~ msgstr "Le pseudo ou mot de passe est incorect"

+ 71 - 23
app/src/language/ja_JP/app.po

@@ -162,7 +162,7 @@ msgstr "実際のワーカー数と設定値の比率"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:166 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:102
+#: src/views/site/site_list/SiteList.vue:95 src/views/stream/StreamList.vue:103
 msgid "Add"
 msgstr "追加"
 
@@ -198,7 +198,7 @@ msgstr "サーバーを追加"
 msgid "Add Site"
 msgstr "サイトを追加"
 
-#: src/views/stream/StreamList.vue:139
+#: src/views/stream/StreamList.vue:140
 msgid "Add Stream"
 msgstr "Streamを追加"
 
@@ -295,8 +295,8 @@ msgstr "チャットの記録をクリアしてもよろしいですか?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "完全に削除してもよろしいですか?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
-#: src/views/stream/StreamList.vue:122
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:113
+#: src/views/stream/StreamList.vue:123
 msgid "Are you sure you want to delete?"
 msgstr "削除してもよろしいですか?"
 
@@ -414,8 +414,7 @@ msgstr "自動再起動"
 
 #: src/views/certificate/CertificateEditor.vue:256
 #: src/views/config/components/ConfigLeftPanel.vue:273
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
+#: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217
 #: src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:156
 #: src/views/stream/components/StreamEditor.vue:111
@@ -603,6 +602,7 @@ msgstr ""
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
@@ -1020,7 +1020,7 @@ msgstr "設定情報"
 msgid "Configuration Name"
 msgstr "設定名"
 
-#: src/views/config/ConfigList.vue:104
+#: src/views/config/ConfigList.vue:112
 msgid "Configurations"
 msgstr "設定"
 
@@ -1104,11 +1104,11 @@ msgstr "別の設定を作成"
 msgid "Create Backup"
 msgstr "バックアップを作成"
 
-#: src/views/config/ConfigList.vue:122
+#: src/views/config/ConfigList.vue:130
 msgid "Create File"
 msgstr "ファイルを作成"
 
-#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:129
+#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:137
 msgid "Create Folder"
 msgstr "フォルダーを作成"
 
@@ -1214,7 +1214,7 @@ msgstr "毎日 %{time}"
 #: src/routes/modules/dashboard.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:109
 #: src/views/config/components/ConfigLeftPanel.vue:159
-#: src/views/config/ConfigList.vue:67
+#: src/views/config/ConfigList.vue:69
 msgid "Dashboard"
 msgstr "ダッシュボード"
 
@@ -1241,8 +1241,11 @@ msgstr "共有メモリゾーンの名前とサイズを定義します(例: p
 #: src/components/NgxConfigEditor/NgxServer.vue:110
 #: src/components/NgxConfigEditor/NgxUpstream.vue:134 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:109
-#: src/views/stream/StreamList.vue:131
+#: src/views/config/components/Delete.vue:65
+#: src/views/config/components/Delete.vue:97
+#: src/views/config/ConfigList.vue:199
+#: src/views/site/site_list/SiteList.vue:122
+#: src/views/stream/StreamList.vue:132
 msgid "Delete"
 msgstr "削除"
 
@@ -1250,6 +1253,10 @@ msgstr "削除"
 msgid "Delete Certificate"
 msgstr "証明書を削除"
 
+#: src/views/config/components/Delete.vue:96
+msgid "Delete Confirmation"
+msgstr "削除の確認"
+
 #: src/language/curd.ts:11
 msgid "Delete Permanently"
 msgstr "完全に削除"
@@ -1294,7 +1301,7 @@ msgstr "ストリーム %{name} を %{node} から削除しました"
 msgid "Delete stream: %{stream_name}"
 msgstr "ストリームを削除: %{stream_name}"
 
-#: src/language/curd.ts:29
+#: src/language/curd.ts:29 src/views/config/components/Delete.vue:80
 msgid "Deleted successfully"
 msgstr "削除しました"
 
@@ -1532,9 +1539,9 @@ msgid ""
 msgstr "一部のブラウザのセキュリティポリシーのため、localhostで実行している場合を除き、非HTTPSウェブサイトではパスキーを使用できません。"
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:95
+#: src/views/site/site_list/SiteList.vue:108
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:117
+#: src/views/stream/StreamList.vue:118
 msgid "Duplicate"
 msgstr "複製"
 
@@ -2117,6 +2124,14 @@ msgstr "セキュリティキーファイルの書き込みに失敗しました
 msgid "Failed to write to zip buffer: {0}"
 msgstr "ZIPバッファへの書き込みに失敗しました: {0}"
 
+#: src/views/config/components/Delete.vue:116
+msgid "file"
+msgstr "ファイル"
+
+#: src/views/config/components/Delete.vue:122
+msgid "File"
+msgstr "ファイル"
+
 #: src/language/constants.ts:32
 msgid "File exists"
 msgstr "ファイルが存在します"
@@ -2141,6 +2156,14 @@ msgstr "完了"
 msgid "First View"
 msgstr "初回表示"
 
+#: src/views/config/components/Delete.vue:116
+msgid "folder"
+msgstr "フォルダ"
+
+#: src/views/config/components/Delete.vue:122
+msgid "Folder"
+msgstr "フォルダ"
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:71
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
@@ -2714,7 +2737,7 @@ msgstr ""
 #: src/routes/modules/config.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:114
 #: src/views/config/components/ConfigLeftPanel.vue:164
-#: src/views/config/ConfigList.vue:72
+#: src/views/config/ConfigList.vue:74
 msgid "Manage Configs"
 msgstr "設定管理"
 
@@ -2847,7 +2870,7 @@ msgid "Modified At"
 msgstr "更新日時"
 
 #: src/components/ChatGPT/ChatMessage.vue:212
-#: src/views/config/ConfigList.vue:174
+#: src/views/config/ConfigList.vue:182
 msgid "Modify"
 msgstr "変更"
 
@@ -2891,6 +2914,7 @@ msgstr "複数行ディレクティブ"
 #: src/views/certificate/CertificateList/certColumns.tsx:9
 #: src/views/certificate/DNSCredential.vue:9
 #: src/views/config/components/ConfigRightPanel/Basic.vue:34
+#: src/views/config/components/Delete.vue:123
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:5
 #: src/views/environments/group/columns.ts:7
@@ -2903,7 +2927,7 @@ msgstr "複数行ディレクティブ"
 #: src/views/stream/columns.tsx:12
 #: src/views/stream/components/RightPanel/Basic.vue:30
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Name"
 msgstr "名前"
 
@@ -3171,7 +3195,8 @@ msgstr "Nginx.conf には streams-enabled ディレクトリが含まれてい
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:120
+#: src/views/site/site_list/SiteList.vue:111
+#: src/views/stream/StreamList.vue:121
 msgid "No"
 msgstr "いいえ"
 
@@ -3330,9 +3355,9 @@ msgstr "オフライン"
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:99
+#: src/views/site/site_list/SiteList.vue:112
 #: src/views/stream/components/StreamStatusSelect.vue:60
-#: src/views/stream/StreamList.vue:121
+#: src/views/stream/StreamList.vue:122
 msgid "OK"
 msgstr "OK"
 
@@ -3465,6 +3490,7 @@ msgstr "パスワードが一致しません"
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
+#: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:44
 msgid "Path"
 msgstr "パス"
@@ -3660,6 +3686,10 @@ msgstr "少なくとも1つのノードを選択してアップグレードし
 msgid "Please type \"Revoke\" to confirm"
 msgstr "確認のために「取り消す」と入力してください"
 
+#: src/views/config/components/Delete.vue:70
+msgid "Please type the exact confirmation text"
+msgstr "正確な確認テキストを入力してください"
+
 #: src/components/PortScanner/PortScannerCompact.vue:31
 #: src/views/preference/tabs/ServerSettings.vue:22
 msgid "Port"
@@ -3717,6 +3747,10 @@ msgstr "デフォルトユーザーの削除を禁止します"
 msgid "Project Team"
 msgstr "プロジェクトチーム"
 
+#: src/views/config/components/Delete.vue:107
+msgid "Protected Directory"
+msgstr "保護されたディレクトリ"
+
 #: src/views/certificate/DNSCredential.vue:17
 msgid "Provider"
 msgstr "プロバイダー"
@@ -3890,7 +3924,7 @@ msgstr "正常に削除されました"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:131
 #: src/views/config/components/ConfigName.vue:51
 #: src/views/config/components/Rename.vue:56
-#: src/views/config/ConfigList.vue:181
+#: src/views/config/ConfigList.vue:190
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 msgid "Rename"
@@ -4742,6 +4776,7 @@ msgstr "ダークテーマに切り替え"
 msgid "Switch to light theme"
 msgstr "ライトテーマに切り替え"
 
+#: src/views/config/components/Delete.vue:141
 #: src/views/config/components/Rename.vue:81
 msgid "Sync"
 msgstr "同期"
@@ -4968,6 +5003,10 @@ msgstr "この自動証明書項目は無効です。削除してください。
 msgid "This certificate is managed by Nginx UI"
 msgstr "この証明書はNginx UIによって管理されています"
 
+#: src/views/config/components/Delete.vue:108
+msgid "This directory is protected and cannot be deleted for system safety."
+msgstr "このディレクトリは保護されており、システムの安全のために削除できません。"
+
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateEditor.vue:176
 #: src/views/certificate/CertificateEditor.vue:191
@@ -5018,6 +5057,10 @@ msgstr "このトークンは一度しか表示されず、後で取得するこ
 msgid "This value is already taken"
 msgstr "この値は既に使用されています"
 
+#: src/views/config/components/Delete.vue:116
+msgid "This will permanently delete the %{type}."
+msgstr "これにより %{type} が完全に削除されます。"
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:227
 #: src/components/SystemRestore/SystemRestoreContent.vue:304
 msgid ""
@@ -5164,6 +5207,7 @@ msgstr "二要素認証が必要です"
 
 #: src/components/ProxyTargets/ProxyTargets.vue:48
 #: src/views/certificate/CertificateList/certColumns.tsx:24
+#: src/views/config/components/Delete.vue:122
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:12
 #: src/views/notification/notificationColumns.tsx:8
@@ -5171,6 +5215,10 @@ msgstr "二要素認証が必要です"
 msgid "Type"
 msgstr "タイプ"
 
+#: src/views/config/components/Delete.vue:129
+msgid "Type %{delete} to confirm"
+msgstr "確認のために %{delete} と入力してください"
+
 #: src/components/PortScanner/PortScannerCompact.vue:47
 #: src/composables/useNginxPerformance.ts:18
 msgid "Unknown"
@@ -5318,7 +5366,7 @@ msgstr "システム要件を確認する"
 msgid "Version"
 msgstr "バージョン"
 
-#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:83
+#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:84
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:83
 msgid "View"
 msgstr "ビュー"

+ 71 - 26
app/src/language/ko_KR/app.po

@@ -160,7 +160,7 @@ msgstr "실제 작업자 대 구성 비율"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:166 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:102
+#: src/views/site/site_list/SiteList.vue:95 src/views/stream/StreamList.vue:103
 msgid "Add"
 msgstr "추가"
 
@@ -196,7 +196,7 @@ msgstr "서버 추가"
 msgid "Add Site"
 msgstr "사이트 추가"
 
-#: src/views/stream/StreamList.vue:139
+#: src/views/stream/StreamList.vue:140
 msgid "Add Stream"
 msgstr "스트림 추가"
 
@@ -293,8 +293,8 @@ msgstr "채팅 기록을 지우시겠습니까?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "정말 영구적으로 삭제하시겠습니까?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
-#: src/views/stream/StreamList.vue:122
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:113
+#: src/views/stream/StreamList.vue:123
 msgid "Are you sure you want to delete?"
 msgstr "정말 삭제하시겠습니까?"
 
@@ -412,8 +412,7 @@ msgstr "자동 재시작"
 
 #: src/views/certificate/CertificateEditor.vue:256
 #: src/views/config/components/ConfigLeftPanel.vue:273
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
+#: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217
 #: src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:156
 #: src/views/stream/components/StreamEditor.vue:111
@@ -601,6 +600,7 @@ msgstr ""
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
@@ -1017,7 +1017,7 @@ msgstr "구성 정보"
 msgid "Configuration Name"
 msgstr "구성 이름"
 
-#: src/views/config/ConfigList.vue:104
+#: src/views/config/ConfigList.vue:112
 msgid "Configurations"
 msgstr "구성들"
 
@@ -1101,11 +1101,11 @@ msgstr "다른 것 생성하기"
 msgid "Create Backup"
 msgstr "백업 생성"
 
-#: src/views/config/ConfigList.vue:122
+#: src/views/config/ConfigList.vue:130
 msgid "Create File"
 msgstr "파일 생성"
 
-#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:129
+#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:137
 msgid "Create Folder"
 msgstr "폴더 생성"
 
@@ -1211,7 +1211,7 @@ msgstr "매일 %{time}"
 #: src/routes/modules/dashboard.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:109
 #: src/views/config/components/ConfigLeftPanel.vue:159
-#: src/views/config/ConfigList.vue:67
+#: src/views/config/ConfigList.vue:69
 msgid "Dashboard"
 msgstr "대시보드"
 
@@ -1238,8 +1238,11 @@ msgstr "공유 메모리 영역 이름과 크기를 정의합니다(예: proxy_c
 #: src/components/NgxConfigEditor/NgxServer.vue:110
 #: src/components/NgxConfigEditor/NgxUpstream.vue:134 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:109
-#: src/views/stream/StreamList.vue:131
+#: src/views/config/components/Delete.vue:65
+#: src/views/config/components/Delete.vue:97
+#: src/views/config/ConfigList.vue:199
+#: src/views/site/site_list/SiteList.vue:122
+#: src/views/stream/StreamList.vue:132
 msgid "Delete"
 msgstr "삭제"
 
@@ -1247,6 +1250,10 @@ msgstr "삭제"
 msgid "Delete Certificate"
 msgstr "인증서 삭제"
 
+#: src/views/config/components/Delete.vue:96
+msgid "Delete Confirmation"
+msgstr "삭제 확인"
+
 #: src/language/curd.ts:11
 msgid "Delete Permanently"
 msgstr "영구 삭제"
@@ -1291,7 +1298,7 @@ msgstr "스트림 %{name}을(를) %{node}에서 성공적으로 삭제했습니
 msgid "Delete stream: %{stream_name}"
 msgstr "스트림 삭제: %{stream_name}"
 
-#: src/language/curd.ts:29
+#: src/language/curd.ts:29 src/views/config/components/Delete.vue:80
 msgid "Deleted successfully"
 msgstr "성공적으로 삭제됨"
 
@@ -1531,9 +1538,9 @@ msgstr ""
 "없습니다."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:95
+#: src/views/site/site_list/SiteList.vue:108
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:117
+#: src/views/stream/StreamList.vue:118
 msgid "Duplicate"
 msgstr "복제"
 
@@ -2116,6 +2123,14 @@ msgstr "보안 키 파일 쓰기 실패: {0}"
 msgid "Failed to write to zip buffer: {0}"
 msgstr "ZIP 버퍼에 쓰기 실패: {0}"
 
+#: src/views/config/components/Delete.vue:116
+msgid "file"
+msgstr "파일"
+
+#: src/views/config/components/Delete.vue:122
+msgid "File"
+msgstr "파일"
+
 #: src/language/constants.ts:32
 msgid "File exists"
 msgstr "파일이 존재함"
@@ -2140,6 +2155,14 @@ msgstr "완료됨"
 msgid "First View"
 msgstr "첫 번째 보기"
 
+#: src/views/config/components/Delete.vue:116
+msgid "folder"
+msgstr "폴더"
+
+#: src/views/config/components/Delete.vue:122
+msgid "Folder"
+msgstr "폴더"
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:71
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
@@ -2710,7 +2733,7 @@ msgstr "인증서를 받기 전에 .well-known 디렉터리에 대한 역방향
 #: src/routes/modules/config.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:114
 #: src/views/config/components/ConfigLeftPanel.vue:164
-#: src/views/config/ConfigList.vue:72
+#: src/views/config/ConfigList.vue:74
 msgid "Manage Configs"
 msgstr "구성 관리"
 
@@ -2843,7 +2866,7 @@ msgid "Modified At"
 msgstr "수정일시"
 
 #: src/components/ChatGPT/ChatMessage.vue:212
-#: src/views/config/ConfigList.vue:174
+#: src/views/config/ConfigList.vue:182
 msgid "Modify"
 msgstr "수정"
 
@@ -2887,6 +2910,7 @@ msgstr "여러 줄 지시문"
 #: src/views/certificate/CertificateList/certColumns.tsx:9
 #: src/views/certificate/DNSCredential.vue:9
 #: src/views/config/components/ConfigRightPanel/Basic.vue:34
+#: src/views/config/components/Delete.vue:123
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:5
 #: src/views/environments/group/columns.ts:7
@@ -2899,7 +2923,7 @@ msgstr "여러 줄 지시문"
 #: src/views/stream/columns.tsx:12
 #: src/views/stream/components/RightPanel/Basic.vue:30
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Name"
 msgstr "이름"
 
@@ -3167,7 +3191,8 @@ msgstr "Nginx.conf에는 streams-enabled 디렉토리가 포함됩니다"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:120
+#: src/views/site/site_list/SiteList.vue:111
+#: src/views/stream/StreamList.vue:121
 msgid "No"
 msgstr "아니요"
 
@@ -3326,9 +3351,9 @@ msgstr "오프라인"
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:99
+#: src/views/site/site_list/SiteList.vue:112
 #: src/views/stream/components/StreamStatusSelect.vue:60
-#: src/views/stream/StreamList.vue:121
+#: src/views/stream/StreamList.vue:122
 msgid "OK"
 msgstr "확인"
 
@@ -3461,6 +3486,7 @@ msgstr "비밀번호가 일치하지 않습니다"
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
+#: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:44
 msgid "Path"
 msgstr "경로"
@@ -3654,6 +3680,10 @@ msgstr "업그레이드할 노드를 최소한 하나 이상 선택해 주세요
 msgid "Please type \"Revoke\" to confirm"
 msgstr "확인하려면 \"Revoke\"를 입력하세요"
 
+#: src/views/config/components/Delete.vue:70
+msgid "Please type the exact confirmation text"
+msgstr "정확한 확인 텍스트를 입력하세요"
+
 #: src/components/PortScanner/PortScannerCompact.vue:31
 #: src/views/preference/tabs/ServerSettings.vue:22
 msgid "Port"
@@ -3711,6 +3741,10 @@ msgstr "기본 사용자 삭제 금지"
 msgid "Project Team"
 msgstr "프로젝트 팀"
 
+#: src/views/config/components/Delete.vue:107
+msgid "Protected Directory"
+msgstr "보호된 디렉터리"
+
 #: src/views/certificate/DNSCredential.vue:17
 msgid "Provider"
 msgstr "제공자"
@@ -3884,7 +3918,7 @@ msgstr "성공적으로 제거됨"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:131
 #: src/views/config/components/ConfigName.vue:51
 #: src/views/config/components/Rename.vue:56
-#: src/views/config/ConfigList.vue:181
+#: src/views/config/ConfigList.vue:190
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 msgid "Rename"
@@ -4738,6 +4772,7 @@ msgstr "다크 테마로 변경"
 msgid "Switch to light theme"
 msgstr "라이트 테마로 변경"
 
+#: src/views/config/components/Delete.vue:141
 #: src/views/config/components/Rename.vue:81
 msgid "Sync"
 msgstr "동기화"
@@ -4964,6 +4999,10 @@ msgstr "이 자동 인증 항목이 유효하지 않습니다. 제거해주세
 msgid "This certificate is managed by Nginx UI"
 msgstr "이 인증서는 Nginx UI에서 관리됩니다"
 
+#: src/views/config/components/Delete.vue:108
+msgid "This directory is protected and cannot be deleted for system safety."
+msgstr "이 디렉터리는 보호되어 있으며 시스템 안전을 위해 삭제할 수 없습니다."
+
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateEditor.vue:176
 #: src/views/certificate/CertificateEditor.vue:191
@@ -5014,6 +5053,10 @@ msgstr "이 토큰은 한 번만 표시되며 나중에 다시 가져올 수 없
 msgid "This value is already taken"
 msgstr "이 값은 이미 사용 중입니다"
 
+#: src/views/config/components/Delete.vue:116
+msgid "This will permanently delete the %{type}."
+msgstr "이 작업으로 %{type}이(가) 영구적으로 삭제됩니다."
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:227
 #: src/components/SystemRestore/SystemRestoreContent.vue:304
 msgid ""
@@ -5158,6 +5201,7 @@ msgstr "2단계 인증이 필요합니다"
 
 #: src/components/ProxyTargets/ProxyTargets.vue:48
 #: src/views/certificate/CertificateList/certColumns.tsx:24
+#: src/views/config/components/Delete.vue:122
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:12
 #: src/views/notification/notificationColumns.tsx:8
@@ -5165,6 +5209,10 @@ msgstr "2단계 인증이 필요합니다"
 msgid "Type"
 msgstr "유형"
 
+#: src/views/config/components/Delete.vue:129
+msgid "Type %{delete} to confirm"
+msgstr "확인하려면 %{delete}를 입력하세요"
+
 #: src/components/PortScanner/PortScannerCompact.vue:47
 #: src/composables/useNginxPerformance.ts:18
 msgid "Unknown"
@@ -5312,7 +5360,7 @@ msgstr "시스템 요구 사항을 확인하십시오"
 msgid "Version"
 msgstr "버전"
 
-#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:83
+#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:84
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:83
 msgid "View"
 msgstr "보기"
@@ -5717,9 +5765,6 @@ msgstr "귀하의 패스키"
 #~ msgid "Sync config %{config_name} to %{env_name} failed, response: %{resp}"
 #~ msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 
-#~ msgid "File"
-#~ msgstr "파일"
-
 #, fuzzy
 #~ msgid "Incorrect username or password"
 #~ msgstr "사용자 이름 또는 비밀번호가 올바르지 않습니다"

+ 73 - 23
app/src/language/messages.pot

@@ -151,7 +151,8 @@ msgstr ""
 #: src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:102
+#: src/views/site/site_list/SiteList.vue:95
+#: src/views/stream/StreamList.vue:103
 msgid "Add"
 msgstr ""
 
@@ -188,7 +189,7 @@ msgstr ""
 msgid "Add Site"
 msgstr ""
 
-#: src/views/stream/StreamList.vue:139
+#: src/views/stream/StreamList.vue:140
 msgid "Add Stream"
 msgstr ""
 
@@ -284,8 +285,8 @@ msgid "Are you sure you want to delete permanently?"
 msgstr ""
 
 #: src/language/curd.ts:25
-#: src/views/site/site_list/SiteList.vue:100
-#: src/views/stream/StreamList.vue:122
+#: src/views/site/site_list/SiteList.vue:113
+#: src/views/stream/StreamList.vue:123
 msgid "Are you sure you want to delete?"
 msgstr ""
 
@@ -403,8 +404,8 @@ msgstr ""
 
 #: src/views/certificate/CertificateEditor.vue:256
 #: src/views/config/components/ConfigLeftPanel.vue:273
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
+#: src/views/config/ConfigList.vue:120
+#: src/views/config/ConfigList.vue:217
 #: src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:156
 #: src/views/stream/components/StreamEditor.vue:111
@@ -589,6 +590,7 @@ msgstr ""
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
@@ -958,7 +960,7 @@ msgstr ""
 msgid "Configuration Name"
 msgstr ""
 
-#: src/views/config/ConfigList.vue:104
+#: src/views/config/ConfigList.vue:112
 msgid "Configurations"
 msgstr ""
 
@@ -1042,12 +1044,12 @@ msgstr ""
 msgid "Create Backup"
 msgstr ""
 
-#: src/views/config/ConfigList.vue:122
+#: src/views/config/ConfigList.vue:130
 msgid "Create File"
 msgstr ""
 
 #: src/views/config/components/Mkdir.vue:47
-#: src/views/config/ConfigList.vue:129
+#: src/views/config/ConfigList.vue:137
 msgid "Create Folder"
 msgstr ""
 
@@ -1149,7 +1151,7 @@ msgstr ""
 #: src/routes/modules/dashboard.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:109
 #: src/views/config/components/ConfigLeftPanel.vue:159
-#: src/views/config/ConfigList.vue:67
+#: src/views/config/ConfigList.vue:69
 msgid "Dashboard"
 msgstr ""
 
@@ -1177,8 +1179,11 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxUpstream.vue:134
 #: src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:109
-#: src/views/stream/StreamList.vue:131
+#: src/views/config/components/Delete.vue:65
+#: src/views/config/components/Delete.vue:97
+#: src/views/config/ConfigList.vue:199
+#: src/views/site/site_list/SiteList.vue:122
+#: src/views/stream/StreamList.vue:132
 msgid "Delete"
 msgstr ""
 
@@ -1186,6 +1191,10 @@ msgstr ""
 msgid "Delete Certificate"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:96
+msgid "Delete Confirmation"
+msgstr ""
+
 #: src/language/curd.ts:11
 msgid "Delete Permanently"
 msgstr ""
@@ -1233,6 +1242,7 @@ msgid "Delete stream: %{stream_name}"
 msgstr ""
 
 #: src/language/curd.ts:29
+#: src/views/config/components/Delete.vue:80
 msgid "Deleted successfully"
 msgstr ""
 
@@ -1473,9 +1483,9 @@ msgid "Due to the security policies of some browsers, you cannot use passkeys on
 msgstr ""
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:95
+#: src/views/site/site_list/SiteList.vue:108
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:117
+#: src/views/stream/StreamList.vue:118
 msgid "Duplicate"
 msgstr ""
 
@@ -2060,6 +2070,14 @@ msgstr ""
 msgid "Failed to write to zip buffer: {0}"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:116
+msgid "file"
+msgstr ""
+
+#: src/views/config/components/Delete.vue:122
+msgid "File"
+msgstr ""
+
 #: src/language/constants.ts:32
 msgid "File exists"
 msgstr ""
@@ -2085,6 +2103,14 @@ msgstr ""
 msgid "First View"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:116
+msgid "folder"
+msgstr ""
+
+#: src/views/config/components/Delete.vue:122
+msgid "Folder"
+msgstr ""
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:71
 msgid "Follow the instructions in the dialog to complete the passkey registration process."
 msgstr ""
@@ -2629,7 +2655,7 @@ msgstr ""
 #: src/routes/modules/config.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:114
 #: src/views/config/components/ConfigLeftPanel.vue:164
-#: src/views/config/ConfigList.vue:72
+#: src/views/config/ConfigList.vue:74
 msgid "Manage Configs"
 msgstr ""
 
@@ -2765,7 +2791,7 @@ msgid "Modified At"
 msgstr ""
 
 #: src/components/ChatGPT/ChatMessage.vue:212
-#: src/views/config/ConfigList.vue:174
+#: src/views/config/ConfigList.vue:182
 msgid "Modify"
 msgstr ""
 
@@ -2809,6 +2835,7 @@ msgstr ""
 #: src/views/certificate/CertificateList/certColumns.tsx:9
 #: src/views/certificate/DNSCredential.vue:9
 #: src/views/config/components/ConfigRightPanel/Basic.vue:34
+#: src/views/config/components/Delete.vue:123
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:5
 #: src/views/environments/group/columns.ts:7
@@ -2821,7 +2848,7 @@ msgstr ""
 #: src/views/stream/columns.tsx:12
 #: src/views/stream/components/RightPanel/Basic.vue:30
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Name"
 msgstr ""
 
@@ -3092,8 +3119,8 @@ msgstr ""
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:98
-#: src/views/stream/StreamList.vue:120
+#: src/views/site/site_list/SiteList.vue:111
+#: src/views/stream/StreamList.vue:121
 msgid "No"
 msgstr ""
 
@@ -3250,9 +3277,9 @@ msgstr ""
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:99
+#: src/views/site/site_list/SiteList.vue:112
 #: src/views/stream/components/StreamStatusSelect.vue:60
-#: src/views/stream/StreamList.vue:121
+#: src/views/stream/StreamList.vue:122
 msgid "OK"
 msgstr ""
 
@@ -3382,6 +3409,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
+#: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:44
 msgid "Path"
 msgstr ""
@@ -3564,6 +3592,10 @@ msgstr ""
 msgid "Please type \"Revoke\" to confirm"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:70
+msgid "Please type the exact confirmation text"
+msgstr ""
+
 #: src/components/PortScanner/PortScannerCompact.vue:31
 #: src/views/preference/tabs/ServerSettings.vue:22
 msgid "Port"
@@ -3623,6 +3655,10 @@ msgstr ""
 msgid "Project Team"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:107
+msgid "Protected Directory"
+msgstr ""
+
 #: src/views/certificate/DNSCredential.vue:17
 msgid "Provider"
 msgstr ""
@@ -3794,7 +3830,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxUpstream.vue:131
 #: src/views/config/components/ConfigName.vue:51
 #: src/views/config/components/Rename.vue:56
-#: src/views/config/ConfigList.vue:181
+#: src/views/config/ConfigList.vue:190
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 msgid "Rename"
@@ -4629,6 +4665,7 @@ msgstr ""
 msgid "Switch to light theme"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:141
 #: src/views/config/components/Rename.vue:81
 msgid "Sync"
 msgstr ""
@@ -4835,6 +4872,10 @@ msgstr ""
 msgid "This certificate is managed by Nginx UI"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:108
+msgid "This directory is protected and cannot be deleted for system safety."
+msgstr ""
+
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateEditor.vue:176
 #: src/views/certificate/CertificateEditor.vue:191
@@ -4881,6 +4922,10 @@ msgstr ""
 msgid "This value is already taken"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:116
+msgid "This will permanently delete the %{type}."
+msgstr ""
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:227
 #: src/components/SystemRestore/SystemRestoreContent.vue:304
 msgid "This will restore all Nginx configuration files. Nginx will restart after the restoration is complete."
@@ -4999,6 +5044,7 @@ msgstr ""
 
 #: src/components/ProxyTargets/ProxyTargets.vue:48
 #: src/views/certificate/CertificateList/certColumns.tsx:24
+#: src/views/config/components/Delete.vue:122
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:12
 #: src/views/notification/notificationColumns.tsx:8
@@ -5006,6 +5052,10 @@ msgstr ""
 msgid "Type"
 msgstr ""
 
+#: src/views/config/components/Delete.vue:129
+msgid "Type %{delete} to confirm"
+msgstr ""
+
 #: src/components/PortScanner/PortScannerCompact.vue:47
 #: src/composables/useNginxPerformance.ts:18
 msgid "Unknown"
@@ -5158,7 +5208,7 @@ msgid "Version"
 msgstr ""
 
 #: src/language/curd.ts:7
-#: src/views/nginx_log/NginxLogList.vue:83
+#: src/views/nginx_log/NginxLogList.vue:84
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:83
 msgid "View"
 msgstr ""

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

@@ -162,7 +162,7 @@ msgstr "Rácio real de workers para configurado"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:166 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:102
+#: src/views/site/site_list/SiteList.vue:95 src/views/stream/StreamList.vue:103
 msgid "Add"
 msgstr "Adicionar"
 
@@ -198,7 +198,7 @@ msgstr "Adicionar servidor"
 msgid "Add Site"
 msgstr "Adicionar Site"
 
-#: src/views/stream/StreamList.vue:139
+#: src/views/stream/StreamList.vue:140
 msgid "Add Stream"
 msgstr "Adicionar Stream"
 
@@ -299,8 +299,8 @@ msgstr "Tem certeza que pretende limpar o registo do chat?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "Tem a certeza de que pretende eliminar permanentemente?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
-#: src/views/stream/StreamList.vue:122
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:113
+#: src/views/stream/StreamList.vue:123
 msgid "Are you sure you want to delete?"
 msgstr "Tem certeza que pretende eliminar?"
 
@@ -422,8 +422,7 @@ msgstr "Reinício Automático"
 
 #: src/views/certificate/CertificateEditor.vue:256
 #: src/views/config/components/ConfigLeftPanel.vue:273
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
+#: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217
 #: src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:156
 #: src/views/stream/components/StreamEditor.vue:111
@@ -617,6 +616,7 @@ msgstr ""
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
@@ -1053,7 +1053,7 @@ msgstr "Informações de configuração"
 msgid "Configuration Name"
 msgstr "Nome da Configuração"
 
-#: src/views/config/ConfigList.vue:104
+#: src/views/config/ConfigList.vue:112
 msgid "Configurations"
 msgstr "Configurações"
 
@@ -1139,11 +1139,11 @@ msgstr "Criar Outro"
 msgid "Create Backup"
 msgstr "Criar cópia de segurança"
 
-#: src/views/config/ConfigList.vue:122
+#: src/views/config/ConfigList.vue:130
 msgid "Create File"
 msgstr "Criar Ficheiro"
 
-#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:129
+#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:137
 msgid "Create Folder"
 msgstr "Criar Pasta"
 
@@ -1252,7 +1252,7 @@ msgstr "Diariamente às %{time}"
 #: src/routes/modules/dashboard.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:109
 #: src/views/config/components/ConfigLeftPanel.vue:159
-#: src/views/config/ConfigList.vue:67
+#: src/views/config/ConfigList.vue:69
 msgid "Dashboard"
 msgstr "Painel"
 
@@ -1281,8 +1281,11 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:110
 #: src/components/NgxConfigEditor/NgxUpstream.vue:134 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:109
-#: src/views/stream/StreamList.vue:131
+#: src/views/config/components/Delete.vue:65
+#: src/views/config/components/Delete.vue:97
+#: src/views/config/ConfigList.vue:199
+#: src/views/site/site_list/SiteList.vue:122
+#: src/views/stream/StreamList.vue:132
 msgid "Delete"
 msgstr "Eliminar"
 
@@ -1290,6 +1293,10 @@ msgstr "Eliminar"
 msgid "Delete Certificate"
 msgstr "Eliminar certificado"
 
+#: src/views/config/components/Delete.vue:96
+msgid "Delete Confirmation"
+msgstr "Confirmação de eliminação"
+
 #: src/language/curd.ts:11
 msgid "Delete Permanently"
 msgstr "Eliminar Permanentemente"
@@ -1334,7 +1341,7 @@ msgstr "O fluxo %{name} foi eliminado de %{node} com sucesso"
 msgid "Delete stream: %{stream_name}"
 msgstr "Eliminar stream: %{stream_name}"
 
-#: src/language/curd.ts:29
+#: src/language/curd.ts:29 src/views/config/components/Delete.vue:80
 msgid "Deleted successfully"
 msgstr "Eliminado com sucesso"
 
@@ -1575,9 +1582,9 @@ msgstr ""
 "localhost."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:95
+#: src/views/site/site_list/SiteList.vue:108
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:117
+#: src/views/stream/StreamList.vue:118
 msgid "Duplicate"
 msgstr "Duplicado"
 
@@ -2160,6 +2167,14 @@ msgstr "Falha ao escrever o ficheiro da chave de segurança: {0}"
 msgid "Failed to write to zip buffer: {0}"
 msgstr "Falha ao escrever no buffer ZIP: {0}"
 
+#: src/views/config/components/Delete.vue:116
+msgid "file"
+msgstr "arquivo"
+
+#: src/views/config/components/Delete.vue:122
+msgid "File"
+msgstr "Ficheiro"
+
 #: src/language/constants.ts:32
 msgid "File exists"
 msgstr "Ficheiro Existe"
@@ -2184,6 +2199,14 @@ msgstr "Concluído"
 msgid "First View"
 msgstr "Primeira visualização"
 
+#: src/views/config/components/Delete.vue:116
+msgid "folder"
+msgstr "pasta"
+
+#: src/views/config/components/Delete.vue:122
+msgid "Folder"
+msgstr "Pasta"
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:71
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
@@ -2776,7 +2799,7 @@ msgstr ""
 #: src/routes/modules/config.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:114
 #: src/views/config/components/ConfigLeftPanel.vue:164
-#: src/views/config/ConfigList.vue:72
+#: src/views/config/ConfigList.vue:74
 msgid "Manage Configs"
 msgstr "Gerir Configurações"
 
@@ -2909,7 +2932,7 @@ msgid "Modified At"
 msgstr "Modificado em"
 
 #: src/components/ChatGPT/ChatMessage.vue:212
-#: src/views/config/ConfigList.vue:174
+#: src/views/config/ConfigList.vue:182
 msgid "Modify"
 msgstr "Modificar"
 
@@ -2953,6 +2976,7 @@ msgstr "Diretiva Multilinha"
 #: src/views/certificate/CertificateList/certColumns.tsx:9
 #: src/views/certificate/DNSCredential.vue:9
 #: src/views/config/components/ConfigRightPanel/Basic.vue:34
+#: src/views/config/components/Delete.vue:123
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:5
 #: src/views/environments/group/columns.ts:7
@@ -2965,7 +2989,7 @@ msgstr "Diretiva Multilinha"
 #: src/views/stream/columns.tsx:12
 #: src/views/stream/components/RightPanel/Basic.vue:30
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Name"
 msgstr "Nome"
 
@@ -3235,7 +3259,8 @@ msgstr "Nginx.conf inclui o diretório streams-enabled"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:120
+#: src/views/site/site_list/SiteList.vue:111
+#: src/views/stream/StreamList.vue:121
 msgid "No"
 msgstr "Não"
 
@@ -3400,9 +3425,9 @@ msgstr "Off-line"
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:99
+#: src/views/site/site_list/SiteList.vue:112
 #: src/views/stream/components/StreamStatusSelect.vue:60
-#: src/views/stream/StreamList.vue:121
+#: src/views/stream/StreamList.vue:122
 msgid "OK"
 msgstr "OK"
 
@@ -3537,6 +3562,7 @@ msgstr "As palavras-passe não coincidem"
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
+#: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:44
 msgid "Path"
 msgstr "Caminho"
@@ -3746,6 +3772,10 @@ msgstr "Por favor, selecione pelo menos um nó para atualizar"
 msgid "Please type \"Revoke\" to confirm"
 msgstr "Por favor, digite \"Revogar\" para confirmar"
 
+#: src/views/config/components/Delete.vue:70
+msgid "Please type the exact confirmation text"
+msgstr "Por favor, digite o texto de confirmação exato"
+
 #: src/components/PortScanner/PortScannerCompact.vue:31
 #: src/views/preference/tabs/ServerSettings.vue:22
 msgid "Port"
@@ -3803,6 +3833,10 @@ msgstr "Proibir a eliminação do utilizador padrão"
 msgid "Project Team"
 msgstr "Equipe de Projecto"
 
+#: src/views/config/components/Delete.vue:107
+msgid "Protected Directory"
+msgstr "Diretório protegido"
+
 #: src/views/certificate/DNSCredential.vue:17
 msgid "Provider"
 msgstr "Provedor"
@@ -3980,7 +4014,7 @@ msgstr "Removido com sucesso"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:131
 #: src/views/config/components/ConfigName.vue:51
 #: src/views/config/components/Rename.vue:56
-#: src/views/config/ConfigList.vue:181
+#: src/views/config/ConfigList.vue:190
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 msgid "Rename"
@@ -4853,6 +4887,7 @@ msgstr "Trocar para tema escuro"
 msgid "Switch to light theme"
 msgstr "Trocar para tema claro"
 
+#: src/views/config/components/Delete.vue:141
 #: src/views/config/components/Rename.vue:81
 msgid "Sync"
 msgstr "Sincronizar"
@@ -5098,6 +5133,12 @@ msgstr "Este item Auto Cert é inválido, por favor remova-o."
 msgid "This certificate is managed by Nginx UI"
 msgstr "Este certificado é gerido pelo Nginx UI"
 
+#: src/views/config/components/Delete.vue:108
+msgid "This directory is protected and cannot be deleted for system safety."
+msgstr ""
+"Este diretório está protegido e não pode ser eliminado por segurança do "
+"sistema."
+
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateEditor.vue:176
 #: src/views/certificate/CertificateEditor.vue:191
@@ -5154,6 +5195,10 @@ msgstr ""
 msgid "This value is already taken"
 msgstr "Este valor já está em uso"
 
+#: src/views/config/components/Delete.vue:116
+msgid "This will permanently delete the %{type}."
+msgstr "Isto irá eliminar permanentemente %{type}."
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:227
 #: src/components/SystemRestore/SystemRestoreContent.vue:304
 msgid ""
@@ -5314,6 +5359,7 @@ msgstr "Autenticação de dois fatores necessária"
 
 #: src/components/ProxyTargets/ProxyTargets.vue:48
 #: src/views/certificate/CertificateList/certColumns.tsx:24
+#: src/views/config/components/Delete.vue:122
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:12
 #: src/views/notification/notificationColumns.tsx:8
@@ -5321,6 +5367,10 @@ msgstr "Autenticação de dois fatores necessária"
 msgid "Type"
 msgstr "Tipo"
 
+#: src/views/config/components/Delete.vue:129
+msgid "Type %{delete} to confirm"
+msgstr "Digite %{delete} para confirmar"
+
 #: src/components/PortScanner/PortScannerCompact.vue:47
 #: src/composables/useNginxPerformance.ts:18
 msgid "Unknown"
@@ -5468,7 +5518,7 @@ msgstr "Verificar requisitos do sistema"
 msgid "Version"
 msgstr "Versão"
 
-#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:83
+#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:84
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:83
 msgid "View"
 msgstr "Ver"
@@ -5824,9 +5874,6 @@ msgstr "As suas chaves de acesso"
 #~ msgid "Failed to save, syntax error(s) was detected in the configuration."
 #~ msgstr "Falha ao salvar, erro(s) de sintaxe detectados no ficheiro de configuração."
 
-#~ msgid "File"
-#~ msgstr "Ficheiro"
-
 #~ msgid "Format error %{msg}"
 #~ msgstr "Erro de Formato %{msg}"
 

+ 71 - 26
app/src/language/ru_RU/app.po

@@ -166,7 +166,7 @@ msgstr "Фактическое соотношение рабочих к наст
 #: src/components/NgxConfigEditor/NgxUpstream.vue:166 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:102
+#: src/views/site/site_list/SiteList.vue:95 src/views/stream/StreamList.vue:103
 msgid "Add"
 msgstr "Добавить"
 
@@ -202,7 +202,7 @@ msgstr "Добавить сервер"
 msgid "Add Site"
 msgstr "Добавить Сайт"
 
-#: src/views/stream/StreamList.vue:139
+#: src/views/stream/StreamList.vue:140
 msgid "Add Stream"
 msgstr "Добавить поток"
 
@@ -301,8 +301,8 @@ msgstr "Вы уверены, что хотите очистить сообщен
 msgid "Are you sure you want to delete permanently?"
 msgstr "Вы уверены, что хотите удалить безвозвратно?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
-#: src/views/stream/StreamList.vue:122
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:113
+#: src/views/stream/StreamList.vue:123
 msgid "Are you sure you want to delete?"
 msgstr "Вы уверены, что хотите удалить?"
 
@@ -424,8 +424,7 @@ msgstr "Автоматическая перезагрузка"
 
 #: src/views/certificate/CertificateEditor.vue:256
 #: src/views/config/components/ConfigLeftPanel.vue:273
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
+#: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217
 #: src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:156
 #: src/views/stream/components/StreamEditor.vue:111
@@ -625,6 +624,7 @@ msgstr ""
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
@@ -1058,7 +1058,7 @@ msgstr "Информация о конфигурации"
 msgid "Configuration Name"
 msgstr "Название конфигурации"
 
-#: src/views/config/ConfigList.vue:104
+#: src/views/config/ConfigList.vue:112
 msgid "Configurations"
 msgstr "Конфигурации"
 
@@ -1144,11 +1144,11 @@ msgstr "Создать еще"
 msgid "Create Backup"
 msgstr "Создать резервную копию"
 
-#: src/views/config/ConfigList.vue:122
+#: src/views/config/ConfigList.vue:130
 msgid "Create File"
 msgstr "Создать файл"
 
-#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:129
+#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:137
 msgid "Create Folder"
 msgstr "Создать папку"
 
@@ -1257,7 +1257,7 @@ msgstr "Ежедневно в %{time}"
 #: src/routes/modules/dashboard.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:109
 #: src/views/config/components/ConfigLeftPanel.vue:159
-#: src/views/config/ConfigList.vue:67
+#: src/views/config/ConfigList.vue:69
 msgid "Dashboard"
 msgstr "Доска"
 
@@ -1284,8 +1284,11 @@ msgstr "Определите имя и размер зоны общей памя
 #: src/components/NgxConfigEditor/NgxServer.vue:110
 #: src/components/NgxConfigEditor/NgxUpstream.vue:134 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:109
-#: src/views/stream/StreamList.vue:131
+#: src/views/config/components/Delete.vue:65
+#: src/views/config/components/Delete.vue:97
+#: src/views/config/ConfigList.vue:199
+#: src/views/site/site_list/SiteList.vue:122
+#: src/views/stream/StreamList.vue:132
 msgid "Delete"
 msgstr "Удалить"
 
@@ -1293,6 +1296,10 @@ msgstr "Удалить"
 msgid "Delete Certificate"
 msgstr "Удалить сертификат"
 
+#: src/views/config/components/Delete.vue:96
+msgid "Delete Confirmation"
+msgstr "Подтверждение удаления"
+
 #: src/language/curd.ts:11
 msgid "Delete Permanently"
 msgstr "Удалить навсегда"
@@ -1337,7 +1344,7 @@ msgstr "Поток %{name} успешно удален с %{node}"
 msgid "Delete stream: %{stream_name}"
 msgstr "Удалить поток: %{stream_name}"
 
-#: src/language/curd.ts:29
+#: src/language/curd.ts:29 src/views/config/components/Delete.vue:80
 msgid "Deleted successfully"
 msgstr "Удалено успешно"
 
@@ -1578,9 +1585,9 @@ msgstr ""
 "запускаются на localhost."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:95
+#: src/views/site/site_list/SiteList.vue:108
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:117
+#: src/views/stream/StreamList.vue:118
 msgid "Duplicate"
 msgstr "Дублировать"
 
@@ -2163,6 +2170,14 @@ msgstr "Не удалось записать файл ключа безопас
 msgid "Failed to write to zip buffer: {0}"
 msgstr "Ошибка записи в ZIP-буфер: {0}"
 
+#: src/views/config/components/Delete.vue:116
+msgid "file"
+msgstr "файл"
+
+#: src/views/config/components/Delete.vue:122
+msgid "File"
+msgstr "Файл"
+
 #: src/language/constants.ts:32
 msgid "File exists"
 msgstr "Файл существует"
@@ -2187,6 +2202,14 @@ msgstr "Готово"
 msgid "First View"
 msgstr "Первое отображение"
 
+#: src/views/config/components/Delete.vue:116
+msgid "folder"
+msgstr "папка"
+
+#: src/views/config/components/Delete.vue:122
+msgid "Folder"
+msgstr "Папка"
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:71
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
@@ -2777,7 +2800,7 @@ msgstr ""
 #: src/routes/modules/config.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:114
 #: src/views/config/components/ConfigLeftPanel.vue:164
-#: src/views/config/ConfigList.vue:72
+#: src/views/config/ConfigList.vue:74
 msgid "Manage Configs"
 msgstr "Конфигурации"
 
@@ -2910,7 +2933,7 @@ msgid "Modified At"
 msgstr "Изменено"
 
 #: src/components/ChatGPT/ChatMessage.vue:212
-#: src/views/config/ConfigList.vue:174
+#: src/views/config/ConfigList.vue:182
 msgid "Modify"
 msgstr "Изменить"
 
@@ -2954,6 +2977,7 @@ msgstr "Многострочная директива"
 #: src/views/certificate/CertificateList/certColumns.tsx:9
 #: src/views/certificate/DNSCredential.vue:9
 #: src/views/config/components/ConfigRightPanel/Basic.vue:34
+#: src/views/config/components/Delete.vue:123
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:5
 #: src/views/environments/group/columns.ts:7
@@ -2966,7 +2990,7 @@ msgstr "Многострочная директива"
 #: src/views/stream/columns.tsx:12
 #: src/views/stream/components/RightPanel/Basic.vue:30
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Name"
 msgstr "Имя"
 
@@ -3236,7 +3260,8 @@ msgstr "Nginx.conf включает каталог streams-enabled"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:120
+#: src/views/site/site_list/SiteList.vue:111
+#: src/views/stream/StreamList.vue:121
 msgid "No"
 msgstr "Нет"
 
@@ -3401,9 +3426,9 @@ msgstr "Оффлайн"
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:99
+#: src/views/site/site_list/SiteList.vue:112
 #: src/views/stream/components/StreamStatusSelect.vue:60
-#: src/views/stream/StreamList.vue:121
+#: src/views/stream/StreamList.vue:122
 msgid "OK"
 msgstr "ОК"
 
@@ -3538,6 +3563,7 @@ msgstr "Пароли не совпадают"
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
+#: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:44
 msgid "Path"
 msgstr "Путь"
@@ -3752,6 +3778,10 @@ msgstr "Пожалуйста, выберите хотя бы один узел"
 msgid "Please type \"Revoke\" to confirm"
 msgstr "Пожалуйста, введите \"Отозвать\" для подтверждения"
 
+#: src/views/config/components/Delete.vue:70
+msgid "Please type the exact confirmation text"
+msgstr "Пожалуйста, введите точный текст подтверждения"
+
 #: src/components/PortScanner/PortScannerCompact.vue:31
 #: src/views/preference/tabs/ServerSettings.vue:22
 msgid "Port"
@@ -3809,6 +3839,10 @@ msgstr "Запретить удаление пользователя по умо
 msgid "Project Team"
 msgstr "Команда проекта"
 
+#: src/views/config/components/Delete.vue:107
+msgid "Protected Directory"
+msgstr "Защищённая директория"
+
 #: src/views/certificate/DNSCredential.vue:17
 msgid "Provider"
 msgstr "Провайдер"
@@ -3986,7 +4020,7 @@ msgstr "Успешно удалено"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:131
 #: src/views/config/components/ConfigName.vue:51
 #: src/views/config/components/Rename.vue:56
-#: src/views/config/ConfigList.vue:181
+#: src/views/config/ConfigList.vue:190
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 msgid "Rename"
@@ -4851,6 +4885,7 @@ msgstr "Переключиться на темную тему"
 msgid "Switch to light theme"
 msgstr "Переключиться на светлую тему"
 
+#: src/views/config/components/Delete.vue:141
 #: src/views/config/components/Rename.vue:81
 msgid "Sync"
 msgstr "Синхронизация"
@@ -5096,6 +5131,10 @@ msgstr "Этот элемент автосертификата недейств
 msgid "This certificate is managed by Nginx UI"
 msgstr "Этот сертификат под управлением Nginx UI"
 
+#: src/views/config/components/Delete.vue:108
+msgid "This directory is protected and cannot be deleted for system safety."
+msgstr "Этот каталог защищен и не может быть удален для безопасности системы."
+
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateEditor.vue:176
 #: src/views/certificate/CertificateEditor.vue:191
@@ -5153,6 +5192,10 @@ msgstr ""
 msgid "This value is already taken"
 msgstr "Это значение уже занято"
 
+#: src/views/config/components/Delete.vue:116
+msgid "This will permanently delete the %{type}."
+msgstr "Это приведет к безвозвратному удалению %{type}."
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:227
 #: src/components/SystemRestore/SystemRestoreContent.vue:304
 msgid ""
@@ -5313,6 +5356,7 @@ msgstr "Требуется двухфакторная аутентификаци
 
 #: src/components/ProxyTargets/ProxyTargets.vue:48
 #: src/views/certificate/CertificateList/certColumns.tsx:24
+#: src/views/config/components/Delete.vue:122
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:12
 #: src/views/notification/notificationColumns.tsx:8
@@ -5320,6 +5364,10 @@ msgstr "Требуется двухфакторная аутентификаци
 msgid "Type"
 msgstr "Тип"
 
+#: src/views/config/components/Delete.vue:129
+msgid "Type %{delete} to confirm"
+msgstr "Введите %{delete} для подтверждения"
+
 #: src/components/PortScanner/PortScannerCompact.vue:47
 #: src/composables/useNginxPerformance.ts:18
 msgid "Unknown"
@@ -5467,7 +5515,7 @@ msgstr "Проверьте системные требования"
 msgid "Version"
 msgstr "Версия"
 
-#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:83
+#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:84
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:83
 msgid "View"
 msgstr "Просмотр"
@@ -5902,9 +5950,6 @@ msgstr "Ваши ключи доступа"
 #~ "Синхронизация конфигурации %{config_name} с %{env_name} не удалась, ответ: "
 #~ "%{resp}"
 
-#~ msgid "File"
-#~ msgstr "Файл"
-
 #~ msgid ""
 #~ "If you lose your mobile phone, you can use the recovery code to reset your "
 #~ "2FA."

+ 71 - 26
app/src/language/tr_TR/app.po

@@ -162,7 +162,7 @@ msgstr "Gerçek çalışanın yapılandırılmışa oranı"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:166 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:102
+#: src/views/site/site_list/SiteList.vue:95 src/views/stream/StreamList.vue:103
 msgid "Add"
 msgstr "Ekle"
 
@@ -198,7 +198,7 @@ msgstr "Sunucu Ekle"
 msgid "Add Site"
 msgstr "Site Ekle"
 
-#: src/views/stream/StreamList.vue:139
+#: src/views/stream/StreamList.vue:140
 msgid "Add Stream"
 msgstr "Akış Ekle"
 
@@ -297,8 +297,8 @@ msgstr "Sohbet kaydını silmek istediğinizden emin misiniz?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "Kalıcı olarak silmek istediğinizden emin misiniz?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
-#: src/views/stream/StreamList.vue:122
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:113
+#: src/views/stream/StreamList.vue:123
 msgid "Are you sure you want to delete?"
 msgstr "Silmek istediğine emin misin?"
 
@@ -420,8 +420,7 @@ msgstr "Otomatik Yeniden Başlatma"
 
 #: src/views/certificate/CertificateEditor.vue:256
 #: src/views/config/components/ConfigLeftPanel.vue:273
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
+#: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217
 #: src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:156
 #: src/views/stream/components/StreamEditor.vue:111
@@ -611,6 +610,7 @@ msgstr ""
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
@@ -1047,7 +1047,7 @@ msgstr "Yapılandırma bilgileri"
 msgid "Configuration Name"
 msgstr "Yapılandırma Adı"
 
-#: src/views/config/ConfigList.vue:104
+#: src/views/config/ConfigList.vue:112
 msgid "Configurations"
 msgstr "Yapılandırmalar"
 
@@ -1133,11 +1133,11 @@ msgstr "Bir Başka Oluştur"
 msgid "Create Backup"
 msgstr "Yedek Oluştur"
 
-#: src/views/config/ConfigList.vue:122
+#: src/views/config/ConfigList.vue:130
 msgid "Create File"
 msgstr "Dosya Oluştur"
 
-#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:129
+#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:137
 msgid "Create Folder"
 msgstr "Klasör Ekle"
 
@@ -1245,7 +1245,7 @@ msgstr "Günlük olarak saat %{time}"
 #: src/routes/modules/dashboard.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:109
 #: src/views/config/components/ConfigLeftPanel.vue:159
-#: src/views/config/ConfigList.vue:67
+#: src/views/config/ConfigList.vue:69
 msgid "Dashboard"
 msgstr "Kontrol Paneli"
 
@@ -1274,8 +1274,11 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:110
 #: src/components/NgxConfigEditor/NgxUpstream.vue:134 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:109
-#: src/views/stream/StreamList.vue:131
+#: src/views/config/components/Delete.vue:65
+#: src/views/config/components/Delete.vue:97
+#: src/views/config/ConfigList.vue:199
+#: src/views/site/site_list/SiteList.vue:122
+#: src/views/stream/StreamList.vue:132
 msgid "Delete"
 msgstr "Sil"
 
@@ -1283,6 +1286,10 @@ msgstr "Sil"
 msgid "Delete Certificate"
 msgstr "Sertifikayı Sil"
 
+#: src/views/config/components/Delete.vue:96
+msgid "Delete Confirmation"
+msgstr "Silme Onayı"
+
 #: src/language/curd.ts:11
 msgid "Delete Permanently"
 msgstr "Kalıcı Olarak Sil"
@@ -1327,7 +1334,7 @@ msgstr "%{name} akışı %{node} üzerinden başarıyla silindi"
 msgid "Delete stream: %{stream_name}"
 msgstr "Akışı sil: %{stream_name}"
 
-#: src/language/curd.ts:29
+#: src/language/curd.ts:29 src/views/config/components/Delete.vue:80
 msgid "Deleted successfully"
 msgstr "Başarıyla silindi"
 
@@ -1570,9 +1577,9 @@ msgstr ""
 "kullanamazsınız."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:95
+#: src/views/site/site_list/SiteList.vue:108
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:117
+#: src/views/stream/StreamList.vue:118
 msgid "Duplicate"
 msgstr "Kopyala"
 
@@ -2155,6 +2162,14 @@ msgstr "Güvenlik anahtarı dosyası yazılamadı: {0}"
 msgid "Failed to write to zip buffer: {0}"
 msgstr "ZIP tamponuna yazma başarısız: {0}"
 
+#: src/views/config/components/Delete.vue:116
+msgid "file"
+msgstr "dosya"
+
+#: src/views/config/components/Delete.vue:122
+msgid "File"
+msgstr "Dosya"
+
 #: src/language/constants.ts:32
 msgid "File exists"
 msgstr "Dosya zaten var"
@@ -2179,6 +2194,14 @@ msgstr "Bitmiş"
 msgid "First View"
 msgstr "İlk Görünüm"
 
+#: src/views/config/components/Delete.vue:116
+msgid "folder"
+msgstr "klasör"
+
+#: src/views/config/components/Delete.vue:122
+msgid "Folder"
+msgstr "Klasör"
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:71
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
@@ -2772,7 +2795,7 @@ msgstr ""
 #: src/routes/modules/config.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:114
 #: src/views/config/components/ConfigLeftPanel.vue:164
-#: src/views/config/ConfigList.vue:72
+#: src/views/config/ConfigList.vue:74
 msgid "Manage Configs"
 msgstr "Yapılandırmaları Yönet"
 
@@ -2905,7 +2928,7 @@ msgid "Modified At"
 msgstr "Değiştirilme Tarihi"
 
 #: src/components/ChatGPT/ChatMessage.vue:212
-#: src/views/config/ConfigList.vue:174
+#: src/views/config/ConfigList.vue:182
 msgid "Modify"
 msgstr "Değiştir"
 
@@ -2949,6 +2972,7 @@ msgstr "Çok Satırlı Yönergeler"
 #: src/views/certificate/CertificateList/certColumns.tsx:9
 #: src/views/certificate/DNSCredential.vue:9
 #: src/views/config/components/ConfigRightPanel/Basic.vue:34
+#: src/views/config/components/Delete.vue:123
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:5
 #: src/views/environments/group/columns.ts:7
@@ -2961,7 +2985,7 @@ msgstr "Çok Satırlı Yönergeler"
 #: src/views/stream/columns.tsx:12
 #: src/views/stream/components/RightPanel/Basic.vue:30
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Name"
 msgstr "İsim"
 
@@ -3231,7 +3255,8 @@ msgstr "Nginx.conf, streams-enabled dizinini içerir"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:120
+#: src/views/site/site_list/SiteList.vue:111
+#: src/views/stream/StreamList.vue:121
 msgid "No"
 msgstr "Hayır"
 
@@ -3396,9 +3421,9 @@ msgstr "Çevrimdışı"
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:99
+#: src/views/site/site_list/SiteList.vue:112
 #: src/views/stream/components/StreamStatusSelect.vue:60
-#: src/views/stream/StreamList.vue:121
+#: src/views/stream/StreamList.vue:122
 msgid "OK"
 msgstr "Tamam"
 
@@ -3532,6 +3557,7 @@ msgstr "Şifreler eşleşmiyor"
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
+#: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:44
 msgid "Path"
 msgstr "Yol"
@@ -3742,6 +3768,10 @@ msgstr "Lütfen yükseltmek için en az bir düğüm seçin"
 msgid "Please type \"Revoke\" to confirm"
 msgstr "Onaylamak için \"İptal Et\" yazın"
 
+#: src/views/config/components/Delete.vue:70
+msgid "Please type the exact confirmation text"
+msgstr "Lütfen tam onay metnini yazın"
+
 #: src/components/PortScanner/PortScannerCompact.vue:31
 #: src/views/preference/tabs/ServerSettings.vue:22
 msgid "Port"
@@ -3799,6 +3829,10 @@ msgstr "Varsayılan kullanıcı silme yasağı"
 msgid "Project Team"
 msgstr "Proje Ekibi"
 
+#: src/views/config/components/Delete.vue:107
+msgid "Protected Directory"
+msgstr "Korumalı Dizin"
+
 #: src/views/certificate/DNSCredential.vue:17
 msgid "Provider"
 msgstr "Sağlayıcı"
@@ -3976,7 +4010,7 @@ msgstr "Başarıyla kaldırıldı"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:131
 #: src/views/config/components/ConfigName.vue:51
 #: src/views/config/components/Rename.vue:56
-#: src/views/config/ConfigList.vue:181
+#: src/views/config/ConfigList.vue:190
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 msgid "Rename"
@@ -4850,6 +4884,7 @@ msgstr "Karanlık temaya geç"
 msgid "Switch to light theme"
 msgstr "Aydınlık temaya geç"
 
+#: src/views/config/components/Delete.vue:141
 #: src/views/config/components/Rename.vue:81
 msgid "Sync"
 msgstr "Senkronize Et"
@@ -5097,6 +5132,10 @@ msgstr "Bu Otomatik Sertifika öğesi geçersiz, lütfen kaldırın."
 msgid "This certificate is managed by Nginx UI"
 msgstr "Bu sertifika Nginx UI tarafından yönetilmektedir"
 
+#: src/views/config/components/Delete.vue:108
+msgid "This directory is protected and cannot be deleted for system safety."
+msgstr "Bu dizin korumalıdır ve sistem güvenliği için silinemez."
+
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateEditor.vue:176
 #: src/views/certificate/CertificateEditor.vue:191
@@ -5153,6 +5192,10 @@ msgstr ""
 msgid "This value is already taken"
 msgstr "Bu değer zaten alınmış"
 
+#: src/views/config/components/Delete.vue:116
+msgid "This will permanently delete the %{type}."
+msgstr "Bu, %{type} kalıcı olarak silinecektir."
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:227
 #: src/components/SystemRestore/SystemRestoreContent.vue:304
 msgid ""
@@ -5313,6 +5356,7 @@ msgstr "İki faktörlü kimlik doğrulama gerekiyor"
 
 #: src/components/ProxyTargets/ProxyTargets.vue:48
 #: src/views/certificate/CertificateList/certColumns.tsx:24
+#: src/views/config/components/Delete.vue:122
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:12
 #: src/views/notification/notificationColumns.tsx:8
@@ -5320,6 +5364,10 @@ msgstr "İki faktörlü kimlik doğrulama gerekiyor"
 msgid "Type"
 msgstr "Tür"
 
+#: src/views/config/components/Delete.vue:129
+msgid "Type %{delete} to confirm"
+msgstr "Onaylamak için %{delete} yazın"
+
 #: src/components/PortScanner/PortScannerCompact.vue:47
 #: src/composables/useNginxPerformance.ts:18
 msgid "Unknown"
@@ -5467,7 +5515,7 @@ msgstr "Sistem Gereksinimlerini Doğrulun"
 msgid "Version"
 msgstr "Sürüm"
 
-#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:83
+#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:84
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:83
 msgid "View"
 msgstr "Görüntüle"
@@ -5910,9 +5958,6 @@ msgstr "Geçiş Anahtarlarınız"
 #~ msgid "Can't scan? Use text key binding"
 #~ msgstr "Tarayamıyor musunuz? Metin anahtar bağlamasını kullanın"
 
-#~ msgid "File"
-#~ msgstr "Dosya"
-
 #~ msgid ""
 #~ "If you lose your mobile phone, you can use the recovery code to reset your "
 #~ "2FA."

+ 71 - 23
app/src/language/uk_UA/app.po

@@ -166,7 +166,7 @@ msgstr "Фактичне співвідношення робочих до нал
 #: src/components/NgxConfigEditor/NgxUpstream.vue:166 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:102
+#: src/views/site/site_list/SiteList.vue:95 src/views/stream/StreamList.vue:103
 msgid "Add"
 msgstr "Додати"
 
@@ -202,7 +202,7 @@ msgstr "Додати сервер"
 msgid "Add Site"
 msgstr "Додати сайт"
 
-#: src/views/stream/StreamList.vue:139
+#: src/views/stream/StreamList.vue:140
 msgid "Add Stream"
 msgstr "Додати стрім"
 
@@ -301,8 +301,8 @@ msgstr "Ви впевнені, що бажаєте очистити запис 
 msgid "Are you sure you want to delete permanently?"
 msgstr "Ви впевнені, що хочете видалити назавжди?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
-#: src/views/stream/StreamList.vue:122
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:113
+#: src/views/stream/StreamList.vue:123
 msgid "Are you sure you want to delete?"
 msgstr "Ви впевнені, що хочете видалити?"
 
@@ -424,8 +424,7 @@ msgstr "Автоматичний перезапуск"
 
 #: src/views/certificate/CertificateEditor.vue:256
 #: src/views/config/components/ConfigLeftPanel.vue:273
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
+#: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217
 #: src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:156
 #: src/views/stream/components/StreamEditor.vue:111
@@ -622,6 +621,7 @@ msgstr ""
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
@@ -1052,7 +1052,7 @@ msgstr "Інформація про конфігурацію"
 msgid "Configuration Name"
 msgstr "Назва конфігурації"
 
-#: src/views/config/ConfigList.vue:104
+#: src/views/config/ConfigList.vue:112
 msgid "Configurations"
 msgstr "Конфігурації"
 
@@ -1138,11 +1138,11 @@ msgstr "Створити ще один"
 msgid "Create Backup"
 msgstr "Створити резервну копію"
 
-#: src/views/config/ConfigList.vue:122
+#: src/views/config/ConfigList.vue:130
 msgid "Create File"
 msgstr "Створити файл"
 
-#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:129
+#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:137
 msgid "Create Folder"
 msgstr "Створити папку"
 
@@ -1287,7 +1287,7 @@ msgstr "Щодня о %{time}"
 #: src/routes/modules/dashboard.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:109
 #: src/views/config/components/ConfigLeftPanel.vue:159
-#: src/views/config/ConfigList.vue:67
+#: src/views/config/ConfigList.vue:69
 msgid "Dashboard"
 msgstr "Панель керування"
 
@@ -1314,8 +1314,11 @@ msgstr "Вкажіть назву та розмір зони спільної п
 #: src/components/NgxConfigEditor/NgxServer.vue:110
 #: src/components/NgxConfigEditor/NgxUpstream.vue:134 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:109
-#: src/views/stream/StreamList.vue:131
+#: src/views/config/components/Delete.vue:65
+#: src/views/config/components/Delete.vue:97
+#: src/views/config/ConfigList.vue:199
+#: src/views/site/site_list/SiteList.vue:122
+#: src/views/stream/StreamList.vue:132
 msgid "Delete"
 msgstr "Видалити"
 
@@ -1323,6 +1326,10 @@ msgstr "Видалити"
 msgid "Delete Certificate"
 msgstr "Видалити сертифікат"
 
+#: src/views/config/components/Delete.vue:96
+msgid "Delete Confirmation"
+msgstr "Підтвердження видалення"
+
 #: src/language/curd.ts:11
 msgid "Delete Permanently"
 msgstr "Видалити назавжди"
@@ -1367,7 +1374,7 @@ msgstr "Потік %{name} успішно видалено з %{node}"
 msgid "Delete stream: %{stream_name}"
 msgstr "Видалити потік: %{stream_name}"
 
-#: src/language/curd.ts:29
+#: src/language/curd.ts:29 src/views/config/components/Delete.vue:80
 msgid "Deleted successfully"
 msgstr "Видалено успішно"
 
@@ -1644,9 +1651,9 @@ msgstr ""
 "localhost."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:95
+#: src/views/site/site_list/SiteList.vue:108
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:117
+#: src/views/stream/StreamList.vue:118
 msgid "Duplicate"
 msgstr "Дублювати"
 
@@ -2229,6 +2236,14 @@ msgstr "Не вдалося записати файл ключа безпеки:
 msgid "Failed to write to zip buffer: {0}"
 msgstr "Не вдалося записати в zip-буфер: {0}"
 
+#: src/views/config/components/Delete.vue:116
+msgid "file"
+msgstr "файл"
+
+#: src/views/config/components/Delete.vue:122
+msgid "File"
+msgstr "Файл"
+
 #: src/language/constants.ts:32
 msgid "File exists"
 msgstr "Файл існує"
@@ -2253,6 +2268,14 @@ msgstr "Завершено"
 msgid "First View"
 msgstr "Перший перегляд"
 
+#: src/views/config/components/Delete.vue:116
+msgid "folder"
+msgstr "папка"
+
+#: src/views/config/components/Delete.vue:122
+msgid "Folder"
+msgstr "Папка"
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:71
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
@@ -2843,7 +2866,7 @@ msgstr ""
 #: src/routes/modules/config.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:114
 #: src/views/config/components/ConfigLeftPanel.vue:164
-#: src/views/config/ConfigList.vue:72
+#: src/views/config/ConfigList.vue:74
 msgid "Manage Configs"
 msgstr "Керування конфігураціями"
 
@@ -2976,7 +2999,7 @@ msgid "Modified At"
 msgstr "Змінено"
 
 #: src/components/ChatGPT/ChatMessage.vue:212
-#: src/views/config/ConfigList.vue:174
+#: src/views/config/ConfigList.vue:182
 msgid "Modify"
 msgstr "Змінити"
 
@@ -3020,6 +3043,7 @@ msgstr "Багаторядкова директива"
 #: src/views/certificate/CertificateList/certColumns.tsx:9
 #: src/views/certificate/DNSCredential.vue:9
 #: src/views/config/components/ConfigRightPanel/Basic.vue:34
+#: src/views/config/components/Delete.vue:123
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:5
 #: src/views/environments/group/columns.ts:7
@@ -3032,7 +3056,7 @@ msgstr "Багаторядкова директива"
 #: src/views/stream/columns.tsx:12
 #: src/views/stream/components/RightPanel/Basic.vue:30
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Name"
 msgstr "Ім'я"
 
@@ -3302,7 +3326,8 @@ msgstr "Nginx.conf включає каталог streams-enabled"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:120
+#: src/views/site/site_list/SiteList.vue:111
+#: src/views/stream/StreamList.vue:121
 msgid "No"
 msgstr "Ні"
 
@@ -3467,9 +3492,9 @@ msgstr "Офлайн"
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:99
+#: src/views/site/site_list/SiteList.vue:112
 #: src/views/stream/components/StreamStatusSelect.vue:60
-#: src/views/stream/StreamList.vue:121
+#: src/views/stream/StreamList.vue:122
 msgid "OK"
 msgstr "Гаразд"
 
@@ -3604,6 +3629,7 @@ msgstr "Паролі не збігаються"
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
+#: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:44
 msgid "Path"
 msgstr "Шлях"
@@ -3814,6 +3840,10 @@ msgstr "Будь ласка, виберіть принаймні один вуз
 msgid "Please type \"Revoke\" to confirm"
 msgstr "Будь ласка, введіть \"Скасувати\" для підтвердження"
 
+#: src/views/config/components/Delete.vue:70
+msgid "Please type the exact confirmation text"
+msgstr "Будь ласка, введіть точний текст підтвердження"
+
 #: src/components/PortScanner/PortScannerCompact.vue:31
 #: src/views/preference/tabs/ServerSettings.vue:22
 msgid "Port"
@@ -3871,6 +3901,10 @@ msgstr "Забороняється видаляти типового корис
 msgid "Project Team"
 msgstr "Команда проекту"
 
+#: src/views/config/components/Delete.vue:107
+msgid "Protected Directory"
+msgstr "Захищена директорія"
+
 #: src/views/certificate/DNSCredential.vue:17
 msgid "Provider"
 msgstr "Провайдер"
@@ -4051,7 +4085,7 @@ msgstr "Успішно видалено"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:131
 #: src/views/config/components/ConfigName.vue:51
 #: src/views/config/components/Rename.vue:56
-#: src/views/config/ConfigList.vue:181
+#: src/views/config/ConfigList.vue:190
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 msgid "Rename"
@@ -4922,6 +4956,7 @@ msgstr "Перейти на темну тему"
 msgid "Switch to light theme"
 msgstr "Перейти на світлу тему"
 
+#: src/views/config/components/Delete.vue:141
 #: src/views/config/components/Rename.vue:81
 msgid "Sync"
 msgstr "Синхронізувати"
@@ -5169,6 +5204,10 @@ msgstr ""
 msgid "This certificate is managed by Nginx UI"
 msgstr "Цей сертифікат керується Nginx UI"
 
+#: src/views/config/components/Delete.vue:108
+msgid "This directory is protected and cannot be deleted for system safety."
+msgstr "Цей каталог захищений і не може бути видалений для безпеки системи."
+
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateEditor.vue:176
 #: src/views/certificate/CertificateEditor.vue:191
@@ -5225,6 +5264,10 @@ msgstr ""
 msgid "This value is already taken"
 msgstr "Це значення вже використовується"
 
+#: src/views/config/components/Delete.vue:116
+msgid "This will permanently delete the %{type}."
+msgstr "Це призведе до остаточного видалення %{type}."
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:227
 #: src/components/SystemRestore/SystemRestoreContent.vue:304
 msgid ""
@@ -5383,6 +5426,7 @@ msgstr "Потрібна двофакторна аутентифікація"
 
 #: src/components/ProxyTargets/ProxyTargets.vue:48
 #: src/views/certificate/CertificateList/certColumns.tsx:24
+#: src/views/config/components/Delete.vue:122
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:12
 #: src/views/notification/notificationColumns.tsx:8
@@ -5390,6 +5434,10 @@ msgstr "Потрібна двофакторна аутентифікація"
 msgid "Type"
 msgstr "Тип"
 
+#: src/views/config/components/Delete.vue:129
+msgid "Type %{delete} to confirm"
+msgstr "Введіть %{delete} для підтвердження"
+
 #: src/components/PortScanner/PortScannerCompact.vue:47
 #: src/composables/useNginxPerformance.ts:18
 msgid "Unknown"
@@ -5537,7 +5585,7 @@ msgstr "Перевірте системні вимоги"
 msgid "Version"
 msgstr "Версія"
 
-#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:83
+#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:84
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:83
 msgid "View"
 msgstr "Переглянути"

+ 72 - 26
app/src/language/vi_VN/app.po

@@ -157,7 +157,7 @@ msgstr "Tỷ lệ công nhân thực tế so với cấu hình"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:166 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:102
+#: src/views/site/site_list/SiteList.vue:95 src/views/stream/StreamList.vue:103
 msgid "Add"
 msgstr "Thêm"
 
@@ -193,7 +193,7 @@ msgstr "Thêm máy chủ"
 msgid "Add Site"
 msgstr "Thêm Website"
 
-#: src/views/stream/StreamList.vue:139
+#: src/views/stream/StreamList.vue:140
 msgid "Add Stream"
 msgstr "Thêm luồng"
 
@@ -292,8 +292,8 @@ msgstr "Bạn có chắc chắn muốn xóa lịch sử trò chuyện không?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "Bạn có chắc chắn muốn xóa vĩnh viễn không?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
-#: src/views/stream/StreamList.vue:122
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:113
+#: src/views/stream/StreamList.vue:123
 msgid "Are you sure you want to delete?"
 msgstr "Bạn có chắc chắn muốn xóa không?"
 
@@ -411,8 +411,7 @@ msgstr "Khởi động lại tự động"
 
 #: src/views/certificate/CertificateEditor.vue:256
 #: src/views/config/components/ConfigLeftPanel.vue:273
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
+#: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217
 #: src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:156
 #: src/views/stream/components/StreamEditor.vue:111
@@ -602,6 +601,7 @@ msgstr ""
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
@@ -1031,7 +1031,7 @@ msgstr "Thông tin cấu hình"
 msgid "Configuration Name"
 msgstr "Tên cấu hình"
 
-#: src/views/config/ConfigList.vue:104
+#: src/views/config/ConfigList.vue:112
 msgid "Configurations"
 msgstr "Cấu hình"
 
@@ -1115,11 +1115,11 @@ msgstr "Tạo thêm"
 msgid "Create Backup"
 msgstr "Tạo bản sao lưu"
 
-#: src/views/config/ConfigList.vue:122
+#: src/views/config/ConfigList.vue:130
 msgid "Create File"
 msgstr "Tạo tệp"
 
-#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:129
+#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:137
 msgid "Create Folder"
 msgstr "Tạo thư mục"
 
@@ -1227,7 +1227,7 @@ msgstr "Hàng ngày lúc %{time}"
 #: src/routes/modules/dashboard.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:109
 #: src/views/config/components/ConfigLeftPanel.vue:159
-#: src/views/config/ConfigList.vue:67
+#: src/views/config/ConfigList.vue:69
 msgid "Dashboard"
 msgstr "Bảng điều khiển"
 
@@ -1254,8 +1254,11 @@ msgstr "Xác định tên và kích thước vùng bộ nhớ dùng chung, ví d
 #: src/components/NgxConfigEditor/NgxServer.vue:110
 #: src/components/NgxConfigEditor/NgxUpstream.vue:134 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:109
-#: src/views/stream/StreamList.vue:131
+#: src/views/config/components/Delete.vue:65
+#: src/views/config/components/Delete.vue:97
+#: src/views/config/ConfigList.vue:199
+#: src/views/site/site_list/SiteList.vue:122
+#: src/views/stream/StreamList.vue:132
 msgid "Delete"
 msgstr "Xoá"
 
@@ -1263,6 +1266,10 @@ msgstr "Xoá"
 msgid "Delete Certificate"
 msgstr "Xóa chứng chỉ"
 
+#: src/views/config/components/Delete.vue:96
+msgid "Delete Confirmation"
+msgstr "Xác nhận xóa"
+
 #: src/language/curd.ts:11
 msgid "Delete Permanently"
 msgstr "Xóa Vĩnh Viễn"
@@ -1307,7 +1314,7 @@ msgstr "Đã xóa luồng %{name} từ %{node} thành công"
 msgid "Delete stream: %{stream_name}"
 msgstr "Xóa luồng: %{stream_name}"
 
-#: src/language/curd.ts:29
+#: src/language/curd.ts:29 src/views/config/components/Delete.vue:80
 msgid "Deleted successfully"
 msgstr "Đã xóa thành công"
 
@@ -1549,9 +1556,9 @@ msgstr ""
 "trên các trang web không phải HTTPS, trừ khi chạy trên localhost."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:95
+#: src/views/site/site_list/SiteList.vue:108
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:117
+#: src/views/stream/StreamList.vue:118
 msgid "Duplicate"
 msgstr "Nhân bản"
 
@@ -2134,6 +2141,15 @@ msgstr "Không thể ghi tệp khóa bảo mật: {0}"
 msgid "Failed to write to zip buffer: {0}"
 msgstr "Không thể ghi vào bộ đệm zip: {0}"
 
+#: src/views/config/components/Delete.vue:116
+#, fuzzy
+msgid "file"
+msgstr "tệp"
+
+#: src/views/config/components/Delete.vue:122
+msgid "File"
+msgstr "Tệp tin"
+
 #: src/language/constants.ts:32
 msgid "File exists"
 msgstr "Tệp tin đã tồn tại"
@@ -2158,6 +2174,14 @@ msgstr "Đã hoàn thành"
 msgid "First View"
 msgstr "Xem lần đầu"
 
+#: src/views/config/components/Delete.vue:116
+msgid "folder"
+msgstr "thư mục"
+
+#: src/views/config/components/Delete.vue:122
+msgid "Folder"
+msgstr "Thư mục"
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:71
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
@@ -2747,7 +2771,7 @@ msgstr ""
 #: src/routes/modules/config.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:114
 #: src/views/config/components/ConfigLeftPanel.vue:164
-#: src/views/config/ConfigList.vue:72
+#: src/views/config/ConfigList.vue:74
 msgid "Manage Configs"
 msgstr "Quản lý cấu hình"
 
@@ -2880,7 +2904,7 @@ msgid "Modified At"
 msgstr "Đã sửa đổi lúc"
 
 #: src/components/ChatGPT/ChatMessage.vue:212
-#: src/views/config/ConfigList.vue:174
+#: src/views/config/ConfigList.vue:182
 msgid "Modify"
 msgstr "Sửa đổi"
 
@@ -2924,6 +2948,7 @@ msgstr "Chỉ thị nhiều dòng"
 #: src/views/certificate/CertificateList/certColumns.tsx:9
 #: src/views/certificate/DNSCredential.vue:9
 #: src/views/config/components/ConfigRightPanel/Basic.vue:34
+#: src/views/config/components/Delete.vue:123
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:5
 #: src/views/environments/group/columns.ts:7
@@ -2936,7 +2961,7 @@ msgstr "Chỉ thị nhiều dòng"
 #: src/views/stream/columns.tsx:12
 #: src/views/stream/components/RightPanel/Basic.vue:30
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Name"
 msgstr "Tên"
 
@@ -3206,7 +3231,8 @@ msgstr "Nginx.conf bao gồm thư mục streams-enabled"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:120
+#: src/views/site/site_list/SiteList.vue:111
+#: src/views/stream/StreamList.vue:121
 msgid "No"
 msgstr "Không"
 
@@ -3369,9 +3395,9 @@ msgstr "Ngoại tuyến"
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:99
+#: src/views/site/site_list/SiteList.vue:112
 #: src/views/stream/components/StreamStatusSelect.vue:60
-#: src/views/stream/StreamList.vue:121
+#: src/views/stream/StreamList.vue:122
 msgid "OK"
 msgstr "Đồng ý"
 
@@ -3506,6 +3532,7 @@ msgstr "Mật khẩu không khớp"
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
+#: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:44
 msgid "Path"
 msgstr "Đường dẫn"
@@ -3707,6 +3734,10 @@ msgstr "Vui lòng chọn ít nhất một nút để nâng cấp"
 msgid "Please type \"Revoke\" to confirm"
 msgstr "Vui lòng nhập \"Thu hồi\" để xác nhận"
 
+#: src/views/config/components/Delete.vue:70
+msgid "Please type the exact confirmation text"
+msgstr "Vui lòng nhập chính xác văn bản xác nhận"
+
 #: src/components/PortScanner/PortScannerCompact.vue:31
 #: src/views/preference/tabs/ServerSettings.vue:22
 msgid "Port"
@@ -3764,6 +3795,10 @@ msgstr "Cấm xóa người dùng mặc định"
 msgid "Project Team"
 msgstr "Đội ngũ phát triển"
 
+#: src/views/config/components/Delete.vue:107
+msgid "Protected Directory"
+msgstr "Thư mục được bảo vệ"
+
 #: src/views/certificate/DNSCredential.vue:17
 msgid "Provider"
 msgstr "Nhà cung cấp"
@@ -3941,7 +3976,7 @@ msgstr "Đã xóa thành công"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:131
 #: src/views/config/components/ConfigName.vue:51
 #: src/views/config/components/Rename.vue:56
-#: src/views/config/ConfigList.vue:181
+#: src/views/config/ConfigList.vue:190
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 msgid "Rename"
@@ -4804,6 +4839,7 @@ msgstr "Sử dụng Dark theme"
 msgid "Switch to light theme"
 msgstr "Sử dụng Light theme"
 
+#: src/views/config/components/Delete.vue:141
 #: src/views/config/components/Rename.vue:81
 msgid "Sync"
 msgstr "Đồng bộ"
@@ -5049,6 +5085,10 @@ msgstr "Mục Chứng chỉ tự động này không hợp lệ, vui lòng xóa
 msgid "This certificate is managed by Nginx UI"
 msgstr "Chứng chỉ này được quản lý bởi Nginx UI"
 
+#: src/views/config/components/Delete.vue:108
+msgid "This directory is protected and cannot be deleted for system safety."
+msgstr "Thư mục này được bảo vệ và không thể xóa vì lý do an toàn hệ thống."
+
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateEditor.vue:176
 #: src/views/certificate/CertificateEditor.vue:191
@@ -5105,6 +5145,10 @@ msgstr ""
 msgid "This value is already taken"
 msgstr "Giá trị này đã được sử dụng"
 
+#: src/views/config/components/Delete.vue:116
+msgid "This will permanently delete the %{type}."
+msgstr "Hành động này sẽ xóa vĩnh viễn %{type}."
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:227
 #: src/components/SystemRestore/SystemRestoreContent.vue:304
 msgid ""
@@ -5265,6 +5309,7 @@ msgstr "Yêu cầu xác thực hai yếu tố"
 
 #: src/components/ProxyTargets/ProxyTargets.vue:48
 #: src/views/certificate/CertificateList/certColumns.tsx:24
+#: src/views/config/components/Delete.vue:122
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:12
 #: src/views/notification/notificationColumns.tsx:8
@@ -5272,6 +5317,10 @@ msgstr "Yêu cầu xác thực hai yếu tố"
 msgid "Type"
 msgstr "Loại"
 
+#: src/views/config/components/Delete.vue:129
+msgid "Type %{delete} to confirm"
+msgstr "Nhập %{delete} để xác nhận"
+
 #: src/components/PortScanner/PortScannerCompact.vue:47
 #: src/composables/useNginxPerformance.ts:18
 msgid "Unknown"
@@ -5419,7 +5468,7 @@ msgstr "Xác minh các yêu cầu hệ thống"
 msgid "Version"
 msgstr "Phiên bản"
 
-#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:83
+#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:84
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:83
 msgid "View"
 msgstr "Xem"
@@ -5837,9 +5886,6 @@ msgstr "Khóa truy cập của bạn"
 #~ msgid "Sync config %{config_name} to %{env_name} failed, response: %{resp}"
 #~ msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 
-#~ msgid "File"
-#~ msgstr "Tệp tin"
-
 #, fuzzy
 #~ msgid "Incorrect username or password"
 #~ msgstr "Tên người dùng hoặc mật khẩu không chính xác"

+ 71 - 26
app/src/language/zh_CN/app.po

@@ -161,7 +161,7 @@ msgstr "实际工作进程与配置比例"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:166 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:102
+#: src/views/site/site_list/SiteList.vue:95 src/views/stream/StreamList.vue:103
 msgid "Add"
 msgstr "添加"
 
@@ -197,7 +197,7 @@ msgstr "添加服务器"
 msgid "Add Site"
 msgstr "添加站点"
 
-#: src/views/stream/StreamList.vue:139
+#: src/views/stream/StreamList.vue:140
 msgid "Add Stream"
 msgstr "添加 Stream"
 
@@ -294,8 +294,8 @@ msgstr "你确定你要清除聊天记录吗?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "确定要永久删除吗?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
-#: src/views/stream/StreamList.vue:122
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:113
+#: src/views/stream/StreamList.vue:123
 msgid "Are you sure you want to delete?"
 msgstr "您确定要删除吗?"
 
@@ -413,8 +413,7 @@ msgstr "自动重启"
 
 #: src/views/certificate/CertificateEditor.vue:256
 #: src/views/config/components/ConfigLeftPanel.vue:273
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
+#: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217
 #: src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:156
 #: src/views/stream/components/StreamEditor.vue:111
@@ -600,6 +599,7 @@ msgstr "基于 worker_processes * worker_connections 计算得出。实际性能
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
@@ -1011,7 +1011,7 @@ msgstr "配置信息"
 msgid "Configuration Name"
 msgstr "配置名称"
 
-#: src/views/config/ConfigList.vue:104
+#: src/views/config/ConfigList.vue:112
 msgid "Configurations"
 msgstr "配置"
 
@@ -1095,11 +1095,11 @@ msgstr "再创建一个"
 msgid "Create Backup"
 msgstr "创建备份"
 
-#: src/views/config/ConfigList.vue:122
+#: src/views/config/ConfigList.vue:130
 msgid "Create File"
 msgstr "创建文件"
 
-#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:129
+#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:137
 msgid "Create Folder"
 msgstr "创建文件夹"
 
@@ -1205,7 +1205,7 @@ msgstr "每天 %{time}"
 #: src/routes/modules/dashboard.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:109
 #: src/views/config/components/ConfigLeftPanel.vue:159
-#: src/views/config/ConfigList.vue:67
+#: src/views/config/ConfigList.vue:69
 msgid "Dashboard"
 msgstr "仪表盘"
 
@@ -1232,8 +1232,11 @@ msgstr "定义共享内存区名称和大小,例如 proxy_cache:10m"
 #: src/components/NgxConfigEditor/NgxServer.vue:110
 #: src/components/NgxConfigEditor/NgxUpstream.vue:134 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:109
-#: src/views/stream/StreamList.vue:131
+#: src/views/config/components/Delete.vue:65
+#: src/views/config/components/Delete.vue:97
+#: src/views/config/ConfigList.vue:199
+#: src/views/site/site_list/SiteList.vue:122
+#: src/views/stream/StreamList.vue:132
 msgid "Delete"
 msgstr "删除"
 
@@ -1241,6 +1244,10 @@ msgstr "删除"
 msgid "Delete Certificate"
 msgstr "删除证书"
 
+#: src/views/config/components/Delete.vue:96
+msgid "Delete Confirmation"
+msgstr "删除确认"
+
 #: src/language/curd.ts:11
 msgid "Delete Permanently"
 msgstr "彻底删除"
@@ -1285,7 +1292,7 @@ msgstr "已成功从 %{node} 删除 Stream %{name}"
 msgid "Delete stream: %{stream_name}"
 msgstr "删除 Stream: %{stream_name}"
 
-#: src/language/curd.ts:29
+#: src/language/curd.ts:29 src/views/config/components/Delete.vue:80
 msgid "Deleted successfully"
 msgstr "删除成功"
 
@@ -1523,9 +1530,9 @@ msgid ""
 msgstr "由于某些浏览器的安全策略,除非在 localhost 上使用,否则不能在非 HTTPS 网站上使用 Passkey。"
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:95
+#: src/views/site/site_list/SiteList.vue:108
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:117
+#: src/views/stream/StreamList.vue:118
 msgid "Duplicate"
 msgstr "复制"
 
@@ -2108,6 +2115,14 @@ msgstr "无法写入安全密钥文件:{0}"
 msgid "Failed to write to zip buffer: {0}"
 msgstr "写入 zip 缓冲区失败:{0}"
 
+#: src/views/config/components/Delete.vue:116
+msgid "file"
+msgstr "文件"
+
+#: src/views/config/components/Delete.vue:122
+msgid "File"
+msgstr "文件"
+
 #: src/language/constants.ts:32
 msgid "File exists"
 msgstr "文件已存在"
@@ -2132,6 +2147,14 @@ msgstr "完成"
 msgid "First View"
 msgstr "首次查看"
 
+#: src/views/config/components/Delete.vue:116
+msgid "folder"
+msgstr "文件夹"
+
+#: src/views/config/components/Delete.vue:122
+msgid "Folder"
+msgstr "文件夹"
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:71
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
@@ -2702,7 +2725,7 @@ msgstr "在获取签发证书前,请确保配置文件中已将 .well-known 
 #: src/routes/modules/config.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:114
 #: src/views/config/components/ConfigLeftPanel.vue:164
-#: src/views/config/ConfigList.vue:72
+#: src/views/config/ConfigList.vue:74
 msgid "Manage Configs"
 msgstr "配置管理"
 
@@ -2835,7 +2858,7 @@ msgid "Modified At"
 msgstr "修改时间"
 
 #: src/components/ChatGPT/ChatMessage.vue:212
-#: src/views/config/ConfigList.vue:174
+#: src/views/config/ConfigList.vue:182
 msgid "Modify"
 msgstr "修改"
 
@@ -2879,6 +2902,7 @@ msgstr "多行指令"
 #: src/views/certificate/CertificateList/certColumns.tsx:9
 #: src/views/certificate/DNSCredential.vue:9
 #: src/views/config/components/ConfigRightPanel/Basic.vue:34
+#: src/views/config/components/Delete.vue:123
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:5
 #: src/views/environments/group/columns.ts:7
@@ -2891,7 +2915,7 @@ msgstr "多行指令"
 #: src/views/stream/columns.tsx:12
 #: src/views/stream/components/RightPanel/Basic.vue:30
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Name"
 msgstr "名称"
 
@@ -3159,7 +3183,8 @@ msgstr "检查 nginx.conf 是否包含 streams-enabled 的目录"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:120
+#: src/views/site/site_list/SiteList.vue:111
+#: src/views/stream/StreamList.vue:121
 msgid "No"
 msgstr "取消"
 
@@ -3318,9 +3343,9 @@ msgstr "离线"
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:99
+#: src/views/site/site_list/SiteList.vue:112
 #: src/views/stream/components/StreamStatusSelect.vue:60
-#: src/views/stream/StreamList.vue:121
+#: src/views/stream/StreamList.vue:122
 msgid "OK"
 msgstr "确定"
 
@@ -3451,6 +3476,7 @@ msgstr "密码不匹配"
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
+#: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:44
 msgid "Path"
 msgstr "路径"
@@ -3644,6 +3670,10 @@ msgstr "请至少选择一个节点进行升级"
 msgid "Please type \"Revoke\" to confirm"
 msgstr "请键入 \"撤销 \"确认"
 
+#: src/views/config/components/Delete.vue:70
+msgid "Please type the exact confirmation text"
+msgstr "请输入确切的确认文本"
+
 #: src/components/PortScanner/PortScannerCompact.vue:31
 #: src/views/preference/tabs/ServerSettings.vue:22
 msgid "Port"
@@ -3701,6 +3731,10 @@ msgstr "禁止删除默认用户"
 msgid "Project Team"
 msgstr "项目团队"
 
+#: src/views/config/components/Delete.vue:107
+msgid "Protected Directory"
+msgstr "受保护目录"
+
 #: src/views/certificate/DNSCredential.vue:17
 msgid "Provider"
 msgstr "提供商"
@@ -3874,7 +3908,7 @@ msgstr "删除成功"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:131
 #: src/views/config/components/ConfigName.vue:51
 #: src/views/config/components/Rename.vue:56
-#: src/views/config/ConfigList.vue:181
+#: src/views/config/ConfigList.vue:190
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 msgid "Rename"
@@ -4724,6 +4758,7 @@ msgstr "切换到深色主题"
 msgid "Switch to light theme"
 msgstr "切换到浅色"
 
+#: src/views/config/components/Delete.vue:141
 #: src/views/config/components/Rename.vue:81
 msgid "Sync"
 msgstr "同步"
@@ -4946,6 +4981,10 @@ msgstr "这个证书自动续期项目是无效的,请删除。"
 msgid "This certificate is managed by Nginx UI"
 msgstr "该证书由 Nginx UI 托管"
 
+#: src/views/config/components/Delete.vue:108
+msgid "This directory is protected and cannot be deleted for system safety."
+msgstr "此目录受保护,为确保系统安全无法删除。"
+
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateEditor.vue:176
 #: src/views/certificate/CertificateEditor.vue:191
@@ -4996,6 +5035,10 @@ msgstr "此 Token 只显示一次,以后无法找回。请确保将其保存
 msgid "This value is already taken"
 msgstr "该字段的值已经存在"
 
+#: src/views/config/components/Delete.vue:116
+msgid "This will permanently delete the %{type}."
+msgstr "这将永久删除%{type}。"
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:227
 #: src/components/SystemRestore/SystemRestoreContent.vue:304
 msgid ""
@@ -5138,6 +5181,7 @@ msgstr "需要两步验证"
 
 #: src/components/ProxyTargets/ProxyTargets.vue:48
 #: src/views/certificate/CertificateList/certColumns.tsx:24
+#: src/views/config/components/Delete.vue:122
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:12
 #: src/views/notification/notificationColumns.tsx:8
@@ -5145,6 +5189,10 @@ msgstr "需要两步验证"
 msgid "Type"
 msgstr "类型"
 
+#: src/views/config/components/Delete.vue:129
+msgid "Type %{delete} to confirm"
+msgstr "输入 %{delete} 以确认"
+
 #: src/components/PortScanner/PortScannerCompact.vue:47
 #: src/composables/useNginxPerformance.ts:18
 msgid "Unknown"
@@ -5292,7 +5340,7 @@ msgstr "验证系统要求"
 msgid "Version"
 msgstr "版本"
 
-#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:83
+#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:84
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:83
 msgid "View"
 msgstr "查看"
@@ -5746,9 +5794,6 @@ msgstr "你的 Passkeys"
 #~ msgid "Can't scan? Use text key binding"
 #~ msgstr "无法扫描?使用文本密钥绑定"
 
-#~ msgid "File"
-#~ msgstr "文件"
-
 #~ msgid "Incorrect username or password"
 #~ msgstr "用户名或密码错误"
 

+ 71 - 26
app/src/language/zh_TW/app.po

@@ -165,7 +165,7 @@ msgstr "實際工作進程與配置比例"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:166 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:102
+#: src/views/site/site_list/SiteList.vue:95 src/views/stream/StreamList.vue:103
 msgid "Add"
 msgstr "新增"
 
@@ -201,7 +201,7 @@ msgstr "新增伺服器"
 msgid "Add Site"
 msgstr "新增網站"
 
-#: src/views/stream/StreamList.vue:139
+#: src/views/stream/StreamList.vue:140
 msgid "Add Stream"
 msgstr "新增 Stream"
 
@@ -298,8 +298,8 @@ msgstr "您確定要清除聊天記錄嗎?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "確定要永久刪除嗎?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
-#: src/views/stream/StreamList.vue:122
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:113
+#: src/views/stream/StreamList.vue:123
 msgid "Are you sure you want to delete?"
 msgstr "您確定要刪除嗎?"
 
@@ -417,8 +417,7 @@ msgstr "自動重啟"
 
 #: src/views/certificate/CertificateEditor.vue:256
 #: src/views/config/components/ConfigLeftPanel.vue:273
-#: src/views/config/ConfigList.vue:112
-#: src/views/config/ConfigList.vue:195
+#: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217
 #: src/views/nginx_log/NginxLog.vue:174
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:156
 #: src/views/stream/components/StreamEditor.vue:111
@@ -604,6 +603,7 @@ msgstr "基於 worker_processes * worker_connections 計算得出。實際效能
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
@@ -1015,7 +1015,7 @@ msgstr "設定資訊"
 msgid "Configuration Name"
 msgstr "設定名稱"
 
-#: src/views/config/ConfigList.vue:104
+#: src/views/config/ConfigList.vue:112
 msgid "Configurations"
 msgstr "設定"
 
@@ -1099,11 +1099,11 @@ msgstr "再建立一個"
 msgid "Create Backup"
 msgstr "建立備份"
 
-#: src/views/config/ConfigList.vue:122
+#: src/views/config/ConfigList.vue:130
 msgid "Create File"
 msgstr "建立檔案"
 
-#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:129
+#: src/views/config/components/Mkdir.vue:47 src/views/config/ConfigList.vue:137
 msgid "Create Folder"
 msgstr "建立資料夾"
 
@@ -1209,7 +1209,7 @@ msgstr "每天 %{time}"
 #: src/routes/modules/dashboard.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:109
 #: src/views/config/components/ConfigLeftPanel.vue:159
-#: src/views/config/ConfigList.vue:67
+#: src/views/config/ConfigList.vue:69
 msgid "Dashboard"
 msgstr "儀錶板"
 
@@ -1236,8 +1236,11 @@ msgstr "定義共享記憶體區域名稱和大小,例如 proxy_cache:10m"
 #: src/components/NgxConfigEditor/NgxServer.vue:110
 #: src/components/NgxConfigEditor/NgxUpstream.vue:134 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:109
-#: src/views/stream/StreamList.vue:131
+#: src/views/config/components/Delete.vue:65
+#: src/views/config/components/Delete.vue:97
+#: src/views/config/ConfigList.vue:199
+#: src/views/site/site_list/SiteList.vue:122
+#: src/views/stream/StreamList.vue:132
 msgid "Delete"
 msgstr "刪除"
 
@@ -1245,6 +1248,10 @@ msgstr "刪除"
 msgid "Delete Certificate"
 msgstr "刪除憑證"
 
+#: src/views/config/components/Delete.vue:96
+msgid "Delete Confirmation"
+msgstr "刪除確認"
+
 #: src/language/curd.ts:11
 msgid "Delete Permanently"
 msgstr "永久刪除"
@@ -1289,7 +1296,7 @@ msgstr "已成功從 %{node} 刪除串流 %{name}"
 msgid "Delete stream: %{stream_name}"
 msgstr "刪除 Stream:%{stream_name}"
 
-#: src/language/curd.ts:29
+#: src/language/curd.ts:29 src/views/config/components/Delete.vue:80
 msgid "Deleted successfully"
 msgstr "刪除成功"
 
@@ -1527,9 +1534,9 @@ msgid ""
 msgstr "基於部分瀏覽器的安全政策,您無法在未啟用 HTTPS 網站,特別是 localhost 上使用通行金鑰。"
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:95
+#: src/views/site/site_list/SiteList.vue:108
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:117
+#: src/views/stream/StreamList.vue:118
 msgid "Duplicate"
 msgstr "複製"
 
@@ -2112,6 +2119,14 @@ msgstr "無法寫入安全金鑰檔案:{0}"
 msgid "Failed to write to zip buffer: {0}"
 msgstr "寫入壓縮緩衝區失敗:{0}"
 
+#: src/views/config/components/Delete.vue:116
+msgid "file"
+msgstr "檔案"
+
+#: src/views/config/components/Delete.vue:122
+msgid "File"
+msgstr "檔案"
+
 #: src/language/constants.ts:32
 msgid "File exists"
 msgstr "檔案已存在"
@@ -2136,6 +2151,14 @@ msgstr "完成"
 msgid "First View"
 msgstr "首次檢視"
 
+#: src/views/config/components/Delete.vue:116
+msgid "folder"
+msgstr "資料夾"
+
+#: src/views/config/components/Delete.vue:122
+msgid "Folder"
+msgstr "資料夾"
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:71
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
@@ -2706,7 +2729,7 @@ msgstr "在取得憑證前,請確保您已將 .well-known 目錄反向代理
 #: src/routes/modules/config.ts:10
 #: src/views/config/components/ConfigLeftPanel.vue:114
 #: src/views/config/components/ConfigLeftPanel.vue:164
-#: src/views/config/ConfigList.vue:72
+#: src/views/config/ConfigList.vue:74
 msgid "Manage Configs"
 msgstr "管理設定"
 
@@ -2839,7 +2862,7 @@ msgid "Modified At"
 msgstr "修改於"
 
 #: src/components/ChatGPT/ChatMessage.vue:212
-#: src/views/config/ConfigList.vue:174
+#: src/views/config/ConfigList.vue:182
 msgid "Modify"
 msgstr "修改"
 
@@ -2883,6 +2906,7 @@ msgstr "多行指令"
 #: src/views/certificate/CertificateList/certColumns.tsx:9
 #: src/views/certificate/DNSCredential.vue:9
 #: src/views/config/components/ConfigRightPanel/Basic.vue:34
+#: src/views/config/components/Delete.vue:123
 #: src/views/config/components/Mkdir.vue:64
 #: src/views/config/configColumns.tsx:5
 #: src/views/environments/group/columns.ts:7
@@ -2895,7 +2919,7 @@ msgstr "多行指令"
 #: src/views/stream/columns.tsx:12
 #: src/views/stream/components/RightPanel/Basic.vue:30
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Name"
 msgstr "名稱"
 
@@ -3163,7 +3187,8 @@ msgstr "Nginx.conf 包含 streams-enabled 目錄"
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:120
+#: src/views/site/site_list/SiteList.vue:111
+#: src/views/stream/StreamList.vue:121
 msgid "No"
 msgstr "取消"
 
@@ -3322,9 +3347,9 @@ msgstr "離線"
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:99
+#: src/views/site/site_list/SiteList.vue:112
 #: src/views/stream/components/StreamStatusSelect.vue:60
-#: src/views/stream/StreamList.vue:121
+#: src/views/stream/StreamList.vue:122
 msgid "OK"
 msgstr "確定"
 
@@ -3457,6 +3482,7 @@ msgstr "密碼不匹配"
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
+#: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:44
 msgid "Path"
 msgstr "路徑"
@@ -3650,6 +3676,10 @@ msgstr "請至少選擇一個節點進行升級"
 msgid "Please type \"Revoke\" to confirm"
 msgstr "請輸入「撤銷」以確認"
 
+#: src/views/config/components/Delete.vue:70
+msgid "Please type the exact confirmation text"
+msgstr "請輸入確切的確認文本"
+
 #: src/components/PortScanner/PortScannerCompact.vue:31
 #: src/views/preference/tabs/ServerSettings.vue:22
 msgid "Port"
@@ -3707,6 +3737,10 @@ msgstr "禁止刪除預設使用者"
 msgid "Project Team"
 msgstr "專案團隊"
 
+#: src/views/config/components/Delete.vue:107
+msgid "Protected Directory"
+msgstr "受保護目錄"
+
 #: src/views/certificate/DNSCredential.vue:17
 msgid "Provider"
 msgstr "供應商"
@@ -3880,7 +3914,7 @@ msgstr "移除成功"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:131
 #: src/views/config/components/ConfigName.vue:51
 #: src/views/config/components/Rename.vue:56
-#: src/views/config/ConfigList.vue:181
+#: src/views/config/ConfigList.vue:190
 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:44
 #: src/views/stream/components/ConfigName.vue:44
 msgid "Rename"
@@ -4730,6 +4764,7 @@ msgstr "切換到深色主題"
 msgid "Switch to light theme"
 msgstr "切換到淺色主題"
 
+#: src/views/config/components/Delete.vue:141
 #: src/views/config/components/Rename.vue:81
 msgid "Sync"
 msgstr "同步"
@@ -4952,6 +4987,10 @@ msgstr "此自動憑證項目無效,請將其移除。"
 msgid "This certificate is managed by Nginx UI"
 msgstr "此憑證由 Nginx UI 管理"
 
+#: src/views/config/components/Delete.vue:108
+msgid "This directory is protected and cannot be deleted for system safety."
+msgstr "此目錄受保護,為確保系統安全無法刪除。"
+
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateEditor.vue:176
 #: src/views/certificate/CertificateEditor.vue:191
@@ -5002,6 +5041,10 @@ msgstr "此令牌僅顯示一次且無法後續找回,請務必將其儲存在
 msgid "This value is already taken"
 msgstr "此值已被使用"
 
+#: src/views/config/components/Delete.vue:116
+msgid "This will permanently delete the %{type}."
+msgstr "這將永久刪除%{type}。"
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:227
 #: src/components/SystemRestore/SystemRestoreContent.vue:304
 msgid ""
@@ -5144,6 +5187,7 @@ msgstr "需要多重因素驗證"
 
 #: src/components/ProxyTargets/ProxyTargets.vue:48
 #: src/views/certificate/CertificateList/certColumns.tsx:24
+#: src/views/config/components/Delete.vue:122
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:12
 #: src/views/notification/notificationColumns.tsx:8
@@ -5151,6 +5195,10 @@ msgstr "需要多重因素驗證"
 msgid "Type"
 msgstr "類型"
 
+#: src/views/config/components/Delete.vue:129
+msgid "Type %{delete} to confirm"
+msgstr "輸入 %{delete} 以確認"
+
 #: src/components/PortScanner/PortScannerCompact.vue:47
 #: src/composables/useNginxPerformance.ts:18
 msgid "Unknown"
@@ -5298,7 +5346,7 @@ msgstr "驗證系統要求"
 msgid "Version"
 msgstr "版本"
 
-#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:83
+#: src/language/curd.ts:7 src/views/nginx_log/NginxLogList.vue:84
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:83
 msgid "View"
 msgstr "檢視"
@@ -5724,9 +5772,6 @@ msgstr "您的通行金鑰"
 #~ msgid "The recovery code is only displayed once, please save it in a safe place."
 #~ msgstr "恢復碼僅顯示一次,請將其儲存在安全的地方。"
 
-#~ msgid "File"
-#~ msgstr "檔案"
-
 #~ msgid "Incorrect username or password"
 #~ msgstr "使用者名稱或密碼不正確"
 

+ 0 - 14
app/src/layouts/BaseLayout.vue

@@ -8,9 +8,6 @@ import FooterLayout from './FooterLayout.vue'
 import HeaderLayout from './HeaderLayout.vue'
 import SideBar from './SideBar.vue'
 
-const route = useRoute()
-const router = useRouter()
-
 const drawerVisible = ref(false)
 const collapsed = ref(false)
 const hideLayoutSidebar = ref(false)
@@ -50,17 +47,6 @@ provide('breadList', breadList)
 
 const userStore = useUserStore()
 const { token } = storeToRefs(userStore)
-
-const settingsStore = useSettingsStore()
-const { route_path } = storeToRefs(settingsStore)
-
-watch(route, () => {
-  route_path.value = route.path
-})
-
-onMounted(() => {
-  router.push(route_path.value)
-})
 </script>
 
 <template>

+ 22 - 0
app/src/views/config/ConfigList.vue

@@ -3,6 +3,8 @@ import { StdTable } from '@uozi-admin/curd'
 import config from '@/api/config'
 import FooterToolBar from '@/components/FooterToolbar'
 import { useBreadcrumbs } from '@/composables/useBreadcrumbs'
+import { isProtectedPath } from '@/views/config/configUtils'
+import Delete from './components/Delete.vue'
 import Mkdir from './components/Mkdir.vue'
 import Rename from './components/Rename.vue'
 import configColumns from './configColumns'
@@ -98,6 +100,12 @@ function goBack() {
 
 const refMkdir = useTemplateRef('refMkdir')
 const refRename = useTemplateRef('refRename')
+const refDelete = useTemplateRef('refDelete')
+
+// Check if a file/directory is protected
+function isProtected(name: string) {
+  return isProtectedPath(name)
+}
 </script>
 
 <template>
@@ -174,12 +182,22 @@ const refRename = useTemplateRef('refRename')
           {{ $gettext('Modify') }}
         </AButton>
         <AButton
+          v-if="!isProtected(record.name)"
           type="link"
           size="small"
           @click="() => refRename?.open(basePath, record.name, record.is_dir)"
         >
           {{ $gettext('Rename') }}
         </AButton>
+        <AButton
+          v-if="!isProtected(record.name)"
+          type="link"
+          size="small"
+          danger
+          @click="() => refDelete?.open(basePath, record.name, record.is_dir)"
+        >
+          {{ $gettext('Delete') }}
+        </AButton>
       </template>
     </StdTable>
     <Mkdir
@@ -190,6 +208,10 @@ const refRename = useTemplateRef('refRename')
       ref="refRename"
       @renamed="() => table?.refresh()"
     />
+    <Delete
+      ref="refDelete"
+      @deleted="() => table?.refresh()"
+    />
     <FooterToolBar v-if="basePath">
       <AButton @click="goBack">
         {{ $gettext('Back') }}

+ 170 - 0
app/src/views/config/components/Delete.vue

@@ -0,0 +1,170 @@
+<script setup lang="ts">
+import { message } from 'ant-design-vue'
+import config from '@/api/config'
+import NodeSelector from '@/components/NodeSelector'
+import use2FAModal from '@/components/TwoFA/use2FAModal'
+import { urlJoin } from '@/lib/helper'
+import { isProtectedPath } from '@/views/config/configUtils'
+
+const emit = defineEmits(['deleted'])
+const visible = ref(false)
+const confirmText = ref('')
+
+const data = ref({
+  basePath: '',
+  name: '',
+  isDir: false,
+  sync_node_ids: [] as number[],
+  fullPath: '',
+})
+
+async function open(basePath: string, name: string, isDir: boolean) {
+  visible.value = true
+  confirmText.value = ''
+  data.value.basePath = basePath
+  data.value.name = name
+  data.value.isDir = isDir
+  data.value.sync_node_ids = []
+
+  const { base_path: configBasePath } = await config.get_base_path()
+
+  // Build full path
+  const relativePath = urlJoin(basePath, name)
+  data.value.fullPath = urlJoin(configBasePath, relativePath)
+
+  // Load config details to get sync nodes
+  try {
+    // For files, try to get their specific sync configuration
+    if (!isDir) {
+      const configDetail = await config.getItem(relativePath)
+      if (configDetail?.sync_node_ids && configDetail.sync_node_ids.length > 0) {
+        data.value.sync_node_ids = [...configDetail.sync_node_ids]
+      }
+    }
+    // For directories, we could potentially get sync nodes from any file within
+    // but for simplicity, we'll leave it empty and let user choose
+  }
+  catch (error) {
+    // Silently ignore errors if config details cannot be loaded
+    // This might happen for files that are not tracked in the database
+    console.error('Config details not available for sync nodes:', error)
+  }
+}
+
+defineExpose({
+  open,
+})
+
+// Check if the item is protected
+const isProtected = computed(() => {
+  return isProtectedPath(data.value.name)
+})
+
+// Expected confirmation text
+const expectedConfirmText = computed(() => {
+  return $gettext('Delete')
+})
+
+function ok() {
+  if (confirmText.value !== expectedConfirmText.value) {
+    message.error($gettext('Please type the exact confirmation text'))
+    return
+  }
+
+  const { basePath, name, sync_node_ids } = data.value
+  const otpModal = use2FAModal()
+
+  otpModal.open().then(() => {
+    config.delete(basePath, name, sync_node_ids).then(() => {
+      visible.value = false
+      message.success($gettext('Deleted successfully'))
+      emit('deleted')
+    })
+  })
+}
+
+function cancel() {
+  visible.value = false
+  confirmText.value = ''
+}
+</script>
+
+<template>
+  <AModal
+    v-model:open="visible"
+    :mask="false"
+    :title="$gettext('Delete Confirmation')"
+    :ok-text="$gettext('Delete')"
+    :cancel-text="$gettext('Cancel')"
+    :ok-button-props="{ danger: true, disabled: confirmText !== expectedConfirmText || isProtected }"
+    @ok="ok"
+    @cancel="cancel"
+  >
+    <AForm layout="vertical" class="delete-modal-content">
+      <AAlert
+        v-if="isProtected"
+        type="error"
+        :message="$gettext('Protected Directory')"
+        :description="$gettext('This directory is protected and cannot be deleted for system safety.')"
+        show-icon
+        class="mb-4"
+      />
+
+      <AAlert
+        v-else
+        type="warning"
+        :message="$gettext('This will permanently delete the %{type}.', { type: data.isDir ? $gettext('folder') : $gettext('file') })"
+        show-icon
+        class="mb-4"
+      />
+
+      <div class="item-info mb-4">
+        <p><strong>{{ $gettext('Type') }}:</strong> {{ data.isDir ? $gettext('Folder') : $gettext('File') }}</p>
+        <p><strong>{{ $gettext('Name') }}:</strong> {{ data.name }}</p>
+        <p><strong>{{ $gettext('Path') }}:</strong> {{ data.fullPath }}</p>
+      </div>
+
+      <AFormItem
+        v-if="!isProtected"
+        :label="$gettext('Type %{delete} to confirm', { delete: expectedConfirmText })"
+        class="mb-4"
+      >
+        <AInput
+          v-model:value="confirmText"
+          :placeholder="expectedConfirmText"
+          :disabled="isProtected"
+        />
+      </AFormItem>
+
+      <AFormItem
+        v-if="!isProtected"
+        :label="$gettext('Sync')"
+      >
+        <NodeSelector
+          v-model:target="data.sync_node_ids"
+          hidden-local
+        />
+      </AFormItem>
+    </AForm>
+  </AModal>
+</template>
+
+<style scoped lang="less">
+.delete-modal-content {
+  .item-info {
+    background-color: #fafafa;
+    padding: 12px;
+    border-radius: 6px;
+    border: 1px solid #e8e8e8;
+
+    p {
+      margin: 0;
+      line-height: 1.5;
+
+      &:not(:last-child) {
+        margin-bottom: 8px;
+      }
+    }
+  }
+}
+</style>

+ 2 - 1
app/src/views/config/components/index.ts

@@ -1,4 +1,5 @@
 import ConfigLeftPanel from './ConfigLeftPanel.vue'
 import ConfigRightPanel from './ConfigRightPanel.vue'
+import Delete from './Delete.vue'
 
-export { ConfigLeftPanel, ConfigRightPanel }
+export { ConfigLeftPanel, ConfigRightPanel, Delete }

+ 19 - 0
app/src/views/config/configUtils.ts

@@ -0,0 +1,19 @@
+// List of protected directories that cannot be deleted
+const PROTECTED_DIRS = ['sites-enabled', 'sites-available', 'streams-enabled', 'streams-available', 'conf.d']
+
+/**
+ * Check if a file/directory name is protected and cannot be deleted
+ * @param name - The name of the file or directory
+ * @returns true if the item is protected, false otherwise
+ */
+export function isProtectedPath(name: string): boolean {
+  return PROTECTED_DIRS.includes(name)
+}
+
+/**
+ * Get the list of protected directories
+ * @returns Array of protected directory names
+ */
+export function getProtectedDirs(): string[] {
+  return [...PROTECTED_DIRS]
+} 

+ 114 - 0
internal/config/delete.go

@@ -0,0 +1,114 @@
+package config
+
+import (
+	"os"
+	"strings"
+
+	"github.com/0xJacky/Nginx-UI/internal/nginx"
+	"github.com/0xJacky/Nginx-UI/query"
+)
+
+// CleanupDatabaseRecords removes related database records after deletion
+func CleanupDatabaseRecords(fullPath string, isDir bool) error {
+	q := query.Config
+	g := query.ChatGPTLog
+	b := query.ConfigBackup
+
+	if isDir {
+		// For directories, clean up all records under the directory
+		pathPattern := fullPath + "%"
+
+		// Delete ChatGPT logs
+		_, err := g.Where(g.Name.Like(pathPattern)).Delete()
+		if err != nil {
+			return err
+		}
+
+		// Delete config records
+		_, err = q.Where(q.Filepath.Like(pathPattern)).Delete()
+		if err != nil {
+			return err
+		}
+
+		// Delete backup records
+		_, err = b.Where(b.FilePath.Like(pathPattern)).Delete()
+		if err != nil {
+			return err
+		}
+	} else {
+		// For files, delete specific records
+		_, err := g.Where(g.Name.Eq(fullPath)).Delete()
+		if err != nil {
+			return err
+		}
+
+		_, err = q.Where(q.Filepath.Eq(fullPath)).Delete()
+		if err != nil {
+			return err
+		}
+
+		_, err = b.Where(b.FilePath.Eq(fullPath)).Delete()
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+// IsProtectedPath checks if the path is protected and should not be deleted
+func IsProtectedPath(fullPath, name string) bool {
+	// Get nginx main config file path
+	nginxConfPath := nginx.GetConfEntryPath()
+	if fullPath == nginxConfPath {
+		return true
+	}
+
+	// Protected directory names
+	protectedDirs := []string{
+		"sites-enabled",
+		"sites-available",
+		"streams-enabled",
+		"streams-available",
+		"conf.d",
+	}
+
+	for _, protected := range protectedDirs {
+		if name == protected || strings.HasSuffix(fullPath, "/"+protected) {
+			return true
+		}
+	}
+
+	return false
+}
+
+// ValidateDeletePath validates that the path is safe to delete
+func ValidateDeletePath(fullPath string) error {
+	nginxConfPath := nginx.GetConfPath()
+	if !IsUnderNginxConfDir(fullPath, nginxConfPath) {
+		return ErrDeletePathNotUnderNginxConfDir
+	}
+	return nil
+}
+
+// IsUnderNginxConfDir checks if the given path is under nginx config directory
+func IsUnderNginxConfDir(path, nginxConfPath string) bool {
+	// Normalize paths
+	path = strings.TrimSuffix(path, "/")
+	nginxConfPath = strings.TrimSuffix(nginxConfPath, "/")
+
+	// Check if path starts with nginx config path
+	return strings.HasPrefix(path, nginxConfPath)
+}
+
+// CheckFileExists checks if file or directory exists and returns file info
+func CheckFileExists(fullPath string) (os.FileInfo, error) {
+	stat, err := os.Stat(fullPath)
+	if err != nil {
+		if os.IsNotExist(err) {
+			return nil, ErrFileNotFound
+		}
+		return nil, err
+	}
+	return stat, nil
+}

+ 8 - 5
internal/config/errors.go

@@ -3,9 +3,12 @@ package config
 import "github.com/uozi-tech/cosy"
 
 var (
-	e                                = cosy.NewErrorScope("config")
-	ErrPathIsNotUnderTheNginxConfDir = e.New(50006, "path: {0} is not under the nginx conf dir: {1}")
-	ErrDstFileExists                 = e.New(50007, "destination file: {0} already exists")
-	ErrNginxTestFailed               = e.New(50008, "nginx test failed: {0}")
-	ErrNginxReloadFailed             = e.New(50009, "nginx reload failed: {0}")
+	e                                 = cosy.NewErrorScope("config")
+	ErrPathIsNotUnderTheNginxConfDir  = e.New(50006, "path: {0} is not under the nginx conf dir: {1}")
+	ErrDstFileExists                  = e.New(50007, "destination file: {0} already exists")
+	ErrNginxTestFailed                = e.New(50008, "nginx test failed: {0}")
+	ErrNginxReloadFailed              = e.New(50009, "nginx reload failed: {0}")
+	ErrCannotDeleteProtectedPath      = e.New(50010, "cannot delete protected path: {0}")
+	ErrFileNotFound                   = e.New(50011, "file or directory not found: {0}")
+	ErrDeletePathNotUnderNginxConfDir = e.New(50012, "you are not allowed to delete a file outside of the nginx config path")
 )

+ 92 - 0
internal/config/sync.go

@@ -223,3 +223,95 @@ func (p *RenameConfigPayload) rename(env *model.Environment) (err error) {
 
 	return
 }
+
+func SyncDeleteOnRemoteServer(deletePath string, syncNodeIds []uint64) (err error) {
+	if deletePath == "" || len(syncNodeIds) == 0 {
+		return
+	}
+
+	nginxConfPath := nginx.GetConfPath()
+	if !helper.IsUnderDirectory(deletePath, nginxConfPath) {
+		return e.NewWithParams(50006, ErrPathIsNotUnderTheNginxConfDir.Error(), deletePath, nginxConfPath)
+	}
+
+	payload := &DeleteConfigPayload{
+		Filepath: deletePath,
+	}
+
+	q := query.Environment
+	envs, _ := q.Where(q.ID.In(syncNodeIds...)).Find()
+	for _, env := range envs {
+		go func() {
+			err := payload.delete(env)
+			if err != nil {
+				logger.Error(err)
+			}
+		}()
+	}
+
+	return
+}
+
+type DeleteConfigPayload struct {
+	Filepath string `json:"filepath"`
+}
+
+type SyncDeleteNotificationPayload struct {
+	StatusCode int    `json:"status_code"`
+	Path       string `json:"path"`
+	EnvName    string `json:"env_name"`
+	Response   string `json:"response"`
+}
+
+func (p *DeleteConfigPayload) delete(env *model.Environment) (err error) {
+	client := http.Client{
+		Transport: &http.Transport{
+			TLSClientConfig: &tls.Config{InsecureSkipVerify: settings.HTTPSettings.InsecureSkipVerify},
+		},
+	}
+
+	payloadBytes, err := json.Marshal(gin.H{
+		"base_path": strings.ReplaceAll(filepath.Dir(p.Filepath), nginx.GetConfPath(), ""),
+		"name":      filepath.Base(p.Filepath),
+	})
+	if err != nil {
+		return
+	}
+
+	url, err := env.GetUrl("/api/config_delete")
+	if err != nil {
+		return
+	}
+
+	req, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(payloadBytes))
+	if err != nil {
+		return
+	}
+	req.Header.Set("X-Node-Secret", env.Token)
+	resp, err := client.Do(req)
+	if err != nil {
+		return
+	}
+	defer resp.Body.Close()
+
+	respBody, err := io.ReadAll(resp.Body)
+	if err != nil {
+		return
+	}
+
+	notificationPayload := &SyncDeleteNotificationPayload{
+		StatusCode: resp.StatusCode,
+		Path:       p.Filepath,
+		EnvName:    env.Name,
+		Response:   string(respBody),
+	}
+
+	if resp.StatusCode != http.StatusOK {
+		notification.Error("Delete Remote Config Error", "Delete %{path} on %{env_name} failed", notificationPayload)
+		return
+	}
+
+	notification.Success("Delete Remote Config Success", "Delete %{path} on %{env_name} successfully", notificationPayload)
+
+	return
+}