Browse Source

feat: add installation lock response and error handling for installation timeout

Jacky 3 months ago
parent
commit
ed320f32cc

+ 6 - 1
app/src/api/install.ts

@@ -7,9 +7,14 @@ export interface InstallRequest {
   database: string
 }
 
+export interface InstallLockResponse {
+  lock: boolean
+  timeout: boolean
+}
+
 const install = {
   get_lock() {
-    return http.get('/install')
+    return http.get<InstallLockResponse>('/install')
   },
   install_nginx_ui(data: InstallRequest) {
     return http.post('/install', data, { crypto: true })

+ 5 - 0
app/src/constants/errors/backup.ts

@@ -10,6 +10,7 @@ export default {
   4011: () => $gettext('Failed to generate AES key: {0}'),
   4012: () => $gettext('Failed to generate initialization vector: {0}'),
   4013: () => $gettext('Failed to create backup file: {0}'),
+  4014: () => $gettext('Failed to cleanup temporary directory: {0}'),
   4101: () => $gettext('Config path is empty'),
   4102: () => $gettext('Failed to copy config file: {0}'),
   4103: () => $gettext('Failed to copy database directory: {0}'),
@@ -17,6 +18,7 @@ export default {
   4105: () => $gettext('Failed to calculate hash: {0}'),
   4106: () => $gettext('Nginx config directory is not set'),
   4107: () => $gettext('Failed to copy Nginx config directory: {0}'),
+  4108: () => $gettext('Failed to read symlink: {0}'),
   4201: () => $gettext('Failed to read file: {0}'),
   4202: () => $gettext('Failed to encrypt file: {0}'),
   4203: () => $gettext('Failed to write encrypted file: {0}'),
@@ -45,6 +47,9 @@ export default {
   4603: () => $gettext('Failed to create parent directory: {0}'),
   4604: () => $gettext('Failed to create file: {0}'),
   4605: () => $gettext('Failed to open zip entry: {0}'),
+  4606: () => $gettext('Failed to create symbolic link: {0}'),
+  4607: () => $gettext('Invalid file path: {0}'),
+  4608: () => $gettext('Failed to evaluate symbolic links: {0}'),
   4701: () => $gettext('Failed to read encrypted file: {0}'),
   4702: () => $gettext('Failed to decrypt file: {0}'),
   4703: () => $gettext('Failed to write decrypted file: {0}'),

+ 4 - 0
app/src/constants/errors/system.ts

@@ -0,0 +1,4 @@
+export default {
+  40301: () => $gettext('Nginx UI already installed'),
+  40302: () => $gettext('Installation is not allowed after 10 minutes of system startup'),
+}

+ 93 - 53
app/src/language/ar/app.po

@@ -281,7 +281,7 @@ msgstr "رجوع"
 msgid "Backup file integrity check failed, it may have been tampered with"
 msgstr ""
 
-#: src/constants/errors/backup.ts:39
+#: src/constants/errors/backup.ts:41
 #, fuzzy
 msgid "Backup file not found: {0}"
 msgstr "لم يتم العثور على الملف"
@@ -518,7 +518,7 @@ msgstr "أمر"
 msgid "Comments"
 msgstr "تعليقات"
 
-#: src/constants/errors/backup.ts:13
+#: src/constants/errors/backup.ts:14
 #, fuzzy
 msgid "Config path is empty"
 msgstr "نماذج التكوين"
@@ -667,7 +667,7 @@ msgstr "قم بتخصيص اسم العقدة المحلية ليتم عرضها
 msgid "Dashboard"
 msgstr "لوحة المعلومات"
 
-#: src/views/other/Install.vue:119
+#: src/views/other/Install.vue:152
 msgid "Database (Optional, default: database)"
 msgstr "قاعدة البيانات (اختياري، الافتراضي: قاعدة البيانات)"
 
@@ -980,7 +980,7 @@ msgstr "تعديل البث"
 msgid "Email"
 msgstr "بريد إلكتروني"
 
-#: src/views/other/Install.vue:88
+#: src/views/other/Install.vue:121
 msgid "Email (*)"
 msgstr "البريد الإلكتروني (*)"
 
@@ -1121,37 +1121,42 @@ msgstr "فشل في التفعيل %{msg}"
 msgid "Failed to backup Nginx UI files: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:17
+#: src/constants/errors/backup.ts:18
 #, fuzzy
 msgid "Failed to calculate hash: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:53
+#: src/constants/errors/backup.ts:58
 msgid "Failed to calculate Nginx hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:52
+#: src/constants/errors/backup.ts:57
 msgid "Failed to calculate Nginx UI hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:14
+#: src/constants/errors/backup.ts:13
+#, fuzzy
+msgid "Failed to cleanup temporary directory: {0}"
+msgstr "فشل في التفعيل %{msg}"
+
+#: src/constants/errors/backup.ts:15
 msgid "Failed to copy config file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:15
+#: src/constants/errors/backup.ts:16
 msgid "Failed to copy database directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:16
+#: src/constants/errors/backup.ts:17
 #, fuzzy
 msgid "Failed to copy database file: {0}"
 msgstr "فشل في تعطيل %{msg}"
 
-#: src/constants/errors/backup.ts:30
+#: src/constants/errors/backup.ts:32
 msgid "Failed to copy file content: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:19
+#: src/constants/errors/backup.ts:20
 msgid "Failed to copy Nginx config directory: {0}"
 msgstr ""
 
@@ -1165,12 +1170,12 @@ msgstr "فشل في التفعيل %{msg}"
 msgid "Failed to create backup file: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:44
+#: src/constants/errors/backup.ts:46
 #, fuzzy
 msgid "Failed to create directory: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:46
+#: src/constants/errors/backup.ts:48
 #, fuzzy
 msgid "Failed to create file: {0}"
 msgstr "فشل في التفعيل %{msg}"
@@ -1180,15 +1185,20 @@ msgstr "فشل في التفعيل %{msg}"
 msgid "Failed to create hash info file: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:45
+#: src/constants/errors/backup.ts:47
 #, fuzzy
 msgid "Failed to create parent directory: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:32
+#: src/constants/errors/backup.ts:34
 msgid "Failed to create restore directory: {0}"
 msgstr ""
 
+#: src/constants/errors/backup.ts:50
+#, fuzzy
+msgid "Failed to create symbolic link: {0}"
+msgstr "فشل في التفعيل %{msg}"
+
 #: src/constants/errors/backup.ts:2
 #, fuzzy
 msgid "Failed to create temporary directory"
@@ -1204,36 +1214,36 @@ msgstr "فشل في التفعيل %{msg}"
 msgid "Failed to create zip archive: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:27
+#: src/constants/errors/backup.ts:29
 #, fuzzy
 msgid "Failed to create zip entry: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:26
+#: src/constants/errors/backup.ts:28
 #, fuzzy
 msgid "Failed to create zip file: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:29
+#: src/constants/errors/backup.ts:31
 #, fuzzy
 msgid "Failed to create zip header: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:24
+#: src/constants/errors/backup.ts:26
 #, fuzzy
 msgid "Failed to decrypt data: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:49
+#: src/constants/errors/backup.ts:54
 #, fuzzy
 msgid "Failed to decrypt file: {0}"
 msgstr "فشل في تعطيل %{msg}"
 
-#: src/constants/errors/backup.ts:35
+#: src/constants/errors/backup.ts:37
 msgid "Failed to decrypt Nginx directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:34
+#: src/constants/errors/backup.ts:36
 msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 
@@ -1251,12 +1261,12 @@ msgstr "فشل في تعطيل %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:23
+#: src/constants/errors/backup.ts:25
 #, fuzzy
 msgid "Failed to encrypt data: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:21
+#: src/constants/errors/backup.ts:23
 #, fuzzy
 msgid "Failed to encrypt file: {0}"
 msgstr "فشل في التفعيل %{msg}"
@@ -1269,7 +1279,12 @@ msgstr ""
 msgid "Failed to encrypt Nginx UI directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:33
+#: src/constants/errors/backup.ts:52
+#, fuzzy
+msgid "Failed to evaluate symbolic links: {0}"
+msgstr "فشل في التفعيل %{msg}"
+
+#: src/constants/errors/backup.ts:35
 #, fuzzy
 msgid "Failed to extract archive: {0}"
 msgstr "فشل في التفعيل %{msg}"
@@ -1288,17 +1303,17 @@ msgstr "فشل في الحصول على معلومات الشهادة"
 msgid "Failed to get certificate information"
 msgstr "فشل في الحصول على معلومات الشهادة"
 
-#: src/constants/errors/backup.ts:28
+#: src/constants/errors/backup.ts:30
 #, fuzzy
 msgid "Failed to open source file: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:47
+#: src/constants/errors/backup.ts:49
 #, fuzzy
 msgid "Failed to open zip entry: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:43
+#: src/constants/errors/backup.ts:45
 #, fuzzy
 msgid "Failed to open zip file: {0}"
 msgstr "فشل في التفعيل %{msg}"
@@ -1307,17 +1322,17 @@ msgstr "فشل في التفعيل %{msg}"
 msgid "Failed to parse nginx.conf"
 msgstr ""
 
-#: src/constants/errors/backup.ts:48
+#: src/constants/errors/backup.ts:53
 #, fuzzy
 msgid "Failed to read encrypted file: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:20
+#: src/constants/errors/backup.ts:22
 #, fuzzy
 msgid "Failed to read file: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:51
+#: src/constants/errors/backup.ts:56
 #, fuzzy
 msgid "Failed to read hash info file: {0}"
 msgstr "فشل في التفعيل %{msg}"
@@ -1327,12 +1342,17 @@ msgstr "فشل في التفعيل %{msg}"
 msgid "Failed to read nginx.conf"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:37
+#: src/constants/errors/backup.ts:21
+#, fuzzy
+msgid "Failed to read symlink: {0}"
+msgstr "فشل في التفعيل %{msg}"
+
+#: src/constants/errors/backup.ts:39
 #, fuzzy
 msgid "Failed to restore Nginx configs: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:38
+#: src/constants/errors/backup.ts:40
 msgid "Failed to restore Nginx UI files: {0}"
 msgstr ""
 
@@ -1341,20 +1361,20 @@ msgstr ""
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "فشل في الحفظ، تم اكتشاف خطأ(أخطاء) في بناء الجملة في التكوين."
 
-#: src/constants/errors/backup.ts:36
+#: src/constants/errors/backup.ts:38
 #, fuzzy
 msgid "Failed to verify hashes: {0}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/constants/errors/backup.ts:50
+#: src/constants/errors/backup.ts:55
 msgid "Failed to write decrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:22
+#: src/constants/errors/backup.ts:24
 msgid "Failed to write encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:31
+#: src/constants/errors/backup.ts:33
 msgid "Failed to write to zip buffer: {0}"
 msgstr ""
 
@@ -1449,7 +1469,7 @@ msgstr "جارٍ الحصول على الشهادة، يرجى الانتظار.
 msgid "Github Proxy"
 msgstr "وكيل Github"
 
-#: src/constants/errors/backup.ts:54
+#: src/constants/errors/backup.ts:59
 msgid "Hash verification failed: file integrity compromised"
 msgstr ""
 
@@ -1535,14 +1555,24 @@ msgstr "أدخل الرمز من التطبيق:"
 msgid "Input the recovery code:"
 msgstr "أدخل رمز الاسترداد:"
 
-#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:134
+#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:168
 msgid "Install"
 msgstr "تثبيت"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:89
 msgid "Install successfully"
 msgstr "تم التثبيت بنجاح"
 
+#: src/constants/errors/system.ts:3
+msgid "Installation is not allowed after 10 minutes of system startup"
+msgstr ""
+
+#: src/views/other/Install.vue:113
+msgid ""
+"Installation is not allowed after 10 minutes of system startup, please "
+"restart the Nginx UI."
+msgstr ""
+
 #: src/views/preference/LogrotateSettings.vue:25
 msgid "Interval"
 msgstr "فترة"
@@ -1551,12 +1581,12 @@ msgstr "فترة"
 msgid "Invalid"
 msgstr "غير صالح"
 
-#: src/constants/errors/backup.ts:42
+#: src/constants/errors/backup.ts:44
 #, fuzzy
 msgid "Invalid AES IV format: {0}"
 msgstr "رمز 2FA أو الاسترداد غير صالح"
 
-#: src/constants/errors/backup.ts:41
+#: src/constants/errors/backup.ts:43
 #, fuzzy
 msgid "Invalid AES key format: {0}"
 msgstr "رمز 2FA أو الاسترداد غير صالح"
@@ -1566,6 +1596,11 @@ msgstr "رمز 2FA أو الاسترداد غير صالح"
 msgid "Invalid file object"
 msgstr "اسم ملف غير صالح"
 
+#: src/constants/errors/backup.ts:51
+#, fuzzy
+msgid "Invalid file path: {0}"
+msgstr "رمز 2FA أو الاسترداد غير صالح"
+
 #: src/views/config/components/Rename.vue:64
 #: src/views/config/ConfigEditor.vue:250
 msgid "Invalid filename"
@@ -1580,7 +1615,7 @@ msgstr "اسم المجلد غير صالح"
 msgid "Invalid otp code"
 msgstr "رمز 2FA أو الاسترداد غير صالح"
 
-#: src/constants/errors/backup.ts:25
+#: src/constants/errors/backup.ts:27
 msgid "Invalid padding in decrypted data"
 msgstr ""
 
@@ -1598,7 +1633,7 @@ msgstr "رمز 2FA أو الاسترداد غير صالح"
 msgid "Invalid request format"
 msgstr "رمز 2FA أو الاسترداد غير صالح"
 
-#: src/constants/errors/backup.ts:40
+#: src/constants/errors/backup.ts:42
 #, fuzzy
 msgid "Invalid security token format"
 msgstr "رمز 2FA أو الاسترداد غير صالح"
@@ -1908,7 +1943,7 @@ msgstr ""
 msgid "Nginx conf not include stream-enabled"
 msgstr ""
 
-#: src/constants/errors/backup.ts:18
+#: src/constants/errors/backup.ts:19
 #, fuzzy
 msgid "Nginx config directory is not set"
 msgstr "قائمة السماح لمجلد سجلات Nginx"
@@ -1967,6 +2002,11 @@ msgstr "أمر إعادة تشغيل Nginx"
 msgid "Nginx restarted successfully"
 msgstr "تم إعادة تشغيل Nginx بنجاح"
 
+#: src/constants/errors/system.ts:2
+#, fuzzy
+msgid "Nginx UI already installed"
+msgstr "هذه القيمة مستخدمة مسبقا"
+
 #: src/views/system/Backup/SystemRestore.vue:88
 #, fuzzy
 msgid "Nginx UI configuration has been restored"
@@ -2163,7 +2203,7 @@ msgstr ""
 msgid "Password"
 msgstr "كلمة المرور"
 
-#: src/views/other/Install.vue:108
+#: src/views/other/Install.vue:141
 msgid "Password (*)"
 msgstr "كلمة المرور (*)"
 
@@ -2172,7 +2212,7 @@ msgstr "كلمة المرور (*)"
 msgid "Password incorrect"
 msgstr "اسم المستخدم أو كلمة المرور غير صحيحة"
 
-#: src/views/other/Install.vue:48
+#: src/views/other/Install.vue:70
 msgid "Password length cannot exceed 20 characters"
 msgstr ""
 
@@ -2272,15 +2312,15 @@ msgid ""
 "configuration."
 msgstr "يرجى إدخال الاسم، سيتم استخدامه كاسم الملف للتكوين الجديد."
 
-#: src/views/other/Install.vue:32
+#: src/views/other/Install.vue:54
 msgid "Please input your E-mail!"
 msgstr "يرجى إدخال بريدك الإلكتروني!"
 
-#: src/views/other/Install.vue:44 src/views/other/Login.vue:47
+#: src/views/other/Install.vue:66 src/views/other/Login.vue:47
 msgid "Please input your password!"
 msgstr "يرجى إدخال كلمة المرور الخاصة بك!"
 
-#: src/views/other/Install.vue:38 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:60 src/views/other/Login.vue:41
 msgid "Please input your username!"
 msgstr "يرجى إدخال اسم المستخدم الخاص بك!"
 
@@ -3023,7 +3063,7 @@ msgstr ""
 "سيتم فحص شهادة النطاق لمدة 30 دقيقة، وسيتم تجديدها إذا مر أكثر من أسبوع أو "
 "الفترة التي حددتها في الإعدادات منذ إصدارها الأخير."
 
-#: src/views/other/Install.vue:54
+#: src/views/other/Install.vue:76
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr "لا يمكن أن يحتوي اسم الملف على الأحرف التالية: %{c}"
 
@@ -3350,7 +3390,7 @@ msgstr ""
 msgid "Username"
 msgstr "اسم المستخدم"
 
-#: src/views/other/Install.vue:98
+#: src/views/other/Install.vue:131
 msgid "Username (*)"
 msgstr "اسم المستخدم (*)"
 

+ 93 - 53
app/src/language/de_DE/app.po

@@ -295,7 +295,7 @@ msgstr "Zurück"
 msgid "Backup file integrity check failed, it may have been tampered with"
 msgstr ""
 
-#: src/constants/errors/backup.ts:39
+#: src/constants/errors/backup.ts:41
 #, fuzzy
 msgid "Backup file not found: {0}"
 msgstr "File Not Found"
@@ -536,7 +536,7 @@ msgstr "Kommando"
 msgid "Comments"
 msgstr "Kom"
 
-#: src/constants/errors/backup.ts:13
+#: src/constants/errors/backup.ts:14
 #, fuzzy
 msgid "Config path is empty"
 msgstr "Konfigurationen"
@@ -691,7 +691,7 @@ msgstr ""
 msgid "Dashboard"
 msgstr "Übersicht"
 
-#: src/views/other/Install.vue:119
+#: src/views/other/Install.vue:152
 msgid "Database (Optional, default: database)"
 msgstr "Datenbank (Optional, Standard: database)"
 
@@ -1021,7 +1021,7 @@ msgstr "Seite bearbeiten"
 msgid "Email"
 msgstr "Email (*)"
 
-#: src/views/other/Install.vue:88
+#: src/views/other/Install.vue:121
 msgid "Email (*)"
 msgstr "Email (*)"
 
@@ -1169,37 +1169,42 @@ msgstr ""
 msgid "Failed to backup Nginx UI files: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:17
+#: src/constants/errors/backup.ts:18
 #, fuzzy
 msgid "Failed to calculate hash: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:53
+#: src/constants/errors/backup.ts:58
 msgid "Failed to calculate Nginx hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:52
+#: src/constants/errors/backup.ts:57
 msgid "Failed to calculate Nginx UI hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:14
+#: src/constants/errors/backup.ts:13
+#, fuzzy
+msgid "Failed to cleanup temporary directory: {0}"
+msgstr "Aktiviern von %{msg} fehlgeschlagen"
+
+#: src/constants/errors/backup.ts:15
 msgid "Failed to copy config file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:15
+#: src/constants/errors/backup.ts:16
 msgid "Failed to copy database directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:16
+#: src/constants/errors/backup.ts:17
 #, fuzzy
 msgid "Failed to copy database file: {0}"
 msgstr "Deaktivierung von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:30
+#: src/constants/errors/backup.ts:32
 msgid "Failed to copy file content: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:19
+#: src/constants/errors/backup.ts:20
 msgid "Failed to copy Nginx config directory: {0}"
 msgstr ""
 
@@ -1213,12 +1218,12 @@ msgstr "Aktiviern von %{msg} fehlgeschlagen"
 msgid "Failed to create backup file: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:44
+#: src/constants/errors/backup.ts:46
 #, fuzzy
 msgid "Failed to create directory: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:46
+#: src/constants/errors/backup.ts:48
 #, fuzzy
 msgid "Failed to create file: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
@@ -1228,15 +1233,20 @@ msgstr "Aktiviern von %{msg} fehlgeschlagen"
 msgid "Failed to create hash info file: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:45
+#: src/constants/errors/backup.ts:47
 #, fuzzy
 msgid "Failed to create parent directory: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:32
+#: src/constants/errors/backup.ts:34
 msgid "Failed to create restore directory: {0}"
 msgstr ""
 
+#: src/constants/errors/backup.ts:50
+#, fuzzy
+msgid "Failed to create symbolic link: {0}"
+msgstr "Aktiviern von %{msg} fehlgeschlagen"
+
 #: src/constants/errors/backup.ts:2
 #, fuzzy
 msgid "Failed to create temporary directory"
@@ -1252,36 +1262,36 @@ msgstr "Aktiviern von %{msg} fehlgeschlagen"
 msgid "Failed to create zip archive: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:27
+#: src/constants/errors/backup.ts:29
 #, fuzzy
 msgid "Failed to create zip entry: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:26
+#: src/constants/errors/backup.ts:28
 #, fuzzy
 msgid "Failed to create zip file: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:29
+#: src/constants/errors/backup.ts:31
 #, fuzzy
 msgid "Failed to create zip header: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:24
+#: src/constants/errors/backup.ts:26
 #, fuzzy
 msgid "Failed to decrypt data: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:49
+#: src/constants/errors/backup.ts:54
 #, fuzzy
 msgid "Failed to decrypt file: {0}"
 msgstr "Deaktivierung von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:35
+#: src/constants/errors/backup.ts:37
 msgid "Failed to decrypt Nginx directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:34
+#: src/constants/errors/backup.ts:36
 msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 
@@ -1299,12 +1309,12 @@ msgstr "Deaktivierung von %{msg} fehlgeschlagen"
 msgid "Failed to enable %{msg}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:23
+#: src/constants/errors/backup.ts:25
 #, fuzzy
 msgid "Failed to encrypt data: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:21
+#: src/constants/errors/backup.ts:23
 #, fuzzy
 msgid "Failed to encrypt file: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
@@ -1317,7 +1327,12 @@ msgstr ""
 msgid "Failed to encrypt Nginx UI directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:33
+#: src/constants/errors/backup.ts:52
+#, fuzzy
+msgid "Failed to evaluate symbolic links: {0}"
+msgstr "Aktiviern von %{msg} fehlgeschlagen"
+
+#: src/constants/errors/backup.ts:35
 #, fuzzy
 msgid "Failed to extract archive: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
@@ -1336,17 +1351,17 @@ msgstr "Fehler beim Abrufen von Zertifikatsinformationen"
 msgid "Failed to get certificate information"
 msgstr "Fehler beim Abrufen von Zertifikatsinformationen"
 
-#: src/constants/errors/backup.ts:28
+#: src/constants/errors/backup.ts:30
 #, fuzzy
 msgid "Failed to open source file: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:47
+#: src/constants/errors/backup.ts:49
 #, fuzzy
 msgid "Failed to open zip entry: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:43
+#: src/constants/errors/backup.ts:45
 #, fuzzy
 msgid "Failed to open zip file: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
@@ -1355,16 +1370,16 @@ msgstr "Aktiviern von %{msg} fehlgeschlagen"
 msgid "Failed to parse nginx.conf"
 msgstr ""
 
-#: src/constants/errors/backup.ts:48
+#: src/constants/errors/backup.ts:53
 msgid "Failed to read encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:20
+#: src/constants/errors/backup.ts:22
 #, fuzzy
 msgid "Failed to read file: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:51
+#: src/constants/errors/backup.ts:56
 msgid "Failed to read hash info file: {0}"
 msgstr ""
 
@@ -1372,11 +1387,16 @@ msgstr ""
 msgid "Failed to read nginx.conf"
 msgstr ""
 
-#: src/constants/errors/backup.ts:37
+#: src/constants/errors/backup.ts:21
+#, fuzzy
+msgid "Failed to read symlink: {0}"
+msgstr "Aktiviern von %{msg} fehlgeschlagen"
+
+#: src/constants/errors/backup.ts:39
 msgid "Failed to restore Nginx configs: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:38
+#: src/constants/errors/backup.ts:40
 msgid "Failed to restore Nginx UI files: {0}"
 msgstr ""
 
@@ -1386,20 +1406,20 @@ msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr ""
 "Fehler beim Speichern, Syntaxfehler wurden in der Konfiguration erkannt."
 
-#: src/constants/errors/backup.ts:36
+#: src/constants/errors/backup.ts:38
 #, fuzzy
 msgid "Failed to verify hashes: {0}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/constants/errors/backup.ts:50
+#: src/constants/errors/backup.ts:55
 msgid "Failed to write decrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:22
+#: src/constants/errors/backup.ts:24
 msgid "Failed to write encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:31
+#: src/constants/errors/backup.ts:33
 msgid "Failed to write to zip buffer: {0}"
 msgstr ""
 
@@ -1500,7 +1520,7 @@ msgstr "Hole das Zertifikat, bitte warten..."
 msgid "Github Proxy"
 msgstr ""
 
-#: src/constants/errors/backup.ts:54
+#: src/constants/errors/backup.ts:59
 msgid "Hash verification failed: file integrity compromised"
 msgstr ""
 
@@ -1590,15 +1610,25 @@ msgstr "Füge den Code aus der App ein:"
 msgid "Input the recovery code:"
 msgstr "Füge den Wiederherstellungscode ein:"
 
-#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:134
+#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:168
 msgid "Install"
 msgstr "Installieren"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:89
 #, fuzzy
 msgid "Install successfully"
 msgstr "Aktualisierung erfolgreich"
 
+#: src/constants/errors/system.ts:3
+msgid "Installation is not allowed after 10 minutes of system startup"
+msgstr ""
+
+#: src/views/other/Install.vue:113
+msgid ""
+"Installation is not allowed after 10 minutes of system startup, please "
+"restart the Nginx UI."
+msgstr ""
+
 #: src/views/preference/LogrotateSettings.vue:25
 msgid "Interval"
 msgstr "Intervall"
@@ -1608,11 +1638,11 @@ msgstr "Intervall"
 msgid "Invalid"
 msgstr "Ungültige E-Mail!"
 
-#: src/constants/errors/backup.ts:42
+#: src/constants/errors/backup.ts:44
 msgid "Invalid AES IV format: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:41
+#: src/constants/errors/backup.ts:43
 msgid "Invalid AES key format: {0}"
 msgstr ""
 
@@ -1621,6 +1651,11 @@ msgstr ""
 msgid "Invalid file object"
 msgstr "Ungültige E-Mail!"
 
+#: src/constants/errors/backup.ts:51
+#, fuzzy
+msgid "Invalid file path: {0}"
+msgstr "Ungültige E-Mail!"
+
 #: src/views/config/components/Rename.vue:64
 #: src/views/config/ConfigEditor.vue:250
 #, fuzzy
@@ -1636,7 +1671,7 @@ msgstr "Ungültiger Ordnername"
 msgid "Invalid otp code"
 msgstr "Ungültiger 2FA- oder Wiederherstellungscode"
 
-#: src/constants/errors/backup.ts:25
+#: src/constants/errors/backup.ts:27
 msgid "Invalid padding in decrypted data"
 msgstr ""
 
@@ -1653,7 +1688,7 @@ msgstr "Ungültiger 2FA- oder Wiederherstellungscode"
 msgid "Invalid request format"
 msgstr ""
 
-#: src/constants/errors/backup.ts:40
+#: src/constants/errors/backup.ts:42
 #, fuzzy
 msgid "Invalid security token format"
 msgstr "Ungültiger 2FA- oder Wiederherstellungscode"
@@ -1986,7 +2021,7 @@ msgstr ""
 msgid "Nginx conf not include stream-enabled"
 msgstr ""
 
-#: src/constants/errors/backup.ts:18
+#: src/constants/errors/backup.ts:19
 #, fuzzy
 msgid "Nginx config directory is not set"
 msgstr "Nginx-Log-Verzeichnis-Whitelist"
@@ -2049,6 +2084,11 @@ msgstr "Beffehl zum Neustarten von Nginx"
 msgid "Nginx restarted successfully"
 msgstr "Speichern erfolgreich"
 
+#: src/constants/errors/system.ts:2
+#, fuzzy
+msgid "Nginx UI already installed"
+msgstr "Dieser Wert ist bereits vergeben"
+
 #: src/views/system/Backup/SystemRestore.vue:88
 #, fuzzy
 msgid "Nginx UI configuration has been restored"
@@ -2252,7 +2292,7 @@ msgstr ""
 msgid "Password"
 msgstr "Passwort"
 
-#: src/views/other/Install.vue:108
+#: src/views/other/Install.vue:141
 msgid "Password (*)"
 msgstr "Passwort (*)"
 
@@ -2261,7 +2301,7 @@ msgstr "Passwort (*)"
 msgid "Password incorrect"
 msgstr "Benuztername oder Passwort ist falsch"
 
-#: src/views/other/Install.vue:48
+#: src/views/other/Install.vue:70
 msgid "Password length cannot exceed 20 characters"
 msgstr "Passwort darf nicht länger als 20 Zeichen sein"
 
@@ -2371,15 +2411,15 @@ msgstr ""
 "Bitte gib einen Namen ein, der als Dateiname der neuen Konfiguration "
 "verwendet wird."
 
-#: src/views/other/Install.vue:32
+#: src/views/other/Install.vue:54
 msgid "Please input your E-mail!"
 msgstr "Bitte gib deine E-Mail-Adresse ein!"
 
-#: src/views/other/Install.vue:44 src/views/other/Login.vue:47
+#: src/views/other/Install.vue:66 src/views/other/Login.vue:47
 msgid "Please input your password!"
 msgstr "Bitte gib dein Passwort ein!"
 
-#: src/views/other/Install.vue:38 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:60 src/views/other/Login.vue:41
 msgid "Please input your username!"
 msgstr "Bitte gib deinen Benutzernamen ein!"
 
@@ -3162,7 +3202,7 @@ msgstr ""
 "Das Zertifikat für die Domain wird alle Stunde überprüft und erneuert, wenn "
 "es seit der letzten Ausstellung vor mehr als 1 Monat ausgestellt wurde."
 
-#: src/views/other/Install.vue:54
+#: src/views/other/Install.vue:76
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr "Der Dateiname darf die folgenden Zeichen nicht enthalten: %{c}"
 
@@ -3495,7 +3535,7 @@ msgstr ""
 msgid "Username"
 msgstr "Benutzername"
 
-#: src/views/other/Install.vue:98
+#: src/views/other/Install.vue:131
 msgid "Username (*)"
 msgstr "Benutzername (*)"
 

+ 92 - 53
app/src/language/en/app.po

@@ -293,7 +293,7 @@ msgstr "Back"
 msgid "Backup file integrity check failed, it may have been tampered with"
 msgstr ""
 
-#: src/constants/errors/backup.ts:39
+#: src/constants/errors/backup.ts:41
 #, fuzzy
 msgid "Backup file not found: {0}"
 msgstr "File Not Found"
@@ -531,7 +531,7 @@ msgstr "Comments"
 msgid "Comments"
 msgstr "Comments"
 
-#: src/constants/errors/backup.ts:13
+#: src/constants/errors/backup.ts:14
 #, fuzzy
 msgid "Config path is empty"
 msgstr "Configurations"
@@ -683,7 +683,7 @@ msgstr ""
 msgid "Dashboard"
 msgstr "Dashboard"
 
-#: src/views/other/Install.vue:119
+#: src/views/other/Install.vue:152
 msgid "Database (Optional, default: database)"
 msgstr "Database (Optional, default: database)"
 
@@ -1008,7 +1008,7 @@ msgstr "Edit Site"
 msgid "Email"
 msgstr "Email (*)"
 
-#: src/views/other/Install.vue:88
+#: src/views/other/Install.vue:121
 msgid "Email (*)"
 msgstr "Email (*)"
 
@@ -1157,37 +1157,42 @@ msgstr "Failed to enable %{msg}"
 msgid "Failed to backup Nginx UI files: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:17
+#: src/constants/errors/backup.ts:18
 #, fuzzy
 msgid "Failed to calculate hash: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:53
+#: src/constants/errors/backup.ts:58
 msgid "Failed to calculate Nginx hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:52
+#: src/constants/errors/backup.ts:57
 msgid "Failed to calculate Nginx UI hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:14
+#: src/constants/errors/backup.ts:13
+#, fuzzy
+msgid "Failed to cleanup temporary directory: {0}"
+msgstr "Failed to enable %{msg}"
+
+#: src/constants/errors/backup.ts:15
 msgid "Failed to copy config file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:15
+#: src/constants/errors/backup.ts:16
 msgid "Failed to copy database directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:16
+#: src/constants/errors/backup.ts:17
 #, fuzzy
 msgid "Failed to copy database file: {0}"
 msgstr "Failed to disable %{msg}"
 
-#: src/constants/errors/backup.ts:30
+#: src/constants/errors/backup.ts:32
 msgid "Failed to copy file content: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:19
+#: src/constants/errors/backup.ts:20
 msgid "Failed to copy Nginx config directory: {0}"
 msgstr ""
 
@@ -1201,12 +1206,12 @@ msgstr "Failed to enable %{msg}"
 msgid "Failed to create backup file: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:44
+#: src/constants/errors/backup.ts:46
 #, fuzzy
 msgid "Failed to create directory: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:46
+#: src/constants/errors/backup.ts:48
 #, fuzzy
 msgid "Failed to create file: {0}"
 msgstr "Failed to enable %{msg}"
@@ -1216,15 +1221,20 @@ msgstr "Failed to enable %{msg}"
 msgid "Failed to create hash info file: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:45
+#: src/constants/errors/backup.ts:47
 #, fuzzy
 msgid "Failed to create parent directory: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:32
+#: src/constants/errors/backup.ts:34
 msgid "Failed to create restore directory: {0}"
 msgstr ""
 
+#: src/constants/errors/backup.ts:50
+#, fuzzy
+msgid "Failed to create symbolic link: {0}"
+msgstr "Failed to enable %{msg}"
+
 #: src/constants/errors/backup.ts:2
 #, fuzzy
 msgid "Failed to create temporary directory"
@@ -1240,36 +1250,36 @@ msgstr "Failed to enable %{msg}"
 msgid "Failed to create zip archive: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:27
+#: src/constants/errors/backup.ts:29
 #, fuzzy
 msgid "Failed to create zip entry: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:26
+#: src/constants/errors/backup.ts:28
 #, fuzzy
 msgid "Failed to create zip file: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:29
+#: src/constants/errors/backup.ts:31
 #, fuzzy
 msgid "Failed to create zip header: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:24
+#: src/constants/errors/backup.ts:26
 #, fuzzy
 msgid "Failed to decrypt data: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:49
+#: src/constants/errors/backup.ts:54
 #, fuzzy
 msgid "Failed to decrypt file: {0}"
 msgstr "Failed to disable %{msg}"
 
-#: src/constants/errors/backup.ts:35
+#: src/constants/errors/backup.ts:37
 msgid "Failed to decrypt Nginx directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:34
+#: src/constants/errors/backup.ts:36
 msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 
@@ -1287,12 +1297,12 @@ msgstr "Failed to disable %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:23
+#: src/constants/errors/backup.ts:25
 #, fuzzy
 msgid "Failed to encrypt data: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:21
+#: src/constants/errors/backup.ts:23
 #, fuzzy
 msgid "Failed to encrypt file: {0}"
 msgstr "Failed to enable %{msg}"
@@ -1305,7 +1315,12 @@ msgstr ""
 msgid "Failed to encrypt Nginx UI directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:33
+#: src/constants/errors/backup.ts:52
+#, fuzzy
+msgid "Failed to evaluate symbolic links: {0}"
+msgstr "Failed to enable %{msg}"
+
+#: src/constants/errors/backup.ts:35
 #, fuzzy
 msgid "Failed to extract archive: {0}"
 msgstr "Failed to enable %{msg}"
@@ -1325,17 +1340,17 @@ msgstr "Certificate is valid"
 msgid "Failed to get certificate information"
 msgstr "Certificate is valid"
 
-#: src/constants/errors/backup.ts:28
+#: src/constants/errors/backup.ts:30
 #, fuzzy
 msgid "Failed to open source file: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:47
+#: src/constants/errors/backup.ts:49
 #, fuzzy
 msgid "Failed to open zip entry: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:43
+#: src/constants/errors/backup.ts:45
 #, fuzzy
 msgid "Failed to open zip file: {0}"
 msgstr "Failed to enable %{msg}"
@@ -1344,17 +1359,17 @@ msgstr "Failed to enable %{msg}"
 msgid "Failed to parse nginx.conf"
 msgstr ""
 
-#: src/constants/errors/backup.ts:48
+#: src/constants/errors/backup.ts:53
 #, fuzzy
 msgid "Failed to read encrypted file: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:20
+#: src/constants/errors/backup.ts:22
 #, fuzzy
 msgid "Failed to read file: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:51
+#: src/constants/errors/backup.ts:56
 #, fuzzy
 msgid "Failed to read hash info file: {0}"
 msgstr "Failed to enable %{msg}"
@@ -1364,12 +1379,17 @@ msgstr "Failed to enable %{msg}"
 msgid "Failed to read nginx.conf"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:37
+#: src/constants/errors/backup.ts:21
+#, fuzzy
+msgid "Failed to read symlink: {0}"
+msgstr "Failed to enable %{msg}"
+
+#: src/constants/errors/backup.ts:39
 #, fuzzy
 msgid "Failed to restore Nginx configs: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:38
+#: src/constants/errors/backup.ts:40
 msgid "Failed to restore Nginx UI files: {0}"
 msgstr ""
 
@@ -1378,20 +1398,20 @@ msgstr ""
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr ""
 
-#: src/constants/errors/backup.ts:36
+#: src/constants/errors/backup.ts:38
 #, fuzzy
 msgid "Failed to verify hashes: {0}"
 msgstr "Failed to enable %{msg}"
 
-#: src/constants/errors/backup.ts:50
+#: src/constants/errors/backup.ts:55
 msgid "Failed to write decrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:22
+#: src/constants/errors/backup.ts:24
 msgid "Failed to write encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:31
+#: src/constants/errors/backup.ts:33
 msgid "Failed to write to zip buffer: {0}"
 msgstr ""
 
@@ -1489,7 +1509,7 @@ msgstr "Getting the certificate, please wait..."
 msgid "Github Proxy"
 msgstr ""
 
-#: src/constants/errors/backup.ts:54
+#: src/constants/errors/backup.ts:59
 msgid "Hash verification failed: file integrity compromised"
 msgstr ""
 
@@ -1572,15 +1592,25 @@ msgstr ""
 msgid "Input the recovery code:"
 msgstr ""
 
-#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:134
+#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:168
 msgid "Install"
 msgstr "Install"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:89
 #, fuzzy
 msgid "Install successfully"
 msgstr "Enabled successfully"
 
+#: src/constants/errors/system.ts:3
+msgid "Installation is not allowed after 10 minutes of system startup"
+msgstr ""
+
+#: src/views/other/Install.vue:113
+msgid ""
+"Installation is not allowed after 10 minutes of system startup, please "
+"restart the Nginx UI."
+msgstr ""
+
 #: src/views/preference/LogrotateSettings.vue:25
 msgid "Interval"
 msgstr ""
@@ -1590,12 +1620,12 @@ msgstr ""
 msgid "Invalid"
 msgstr "Invalid E-mail!"
 
-#: src/constants/errors/backup.ts:42
+#: src/constants/errors/backup.ts:44
 #, fuzzy
 msgid "Invalid AES IV format: {0}"
 msgstr "Invalid E-mail!"
 
-#: src/constants/errors/backup.ts:41
+#: src/constants/errors/backup.ts:43
 #, fuzzy
 msgid "Invalid AES key format: {0}"
 msgstr "Invalid E-mail!"
@@ -1605,6 +1635,11 @@ msgstr "Invalid E-mail!"
 msgid "Invalid file object"
 msgstr "Invalid E-mail!"
 
+#: src/constants/errors/backup.ts:51
+#, fuzzy
+msgid "Invalid file path: {0}"
+msgstr "Invalid E-mail!"
+
 #: src/views/config/components/Rename.vue:64
 #: src/views/config/ConfigEditor.vue:250
 #, fuzzy
@@ -1621,7 +1656,7 @@ msgstr "Invalid E-mail!"
 msgid "Invalid otp code"
 msgstr "Invalid E-mail!"
 
-#: src/constants/errors/backup.ts:25
+#: src/constants/errors/backup.ts:27
 msgid "Invalid padding in decrypted data"
 msgstr ""
 
@@ -1639,7 +1674,7 @@ msgstr "Invalid E-mail!"
 msgid "Invalid request format"
 msgstr "Invalid E-mail!"
 
-#: src/constants/errors/backup.ts:40
+#: src/constants/errors/backup.ts:42
 #, fuzzy
 msgid "Invalid security token format"
 msgstr "Invalid E-mail!"
@@ -1966,7 +2001,7 @@ msgstr ""
 msgid "Nginx conf not include stream-enabled"
 msgstr ""
 
-#: src/constants/errors/backup.ts:18
+#: src/constants/errors/backup.ts:19
 #, fuzzy
 msgid "Nginx config directory is not set"
 msgstr "Configuration Name"
@@ -2030,6 +2065,10 @@ msgstr ""
 msgid "Nginx restarted successfully"
 msgstr "Saved successfully"
 
+#: src/constants/errors/system.ts:2
+msgid "Nginx UI already installed"
+msgstr ""
+
 #: src/views/system/Backup/SystemRestore.vue:88
 #, fuzzy
 msgid "Nginx UI configuration has been restored"
@@ -2225,7 +2264,7 @@ msgstr ""
 msgid "Password"
 msgstr "Password"
 
-#: src/views/other/Install.vue:108
+#: src/views/other/Install.vue:141
 msgid "Password (*)"
 msgstr "Password (*)"
 
@@ -2234,7 +2273,7 @@ msgstr "Password (*)"
 msgid "Password incorrect"
 msgstr "Password"
 
-#: src/views/other/Install.vue:48
+#: src/views/other/Install.vue:70
 msgid "Password length cannot exceed 20 characters"
 msgstr ""
 
@@ -2333,15 +2372,15 @@ msgid ""
 "configuration."
 msgstr ""
 
-#: src/views/other/Install.vue:32
+#: src/views/other/Install.vue:54
 msgid "Please input your E-mail!"
 msgstr "Please input your E-mail!"
 
-#: src/views/other/Install.vue:44 src/views/other/Login.vue:47
+#: src/views/other/Install.vue:66 src/views/other/Login.vue:47
 msgid "Please input your password!"
 msgstr "Please input your password!"
 
-#: src/views/other/Install.vue:38 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:60 src/views/other/Login.vue:41
 msgid "Please input your username!"
 msgstr "Please input your username!"
 
@@ -3123,7 +3162,7 @@ msgstr ""
 "The certificate for the domain will be checked every hour, and will be "
 "renewed if it has been more than 1 month since it was last issued."
 
-#: src/views/other/Install.vue:54
+#: src/views/other/Install.vue:76
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr "The filename cannot contain the following characters: %{c}"
 
@@ -3433,7 +3472,7 @@ msgstr ""
 msgid "Username"
 msgstr "Username"
 
-#: src/views/other/Install.vue:98
+#: src/views/other/Install.vue:131
 msgid "Username (*)"
 msgstr "Username (*)"
 

+ 93 - 53
app/src/language/es/app.po

@@ -286,7 +286,7 @@ msgstr "Volver"
 msgid "Backup file integrity check failed, it may have been tampered with"
 msgstr ""
 
-#: src/constants/errors/backup.ts:39
+#: src/constants/errors/backup.ts:41
 #, fuzzy
 msgid "Backup file not found: {0}"
 msgstr "Archivo no Encontrado"
@@ -517,7 +517,7 @@ msgstr "Comando"
 msgid "Comments"
 msgstr "Comentarios"
 
-#: src/constants/errors/backup.ts:13
+#: src/constants/errors/backup.ts:14
 #, fuzzy
 msgid "Config path is empty"
 msgstr "Plantillas de configuración"
@@ -668,7 +668,7 @@ msgstr ""
 msgid "Dashboard"
 msgstr "Panel"
 
-#: src/views/other/Install.vue:119
+#: src/views/other/Install.vue:152
 msgid "Database (Optional, default: database)"
 msgstr "Base de datos (Opcional, default: database)"
 
@@ -980,7 +980,7 @@ msgstr "Editar Transmisión"
 msgid "Email"
 msgstr "Correo"
 
-#: src/views/other/Install.vue:88
+#: src/views/other/Install.vue:121
 msgid "Email (*)"
 msgstr "Correo (*)"
 
@@ -1123,37 +1123,42 @@ msgstr ""
 msgid "Failed to backup Nginx UI files: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:17
+#: src/constants/errors/backup.ts:18
 #, fuzzy
 msgid "Failed to calculate hash: {0}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/constants/errors/backup.ts:53
+#: src/constants/errors/backup.ts:58
 msgid "Failed to calculate Nginx hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:52
+#: src/constants/errors/backup.ts:57
 msgid "Failed to calculate Nginx UI hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:14
+#: src/constants/errors/backup.ts:13
+#, fuzzy
+msgid "Failed to cleanup temporary directory: {0}"
+msgstr "Error al habilitar %{msg}"
+
+#: src/constants/errors/backup.ts:15
 msgid "Failed to copy config file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:15
+#: src/constants/errors/backup.ts:16
 msgid "Failed to copy database directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:16
+#: src/constants/errors/backup.ts:17
 #, fuzzy
 msgid "Failed to copy database file: {0}"
 msgstr "Error al deshabilitar %{msg}"
 
-#: src/constants/errors/backup.ts:30
+#: src/constants/errors/backup.ts:32
 msgid "Failed to copy file content: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:19
+#: src/constants/errors/backup.ts:20
 msgid "Failed to copy Nginx config directory: {0}"
 msgstr ""
 
@@ -1167,12 +1172,12 @@ msgstr "Error al habilitar %{msg}"
 msgid "Failed to create backup file: {0}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/constants/errors/backup.ts:44
+#: src/constants/errors/backup.ts:46
 #, fuzzy
 msgid "Failed to create directory: {0}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/constants/errors/backup.ts:46
+#: src/constants/errors/backup.ts:48
 #, fuzzy
 msgid "Failed to create file: {0}"
 msgstr "Error al habilitar %{msg}"
@@ -1182,15 +1187,20 @@ msgstr "Error al habilitar %{msg}"
 msgid "Failed to create hash info file: {0}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/constants/errors/backup.ts:45
+#: src/constants/errors/backup.ts:47
 #, fuzzy
 msgid "Failed to create parent directory: {0}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/constants/errors/backup.ts:32
+#: src/constants/errors/backup.ts:34
 msgid "Failed to create restore directory: {0}"
 msgstr ""
 
+#: src/constants/errors/backup.ts:50
+#, fuzzy
+msgid "Failed to create symbolic link: {0}"
+msgstr "Error al habilitar %{msg}"
+
 #: src/constants/errors/backup.ts:2
 #, fuzzy
 msgid "Failed to create temporary directory"
@@ -1206,36 +1216,36 @@ msgstr "Error al habilitar %{msg}"
 msgid "Failed to create zip archive: {0}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/constants/errors/backup.ts:27
+#: src/constants/errors/backup.ts:29
 #, fuzzy
 msgid "Failed to create zip entry: {0}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/constants/errors/backup.ts:26
+#: src/constants/errors/backup.ts:28
 #, fuzzy
 msgid "Failed to create zip file: {0}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/constants/errors/backup.ts:29
+#: src/constants/errors/backup.ts:31
 #, fuzzy
 msgid "Failed to create zip header: {0}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/constants/errors/backup.ts:24
+#: src/constants/errors/backup.ts:26
 #, fuzzy
 msgid "Failed to decrypt data: {0}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/constants/errors/backup.ts:49
+#: src/constants/errors/backup.ts:54
 #, fuzzy
 msgid "Failed to decrypt file: {0}"
 msgstr "Error al deshabilitar %{msg}"
 
-#: src/constants/errors/backup.ts:35
+#: src/constants/errors/backup.ts:37
 msgid "Failed to decrypt Nginx directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:34
+#: src/constants/errors/backup.ts:36
 msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 
@@ -1253,12 +1263,12 @@ msgstr "Error al deshabilitar %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/constants/errors/backup.ts:23
+#: src/constants/errors/backup.ts:25
 #, fuzzy
 msgid "Failed to encrypt data: {0}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/constants/errors/backup.ts:21
+#: src/constants/errors/backup.ts:23
 #, fuzzy
 msgid "Failed to encrypt file: {0}"
 msgstr "Error al habilitar %{msg}"
@@ -1271,7 +1281,12 @@ msgstr ""
 msgid "Failed to encrypt Nginx UI directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:33
+#: src/constants/errors/backup.ts:52
+#, fuzzy
+msgid "Failed to evaluate symbolic links: {0}"
+msgstr "Error al habilitar %{msg}"
+
+#: src/constants/errors/backup.ts:35
 #, fuzzy
 msgid "Failed to extract archive: {0}"
 msgstr "Error al habilitar %{msg}"
@@ -1290,17 +1305,17 @@ msgstr "No se pudo obtener la información del certificado"
 msgid "Failed to get certificate information"
 msgstr "No se pudo obtener la información del certificado"
 
-#: src/constants/errors/backup.ts:28
+#: src/constants/errors/backup.ts:30
 #, fuzzy
 msgid "Failed to open source file: {0}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/constants/errors/backup.ts:47
+#: src/constants/errors/backup.ts:49
 #, fuzzy
 msgid "Failed to open zip entry: {0}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/constants/errors/backup.ts:43
+#: src/constants/errors/backup.ts:45
 #, fuzzy
 msgid "Failed to open zip file: {0}"
 msgstr "Error al habilitar %{msg}"
@@ -1309,16 +1324,16 @@ msgstr "Error al habilitar %{msg}"
 msgid "Failed to parse nginx.conf"
 msgstr ""
 
-#: src/constants/errors/backup.ts:48
+#: src/constants/errors/backup.ts:53
 msgid "Failed to read encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:20
+#: src/constants/errors/backup.ts:22
 #, fuzzy
 msgid "Failed to read file: {0}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/constants/errors/backup.ts:51
+#: src/constants/errors/backup.ts:56
 msgid "Failed to read hash info file: {0}"
 msgstr ""
 
@@ -1326,11 +1341,16 @@ msgstr ""
 msgid "Failed to read nginx.conf"
 msgstr ""
 
-#: src/constants/errors/backup.ts:37
+#: src/constants/errors/backup.ts:21
+#, fuzzy
+msgid "Failed to read symlink: {0}"
+msgstr "Error al habilitar %{msg}"
+
+#: src/constants/errors/backup.ts:39
 msgid "Failed to restore Nginx configs: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:38
+#: src/constants/errors/backup.ts:40
 msgid "Failed to restore Nginx UI files: {0}"
 msgstr ""
 
@@ -1340,20 +1360,20 @@ msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr ""
 "No se pudo guardar, se detectó un error(es) de sintaxis en la configuración."
 
-#: src/constants/errors/backup.ts:36
+#: src/constants/errors/backup.ts:38
 #, fuzzy
 msgid "Failed to verify hashes: {0}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/constants/errors/backup.ts:50
+#: src/constants/errors/backup.ts:55
 msgid "Failed to write decrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:22
+#: src/constants/errors/backup.ts:24
 msgid "Failed to write encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:31
+#: src/constants/errors/backup.ts:33
 msgid "Failed to write to zip buffer: {0}"
 msgstr ""
 
@@ -1450,7 +1470,7 @@ msgstr "Obteniendo el certificado, por favor espere..."
 msgid "Github Proxy"
 msgstr "Proxy Github"
 
-#: src/constants/errors/backup.ts:54
+#: src/constants/errors/backup.ts:59
 msgid "Hash verification failed: file integrity compromised"
 msgstr ""
 
@@ -1538,14 +1558,24 @@ msgstr "Ingrese el código de la aplicación:"
 msgid "Input the recovery code:"
 msgstr "Ingrese el código de recuperación:"
 
-#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:134
+#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:168
 msgid "Install"
 msgstr "Instalar"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:89
 msgid "Install successfully"
 msgstr "Instalación exitosa"
 
+#: src/constants/errors/system.ts:3
+msgid "Installation is not allowed after 10 minutes of system startup"
+msgstr ""
+
+#: src/views/other/Install.vue:113
+msgid ""
+"Installation is not allowed after 10 minutes of system startup, please "
+"restart the Nginx UI."
+msgstr ""
+
 #: src/views/preference/LogrotateSettings.vue:25
 msgid "Interval"
 msgstr "Intervalo"
@@ -1554,11 +1584,11 @@ msgstr "Intervalo"
 msgid "Invalid"
 msgstr "Inválido"
 
-#: src/constants/errors/backup.ts:42
+#: src/constants/errors/backup.ts:44
 msgid "Invalid AES IV format: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:41
+#: src/constants/errors/backup.ts:43
 msgid "Invalid AES key format: {0}"
 msgstr ""
 
@@ -1567,6 +1597,11 @@ msgstr ""
 msgid "Invalid file object"
 msgstr "Nombre de archivo inválido"
 
+#: src/constants/errors/backup.ts:51
+#, fuzzy
+msgid "Invalid file path: {0}"
+msgstr "Nombre de archivo inválido"
+
 #: src/views/config/components/Rename.vue:64
 #: src/views/config/ConfigEditor.vue:250
 msgid "Invalid filename"
@@ -1581,7 +1616,7 @@ msgstr "Nombre de carpeta inválido"
 msgid "Invalid otp code"
 msgstr "Código 2FA o de recuperación inválido"
 
-#: src/constants/errors/backup.ts:25
+#: src/constants/errors/backup.ts:27
 msgid "Invalid padding in decrypted data"
 msgstr ""
 
@@ -1598,7 +1633,7 @@ msgstr "Código 2FA o de recuperación inválido"
 msgid "Invalid request format"
 msgstr ""
 
-#: src/constants/errors/backup.ts:40
+#: src/constants/errors/backup.ts:42
 #, fuzzy
 msgid "Invalid security token format"
 msgstr "Código 2FA o de recuperación inválido"
@@ -1911,7 +1946,7 @@ msgstr ""
 msgid "Nginx conf not include stream-enabled"
 msgstr ""
 
-#: src/constants/errors/backup.ts:18
+#: src/constants/errors/backup.ts:19
 #, fuzzy
 msgid "Nginx config directory is not set"
 msgstr "Lista blanca de directorios de registro de Nginx"
@@ -1973,6 +2008,11 @@ msgstr "Comando de inicio de terminal"
 msgid "Nginx restarted successfully"
 msgstr "Nginx reiniciado con éxito"
 
+#: src/constants/errors/system.ts:2
+#, fuzzy
+msgid "Nginx UI already installed"
+msgstr "Este valor ya está elegido"
+
 #: src/views/system/Backup/SystemRestore.vue:88
 #, fuzzy
 msgid "Nginx UI configuration has been restored"
@@ -2172,7 +2212,7 @@ msgstr ""
 msgid "Password"
 msgstr "Contraseña"
 
-#: src/views/other/Install.vue:108
+#: src/views/other/Install.vue:141
 msgid "Password (*)"
 msgstr "Contraseña (*)"
 
@@ -2181,7 +2221,7 @@ msgstr "Contraseña (*)"
 msgid "Password incorrect"
 msgstr "El nombre de usuario o contraseña son incorrectos"
 
-#: src/views/other/Install.vue:48
+#: src/views/other/Install.vue:70
 msgid "Password length cannot exceed 20 characters"
 msgstr ""
 
@@ -2290,15 +2330,15 @@ msgstr ""
 "Ingrese el nombre por favor, este se usará como el nombre de archivo de la "
 "nueva configuración."
 
-#: src/views/other/Install.vue:32
+#: src/views/other/Install.vue:54
 msgid "Please input your E-mail!"
 msgstr "¡Por favor ingrese su correo electrónico!"
 
-#: src/views/other/Install.vue:44 src/views/other/Login.vue:47
+#: src/views/other/Install.vue:66 src/views/other/Login.vue:47
 msgid "Please input your password!"
 msgstr "¡Por favor ingrese su contraseña!"
 
-#: src/views/other/Install.vue:38 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:60 src/views/other/Login.vue:41
 msgid "Please input your username!"
 msgstr "¡Por favor ingrese su nombre de usuario!"
 
@@ -3055,7 +3095,7 @@ msgstr ""
 "renovado si ha pasado más de 1 semana o el período que configuró en ajustes "
 "desde que fue emitido por última vez."
 
-#: src/views/other/Install.vue:54
+#: src/views/other/Install.vue:76
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr ""
 "El nombre del archivo no puede contener los siguientes caracteres: %{c}"
@@ -3392,7 +3432,7 @@ msgstr ""
 msgid "Username"
 msgstr "Nombre de usuario"
 
-#: src/views/other/Install.vue:98
+#: src/views/other/Install.vue:131
 msgid "Username (*)"
 msgstr "Nombre de usuario (*)"
 

+ 92 - 53
app/src/language/fr_FR/app.po

@@ -298,7 +298,7 @@ msgstr "Retour"
 msgid "Backup file integrity check failed, it may have been tampered with"
 msgstr ""
 
-#: src/constants/errors/backup.ts:39
+#: src/constants/errors/backup.ts:41
 #, fuzzy
 msgid "Backup file not found: {0}"
 msgstr "Fichier introuvable"
@@ -542,7 +542,7 @@ msgstr "Commentaires"
 msgid "Comments"
 msgstr "Commentaires"
 
-#: src/constants/errors/backup.ts:13
+#: src/constants/errors/backup.ts:14
 #, fuzzy
 msgid "Config path is empty"
 msgstr "Modèles de configuration"
@@ -696,7 +696,7 @@ msgstr ""
 msgid "Dashboard"
 msgstr "Dashboard"
 
-#: src/views/other/Install.vue:119
+#: src/views/other/Install.vue:152
 msgid "Database (Optional, default: database)"
 msgstr "Base de données (Facultatif, par défaut : database)"
 
@@ -1025,7 +1025,7 @@ msgstr "Modifier le site"
 msgid "Email"
 msgstr "Email (*)"
 
-#: src/views/other/Install.vue:88
+#: src/views/other/Install.vue:121
 msgid "Email (*)"
 msgstr "Email (*)"
 
@@ -1175,37 +1175,42 @@ msgstr "Impossible d'activer %{msg}"
 msgid "Failed to backup Nginx UI files: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:17
+#: src/constants/errors/backup.ts:18
 #, fuzzy
 msgid "Failed to calculate hash: {0}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:53
+#: src/constants/errors/backup.ts:58
 msgid "Failed to calculate Nginx hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:52
+#: src/constants/errors/backup.ts:57
 msgid "Failed to calculate Nginx UI hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:14
+#: src/constants/errors/backup.ts:13
+#, fuzzy
+msgid "Failed to cleanup temporary directory: {0}"
+msgstr "Impossible d'activer %{msg}"
+
+#: src/constants/errors/backup.ts:15
 msgid "Failed to copy config file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:15
+#: src/constants/errors/backup.ts:16
 msgid "Failed to copy database directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:16
+#: src/constants/errors/backup.ts:17
 #, fuzzy
 msgid "Failed to copy database file: {0}"
 msgstr "Impossible de désactiver %{msg}"
 
-#: src/constants/errors/backup.ts:30
+#: src/constants/errors/backup.ts:32
 msgid "Failed to copy file content: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:19
+#: src/constants/errors/backup.ts:20
 msgid "Failed to copy Nginx config directory: {0}"
 msgstr ""
 
@@ -1219,12 +1224,12 @@ msgstr "Impossible d'activer %{msg}"
 msgid "Failed to create backup file: {0}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:44
+#: src/constants/errors/backup.ts:46
 #, fuzzy
 msgid "Failed to create directory: {0}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:46
+#: src/constants/errors/backup.ts:48
 #, fuzzy
 msgid "Failed to create file: {0}"
 msgstr "Impossible d'activer %{msg}"
@@ -1234,15 +1239,20 @@ msgstr "Impossible d'activer %{msg}"
 msgid "Failed to create hash info file: {0}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:45
+#: src/constants/errors/backup.ts:47
 #, fuzzy
 msgid "Failed to create parent directory: {0}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:32
+#: src/constants/errors/backup.ts:34
 msgid "Failed to create restore directory: {0}"
 msgstr ""
 
+#: src/constants/errors/backup.ts:50
+#, fuzzy
+msgid "Failed to create symbolic link: {0}"
+msgstr "Impossible d'activer %{msg}"
+
 #: src/constants/errors/backup.ts:2
 #, fuzzy
 msgid "Failed to create temporary directory"
@@ -1258,36 +1268,36 @@ msgstr "Impossible d'activer %{msg}"
 msgid "Failed to create zip archive: {0}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:27
+#: src/constants/errors/backup.ts:29
 #, fuzzy
 msgid "Failed to create zip entry: {0}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:26
+#: src/constants/errors/backup.ts:28
 #, fuzzy
 msgid "Failed to create zip file: {0}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:29
+#: src/constants/errors/backup.ts:31
 #, fuzzy
 msgid "Failed to create zip header: {0}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:24
+#: src/constants/errors/backup.ts:26
 #, fuzzy
 msgid "Failed to decrypt data: {0}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:49
+#: src/constants/errors/backup.ts:54
 #, fuzzy
 msgid "Failed to decrypt file: {0}"
 msgstr "Impossible de désactiver %{msg}"
 
-#: src/constants/errors/backup.ts:35
+#: src/constants/errors/backup.ts:37
 msgid "Failed to decrypt Nginx directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:34
+#: src/constants/errors/backup.ts:36
 msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 
@@ -1305,12 +1315,12 @@ msgstr "Impossible de désactiver %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:23
+#: src/constants/errors/backup.ts:25
 #, fuzzy
 msgid "Failed to encrypt data: {0}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:21
+#: src/constants/errors/backup.ts:23
 #, fuzzy
 msgid "Failed to encrypt file: {0}"
 msgstr "Impossible d'activer %{msg}"
@@ -1323,7 +1333,12 @@ msgstr ""
 msgid "Failed to encrypt Nginx UI directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:33
+#: src/constants/errors/backup.ts:52
+#, fuzzy
+msgid "Failed to evaluate symbolic links: {0}"
+msgstr "Impossible d'activer %{msg}"
+
+#: src/constants/errors/backup.ts:35
 #, fuzzy
 msgid "Failed to extract archive: {0}"
 msgstr "Impossible d'activer %{msg}"
@@ -1342,17 +1357,17 @@ msgstr "Échec de l'obtention des informations sur le certificat"
 msgid "Failed to get certificate information"
 msgstr "Échec de l'obtention des informations sur le certificat"
 
-#: src/constants/errors/backup.ts:28
+#: src/constants/errors/backup.ts:30
 #, fuzzy
 msgid "Failed to open source file: {0}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:47
+#: src/constants/errors/backup.ts:49
 #, fuzzy
 msgid "Failed to open zip entry: {0}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:43
+#: src/constants/errors/backup.ts:45
 #, fuzzy
 msgid "Failed to open zip file: {0}"
 msgstr "Impossible d'activer %{msg}"
@@ -1362,17 +1377,17 @@ msgstr "Impossible d'activer %{msg}"
 msgid "Failed to parse nginx.conf"
 msgstr "Erreur lecture nginx.conf"
 
-#: src/constants/errors/backup.ts:48
+#: src/constants/errors/backup.ts:53
 #, fuzzy
 msgid "Failed to read encrypted file: {0}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:20
+#: src/constants/errors/backup.ts:22
 #, fuzzy
 msgid "Failed to read file: {0}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:51
+#: src/constants/errors/backup.ts:56
 #, fuzzy
 msgid "Failed to read hash info file: {0}"
 msgstr "Impossible d'activer %{msg}"
@@ -1382,12 +1397,17 @@ msgstr "Impossible d'activer %{msg}"
 msgid "Failed to read nginx.conf"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:37
+#: src/constants/errors/backup.ts:21
+#, fuzzy
+msgid "Failed to read symlink: {0}"
+msgstr "Impossible d'activer %{msg}"
+
+#: src/constants/errors/backup.ts:39
 #, fuzzy
 msgid "Failed to restore Nginx configs: {0}"
 msgstr "Erreur lecture nginx.conf"
 
-#: src/constants/errors/backup.ts:38
+#: src/constants/errors/backup.ts:40
 #, fuzzy
 msgid "Failed to restore Nginx UI files: {0}"
 msgstr "Erreur lecture nginx.conf"
@@ -1399,20 +1419,20 @@ msgstr ""
 "Échec de l'enregistrement, une ou plusieurs erreurs de syntaxe ont été "
 "détectées dans la configuration."
 
-#: src/constants/errors/backup.ts:36
+#: src/constants/errors/backup.ts:38
 #, fuzzy
 msgid "Failed to verify hashes: {0}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/constants/errors/backup.ts:50
+#: src/constants/errors/backup.ts:55
 msgid "Failed to write decrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:22
+#: src/constants/errors/backup.ts:24
 msgid "Failed to write encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:31
+#: src/constants/errors/backup.ts:33
 msgid "Failed to write to zip buffer: {0}"
 msgstr ""
 
@@ -1510,7 +1530,7 @@ msgstr "Obtention du certificat, veuillez patienter..."
 msgid "Github Proxy"
 msgstr "Proxy Github"
 
-#: src/constants/errors/backup.ts:54
+#: src/constants/errors/backup.ts:59
 msgid "Hash verification failed: file integrity compromised"
 msgstr ""
 
@@ -1603,14 +1623,24 @@ msgstr "Entrez le code de l'application :"
 msgid "Input the recovery code:"
 msgstr "Entrez le code de récupération :"
 
-#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:134
+#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:168
 msgid "Install"
 msgstr "Installer"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:89
 msgid "Install successfully"
 msgstr "Installé avec succès"
 
+#: src/constants/errors/system.ts:3
+msgid "Installation is not allowed after 10 minutes of system startup"
+msgstr ""
+
+#: src/views/other/Install.vue:113
+msgid ""
+"Installation is not allowed after 10 minutes of system startup, please "
+"restart the Nginx UI."
+msgstr ""
+
 #: src/views/preference/LogrotateSettings.vue:25
 msgid "Interval"
 msgstr ""
@@ -1619,12 +1649,12 @@ msgstr ""
 msgid "Invalid"
 msgstr "Invalide"
 
-#: src/constants/errors/backup.ts:42
+#: src/constants/errors/backup.ts:44
 #, fuzzy
 msgid "Invalid AES IV format: {0}"
 msgstr "Format de la requête invalide"
 
-#: src/constants/errors/backup.ts:41
+#: src/constants/errors/backup.ts:43
 #, fuzzy
 msgid "Invalid AES key format: {0}"
 msgstr "Format de la requête invalide"
@@ -1634,6 +1664,11 @@ msgstr "Format de la requête invalide"
 msgid "Invalid file object"
 msgstr "Nom de fichier invalide"
 
+#: src/constants/errors/backup.ts:51
+#, fuzzy
+msgid "Invalid file path: {0}"
+msgstr "Format de la requête invalide"
+
 #: src/views/config/components/Rename.vue:64
 #: src/views/config/ConfigEditor.vue:250
 msgid "Invalid filename"
@@ -1647,7 +1682,7 @@ msgstr "Nom du répertoire invalide"
 msgid "Invalid otp code"
 msgstr "Code otp invalide"
 
-#: src/constants/errors/backup.ts:25
+#: src/constants/errors/backup.ts:27
 msgid "Invalid padding in decrypted data"
 msgstr ""
 
@@ -1664,7 +1699,7 @@ msgstr "Code de récupération invalide"
 msgid "Invalid request format"
 msgstr "Format de la requête invalide"
 
-#: src/constants/errors/backup.ts:40
+#: src/constants/errors/backup.ts:42
 #, fuzzy
 msgid "Invalid security token format"
 msgstr "Format de la requête invalide"
@@ -1993,7 +2028,7 @@ msgstr ""
 msgid "Nginx conf not include stream-enabled"
 msgstr ""
 
-#: src/constants/errors/backup.ts:18
+#: src/constants/errors/backup.ts:19
 #, fuzzy
 msgid "Nginx config directory is not set"
 msgstr "Erreur d'analyse de configuration Nginx"
@@ -2057,6 +2092,10 @@ msgstr "Commande de démarrage du terminal"
 msgid "Nginx restarted successfully"
 msgstr "Nginx a redémarré avec succès"
 
+#: src/constants/errors/system.ts:2
+msgid "Nginx UI already installed"
+msgstr ""
+
 #: src/views/system/Backup/SystemRestore.vue:88
 #, fuzzy
 msgid "Nginx UI configuration has been restored"
@@ -2249,7 +2288,7 @@ msgstr ""
 msgid "Password"
 msgstr "Mot de passe"
 
-#: src/views/other/Install.vue:108
+#: src/views/other/Install.vue:141
 msgid "Password (*)"
 msgstr "Mot de passe (*)"
 
@@ -2258,7 +2297,7 @@ msgstr "Mot de passe (*)"
 msgid "Password incorrect"
 msgstr "Le pseudo ou mot de passe est incorect"
 
-#: src/views/other/Install.vue:48
+#: src/views/other/Install.vue:70
 msgid "Password length cannot exceed 20 characters"
 msgstr ""
 
@@ -2363,15 +2402,15 @@ msgstr ""
 "Veuillez entrer le nom, il sera utilisé comme nom de fichier de la nouvelle "
 "configuration."
 
-#: src/views/other/Install.vue:32
+#: src/views/other/Install.vue:54
 msgid "Please input your E-mail!"
 msgstr "Veuillez saisir votre e-mail !"
 
-#: src/views/other/Install.vue:44 src/views/other/Login.vue:47
+#: src/views/other/Install.vue:66 src/views/other/Login.vue:47
 msgid "Please input your password!"
 msgstr "Veuillez saisir votre mot de passe !"
 
-#: src/views/other/Install.vue:38 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:60 src/views/other/Login.vue:41
 msgid "Please input your username!"
 msgstr "Veuillez saisir votre nom d'utilisateur !"
 
@@ -3155,7 +3194,7 @@ msgstr ""
 "Le certificat du domaine sera vérifié toutes les heures et sera renouvelé "
 "s'il s'est écoulé plus d'une semaine depuis sa dernière émission."
 
-#: src/views/other/Install.vue:54
+#: src/views/other/Install.vue:76
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr "Le nom de fichier ne peut pas contenir les caractères suivants : %{c}"
 
@@ -3470,7 +3509,7 @@ msgstr ""
 msgid "Username"
 msgstr "Nom d'utilisateur"
 
-#: src/views/other/Install.vue:98
+#: src/views/other/Install.vue:131
 msgid "Username (*)"
 msgstr "Nom d'utilisateur (*)"
 

+ 92 - 53
app/src/language/ko_KR/app.po

@@ -283,7 +283,7 @@ msgstr "뒤로"
 msgid "Backup file integrity check failed, it may have been tampered with"
 msgstr ""
 
-#: src/constants/errors/backup.ts:39
+#: src/constants/errors/backup.ts:41
 #, fuzzy
 msgid "Backup file not found: {0}"
 msgstr "파일을 찾을 수 없음"
@@ -514,7 +514,7 @@ msgstr "명령어"
 msgid "Comments"
 msgstr "댓글"
 
-#: src/constants/errors/backup.ts:13
+#: src/constants/errors/backup.ts:14
 #, fuzzy
 msgid "Config path is empty"
 msgstr "구성 템플릿"
@@ -664,7 +664,7 @@ msgstr ""
 msgid "Dashboard"
 msgstr "대시보드"
 
-#: src/views/other/Install.vue:119
+#: src/views/other/Install.vue:152
 msgid "Database (Optional, default: database)"
 msgstr "데이터베이스 (선택사항, 기본값: database)"
 
@@ -977,7 +977,7 @@ msgstr "스트림 편집"
 msgid "Email"
 msgstr "이메일 (*)"
 
-#: src/views/other/Install.vue:88
+#: src/views/other/Install.vue:121
 msgid "Email (*)"
 msgstr "이메일 (*)"
 
@@ -1124,37 +1124,42 @@ msgstr ""
 msgid "Failed to backup Nginx UI files: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:17
+#: src/constants/errors/backup.ts:18
 #, fuzzy
 msgid "Failed to calculate hash: {0}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/constants/errors/backup.ts:53
+#: src/constants/errors/backup.ts:58
 msgid "Failed to calculate Nginx hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:52
+#: src/constants/errors/backup.ts:57
 msgid "Failed to calculate Nginx UI hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:14
+#: src/constants/errors/backup.ts:13
+#, fuzzy
+msgid "Failed to cleanup temporary directory: {0}"
+msgstr "%{msg} 활성화 실패"
+
+#: src/constants/errors/backup.ts:15
 msgid "Failed to copy config file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:15
+#: src/constants/errors/backup.ts:16
 msgid "Failed to copy database directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:16
+#: src/constants/errors/backup.ts:17
 #, fuzzy
 msgid "Failed to copy database file: {0}"
 msgstr "%{msg} 비활성화 실패"
 
-#: src/constants/errors/backup.ts:30
+#: src/constants/errors/backup.ts:32
 msgid "Failed to copy file content: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:19
+#: src/constants/errors/backup.ts:20
 msgid "Failed to copy Nginx config directory: {0}"
 msgstr ""
 
@@ -1168,12 +1173,12 @@ msgstr "%{msg} 활성화 실패"
 msgid "Failed to create backup file: {0}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/constants/errors/backup.ts:44
+#: src/constants/errors/backup.ts:46
 #, fuzzy
 msgid "Failed to create directory: {0}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/constants/errors/backup.ts:46
+#: src/constants/errors/backup.ts:48
 #, fuzzy
 msgid "Failed to create file: {0}"
 msgstr "%{msg} 활성화 실패"
@@ -1183,15 +1188,20 @@ msgstr "%{msg} 활성화 실패"
 msgid "Failed to create hash info file: {0}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/constants/errors/backup.ts:45
+#: src/constants/errors/backup.ts:47
 #, fuzzy
 msgid "Failed to create parent directory: {0}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/constants/errors/backup.ts:32
+#: src/constants/errors/backup.ts:34
 msgid "Failed to create restore directory: {0}"
 msgstr ""
 
+#: src/constants/errors/backup.ts:50
+#, fuzzy
+msgid "Failed to create symbolic link: {0}"
+msgstr "%{msg} 활성화 실패"
+
 #: src/constants/errors/backup.ts:2
 #, fuzzy
 msgid "Failed to create temporary directory"
@@ -1207,36 +1217,36 @@ msgstr "%{msg} 활성화 실패"
 msgid "Failed to create zip archive: {0}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/constants/errors/backup.ts:27
+#: src/constants/errors/backup.ts:29
 #, fuzzy
 msgid "Failed to create zip entry: {0}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/constants/errors/backup.ts:26
+#: src/constants/errors/backup.ts:28
 #, fuzzy
 msgid "Failed to create zip file: {0}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/constants/errors/backup.ts:29
+#: src/constants/errors/backup.ts:31
 #, fuzzy
 msgid "Failed to create zip header: {0}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/constants/errors/backup.ts:24
+#: src/constants/errors/backup.ts:26
 #, fuzzy
 msgid "Failed to decrypt data: {0}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/constants/errors/backup.ts:49
+#: src/constants/errors/backup.ts:54
 #, fuzzy
 msgid "Failed to decrypt file: {0}"
 msgstr "%{msg} 비활성화 실패"
 
-#: src/constants/errors/backup.ts:35
+#: src/constants/errors/backup.ts:37
 msgid "Failed to decrypt Nginx directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:34
+#: src/constants/errors/backup.ts:36
 msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 
@@ -1254,12 +1264,12 @@ msgstr "%{msg} 비활성화 실패"
 msgid "Failed to enable %{msg}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/constants/errors/backup.ts:23
+#: src/constants/errors/backup.ts:25
 #, fuzzy
 msgid "Failed to encrypt data: {0}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/constants/errors/backup.ts:21
+#: src/constants/errors/backup.ts:23
 #, fuzzy
 msgid "Failed to encrypt file: {0}"
 msgstr "%{msg} 활성화 실패"
@@ -1272,7 +1282,12 @@ msgstr ""
 msgid "Failed to encrypt Nginx UI directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:33
+#: src/constants/errors/backup.ts:52
+#, fuzzy
+msgid "Failed to evaluate symbolic links: {0}"
+msgstr "%{msg} 활성화 실패"
+
+#: src/constants/errors/backup.ts:35
 #, fuzzy
 msgid "Failed to extract archive: {0}"
 msgstr "%{msg} 활성화 실패"
@@ -1291,17 +1306,17 @@ msgstr "인증서 정보 가져오기 실패"
 msgid "Failed to get certificate information"
 msgstr "인증서 정보 가져오기 실패"
 
-#: src/constants/errors/backup.ts:28
+#: src/constants/errors/backup.ts:30
 #, fuzzy
 msgid "Failed to open source file: {0}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/constants/errors/backup.ts:47
+#: src/constants/errors/backup.ts:49
 #, fuzzy
 msgid "Failed to open zip entry: {0}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/constants/errors/backup.ts:43
+#: src/constants/errors/backup.ts:45
 #, fuzzy
 msgid "Failed to open zip file: {0}"
 msgstr "%{msg} 활성화 실패"
@@ -1310,16 +1325,16 @@ msgstr "%{msg} 활성화 실패"
 msgid "Failed to parse nginx.conf"
 msgstr ""
 
-#: src/constants/errors/backup.ts:48
+#: src/constants/errors/backup.ts:53
 msgid "Failed to read encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:20
+#: src/constants/errors/backup.ts:22
 #, fuzzy
 msgid "Failed to read file: {0}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/constants/errors/backup.ts:51
+#: src/constants/errors/backup.ts:56
 msgid "Failed to read hash info file: {0}"
 msgstr ""
 
@@ -1327,11 +1342,16 @@ msgstr ""
 msgid "Failed to read nginx.conf"
 msgstr ""
 
-#: src/constants/errors/backup.ts:37
+#: src/constants/errors/backup.ts:21
+#, fuzzy
+msgid "Failed to read symlink: {0}"
+msgstr "%{msg} 활성화 실패"
+
+#: src/constants/errors/backup.ts:39
 msgid "Failed to restore Nginx configs: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:38
+#: src/constants/errors/backup.ts:40
 msgid "Failed to restore Nginx UI files: {0}"
 msgstr ""
 
@@ -1340,20 +1360,20 @@ msgstr ""
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "저장 실패, 구성에서 구문 오류가 감지되었습니다."
 
-#: src/constants/errors/backup.ts:36
+#: src/constants/errors/backup.ts:38
 #, fuzzy
 msgid "Failed to verify hashes: {0}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/constants/errors/backup.ts:50
+#: src/constants/errors/backup.ts:55
 msgid "Failed to write decrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:22
+#: src/constants/errors/backup.ts:24
 msgid "Failed to write encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:31
+#: src/constants/errors/backup.ts:33
 msgid "Failed to write to zip buffer: {0}"
 msgstr ""
 
@@ -1450,7 +1470,7 @@ msgstr "인증서를 가져오는 중입니다. 잠시 기다려 주세요..."
 msgid "Github Proxy"
 msgstr "Github 프록시"
 
-#: src/constants/errors/backup.ts:54
+#: src/constants/errors/backup.ts:59
 msgid "Hash verification failed: file integrity compromised"
 msgstr ""
 
@@ -1533,15 +1553,25 @@ msgstr ""
 msgid "Input the recovery code:"
 msgstr ""
 
-#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:134
+#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:168
 msgid "Install"
 msgstr "설치"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:89
 #, fuzzy
 msgid "Install successfully"
 msgstr "성공적으로 활성화됨"
 
+#: src/constants/errors/system.ts:3
+msgid "Installation is not allowed after 10 minutes of system startup"
+msgstr ""
+
+#: src/views/other/Install.vue:113
+msgid ""
+"Installation is not allowed after 10 minutes of system startup, please "
+"restart the Nginx UI."
+msgstr ""
+
 #: src/views/preference/LogrotateSettings.vue:25
 msgid "Interval"
 msgstr "간격"
@@ -1551,11 +1581,11 @@ msgstr "간격"
 msgid "Invalid"
 msgstr "유효함"
 
-#: src/constants/errors/backup.ts:42
+#: src/constants/errors/backup.ts:44
 msgid "Invalid AES IV format: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:41
+#: src/constants/errors/backup.ts:43
 msgid "Invalid AES key format: {0}"
 msgstr ""
 
@@ -1564,6 +1594,11 @@ msgstr ""
 msgid "Invalid file object"
 msgstr "Invalid E-mail!"
 
+#: src/constants/errors/backup.ts:51
+#, fuzzy
+msgid "Invalid file path: {0}"
+msgstr "Invalid E-mail!"
+
 #: src/views/config/components/Rename.vue:64
 #: src/views/config/ConfigEditor.vue:250
 #, fuzzy
@@ -1579,7 +1614,7 @@ msgstr ""
 msgid "Invalid otp code"
 msgstr "유효함"
 
-#: src/constants/errors/backup.ts:25
+#: src/constants/errors/backup.ts:27
 msgid "Invalid padding in decrypted data"
 msgstr ""
 
@@ -1595,7 +1630,7 @@ msgstr ""
 msgid "Invalid request format"
 msgstr ""
 
-#: src/constants/errors/backup.ts:40
+#: src/constants/errors/backup.ts:42
 msgid "Invalid security token format"
 msgstr ""
 
@@ -1925,7 +1960,7 @@ msgstr ""
 msgid "Nginx conf not include stream-enabled"
 msgstr ""
 
-#: src/constants/errors/backup.ts:18
+#: src/constants/errors/backup.ts:19
 #, fuzzy
 msgid "Nginx config directory is not set"
 msgstr "Nginx 구성 오류름"
@@ -1990,6 +2025,10 @@ msgstr "터미널 시작 명령"
 msgid "Nginx restarted successfully"
 msgstr "Nginx가 성공적으로 재시작됨"
 
+#: src/constants/errors/system.ts:2
+msgid "Nginx UI already installed"
+msgstr ""
+
 #: src/views/system/Backup/SystemRestore.vue:88
 #, fuzzy
 msgid "Nginx UI configuration has been restored"
@@ -2183,7 +2222,7 @@ msgstr ""
 msgid "Password"
 msgstr "비밀번호"
 
-#: src/views/other/Install.vue:108
+#: src/views/other/Install.vue:141
 msgid "Password (*)"
 msgstr "비밀번호 (*)"
 
@@ -2192,7 +2231,7 @@ msgstr "비밀번호 (*)"
 msgid "Password incorrect"
 msgstr "사용자 이름 또는 비밀번호가 올바르지 않습니다"
 
-#: src/views/other/Install.vue:48
+#: src/views/other/Install.vue:70
 msgid "Password length cannot exceed 20 characters"
 msgstr ""
 
@@ -2293,15 +2332,15 @@ msgid ""
 "configuration."
 msgstr "이름을 입력해주세요, 이것은 새 구성의 파일 이름으로 사용될 것입니다!"
 
-#: src/views/other/Install.vue:32
+#: src/views/other/Install.vue:54
 msgid "Please input your E-mail!"
 msgstr "이메일을 입력해주세요!"
 
-#: src/views/other/Install.vue:44 src/views/other/Login.vue:47
+#: src/views/other/Install.vue:66 src/views/other/Login.vue:47
 msgid "Please input your password!"
 msgstr "비밀번호를 입력해주세요!"
 
-#: src/views/other/Install.vue:38 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:60 src/views/other/Login.vue:41
 msgid "Please input your username!"
 msgstr "사용자 이름을 입력해주세요!"
 
@@ -3081,7 +3120,7 @@ msgstr ""
 "도메인의 인증서는 매 시간 확인되며,마지막으로 발급된 지 1개월이 경과한 경우 "
 "갱신됩니다."
 
-#: src/views/other/Install.vue:54
+#: src/views/other/Install.vue:76
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr "파일 이름은 다음 문자를 포함할 수 없습니다: %{c}"
 
@@ -3394,7 +3433,7 @@ msgstr ""
 msgid "Username"
 msgstr "사용자 이름"
 
-#: src/views/other/Install.vue:98
+#: src/views/other/Install.vue:131
 msgid "Username (*)"
 msgstr "사용자 이름 (*)"
 

+ 85 - 53
app/src/language/messages.pot

@@ -270,7 +270,7 @@ msgstr ""
 msgid "Backup file integrity check failed, it may have been tampered with"
 msgstr ""
 
-#: src/constants/errors/backup.ts:39
+#: src/constants/errors/backup.ts:41
 msgid "Backup file not found: {0}"
 msgstr ""
 
@@ -488,7 +488,7 @@ msgstr ""
 msgid "Comments"
 msgstr ""
 
-#: src/constants/errors/backup.ts:13
+#: src/constants/errors/backup.ts:14
 msgid "Config path is empty"
 msgstr ""
 
@@ -633,7 +633,7 @@ msgstr ""
 msgid "Dashboard"
 msgstr ""
 
-#: src/views/other/Install.vue:119
+#: src/views/other/Install.vue:152
 msgid "Database (Optional, default: database)"
 msgstr ""
 
@@ -932,7 +932,7 @@ msgstr ""
 msgid "Email"
 msgstr ""
 
-#: src/views/other/Install.vue:88
+#: src/views/other/Install.vue:121
 msgid "Email (*)"
 msgstr ""
 
@@ -1071,35 +1071,39 @@ msgstr ""
 msgid "Failed to backup Nginx UI files: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:17
+#: src/constants/errors/backup.ts:18
 msgid "Failed to calculate hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:53
+#: src/constants/errors/backup.ts:58
 msgid "Failed to calculate Nginx hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:52
+#: src/constants/errors/backup.ts:57
 msgid "Failed to calculate Nginx UI hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:14
-msgid "Failed to copy config file: {0}"
+#: src/constants/errors/backup.ts:13
+msgid "Failed to cleanup temporary directory: {0}"
 msgstr ""
 
 #: src/constants/errors/backup.ts:15
-msgid "Failed to copy database directory: {0}"
+msgid "Failed to copy config file: {0}"
 msgstr ""
 
 #: src/constants/errors/backup.ts:16
+msgid "Failed to copy database directory: {0}"
+msgstr ""
+
+#: src/constants/errors/backup.ts:17
 msgid "Failed to copy database file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:30
+#: src/constants/errors/backup.ts:32
 msgid "Failed to copy file content: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:19
+#: src/constants/errors/backup.ts:20
 msgid "Failed to copy Nginx config directory: {0}"
 msgstr ""
 
@@ -1111,11 +1115,11 @@ msgstr ""
 msgid "Failed to create backup file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:44
+#: src/constants/errors/backup.ts:46
 msgid "Failed to create directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:46
+#: src/constants/errors/backup.ts:48
 msgid "Failed to create file: {0}"
 msgstr ""
 
@@ -1123,14 +1127,18 @@ msgstr ""
 msgid "Failed to create hash info file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:45
+#: src/constants/errors/backup.ts:47
 msgid "Failed to create parent directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:32
+#: src/constants/errors/backup.ts:34
 msgid "Failed to create restore directory: {0}"
 msgstr ""
 
+#: src/constants/errors/backup.ts:50
+msgid "Failed to create symbolic link: {0}"
+msgstr ""
+
 #: src/constants/errors/backup.ts:2
 msgid "Failed to create temporary directory"
 msgstr ""
@@ -1143,31 +1151,31 @@ msgstr ""
 msgid "Failed to create zip archive: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:27
+#: src/constants/errors/backup.ts:29
 msgid "Failed to create zip entry: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:26
+#: src/constants/errors/backup.ts:28
 msgid "Failed to create zip file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:29
+#: src/constants/errors/backup.ts:31
 msgid "Failed to create zip header: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:24
+#: src/constants/errors/backup.ts:26
 msgid "Failed to decrypt data: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:49
+#: src/constants/errors/backup.ts:54
 msgid "Failed to decrypt file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:35
+#: src/constants/errors/backup.ts:37
 msgid "Failed to decrypt Nginx directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:34
+#: src/constants/errors/backup.ts:36
 msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 
@@ -1185,11 +1193,11 @@ msgstr ""
 msgid "Failed to enable %{msg}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:23
+#: src/constants/errors/backup.ts:25
 msgid "Failed to encrypt data: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:21
+#: src/constants/errors/backup.ts:23
 msgid "Failed to encrypt file: {0}"
 msgstr ""
 
@@ -1201,7 +1209,11 @@ msgstr ""
 msgid "Failed to encrypt Nginx UI directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:33
+#: src/constants/errors/backup.ts:52
+msgid "Failed to evaluate symbolic links: {0}"
+msgstr ""
+
+#: src/constants/errors/backup.ts:35
 msgid "Failed to extract archive: {0}"
 msgstr ""
 
@@ -1217,15 +1229,15 @@ msgstr ""
 msgid "Failed to get certificate information"
 msgstr ""
 
-#: src/constants/errors/backup.ts:28
+#: src/constants/errors/backup.ts:30
 msgid "Failed to open source file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:47
+#: src/constants/errors/backup.ts:49
 msgid "Failed to open zip entry: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:43
+#: src/constants/errors/backup.ts:45
 msgid "Failed to open zip file: {0}"
 msgstr ""
 
@@ -1233,15 +1245,15 @@ msgstr ""
 msgid "Failed to parse nginx.conf"
 msgstr ""
 
-#: src/constants/errors/backup.ts:48
+#: src/constants/errors/backup.ts:53
 msgid "Failed to read encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:20
+#: src/constants/errors/backup.ts:22
 msgid "Failed to read file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:51
+#: src/constants/errors/backup.ts:56
 msgid "Failed to read hash info file: {0}"
 msgstr ""
 
@@ -1249,11 +1261,15 @@ msgstr ""
 msgid "Failed to read nginx.conf"
 msgstr ""
 
-#: src/constants/errors/backup.ts:37
+#: src/constants/errors/backup.ts:21
+msgid "Failed to read symlink: {0}"
+msgstr ""
+
+#: src/constants/errors/backup.ts:39
 msgid "Failed to restore Nginx configs: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:38
+#: src/constants/errors/backup.ts:40
 msgid "Failed to restore Nginx UI files: {0}"
 msgstr ""
 
@@ -1262,19 +1278,19 @@ msgstr ""
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr ""
 
-#: src/constants/errors/backup.ts:36
+#: src/constants/errors/backup.ts:38
 msgid "Failed to verify hashes: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:50
+#: src/constants/errors/backup.ts:55
 msgid "Failed to write decrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:22
+#: src/constants/errors/backup.ts:24
 msgid "Failed to write encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:31
+#: src/constants/errors/backup.ts:33
 msgid "Failed to write to zip buffer: {0}"
 msgstr ""
 
@@ -1366,7 +1382,7 @@ msgstr ""
 msgid "Github Proxy"
 msgstr ""
 
-#: src/constants/errors/backup.ts:54
+#: src/constants/errors/backup.ts:59
 msgid "Hash verification failed: file integrity compromised"
 msgstr ""
 
@@ -1446,14 +1462,22 @@ msgid "Input the recovery code:"
 msgstr ""
 
 #: src/routes/modules/auth.ts:8
-#: src/views/other/Install.vue:134
+#: src/views/other/Install.vue:168
 msgid "Install"
 msgstr ""
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:89
 msgid "Install successfully"
 msgstr ""
 
+#: src/constants/errors/system.ts:3
+msgid "Installation is not allowed after 10 minutes of system startup"
+msgstr ""
+
+#: src/views/other/Install.vue:113
+msgid "Installation is not allowed after 10 minutes of system startup, please restart the Nginx UI."
+msgstr ""
+
 #: src/views/preference/LogrotateSettings.vue:25
 msgid "Interval"
 msgstr ""
@@ -1462,11 +1486,11 @@ msgstr ""
 msgid "Invalid"
 msgstr ""
 
-#: src/constants/errors/backup.ts:42
+#: src/constants/errors/backup.ts:44
 msgid "Invalid AES IV format: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:41
+#: src/constants/errors/backup.ts:43
 msgid "Invalid AES key format: {0}"
 msgstr ""
 
@@ -1474,6 +1498,10 @@ msgstr ""
 msgid "Invalid file object"
 msgstr ""
 
+#: src/constants/errors/backup.ts:51
+msgid "Invalid file path: {0}"
+msgstr ""
+
 #: src/views/config/components/Rename.vue:64
 #: src/views/config/ConfigEditor.vue:250
 msgid "Invalid filename"
@@ -1487,7 +1515,7 @@ msgstr ""
 msgid "Invalid otp code"
 msgstr ""
 
-#: src/constants/errors/backup.ts:25
+#: src/constants/errors/backup.ts:27
 msgid "Invalid padding in decrypted data"
 msgstr ""
 
@@ -1503,7 +1531,7 @@ msgstr ""
 msgid "Invalid request format"
 msgstr ""
 
-#: src/constants/errors/backup.ts:40
+#: src/constants/errors/backup.ts:42
 msgid "Invalid security token format"
 msgstr ""
 
@@ -1803,7 +1831,7 @@ msgstr ""
 msgid "Nginx conf not include stream-enabled"
 msgstr ""
 
-#: src/constants/errors/backup.ts:18
+#: src/constants/errors/backup.ts:19
 msgid "Nginx config directory is not set"
 msgstr ""
 
@@ -1861,6 +1889,10 @@ msgstr ""
 msgid "Nginx restarted successfully"
 msgstr ""
 
+#: src/constants/errors/system.ts:2
+msgid "Nginx UI already installed"
+msgstr ""
+
 #: src/views/system/Backup/SystemRestore.vue:88
 msgid "Nginx UI configuration has been restored"
 msgstr ""
@@ -2040,7 +2072,7 @@ msgstr ""
 msgid "Password"
 msgstr ""
 
-#: src/views/other/Install.vue:108
+#: src/views/other/Install.vue:141
 msgid "Password (*)"
 msgstr ""
 
@@ -2048,7 +2080,7 @@ msgstr ""
 msgid "Password incorrect"
 msgstr ""
 
-#: src/views/other/Install.vue:48
+#: src/views/other/Install.vue:70
 msgid "Password length cannot exceed 20 characters"
 msgstr ""
 
@@ -2133,16 +2165,16 @@ msgstr ""
 msgid "Please input name, this will be used as the filename of the new configuration."
 msgstr ""
 
-#: src/views/other/Install.vue:32
+#: src/views/other/Install.vue:54
 msgid "Please input your E-mail!"
 msgstr ""
 
-#: src/views/other/Install.vue:44
+#: src/views/other/Install.vue:66
 #: src/views/other/Login.vue:47
 msgid "Please input your password!"
 msgstr ""
 
-#: src/views/other/Install.vue:38
+#: src/views/other/Install.vue:60
 #: src/views/other/Login.vue:41
 msgid "Please input your username!"
 msgstr ""
@@ -2844,7 +2876,7 @@ msgstr ""
 msgid "The certificate for the domain will be checked 30 minutes, and will be renewed if it has been more than 1 week or the period you set in settings since it was last issued."
 msgstr ""
 
-#: src/views/other/Install.vue:54
+#: src/views/other/Install.vue:76
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr ""
 
@@ -3105,7 +3137,7 @@ msgstr ""
 msgid "Username"
 msgstr ""
 
-#: src/views/other/Install.vue:98
+#: src/views/other/Install.vue:131
 msgid "Username (*)"
 msgstr ""
 

+ 92 - 53
app/src/language/ru_RU/app.po

@@ -279,7 +279,7 @@ msgstr "Назад"
 msgid "Backup file integrity check failed, it may have been tampered with"
 msgstr ""
 
-#: src/constants/errors/backup.ts:39
+#: src/constants/errors/backup.ts:41
 #, fuzzy
 msgid "Backup file not found: {0}"
 msgstr "Файл не найден"
@@ -504,7 +504,7 @@ msgstr "Команда"
 msgid "Comments"
 msgstr "Комментарии"
 
-#: src/constants/errors/backup.ts:13
+#: src/constants/errors/backup.ts:14
 #, fuzzy
 msgid "Config path is empty"
 msgstr "Шаблоны конфигурации"
@@ -653,7 +653,7 @@ msgstr "Настройте имя локального сервера для о
 msgid "Dashboard"
 msgstr "Доска"
 
-#: src/views/other/Install.vue:119
+#: src/views/other/Install.vue:152
 msgid "Database (Optional, default: database)"
 msgstr "База данных (Опционально, по умолчанию: database)"
 
@@ -966,7 +966,7 @@ msgstr "Редактировать поток"
 msgid "Email"
 msgstr "Электронная почта"
 
-#: src/views/other/Install.vue:88
+#: src/views/other/Install.vue:121
 msgid "Email (*)"
 msgstr "Email (*)"
 
@@ -1106,37 +1106,42 @@ msgstr ""
 msgid "Failed to backup Nginx UI files: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:17
+#: src/constants/errors/backup.ts:18
 #, fuzzy
 msgid "Failed to calculate hash: {0}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/constants/errors/backup.ts:53
+#: src/constants/errors/backup.ts:58
 msgid "Failed to calculate Nginx hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:52
+#: src/constants/errors/backup.ts:57
 msgid "Failed to calculate Nginx UI hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:14
+#: src/constants/errors/backup.ts:13
+#, fuzzy
+msgid "Failed to cleanup temporary directory: {0}"
+msgstr "Не удалось включить %{msg}"
+
+#: src/constants/errors/backup.ts:15
 msgid "Failed to copy config file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:15
+#: src/constants/errors/backup.ts:16
 msgid "Failed to copy database directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:16
+#: src/constants/errors/backup.ts:17
 #, fuzzy
 msgid "Failed to copy database file: {0}"
 msgstr "Не удалось отключить %{msg}"
 
-#: src/constants/errors/backup.ts:30
+#: src/constants/errors/backup.ts:32
 msgid "Failed to copy file content: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:19
+#: src/constants/errors/backup.ts:20
 msgid "Failed to copy Nginx config directory: {0}"
 msgstr ""
 
@@ -1150,12 +1155,12 @@ msgstr "Не удалось включить %{msg}"
 msgid "Failed to create backup file: {0}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/constants/errors/backup.ts:44
+#: src/constants/errors/backup.ts:46
 #, fuzzy
 msgid "Failed to create directory: {0}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/constants/errors/backup.ts:46
+#: src/constants/errors/backup.ts:48
 #, fuzzy
 msgid "Failed to create file: {0}"
 msgstr "Не удалось включить %{msg}"
@@ -1165,15 +1170,20 @@ msgstr "Не удалось включить %{msg}"
 msgid "Failed to create hash info file: {0}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/constants/errors/backup.ts:45
+#: src/constants/errors/backup.ts:47
 #, fuzzy
 msgid "Failed to create parent directory: {0}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/constants/errors/backup.ts:32
+#: src/constants/errors/backup.ts:34
 msgid "Failed to create restore directory: {0}"
 msgstr ""
 
+#: src/constants/errors/backup.ts:50
+#, fuzzy
+msgid "Failed to create symbolic link: {0}"
+msgstr "Не удалось включить %{msg}"
+
 #: src/constants/errors/backup.ts:2
 #, fuzzy
 msgid "Failed to create temporary directory"
@@ -1189,36 +1199,36 @@ msgstr "Не удалось включить %{msg}"
 msgid "Failed to create zip archive: {0}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/constants/errors/backup.ts:27
+#: src/constants/errors/backup.ts:29
 #, fuzzy
 msgid "Failed to create zip entry: {0}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/constants/errors/backup.ts:26
+#: src/constants/errors/backup.ts:28
 #, fuzzy
 msgid "Failed to create zip file: {0}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/constants/errors/backup.ts:29
+#: src/constants/errors/backup.ts:31
 #, fuzzy
 msgid "Failed to create zip header: {0}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/constants/errors/backup.ts:24
+#: src/constants/errors/backup.ts:26
 #, fuzzy
 msgid "Failed to decrypt data: {0}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/constants/errors/backup.ts:49
+#: src/constants/errors/backup.ts:54
 #, fuzzy
 msgid "Failed to decrypt file: {0}"
 msgstr "Не удалось отключить %{msg}"
 
-#: src/constants/errors/backup.ts:35
+#: src/constants/errors/backup.ts:37
 msgid "Failed to decrypt Nginx directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:34
+#: src/constants/errors/backup.ts:36
 msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 
@@ -1236,12 +1246,12 @@ msgstr "Не удалось отключить %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/constants/errors/backup.ts:23
+#: src/constants/errors/backup.ts:25
 #, fuzzy
 msgid "Failed to encrypt data: {0}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/constants/errors/backup.ts:21
+#: src/constants/errors/backup.ts:23
 #, fuzzy
 msgid "Failed to encrypt file: {0}"
 msgstr "Не удалось включить %{msg}"
@@ -1254,7 +1264,12 @@ msgstr ""
 msgid "Failed to encrypt Nginx UI directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:33
+#: src/constants/errors/backup.ts:52
+#, fuzzy
+msgid "Failed to evaluate symbolic links: {0}"
+msgstr "Не удалось включить %{msg}"
+
+#: src/constants/errors/backup.ts:35
 #, fuzzy
 msgid "Failed to extract archive: {0}"
 msgstr "Не удалось включить %{msg}"
@@ -1273,17 +1288,17 @@ msgstr "Не удалось получить информацию о серти
 msgid "Failed to get certificate information"
 msgstr "Не удалось получить информацию о сертификате"
 
-#: src/constants/errors/backup.ts:28
+#: src/constants/errors/backup.ts:30
 #, fuzzy
 msgid "Failed to open source file: {0}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/constants/errors/backup.ts:47
+#: src/constants/errors/backup.ts:49
 #, fuzzy
 msgid "Failed to open zip entry: {0}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/constants/errors/backup.ts:43
+#: src/constants/errors/backup.ts:45
 #, fuzzy
 msgid "Failed to open zip file: {0}"
 msgstr "Не удалось включить %{msg}"
@@ -1292,16 +1307,16 @@ msgstr "Не удалось включить %{msg}"
 msgid "Failed to parse nginx.conf"
 msgstr ""
 
-#: src/constants/errors/backup.ts:48
+#: src/constants/errors/backup.ts:53
 msgid "Failed to read encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:20
+#: src/constants/errors/backup.ts:22
 #, fuzzy
 msgid "Failed to read file: {0}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/constants/errors/backup.ts:51
+#: src/constants/errors/backup.ts:56
 msgid "Failed to read hash info file: {0}"
 msgstr ""
 
@@ -1309,11 +1324,16 @@ msgstr ""
 msgid "Failed to read nginx.conf"
 msgstr ""
 
-#: src/constants/errors/backup.ts:37
+#: src/constants/errors/backup.ts:21
+#, fuzzy
+msgid "Failed to read symlink: {0}"
+msgstr "Не удалось включить %{msg}"
+
+#: src/constants/errors/backup.ts:39
 msgid "Failed to restore Nginx configs: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:38
+#: src/constants/errors/backup.ts:40
 msgid "Failed to restore Nginx UI files: {0}"
 msgstr ""
 
@@ -1322,20 +1342,20 @@ msgstr ""
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "Не удалось сохранить, обнаружены синтаксические ошибки в конфигурации."
 
-#: src/constants/errors/backup.ts:36
+#: src/constants/errors/backup.ts:38
 #, fuzzy
 msgid "Failed to verify hashes: {0}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/constants/errors/backup.ts:50
+#: src/constants/errors/backup.ts:55
 msgid "Failed to write decrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:22
+#: src/constants/errors/backup.ts:24
 msgid "Failed to write encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:31
+#: src/constants/errors/backup.ts:33
 msgid "Failed to write to zip buffer: {0}"
 msgstr ""
 
@@ -1432,7 +1452,7 @@ msgstr "Получение сертификата, пожалуйста, под
 msgid "Github Proxy"
 msgstr "Прокси Github"
 
-#: src/constants/errors/backup.ts:54
+#: src/constants/errors/backup.ts:59
 msgid "Hash verification failed: file integrity compromised"
 msgstr ""
 
@@ -1520,14 +1540,24 @@ msgstr "Введите код из приложения:"
 msgid "Input the recovery code:"
 msgstr "Введите код восстановления:"
 
-#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:134
+#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:168
 msgid "Install"
 msgstr "Установить"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:89
 msgid "Install successfully"
 msgstr "Установка прошла успешно"
 
+#: src/constants/errors/system.ts:3
+msgid "Installation is not allowed after 10 minutes of system startup"
+msgstr ""
+
+#: src/views/other/Install.vue:113
+msgid ""
+"Installation is not allowed after 10 minutes of system startup, please "
+"restart the Nginx UI."
+msgstr ""
+
 #: src/views/preference/LogrotateSettings.vue:25
 msgid "Interval"
 msgstr "Интервал"
@@ -1536,11 +1566,11 @@ msgstr "Интервал"
 msgid "Invalid"
 msgstr "Недействительно"
 
-#: src/constants/errors/backup.ts:42
+#: src/constants/errors/backup.ts:44
 msgid "Invalid AES IV format: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:41
+#: src/constants/errors/backup.ts:43
 msgid "Invalid AES key format: {0}"
 msgstr ""
 
@@ -1549,6 +1579,11 @@ msgstr ""
 msgid "Invalid file object"
 msgstr "Неверное имя файла"
 
+#: src/constants/errors/backup.ts:51
+#, fuzzy
+msgid "Invalid file path: {0}"
+msgstr "Неверное имя файла"
+
 #: src/views/config/components/Rename.vue:64
 #: src/views/config/ConfigEditor.vue:250
 msgid "Invalid filename"
@@ -1562,7 +1597,7 @@ msgstr "Недопустимое имя папки"
 msgid "Invalid otp code"
 msgstr "Неверный код OTP"
 
-#: src/constants/errors/backup.ts:25
+#: src/constants/errors/backup.ts:27
 msgid "Invalid padding in decrypted data"
 msgstr ""
 
@@ -1578,7 +1613,7 @@ msgstr "Неверный код восстановления"
 msgid "Invalid request format"
 msgstr ""
 
-#: src/constants/errors/backup.ts:40
+#: src/constants/errors/backup.ts:42
 #, fuzzy
 msgid "Invalid security token format"
 msgstr "Неверный код восстановления"
@@ -1890,7 +1925,7 @@ msgstr ""
 msgid "Nginx conf not include stream-enabled"
 msgstr ""
 
-#: src/constants/errors/backup.ts:18
+#: src/constants/errors/backup.ts:19
 #, fuzzy
 msgid "Nginx config directory is not set"
 msgstr "Белый список директорий для логов Nginx"
@@ -1952,6 +1987,10 @@ msgstr "Терминальная команда запуска"
 msgid "Nginx restarted successfully"
 msgstr "Nginx успешно перезапущен"
 
+#: src/constants/errors/system.ts:2
+msgid "Nginx UI already installed"
+msgstr ""
+
 #: src/views/system/Backup/SystemRestore.vue:88
 #, fuzzy
 msgid "Nginx UI configuration has been restored"
@@ -2144,7 +2183,7 @@ msgstr ""
 msgid "Password"
 msgstr "Пароль"
 
-#: src/views/other/Install.vue:108
+#: src/views/other/Install.vue:141
 msgid "Password (*)"
 msgstr "Пароль (*)"
 
@@ -2153,7 +2192,7 @@ msgstr "Пароль (*)"
 msgid "Password incorrect"
 msgstr "Имя пользователя или пароль неверны"
 
-#: src/views/other/Install.vue:48
+#: src/views/other/Install.vue:70
 msgid "Password length cannot exceed 20 characters"
 msgstr ""
 
@@ -2260,15 +2299,15 @@ msgstr ""
 "Введите имя, оно будет использоваться в качестве имени файла новой "
 "конфигурации."
 
-#: src/views/other/Install.vue:32
+#: src/views/other/Install.vue:54
 msgid "Please input your E-mail!"
 msgstr "Введите ваш E-mail!"
 
-#: src/views/other/Install.vue:44 src/views/other/Login.vue:47
+#: src/views/other/Install.vue:66 src/views/other/Login.vue:47
 msgid "Please input your password!"
 msgstr "Введите ваш пароль!"
 
-#: src/views/other/Install.vue:38 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:60 src/views/other/Login.vue:41
 msgid "Please input your username!"
 msgstr "Введите ваше имя пользователя!"
 
@@ -3019,7 +3058,7 @@ msgstr ""
 "более 1 недели или периода, установленного в настройках, с момента его "
 "последней выдачи."
 
-#: src/views/other/Install.vue:54
+#: src/views/other/Install.vue:76
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr "Имя файла не может содержать такой символ: %{c}"
 
@@ -3348,7 +3387,7 @@ msgstr ""
 msgid "Username"
 msgstr "Имя пользователя"
 
-#: src/views/other/Install.vue:98
+#: src/views/other/Install.vue:131
 msgid "Username (*)"
 msgstr "Имя пользователя (*)"
 

+ 92 - 53
app/src/language/tr_TR/app.po

@@ -281,7 +281,7 @@ msgstr "Geri"
 msgid "Backup file integrity check failed, it may have been tampered with"
 msgstr ""
 
-#: src/constants/errors/backup.ts:39
+#: src/constants/errors/backup.ts:41
 #, fuzzy
 msgid "Backup file not found: {0}"
 msgstr "Dosya bulunamadı"
@@ -510,7 +510,7 @@ msgstr "Komut"
 msgid "Comments"
 msgstr "Yorumlar"
 
-#: src/constants/errors/backup.ts:13
+#: src/constants/errors/backup.ts:14
 #, fuzzy
 msgid "Config path is empty"
 msgstr "Yapılandırma Şablonları"
@@ -660,7 +660,7 @@ msgstr "Ortam göstergesinde görüntülenecek yerel sunucu adını özelleştir
 msgid "Dashboard"
 msgstr "Kontrol Paneli"
 
-#: src/views/other/Install.vue:119
+#: src/views/other/Install.vue:152
 msgid "Database (Optional, default: database)"
 msgstr "Veritabanı (İsteğe bağlı, varsayılan: database)"
 
@@ -986,7 +986,7 @@ msgstr "Akışı Düzenle"
 msgid "Email"
 msgstr "E-posta"
 
-#: src/views/other/Install.vue:88
+#: src/views/other/Install.vue:121
 msgid "Email (*)"
 msgstr "E-posta(*)"
 
@@ -1136,37 +1136,42 @@ msgstr ""
 msgid "Failed to backup Nginx UI files: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:17
+#: src/constants/errors/backup.ts:18
 #, fuzzy
 msgid "Failed to calculate hash: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/constants/errors/backup.ts:53
+#: src/constants/errors/backup.ts:58
 msgid "Failed to calculate Nginx hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:52
+#: src/constants/errors/backup.ts:57
 msgid "Failed to calculate Nginx UI hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:14
+#: src/constants/errors/backup.ts:13
+#, fuzzy
+msgid "Failed to cleanup temporary directory: {0}"
+msgstr "Etkinleştirilemedi %{msg}"
+
+#: src/constants/errors/backup.ts:15
 msgid "Failed to copy config file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:15
+#: src/constants/errors/backup.ts:16
 msgid "Failed to copy database directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:16
+#: src/constants/errors/backup.ts:17
 #, fuzzy
 msgid "Failed to copy database file: {0}"
 msgstr "Devre dışı bırakılamadı %{msg}"
 
-#: src/constants/errors/backup.ts:30
+#: src/constants/errors/backup.ts:32
 msgid "Failed to copy file content: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:19
+#: src/constants/errors/backup.ts:20
 msgid "Failed to copy Nginx config directory: {0}"
 msgstr ""
 
@@ -1180,12 +1185,12 @@ msgstr "Etkinleştirilemedi %{msg}"
 msgid "Failed to create backup file: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/constants/errors/backup.ts:44
+#: src/constants/errors/backup.ts:46
 #, fuzzy
 msgid "Failed to create directory: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/constants/errors/backup.ts:46
+#: src/constants/errors/backup.ts:48
 #, fuzzy
 msgid "Failed to create file: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
@@ -1195,15 +1200,20 @@ msgstr "Etkinleştirilemedi %{msg}"
 msgid "Failed to create hash info file: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/constants/errors/backup.ts:45
+#: src/constants/errors/backup.ts:47
 #, fuzzy
 msgid "Failed to create parent directory: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/constants/errors/backup.ts:32
+#: src/constants/errors/backup.ts:34
 msgid "Failed to create restore directory: {0}"
 msgstr ""
 
+#: src/constants/errors/backup.ts:50
+#, fuzzy
+msgid "Failed to create symbolic link: {0}"
+msgstr "Etkinleştirilemedi %{msg}"
+
 #: src/constants/errors/backup.ts:2
 #, fuzzy
 msgid "Failed to create temporary directory"
@@ -1219,36 +1229,36 @@ msgstr "Etkinleştirilemedi %{msg}"
 msgid "Failed to create zip archive: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/constants/errors/backup.ts:27
+#: src/constants/errors/backup.ts:29
 #, fuzzy
 msgid "Failed to create zip entry: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/constants/errors/backup.ts:26
+#: src/constants/errors/backup.ts:28
 #, fuzzy
 msgid "Failed to create zip file: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/constants/errors/backup.ts:29
+#: src/constants/errors/backup.ts:31
 #, fuzzy
 msgid "Failed to create zip header: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/constants/errors/backup.ts:24
+#: src/constants/errors/backup.ts:26
 #, fuzzy
 msgid "Failed to decrypt data: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/constants/errors/backup.ts:49
+#: src/constants/errors/backup.ts:54
 #, fuzzy
 msgid "Failed to decrypt file: {0}"
 msgstr "Devre dışı bırakılamadı %{msg}"
 
-#: src/constants/errors/backup.ts:35
+#: src/constants/errors/backup.ts:37
 msgid "Failed to decrypt Nginx directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:34
+#: src/constants/errors/backup.ts:36
 msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 
@@ -1266,12 +1276,12 @@ msgstr "Devre dışı bırakılamadı %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/constants/errors/backup.ts:23
+#: src/constants/errors/backup.ts:25
 #, fuzzy
 msgid "Failed to encrypt data: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/constants/errors/backup.ts:21
+#: src/constants/errors/backup.ts:23
 #, fuzzy
 msgid "Failed to encrypt file: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
@@ -1284,7 +1294,12 @@ msgstr ""
 msgid "Failed to encrypt Nginx UI directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:33
+#: src/constants/errors/backup.ts:52
+#, fuzzy
+msgid "Failed to evaluate symbolic links: {0}"
+msgstr "Etkinleştirilemedi %{msg}"
+
+#: src/constants/errors/backup.ts:35
 #, fuzzy
 msgid "Failed to extract archive: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
@@ -1303,17 +1318,17 @@ msgstr "Sertifika bilgileri alınamadı"
 msgid "Failed to get certificate information"
 msgstr "Sertifika bilgileri alınamadı"
 
-#: src/constants/errors/backup.ts:28
+#: src/constants/errors/backup.ts:30
 #, fuzzy
 msgid "Failed to open source file: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/constants/errors/backup.ts:47
+#: src/constants/errors/backup.ts:49
 #, fuzzy
 msgid "Failed to open zip entry: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/constants/errors/backup.ts:43
+#: src/constants/errors/backup.ts:45
 #, fuzzy
 msgid "Failed to open zip file: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
@@ -1322,16 +1337,16 @@ msgstr "Etkinleştirilemedi %{msg}"
 msgid "Failed to parse nginx.conf"
 msgstr ""
 
-#: src/constants/errors/backup.ts:48
+#: src/constants/errors/backup.ts:53
 msgid "Failed to read encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:20
+#: src/constants/errors/backup.ts:22
 #, fuzzy
 msgid "Failed to read file: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/constants/errors/backup.ts:51
+#: src/constants/errors/backup.ts:56
 msgid "Failed to read hash info file: {0}"
 msgstr ""
 
@@ -1339,11 +1354,16 @@ msgstr ""
 msgid "Failed to read nginx.conf"
 msgstr ""
 
-#: src/constants/errors/backup.ts:37
+#: src/constants/errors/backup.ts:21
+#, fuzzy
+msgid "Failed to read symlink: {0}"
+msgstr "Etkinleştirilemedi %{msg}"
+
+#: src/constants/errors/backup.ts:39
 msgid "Failed to restore Nginx configs: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:38
+#: src/constants/errors/backup.ts:40
 msgid "Failed to restore Nginx UI files: {0}"
 msgstr ""
 
@@ -1352,20 +1372,20 @@ msgstr ""
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "Kaydedilemedi, yapılandırmada sözdizimi hatası(ları) tespit edildi."
 
-#: src/constants/errors/backup.ts:36
+#: src/constants/errors/backup.ts:38
 #, fuzzy
 msgid "Failed to verify hashes: {0}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/constants/errors/backup.ts:50
+#: src/constants/errors/backup.ts:55
 msgid "Failed to write decrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:22
+#: src/constants/errors/backup.ts:24
 msgid "Failed to write encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:31
+#: src/constants/errors/backup.ts:33
 msgid "Failed to write to zip buffer: {0}"
 msgstr ""
 
@@ -1462,7 +1482,7 @@ msgstr "Sertifika alınıyor, lütfen bekleyin..."
 msgid "Github Proxy"
 msgstr "Github Proxy"
 
-#: src/constants/errors/backup.ts:54
+#: src/constants/errors/backup.ts:59
 msgid "Hash verification failed: file integrity compromised"
 msgstr ""
 
@@ -1551,14 +1571,24 @@ msgstr "Uygulamadan kodu girin:"
 msgid "Input the recovery code:"
 msgstr "Kurtarma kodunu girin:"
 
-#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:134
+#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:168
 msgid "Install"
 msgstr "Yükle"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:89
 msgid "Install successfully"
 msgstr "Başarıyla yüklendi"
 
+#: src/constants/errors/system.ts:3
+msgid "Installation is not allowed after 10 minutes of system startup"
+msgstr ""
+
+#: src/views/other/Install.vue:113
+msgid ""
+"Installation is not allowed after 10 minutes of system startup, please "
+"restart the Nginx UI."
+msgstr ""
+
 #: src/views/preference/LogrotateSettings.vue:25
 msgid "Interval"
 msgstr "Aralık"
@@ -1567,11 +1597,11 @@ msgstr "Aralık"
 msgid "Invalid"
 msgstr "Geçersiz"
 
-#: src/constants/errors/backup.ts:42
+#: src/constants/errors/backup.ts:44
 msgid "Invalid AES IV format: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:41
+#: src/constants/errors/backup.ts:43
 msgid "Invalid AES key format: {0}"
 msgstr ""
 
@@ -1580,6 +1610,11 @@ msgstr ""
 msgid "Invalid file object"
 msgstr "Geçersiz dosya adı"
 
+#: src/constants/errors/backup.ts:51
+#, fuzzy
+msgid "Invalid file path: {0}"
+msgstr "Geçersiz dosya adı"
+
 #: src/views/config/components/Rename.vue:64
 #: src/views/config/ConfigEditor.vue:250
 msgid "Invalid filename"
@@ -1594,7 +1629,7 @@ msgstr "Geçersiz klasör adı"
 msgid "Invalid otp code"
 msgstr "Geçersiz 2FA veya kurtarma kodu"
 
-#: src/constants/errors/backup.ts:25
+#: src/constants/errors/backup.ts:27
 msgid "Invalid padding in decrypted data"
 msgstr ""
 
@@ -1611,7 +1646,7 @@ msgstr "Geçersiz 2FA veya kurtarma kodu"
 msgid "Invalid request format"
 msgstr ""
 
-#: src/constants/errors/backup.ts:40
+#: src/constants/errors/backup.ts:42
 #, fuzzy
 msgid "Invalid security token format"
 msgstr "Geçersiz 2FA veya kurtarma kodu"
@@ -1949,7 +1984,7 @@ msgstr ""
 msgid "Nginx conf not include stream-enabled"
 msgstr ""
 
-#: src/constants/errors/backup.ts:18
+#: src/constants/errors/backup.ts:19
 #, fuzzy
 msgid "Nginx config directory is not set"
 msgstr "Nginx Yapılandırma Ayrıştırma Hatası"
@@ -2018,6 +2053,10 @@ msgstr "Terminal Başlatma Komutu"
 msgid "Nginx restarted successfully"
 msgstr "Nginx başarıyla yeniden başlatıldı"
 
+#: src/constants/errors/system.ts:2
+msgid "Nginx UI already installed"
+msgstr ""
+
 #: src/views/system/Backup/SystemRestore.vue:88
 #, fuzzy
 msgid "Nginx UI configuration has been restored"
@@ -2241,7 +2280,7 @@ msgstr ""
 msgid "Password"
 msgstr "Şifre"
 
-#: src/views/other/Install.vue:108
+#: src/views/other/Install.vue:141
 #, fuzzy
 msgid "Password (*)"
 msgstr "Şifre (*)"
@@ -2251,7 +2290,7 @@ msgstr "Şifre (*)"
 msgid "Password incorrect"
 msgstr "Kullanıcı adı veya şifre yanlış"
 
-#: src/views/other/Install.vue:48
+#: src/views/other/Install.vue:70
 msgid "Password length cannot exceed 20 characters"
 msgstr ""
 
@@ -2370,17 +2409,17 @@ msgid ""
 msgstr ""
 "Lütfen isim girin, bu yeni yapılandırmanın dosya adı olarak kullanılacaktır!"
 
-#: src/views/other/Install.vue:32
+#: src/views/other/Install.vue:54
 #, fuzzy
 msgid "Please input your E-mail!"
 msgstr "Lütfen e-postanızı girin!"
 
-#: src/views/other/Install.vue:44 src/views/other/Login.vue:47
+#: src/views/other/Install.vue:66 src/views/other/Login.vue:47
 #, fuzzy
 msgid "Please input your password!"
 msgstr "Lütfen şifrenizi girin!"
 
-#: src/views/other/Install.vue:38 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:60 src/views/other/Login.vue:41
 #, fuzzy
 msgid "Please input your username!"
 msgstr "Lütfen kullanıcı adınızı girin!"
@@ -3236,7 +3275,7 @@ msgstr ""
 "verilmesinden bu yana 1 haftadan veya ayarlarda belirlediğiniz süreden fazla "
 "zaman geçtiyse yenilenecektir."
 
-#: src/views/other/Install.vue:54
+#: src/views/other/Install.vue:76
 #, fuzzy
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr "Dosya adı aşağıdaki karakterleri içeremez: %{c}"
@@ -3607,7 +3646,7 @@ msgstr ""
 msgid "Username"
 msgstr "Kullanıcı Adı"
 
-#: src/views/other/Install.vue:98
+#: src/views/other/Install.vue:131
 #, fuzzy
 msgid "Username (*)"
 msgstr "Kullanıcı adı (*)"

+ 92 - 53
app/src/language/vi_VN/app.po

@@ -293,7 +293,7 @@ msgstr "Quay lại"
 msgid "Backup file integrity check failed, it may have been tampered with"
 msgstr ""
 
-#: src/constants/errors/backup.ts:39
+#: src/constants/errors/backup.ts:41
 #, fuzzy
 msgid "Backup file not found: {0}"
 msgstr "Không tìm thấy tệp tin"
@@ -534,7 +534,7 @@ msgstr "Bình luận"
 msgid "Comments"
 msgstr "Bình luận"
 
-#: src/constants/errors/backup.ts:13
+#: src/constants/errors/backup.ts:14
 #, fuzzy
 msgid "Config path is empty"
 msgstr "Mẫu Cấu hình"
@@ -686,7 +686,7 @@ msgstr ""
 msgid "Dashboard"
 msgstr "Bảng điều khiển"
 
-#: src/views/other/Install.vue:119
+#: src/views/other/Install.vue:152
 msgid "Database (Optional, default: database)"
 msgstr "Tên cơ sở dữ liệu (Tuỳ chọn, Mặc định là: database)"
 
@@ -1012,7 +1012,7 @@ msgstr "Sửa trang web"
 msgid "Email"
 msgstr "Email (*)"
 
-#: src/views/other/Install.vue:88
+#: src/views/other/Install.vue:121
 msgid "Email (*)"
 msgstr "Email (*)"
 
@@ -1161,37 +1161,42 @@ msgstr ""
 msgid "Failed to backup Nginx UI files: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:17
+#: src/constants/errors/backup.ts:18
 #, fuzzy
 msgid "Failed to calculate hash: {0}"
 msgstr "Không thể bật %{msg}"
 
-#: src/constants/errors/backup.ts:53
+#: src/constants/errors/backup.ts:58
 msgid "Failed to calculate Nginx hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:52
+#: src/constants/errors/backup.ts:57
 msgid "Failed to calculate Nginx UI hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:14
+#: src/constants/errors/backup.ts:13
+#, fuzzy
+msgid "Failed to cleanup temporary directory: {0}"
+msgstr "Không thể bật %{msg}"
+
+#: src/constants/errors/backup.ts:15
 msgid "Failed to copy config file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:15
+#: src/constants/errors/backup.ts:16
 msgid "Failed to copy database directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:16
+#: src/constants/errors/backup.ts:17
 #, fuzzy
 msgid "Failed to copy database file: {0}"
 msgstr "Không thể tắt %{msg}"
 
-#: src/constants/errors/backup.ts:30
+#: src/constants/errors/backup.ts:32
 msgid "Failed to copy file content: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:19
+#: src/constants/errors/backup.ts:20
 msgid "Failed to copy Nginx config directory: {0}"
 msgstr ""
 
@@ -1205,12 +1210,12 @@ msgstr "Không thể bật %{msg}"
 msgid "Failed to create backup file: {0}"
 msgstr "Không thể bật %{msg}"
 
-#: src/constants/errors/backup.ts:44
+#: src/constants/errors/backup.ts:46
 #, fuzzy
 msgid "Failed to create directory: {0}"
 msgstr "Không thể bật %{msg}"
 
-#: src/constants/errors/backup.ts:46
+#: src/constants/errors/backup.ts:48
 #, fuzzy
 msgid "Failed to create file: {0}"
 msgstr "Không thể bật %{msg}"
@@ -1220,15 +1225,20 @@ msgstr "Không thể bật %{msg}"
 msgid "Failed to create hash info file: {0}"
 msgstr "Không thể bật %{msg}"
 
-#: src/constants/errors/backup.ts:45
+#: src/constants/errors/backup.ts:47
 #, fuzzy
 msgid "Failed to create parent directory: {0}"
 msgstr "Không thể bật %{msg}"
 
-#: src/constants/errors/backup.ts:32
+#: src/constants/errors/backup.ts:34
 msgid "Failed to create restore directory: {0}"
 msgstr ""
 
+#: src/constants/errors/backup.ts:50
+#, fuzzy
+msgid "Failed to create symbolic link: {0}"
+msgstr "Không thể bật %{msg}"
+
 #: src/constants/errors/backup.ts:2
 #, fuzzy
 msgid "Failed to create temporary directory"
@@ -1244,36 +1254,36 @@ msgstr "Không thể bật %{msg}"
 msgid "Failed to create zip archive: {0}"
 msgstr "Không thể bật %{msg}"
 
-#: src/constants/errors/backup.ts:27
+#: src/constants/errors/backup.ts:29
 #, fuzzy
 msgid "Failed to create zip entry: {0}"
 msgstr "Không thể bật %{msg}"
 
-#: src/constants/errors/backup.ts:26
+#: src/constants/errors/backup.ts:28
 #, fuzzy
 msgid "Failed to create zip file: {0}"
 msgstr "Không thể bật %{msg}"
 
-#: src/constants/errors/backup.ts:29
+#: src/constants/errors/backup.ts:31
 #, fuzzy
 msgid "Failed to create zip header: {0}"
 msgstr "Không thể bật %{msg}"
 
-#: src/constants/errors/backup.ts:24
+#: src/constants/errors/backup.ts:26
 #, fuzzy
 msgid "Failed to decrypt data: {0}"
 msgstr "Không thể bật %{msg}"
 
-#: src/constants/errors/backup.ts:49
+#: src/constants/errors/backup.ts:54
 #, fuzzy
 msgid "Failed to decrypt file: {0}"
 msgstr "Không thể tắt %{msg}"
 
-#: src/constants/errors/backup.ts:35
+#: src/constants/errors/backup.ts:37
 msgid "Failed to decrypt Nginx directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:34
+#: src/constants/errors/backup.ts:36
 msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 
@@ -1291,12 +1301,12 @@ msgstr "Không thể tắt %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "Không thể bật %{msg}"
 
-#: src/constants/errors/backup.ts:23
+#: src/constants/errors/backup.ts:25
 #, fuzzy
 msgid "Failed to encrypt data: {0}"
 msgstr "Không thể bật %{msg}"
 
-#: src/constants/errors/backup.ts:21
+#: src/constants/errors/backup.ts:23
 #, fuzzy
 msgid "Failed to encrypt file: {0}"
 msgstr "Không thể bật %{msg}"
@@ -1309,7 +1319,12 @@ msgstr ""
 msgid "Failed to encrypt Nginx UI directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:33
+#: src/constants/errors/backup.ts:52
+#, fuzzy
+msgid "Failed to evaluate symbolic links: {0}"
+msgstr "Không thể bật %{msg}"
+
+#: src/constants/errors/backup.ts:35
 #, fuzzy
 msgid "Failed to extract archive: {0}"
 msgstr "Không thể bật %{msg}"
@@ -1328,17 +1343,17 @@ msgstr "Không thể truy xuất thông tin chứng chỉ"
 msgid "Failed to get certificate information"
 msgstr "Không thể truy xuất thông tin chứng chỉ"
 
-#: src/constants/errors/backup.ts:28
+#: src/constants/errors/backup.ts:30
 #, fuzzy
 msgid "Failed to open source file: {0}"
 msgstr "Không thể bật %{msg}"
 
-#: src/constants/errors/backup.ts:47
+#: src/constants/errors/backup.ts:49
 #, fuzzy
 msgid "Failed to open zip entry: {0}"
 msgstr "Không thể bật %{msg}"
 
-#: src/constants/errors/backup.ts:43
+#: src/constants/errors/backup.ts:45
 #, fuzzy
 msgid "Failed to open zip file: {0}"
 msgstr "Không thể bật %{msg}"
@@ -1347,16 +1362,16 @@ msgstr "Không thể bật %{msg}"
 msgid "Failed to parse nginx.conf"
 msgstr ""
 
-#: src/constants/errors/backup.ts:48
+#: src/constants/errors/backup.ts:53
 msgid "Failed to read encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:20
+#: src/constants/errors/backup.ts:22
 #, fuzzy
 msgid "Failed to read file: {0}"
 msgstr "Không thể bật %{msg}"
 
-#: src/constants/errors/backup.ts:51
+#: src/constants/errors/backup.ts:56
 msgid "Failed to read hash info file: {0}"
 msgstr ""
 
@@ -1364,11 +1379,16 @@ msgstr ""
 msgid "Failed to read nginx.conf"
 msgstr ""
 
-#: src/constants/errors/backup.ts:37
+#: src/constants/errors/backup.ts:21
+#, fuzzy
+msgid "Failed to read symlink: {0}"
+msgstr "Không thể bật %{msg}"
+
+#: src/constants/errors/backup.ts:39
 msgid "Failed to restore Nginx configs: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:38
+#: src/constants/errors/backup.ts:40
 msgid "Failed to restore Nginx UI files: {0}"
 msgstr ""
 
@@ -1377,20 +1397,20 @@ msgstr ""
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "Không lưu được, đã phát hiện thấy (các) lỗi cú pháp trong cấu hình."
 
-#: src/constants/errors/backup.ts:36
+#: src/constants/errors/backup.ts:38
 #, fuzzy
 msgid "Failed to verify hashes: {0}"
 msgstr "Không thể bật %{msg}"
 
-#: src/constants/errors/backup.ts:50
+#: src/constants/errors/backup.ts:55
 msgid "Failed to write decrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:22
+#: src/constants/errors/backup.ts:24
 msgid "Failed to write encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:31
+#: src/constants/errors/backup.ts:33
 msgid "Failed to write to zip buffer: {0}"
 msgstr ""
 
@@ -1488,7 +1508,7 @@ msgstr "Đang lấy chứng chỉ, vui lòng đợi..."
 msgid "Github Proxy"
 msgstr ""
 
-#: src/constants/errors/backup.ts:54
+#: src/constants/errors/backup.ts:59
 msgid "Hash verification failed: file integrity compromised"
 msgstr ""
 
@@ -1572,15 +1592,25 @@ msgstr ""
 msgid "Input the recovery code:"
 msgstr ""
 
-#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:134
+#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:168
 msgid "Install"
 msgstr "Cài đặt"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:89
 #, fuzzy
 msgid "Install successfully"
 msgstr "Cài đặt thành công"
 
+#: src/constants/errors/system.ts:3
+msgid "Installation is not allowed after 10 minutes of system startup"
+msgstr ""
+
+#: src/views/other/Install.vue:113
+msgid ""
+"Installation is not allowed after 10 minutes of system startup, please "
+"restart the Nginx UI."
+msgstr ""
+
 #: src/views/preference/LogrotateSettings.vue:25
 msgid "Interval"
 msgstr ""
@@ -1590,11 +1620,11 @@ msgstr ""
 msgid "Invalid"
 msgstr "Hợp lệ"
 
-#: src/constants/errors/backup.ts:42
+#: src/constants/errors/backup.ts:44
 msgid "Invalid AES IV format: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:41
+#: src/constants/errors/backup.ts:43
 msgid "Invalid AES key format: {0}"
 msgstr ""
 
@@ -1603,6 +1633,11 @@ msgstr ""
 msgid "Invalid file object"
 msgstr "E-mail không chính xác!"
 
+#: src/constants/errors/backup.ts:51
+#, fuzzy
+msgid "Invalid file path: {0}"
+msgstr "E-mail không chính xác!"
+
 #: src/views/config/components/Rename.vue:64
 #: src/views/config/ConfigEditor.vue:250
 #, fuzzy
@@ -1618,7 +1653,7 @@ msgstr ""
 msgid "Invalid otp code"
 msgstr "Hợp lệ"
 
-#: src/constants/errors/backup.ts:25
+#: src/constants/errors/backup.ts:27
 msgid "Invalid padding in decrypted data"
 msgstr ""
 
@@ -1634,7 +1669,7 @@ msgstr ""
 msgid "Invalid request format"
 msgstr ""
 
-#: src/constants/errors/backup.ts:40
+#: src/constants/errors/backup.ts:42
 msgid "Invalid security token format"
 msgstr ""
 
@@ -1959,7 +1994,7 @@ msgstr ""
 msgid "Nginx conf not include stream-enabled"
 msgstr ""
 
-#: src/constants/errors/backup.ts:18
+#: src/constants/errors/backup.ts:19
 #, fuzzy
 msgid "Nginx config directory is not set"
 msgstr "Lỗi phân tích cú pháp cấu hình Nginx"
@@ -2023,6 +2058,10 @@ msgstr ""
 msgid "Nginx restarted successfully"
 msgstr "Restart Nginx thành công"
 
+#: src/constants/errors/system.ts:2
+msgid "Nginx UI already installed"
+msgstr ""
+
 #: src/views/system/Backup/SystemRestore.vue:88
 #, fuzzy
 msgid "Nginx UI configuration has been restored"
@@ -2216,7 +2255,7 @@ msgstr ""
 msgid "Password"
 msgstr "Mật khẩu"
 
-#: src/views/other/Install.vue:108
+#: src/views/other/Install.vue:141
 msgid "Password (*)"
 msgstr "Mật khẩu (*)"
 
@@ -2225,7 +2264,7 @@ msgstr "Mật khẩu (*)"
 msgid "Password incorrect"
 msgstr "Tên người dùng hoặc mật khẩu không chính xác"
 
-#: src/views/other/Install.vue:48
+#: src/views/other/Install.vue:70
 msgid "Password length cannot exceed 20 characters"
 msgstr ""
 
@@ -2329,15 +2368,15 @@ msgid ""
 msgstr ""
 "Vui lòng nhập tên, tên này sẽ được sử dụng làm tên tệp của cấu hình mới!"
 
-#: src/views/other/Install.vue:32
+#: src/views/other/Install.vue:54
 msgid "Please input your E-mail!"
 msgstr "Vui lòng nhập E-mail của bạn!"
 
-#: src/views/other/Install.vue:44 src/views/other/Login.vue:47
+#: src/views/other/Install.vue:66 src/views/other/Login.vue:47
 msgid "Please input your password!"
 msgstr "Vui lòng nhập mật khẩu!"
 
-#: src/views/other/Install.vue:38 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:60 src/views/other/Login.vue:41
 msgid "Please input your username!"
 msgstr "Vui lòng nhập username!"
 
@@ -3112,7 +3151,7 @@ msgstr ""
 "Chứng chỉ cho miền sẽ được kiểm tra 5 phút / lần và sẽ được gia hạn nếu đã "
 "hơn 1 tuần kể từ lần cuối nó được cấp."
 
-#: src/views/other/Install.vue:54
+#: src/views/other/Install.vue:76
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr "Tên tệp không thể chứa các ký tự sau: %{c}"
 
@@ -3421,7 +3460,7 @@ msgstr ""
 msgid "Username"
 msgstr "Username"
 
-#: src/views/other/Install.vue:98
+#: src/views/other/Install.vue:131
 msgid "Username (*)"
 msgstr "Username (*)"
 

+ 88 - 54
app/src/language/zh_CN/app.po

@@ -3,7 +3,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "POT-Creation-Date: \n"
-"PO-Revision-Date: 2025-03-29 18:45+0800\n"
+"PO-Revision-Date: 2025-03-29 20:55+0800\n"
 "Last-Translator: 0xJacky <me@jackyu.cn>\n"
 "Language-Team: Chinese (Simplified Han script) <https://weblate.nginxui.com/"
 "projects/nginx-ui/frontend/zh_Hans/>\n"
@@ -276,7 +276,7 @@ msgstr "备份"
 msgid "Backup file integrity check failed, it may have been tampered with"
 msgstr "备份文件完整性检查失败,可能已被篡改"
 
-#: src/constants/errors/backup.ts:39
+#: src/constants/errors/backup.ts:41
 msgid "Backup file not found: {0}"
 msgstr "未找到备份文件:{0}"
 
@@ -496,7 +496,7 @@ msgstr "命令"
 msgid "Comments"
 msgstr "注释"
 
-#: src/constants/errors/backup.ts:13
+#: src/constants/errors/backup.ts:14
 msgid "Config path is empty"
 msgstr "配置路径为空"
 
@@ -642,7 +642,7 @@ msgstr "自定义显示在环境指示器中的本地服务器名称。"
 msgid "Dashboard"
 msgstr "仪表盘"
 
-#: src/views/other/Install.vue:119
+#: src/views/other/Install.vue:152
 msgid "Database (Optional, default: database)"
 msgstr "数据库 (可选,默认: database)"
 
@@ -935,7 +935,7 @@ msgstr "编辑 Stream"
 msgid "Email"
 msgstr "邮箱"
 
-#: src/views/other/Install.vue:88
+#: src/views/other/Install.vue:121
 msgid "Email (*)"
 msgstr "邮箱 (*)"
 
@@ -1069,35 +1069,39 @@ msgstr "备份 Nginx 配置文件失败:{0}"
 msgid "Failed to backup Nginx UI files: {0}"
 msgstr "备份 Nginx UI 文件失败:{0}"
 
-#: src/constants/errors/backup.ts:17
+#: src/constants/errors/backup.ts:18
 msgid "Failed to calculate hash: {0}"
 msgstr "计算哈希值失败:{0}"
 
-#: src/constants/errors/backup.ts:53
+#: src/constants/errors/backup.ts:58
 msgid "Failed to calculate Nginx hash: {0}"
 msgstr "计算 Nginx 哈希值失败:{0}"
 
-#: src/constants/errors/backup.ts:52
+#: src/constants/errors/backup.ts:57
 msgid "Failed to calculate Nginx UI hash: {0}"
 msgstr "计算 Nginx UI 哈希值失败:{0}"
 
-#: src/constants/errors/backup.ts:14
+#: src/constants/errors/backup.ts:13
+msgid "Failed to cleanup temporary directory: {0}"
+msgstr "清理临时目录失败:{0}"
+
+#: src/constants/errors/backup.ts:15
 msgid "Failed to copy config file: {0}"
 msgstr "复制配置文件失败:{0}"
 
-#: src/constants/errors/backup.ts:15
+#: src/constants/errors/backup.ts:16
 msgid "Failed to copy database directory: {0}"
 msgstr "复制数据库目录失败:{0}"
 
-#: src/constants/errors/backup.ts:16
+#: src/constants/errors/backup.ts:17
 msgid "Failed to copy database file: {0}"
 msgstr "复制数据库文件失败:{0}"
 
-#: src/constants/errors/backup.ts:30
+#: src/constants/errors/backup.ts:32
 msgid "Failed to copy file content: {0}"
 msgstr "复制文件内容失败:{0}"
 
-#: src/constants/errors/backup.ts:19
+#: src/constants/errors/backup.ts:20
 msgid "Failed to copy Nginx config directory: {0}"
 msgstr "复制 Nginx 配置目录失败:{0}"
 
@@ -1109,11 +1113,11 @@ msgstr "创建备份失败"
 msgid "Failed to create backup file: {0}"
 msgstr "创建备份文件失败:{0}"
 
-#: src/constants/errors/backup.ts:44
+#: src/constants/errors/backup.ts:46
 msgid "Failed to create directory: {0}"
 msgstr "创建目录失败:{0}"
 
-#: src/constants/errors/backup.ts:46
+#: src/constants/errors/backup.ts:48
 msgid "Failed to create file: {0}"
 msgstr "创建文件失败:{0}"
 
@@ -1121,14 +1125,18 @@ msgstr "创建文件失败:{0}"
 msgid "Failed to create hash info file: {0}"
 msgstr "创建哈希信息文件失败:{0}"
 
-#: src/constants/errors/backup.ts:45
+#: src/constants/errors/backup.ts:47
 msgid "Failed to create parent directory: {0}"
 msgstr "创建父目录失败:{0}"
 
-#: src/constants/errors/backup.ts:32
+#: src/constants/errors/backup.ts:34
 msgid "Failed to create restore directory: {0}"
 msgstr "创建还原目录失败:{0}"
 
+#: src/constants/errors/backup.ts:50
+msgid "Failed to create symbolic link: {0}"
+msgstr "创建符号链接失败:{0}"
+
 #: src/constants/errors/backup.ts:2
 msgid "Failed to create temporary directory"
 msgstr "创建临时目录失败"
@@ -1141,31 +1149,31 @@ msgstr "创建临时子目录失败"
 msgid "Failed to create zip archive: {0}"
 msgstr "创建 zip 压缩包失败:{0}"
 
-#: src/constants/errors/backup.ts:27
+#: src/constants/errors/backup.ts:29
 msgid "Failed to create zip entry: {0}"
 msgstr "创建 zip 条目失败:{0}"
 
-#: src/constants/errors/backup.ts:26
+#: src/constants/errors/backup.ts:28
 msgid "Failed to create zip file: {0}"
 msgstr "创建压缩文件失败:{0}"
 
-#: src/constants/errors/backup.ts:29
+#: src/constants/errors/backup.ts:31
 msgid "Failed to create zip header: {0}"
 msgstr "创建 zip 头失败:{0}"
 
-#: src/constants/errors/backup.ts:24
+#: src/constants/errors/backup.ts:26
 msgid "Failed to decrypt data: {0}"
 msgstr "解密数据失败:{0}"
 
-#: src/constants/errors/backup.ts:49
+#: src/constants/errors/backup.ts:54
 msgid "Failed to decrypt file: {0}"
 msgstr "解密文件失败:{0}"
 
-#: src/constants/errors/backup.ts:35
+#: src/constants/errors/backup.ts:37
 msgid "Failed to decrypt Nginx directory: {0}"
 msgstr "解密 Nginx 目录失败:{0}"
 
-#: src/constants/errors/backup.ts:34
+#: src/constants/errors/backup.ts:36
 msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr "解密 Nginx UI 目录失败:{0}"
 
@@ -1183,11 +1191,11 @@ msgstr "禁用失败 %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "启用失败 %{msg}"
 
-#: src/constants/errors/backup.ts:23
+#: src/constants/errors/backup.ts:25
 msgid "Failed to encrypt data: {0}"
 msgstr "加密数据失败:{0}"
 
-#: src/constants/errors/backup.ts:21
+#: src/constants/errors/backup.ts:23
 msgid "Failed to encrypt file: {0}"
 msgstr "加密文件失败:{0}"
 
@@ -1199,7 +1207,11 @@ msgstr "加密 Nginx 目录失败:{0}"
 msgid "Failed to encrypt Nginx UI directory: {0}"
 msgstr "加密 Nginx UI 目录失败:{0}"
 
-#: src/constants/errors/backup.ts:33
+#: src/constants/errors/backup.ts:52
+msgid "Failed to evaluate symbolic links: {0}"
+msgstr "符号链接解析失败:{0}"
+
+#: src/constants/errors/backup.ts:35
 msgid "Failed to extract archive: {0}"
 msgstr "解压缩失败:{0}"
 
@@ -1215,15 +1227,15 @@ msgstr "生成初始化向量失败:{0}"
 msgid "Failed to get certificate information"
 msgstr "获取证书信息失败"
 
-#: src/constants/errors/backup.ts:28
+#: src/constants/errors/backup.ts:30
 msgid "Failed to open source file: {0}"
 msgstr "打开源文件失败:{0}"
 
-#: src/constants/errors/backup.ts:47
+#: src/constants/errors/backup.ts:49
 msgid "Failed to open zip entry: {0}"
 msgstr "打开 zip 条目失败:{0}"
 
-#: src/constants/errors/backup.ts:43
+#: src/constants/errors/backup.ts:45
 msgid "Failed to open zip file: {0}"
 msgstr "打开压缩文件失败:{0}"
 
@@ -1231,15 +1243,15 @@ msgstr "打开压缩文件失败:{0}"
 msgid "Failed to parse nginx.conf"
 msgstr "解析 nginx.conf 失败"
 
-#: src/constants/errors/backup.ts:48
+#: src/constants/errors/backup.ts:53
 msgid "Failed to read encrypted file: {0}"
 msgstr "读取加密文件失败:{0}"
 
-#: src/constants/errors/backup.ts:20
+#: src/constants/errors/backup.ts:22
 msgid "Failed to read file: {0}"
 msgstr "读取文件失败:{0}"
 
-#: src/constants/errors/backup.ts:51
+#: src/constants/errors/backup.ts:56
 msgid "Failed to read hash info file: {0}"
 msgstr "读取哈希信息文件失败:{0}"
 
@@ -1247,11 +1259,15 @@ msgstr "读取哈希信息文件失败:{0}"
 msgid "Failed to read nginx.conf"
 msgstr "读取 nginx.conf 失败"
 
-#: src/constants/errors/backup.ts:37
+#: src/constants/errors/backup.ts:21
+msgid "Failed to read symlink: {0}"
+msgstr "读取符号链接失败:{0}"
+
+#: src/constants/errors/backup.ts:39
 msgid "Failed to restore Nginx configs: {0}"
 msgstr "恢复 Nginx 配置失败:{0}"
 
-#: src/constants/errors/backup.ts:38
+#: src/constants/errors/backup.ts:40
 msgid "Failed to restore Nginx UI files: {0}"
 msgstr "恢复 Nginx UI 文件失败:{0}"
 
@@ -1260,19 +1276,19 @@ msgstr "恢复 Nginx UI 文件失败:{0}"
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "保存失败,在配置中检测到语法错误。"
 
-#: src/constants/errors/backup.ts:36
+#: src/constants/errors/backup.ts:38
 msgid "Failed to verify hashes: {0}"
 msgstr "验证哈希值失败:{0}"
 
-#: src/constants/errors/backup.ts:50
+#: src/constants/errors/backup.ts:55
 msgid "Failed to write decrypted file: {0}"
 msgstr "写入解密文件失败:{0}"
 
-#: src/constants/errors/backup.ts:22
+#: src/constants/errors/backup.ts:24
 msgid "Failed to write encrypted file: {0}"
 msgstr "写入加密文件失败:{0}"
 
-#: src/constants/errors/backup.ts:31
+#: src/constants/errors/backup.ts:33
 msgid "Failed to write to zip buffer: {0}"
 msgstr "写入 zip 缓冲区失败:{0}"
 
@@ -1364,7 +1380,7 @@ msgstr "正在获取证书,请稍等..."
 msgid "Github Proxy"
 msgstr "Github代理"
 
-#: src/constants/errors/backup.ts:54
+#: src/constants/errors/backup.ts:59
 msgid "Hash verification failed: file integrity compromised"
 msgstr "哈希验证失败:文件完整性受损"
 
@@ -1448,14 +1464,24 @@ msgstr "输入应用程序中的代码:"
 msgid "Input the recovery code:"
 msgstr "输入恢复代码:"
 
-#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:134
+#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:168
 msgid "Install"
 msgstr "安装"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:89
 msgid "Install successfully"
 msgstr "安装成功"
 
+#: src/constants/errors/system.ts:3
+msgid "Installation is not allowed after 10 minutes of system startup"
+msgstr "系统启动 10 分钟后不允许安装"
+
+#: src/views/other/Install.vue:113
+msgid ""
+"Installation is not allowed after 10 minutes of system startup, please "
+"restart the Nginx UI."
+msgstr "系统启动 10 分钟后不允许安装,请重启 Nginx UI。"
+
 #: src/views/preference/LogrotateSettings.vue:25
 msgid "Interval"
 msgstr "间隔"
@@ -1464,11 +1490,11 @@ msgstr "间隔"
 msgid "Invalid"
 msgstr "无效的"
 
-#: src/constants/errors/backup.ts:42
+#: src/constants/errors/backup.ts:44
 msgid "Invalid AES IV format: {0}"
 msgstr "AES IV 格式无效:{0}"
 
-#: src/constants/errors/backup.ts:41
+#: src/constants/errors/backup.ts:43
 msgid "Invalid AES key format: {0}"
 msgstr "AES 密钥格式无效:{0}"
 
@@ -1476,6 +1502,10 @@ msgstr "AES 密钥格式无效:{0}"
 msgid "Invalid file object"
 msgstr "无效文件对象"
 
+#: src/constants/errors/backup.ts:51
+msgid "Invalid file path: {0}"
+msgstr "文件路径无效:{0}"
+
 #: src/views/config/components/Rename.vue:64
 #: src/views/config/ConfigEditor.vue:250
 msgid "Invalid filename"
@@ -1489,7 +1519,7 @@ msgstr "无效文件夹名"
 msgid "Invalid otp code"
 msgstr "无效的 OTP 代码"
 
-#: src/constants/errors/backup.ts:25
+#: src/constants/errors/backup.ts:27
 msgid "Invalid padding in decrypted data"
 msgstr "解密数据中的无效填充"
 
@@ -1505,7 +1535,7 @@ msgstr "无效的恢复代码"
 msgid "Invalid request format"
 msgstr "无效的请求格式"
 
-#: src/constants/errors/backup.ts:40
+#: src/constants/errors/backup.ts:42
 msgid "Invalid security token format"
 msgstr "安全令牌格式无效"
 
@@ -1813,7 +1843,7 @@ msgstr "Nginx Conf 中未引用 sites-enabled"
 msgid "Nginx conf not include stream-enabled"
 msgstr "Nginx Conf 中未引用 stream-enabled"
 
-#: src/constants/errors/backup.ts:18
+#: src/constants/errors/backup.ts:19
 msgid "Nginx config directory is not set"
 msgstr "未设置 Nginx 配置目录"
 
@@ -1870,6 +1900,10 @@ msgstr "Nginx 重启命令"
 msgid "Nginx restarted successfully"
 msgstr "Nginx 重启成功"
 
+#: src/constants/errors/system.ts:2
+msgid "Nginx UI already installed"
+msgstr "Nginx UI 已安装"
+
 #: src/views/system/Backup/SystemRestore.vue:88
 msgid "Nginx UI configuration has been restored"
 msgstr "Nginx 用户界面配置已恢复"
@@ -2058,7 +2092,7 @@ msgstr ""
 msgid "Password"
 msgstr "密码"
 
-#: src/views/other/Install.vue:108
+#: src/views/other/Install.vue:141
 msgid "Password (*)"
 msgstr "密码 (*)"
 
@@ -2066,7 +2100,7 @@ msgstr "密码 (*)"
 msgid "Password incorrect"
 msgstr "用户名和密码错误"
 
-#: src/views/other/Install.vue:48
+#: src/views/other/Install.vue:70
 msgid "Password length cannot exceed 20 characters"
 msgstr "密码长度不能超过 20 个字符"
 
@@ -2164,15 +2198,15 @@ msgid ""
 "configuration."
 msgstr "请输入名称,这将作为新配置的文件名。"
 
-#: src/views/other/Install.vue:32
+#: src/views/other/Install.vue:54
 msgid "Please input your E-mail!"
 msgstr "请输入您的邮箱!"
 
-#: src/views/other/Install.vue:44 src/views/other/Login.vue:47
+#: src/views/other/Install.vue:66 src/views/other/Login.vue:47
 msgid "Please input your password!"
 msgstr "请输入您的密码!"
 
-#: src/views/other/Install.vue:38 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:60 src/views/other/Login.vue:41
 msgid "Please input your username!"
 msgstr "请输入您的用户名!"
 
@@ -2884,7 +2918,7 @@ msgstr ""
 "域名证书将在 30 分钟内接受检查,如果距离上次签发证书的时间超过 1 周或您在设置"
 "中设定的时间,证书将被更新。"
 
-#: src/views/other/Install.vue:54
+#: src/views/other/Install.vue:76
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr "文件名不能包含以下字符: %{c}"
 
@@ -3188,7 +3222,7 @@ msgstr "用户未启用 OTP 作为 2FA"
 msgid "Username"
 msgstr "用户名"
 
-#: src/views/other/Install.vue:98
+#: src/views/other/Install.vue:131
 msgid "Username (*)"
 msgstr "用户名 (*)"
 

+ 93 - 53
app/src/language/zh_TW/app.po

@@ -281,7 +281,7 @@ msgstr "返回"
 msgid "Backup file integrity check failed, it may have been tampered with"
 msgstr ""
 
-#: src/constants/errors/backup.ts:39
+#: src/constants/errors/backup.ts:41
 #, fuzzy
 msgid "Backup file not found: {0}"
 msgstr "站點未找到"
@@ -505,7 +505,7 @@ msgstr "命令"
 msgid "Comments"
 msgstr "備註"
 
-#: src/constants/errors/backup.ts:13
+#: src/constants/errors/backup.ts:14
 #, fuzzy
 msgid "Config path is empty"
 msgstr "明文為空"
@@ -653,7 +653,7 @@ msgstr "自訂顯示在環境指示器中的本地節點名稱。"
 msgid "Dashboard"
 msgstr "儀表板"
 
-#: src/views/other/Install.vue:119
+#: src/views/other/Install.vue:152
 msgid "Database (Optional, default: database)"
 msgstr "資料庫 (可選,預設: database)"
 
@@ -950,7 +950,7 @@ msgstr "編輯 Stream"
 msgid "Email"
 msgstr "電子郵件"
 
-#: src/views/other/Install.vue:88
+#: src/views/other/Install.vue:121
 msgid "Email (*)"
 msgstr "電子郵件 (*)"
 
@@ -1091,37 +1091,42 @@ msgstr "讀取 nginx.conf 失敗"
 msgid "Failed to backup Nginx UI files: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:17
+#: src/constants/errors/backup.ts:18
 #, fuzzy
 msgid "Failed to calculate hash: {0}"
 msgstr "創建備份失敗"
 
-#: src/constants/errors/backup.ts:53
+#: src/constants/errors/backup.ts:58
 msgid "Failed to calculate Nginx hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:52
+#: src/constants/errors/backup.ts:57
 msgid "Failed to calculate Nginx UI hash: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:14
+#: src/constants/errors/backup.ts:13
+#, fuzzy
+msgid "Failed to cleanup temporary directory: {0}"
+msgstr "創建備份失敗"
+
+#: src/constants/errors/backup.ts:15
 msgid "Failed to copy config file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:15
+#: src/constants/errors/backup.ts:16
 msgid "Failed to copy database directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:16
+#: src/constants/errors/backup.ts:17
 #, fuzzy
 msgid "Failed to copy database file: {0}"
 msgstr "停用 %{msg} 失敗"
 
-#: src/constants/errors/backup.ts:30
+#: src/constants/errors/backup.ts:32
 msgid "Failed to copy file content: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:19
+#: src/constants/errors/backup.ts:20
 msgid "Failed to copy Nginx config directory: {0}"
 msgstr ""
 
@@ -1134,12 +1139,12 @@ msgstr "創建備份失敗"
 msgid "Failed to create backup file: {0}"
 msgstr "創建備份失敗"
 
-#: src/constants/errors/backup.ts:44
+#: src/constants/errors/backup.ts:46
 #, fuzzy
 msgid "Failed to create directory: {0}"
 msgstr "創建備份失敗"
 
-#: src/constants/errors/backup.ts:46
+#: src/constants/errors/backup.ts:48
 #, fuzzy
 msgid "Failed to create file: {0}"
 msgstr "創建備份失敗"
@@ -1149,15 +1154,20 @@ msgstr "創建備份失敗"
 msgid "Failed to create hash info file: {0}"
 msgstr "創建備份失敗"
 
-#: src/constants/errors/backup.ts:45
+#: src/constants/errors/backup.ts:47
 #, fuzzy
 msgid "Failed to create parent directory: {0}"
 msgstr "創建備份失敗"
 
-#: src/constants/errors/backup.ts:32
+#: src/constants/errors/backup.ts:34
 msgid "Failed to create restore directory: {0}"
 msgstr ""
 
+#: src/constants/errors/backup.ts:50
+#, fuzzy
+msgid "Failed to create symbolic link: {0}"
+msgstr "創建備份失敗"
+
 #: src/constants/errors/backup.ts:2
 #, fuzzy
 msgid "Failed to create temporary directory"
@@ -1173,36 +1183,36 @@ msgstr "創建備份失敗"
 msgid "Failed to create zip archive: {0}"
 msgstr "創建備份失敗"
 
-#: src/constants/errors/backup.ts:27
+#: src/constants/errors/backup.ts:29
 #, fuzzy
 msgid "Failed to create zip entry: {0}"
 msgstr "創建備份失敗"
 
-#: src/constants/errors/backup.ts:26
+#: src/constants/errors/backup.ts:28
 #, fuzzy
 msgid "Failed to create zip file: {0}"
 msgstr "創建備份失敗"
 
-#: src/constants/errors/backup.ts:29
+#: src/constants/errors/backup.ts:31
 #, fuzzy
 msgid "Failed to create zip header: {0}"
 msgstr "創建備份失敗"
 
-#: src/constants/errors/backup.ts:24
+#: src/constants/errors/backup.ts:26
 #, fuzzy
 msgid "Failed to decrypt data: {0}"
 msgstr "創建備份失敗"
 
-#: src/constants/errors/backup.ts:49
+#: src/constants/errors/backup.ts:54
 #, fuzzy
 msgid "Failed to decrypt file: {0}"
 msgstr "停用 %{msg} 失敗"
 
-#: src/constants/errors/backup.ts:35
+#: src/constants/errors/backup.ts:37
 msgid "Failed to decrypt Nginx directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:34
+#: src/constants/errors/backup.ts:36
 msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 
@@ -1220,12 +1230,12 @@ msgstr "停用 %{msg} 失敗"
 msgid "Failed to enable %{msg}"
 msgstr "啟用 %{msg} 失敗"
 
-#: src/constants/errors/backup.ts:23
+#: src/constants/errors/backup.ts:25
 #, fuzzy
 msgid "Failed to encrypt data: {0}"
 msgstr "啟用 %{msg} 失敗"
 
-#: src/constants/errors/backup.ts:21
+#: src/constants/errors/backup.ts:23
 #, fuzzy
 msgid "Failed to encrypt file: {0}"
 msgstr "啟用 %{msg} 失敗"
@@ -1238,7 +1248,12 @@ msgstr ""
 msgid "Failed to encrypt Nginx UI directory: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:33
+#: src/constants/errors/backup.ts:52
+#, fuzzy
+msgid "Failed to evaluate symbolic links: {0}"
+msgstr "創建備份失敗"
+
+#: src/constants/errors/backup.ts:35
 #, fuzzy
 msgid "Failed to extract archive: {0}"
 msgstr "啟用 %{msg} 失敗"
@@ -1257,17 +1272,17 @@ msgstr "取得憑證資訊失敗"
 msgid "Failed to get certificate information"
 msgstr "取得憑證資訊失敗"
 
-#: src/constants/errors/backup.ts:28
+#: src/constants/errors/backup.ts:30
 #, fuzzy
 msgid "Failed to open source file: {0}"
 msgstr "啟用 %{msg} 失敗"
 
-#: src/constants/errors/backup.ts:47
+#: src/constants/errors/backup.ts:49
 #, fuzzy
 msgid "Failed to open zip entry: {0}"
 msgstr "啟用 %{msg} 失敗"
 
-#: src/constants/errors/backup.ts:43
+#: src/constants/errors/backup.ts:45
 #, fuzzy
 msgid "Failed to open zip file: {0}"
 msgstr "啟用 %{msg} 失敗"
@@ -1276,17 +1291,17 @@ msgstr "啟用 %{msg} 失敗"
 msgid "Failed to parse nginx.conf"
 msgstr "解析 nginx.conf 失敗"
 
-#: src/constants/errors/backup.ts:48
+#: src/constants/errors/backup.ts:53
 #, fuzzy
 msgid "Failed to read encrypted file: {0}"
 msgstr "讀取 nginx.conf 失敗"
 
-#: src/constants/errors/backup.ts:20
+#: src/constants/errors/backup.ts:22
 #, fuzzy
 msgid "Failed to read file: {0}"
 msgstr "啟用 %{msg} 失敗"
 
-#: src/constants/errors/backup.ts:51
+#: src/constants/errors/backup.ts:56
 #, fuzzy
 msgid "Failed to read hash info file: {0}"
 msgstr "讀取 nginx.conf 失敗"
@@ -1295,12 +1310,17 @@ msgstr "讀取 nginx.conf 失敗"
 msgid "Failed to read nginx.conf"
 msgstr "讀取 nginx.conf 失敗"
 
-#: src/constants/errors/backup.ts:37
+#: src/constants/errors/backup.ts:21
+#, fuzzy
+msgid "Failed to read symlink: {0}"
+msgstr "啟用 %{msg} 失敗"
+
+#: src/constants/errors/backup.ts:39
 #, fuzzy
 msgid "Failed to restore Nginx configs: {0}"
 msgstr "解析 nginx.conf 失敗"
 
-#: src/constants/errors/backup.ts:38
+#: src/constants/errors/backup.ts:40
 #, fuzzy
 msgid "Failed to restore Nginx UI files: {0}"
 msgstr "解析 nginx.conf 失敗"
@@ -1310,20 +1330,20 @@ msgstr "解析 nginx.conf 失敗"
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "儲存失敗,在設定中檢測到語法錯誤。"
 
-#: src/constants/errors/backup.ts:36
+#: src/constants/errors/backup.ts:38
 #, fuzzy
 msgid "Failed to verify hashes: {0}"
 msgstr "啟用 %{msg} 失敗"
 
-#: src/constants/errors/backup.ts:50
+#: src/constants/errors/backup.ts:55
 msgid "Failed to write decrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:22
+#: src/constants/errors/backup.ts:24
 msgid "Failed to write encrypted file: {0}"
 msgstr ""
 
-#: src/constants/errors/backup.ts:31
+#: src/constants/errors/backup.ts:33
 msgid "Failed to write to zip buffer: {0}"
 msgstr ""
 
@@ -1415,7 +1435,7 @@ msgstr "正在取得憑證,請稍候..."
 msgid "Github Proxy"
 msgstr "Github 代理"
 
-#: src/constants/errors/backup.ts:54
+#: src/constants/errors/backup.ts:59
 msgid "Hash verification failed: file integrity compromised"
 msgstr ""
 
@@ -1499,14 +1519,24 @@ msgstr "請輸入應用程式中的代碼:"
 msgid "Input the recovery code:"
 msgstr "輸入恢復碼:"
 
-#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:134
+#: src/routes/modules/auth.ts:8 src/views/other/Install.vue:168
 msgid "Install"
 msgstr "安裝"
 
-#: src/views/other/Install.vue:67
+#: src/views/other/Install.vue:89
 msgid "Install successfully"
 msgstr "安裝成功"
 
+#: src/constants/errors/system.ts:3
+msgid "Installation is not allowed after 10 minutes of system startup"
+msgstr ""
+
+#: src/views/other/Install.vue:113
+msgid ""
+"Installation is not allowed after 10 minutes of system startup, please "
+"restart the Nginx UI."
+msgstr ""
+
 #: src/views/preference/LogrotateSettings.vue:25
 msgid "Interval"
 msgstr "間隔"
@@ -1515,12 +1545,12 @@ msgstr "間隔"
 msgid "Invalid"
 msgstr "無效"
 
-#: src/constants/errors/backup.ts:42
+#: src/constants/errors/backup.ts:44
 #, fuzzy
 msgid "Invalid AES IV format: {0}"
 msgstr "無效的請求格式"
 
-#: src/constants/errors/backup.ts:41
+#: src/constants/errors/backup.ts:43
 #, fuzzy
 msgid "Invalid AES key format: {0}"
 msgstr "無效的請求格式"
@@ -1530,6 +1560,11 @@ msgstr "無效的請求格式"
 msgid "Invalid file object"
 msgstr "無效的檔案名"
 
+#: src/constants/errors/backup.ts:51
+#, fuzzy
+msgid "Invalid file path: {0}"
+msgstr "無效的請求格式"
+
 #: src/views/config/components/Rename.vue:64
 #: src/views/config/ConfigEditor.vue:250
 msgid "Invalid filename"
@@ -1543,7 +1578,7 @@ msgstr "無效的資料夾名稱"
 msgid "Invalid otp code"
 msgstr "無效的 OTP 代碼"
 
-#: src/constants/errors/backup.ts:25
+#: src/constants/errors/backup.ts:27
 msgid "Invalid padding in decrypted data"
 msgstr ""
 
@@ -1559,7 +1594,7 @@ msgstr "無效的恢復碼"
 msgid "Invalid request format"
 msgstr "無效的請求格式"
 
-#: src/constants/errors/backup.ts:40
+#: src/constants/errors/backup.ts:42
 #, fuzzy
 msgid "Invalid security token format"
 msgstr "無效的請求格式"
@@ -1867,7 +1902,7 @@ msgstr "Nginx 配置檔未包含 sites-enabled"
 msgid "Nginx conf not include stream-enabled"
 msgstr "Nginx 配置檔未包含 stream-enabled"
 
-#: src/constants/errors/backup.ts:18
+#: src/constants/errors/backup.ts:19
 #, fuzzy
 msgid "Nginx config directory is not set"
 msgstr "Nginx 日誌目錄白名單"
@@ -1926,6 +1961,11 @@ msgstr "Nginx 重啟指令"
 msgid "Nginx restarted successfully"
 msgstr "Nginx 重啟成功"
 
+#: src/constants/errors/system.ts:2
+#, fuzzy
+msgid "Nginx UI already installed"
+msgstr "此值已被使用"
+
 #: src/views/system/Backup/SystemRestore.vue:88
 #, fuzzy
 msgid "Nginx UI configuration has been restored"
@@ -2116,7 +2156,7 @@ msgstr ""
 msgid "Password"
 msgstr "密碼"
 
-#: src/views/other/Install.vue:108
+#: src/views/other/Install.vue:141
 msgid "Password (*)"
 msgstr "密碼 (*)"
 
@@ -2124,7 +2164,7 @@ msgstr "密碼 (*)"
 msgid "Password incorrect"
 msgstr "密碼錯誤"
 
-#: src/views/other/Install.vue:48
+#: src/views/other/Install.vue:70
 msgid "Password length cannot exceed 20 characters"
 msgstr "密碼長度不能超過 20 個字元"
 
@@ -2223,15 +2263,15 @@ msgid ""
 "configuration."
 msgstr "請輸入名稱,此名稱將用作新配置的檔案名稱。"
 
-#: src/views/other/Install.vue:32
+#: src/views/other/Install.vue:54
 msgid "Please input your E-mail!"
 msgstr "請輸入您的電子郵件!"
 
-#: src/views/other/Install.vue:44 src/views/other/Login.vue:47
+#: src/views/other/Install.vue:66 src/views/other/Login.vue:47
 msgid "Please input your password!"
 msgstr "請輸入您的密碼!"
 
-#: src/views/other/Install.vue:38 src/views/other/Login.vue:41
+#: src/views/other/Install.vue:60 src/views/other/Login.vue:41
 msgid "Please input your username!"
 msgstr "請輸入您的使用者名稱!"
 
@@ -2969,7 +3009,7 @@ msgstr ""
 "網域憑證將在 30 分鐘內接受檢查,如果自上次簽發以來已超過 1 週或您在設置中設定"
 "的時間,憑證將會自動更新。"
 
-#: src/views/other/Install.vue:54
+#: src/views/other/Install.vue:76
 msgid "The filename cannot contain the following characters: %{c}"
 msgstr "檔名不能包含以下字元: %{c}"
 
@@ -3274,7 +3314,7 @@ msgstr "使用者未啟用 OTP 作為雙重身份驗證 (2FA)"
 msgid "Username"
 msgstr "使用者名稱"
 
-#: src/views/other/Install.vue:98
+#: src/views/other/Install.vue:131
 msgid "Username (*)"
 msgstr "使用者名稱 (*)"
 

+ 13 - 10
app/src/lib/http/index.ts

@@ -50,27 +50,30 @@ const instance = axios.create({
 })
 
 const http = {
-  get(url: string, config: HttpConfig = {}) {
+  // eslint-disable-next-line ts/no-explicit-any
+  get<T = any>(url: string, config: HttpConfig = {}) {
     // eslint-disable-next-line ts/no-explicit-any
-    return instance.get<any, any>(url, config)
+    return instance.get<any, T>(url, config)
   },
   // eslint-disable-next-line ts/no-explicit-any
-  post(url: string, data: any = undefined, config: HttpConfig = {}) {
+  post<T = any>(url: string, data: any = undefined, config: HttpConfig = {}) {
     // eslint-disable-next-line ts/no-explicit-any
-    return instance.post<any, any>(url, data, config)
+    return instance.post<any, T>(url, data, config)
   },
   // eslint-disable-next-line ts/no-explicit-any
-  put(url: string, data: any = undefined, config: HttpConfig = {}) {
+  put<T = any>(url: string, data: any = undefined, config: HttpConfig = {}) {
     // eslint-disable-next-line ts/no-explicit-any
-    return instance.put<any, any>(url, data, config)
+    return instance.put<any, T>(url, data, config)
   },
-  delete(url: string, config: HttpConfig = {}) {
+  // eslint-disable-next-line ts/no-explicit-any
+  delete<T = any>(url: string, config: HttpConfig = {}) {
     // eslint-disable-next-line ts/no-explicit-any
-    return instance.delete<any, any>(url, config)
+    return instance.delete<any, T>(url, config)
   },
-  patch(url: string, config: HttpConfig = {}) {
+  // eslint-disable-next-line ts/no-explicit-any
+  patch<T = any>(url: string, config: HttpConfig = {}) {
     // eslint-disable-next-line ts/no-explicit-any
-    return instance.patch<any, any>(url, config)
+    return instance.patch<any, T>(url, config)
   },
 }
 

+ 39 - 5
app/src/views/other/Install.vue

@@ -1,20 +1,42 @@
 <script setup lang="ts">
+import type { InstallLockResponse } from '@/api/install'
 import install from '@/api/install'
 import SetLanguage from '@/components/SetLanguage/SetLanguage.vue'
 import SwitchAppearance from '@/components/SwitchAppearance/SwitchAppearance.vue'
 import { DatabaseOutlined, LockOutlined, MailOutlined, UserOutlined } from '@ant-design/icons-vue'
 
 import { Form, message } from 'ant-design-vue'
-import { useRouter } from 'vue-router'
 
 const thisYear = new Date().getFullYear()
 const loading = ref(false)
+const installTimeout = ref(false)
 
 const router = useRouter()
 
-install.get_lock().then(async (r: { lock: boolean }) => {
-  if (r.lock)
-    await router.push('/login')
+function init() {
+  install.get_lock().then(async (r: InstallLockResponse) => {
+    if (r.lock)
+      await router.push('/login')
+
+    if (r.timeout) {
+      installTimeout.value = true
+    }
+  })
+}
+
+onMounted(() => {
+  if (import.meta.env.DEV) {
+    const route = useRoute()
+    if (route.query.install !== 'false') {
+      init()
+    }
+    else {
+      installTimeout.value = route.query.timeout === 'true'
+    }
+  }
+  else {
+    init()
+  }
 })
 
 const modelRef = reactive({
@@ -66,6 +88,10 @@ function onSubmit() {
     install.install_nginx_ui(modelRef).then(async () => {
       message.success($gettext('Install successfully'))
       await router.push('/login')
+    }).catch(error => {
+      if (error && error.code === 40308) {
+        installTimeout.value = true
+      }
     }).finally(() => {
       loading.value = false
     })
@@ -81,7 +107,14 @@ function onSubmit() {
           <div class="project-title">
             <h1>Nginx UI</h1>
           </div>
-          <AForm id="components-form-install">
+          <AAlert
+            v-if="installTimeout"
+            type="warning"
+            :message="$gettext('Installation is not allowed after 10 minutes of system startup, please restart the Nginx UI.')"
+            show-icon
+            style="margin-bottom: 20px;"
+          />
+          <AForm v-else id="components-form-install">
             <AFormItem v-bind="validateInfos.email">
               <AInput
                 v-model:value="modelRef.email"
@@ -129,6 +162,7 @@ function onSubmit() {
                 block
                 html-type="submit"
                 :loading="loading"
+                :disabled="installTimeout"
                 @click="onSubmit"
               >
                 {{ $gettext('Install') }}

+ 2 - 1
internal/system/errors.go

@@ -5,5 +5,6 @@ import "github.com/uozi-tech/cosy"
 // System error definitions
 var (
 	e                 = cosy.NewErrorScope("system")
-	ErrInstallTimeout = e.New(40308, "installation is not allowed after 10 minutes of system startup")
+	ErrInstalled      = e.New(40301, "Nginx UI already installed")
+	ErrInstallTimeout = e.New(40302, "installation is not allowed after 10 minutes of system startup")
 )