Selaa lähdekoodia

enhance: responsiveness in dashboard views

0xJacky 3 viikkoa sitten
vanhempi
commit
93b81b52df

+ 4 - 12
app/src/components/Chart/UsageProgressLine.vue

@@ -23,12 +23,12 @@ const fixed_percent = computed(() => {
 
 <template>
   <div>
-    <div>
+    <div class="flex items-center">
       <span class="slot-icon"><slot name="icon" /></span>
       <span class="slot">
         <slot />
       </span>
-      <span class="dot"> ·</span> {{ `${fixed_percent}%` }}
+      <span class="dot mx-2">·</span>{{ `${fixed_percent}%` }}
     </div>
     <AProgress
       :percent="fixed_percent"
@@ -41,15 +41,7 @@ const fixed_percent = computed(() => {
 <style scoped lang="less">
 .slot-icon {
   margin-right: 5px;
-}
-
-@media (max-width: 1000px) and  (min-width: 600px) {
-  .dot {
-    display: none;
-  }
-
-  .slot {
-    display: none;
-  }
+  display: flex;
+  align-items: center;
 }
 </style>

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

@@ -5,8 +5,8 @@ msgid ""
 msgstr ""
 "PO-Revision-Date: 2025-07-14 07:37+0000\n"
 "Last-Translator: mosaati <mohammed.saati@gmail.com>\n"
-"Language-Team: Arabic <https://weblate.nginxui.com/projects/nginx-ui/"
-"frontend/ar/>\n"
+"Language-Team: Arabic "
+"<https://weblate.nginxui.com/projects/nginx-ui/frontend/ar/>\n"
 "Language: ar\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -166,8 +166,8 @@ msgstr "نسبة العامل الفعلي إلى المُهيأ"
 msgid "Add"
 msgstr "إضافة"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgstr "إضافة مفتاح مرور"
 
@@ -219,7 +219,7 @@ msgstr "إضافي"
 msgid "Advance Mode"
 msgstr "الوضع المتقدم"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:99
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:104
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr "بعد ذلك، قم بتحديث هذه الصفحة وانقر على إضافة مفتاح مرور مرة أخرى."
 
@@ -545,7 +545,7 @@ msgstr "تعديل متعدد"
 msgid "Batch Upgrade"
 msgstr "ترقية متعددة"
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgstr "فيما يلي العناصر المحددة التي تريد تعديلها دفعة واحدة"
 
@@ -614,7 +614,7 @@ msgstr ""
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
-#: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/components/NgxConfigEditor/NgxUpstream.vue:37 src/language/curd.ts:37
 #: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
@@ -936,11 +936,11 @@ msgstr "تم المسح بنجاح"
 msgid "Click or drag backup file to this area to upload"
 msgstr "انقر فوق أو اسحب ملف النسخ الاحتياطي إلى هذه المنطقة للتحميل"
 
-#: src/language/curd.ts:49 src/language/curd.ts:53
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Click or drag files to this area to upload"
 msgstr "انقر أو اسحب الملفات إلى هذه المنطقة للتحميل"
 
-#: src/language/curd.ts:50 src/language/curd.ts:54
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Click or drag folders to this area to upload"
 msgstr "انقر أو اسحب المجلدات إلى هذه المنطقة للتحميل"
 
@@ -1072,7 +1072,7 @@ msgstr "تكوين SSL"
 msgid "Confirm New Password"
 msgstr "تأكيد كلمة المرور الجديدة"
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgstr "متصل"
 
@@ -1597,7 +1597,7 @@ msgstr "تنزيل الإصدار الأحدث"
 msgid "Dry run mode enabled"
 msgstr "تمكين وضع التشغيل التجريبي"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
@@ -2271,7 +2271,7 @@ msgstr "مجلد"
 msgid "Folder"
 msgstr "مجلد"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
@@ -2440,7 +2440,7 @@ msgid ""
 "option."
 msgstr "إذا كنت ترغب في إلغاء الشهادة القديمة تلقائيًا، يرجى تمكين هذا الخيار."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr "إذا كان متصفحك يدعم WebAuthn Passkey، ستظهر نافذة حوار."
 
@@ -2686,7 +2686,7 @@ msgstr "اتركه فارغًا لعدم التغيير"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "اتركه فارغًا للإعداد الافتراضي: /https://api.openai.com"
 
-#: src/language/curd.ts:37
+#: src/language/curd.ts:39
 msgid "Leave blank if do not want to modify"
 msgstr "اتركه فارغًا إذا كنت لا تريد التعديل"
 
@@ -2711,10 +2711,10 @@ msgstr "تعطيل دعم CNAME في Lego"
 msgid "License"
 msgstr "رخصة"
 
-#: src/views/dashboard/Environments.vue:133
-#: src/views/dashboard/Environments.vue:148
-msgid "Link Start"
-msgstr "ابدأ الرابط"
+#: src/views/dashboard/components/NodeAnalyticItem.vue:116
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
+msgid "Link"
+msgstr "ربط"
 
 #: src/language/curd.ts:23
 msgid "List"
@@ -2800,7 +2800,7 @@ msgstr ""
 msgid "Log List"
 msgstr "قائمة السجلات"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:271
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:277
 msgid "Login"
 msgstr "تسجيل الدخول"
 
@@ -3044,7 +3044,7 @@ msgstr "توجيه متعدد الأسطر"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:80
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3072,14 +3072,6 @@ msgstr "شبكة"
 msgid "Network Statistics"
 msgstr "إحصائيات الشبكة"
 
-#: src/views/dashboard/ServerAnalytic.vue:283
-msgid "Network Total Receive"
-msgstr "إجمالي استقبال الشبكة"
-
-#: src/views/dashboard/ServerAnalytic.vue:289
-msgid "Network Total Send"
-msgstr "إجمالي إرسال الشبكة"
-
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgstr "خطأ في مزود تحدي DNS الجديد: {0}"
@@ -3189,7 +3181,7 @@ msgstr "مسار تكوين Nginx"
 msgid "Nginx Configurations Directory"
 msgstr "مجلد تكوينات Nginx"
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgstr "التحكم في Nginx"
 
@@ -3328,7 +3320,7 @@ msgstr "يتضمن Nginx.conf دليل streams-enabled"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
-#: src/components/Notification/Notification.vue:108 src/language/curd.ts:38
+#: src/components/Notification/Notification.vue:108 src/language/curd.ts:40
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3485,7 +3477,7 @@ msgstr "الوثيقة الرسمية"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
-#: src/views/dashboard/Environments.vue:99
+#: src/views/dashboard/Environments.vue:101
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgstr "غير متصل"
@@ -3518,7 +3510,7 @@ msgstr "بمجرد اكتمال التحقق، سيتم إزالة السجلا
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
-#: src/views/dashboard/Environments.vue:92
+#: src/views/dashboard/Environments.vue:94
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgstr "متصل"
@@ -3535,7 +3527,7 @@ msgstr "مفتوح"
 msgid "OpenAI"
 msgstr "أوبن أي آي"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:280
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:286
 msgid "Or"
 msgstr "أو"
 
@@ -3608,7 +3600,7 @@ msgstr ""
 "التعرف على الوجه أو كلمة مرور الجهاز أو رقم التعريف الشخصي. يمكن استخدامها "
 "كبديل لكلمة المرور أو كطريقة للمصادقة الثنائية."
 
-#: src/views/other/Login.vue:232 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:238 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "كلمة المرور"
 
@@ -3634,7 +3626,7 @@ msgstr "كلمات المرور غير متطابقة"
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3702,7 +3694,7 @@ msgstr ""
 "يرجى تمكين وحدة stub_status للحصول على إحصائيات الطلبات وعدد الاتصالات وما "
 "إلى ذلك."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
@@ -3879,7 +3871,7 @@ msgstr "توزيع العمليات"
 msgid "Process information"
 msgstr "معلومات العملية"
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgstr "جاري المعالجة {count}/{total}"
 
@@ -3997,7 +3989,7 @@ msgstr "فشل التسجيل"
 msgid "Register On Startup"
 msgstr "التسجيل عند بدء التشغيل"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgstr "تم تسجيل مفتاح المرور بنجاح"
 
@@ -4022,7 +4014,7 @@ msgid "Release Note"
 msgstr "ملاحظة الإصدار"
 
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgstr "إعادة تحميل"
 
@@ -4058,7 +4050,7 @@ msgstr "إعادة تحميل Nginx البعيد بنجاح"
 msgid "Reload request failed, please check your network connection"
 msgstr "فشل طلب إعادة التحميل، يرجى التحقق من اتصال الشبكة لديك"
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgstr "إعادة التحميل"
 
@@ -4209,7 +4201,7 @@ msgstr ""
 msgid "Responses"
 msgstr "الردود"
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgstr "إعادة تشغيل"
 
@@ -4239,7 +4231,7 @@ msgstr "إعادة تشغيل Nginx البعيد بنجاح"
 msgid "Restart request failed, please check your network connection"
 msgstr "فشل طلب إعادة التشغيل، يرجى التحقق من اتصال الشبكة لديك"
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgstr "إعادة التشغيل"
 
@@ -4315,7 +4307,7 @@ msgstr "معرّف الجهاز عن بُعد"
 msgid "Run Mode"
 msgstr "وضع التشغيل"
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgstr "يعمل"
 
@@ -4483,6 +4475,10 @@ msgstr "فشل حفظ الدفق %{name} إلى %{node}"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "تم حفظ الدفق %{name} في %{node} بنجاح"
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr "تم الحفظ بنجاح"
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
@@ -4571,7 +4567,7 @@ msgstr "تحديد الكل"
 msgid "Select an action after sync"
 msgstr "اختر إجراءً بعد المزامنة"
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgstr "تم تحديد {count} ملفات"
 
@@ -4685,7 +4681,7 @@ msgstr "منطقة الذاكرة المشتركة"
 msgid "Show"
 msgstr "عرض"
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgstr "تسجيل الدخول باستخدام مفتاح المرور"
 
@@ -4729,7 +4725,7 @@ msgstr "دليل Sites-available غير موجود"
 msgid "Sites-enabled directory not exist"
 msgstr "دليل sites-enabled غير موجود"
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgstr "الحجم"
 
@@ -4794,7 +4790,7 @@ msgstr "مسار مفتاح SSL"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "مسار مفتاح SSL مطلوب عند تمكين HTTPS"
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgstr "تسجيل الدخول عبر SSO"
 
@@ -4829,7 +4825,7 @@ msgstr "ثابت"
 msgid "Status"
 msgstr "الحالة"
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr "متوقف"
 
@@ -4930,11 +4926,11 @@ msgstr ""
 "Nginx عبر وكيل عكسي لـ Nginx، يرجى الرجوع إلى هذا الرابط لكتابة ملف التكوين "
 "المقابل: https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51 src/language/curd.ts:55
+#: src/language/curd.ts:53 src/language/curd.ts:57
 msgid "Support single or batch upload of files"
 msgstr "يدعم تحميل ملف واحد أو مجموعة من الملفات"
 
-#: src/language/curd.ts:52 src/language/curd.ts:56
+#: src/language/curd.ts:54 src/language/curd.ts:58
 msgid "Support uploading entire folders"
 msgstr "دعم تحميل المجلدات بأكملها"
 
@@ -5080,8 +5076,7 @@ msgstr ""
 msgid ""
 "The ICP Number should only contain letters, unicode, numbers, hyphens, "
 "dashes, colons, and dots."
-msgstr ""
-"يجب أن يحتوي رقم ICP على أحرف، يونيكود، أرقام، شرطات، نقاط، ونقطتين فقط."
+msgstr "يجب أن يحتوي رقم ICP على أحرف، يونيكود، أرقام، شرطات، نقاط، ونقطتين فقط."
 
 #: src/views/certificate/CertificateEditor.vue:214
 msgid "The input is not a SSL Certificate"
@@ -5118,8 +5113,7 @@ msgstr ""
 msgid ""
 "The node name should only contain letters, unicode, numbers, hyphens, "
 "dashes, colons, and dots."
-msgstr ""
-"يجب أن يحتوي اسم العقدة على أحرف، يونيكود، أرقام، شرطات، نقاط، ونقطتين فقط."
+msgstr "يجب أن يحتوي اسم العقدة على أحرف، يونيكود، أرقام، شرطات، نقاط، ونقطتين فقط."
 
 #: src/views/site/site_add/SiteAdd.vue:96
 msgid "The parameter of server_name is required"
@@ -5141,7 +5135,7 @@ msgstr ""
 "يجب أن يحتوي رقم الأمن العام على أحرف وunicode وأرقام وواصلات وشرطات ونقاط "
 "فقط."
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5208,15 +5202,15 @@ msgstr "هذا الدليل محمي ولا يمكن حذفه لأمان الن
 msgid "This field is required"
 msgstr "هذا الحقل مطلوب"
 
-#: src/constants/form_errors.ts:3 src/language/curd.ts:41
+#: src/constants/form_errors.ts:3 src/language/curd.ts:43
 msgid "This field should be a valid email address"
 msgstr "يجب أن يكون هذا الحقل عنوان بريد إلكتروني صالحًا"
 
-#: src/constants/form_errors.ts:5 src/language/curd.ts:43
+#: src/constants/form_errors.ts:5 src/language/curd.ts:45
 msgid "This field should be a valid hostname"
 msgstr "يجب أن يكون هذا الحقل اسم مضيف صالحًا"
 
-#: src/constants/form_errors.ts:2 src/language/curd.ts:40
+#: src/constants/form_errors.ts:2 src/language/curd.ts:42
 msgid "This field should not be empty"
 msgstr "يجب ألا يكون هذا الحقل فارغًا"
 
@@ -5224,7 +5218,7 @@ msgstr "يجب ألا يكون هذا الحقل فارغًا"
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "يجب أن يحتوي هذا الحقل على حروف وأحرف يونيكود وأرقام و-_. فقط."
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "-_./:"
@@ -5254,7 +5248,7 @@ msgstr ""
 "سيتم عرض هذا الرمز مرة واحدة فقط ولا يمكن استرداده لاحقًا. يرجى التأكد من "
 "حفظه في مكان آمن."
 
-#: src/constants/form_errors.ts:4 src/language/curd.ts:42
+#: src/constants/form_errors.ts:4 src/language/curd.ts:44
 msgid "This value is already taken"
 msgstr "هذه القيمة مستخدمة مسبقا"
 
@@ -5292,7 +5286,7 @@ msgstr "كبح"
 msgid "Thursday"
 msgstr "الخميس"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:65
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
 #: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
@@ -5322,7 +5316,7 @@ msgstr ""
 "لتفعيله، تحتاج إلى تثبيت تطبيق Google Authenticator أو Microsoft "
 "Authenticator على هاتفك المحمول."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
@@ -5387,6 +5381,10 @@ msgstr "إجمالي عمليات Nginx"
 msgid "Total Nginx Processes"
 msgstr "إجمالي عمليات Nginx"
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "إجمالي الاستقبال"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
@@ -5396,6 +5394,10 @@ msgstr "إجمالي الطلبات"
 msgid "Total Requests / Total Connections"
 msgstr "إجمالي الطلبات / إجمالي الاتصالات"
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr "إجمالي الإرسال"
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgstr "كلمة مرور لمرة واحدة تعتمد على الوقت"
@@ -5489,11 +5491,11 @@ msgstr "تم الترقية بنجاح"
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "جارٍ ترقية Nginx UI، يرجى الانتظار..."
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgstr "تحميل الملفات"
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgstr "تحميل المجلدات"
 
@@ -5545,7 +5547,7 @@ msgstr "المستخدم لم يتم تفعيل OTP كعامل ثنائي"
 msgid "User Profile"
 msgstr "ملف المستخدم"
 
-#: src/views/other/Login.vue:222 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "اسم المستخدم"
@@ -5611,7 +5613,7 @@ msgstr "عمليات الانتظار"
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgstr "تحذير"
 
@@ -5774,7 +5776,7 @@ msgstr "يمكنك إغلاق هذه النافذة خلال %{countdown} ثان
 msgid "You can close this dialog now"
 msgstr "يمكنك إغلاق هذا الحوار الآن"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
@@ -5807,6 +5809,9 @@ msgstr "رموزك القديمة لن تعمل بعد الآن."
 msgid "Your passkeys"
 msgstr "مفاتيح المرور الخاصة بك"
 
+#~ msgid "Link Start"
+#~ msgstr "ابدأ الرابط"
+
 #~ msgid "Enable failed"
 #~ msgstr "فشل التفعيل"
 

+ 2 - 0
app/src/language/curd.ts

@@ -33,6 +33,8 @@ export const translations = {
   pleaseSelectAtLeastOneItem: $gettext('Please select at least one item'),
   batchModify: $gettext('Batch Modify'),
   saveSuccessfully: $gettext('Save successfully'),
+  saveSuccess: $gettext('Save successful'),
+  cancel: $gettext('Cancel'),
   belowsAreSelectedItems: $gettext('Belows are selected items that you want to batch modify'),
   leaveBlankIfDoNotWantToModify: $gettext('Leave blank if do not want to modify'),
   no: $gettext('No'),

+ 67 - 60
app/src/language/de_DE/app.po

@@ -165,8 +165,8 @@ msgstr "Tatsächliches Verhältnis von Arbeitern zu konfigurierten"
 msgid "Add"
 msgstr "Hinzufügen"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgstr "Passkey hinzufügen"
 
@@ -218,7 +218,7 @@ msgstr "Zusätzlich"
 msgid "Advance Mode"
 msgstr "Erweiterter Modus"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:99
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:104
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr ""
 "Aktualisieren Sie anschließend diese Seite und klicken Sie erneut auf "
@@ -558,7 +558,7 @@ msgstr "Stapelverarbeitung"
 msgid "Batch Upgrade"
 msgstr "Stapel-Upgrade"
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgstr "Hier sind die ausgewählten Elemente, die Sie stapelweise ändern möchten"
 
@@ -629,7 +629,7 @@ msgstr ""
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
-#: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/components/NgxConfigEditor/NgxUpstream.vue:37 src/language/curd.ts:37
 #: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
@@ -949,11 +949,11 @@ msgstr ""
 "Klicken Sie auf oder ziehen Sie die Sicherungsdatei in diesen Bereich, um "
 "hochzuladen"
 
-#: src/language/curd.ts:49 src/language/curd.ts:53
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Click or drag files to this area to upload"
 msgstr "Klicken oder ziehen Sie Dateien in diesen Bereich zum Hochladen"
 
-#: src/language/curd.ts:50 src/language/curd.ts:54
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Click or drag folders to this area to upload"
 msgstr "Klicken Sie oder ziehen Sie Ordner in diesen Bereich zum Hochladen"
 
@@ -1085,7 +1085,7 @@ msgstr "SSL konfigurieren"
 msgid "Confirm New Password"
 msgstr "Neues Passwort bestätigen"
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgstr "Verbunden"
 
@@ -1614,7 +1614,7 @@ msgstr "Neueste Version wird heruntergeladen"
 msgid "Dry run mode enabled"
 msgstr "Dry-Run-Modus aktiviert"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
@@ -2291,7 +2291,7 @@ msgstr "Ordner"
 msgid "Folder"
 msgstr "Ordner"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
@@ -2465,7 +2465,7 @@ msgstr ""
 "Wenn Sie das alte Zertifikat automatisch widerrufen möchten, aktivieren Sie "
 "bitte diese Option."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr ""
 "Wenn dein Browser WebAuthn Passkey unterstützt, wird ein Dialogfeld "
@@ -2713,7 +2713,7 @@ msgstr "Leer lassen für keine Änderung"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "Leer lassen für den Standard: https://api.openai.com/"
 
-#: src/language/curd.ts:37
+#: src/language/curd.ts:39
 msgid "Leave blank if do not want to modify"
 msgstr "Leer lassen, wenn keine Änderung gewünscht ist"
 
@@ -2738,10 +2738,10 @@ msgstr "Lego deaktiviert CNAME-Unterstützung"
 msgid "License"
 msgstr "Lizenz"
 
-#: src/views/dashboard/Environments.vue:133
-#: src/views/dashboard/Environments.vue:148
-msgid "Link Start"
-msgstr "Link Start"
+#: src/views/dashboard/components/NodeAnalyticItem.vue:116
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
+msgid "Link"
+msgstr "Verknüpfung"
 
 #: src/language/curd.ts:23
 msgid "List"
@@ -2827,7 +2827,7 @@ msgstr ""
 msgid "Log List"
 msgstr "Protokollliste"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:271
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:277
 msgid "Login"
 msgstr "Login"
 
@@ -3072,7 +3072,7 @@ msgstr "Mehrzeilige Direktive"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:80
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3100,14 +3100,6 @@ msgstr "Netzwerk"
 msgid "Network Statistics"
 msgstr "Netzwerkstatistiken"
 
-#: src/views/dashboard/ServerAnalytic.vue:283
-msgid "Network Total Receive"
-msgstr "Gesamter Netzwerkempfang"
-
-#: src/views/dashboard/ServerAnalytic.vue:289
-msgid "Network Total Send"
-msgstr "Gesamter Netzwerkversand"
-
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgstr "Fehler beim neuen DNS-Herausforderungsanbieter: {0}"
@@ -3217,7 +3209,7 @@ msgstr "Nginx-Konfigurationspfad"
 msgid "Nginx Configurations Directory"
 msgstr "Nginx-Konfigurationsverzeichnis"
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgstr "Nginx-Steuerung"
 
@@ -3358,7 +3350,7 @@ msgstr "Nginx.conf enthält das streams-enabled-Verzeichnis"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
-#: src/components/Notification/Notification.vue:108 src/language/curd.ts:38
+#: src/components/Notification/Notification.vue:108 src/language/curd.ts:40
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3518,7 +3510,7 @@ msgstr "Offizielle Dokumentation"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
-#: src/views/dashboard/Environments.vue:99
+#: src/views/dashboard/Environments.vue:101
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgstr "Offline"
@@ -3551,7 +3543,7 @@ msgstr "Sobaöd die Überprüfung abgeschlossen ist, werden die Einträge entfer
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
-#: src/views/dashboard/Environments.vue:92
+#: src/views/dashboard/Environments.vue:94
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgstr "Online"
@@ -3568,7 +3560,7 @@ msgstr "Offen"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:280
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:286
 msgid "Or"
 msgstr "Oder"
 
@@ -3641,7 +3633,7 @@ msgstr ""
 "Berührung, Gesichtserkennung, ein Gerätepasswort oder eine PIN validieren. "
 "Sie können als Passwortersatz oder als 2FA-Methode verwendet werden."
 
-#: src/views/other/Login.vue:232 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:238 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "Passwort"
 
@@ -3667,7 +3659,7 @@ msgstr "Passwörter stimmen nicht überein"
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3735,7 +3727,7 @@ msgstr ""
 "Bitte aktivieren Sie das stub_status-Modul, um Anforderungsstatistiken, "
 "Verbindungsanzahl usw. zu erhalten."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
@@ -3927,7 +3919,7 @@ msgstr "Prozessverteilung"
 msgid "Process information"
 msgstr "Prozessinformationen"
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgstr "Verarbeite {count}/{total}"
 
@@ -4049,7 +4041,7 @@ msgstr "Registrierung fehlgeschlagen"
 msgid "Register On Startup"
 msgstr "Registrieren beim Start"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgstr "Passkey erfolgreich registriert"
 
@@ -4074,7 +4066,7 @@ msgid "Release Note"
 msgstr "Änderungsprotokoll"
 
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgstr "Neu laden"
 
@@ -4112,7 +4104,7 @@ msgstr ""
 "Die Neulade-Anfrage ist fehlgeschlagen, bitte überprüfen Sie Ihre "
 "Netzwerkverbindung"
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgstr "Lade neu"
 
@@ -4264,7 +4256,7 @@ msgstr ""
 msgid "Responses"
 msgstr "Antworten"
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgstr "Neustart"
 
@@ -4296,7 +4288,7 @@ msgstr ""
 "Neustart-Anforderung fehlgeschlagen, bitte überprüfen Sie Ihre "
 "Netzwerkverbindung"
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgstr "Starte neu"
 
@@ -4372,7 +4364,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgstr "Betriebsmodus"
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgstr "Arbeite"
 
@@ -4540,6 +4532,10 @@ msgstr "Speichern des Streams %{name} auf %{node} fehlgeschlagen"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Stream %{name} erfolgreich auf %{node} gespeichert"
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr "Erfolgreich gespeichert"
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
@@ -4628,7 +4624,7 @@ msgstr "Alle auswählen"
 msgid "Select an action after sync"
 msgstr "Aktion nach der Synchronisierung auswählen"
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgstr "Ausgewählte {count} Dateien"
 
@@ -4746,7 +4742,7 @@ msgstr "Gemeinsamer Speicherbereich"
 msgid "Show"
 msgstr "Zeige"
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgstr "Mit einem Passkey anmelden"
 
@@ -4790,7 +4786,7 @@ msgstr "Sites-available-Verzeichnis existiert nicht"
 msgid "Sites-enabled directory not exist"
 msgstr "Sites-enabled-Verzeichnis existiert nicht"
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgstr "Größe"
 
@@ -4859,7 +4855,7 @@ msgstr "SSL-Schlüsselpfad"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "Der SSL-Schlüsselpfad ist erforderlich, wenn HTTPS aktiviert ist"
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgstr "SSO-Anmeldung"
 
@@ -4894,7 +4890,7 @@ msgstr "Statisch"
 msgid "Status"
 msgstr "Status"
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr "Gestoppt"
 
@@ -4998,11 +4994,11 @@ msgstr ""
 "bitte diesen Link, um die entsprechende Konfigurationsdatei zu schreiben: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51 src/language/curd.ts:55
+#: src/language/curd.ts:53 src/language/curd.ts:57
 msgid "Support single or batch upload of files"
 msgstr "Einzel- oder Stapel-Upload von Dateien unterstützen"
 
-#: src/language/curd.ts:52 src/language/curd.ts:56
+#: src/language/curd.ts:54 src/language/curd.ts:58
 msgid "Support uploading entire folders"
 msgstr "Unterstützt das Hochladen ganzer Ordner"
 
@@ -5214,7 +5210,7 @@ msgstr ""
 "Die öffentliche Sicherheitsnummer sollte nur Buchstaben, Unicode, Zahlen, "
 "Bindestriche, Doppelpunkte und Punkte enthalten."
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5284,15 +5280,15 @@ msgstr ""
 msgid "This field is required"
 msgstr "Dieses Feld ist erforderlich"
 
-#: src/constants/form_errors.ts:3 src/language/curd.ts:41
+#: src/constants/form_errors.ts:3 src/language/curd.ts:43
 msgid "This field should be a valid email address"
 msgstr "Dieses Feld sollte eine gültige E-Mail-Adresse sein"
 
-#: src/constants/form_errors.ts:5 src/language/curd.ts:43
+#: src/constants/form_errors.ts:5 src/language/curd.ts:45
 msgid "This field should be a valid hostname"
 msgstr "Dieses Feld sollte ein gültiger Hostname sein"
 
-#: src/constants/form_errors.ts:2 src/language/curd.ts:40
+#: src/constants/form_errors.ts:2 src/language/curd.ts:42
 msgid "This field should not be empty"
 msgstr "Dieses Feld darf nicht leer sein"
 
@@ -5300,7 +5296,7 @@ msgstr "Dieses Feld darf nicht leer sein"
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "Dieses Feld sollte nur Buchstaben, Unicode-Zeichen, Zahlen und -_ enthalten."
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "-_./:"
@@ -5331,7 +5327,7 @@ msgstr ""
 "abgerufen werden. Bitte stellen Sie sicher, dass Sie es an einem sicheren "
 "Ort speichern."
 
-#: src/constants/form_errors.ts:4 src/language/curd.ts:42
+#: src/constants/form_errors.ts:4 src/language/curd.ts:44
 msgid "This value is already taken"
 msgstr "Dieser Wert ist bereits vergeben"
 
@@ -5371,7 +5367,7 @@ msgstr "Begrenzung"
 msgid "Thursday"
 msgstr "Donnerstag"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:65
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
 #: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
@@ -5403,7 +5399,7 @@ msgstr ""
 "Um es zu aktivieren, musst du die Google- oder Microsoft Authenticator-App "
 "auf deinem Handy installieren."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
@@ -5469,6 +5465,10 @@ msgstr "Gesamte Nginx-Prozesse"
 msgid "Total Nginx Processes"
 msgstr "Gesamtzahl der Nginx-Prozesse"
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "Gesamter Empfang"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
@@ -5478,6 +5478,10 @@ msgstr "Gesamtanfragen"
 msgid "Total Requests / Total Connections"
 msgstr "Gesamte Anfragen / Gesamte Verbindungen"
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr "Gesendet insgesamt"
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgstr "TOTP"
@@ -5571,11 +5575,11 @@ msgstr "Erfolgreich aktualisiert"
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "Upgrade von Nginx UI, bitte warten..."
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgstr "Dateien hochladen"
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgstr "Ordner hochladen"
 
@@ -5627,7 +5631,7 @@ msgstr "Benutzer hat OTP nicht als 2FA aktiviert"
 msgid "User Profile"
 msgstr "Benutzerprofil"
 
-#: src/views/other/Login.vue:222 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Benutzername"
@@ -5693,7 +5697,7 @@ msgstr "Warteverfahren"
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgstr "Warnung"
 
@@ -5867,7 +5871,7 @@ msgstr "Sie können diesen Dialog in %{countdown} Sekunden schließen"
 msgid "You can close this dialog now"
 msgstr "Sie können dieses Dialogfeld jetzt schließen"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
@@ -5903,6 +5907,9 @@ msgstr "Ihre alten Codes funktionieren nicht mehr."
 msgid "Your passkeys"
 msgstr "Deine Passkeys"
 
+#~ msgid "Link Start"
+#~ msgstr "Link Start"
+
 #~ msgid "Enable failed"
 #~ msgstr "Aktivieren fehlgeschlagen"
 

+ 63 - 59
app/src/language/en/app.po

@@ -149,8 +149,8 @@ msgstr ""
 msgid "Add"
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgstr ""
 
@@ -202,7 +202,7 @@ msgstr ""
 msgid "Advance Mode"
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:99
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:104
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr ""
 
@@ -525,7 +525,7 @@ msgstr ""
 msgid "Batch Upgrade"
 msgstr ""
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgstr ""
 
@@ -592,7 +592,7 @@ msgstr ""
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
-#: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/components/NgxConfigEditor/NgxUpstream.vue:37 src/language/curd.ts:37
 #: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
@@ -875,11 +875,11 @@ msgstr ""
 msgid "Click or drag backup file to this area to upload"
 msgstr ""
 
-#: src/language/curd.ts:49 src/language/curd.ts:53
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Click or drag files to this area to upload"
 msgstr ""
 
-#: src/language/curd.ts:50 src/language/curd.ts:54
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Click or drag folders to this area to upload"
 msgstr ""
 
@@ -1011,7 +1011,7 @@ msgstr ""
 msgid "Confirm New Password"
 msgstr ""
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgstr ""
 
@@ -1530,7 +1530,7 @@ msgstr ""
 msgid "Dry run mode enabled"
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
@@ -2202,7 +2202,7 @@ msgstr ""
 msgid "Folder"
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
@@ -2369,7 +2369,7 @@ msgid ""
 "option."
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr ""
 
@@ -2607,7 +2607,7 @@ msgstr ""
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr ""
 
-#: src/language/curd.ts:37
+#: src/language/curd.ts:39
 msgid "Leave blank if do not want to modify"
 msgstr ""
 
@@ -2632,9 +2632,9 @@ msgstr ""
 msgid "License"
 msgstr ""
 
-#: src/views/dashboard/Environments.vue:133
-#: src/views/dashboard/Environments.vue:148
-msgid "Link Start"
+#: src/views/dashboard/components/NodeAnalyticItem.vue:116
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
+msgid "Link"
 msgstr ""
 
 #: src/language/curd.ts:23
@@ -2718,7 +2718,7 @@ msgstr ""
 msgid "Log List"
 msgstr ""
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:271
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:277
 msgid "Login"
 msgstr ""
 
@@ -2954,7 +2954,7 @@ msgstr ""
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:80
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -2982,14 +2982,6 @@ msgstr ""
 msgid "Network Statistics"
 msgstr ""
 
-#: src/views/dashboard/ServerAnalytic.vue:283
-msgid "Network Total Receive"
-msgstr ""
-
-#: src/views/dashboard/ServerAnalytic.vue:289
-msgid "Network Total Send"
-msgstr ""
-
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgstr ""
@@ -3099,7 +3091,7 @@ msgstr ""
 msgid "Nginx Configurations Directory"
 msgstr ""
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgstr ""
 
@@ -3238,7 +3230,7 @@ msgstr ""
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
-#: src/components/Notification/Notification.vue:108 src/language/curd.ts:38
+#: src/components/Notification/Notification.vue:108 src/language/curd.ts:40
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3391,7 +3383,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
-#: src/views/dashboard/Environments.vue:99
+#: src/views/dashboard/Environments.vue:101
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgstr ""
@@ -3424,7 +3416,7 @@ msgstr ""
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
-#: src/views/dashboard/Environments.vue:92
+#: src/views/dashboard/Environments.vue:94
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgstr ""
@@ -3441,7 +3433,7 @@ msgstr ""
 msgid "OpenAI"
 msgstr ""
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:280
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:286
 msgid "Or"
 msgstr ""
 
@@ -3511,7 +3503,7 @@ msgid ""
 "password replacement or as a 2FA method."
 msgstr ""
 
-#: src/views/other/Login.vue:232 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:238 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr ""
 
@@ -3537,7 +3529,7 @@ msgstr ""
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3603,7 +3595,7 @@ msgid ""
 "count, etc."
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
@@ -3779,7 +3771,7 @@ msgstr ""
 msgid "Process information"
 msgstr ""
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgstr ""
 
@@ -3892,7 +3884,7 @@ msgstr ""
 msgid "Register On Startup"
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgstr ""
 
@@ -3917,7 +3909,7 @@ msgid "Release Note"
 msgstr ""
 
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgstr ""
 
@@ -3953,7 +3945,7 @@ msgstr ""
 msgid "Reload request failed, please check your network connection"
 msgstr ""
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgstr ""
 
@@ -4102,7 +4094,7 @@ msgstr ""
 msgid "Responses"
 msgstr ""
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgstr ""
 
@@ -4132,7 +4124,7 @@ msgstr ""
 msgid "Restart request failed, please check your network connection"
 msgstr ""
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgstr ""
 
@@ -4206,7 +4198,7 @@ msgstr ""
 msgid "Run Mode"
 msgstr ""
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgstr ""
 
@@ -4374,6 +4366,10 @@ msgstr ""
 msgid "Save stream %{name} to %{node} successfully"
 msgstr ""
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr ""
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
@@ -4462,7 +4458,7 @@ msgstr ""
 msgid "Select an action after sync"
 msgstr ""
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgstr ""
 
@@ -4570,7 +4566,7 @@ msgstr ""
 msgid "Show"
 msgstr ""
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgstr ""
 
@@ -4614,7 +4610,7 @@ msgstr ""
 msgid "Sites-enabled directory not exist"
 msgstr ""
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgstr ""
 
@@ -4679,7 +4675,7 @@ msgstr ""
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr ""
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgstr ""
 
@@ -4714,7 +4710,7 @@ msgstr ""
 msgid "Status"
 msgstr ""
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr ""
 
@@ -4807,11 +4803,11 @@ msgid ""
 "guide/nginx-proxy-example.html"
 msgstr ""
 
-#: src/language/curd.ts:51 src/language/curd.ts:55
+#: src/language/curd.ts:53 src/language/curd.ts:57
 msgid "Support single or batch upload of files"
 msgstr ""
 
-#: src/language/curd.ts:52 src/language/curd.ts:56
+#: src/language/curd.ts:54 src/language/curd.ts:58
 msgid "Support uploading entire folders"
 msgstr ""
 
@@ -5006,7 +5002,7 @@ msgid ""
 "hyphens, dashes, colons, and dots."
 msgstr ""
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5066,15 +5062,15 @@ msgstr ""
 msgid "This field is required"
 msgstr ""
 
-#: src/constants/form_errors.ts:3 src/language/curd.ts:41
+#: src/constants/form_errors.ts:3 src/language/curd.ts:43
 msgid "This field should be a valid email address"
 msgstr ""
 
-#: src/constants/form_errors.ts:5 src/language/curd.ts:43
+#: src/constants/form_errors.ts:5 src/language/curd.ts:45
 msgid "This field should be a valid hostname"
 msgstr ""
 
-#: src/constants/form_errors.ts:2 src/language/curd.ts:40
+#: src/constants/form_errors.ts:2 src/language/curd.ts:42
 msgid "This field should not be empty"
 msgstr ""
 
@@ -5083,7 +5079,7 @@ msgid ""
 "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr ""
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and -"
 "_./:"
@@ -5107,7 +5103,7 @@ msgid ""
 "make sure to save it in a secure location."
 msgstr ""
 
-#: src/constants/form_errors.ts:4 src/language/curd.ts:42
+#: src/constants/form_errors.ts:4 src/language/curd.ts:44
 msgid "This value is already taken"
 msgstr ""
 
@@ -5142,7 +5138,7 @@ msgstr ""
 msgid "Thursday"
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:65
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
 #: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
@@ -5168,7 +5164,7 @@ msgid ""
 "on your mobile phone."
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
@@ -5225,6 +5221,10 @@ msgstr ""
 msgid "Total Nginx Processes"
 msgstr ""
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr ""
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
@@ -5234,6 +5234,10 @@ msgstr ""
 msgid "Total Requests / Total Connections"
 msgstr ""
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr ""
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgstr ""
@@ -5325,11 +5329,11 @@ msgstr ""
 msgid "Upgrading Nginx UI, please wait..."
 msgstr ""
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgstr ""
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgstr ""
 
@@ -5381,7 +5385,7 @@ msgstr ""
 msgid "User Profile"
 msgstr ""
 
-#: src/views/other/Login.vue:222 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr ""
@@ -5447,7 +5451,7 @@ msgstr ""
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgstr ""
 
@@ -5599,7 +5603,7 @@ msgstr ""
 msgid "You can close this dialog now"
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."

+ 67 - 60
app/src/language/es/app.po

@@ -172,8 +172,8 @@ msgstr "Proporción real de trabajadores a configurados"
 msgid "Add"
 msgstr "Agregar"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgstr "Añadir una clave de acceso"
 
@@ -225,7 +225,7 @@ msgstr "Adicional"
 msgid "Advance Mode"
 msgstr "Modo avanzado"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:99
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:104
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr ""
 "Después, actualice esta página y haga clic en agregar clave de acceso "
@@ -565,7 +565,7 @@ msgstr "Modificar por lotes"
 msgid "Batch Upgrade"
 msgstr "Actualización por lotes"
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgstr ""
 "A continuación se muestran los elementos seleccionados que desea modificar "
@@ -638,7 +638,7 @@ msgstr ""
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
-#: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/components/NgxConfigEditor/NgxUpstream.vue:37 src/language/curd.ts:37
 #: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
@@ -958,11 +958,11 @@ msgstr ""
 "Haga clic o arrastre el archivo de copia de seguridad a esta área para "
 "cargar"
 
-#: src/language/curd.ts:49 src/language/curd.ts:53
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Click or drag files to this area to upload"
 msgstr "Haz clic o arrastra archivos a esta área para subirlos"
 
-#: src/language/curd.ts:50 src/language/curd.ts:54
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Click or drag folders to this area to upload"
 msgstr "Haz clic o arrastra carpetas a esta área para subir"
 
@@ -1094,7 +1094,7 @@ msgstr "Configurar SSL"
 msgid "Confirm New Password"
 msgstr "Confirmar nueva contraseña"
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgstr "Conectado"
 
@@ -1623,7 +1623,7 @@ msgstr "Descargando la última versión"
 msgid "Dry run mode enabled"
 msgstr "Modo de ejecución de prueba habilitado"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
@@ -2304,7 +2304,7 @@ msgstr "carpeta"
 msgid "Folder"
 msgstr "Carpeta"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
@@ -2476,7 +2476,7 @@ msgid ""
 "option."
 msgstr "Si desea revocar automáticamente el certificado antiguo, active esta opción."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr "Si su navegador admite WebAuthn Passkey, aparecerá un cuadro de diálogo."
 
@@ -2722,7 +2722,7 @@ msgstr "Para no modificar dejar en blanco"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "Dejar en blanco para el valor predeterminado: https://api.openai.com/"
 
-#: src/language/curd.ts:37
+#: src/language/curd.ts:39
 msgid "Leave blank if do not want to modify"
 msgstr "Dejar en blanco si no desea modificar"
 
@@ -2747,10 +2747,10 @@ msgstr "Lego desactivar soporte CNAME"
 msgid "License"
 msgstr "Licencia"
 
-#: src/views/dashboard/Environments.vue:133
-#: src/views/dashboard/Environments.vue:148
-msgid "Link Start"
-msgstr "Iniciar conexión"
+#: src/views/dashboard/components/NodeAnalyticItem.vue:116
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
+msgid "Link"
+msgstr "Enlace"
 
 #: src/language/curd.ts:23
 msgid "List"
@@ -2837,7 +2837,7 @@ msgstr ""
 msgid "Log List"
 msgstr "Lista de registros"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:271
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:277
 msgid "Login"
 msgstr "Acceso"
 
@@ -3082,7 +3082,7 @@ msgstr "Directiva multilínea"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:80
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3110,14 +3110,6 @@ msgstr "Red"
 msgid "Network Statistics"
 msgstr "Estadísticas de red"
 
-#: src/views/dashboard/ServerAnalytic.vue:283
-msgid "Network Total Receive"
-msgstr "Total recibido por la red"
-
-#: src/views/dashboard/ServerAnalytic.vue:289
-msgid "Network Total Send"
-msgstr "Total enviado por la red"
-
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgstr "Error en el nuevo proveedor de desafío DNS: {0}"
@@ -3227,7 +3219,7 @@ msgstr "Ruta de configuración de Nginx"
 msgid "Nginx Configurations Directory"
 msgstr "Directorio de configuraciones de Nginx"
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgstr "Control de Nginx"
 
@@ -3368,7 +3360,7 @@ msgstr "Nginx.conf incluye el directorio streams-enabled"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
-#: src/components/Notification/Notification.vue:108 src/language/curd.ts:38
+#: src/components/Notification/Notification.vue:108 src/language/curd.ts:40
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3528,7 +3520,7 @@ msgstr "Documentación oficial"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
-#: src/views/dashboard/Environments.vue:99
+#: src/views/dashboard/Environments.vue:101
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgstr "Desconectado"
@@ -3561,7 +3553,7 @@ msgstr "Una vez que se complete la verificación, los registros se eliminarán."
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
-#: src/views/dashboard/Environments.vue:92
+#: src/views/dashboard/Environments.vue:94
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgstr "En línea"
@@ -3578,7 +3570,7 @@ msgstr "Abierto"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:280
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:286
 msgid "Or"
 msgstr "O"
 
@@ -3652,7 +3644,7 @@ msgstr ""
 "dispositivo o un PIN. Se pueden utilizar como reemplazo de contraseña o "
 "como método de autenticación de dos factores."
 
-#: src/views/other/Login.vue:232 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:238 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "Contraseña"
 
@@ -3678,7 +3670,7 @@ msgstr "Las contraseñas no coinciden"
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3746,7 +3738,7 @@ msgstr ""
 "Por favor, active el módulo stub_status para obtener estadísticas de "
 "solicitudes, recuento de conexiones, etc."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
@@ -3940,7 +3932,7 @@ msgstr "Distribución de procesos"
 msgid "Process information"
 msgstr "Información del proceso"
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgstr "Procesando {count}/{total}"
 
@@ -4062,7 +4054,7 @@ msgstr "Fallo en el registro"
 msgid "Register On Startup"
 msgstr "Registrar al inicio"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgstr "Clave de acceso registrada con éxito"
 
@@ -4087,7 +4079,7 @@ msgid "Release Note"
 msgstr "Nota de versión"
 
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgstr "Recargar"
 
@@ -4123,7 +4115,7 @@ msgstr "Reinicio remoto de Nginx exitoso"
 msgid "Reload request failed, please check your network connection"
 msgstr "La solicitud de recarga falló, por favor verifique su conexión de red"
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgstr "Recargando"
 
@@ -4275,7 +4267,7 @@ msgstr ""
 msgid "Responses"
 msgstr "Respuestas"
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgstr "Reiniciar"
 
@@ -4305,7 +4297,7 @@ msgstr "Reinicio remoto de Nginx exitoso"
 msgid "Restart request failed, please check your network connection"
 msgstr "La solicitud de reinicio falló, por favor verifique su conexión de red"
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgstr "Reiniciando"
 
@@ -4381,7 +4373,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgstr "Modo de ejecución"
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgstr "Corriendo"
 
@@ -4549,6 +4541,10 @@ msgstr "Error al guardar el flujo %{name} en %{node}"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Flujo %{name} guardado en %{node} correctamente"
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr "Guardado exitosamente"
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
@@ -4639,7 +4635,7 @@ msgstr "Seleccionar todo"
 msgid "Select an action after sync"
 msgstr "Seleccionar una acción después de sincronizar"
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgstr "Seleccionados {count} archivos"
 
@@ -4757,7 +4753,7 @@ msgstr "Zona de Memoria Compartida"
 msgid "Show"
 msgstr "Mostrar"
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgstr "Iniciar sesión con una llave de acceso"
 
@@ -4801,7 +4797,7 @@ msgstr "El directorio sites-available no existe"
 msgid "Sites-enabled directory not exist"
 msgstr "El directorio sites-enabled no existe"
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgstr "Tamaño"
 
@@ -4870,7 +4866,7 @@ msgstr "Ruta de la clave SSL"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "Se requiere la ruta de la clave SSL cuando HTTPS está habilitado"
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgstr "Acceso SSO"
 
@@ -4905,7 +4901,7 @@ msgstr "Estático"
 msgid "Status"
 msgstr "Estado"
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr "Detenido"
 
@@ -5009,11 +5005,11 @@ msgstr ""
 "consulte este enlace para escribir el archivo de configuración "
 "correspondiente: https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51 src/language/curd.ts:55
+#: src/language/curd.ts:53 src/language/curd.ts:57
 msgid "Support single or batch upload of files"
 msgstr "Soporta carga única o múltiple de archivos"
 
-#: src/language/curd.ts:52 src/language/curd.ts:56
+#: src/language/curd.ts:54 src/language/curd.ts:58
 msgid "Support uploading entire folders"
 msgstr "Soporta la carga de carpetas completas"
 
@@ -5223,7 +5219,7 @@ msgstr ""
 "El número de seguridad pública solo debe contener letras, unicode, números, "
 "guiones, rayas, dos puntos y puntos."
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5293,15 +5289,15 @@ msgstr ""
 msgid "This field is required"
 msgstr "Este campo es obligatorio"
 
-#: src/constants/form_errors.ts:3 src/language/curd.ts:41
+#: src/constants/form_errors.ts:3 src/language/curd.ts:43
 msgid "This field should be a valid email address"
 msgstr "Este campo debe ser una dirección de correo electrónico válida"
 
-#: src/constants/form_errors.ts:5 src/language/curd.ts:43
+#: src/constants/form_errors.ts:5 src/language/curd.ts:45
 msgid "This field should be a valid hostname"
 msgstr "Este campo debe ser un nombre de host válido"
 
-#: src/constants/form_errors.ts:2 src/language/curd.ts:40
+#: src/constants/form_errors.ts:2 src/language/curd.ts:42
 msgid "This field should not be empty"
 msgstr "Este campo no debe estar vacío"
 
@@ -5309,7 +5305,7 @@ msgstr "Este campo no debe estar vacío"
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "Este campo solo debe contener letras, caracteres Unicode, números y -_."
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "-_./:"
@@ -5340,7 +5336,7 @@ msgstr ""
 "Este token solo se mostrará una vez y no se podrá recuperar más tarde. "
 "Asegúrese de guardarlo en un lugar seguro."
 
-#: src/constants/form_errors.ts:4 src/language/curd.ts:42
+#: src/constants/form_errors.ts:4 src/language/curd.ts:44
 msgid "This value is already taken"
 msgstr "Este valor ya está elegido"
 
@@ -5380,7 +5376,7 @@ msgstr "Acelerador"
 msgid "Thursday"
 msgstr "Jueves"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:65
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
 #: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
@@ -5412,7 +5408,7 @@ msgstr ""
 "Para habilitarlo, necesitas instalar la aplicación Google Authenticator o "
 "Microsoft Authenticator en tu teléfono móvil."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
@@ -5479,6 +5475,10 @@ msgstr "Total de procesos de Nginx"
 msgid "Total Nginx Processes"
 msgstr "Total de procesos de Nginx"
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "Recepción total"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
@@ -5488,6 +5488,10 @@ msgstr "Solicitudes totales"
 msgid "Total Requests / Total Connections"
 msgstr "Solicitudes totales / Conexiones totales"
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr "Total enviado"
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgstr "TOTP"
@@ -5581,11 +5585,11 @@ msgstr "Actualización exitosa"
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "Actualizando Nginx UI, por favor espere..."
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgstr "Subir archivos"
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgstr "Subir carpetas"
 
@@ -5637,7 +5641,7 @@ msgstr "Usuario no ha habilitado OTP como 2FA"
 msgid "User Profile"
 msgstr "Perfil de usuario"
 
-#: src/views/other/Login.vue:222 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Nombre de usuario"
@@ -5703,7 +5707,7 @@ msgstr "Procesos de espera"
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgstr "Advertencia"
 
@@ -5874,7 +5878,7 @@ msgstr "Puedes cerrar este diálogo en %{countdown} segundos"
 msgid "You can close this dialog now"
 msgstr "Ahora puede cerrar este cuadro de diálogo"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
@@ -5910,6 +5914,9 @@ msgstr "Tus códigos antiguos ya no funcionarán."
 msgid "Your passkeys"
 msgstr "Sus llaves de acceso"
 
+#~ msgid "Link Start"
+#~ msgstr "Iniciar conexión"
+
 #~ msgid "Enable failed"
 #~ msgstr "Falló la habilitación"
 

+ 67 - 60
app/src/language/fr_FR/app.po

@@ -170,8 +170,8 @@ msgstr "Ratio réel des travailleurs par rapport à la configuration"
 msgid "Add"
 msgstr "Ajouter"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgstr "Ajouter une clé d'accès"
 
@@ -223,7 +223,7 @@ msgstr "Supplémentaire"
 msgid "Advance Mode"
 msgstr "Mode avancé"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:99
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:104
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr ""
 "Ensuite, rafraîchissez cette page et cliquez à nouveau sur ajouter une clé "
@@ -563,7 +563,7 @@ msgstr "Modification par lot"
 msgid "Batch Upgrade"
 msgstr "Mise à jour par lot"
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgstr "Ci-dessous sont sélectionnés les éléments que vous voulez modifier en masse"
 
@@ -633,7 +633,7 @@ msgstr ""
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
-#: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/components/NgxConfigEditor/NgxUpstream.vue:37 src/language/curd.ts:37
 #: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
@@ -952,11 +952,11 @@ msgstr ""
 "Cliquez sur ou faites glisser le fichier de sauvegarde vers cette zone pour "
 "télécharger"
 
-#: src/language/curd.ts:49 src/language/curd.ts:53
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Click or drag files to this area to upload"
 msgstr "Cliquez ou faites glisser des fichiers dans cette zone pour les télécharger"
 
-#: src/language/curd.ts:50 src/language/curd.ts:54
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Click or drag folders to this area to upload"
 msgstr "Cliquez ou faites glisser des dossiers dans cette zone pour télécharger"
 
@@ -1090,7 +1090,7 @@ msgstr "Configurer SSL"
 msgid "Confirm New Password"
 msgstr "Confirmer le nouveau mot de passe"
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgstr "Connecté"
 
@@ -1617,7 +1617,7 @@ msgstr "Téléchargement de la dernière version"
 msgid "Dry run mode enabled"
 msgstr "Mode de simulation activé"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
@@ -2298,7 +2298,7 @@ msgstr "dossier"
 msgid "Folder"
 msgstr "Dossier"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
@@ -2472,7 +2472,7 @@ msgstr ""
 "Si vous souhaitez révoquer automatiquement l'ancien certificat, veuillez "
 "activer cette option."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr ""
 "Si votre navigateur prend en charge la clé d'accès WebAuthn, une boîte de "
@@ -2720,7 +2720,7 @@ msgstr "Laisser vide pour aucun changement"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "Laissez vide pour la valeur par défaut : https://api.openai.com/"
 
-#: src/language/curd.ts:37
+#: src/language/curd.ts:39
 msgid "Leave blank if do not want to modify"
 msgstr "Laisser vide si vous ne souhaitez pas modifier"
 
@@ -2745,10 +2745,10 @@ msgstr "Lego désactiver la prise en charge CNAME"
 msgid "License"
 msgstr "Licence"
 
-#: src/views/dashboard/Environments.vue:133
-#: src/views/dashboard/Environments.vue:148
-msgid "Link Start"
-msgstr "Démarrer la liaison"
+#: src/views/dashboard/components/NodeAnalyticItem.vue:116
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
+msgid "Link"
+msgstr "Lien"
 
 #: src/language/curd.ts:23
 msgid "List"
@@ -2835,7 +2835,7 @@ msgstr ""
 msgid "Log List"
 msgstr "Liste des journaux"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:271
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:277
 msgid "Login"
 msgstr "Connexion"
 
@@ -3080,7 +3080,7 @@ msgstr "Directive multiligne"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:80
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3108,14 +3108,6 @@ msgstr "Réseau"
 msgid "Network Statistics"
 msgstr "Statistiques du réseau"
 
-#: src/views/dashboard/ServerAnalytic.vue:283
-msgid "Network Total Receive"
-msgstr "Réception totale du réseau"
-
-#: src/views/dashboard/ServerAnalytic.vue:289
-msgid "Network Total Send"
-msgstr "Envoi total réseau"
-
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgstr "Erreur du nouveau fournisseur de défi DNS : {0}"
@@ -3225,7 +3217,7 @@ msgstr "Chemin de configuration de Nginx"
 msgid "Nginx Configurations Directory"
 msgstr "Répertoire des configurations Nginx"
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgstr "Contrôle Nginx"
 
@@ -3366,7 +3358,7 @@ msgstr "Nginx.conf inclut le répertoire streams-enabled"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
-#: src/components/Notification/Notification.vue:108 src/language/curd.ts:38
+#: src/components/Notification/Notification.vue:108 src/language/curd.ts:40
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3525,7 +3517,7 @@ msgstr "Documentation officielle"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
-#: src/views/dashboard/Environments.vue:99
+#: src/views/dashboard/Environments.vue:101
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgstr "Hors ligne"
@@ -3558,7 +3550,7 @@ msgstr "Une fois la vérification terminée, les enregistrements seront supprim
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
-#: src/views/dashboard/Environments.vue:92
+#: src/views/dashboard/Environments.vue:94
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgstr "En ligne"
@@ -3575,7 +3567,7 @@ msgstr "Ouvert"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:280
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:286
 msgid "Or"
 msgstr "Ou"
 
@@ -3649,7 +3641,7 @@ msgstr ""
 "ou un code PIN. Elles peuvent être utilisées comme remplacement d'un mot de "
 "passe ou comme méthode d'authentification à deux facteurs (2FA)."
 
-#: src/views/other/Login.vue:232 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:238 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "Mot de passe"
 
@@ -3675,7 +3667,7 @@ msgstr "Les mots de passe ne correspondent pas"
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3745,7 +3737,7 @@ msgstr ""
 "Veuillez activer le module stub_status pour obtenir des statistiques de "
 "requêtes, le nombre de connexions, etc."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
@@ -3937,7 +3929,7 @@ msgstr "Répartition des processus"
 msgid "Process information"
 msgstr "Informations sur le processus"
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgstr "Traitement en cours {count}/{total}"
 
@@ -4059,7 +4051,7 @@ msgstr "Échec de l'enregistrement"
 msgid "Register On Startup"
 msgstr "Enregistrer au démarrage"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgstr "Clé d'accès enregistrée avec succès"
 
@@ -4084,7 +4076,7 @@ msgid "Release Note"
 msgstr "Note de version"
 
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgstr "Recharger"
 
@@ -4122,7 +4114,7 @@ msgstr ""
 "La demande de rechargement a échoué, veuillez vérifier votre connexion "
 "réseau"
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgstr "Rechargement"
 
@@ -4274,7 +4266,7 @@ msgstr ""
 msgid "Responses"
 msgstr "Réponses"
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgstr "Redémarrer"
 
@@ -4304,7 +4296,7 @@ msgstr "Redémarrage distant de Nginx réussi"
 msgid "Restart request failed, please check your network connection"
 msgstr "La demande de redémarrage a échoué, veuillez vérifier votre connexion réseau"
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgstr "Redémarrage"
 
@@ -4380,7 +4372,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgstr "Mode d'exécution"
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgstr "En cours d'éxécution"
 
@@ -4548,6 +4540,10 @@ msgstr "Échec de l'enregistrement du flux %{name} sur %{node}"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Flux %{name} enregistré sur %{node} avec succès"
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr "Enregistrement réussi"
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
@@ -4638,7 +4634,7 @@ msgstr "Tout sélectionner"
 msgid "Select an action after sync"
 msgstr "Sélectionner une action après la synchronisation"
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgstr "{count} fichiers sélectionnés"
 
@@ -4756,7 +4752,7 @@ msgstr "Zone de Mémoire Partagée"
 msgid "Show"
 msgstr "Afficher"
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgstr "Se connecter avec une clé d'accès"
 
@@ -4800,7 +4796,7 @@ msgstr "Le répertoire sites-available n'existe pas"
 msgid "Sites-enabled directory not exist"
 msgstr "Le répertoire sites-enabled n'existe pas"
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgstr "Taille"
 
@@ -4869,7 +4865,7 @@ msgstr "Chemin de la clé SSL"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "Le chemin de la clé SSL est requis lorsque HTTPS est activé"
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgstr "Connexion SSO"
 
@@ -4904,7 +4900,7 @@ msgstr "Statique"
 msgid "Status"
 msgstr "Statut"
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr "Arrêté"
 
@@ -5008,11 +5004,11 @@ msgstr ""
 "Nginx, veuillez consulter ce lien pour écrire le fichier de configuration "
 "correspondant : https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51 src/language/curd.ts:55
+#: src/language/curd.ts:53 src/language/curd.ts:57
 msgid "Support single or batch upload of files"
 msgstr "Prise en charge du téléchargement unique ou en lot de fichiers"
 
-#: src/language/curd.ts:52 src/language/curd.ts:56
+#: src/language/curd.ts:54 src/language/curd.ts:58
 msgid "Support uploading entire folders"
 msgstr "Prend en charge le téléchargement de dossiers entiers"
 
@@ -5224,7 +5220,7 @@ msgstr ""
 "Le numéro de sécurité publique ne doit contenir que des lettres, unicode, "
 "des chiffres, des traits d'union, des tirets, des deux-points et des points."
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5295,15 +5291,15 @@ msgstr ""
 msgid "This field is required"
 msgstr "Ce champ est obligatoire"
 
-#: src/constants/form_errors.ts:3 src/language/curd.ts:41
+#: src/constants/form_errors.ts:3 src/language/curd.ts:43
 msgid "This field should be a valid email address"
 msgstr "Ce champ doit être une adresse email valide"
 
-#: src/constants/form_errors.ts:5 src/language/curd.ts:43
+#: src/constants/form_errors.ts:5 src/language/curd.ts:45
 msgid "This field should be a valid hostname"
 msgstr "Ce champ doit être un nom d'hôte valide"
 
-#: src/constants/form_errors.ts:2 src/language/curd.ts:40
+#: src/constants/form_errors.ts:2 src/language/curd.ts:42
 msgid "This field should not be empty"
 msgstr "Ce champ ne doit pas être vide"
 
@@ -5313,7 +5309,7 @@ msgstr ""
 "Ce champ ne doit contenir que des lettres, des caractères Unicode, des "
 "chiffres et -_."
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "-_./:"
@@ -5347,7 +5343,7 @@ msgstr ""
 "ultérieurement. Veuillez vous assurer de le sauvegarder dans un endroit "
 "sécurisé."
 
-#: src/constants/form_errors.ts:4 src/language/curd.ts:42
+#: src/constants/form_errors.ts:4 src/language/curd.ts:44
 msgid "This value is already taken"
 msgstr "Cette valeur est déjà utilisée"
 
@@ -5387,7 +5383,7 @@ msgstr "Limitation"
 msgid "Thursday"
 msgstr "Jeudi"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:65
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
 #: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
@@ -5419,7 +5415,7 @@ msgstr ""
 "Pour l'activer, vous devez installer l'application Google Authenticator ou "
 "Microsoft Authenticator sur votre téléphone portable."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
@@ -5487,6 +5483,10 @@ msgstr "Total des processus Nginx"
 msgid "Total Nginx Processes"
 msgstr "Total des processus Nginx"
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "Réception totale"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
@@ -5496,6 +5496,10 @@ msgstr "Requêtes totales"
 msgid "Total Requests / Total Connections"
 msgstr "Requêtes totales / Connexions totales"
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr "Total envoyé"
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgstr "TOTP"
@@ -5589,11 +5593,11 @@ msgstr "Mise à niveau réussie"
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "Mise à jour de Nginx UI, veuillez patienter..."
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgstr "Téléverser des fichiers"
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgstr "Télécharger des dossiers"
 
@@ -5645,7 +5649,7 @@ msgstr "L'utilisateur n'a pas activé l'OTP comme 2FA"
 msgid "User Profile"
 msgstr "Profil utilisateur"
 
-#: src/views/other/Login.vue:222 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Nom d'utilisateur"
@@ -5711,7 +5715,7 @@ msgstr "Processus d'attente"
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgstr "Avertissement"
 
@@ -5885,7 +5889,7 @@ msgstr "Vous pouvez fermer cette boîte de dialogue dans %{countdown} secondes"
 msgid "You can close this dialog now"
 msgstr "Vous pouvez maintenant fermer cette boîte de dialogue"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
@@ -5921,6 +5925,9 @@ msgstr "Vos anciens codes ne fonctionneront plus."
 msgid "Your passkeys"
 msgstr "Vos clés d'accès"
 
+#~ msgid "Link Start"
+#~ msgstr "Démarrer la liaison"
+
 #~ msgid "Enable failed"
 #~ msgstr "Échec de l'activation"
 

+ 67 - 60
app/src/language/ja_JP/app.po

@@ -166,8 +166,8 @@ msgstr "実際のワーカー数と設定値の比率"
 msgid "Add"
 msgstr "追加"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgstr "パスキーを追加"
 
@@ -219,7 +219,7 @@ msgstr "追加設定"
 msgid "Advance Mode"
 msgstr "アドバンスモード"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:99
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:104
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr "その後、このページを更新し、再度パスキーを追加をクリックしてください。"
 
@@ -541,7 +541,7 @@ msgstr "一括変更"
 msgid "Batch Upgrade"
 msgstr "バッチアップグレード"
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgstr "以下は一括修正したい選択項目です"
 
@@ -610,7 +610,7 @@ msgstr ""
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
-#: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/components/NgxConfigEditor/NgxUpstream.vue:37 src/language/curd.ts:37
 #: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
@@ -912,11 +912,11 @@ msgstr "正常に削除しました"
 msgid "Click or drag backup file to this area to upload"
 msgstr "この領域にバックアップファイルをクリックまたはドラッグしてアップロードします"
 
-#: src/language/curd.ts:49 src/language/curd.ts:53
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Click or drag files to this area to upload"
 msgstr "クリックまたはドラッグしてファイルをこのエリアにアップロード"
 
-#: src/language/curd.ts:50 src/language/curd.ts:54
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Click or drag folders to this area to upload"
 msgstr "フォルダをクリックまたはドラッグしてこのエリアにアップロード"
 
@@ -1048,7 +1048,7 @@ msgstr "SSLを設定する"
 msgid "Confirm New Password"
 msgstr "新しいパスワードを確認"
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgstr "接続済み"
 
@@ -1566,7 +1566,7 @@ msgstr "最新リリースをダウンロード中"
 msgid "Dry run mode enabled"
 msgstr "ドライランモードが有効です"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
@@ -2238,7 +2238,7 @@ msgstr "フォルダ"
 msgid "Folder"
 msgstr "フォルダ"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
@@ -2405,7 +2405,7 @@ msgid ""
 "option."
 msgstr "古い証明書を自動的に失効させたい場合は、このオプションを有効にしてください。"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr "お使いのブラウザがWebAuthnパスキーに対応している場合、ダイアログボックスが表示されます。"
 
@@ -2643,7 +2643,7 @@ msgstr "変更しない場合は空欄のままにしてください"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "デフォルトのままにする場合、空欄のままにしてください: https://api.openai.com/"
 
-#: src/language/curd.ts:37
+#: src/language/curd.ts:39
 msgid "Leave blank if do not want to modify"
 msgstr "変更しない場合は空白のままにしてください"
 
@@ -2668,10 +2668,10 @@ msgstr "Lego CNAME サポートを無効にする"
 msgid "License"
 msgstr "ライセンス"
 
-#: src/views/dashboard/Environments.vue:133
-#: src/views/dashboard/Environments.vue:148
-msgid "Link Start"
-msgstr "リンクスタート"
+#: src/views/dashboard/components/NodeAnalyticItem.vue:116
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
+msgid "Link"
+msgstr "リンク"
 
 #: src/language/curd.ts:23
 msgid "List"
@@ -2756,7 +2756,7 @@ msgstr ""
 msgid "Log List"
 msgstr "ログリスト"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:271
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:277
 msgid "Login"
 msgstr "ログイン"
 
@@ -2998,7 +2998,7 @@ msgstr "複数行ディレクティブ"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:80
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3026,14 +3026,6 @@ msgstr "ネットワーク"
 msgid "Network Statistics"
 msgstr "ネットワーク統計"
 
-#: src/views/dashboard/ServerAnalytic.vue:283
-msgid "Network Total Receive"
-msgstr "ネットワーク総受信量"
-
-#: src/views/dashboard/ServerAnalytic.vue:289
-msgid "Network Total Send"
-msgstr "ネットワーク総送信量"
-
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgstr "新しいDNSチャレンジプロバイダーエラー: {0}"
@@ -3143,7 +3135,7 @@ msgstr "Nginx 設定ファイルのパス"
 msgid "Nginx Configurations Directory"
 msgstr "Nginx 設定ディレクトリ"
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgstr "Nginx コントロール"
 
@@ -3282,7 +3274,7 @@ msgstr "Nginx.conf には streams-enabled ディレクトリが含まれてい
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
-#: src/components/Notification/Notification.vue:108 src/language/curd.ts:38
+#: src/components/Notification/Notification.vue:108 src/language/curd.ts:40
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3435,7 +3427,7 @@ msgstr "公式ドキュメント"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
-#: src/views/dashboard/Environments.vue:99
+#: src/views/dashboard/Environments.vue:101
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgstr "オフライン"
@@ -3468,7 +3460,7 @@ msgstr "検証が完了すると、レコードは削除されます。"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
-#: src/views/dashboard/Environments.vue:92
+#: src/views/dashboard/Environments.vue:94
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgstr "オンライン"
@@ -3485,7 +3477,7 @@ msgstr "開いている"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:280
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:286
 msgid "Or"
 msgstr "または"
 
@@ -3557,7 +3549,7 @@ msgstr ""
 "パスキーは、タッチ、顔認証、デバイスパスワード、または PIN を使用して身元を確認する WebAuthn 認証情報です。パスワードの代わりや 2FA "
 "方法として使用できます。"
 
-#: src/views/other/Login.vue:232 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:238 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "パスワード"
 
@@ -3583,7 +3575,7 @@ msgstr "パスワードが一致しません"
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3649,7 +3641,7 @@ msgid ""
 "count, etc."
 msgstr "リクエスト統計や接続数などを取得するには、stub_statusモジュールを有効にしてください。"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
@@ -3826,7 +3818,7 @@ msgstr "プロセス分布"
 msgid "Process information"
 msgstr "プロセス情報"
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgstr "処理中 {count}/{total}"
 
@@ -3940,7 +3932,7 @@ msgstr "登録に失敗しました"
 msgid "Register On Startup"
 msgstr "起動時に登録"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgstr "パスキーの登録に成功しました"
 
@@ -3965,7 +3957,7 @@ msgid "Release Note"
 msgstr "リリースノート"
 
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgstr "再読み込み"
 
@@ -4001,7 +3993,7 @@ msgstr "リモートNginxのリロード成功"
 msgid "Reload request failed, please check your network connection"
 msgstr "再読み込みリクエストが失敗しました。ネットワーク接続を確認してください"
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgstr "再読み込み中"
 
@@ -4150,7 +4142,7 @@ msgstr "Resident Set Size: 物理メモリに実際に存在するメモリで
 msgid "Responses"
 msgstr "レスポンス"
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgstr "再起動"
 
@@ -4180,7 +4172,7 @@ msgstr "リモートNginxの再起動成功"
 msgid "Restart request failed, please check your network connection"
 msgstr "再起動リクエストが失敗しました。ネットワーク接続を確認してください"
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgstr "再起動中"
 
@@ -4254,7 +4246,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgstr "実行モード"
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgstr "実行中"
 
@@ -4422,6 +4414,10 @@ msgstr "ストリーム %{name} を %{node} に保存できませんでした"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "ストリーム %{name} を %{node} に正常に保存しました"
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr "保存に成功しました"
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
@@ -4510,7 +4506,7 @@ msgstr "すべて選択"
 msgid "Select an action after sync"
 msgstr "同期後のアクションを選択"
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgstr "選択された {count} ファイル"
 
@@ -4622,7 +4618,7 @@ msgstr "共有メモリゾーン"
 msgid "Show"
 msgstr "表示"
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgstr "パスキーでサインイン"
 
@@ -4666,7 +4662,7 @@ msgstr "sites-available ディレクトリが存在しません"
 msgid "Sites-enabled directory not exist"
 msgstr "sites-enabled ディレクトリが存在しません"
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgstr "サイズ"
 
@@ -4731,7 +4727,7 @@ msgstr "SSLキーのパス"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "HTTPS を有効にするには SSL キーのパスが必要です"
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgstr "SSOログイン"
 
@@ -4766,7 +4762,7 @@ msgstr "静的"
 msgid "Status"
 msgstr "ステータス"
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr "停止"
 
@@ -4865,11 +4861,11 @@ msgstr ""
 "リバースプロキシ経由で使用されている場合は、このリンクを参照して対応する設定ファイルを作成してください: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51 src/language/curd.ts:55
+#: src/language/curd.ts:53 src/language/curd.ts:57
 msgid "Support single or batch upload of files"
 msgstr "単一または一括ファイルアップロードをサポート"
 
-#: src/language/curd.ts:52 src/language/curd.ts:56
+#: src/language/curd.ts:54 src/language/curd.ts:58
 msgid "Support uploading entire folders"
 msgstr "フォルダ全体のアップロードをサポート"
 
@@ -5064,7 +5060,7 @@ msgid ""
 "hyphens, dashes, colons, and dots."
 msgstr "公安番号には、文字、Unicode、数字、ハイフン、ダッシュ、コロン、およびドットのみを含める必要があります。"
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5128,15 +5124,15 @@ msgstr "このディレクトリは保護されており、システムの安全
 msgid "This field is required"
 msgstr "このフィールドは必須です"
 
-#: src/constants/form_errors.ts:3 src/language/curd.ts:41
+#: src/constants/form_errors.ts:3 src/language/curd.ts:43
 msgid "This field should be a valid email address"
 msgstr "このフィールドは有効なメールアドレスである必要があります"
 
-#: src/constants/form_errors.ts:5 src/language/curd.ts:43
+#: src/constants/form_errors.ts:5 src/language/curd.ts:45
 msgid "This field should be a valid hostname"
 msgstr "このフィールドは有効なホスト名である必要があります"
 
-#: src/constants/form_errors.ts:2 src/language/curd.ts:40
+#: src/constants/form_errors.ts:2 src/language/curd.ts:42
 msgid "This field should not be empty"
 msgstr "このフィールドは空にできません"
 
@@ -5144,7 +5140,7 @@ msgstr "このフィールドは空にできません"
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "このフィールドには、文字、Unicode文字、数字、および -_ のみを含める必要があります。"
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "-_./:"
@@ -5168,7 +5164,7 @@ msgid ""
 "make sure to save it in a secure location."
 msgstr "このトークンは一度しか表示されず、後で取得することはできません。必ず安全な場所に保存してください。"
 
-#: src/constants/form_errors.ts:4 src/language/curd.ts:42
+#: src/constants/form_errors.ts:4 src/language/curd.ts:44
 msgid "This value is already taken"
 msgstr "この値は既に使用されています"
 
@@ -5202,7 +5198,7 @@ msgstr "スロットル"
 msgid "Thursday"
 msgstr "木曜日"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:65
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
 #: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
@@ -5230,7 +5226,7 @@ msgstr ""
 "有効にするには、スマートフォンにGoogle AuthenticatorまたはMicrosoft "
 "Authenticatorアプリをインストールする必要があります。"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
@@ -5293,6 +5289,10 @@ msgstr "Nginx プロセスの合計"
 msgid "Total Nginx Processes"
 msgstr "Nginxプロセスの合計"
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "総受信"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
@@ -5302,6 +5302,10 @@ msgstr "総リクエスト数"
 msgid "Total Requests / Total Connections"
 msgstr "総リクエスト数 / 総接続数"
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr "総送信"
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgstr "TOTP"
@@ -5393,11 +5397,11 @@ msgstr "アップグレードに成功しました"
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "Nginx UI をアップグレード中です。しばらくお待ちください..."
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgstr "ファイルをアップロード"
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgstr "フォルダをアップロード"
 
@@ -5449,7 +5453,7 @@ msgstr "ユーザーはOTPを2FAとして有効にしていません"
 msgid "User Profile"
 msgstr "ユーザープロフィール"
 
-#: src/views/other/Login.vue:222 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "ユーザー名"
@@ -5515,7 +5519,7 @@ msgstr "待機プロセス"
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgstr "警告"
 
@@ -5669,7 +5673,7 @@ msgstr "このダイアログは %{countdown} 秒後に閉じることができ
 msgid "You can close this dialog now"
 msgstr "このダイアログを閉じることができます"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
@@ -5698,6 +5702,9 @@ msgstr "以前のコードはもう使えません。"
 msgid "Your passkeys"
 msgstr "あなたのパスキー"
 
+#~ msgid "Link Start"
+#~ msgstr "リンクスタート"
+
 #~ msgid "Enable failed"
 #~ msgstr "有効化に失敗しました"
 

+ 67 - 60
app/src/language/ko_KR/app.po

@@ -164,8 +164,8 @@ msgstr "실제 작업자 대 구성 비율"
 msgid "Add"
 msgstr "추가"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgstr "패스키 추가"
 
@@ -217,7 +217,7 @@ msgstr "추가적인"
 msgid "Advance Mode"
 msgstr "고급 모드"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:99
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:104
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr "이후에 이 페이지를 새로 고치고 패스키 추가를 다시 클릭하세요."
 
@@ -539,7 +539,7 @@ msgstr "일괄 수정"
 msgid "Batch Upgrade"
 msgstr "배치 업그레이드"
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgstr "아래에는 일괄 수정하려는 선택된 항목이 있습니다"
 
@@ -608,7 +608,7 @@ msgstr ""
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
-#: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/components/NgxConfigEditor/NgxUpstream.vue:37 src/language/curd.ts:37
 #: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
@@ -909,11 +909,11 @@ msgstr "성공적으로 제거됨"
 msgid "Click or drag backup file to this area to upload"
 msgstr "이 영역으로 백업 파일을 클릭하거나 드래그하여 업로드하십시오."
 
-#: src/language/curd.ts:49 src/language/curd.ts:53
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Click or drag files to this area to upload"
 msgstr "파일을 클릭하거나 이 영역으로 드래그하여 업로드하세요"
 
-#: src/language/curd.ts:50 src/language/curd.ts:54
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Click or drag folders to this area to upload"
 msgstr "폴더를 클릭하거나 이 영역으로 드래그하여 업로드"
 
@@ -1045,7 +1045,7 @@ msgstr "SSL 구성하기"
 msgid "Confirm New Password"
 msgstr "새 비밀번호 확인"
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgstr "연결됨"
 
@@ -1563,7 +1563,7 @@ msgstr "최신 릴리스 다운로드 중"
 msgid "Dry run mode enabled"
 msgstr "드라이런 모드 활성화됨"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
@@ -2237,7 +2237,7 @@ msgstr "폴더"
 msgid "Folder"
 msgstr "폴더"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
@@ -2404,7 +2404,7 @@ msgid ""
 "option."
 msgstr "기존 인증서를 자동으로 취소하려면 이 옵션을 활성화하세요."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr "브라우저가 WebAuthn 패스키를 지원하는 경우 대화 상자가 나타납니다."
 
@@ -2642,7 +2642,7 @@ msgstr "변경사항이 없으면 비워두세요"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "기본값을 사용하려면 비워 두세요: https://api.openai.com/"
 
-#: src/language/curd.ts:37
+#: src/language/curd.ts:39
 msgid "Leave blank if do not want to modify"
 msgstr "수정하지 않으려면 비워 두세요"
 
@@ -2667,10 +2667,10 @@ msgstr "Lego CNAME 지원 비활성화"
 msgid "License"
 msgstr "라이선스"
 
-#: src/views/dashboard/Environments.vue:133
-#: src/views/dashboard/Environments.vue:148
-msgid "Link Start"
-msgstr "링크 시작"
+#: src/views/dashboard/components/NodeAnalyticItem.vue:116
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
+msgid "Link"
+msgstr "링크"
 
 #: src/language/curd.ts:23
 msgid "List"
@@ -2755,7 +2755,7 @@ msgstr ""
 msgid "Log List"
 msgstr "로그 목록"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:271
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:277
 msgid "Login"
 msgstr "로그인"
 
@@ -2994,7 +2994,7 @@ msgstr "여러 줄 지시문"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:80
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3022,14 +3022,6 @@ msgstr "네트워크"
 msgid "Network Statistics"
 msgstr "네트워크 통계"
 
-#: src/views/dashboard/ServerAnalytic.vue:283
-msgid "Network Total Receive"
-msgstr "네트워크 총 수신"
-
-#: src/views/dashboard/ServerAnalytic.vue:289
-msgid "Network Total Send"
-msgstr "네트워크 총 송신"
-
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgstr "새 DNS 챌린지 공급자 오류: {0}"
@@ -3139,7 +3131,7 @@ msgstr "Nginx 구성 파일 경로"
 msgid "Nginx Configurations Directory"
 msgstr "Nginx 설정 디렉터리"
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgstr "Nginx 제어"
 
@@ -3278,7 +3270,7 @@ msgstr "Nginx.conf에는 streams-enabled 디렉토리가 포함됩니다"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
-#: src/components/Notification/Notification.vue:108 src/language/curd.ts:38
+#: src/components/Notification/Notification.vue:108 src/language/curd.ts:40
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3431,7 +3423,7 @@ msgstr "공식 문서"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
-#: src/views/dashboard/Environments.vue:99
+#: src/views/dashboard/Environments.vue:101
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgstr "오프라인"
@@ -3464,7 +3456,7 @@ msgstr "검증이 완료되면, 레코드는 제거됩니다."
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
-#: src/views/dashboard/Environments.vue:92
+#: src/views/dashboard/Environments.vue:94
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgstr "온라인"
@@ -3481,7 +3473,7 @@ msgstr "열림"
 msgid "OpenAI"
 msgstr "오픈AI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:280
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:286
 msgid "Or"
 msgstr "또는"
 
@@ -3553,7 +3545,7 @@ msgstr ""
 "패스키는 터치, 얼굴 인식, 기기 비밀번호 또는 PIN을 사용하여 신원을 확인하는 웹인증(WebAuthn) 자격 증명입니다. 비밀번호 "
 "대체 또는 2FA 방법으로 사용할 수 있습니다."
 
-#: src/views/other/Login.vue:232 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:238 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "비밀번호"
 
@@ -3579,7 +3571,7 @@ msgstr "비밀번호가 일치하지 않습니다"
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3645,7 +3637,7 @@ msgid ""
 "count, etc."
 msgstr "요청 통계, 연결 수 등을 얻으려면 stub_status 모듈을 활성화하세요."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
@@ -3820,7 +3812,7 @@ msgstr "프로세스 분포"
 msgid "Process information"
 msgstr "프로세스 정보"
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgstr "처리 중 {count}/{total}"
 
@@ -3934,7 +3926,7 @@ msgstr "등록 실패"
 msgid "Register On Startup"
 msgstr "시작 시 등록"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgstr "패스키 등록 성공"
 
@@ -3959,7 +3951,7 @@ msgid "Release Note"
 msgstr "릴리스 노트"
 
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgstr "리로드"
 
@@ -3995,7 +3987,7 @@ msgstr "원격 Nginx 다시 로드 성공"
 msgid "Reload request failed, please check your network connection"
 msgstr "다시 로드 요청이 실패했습니다. 네트워크 연결을 확인하세요"
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgstr "리로딩 중"
 
@@ -4146,7 +4138,7 @@ msgstr ""
 msgid "Responses"
 msgstr "응답"
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgstr "재시작"
 
@@ -4176,7 +4168,7 @@ msgstr "원격 Nginx 재시작 성공"
 msgid "Restart request failed, please check your network connection"
 msgstr "재시작 요청이 실패했습니다. 네트워크 연결을 확인해 주세요"
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgstr "재시작 중"
 
@@ -4250,7 +4242,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgstr "실행 모드"
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgstr "실행 중"
 
@@ -4418,6 +4410,10 @@ msgstr "스트림 %{name}을(를) %{node}에 저장하지 못했습니다"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "스트림 %{name}을(를) %{node}에 성공적으로 저장했습니다"
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr "저장 성공"
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
@@ -4506,7 +4502,7 @@ msgstr "모두 선택"
 msgid "Select an action after sync"
 msgstr "동기화 후 작업 선택"
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgstr "선택된 {count} 파일"
 
@@ -4618,7 +4614,7 @@ msgstr "공유 메모리 영역"
 msgid "Show"
 msgstr "표시"
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgstr "패스키로 로그인"
 
@@ -4662,7 +4658,7 @@ msgstr "sites-available 디렉터리가 존재하지 않습니다"
 msgid "Sites-enabled directory not exist"
 msgstr "sites-enabled 디렉터리가 존재하지 않습니다"
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgstr "크기"
 
@@ -4727,7 +4723,7 @@ msgstr "SSL 키 경로"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "HTTPS가 활성화된 경우 SSL 키 경로가 필요합니다"
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgstr "SSO 로그인"
 
@@ -4762,7 +4758,7 @@ msgstr "정적"
 msgid "Status"
 msgstr "상태"
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr "정지됨"
 
@@ -4861,11 +4857,11 @@ msgstr ""
 "링크를 참조하여 해당 구성 파일을 작성하십시오: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51 src/language/curd.ts:55
+#: src/language/curd.ts:53 src/language/curd.ts:57
 msgid "Support single or batch upload of files"
 msgstr "단일 또는 일괄 파일 업로드 지원"
 
-#: src/language/curd.ts:52 src/language/curd.ts:56
+#: src/language/curd.ts:54 src/language/curd.ts:58
 msgid "Support uploading entire folders"
 msgstr "전체 폴더 업로드 지원"
 
@@ -5060,7 +5056,7 @@ msgid ""
 "hyphens, dashes, colons, and dots."
 msgstr "공공 보안 번호는 문자, 유니코드, 숫자, 하이픈, 대시, 콜론 및 점만 포함해야 합니다."
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5124,15 +5120,15 @@ msgstr "이 디렉터리는 보호되어 있으며 시스템 안전을 위해 
 msgid "This field is required"
 msgstr "이 필드는 필수입니다"
 
-#: src/constants/form_errors.ts:3 src/language/curd.ts:41
+#: src/constants/form_errors.ts:3 src/language/curd.ts:43
 msgid "This field should be a valid email address"
 msgstr "이 필드는 유효한 이메일 주소여야 합니다"
 
-#: src/constants/form_errors.ts:5 src/language/curd.ts:43
+#: src/constants/form_errors.ts:5 src/language/curd.ts:45
 msgid "This field should be a valid hostname"
 msgstr "이 필드는 유효한 호스트 이름이어야 합니다"
 
-#: src/constants/form_errors.ts:2 src/language/curd.ts:40
+#: src/constants/form_errors.ts:2 src/language/curd.ts:42
 msgid "This field should not be empty"
 msgstr "이 필드는 비워둘 수 없습니다"
 
@@ -5140,7 +5136,7 @@ msgstr "이 필드는 비워둘 수 없습니다"
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "이 필드에는 문자, 유니코드 문자, 숫자 및 -_만 포함되어야 합니다."
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "-_./:"
@@ -5164,7 +5160,7 @@ msgid ""
 "make sure to save it in a secure location."
 msgstr "이 토큰은 한 번만 표시되며 나중에 다시 가져올 수 없습니다. 반드시 안전한 곳에 저장하세요."
 
-#: src/constants/form_errors.ts:4 src/language/curd.ts:42
+#: src/constants/form_errors.ts:4 src/language/curd.ts:44
 msgid "This value is already taken"
 msgstr "이 값은 이미 사용 중입니다"
 
@@ -5198,7 +5194,7 @@ msgstr "제한"
 msgid "Thursday"
 msgstr "목요일"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:65
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
 #: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
@@ -5224,7 +5220,7 @@ msgid ""
 "on your mobile phone."
 msgstr "활성화하려면 휴대폰에 Google Authenticator 또는 Microsoft Authenticator 앱을 설치해야 합니다."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
@@ -5287,6 +5283,10 @@ msgstr "전체 Nginx 프로세스"
 msgid "Total Nginx Processes"
 msgstr "전체 Nginx 프로세스"
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "총 수신"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
@@ -5296,6 +5296,10 @@ msgstr "총 요청 수"
 msgid "Total Requests / Total Connections"
 msgstr "총 요청 수 / 총 연결 수"
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr "전체 전송"
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgstr "TOTP"
@@ -5387,11 +5391,11 @@ msgstr "성공적으로 업그레이드됨"
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "Nginx UI를 업그레이드하는 중입니다. 잠시 기다려주세요..."
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgstr "파일 업로드"
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgstr "폴더 업로드"
 
@@ -5443,7 +5447,7 @@ msgstr "사용자가 OTP를 2FA로 활성화하지 않음"
 msgid "User Profile"
 msgstr "사용자 프로필"
 
-#: src/views/other/Login.vue:222 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "사용자 이름"
@@ -5509,7 +5513,7 @@ msgstr "대기 과정"
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgstr "경고"
 
@@ -5665,7 +5669,7 @@ msgstr "이 대화 상자는 %{countdown}초 후에 닫을 수 있습니다"
 msgid "You can close this dialog now"
 msgstr "이제 이 대화 상자를 닫을 수 있습니다"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
@@ -5694,6 +5698,9 @@ msgstr "이전 코드는 더 이상 작동하지 않습니다."
 msgid "Your passkeys"
 msgstr "귀하의 패스키"
 
+#~ msgid "Link Start"
+#~ msgstr "링크 시작"
+
 #~ msgid "Enable failed"
 #~ msgstr "활성화 실패"
 

+ 67 - 62
app/src/language/messages.pot

@@ -156,8 +156,8 @@ msgstr ""
 msgid "Add"
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgstr ""
 
@@ -210,7 +210,7 @@ msgstr ""
 msgid "Advance Mode"
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:99
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:104
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr ""
 
@@ -533,7 +533,7 @@ msgstr ""
 msgid "Batch Upgrade"
 msgstr ""
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgstr ""
 
@@ -599,6 +599,7 @@ msgstr ""
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/language/curd.ts:37
 #: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
@@ -849,13 +850,13 @@ msgstr ""
 msgid "Click or drag backup file to this area to upload"
 msgstr ""
 
-#: src/language/curd.ts:49
-#: src/language/curd.ts:53
+#: src/language/curd.ts:51
+#: src/language/curd.ts:55
 msgid "Click or drag files to this area to upload"
 msgstr ""
 
-#: src/language/curd.ts:50
-#: src/language/curd.ts:54
+#: src/language/curd.ts:52
+#: src/language/curd.ts:56
 msgid "Click or drag folders to this area to upload"
 msgstr ""
 
@@ -988,7 +989,7 @@ msgstr ""
 msgid "Confirm New Password"
 msgstr ""
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgstr ""
 
@@ -1510,7 +1511,7 @@ msgstr ""
 msgid "Dry run mode enabled"
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid "Due to the security policies of some browsers, you cannot use passkeys on non-HTTPS websites, except when running on localhost."
 msgstr ""
 
@@ -2183,7 +2184,7 @@ msgstr ""
 msgid "Folder"
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid "Follow the instructions in the dialog to complete the passkey registration process."
 msgstr ""
 
@@ -2344,7 +2345,7 @@ msgstr ""
 msgid "If you want to automatically revoke the old certificate, please enable this option."
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr ""
 
@@ -2575,7 +2576,7 @@ msgstr ""
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr ""
 
-#: src/language/curd.ts:37
+#: src/language/curd.ts:39
 msgid "Leave blank if do not want to modify"
 msgstr ""
 
@@ -2600,9 +2601,9 @@ msgstr ""
 msgid "License"
 msgstr ""
 
-#: src/views/dashboard/Environments.vue:133
-#: src/views/dashboard/Environments.vue:148
-msgid "Link Start"
+#: src/views/dashboard/components/NodeAnalyticItem.vue:116
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
+msgid "Link"
 msgstr ""
 
 #: src/language/curd.ts:23
@@ -2685,7 +2686,7 @@ msgid "Log List"
 msgstr ""
 
 #: src/routes/modules/auth.ts:14
-#: src/views/other/Login.vue:271
+#: src/views/other/Login.vue:277
 msgid "Login"
 msgstr ""
 
@@ -2916,7 +2917,7 @@ msgstr ""
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:80
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -2945,14 +2946,6 @@ msgstr ""
 msgid "Network Statistics"
 msgstr ""
 
-#: src/views/dashboard/ServerAnalytic.vue:283
-msgid "Network Total Receive"
-msgstr ""
-
-#: src/views/dashboard/ServerAnalytic.vue:289
-msgid "Network Total Send"
-msgstr ""
-
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgstr ""
@@ -3063,7 +3056,7 @@ msgstr ""
 msgid "Nginx Configurations Directory"
 msgstr ""
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgstr ""
 
@@ -3204,7 +3197,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: src/components/Notification/Notification.vue:108
-#: src/language/curd.ts:38
+#: src/language/curd.ts:40
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3354,7 +3347,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
-#: src/views/dashboard/Environments.vue:99
+#: src/views/dashboard/Environments.vue:101
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgstr ""
@@ -3388,7 +3381,7 @@ msgstr ""
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
-#: src/views/dashboard/Environments.vue:92
+#: src/views/dashboard/Environments.vue:94
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgstr ""
@@ -3406,7 +3399,7 @@ msgid "OpenAI"
 msgstr ""
 
 #: src/components/TwoFA/Authorization.vue:100
-#: src/views/other/Login.vue:280
+#: src/views/other/Login.vue:286
 msgid "Or"
 msgstr ""
 
@@ -3473,7 +3466,7 @@ msgstr ""
 msgid "Passkeys are webauthn credentials that validate your identity using touch, facial recognition, a device password, or a PIN. They can be used as a password replacement or as a 2FA method."
 msgstr ""
 
-#: src/views/other/Login.vue:232
+#: src/views/other/Login.vue:238
 #: src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr ""
@@ -3500,7 +3493,7 @@ msgstr ""
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3565,7 +3558,7 @@ msgstr ""
 msgid "Please enable the stub_status module to get request statistics, connection count, etc."
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid "Please enter a name for the passkey you wish to create and click the OK button below."
 msgstr ""
 
@@ -3732,7 +3725,7 @@ msgstr ""
 msgid "Process information"
 msgstr ""
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgstr ""
 
@@ -3841,7 +3834,7 @@ msgstr ""
 msgid "Register On Startup"
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgstr ""
 
@@ -3866,7 +3859,7 @@ msgid "Release Note"
 msgstr ""
 
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgstr ""
 
@@ -3902,7 +3895,7 @@ msgstr ""
 msgid "Reload request failed, please check your network connection"
 msgstr ""
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgstr ""
 
@@ -4051,7 +4044,7 @@ msgstr ""
 msgid "Responses"
 msgstr ""
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgstr ""
 
@@ -4081,7 +4074,7 @@ msgstr ""
 msgid "Restart request failed, please check your network connection"
 msgstr ""
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgstr ""
 
@@ -4153,7 +4146,7 @@ msgstr ""
 msgid "Run Mode"
 msgstr ""
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgstr ""
 
@@ -4322,6 +4315,10 @@ msgstr ""
 msgid "Save stream %{name} to %{node} successfully"
 msgstr ""
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr ""
+
 #: src/language/curd.ts:35
 #: src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
@@ -4414,7 +4411,7 @@ msgstr ""
 msgid "Select an action after sync"
 msgstr ""
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgstr ""
 
@@ -4518,7 +4515,7 @@ msgstr ""
 msgid "Show"
 msgstr ""
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgstr ""
 
@@ -4562,7 +4559,7 @@ msgstr ""
 msgid "Sites-enabled directory not exist"
 msgstr ""
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgstr ""
 
@@ -4627,7 +4624,7 @@ msgstr ""
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr ""
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgstr ""
 
@@ -4664,7 +4661,7 @@ msgstr ""
 msgid "Status"
 msgstr ""
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr ""
 
@@ -4748,13 +4745,13 @@ msgstr ""
 msgid "Support communication with the backend through the WebSocket protocol. If your Nginx UI is being used via an Nginx reverse proxy, please refer to this link to write the corresponding configuration file: https://nginxui.com/guide/nginx-proxy-example.html"
 msgstr ""
 
-#: src/language/curd.ts:51
-#: src/language/curd.ts:55
+#: src/language/curd.ts:53
+#: src/language/curd.ts:57
 msgid "Support single or batch upload of files"
 msgstr ""
 
-#: src/language/curd.ts:52
-#: src/language/curd.ts:56
+#: src/language/curd.ts:54
+#: src/language/curd.ts:58
 msgid "Support uploading entire folders"
 msgstr ""
 
@@ -4941,7 +4938,7 @@ msgstr ""
 msgid "The Public Security Number should only contain letters, unicode, numbers, hyphens, dashes, colons, and dots."
 msgstr ""
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid "The remote Nginx UI version is not compatible with the local Nginx UI version. To avoid potential errors, please upgrade the remote Nginx UI to match the local version."
 msgstr ""
 
@@ -4994,17 +4991,17 @@ msgid "This field is required"
 msgstr ""
 
 #: src/constants/form_errors.ts:3
-#: src/language/curd.ts:41
+#: src/language/curd.ts:43
 msgid "This field should be a valid email address"
 msgstr ""
 
 #: src/constants/form_errors.ts:5
-#: src/language/curd.ts:43
+#: src/language/curd.ts:45
 msgid "This field should be a valid hostname"
 msgstr ""
 
 #: src/constants/form_errors.ts:2
-#: src/language/curd.ts:40
+#: src/language/curd.ts:42
 msgid "This field should not be empty"
 msgstr ""
 
@@ -5012,7 +5009,7 @@ msgstr ""
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr ""
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid "This field should only contain letters, unicode characters, numbers, and -_./:"
 msgstr ""
 
@@ -5029,7 +5026,7 @@ msgid "This token will only be shown once and cannot be retrieved later. Please
 msgstr ""
 
 #: src/constants/form_errors.ts:4
-#: src/language/curd.ts:42
+#: src/language/curd.ts:44
 msgid "This value is already taken"
 msgstr ""
 
@@ -5059,7 +5056,7 @@ msgstr ""
 msgid "Thursday"
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:65
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
 #: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
@@ -5081,7 +5078,7 @@ msgstr ""
 msgid "To enable it, you need to install the Google or Microsoft Authenticator app on your mobile phone."
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid "To ensure security, Webauthn configuration cannot be added through the UI. Please manually configure the following in the app.ini configuration file and restart Nginx UI."
 msgstr ""
 
@@ -5128,6 +5125,10 @@ msgstr ""
 msgid "Total Nginx Processes"
 msgstr ""
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr ""
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
@@ -5137,6 +5138,10 @@ msgstr ""
 msgid "Total Requests / Total Connections"
 msgstr ""
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr ""
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgstr ""
@@ -5228,11 +5233,11 @@ msgstr ""
 msgid "Upgrading Nginx UI, please wait..."
 msgstr ""
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgstr ""
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgstr ""
 
@@ -5284,7 +5289,7 @@ msgstr ""
 msgid "User Profile"
 msgstr ""
 
-#: src/views/other/Login.vue:222
+#: src/views/other/Login.vue:228
 #: src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127
 #: src/views/user/UserProfile.vue:131
@@ -5354,7 +5359,7 @@ msgstr ""
 #: src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgstr ""
 
@@ -5491,7 +5496,7 @@ msgstr ""
 msgid "You can close this dialog now"
 msgstr ""
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid "You have not configured the settings of Webauthn, so you cannot add a passkey."
 msgstr ""
 

+ 67 - 60
app/src/language/pt_PT/app.po

@@ -166,8 +166,8 @@ msgstr "Rácio real de workers para configurado"
 msgid "Add"
 msgstr "Adicionar"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgstr "Adicionar uma chave de acesso"
 
@@ -219,7 +219,7 @@ msgstr "Adicional"
 msgid "Advance Mode"
 msgstr "Modo Avançado"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:99
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:104
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr ""
 "Depois, atualize esta página e clique em adicionar chave de acesso "
@@ -555,7 +555,7 @@ msgstr "Modificar em Massa"
 msgid "Batch Upgrade"
 msgstr "Actualização em Massa"
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgstr "Abaixo estão os itens selecionados que pretende modificar em lote"
 
@@ -624,7 +624,7 @@ msgstr ""
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
-#: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/components/NgxConfigEditor/NgxUpstream.vue:37 src/language/curd.ts:37
 #: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
@@ -945,11 +945,11 @@ msgstr "Limpo com sucesso"
 msgid "Click or drag backup file to this area to upload"
 msgstr "Clique ou arraste o arquivo de backup para esta área para fazer o upload"
 
-#: src/language/curd.ts:49 src/language/curd.ts:53
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Click or drag files to this area to upload"
 msgstr "Clique ou arraste ficheiros para esta área para carregar"
 
-#: src/language/curd.ts:50 src/language/curd.ts:54
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Click or drag folders to this area to upload"
 msgstr "Clique ou arraste pastas para esta área para carregar"
 
@@ -1081,7 +1081,7 @@ msgstr "Configurar SSL"
 msgid "Confirm New Password"
 msgstr "Confirmar nova palavra-passe"
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgstr "Conectado"
 
@@ -1606,7 +1606,7 @@ msgstr "Descarregar última versão"
 msgid "Dry run mode enabled"
 msgstr "Modo Dry Run activado"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
@@ -2281,7 +2281,7 @@ msgstr "pasta"
 msgid "Folder"
 msgstr "Pasta"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
@@ -2453,7 +2453,7 @@ msgid ""
 "option."
 msgstr "Se desejar revogar automaticamente o certificado antigo, ative esta opção."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr ""
 "Se o seu navegador suportar a chave de acesso WebAuthn, aparecerá uma caixa "
@@ -2701,7 +2701,7 @@ msgstr "Deixe em branco para não alterar"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "Deixe em branco para padrão: https://api.openai.com/"
 
-#: src/language/curd.ts:37
+#: src/language/curd.ts:39
 msgid "Leave blank if do not want to modify"
 msgstr "Deixar em branco se não quiser modificar"
 
@@ -2726,10 +2726,10 @@ msgstr "Lego desativar suporte CNAME"
 msgid "License"
 msgstr "Licença"
 
-#: src/views/dashboard/Environments.vue:133
-#: src/views/dashboard/Environments.vue:148
-msgid "Link Start"
-msgstr "Início do link"
+#: src/views/dashboard/components/NodeAnalyticItem.vue:116
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
+msgid "Link"
+msgstr "Ligação"
 
 #: src/language/curd.ts:23
 msgid "List"
@@ -2816,7 +2816,7 @@ msgstr ""
 msgid "Log List"
 msgstr "Lista de registos"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:271
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:277
 msgid "Login"
 msgstr "Autenticar"
 
@@ -3060,7 +3060,7 @@ msgstr "Diretiva Multilinha"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:80
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3088,14 +3088,6 @@ msgstr "Rede"
 msgid "Network Statistics"
 msgstr "Estatísticas de Rede"
 
-#: src/views/dashboard/ServerAnalytic.vue:283
-msgid "Network Total Receive"
-msgstr "Receção Total da Rede"
-
-#: src/views/dashboard/ServerAnalytic.vue:289
-msgid "Network Total Send"
-msgstr "Envio Total da Rede"
-
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgstr "Erro no novo provedor de desafio DNS: {0}"
@@ -3205,7 +3197,7 @@ msgstr "Caminho de configuração do Nginx"
 msgid "Nginx Configurations Directory"
 msgstr "Diretório de configurações do Nginx"
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgstr "Controle Nginx"
 
@@ -3346,7 +3338,7 @@ msgstr "Nginx.conf inclui o diretório streams-enabled"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
-#: src/components/Notification/Notification.vue:108 src/language/curd.ts:38
+#: src/components/Notification/Notification.vue:108 src/language/curd.ts:40
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3505,7 +3497,7 @@ msgstr "Documentação oficial"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
-#: src/views/dashboard/Environments.vue:99
+#: src/views/dashboard/Environments.vue:101
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgstr "Off-line"
@@ -3538,7 +3530,7 @@ msgstr "Assim que a verificação estiver concluída, os registos serão removid
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
-#: src/views/dashboard/Environments.vue:92
+#: src/views/dashboard/Environments.vue:94
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgstr "On-line"
@@ -3555,7 +3547,7 @@ msgstr "Aberto"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:280
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:286
 msgid "Or"
 msgstr "Ou"
 
@@ -3629,7 +3621,7 @@ msgstr ""
 "ou um PIN. Podem ser usadas como substituto de palavra-passe ou como método "
 "de autenticação de dois fatores (2FA)."
 
-#: src/views/other/Login.vue:232 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:238 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "Palavra-passe"
 
@@ -3655,7 +3647,7 @@ msgstr "As palavras-passe não coincidem"
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3723,7 +3715,7 @@ msgstr ""
 "Por favor, ative o módulo stub_status para obter estatísticas de pedidos, "
 "contagem de conexões, etc."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
@@ -3912,7 +3904,7 @@ msgstr "Distribuição de processos"
 msgid "Process information"
 msgstr "Informações do processo"
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgstr "Processando {count}/{total}"
 
@@ -4033,7 +4025,7 @@ msgstr "Registo falhou"
 msgid "Register On Startup"
 msgstr "Registar no arranque"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgstr "Chave de acesso registrada com sucesso"
 
@@ -4058,7 +4050,7 @@ msgid "Release Note"
 msgstr "Nota de Lançamento"
 
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgstr "Recarregar"
 
@@ -4094,7 +4086,7 @@ msgstr "Recarregamento remoto do Nginx bem-sucedido"
 msgid "Reload request failed, please check your network connection"
 msgstr "O pedido de recarregamento falhou, por favor verifique a sua ligação à rede"
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgstr "Recarregando"
 
@@ -4248,7 +4240,7 @@ msgstr ""
 msgid "Responses"
 msgstr "Respostas"
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgstr "Reiniciar"
 
@@ -4278,7 +4270,7 @@ msgstr "Reinício remoto do Nginx bem-sucedido"
 msgid "Restart request failed, please check your network connection"
 msgstr "Pedido de reinício falhou, por favor verifique a sua ligação à rede"
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgstr "Reiniciando"
 
@@ -4354,7 +4346,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgstr "Modo de Execução"
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgstr "Executando"
 
@@ -4522,6 +4514,10 @@ msgstr "Falha ao guardar o fluxo %{name} em %{node}"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Fluxo %{name} guardado em %{node} com sucesso"
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr "Salvo com sucesso"
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
@@ -4612,7 +4608,7 @@ msgstr "Selecionar tudo"
 msgid "Select an action after sync"
 msgstr "Selecionar uma ação após sincronização"
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgstr "{count} ficheiros selecionados"
 
@@ -4728,7 +4724,7 @@ msgstr "Zona de Memória Partilhada"
 msgid "Show"
 msgstr "Mostrar"
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgstr "Iniciar sessão com uma chave de acesso"
 
@@ -4772,7 +4768,7 @@ msgstr "O diretório sites-available não existe"
 msgid "Sites-enabled directory not exist"
 msgstr "O diretório sites-enabled não existe"
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgstr "Tamanho"
 
@@ -4841,7 +4837,7 @@ msgstr "Caminho da chave SSL"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "O caminho da chave SSL é necessário quando o HTTPS está ativado"
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgstr "Autenticação SSO"
 
@@ -4876,7 +4872,7 @@ msgstr "Estático"
 msgid "Status"
 msgstr "Estado"
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr "Parado"
 
@@ -4979,11 +4975,11 @@ msgstr ""
 "consulte este link para escrever o ficheiro de configuração correspondente: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51 src/language/curd.ts:55
+#: src/language/curd.ts:53 src/language/curd.ts:57
 msgid "Support single or batch upload of files"
 msgstr "Suporta upload único ou em lote de ficheiros"
 
-#: src/language/curd.ts:52 src/language/curd.ts:56
+#: src/language/curd.ts:54 src/language/curd.ts:58
 msgid "Support uploading entire folders"
 msgstr "Suporta o carregamento de pastas inteiras"
 
@@ -5193,7 +5189,7 @@ msgstr ""
 "O número de segurança pública deve conter apenas letras, unicode, números, "
 "hífens, traços, dois pontos e pontos."
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5263,15 +5259,15 @@ msgstr ""
 msgid "This field is required"
 msgstr "Este campo é mantatório"
 
-#: src/constants/form_errors.ts:3 src/language/curd.ts:41
+#: src/constants/form_errors.ts:3 src/language/curd.ts:43
 msgid "This field should be a valid email address"
 msgstr "Este campo deve ser um endereço de email válido"
 
-#: src/constants/form_errors.ts:5 src/language/curd.ts:43
+#: src/constants/form_errors.ts:5 src/language/curd.ts:45
 msgid "This field should be a valid hostname"
 msgstr "Este campo deve ser um nome de host válido"
 
-#: src/constants/form_errors.ts:2 src/language/curd.ts:40
+#: src/constants/form_errors.ts:2 src/language/curd.ts:42
 msgid "This field should not be empty"
 msgstr "Este campo não pode estar vazio"
 
@@ -5279,7 +5275,7 @@ msgstr "Este campo não pode estar vazio"
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "Este campo deve conter apenas letras, caracteres Unicode, números e -_."
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "-_./:"
@@ -5309,7 +5305,7 @@ msgstr ""
 "Este token será mostrado apenas uma vez e não poderá ser recuperado "
 "posteriormente. Certifique-se de guardá-lo num local seguro."
 
-#: src/constants/form_errors.ts:4 src/language/curd.ts:42
+#: src/constants/form_errors.ts:4 src/language/curd.ts:44
 msgid "This value is already taken"
 msgstr "Este valor já está em uso"
 
@@ -5349,7 +5345,7 @@ msgstr "Limitação"
 msgid "Thursday"
 msgstr "Quinta-feira"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:65
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
 #: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
@@ -5379,7 +5375,7 @@ msgstr ""
 "Para habilitar, tem de instalar a app Google ou Microsoft Authenticator no "
 "seu telemóvel."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
@@ -5446,6 +5442,10 @@ msgstr "Total de processos Nginx"
 msgid "Total Nginx Processes"
 msgstr "Total de processos do Nginx"
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "Receção total"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
@@ -5455,6 +5455,10 @@ msgstr "Pedidos totais"
 msgid "Total Requests / Total Connections"
 msgstr "Total de Pedidos / Total de Conexões"
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr "Total enviado"
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgstr "TOTP"
@@ -5548,11 +5552,11 @@ msgstr "Actualizado com sucesso"
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "Actualizando Nginx UI, aguarde por favor..."
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgstr "Carregar ficheiros"
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgstr "Carregar pastas"
 
@@ -5604,7 +5608,7 @@ msgstr "Utilizador não ativou OTP como 2FA"
 msgid "User Profile"
 msgstr "Perfil do utilizador"
 
-#: src/views/other/Login.vue:222 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Nome de Utilizador"
@@ -5670,7 +5674,7 @@ msgstr "Processos em espera"
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgstr "Aviso"
 
@@ -5840,7 +5844,7 @@ msgstr "Pode fechar esta caixa de diálogo em %{countdown} segundos"
 msgid "You can close this dialog now"
 msgstr "Agora pode fechar esta caixa de diálogo"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
@@ -5876,6 +5880,9 @@ msgstr "Os seus códigos antigos não funcionarão mais."
 msgid "Your passkeys"
 msgstr "As suas chaves de acesso"
 
+#~ msgid "Link Start"
+#~ msgstr "Início do link"
+
 #~ msgid "Enable failed"
 #~ msgstr "Activação falhou"
 

+ 67 - 60
app/src/language/ru_RU/app.po

@@ -170,8 +170,8 @@ msgstr "Фактическое соотношение рабочих к наст
 msgid "Add"
 msgstr "Добавить"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgstr "Добавить ключ доступа"
 
@@ -223,7 +223,7 @@ msgstr "Дополнительно"
 msgid "Advance Mode"
 msgstr "Расширенный режим"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:99
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:104
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr "После этого обновите эту страницу и снова нажмите «Добавить ключ доступа»."
 
@@ -561,7 +561,7 @@ msgstr "Массовое изменение"
 msgid "Batch Upgrade"
 msgstr "Пакетное обновление"
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgstr "Ниже приведены выбранные элементы, которые вы хотите изменить"
 
@@ -632,7 +632,7 @@ msgstr ""
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
-#: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/components/NgxConfigEditor/NgxUpstream.vue:37 src/language/curd.ts:37
 #: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
@@ -950,11 +950,11 @@ msgstr ""
 "Нажмите или перетащите файл резервного копирования в эту область, чтобы "
 "загрузить"
 
-#: src/language/curd.ts:49 src/language/curd.ts:53
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Click or drag files to this area to upload"
 msgstr "Нажмите или перетащите файлы в эту область для загрузки"
 
-#: src/language/curd.ts:50 src/language/curd.ts:54
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Click or drag folders to this area to upload"
 msgstr "Нажмите или перетащите папки в эту область для загрузки"
 
@@ -1086,7 +1086,7 @@ msgstr "Настроить SSL"
 msgid "Confirm New Password"
 msgstr "Подтвердите новый пароль"
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgstr "Подключено"
 
@@ -1609,7 +1609,7 @@ msgstr "Загрузка последней версии"
 msgid "Dry run mode enabled"
 msgstr "Включен пробный режим"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
@@ -2288,7 +2288,7 @@ msgstr "папка"
 msgid "Folder"
 msgstr "Папка"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
@@ -2460,7 +2460,7 @@ msgid ""
 "option."
 msgstr "Если вы хотите автоматически отозвать старый сертификат, включите эту опцию."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr "Если ваш браузер поддерживает WebAuthn Passkey, появится диалоговое окно."
 
@@ -2706,7 +2706,7 @@ msgstr "Оставьте пустым без изменений"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "Оставьте пустым для значения по умолчанию: https://api.openai.com/"
 
-#: src/language/curd.ts:37
+#: src/language/curd.ts:39
 msgid "Leave blank if do not want to modify"
 msgstr "Оставьте пустым, если не хотите изменять"
 
@@ -2731,10 +2731,10 @@ msgstr "Lego отключить поддержку CNAME"
 msgid "License"
 msgstr "Лицензия"
 
-#: src/views/dashboard/Environments.vue:133
-#: src/views/dashboard/Environments.vue:148
-msgid "Link Start"
-msgstr "Начало ссылки"
+#: src/views/dashboard/components/NodeAnalyticItem.vue:116
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
+msgid "Link"
+msgstr "Связь"
 
 #: src/language/curd.ts:23
 msgid "List"
@@ -2821,7 +2821,7 @@ msgstr ""
 msgid "Log List"
 msgstr "Список журналов"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:271
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:277
 msgid "Login"
 msgstr "Логин"
 
@@ -3065,7 +3065,7 @@ msgstr "Многострочная директива"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:80
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3093,14 +3093,6 @@ msgstr "Сеть"
 msgid "Network Statistics"
 msgstr "Статистика сети"
 
-#: src/views/dashboard/ServerAnalytic.vue:283
-msgid "Network Total Receive"
-msgstr "Всего получено"
-
-#: src/views/dashboard/ServerAnalytic.vue:289
-msgid "Network Total Send"
-msgstr "Всего отправлено"
-
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgstr "Ошибка нового поставщика DNS-проверки: {0}"
@@ -3210,7 +3202,7 @@ msgstr "Путь к конфигурации Nginx"
 msgid "Nginx Configurations Directory"
 msgstr "Каталог конфигураций Nginx"
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgstr "Управление Nginx"
 
@@ -3351,7 +3343,7 @@ msgstr "Nginx.conf включает каталог streams-enabled"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
-#: src/components/Notification/Notification.vue:108 src/language/curd.ts:38
+#: src/components/Notification/Notification.vue:108 src/language/curd.ts:40
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3510,7 +3502,7 @@ msgstr "Официальная документация"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
-#: src/views/dashboard/Environments.vue:99
+#: src/views/dashboard/Environments.vue:101
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgstr "Оффлайн"
@@ -3543,7 +3535,7 @@ msgstr "После завершения проверки записи будут
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
-#: src/views/dashboard/Environments.vue:92
+#: src/views/dashboard/Environments.vue:94
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgstr "Онлайн"
@@ -3560,7 +3552,7 @@ msgstr "Открыт"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:280
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:286
 msgid "Or"
 msgstr "Или"
 
@@ -3634,7 +3626,7 @@ msgstr ""
 "могут использоваться вместо пароля или в качестве метода двухфакторной "
 "аутентификации (2FA)."
 
-#: src/views/other/Login.vue:232 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:238 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "Пароль"
 
@@ -3660,7 +3652,7 @@ msgstr "Пароли не совпадают"
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3728,7 +3720,7 @@ msgstr ""
 "Пожалуйста, включите модуль stub_status, чтобы получать статистику "
 "запросов, количество соединений и т. д."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
@@ -3922,7 +3914,7 @@ msgstr "Распределение процессов"
 msgid "Process information"
 msgstr "Информация о процессе"
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgstr "Обработка {count}/{total}"
 
@@ -4043,7 +4035,7 @@ msgstr "Регистрация не удалась"
 msgid "Register On Startup"
 msgstr "Регистрация при запуске"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgstr "Ключ доступа успешно зарегистрирован"
 
@@ -4068,7 +4060,7 @@ msgid "Release Note"
 msgstr "Что нового"
 
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgstr "Перегрузить"
 
@@ -4104,7 +4096,7 @@ msgstr "Удаленная перезагрузка Nginx успешно вып
 msgid "Reload request failed, please check your network connection"
 msgstr "Не удалось выполнить запрос на перезагрузку, проверьте подключение к сети"
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgstr "Перезагружается"
 
@@ -4256,7 +4248,7 @@ msgstr ""
 msgid "Responses"
 msgstr "Ответы"
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgstr "Перезапуск"
 
@@ -4286,7 +4278,7 @@ msgstr "Удалённая перезагрузка Nginx успешно вып
 msgid "Restart request failed, please check your network connection"
 msgstr "Запрос на перезапуск не выполнен, проверьте подключение к сети"
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgstr "Перезапускается"
 
@@ -4362,7 +4354,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgstr "Режим работы"
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgstr "Выполняется"
 
@@ -4530,6 +4522,10 @@ msgstr "Не удалось сохранить поток %{name} на %{node}"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Поток %{name} успешно сохранён на %{node}"
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr "Сохранено успешно"
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
@@ -4620,7 +4616,7 @@ msgstr "Выбрать все"
 msgid "Select an action after sync"
 msgstr "Выберите действие после синхронизации"
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgstr "Выбрано {count} файлов"
 
@@ -4734,7 +4730,7 @@ msgstr "Зона общей памяти"
 msgid "Show"
 msgstr "Показать"
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgstr "Войти с помощью ключа доступа"
 
@@ -4778,7 +4774,7 @@ msgstr "Каталог sites-available не существует"
 msgid "Sites-enabled directory not exist"
 msgstr "Каталог sites-enabled не существует"
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgstr "Размер"
 
@@ -4843,7 +4839,7 @@ msgstr "Путь к SSL-ключу"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "Путь к SSL-ключу обязателен при включении HTTPS"
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgstr "SSO Вход"
 
@@ -4878,7 +4874,7 @@ msgstr "Статический"
 msgid "Status"
 msgstr "Статус"
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr "Остановлен"
 
@@ -4981,11 +4977,11 @@ msgstr ""
 "написать соответствующий конфигурационный файл: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51 src/language/curd.ts:55
+#: src/language/curd.ts:53 src/language/curd.ts:57
 msgid "Support single or batch upload of files"
 msgstr "Поддержка одиночной или пакетной загрузки файлов"
 
-#: src/language/curd.ts:52 src/language/curd.ts:56
+#: src/language/curd.ts:54 src/language/curd.ts:58
 msgid "Support uploading entire folders"
 msgstr "Поддержка загрузки целых папок"
 
@@ -5195,7 +5191,7 @@ msgstr ""
 "Номер общественной безопасности должен содержать только буквы, юникод, "
 "цифры, дефисы, тире, двоеточия и точки."
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5263,15 +5259,15 @@ msgstr "Этот каталог защищен и не может быть уд
 msgid "This field is required"
 msgstr "Это поле обязательно для заполнения"
 
-#: src/constants/form_errors.ts:3 src/language/curd.ts:41
+#: src/constants/form_errors.ts:3 src/language/curd.ts:43
 msgid "This field should be a valid email address"
 msgstr "Это поле должно содержать действительный адрес электронной почты"
 
-#: src/constants/form_errors.ts:5 src/language/curd.ts:43
+#: src/constants/form_errors.ts:5 src/language/curd.ts:45
 msgid "This field should be a valid hostname"
 msgstr "Это поле должно содержать допустимое имя хоста"
 
-#: src/constants/form_errors.ts:2 src/language/curd.ts:40
+#: src/constants/form_errors.ts:2 src/language/curd.ts:42
 msgid "This field should not be empty"
 msgstr "Это поле обязательно к заполнению"
 
@@ -5279,7 +5275,7 @@ msgstr "Это поле обязательно к заполнению"
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "Это поле должно содержать только буквы, символы Юникода, цифры и -_."
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "-_./:"
@@ -5310,7 +5306,7 @@ msgstr ""
 "Этот токен будет показан только один раз и не может быть восстановлен "
 "позже. Пожалуйста, сохраните его в надежном месте."
 
-#: src/constants/form_errors.ts:4 src/language/curd.ts:42
+#: src/constants/form_errors.ts:4 src/language/curd.ts:44
 msgid "This value is already taken"
 msgstr "Это значение уже занято"
 
@@ -5350,7 +5346,7 @@ msgstr "Ограничение"
 msgid "Thursday"
 msgstr "Четверг"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:65
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
 #: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
@@ -5380,7 +5376,7 @@ msgstr ""
 "Чтобы включить это, вам нужно установить приложение Google или Microsoft "
 "Authenticator на свой мобильный телефон."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
@@ -5447,6 +5443,10 @@ msgstr "Всего процессов Nginx"
 msgid "Total Nginx Processes"
 msgstr "Общее количество процессов Nginx"
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "Всего получено"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
@@ -5456,6 +5456,10 @@ msgstr "Всего запросов"
 msgid "Total Requests / Total Connections"
 msgstr "Всего запросов / Всего соединений"
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr "Всего отправлено"
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgstr "TOTP"
@@ -5549,11 +5553,11 @@ msgstr "Обновлено успешно"
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "Обновление Nginx UI, подождите..."
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgstr "Загрузить файлы"
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgstr "Загрузить папки"
 
@@ -5605,7 +5609,7 @@ msgstr "Пользователь не включил OTP в качестве 2FA
 msgid "User Profile"
 msgstr "Профиль пользователя"
 
-#: src/views/other/Login.vue:222 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Имя пользователя"
@@ -5671,7 +5675,7 @@ msgstr "Процессы ожидания"
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgstr "Внимание"
 
@@ -5840,7 +5844,7 @@ msgstr "Вы можете закрыть это окно через %{countdown}
 msgid "You can close this dialog now"
 msgstr "Теперь вы можете закрыть это диалоговое окно"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
@@ -5874,6 +5878,9 @@ msgstr "Ваши старые коды больше не будут работа
 msgid "Your passkeys"
 msgstr "Ваши ключи доступа"
 
+#~ msgid "Link Start"
+#~ msgstr "Начало ссылки"
+
 #~ msgid "Enable failed"
 #~ msgstr "Не удалось включить"
 

+ 67 - 60
app/src/language/tr_TR/app.po

@@ -166,8 +166,8 @@ msgstr "Gerçek çalışanın yapılandırılmışa oranı"
 msgid "Add"
 msgstr "Ekle"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgstr "Bir geçiş anahtarı ekle"
 
@@ -219,7 +219,7 @@ msgstr "İlave bilgi"
 msgid "Advance Mode"
 msgstr "Gelişmiş Mod"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:99
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:104
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr "Daha sonra bu sayfayı yenileyin ve tekrar parola anahtarı ekle'ye tıklayın."
 
@@ -549,7 +549,7 @@ msgstr "Toplu Değiştirme"
 msgid "Batch Upgrade"
 msgstr "Toplu Yükseltme"
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgstr "Aşağıda toplu olarak değiştirmek istediğiniz seçili öğeler bulunmaktadır"
 
@@ -618,7 +618,7 @@ msgstr ""
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
-#: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/components/NgxConfigEditor/NgxUpstream.vue:37 src/language/curd.ts:37
 #: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
@@ -939,11 +939,11 @@ msgstr "Başarıyla temizlendi"
 msgid "Click or drag backup file to this area to upload"
 msgstr "Yüklemek için bu alana yedekleme dosyasını tıklayın veya sürükleyin"
 
-#: src/language/curd.ts:49 src/language/curd.ts:53
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Click or drag files to this area to upload"
 msgstr "Yüklemek için dosyaları bu alana tıklayın veya sürükleyin"
 
-#: src/language/curd.ts:50 src/language/curd.ts:54
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Click or drag folders to this area to upload"
 msgstr "Yüklemek için klasörleri bu alana tıklayın veya sürükleyin"
 
@@ -1075,7 +1075,7 @@ msgstr "SSL'yi Yapılandırma"
 msgid "Confirm New Password"
 msgstr "Yeni Şifreyi Onayla"
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgstr "Bağlandı"
 
@@ -1601,7 +1601,7 @@ msgstr "En son sürüm indiriliyor"
 msgid "Dry run mode enabled"
 msgstr "Deneme modu etkinleştirildi(Dry-run)"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
@@ -2278,7 +2278,7 @@ msgstr "klasör"
 msgid "Folder"
 msgstr "Klasör"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
@@ -2452,7 +2452,7 @@ msgstr ""
 "Eski sertifikayı otomatik olarak iptal etmek istiyorsanız, bu seçeneği "
 "etkinleştirin."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr ""
 "Tarayıcınız WebAuthn Passkey'i destekliyorsa, bir iletişim kutusu "
@@ -2700,7 +2700,7 @@ msgstr "Değişiklik olmaması için boş bırakın"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "Varsayılan için boş bırakın: https://api.openai.com/"
 
-#: src/language/curd.ts:37
+#: src/language/curd.ts:39
 msgid "Leave blank if do not want to modify"
 msgstr "Değiştirmek istemiyorsanız boş bırakın"
 
@@ -2725,10 +2725,10 @@ msgstr "Lego CNAME Desteğini Devre Dışı Bırak"
 msgid "License"
 msgstr "Lisans"
 
-#: src/views/dashboard/Environments.vue:133
-#: src/views/dashboard/Environments.vue:148
-msgid "Link Start"
-msgstr "Bağlantı Başlat"
+#: src/views/dashboard/components/NodeAnalyticItem.vue:116
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
+msgid "Link"
+msgstr "Bağlantı"
 
 #: src/language/curd.ts:23
 msgid "List"
@@ -2814,7 +2814,7 @@ msgstr ""
 msgid "Log List"
 msgstr "Günlük Listesi"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:271
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:277
 msgid "Login"
 msgstr "Giriş"
 
@@ -3058,7 +3058,7 @@ msgstr "Çok Satırlı Yönergeler"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:80
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3086,14 +3086,6 @@ msgstr "Ağ"
 msgid "Network Statistics"
 msgstr "Ağ İstatistikleri"
 
-#: src/views/dashboard/ServerAnalytic.vue:283
-msgid "Network Total Receive"
-msgstr "Toplam Ağ Alımı"
-
-#: src/views/dashboard/ServerAnalytic.vue:289
-msgid "Network Total Send"
-msgstr "Toplam Ağ Gönderimi"
-
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgstr "Yeni DNS sorgulama sağlayıcı hatası: {0}"
@@ -3203,7 +3195,7 @@ msgstr "Nginx Yapılandırma Dosyası Yolu"
 msgid "Nginx Configurations Directory"
 msgstr "Nginx Yapılandırma Dizini"
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgstr "Nginx Kontrolü"
 
@@ -3344,7 +3336,7 @@ msgstr "Nginx.conf, streams-enabled dizinini içerir"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
-#: src/components/Notification/Notification.vue:108 src/language/curd.ts:38
+#: src/components/Notification/Notification.vue:108 src/language/curd.ts:40
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3503,7 +3495,7 @@ msgstr "Resmi Belge"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
-#: src/views/dashboard/Environments.vue:99
+#: src/views/dashboard/Environments.vue:101
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgstr "Çevrimdışı"
@@ -3536,7 +3528,7 @@ msgstr "Doğrulama tamamlandığında, kayıtlar kaldırılacaktır."
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
-#: src/views/dashboard/Environments.vue:92
+#: src/views/dashboard/Environments.vue:94
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgstr "Çevrimiçi"
@@ -3553,7 +3545,7 @@ msgstr "Açık"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:280
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:286
 msgid "Or"
 msgstr "Veya"
 
@@ -3626,7 +3618,7 @@ msgstr ""
 "kimliğinizi doğrulayan WebAuthn kimlik bilgileridir. Bir şifre yerine veya "
 "iki faktörlü kimlik doğrulama (2FA) yöntemi olarak kullanılabilirler."
 
-#: src/views/other/Login.vue:232 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:238 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "Şifre"
 
@@ -3652,7 +3644,7 @@ msgstr "Şifreler eşleşmiyor"
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3720,7 +3712,7 @@ msgstr ""
 "İstek istatistikleri, bağlantı sayısı vb. bilgileri almak için lütfen "
 "stub_status modülünü etkinleştirin."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
@@ -3910,7 +3902,7 @@ msgstr "Süreç Dağılımı"
 msgid "Process information"
 msgstr "Süreç bilgisi"
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgstr "İşleniyor {count}/{total}"
 
@@ -4030,7 +4022,7 @@ msgstr "Kayıt başarısız"
 msgid "Register On Startup"
 msgstr "Başlangıçta Kayıt Ol"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgstr "Geçiş anahtarı başarıyla kaydedildi"
 
@@ -4055,7 +4047,7 @@ msgid "Release Note"
 msgstr "Sürüm Notları"
 
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgstr "Yeniden Yükle"
 
@@ -4091,7 +4083,7 @@ msgstr "Uzak Nginx Yeniden Yükleme Başarılı"
 msgid "Reload request failed, please check your network connection"
 msgstr "Yeniden yükleme isteği başarısız oldu, lütfen ağ bağlantınızı kontrol edin"
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgstr "Yeniden Yükleniyor"
 
@@ -4252,7 +4244,7 @@ msgstr ""
 msgid "Responses"
 msgstr "Yanıtlar"
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgstr "Yeniden Başlat"
 
@@ -4282,7 +4274,7 @@ msgstr "Uzak Nginx Yeniden Başlatma Başarılı"
 msgid "Restart request failed, please check your network connection"
 msgstr "Yeniden başlatma isteği başarısız oldu, lütfen ağ bağlantınızı kontrol edin"
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgstr "Yeniden Başlatılıyor"
 
@@ -4358,7 +4350,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgstr "Çalışma Modu"
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgstr "Koşma"
 
@@ -4526,6 +4518,10 @@ msgstr "Akış %{name}, %{node} üzerine kaydedilemedi"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Akış %{name}, %{node} üzerine başarıyla kaydedildi"
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr "Başarıyla kaydedildi"
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
@@ -4614,7 +4610,7 @@ msgstr "Tümünü seç"
 msgid "Select an action after sync"
 msgstr "Senkronizasyon sonrası eylem seçin"
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgstr "Seçilen {count} dosya"
 
@@ -4730,7 +4726,7 @@ msgstr "Paylaşılan Bellek Bölgesi"
 msgid "Show"
 msgstr "Göster"
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgstr "Bir anahtarla oturum aç"
 
@@ -4774,7 +4770,7 @@ msgstr "Sites-available dizini mevcut değil"
 msgid "Sites-enabled directory not exist"
 msgstr "Sites-enabled dizini mevcut değil"
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgstr "Boyut"
 
@@ -4839,7 +4835,7 @@ msgstr "SSL Anahtar Yolu"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "HTTPS etkinleştirildiğinde SSL anahtar yolu gereklidir"
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgstr "SSO Girişi"
 
@@ -4874,7 +4870,7 @@ msgstr "Statik"
 msgid "Status"
 msgstr "Durum"
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr "Durduruldu"
 
@@ -4977,11 +4973,11 @@ msgstr ""
 "dosyasını yazmak için bu bağlantıya bakın: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51 src/language/curd.ts:55
+#: src/language/curd.ts:53 src/language/curd.ts:57
 msgid "Support single or batch upload of files"
 msgstr "Tek veya toplu dosya yüklemeyi destekler"
 
-#: src/language/curd.ts:52 src/language/curd.ts:56
+#: src/language/curd.ts:54 src/language/curd.ts:58
 msgid "Support uploading entire folders"
 msgstr "Tüm klasörlerin yüklenmesini destekler"
 
@@ -5193,7 +5189,7 @@ msgstr ""
 "Kamu Güvenlik Numarası yalnızca harfler, unicode, sayılar, kısa çizgiler, "
 "uzun çizgiler, iki nokta üst üste ve noktalar içermelidir."
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5261,15 +5257,15 @@ msgstr "Bu dizin korumalıdır ve sistem güvenliği için silinemez."
 msgid "This field is required"
 msgstr "Bu alan zorunludur"
 
-#: src/constants/form_errors.ts:3 src/language/curd.ts:41
+#: src/constants/form_errors.ts:3 src/language/curd.ts:43
 msgid "This field should be a valid email address"
 msgstr "Bu alan geçerli bir e-posta adresi olmalıdır"
 
-#: src/constants/form_errors.ts:5 src/language/curd.ts:43
+#: src/constants/form_errors.ts:5 src/language/curd.ts:45
 msgid "This field should be a valid hostname"
 msgstr "Bu alan geçerli bir ana bilgisayar adı olmalıdır"
 
-#: src/constants/form_errors.ts:2 src/language/curd.ts:40
+#: src/constants/form_errors.ts:2 src/language/curd.ts:42
 msgid "This field should not be empty"
 msgstr "Bu alan boş bırakılamaz"
 
@@ -5277,7 +5273,7 @@ msgstr "Bu alan boş bırakılamaz"
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "Bu alan yalnızca harfler, Unicode karakterler, sayılar ve -_ içermelidir."
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "-_./:"
@@ -5307,7 +5303,7 @@ msgstr ""
 "Bu token yalnızca bir kez gösterilecek ve daha sonra alınamayacaktır. "
 "Lütfen güvenli bir yerde sakladığınızdan emin olun."
 
-#: src/constants/form_errors.ts:4 src/language/curd.ts:42
+#: src/constants/form_errors.ts:4 src/language/curd.ts:44
 msgid "This value is already taken"
 msgstr "Bu değer zaten alınmış"
 
@@ -5347,7 +5343,7 @@ msgstr "Kısıtlama"
 msgid "Thursday"
 msgstr "Perşembe"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:65
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
 #: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
@@ -5377,7 +5373,7 @@ msgstr ""
 "Etkinleştirmek için telefonunuza Google Authenticator veya Microsoft "
 "Authenticator uygulamasını yüklemeniz gerekir."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
@@ -5444,6 +5440,10 @@ msgstr "Toplam Nginx süreçleri"
 msgid "Total Nginx Processes"
 msgstr "Toplam Nginx Süreçleri"
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "Toplam Alınan"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
@@ -5453,6 +5453,10 @@ msgstr "Toplam istekler"
 msgid "Total Requests / Total Connections"
 msgstr "Toplam İstekler / Toplam Bağlantılar"
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr "Toplam Gönderim"
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgstr "TOTP"
@@ -5546,11 +5550,11 @@ msgstr "Başarıyla yükseltildi"
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "Nginx UI güncelleniyor, lütfen bekleyin..."
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgstr "Dosyaları Yükle"
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgstr "Klasörleri Yükle"
 
@@ -5602,7 +5606,7 @@ msgstr "Kullanıcı OTP'yi 2FA olarak etkinleştirmedi"
 msgid "User Profile"
 msgstr "Kullanıcı Profili"
 
-#: src/views/other/Login.vue:222 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Kullanıcı Adı"
@@ -5668,7 +5672,7 @@ msgstr "Bekleme süreçleri"
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgstr "Uyarı"
 
@@ -5838,7 +5842,7 @@ msgstr "Bu iletişim kutusunu %{countdown} saniye içinde kapatabilirsiniz"
 msgid "You can close this dialog now"
 msgstr "Şimdi bu iletişim kutusunu kapatabilirsiniz"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
@@ -5873,6 +5877,9 @@ msgstr "Eski kodlarınız artık çalışmayacak."
 msgid "Your passkeys"
 msgstr "Geçiş Anahtarlarınız"
 
+#~ msgid "Link Start"
+#~ msgstr "Bağlantı Başlat"
+
 #~ msgid "Enable failed"
 #~ msgstr "Etkinleştirme başarısız"
 

+ 67 - 60
app/src/language/uk_UA/app.po

@@ -170,8 +170,8 @@ msgstr "Фактичне співвідношення робочих до нал
 msgid "Add"
 msgstr "Додати"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgstr "Додати ключ доступу"
 
@@ -223,7 +223,7 @@ msgstr "Додатково"
 msgid "Advance Mode"
 msgstr "Розширений режим"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:99
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:104
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr "Після цього оновіть цю сторінку та натисніть «Додати ключ доступу» знову."
 
@@ -559,7 +559,7 @@ msgstr "Масове редагування"
 msgid "Batch Upgrade"
 msgstr "Групове оновлення"
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgstr "Нижче наведені елементи, які ви обрали для групового редагування"
 
@@ -629,7 +629,7 @@ msgstr ""
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
-#: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/components/NgxConfigEditor/NgxUpstream.vue:37 src/language/curd.ts:37
 #: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
@@ -944,11 +944,11 @@ msgstr ""
 "Клацніть або перетягніть файл резервного копіювання в цю область, щоб "
 "завантажити"
 
-#: src/language/curd.ts:49 src/language/curd.ts:53
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Click or drag files to this area to upload"
 msgstr "Натисніть або перетягніть файли в цю область для завантаження"
 
-#: src/language/curd.ts:50 src/language/curd.ts:54
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Click or drag folders to this area to upload"
 msgstr "Натисніть або перетягніть папки в цю область для завантаження"
 
@@ -1080,7 +1080,7 @@ msgstr "Налаштувати SSL"
 msgid "Confirm New Password"
 msgstr "Підтвердити новий пароль"
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgstr "Підключено"
 
@@ -1675,7 +1675,7 @@ msgstr "Завантаження останнього релізу"
 msgid "Dry run mode enabled"
 msgstr "Увімкнено тестовий режим"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
@@ -2354,7 +2354,7 @@ msgstr "папка"
 msgid "Folder"
 msgstr "Папка"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
@@ -2526,7 +2526,7 @@ msgid ""
 "option."
 msgstr "Якщо ви хочете автоматично відкликати старий сертифікат, увімкніть цю опцію."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr "Якщо ваш браузер підтримує WebAuthn Passkey, з’явиться діалогове вікно."
 
@@ -2772,7 +2772,7 @@ msgstr "Залиште порожнім, щоб не змінювати"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "Залиште порожнім для значення за замовчуванням: https://api.openai.com/"
 
-#: src/language/curd.ts:37
+#: src/language/curd.ts:39
 msgid "Leave blank if do not want to modify"
 msgstr "Залиште порожнім, якщо не хочете змінювати"
 
@@ -2797,10 +2797,10 @@ msgstr "Lego вимкнути підтримку CNAME"
 msgid "License"
 msgstr "Ліцензія"
 
-#: src/views/dashboard/Environments.vue:133
-#: src/views/dashboard/Environments.vue:148
-msgid "Link Start"
-msgstr "Почати зв’язок"
+#: src/views/dashboard/components/NodeAnalyticItem.vue:116
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
+msgid "Link"
+msgstr "Зв’язок"
 
 #: src/language/curd.ts:23
 msgid "List"
@@ -2887,7 +2887,7 @@ msgstr ""
 msgid "Log List"
 msgstr "Список журналів"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:271
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:277
 msgid "Login"
 msgstr "Увійти"
 
@@ -3131,7 +3131,7 @@ msgstr "Багаторядкова директива"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:80
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3159,14 +3159,6 @@ msgstr "Мережа"
 msgid "Network Statistics"
 msgstr "Мережева статистика"
 
-#: src/views/dashboard/ServerAnalytic.vue:283
-msgid "Network Total Receive"
-msgstr "Загальний обсяг отриманих мережевих даних"
-
-#: src/views/dashboard/ServerAnalytic.vue:289
-msgid "Network Total Send"
-msgstr "Загальна кількість відправлених даних"
-
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgstr "Помилка нового постачальника DNS-виклику: {0}"
@@ -3276,7 +3268,7 @@ msgstr "Шлях до конфігурації Nginx"
 msgid "Nginx Configurations Directory"
 msgstr "Каталог конфігурацій Nginx"
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgstr "Керування Nginx"
 
@@ -3417,7 +3409,7 @@ msgstr "Nginx.conf включає каталог streams-enabled"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
-#: src/components/Notification/Notification.vue:108 src/language/curd.ts:38
+#: src/components/Notification/Notification.vue:108 src/language/curd.ts:40
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3576,7 +3568,7 @@ msgstr "Офіційна документація"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
-#: src/views/dashboard/Environments.vue:99
+#: src/views/dashboard/Environments.vue:101
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgstr "Офлайн"
@@ -3609,7 +3601,7 @@ msgstr "Після завершення перевірки записи буду
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
-#: src/views/dashboard/Environments.vue:92
+#: src/views/dashboard/Environments.vue:94
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgstr "Онлайн"
@@ -3626,7 +3618,7 @@ msgstr "Відкрито"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:280
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:286
 msgid "Or"
 msgstr "Або"
 
@@ -3700,7 +3692,7 @@ msgstr ""
 "можуть використовуватися замість пароля або як метод двофакторної "
 "аутентифікації (2FA)."
 
-#: src/views/other/Login.vue:232 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:238 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "Пароль"
 
@@ -3726,7 +3718,7 @@ msgstr "Паролі не збігаються"
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3794,7 +3786,7 @@ msgstr ""
 "Будь ласка, увімкніть модуль stub_status, щоб отримати статистику запитів, "
 "кількість з’єднань тощо."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
@@ -3984,7 +3976,7 @@ msgstr "Розподіл процесів"
 msgid "Process information"
 msgstr "Інформація про процес"
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgstr "Обробка {count}/{total}"
 
@@ -4106,7 +4098,7 @@ msgstr "Не вдалося зареєструвати"
 msgid "Register On Startup"
 msgstr "Реєстрація при запуску"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgstr "Ключ доступу успішно зареєстровано"
 
@@ -4131,7 +4123,7 @@ msgid "Release Note"
 msgstr "Примітки до версії"
 
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgstr "Перезавантажити"
 
@@ -4169,7 +4161,7 @@ msgstr ""
 "Не вдалося виконати запит на перезавантаження, будь ласка, перевірте "
 "підключення до мережі"
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgstr "Перезавантаження"
 
@@ -4321,7 +4313,7 @@ msgstr ""
 msgid "Responses"
 msgstr "Відповіді"
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgstr "Перезавантажити"
 
@@ -4353,7 +4345,7 @@ msgstr ""
 "Не вдалося виконати запит на перезавантаження, будь ласка, перевірте "
 "підключення до мережі"
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgstr "Перезапуск"
 
@@ -4429,7 +4421,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgstr "Режим роботи"
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgstr "Біг"
 
@@ -4597,6 +4589,10 @@ msgstr "Не вдалося зберегти потік %{name} на %{node}"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Потік %{name} успішно збережено на %{node}"
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr "Успішно збережено"
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
@@ -4687,7 +4683,7 @@ msgstr "Вибрати все"
 msgid "Select an action after sync"
 msgstr "Виберіть дію після синхронізації"
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgstr "Вибрано {count} файлів"
 
@@ -4805,7 +4801,7 @@ msgstr "Зона спільної пам'яті"
 msgid "Show"
 msgstr "Показати"
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgstr "Увійти за допомогою ключа доступу"
 
@@ -4849,7 +4845,7 @@ msgstr "Каталог Sites-available не існує"
 msgid "Sites-enabled directory not exist"
 msgstr "Каталог sites-enabled не існує"
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgstr "Розмір"
 
@@ -4914,7 +4910,7 @@ msgstr "Шлях до SSL-ключа"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "Шлях до SSL-ключа обов’язковий при ввімкненні HTTPS"
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgstr "Вхід через SSO"
 
@@ -4949,7 +4945,7 @@ msgstr "Статичний"
 msgid "Status"
 msgstr "Статус"
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr "Зупинено"
 
@@ -5052,11 +5048,11 @@ msgstr ""
 "щоб написати відповідний конфігураційний файл: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51 src/language/curd.ts:55
+#: src/language/curd.ts:53 src/language/curd.ts:57
 msgid "Support single or batch upload of files"
 msgstr "Підтримка одиночного або пакетного завантаження файлів"
 
-#: src/language/curd.ts:52 src/language/curd.ts:56
+#: src/language/curd.ts:54 src/language/curd.ts:58
 msgid "Support uploading entire folders"
 msgstr "Підтримка завантаження цілих папок"
 
@@ -5266,7 +5262,7 @@ msgstr ""
 "Номер громадської безпеки повинен містити лише літери, unicode, цифри, "
 "дефіси, тире, двокрапки та крапки."
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5336,15 +5332,15 @@ msgstr "Цей каталог захищений і не може бути ви
 msgid "This field is required"
 msgstr "Це поле обов'язкове"
 
-#: src/constants/form_errors.ts:3 src/language/curd.ts:41
+#: src/constants/form_errors.ts:3 src/language/curd.ts:43
 msgid "This field should be a valid email address"
 msgstr "Це поле має містити дійсну електронну адресу"
 
-#: src/constants/form_errors.ts:5 src/language/curd.ts:43
+#: src/constants/form_errors.ts:5 src/language/curd.ts:45
 msgid "This field should be a valid hostname"
 msgstr "Це поле має містити дійсну назву хоста"
 
-#: src/constants/form_errors.ts:2 src/language/curd.ts:40
+#: src/constants/form_errors.ts:2 src/language/curd.ts:42
 msgid "This field should not be empty"
 msgstr "Це поле не повинно бути порожнім"
 
@@ -5352,7 +5348,7 @@ msgstr "Це поле не повинно бути порожнім"
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "Це поле має містити лише літери, символи Unicode, цифри та -_."
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "-_./:"
@@ -5382,7 +5378,7 @@ msgstr ""
 "Цей токен буде показано лише один раз, і його не можна буде отримати "
 "пізніше. Будь ласка, збережіть його в безпечному місці."
 
-#: src/constants/form_errors.ts:4 src/language/curd.ts:42
+#: src/constants/form_errors.ts:4 src/language/curd.ts:44
 msgid "This value is already taken"
 msgstr "Це значення вже використовується"
 
@@ -5420,7 +5416,7 @@ msgstr "Обмеження"
 msgid "Thursday"
 msgstr "Четвер"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:65
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
 #: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
@@ -5450,7 +5446,7 @@ msgstr ""
 "Щоб увімкнути його, вам потрібно встановити додаток Google Authenticator "
 "або Microsoft Authenticator на свій мобільний телефон."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
@@ -5517,6 +5513,10 @@ msgstr "Загальна кількість процесів Nginx"
 msgid "Total Nginx Processes"
 msgstr "Загальна кількість процесів Nginx"
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "Загальний прийом"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
@@ -5526,6 +5526,10 @@ msgstr "Загальна кількість запитів"
 msgid "Total Requests / Total Connections"
 msgstr "Загальна кількість запитів / Загальна кількість з’єднань"
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr "Всього відправлено"
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgstr "TOTP"
@@ -5619,11 +5623,11 @@ msgstr "Успішно оновлено"
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "Оновлення Nginx UI, зачекайте..."
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgstr "Завантажити файли"
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgstr "Завантажити папки"
 
@@ -5675,7 +5679,7 @@ msgstr "Користувач не увімкнув OTP як 2FA"
 msgid "User Profile"
 msgstr "Профіль користувача"
 
-#: src/views/other/Login.vue:222 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Ім’я користувача"
@@ -5741,7 +5745,7 @@ msgstr "Процеси очікування"
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgstr "Попередження"
 
@@ -5910,7 +5914,7 @@ msgstr "Ви можете закрити це вікно через %{countdown}
 msgid "You can close this dialog now"
 msgstr "Тепер ви можете закрити це діалогове вікно"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
@@ -5943,6 +5947,9 @@ msgstr "Ваші старі коди більше не працюватимут
 msgid "Your passkeys"
 msgstr "Ваші ключі доступу"
 
+#~ msgid "Link Start"
+#~ msgstr "Почати зв’язок"
+
 #~ msgid "Enable failed"
 #~ msgstr "Не вдалося увімкнути"
 

+ 67 - 60
app/src/language/vi_VN/app.po

@@ -161,8 +161,8 @@ msgstr "Tỷ lệ công nhân thực tế so với cấu hình"
 msgid "Add"
 msgstr "Thêm"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgstr "Thêm khóa truy cập"
 
@@ -214,7 +214,7 @@ msgstr "Bổ sung"
 msgid "Advance Mode"
 msgstr "Nâng cao"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:99
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:104
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr "Sau đó, làm mới trang này và nhấp vào thêm khóa truy cập một lần nữa."
 
@@ -540,7 +540,7 @@ msgstr "Chỉnh sửa hàng loạt"
 msgid "Batch Upgrade"
 msgstr "Nâng cấp hàng loạt"
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgstr "Dưới đây là các mục đã chọn mà bạn muốn sửa hàng loạt"
 
@@ -609,7 +609,7 @@ msgstr ""
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
-#: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/components/NgxConfigEditor/NgxUpstream.vue:37 src/language/curd.ts:37
 #: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
@@ -923,11 +923,11 @@ msgstr "Đã xóa thành công"
 msgid "Click or drag backup file to this area to upload"
 msgstr "Nhấp hoặc kéo tệp sao lưu vào khu vực này để tải lên"
 
-#: src/language/curd.ts:49 src/language/curd.ts:53
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Click or drag files to this area to upload"
 msgstr "Nhấp hoặc kéo thả tệp vào khu vực này để tải lên"
 
-#: src/language/curd.ts:50 src/language/curd.ts:54
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Click or drag folders to this area to upload"
 msgstr "Nhấp hoặc kéo thư mục vào khu vực này để tải lên"
 
@@ -1059,7 +1059,7 @@ msgstr "Cấu hình SSL"
 msgid "Confirm New Password"
 msgstr "Xác nhận mật khẩu mới"
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgstr "Đã kết nối"
 
@@ -1581,7 +1581,7 @@ msgstr "Đang tải phiên bản mới nhất"
 msgid "Dry run mode enabled"
 msgstr "Đã bật chế độ Dry run"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
@@ -2255,7 +2255,7 @@ msgstr "thư mục"
 msgid "Folder"
 msgstr "Thư mục"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
@@ -2426,7 +2426,7 @@ msgid ""
 "option."
 msgstr "Nếu bạn muốn tự động thu hồi chứng chỉ cũ, vui lòng bật tùy chọn này."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr "Nếu trình duyệt của bạn hỗ trợ WebAuthn Passkey, một hộp thoại sẽ xuất hiện."
 
@@ -2672,7 +2672,7 @@ msgstr "Bỏ trống nếu không thay đổi"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "Bỏ trống để sử dụng địa chỉ mặc định: https://api.openai.com/"
 
-#: src/language/curd.ts:37
+#: src/language/curd.ts:39
 msgid "Leave blank if do not want to modify"
 msgstr "Để trống nếu không muốn thay đổi"
 
@@ -2697,10 +2697,10 @@ msgstr "Lego tắt hỗ trợ CNAME"
 msgid "License"
 msgstr "Giấy phép"
 
-#: src/views/dashboard/Environments.vue:133
-#: src/views/dashboard/Environments.vue:148
-msgid "Link Start"
-msgstr "Liên kết bắt đầu"
+#: src/views/dashboard/components/NodeAnalyticItem.vue:116
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
+msgid "Link"
+msgstr "Liên kết"
 
 #: src/language/curd.ts:23
 msgid "List"
@@ -2787,7 +2787,7 @@ msgstr ""
 msgid "Log List"
 msgstr "Danh sách nhật ký"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:271
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:277
 msgid "Login"
 msgstr "Đăng nhập"
 
@@ -3031,7 +3031,7 @@ msgstr "Chỉ thị nhiều dòng"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:80
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3059,14 +3059,6 @@ msgstr "Mạng"
 msgid "Network Statistics"
 msgstr "Thống kê mạng"
 
-#: src/views/dashboard/ServerAnalytic.vue:283
-msgid "Network Total Receive"
-msgstr "Tổng lưu lượng mạng đã nhận"
-
-#: src/views/dashboard/ServerAnalytic.vue:289
-msgid "Network Total Send"
-msgstr "Tổng lưu lượng mạng đã gửi"
-
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgstr "Lỗi nhà cung cấp thử thách DNS mới: {0}"
@@ -3176,7 +3168,7 @@ msgstr "Đường dẫn cấu hình Nginx"
 msgid "Nginx Configurations Directory"
 msgstr "Thư mục cấu hình Nginx"
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgstr "Điều khiển Nginx"
 
@@ -3317,7 +3309,7 @@ msgstr "Nginx.conf bao gồm thư mục streams-enabled"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
-#: src/components/Notification/Notification.vue:108 src/language/curd.ts:38
+#: src/components/Notification/Notification.vue:108 src/language/curd.ts:40
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3474,7 +3466,7 @@ msgstr "Tài liệu chính thức"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
-#: src/views/dashboard/Environments.vue:99
+#: src/views/dashboard/Environments.vue:101
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgstr "Ngoại tuyến"
@@ -3507,7 +3499,7 @@ msgstr "Sau khi quá trình xác minh hoàn tất, bản ghi sẽ bị xóa."
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
-#: src/views/dashboard/Environments.vue:92
+#: src/views/dashboard/Environments.vue:94
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgstr "Trực tuyến"
@@ -3524,7 +3516,7 @@ msgstr "Mở"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:280
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:286
 msgid "Or"
 msgstr "Hoặc"
 
@@ -3598,7 +3590,7 @@ msgstr ""
 "có thể được sử dụng để thay thế mật khẩu hoặc làm phương thức xác thực hai "
 "yếu tố (2FA)."
 
-#: src/views/other/Login.vue:232 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:238 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "Mật khẩu"
 
@@ -3624,7 +3616,7 @@ msgstr "Mật khẩu không khớp"
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3692,7 +3684,7 @@ msgstr ""
 "Vui lòng bật module stub_status để nhận thống kê yêu cầu, số lượng kết nối, "
 "v.v."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
@@ -3873,7 +3865,7 @@ msgstr "Phân bổ quy trình"
 msgid "Process information"
 msgstr "Thông tin tiến trình"
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgstr "Đang xử lý {count}/{total}"
 
@@ -3993,7 +3985,7 @@ msgstr "Đăng ký thất bại"
 msgid "Register On Startup"
 msgstr "Đăng ký khi khởi động"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgstr "Đăng ký khóa truy cập thành công"
 
@@ -4018,7 +4010,7 @@ msgid "Release Note"
 msgstr "Ghi chú phát hành"
 
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgstr "Tải lại"
 
@@ -4054,7 +4046,7 @@ msgstr "Tải lại Nginx từ xa thành công"
 msgid "Reload request failed, please check your network connection"
 msgstr "Yêu cầu tải lại thất bại, vui lòng kiểm tra kết nối mạng của bạn"
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgstr "Đang tải lại"
 
@@ -4206,7 +4198,7 @@ msgstr ""
 msgid "Responses"
 msgstr "Phản hồi"
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgstr "Khởi động lại"
 
@@ -4236,7 +4228,7 @@ msgstr "Khởi động lại Nginx từ xa thành công"
 msgid "Restart request failed, please check your network connection"
 msgstr "Yêu cầu khởi động lại thất bại, vui lòng kiểm tra kết nối mạng của bạn"
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgstr "Đang khởi động lại"
 
@@ -4312,7 +4304,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgstr "Chế độ chạy"
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgstr "Running"
 
@@ -4480,6 +4472,10 @@ msgstr "Lưu luồng %{name} vào %{node} thất bại"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Đã lưu luồng %{name} vào %{node} thành công"
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr "Lưu thành công"
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
@@ -4568,7 +4564,7 @@ msgstr "Chọn tất cả"
 msgid "Select an action after sync"
 msgstr "Chọn hành động sau khi đồng bộ"
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgstr "Đã chọn {count} tệp"
 
@@ -4682,7 +4678,7 @@ msgstr "Vùng Bộ Nhớ Chia Sẻ"
 msgid "Show"
 msgstr "Hiển thị"
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgstr "Đăng nhập bằng khóa truy cập"
 
@@ -4726,7 +4722,7 @@ msgstr "Thư mục Sites-available không tồn tại"
 msgid "Sites-enabled directory not exist"
 msgstr "Thư mục sites-enabled không tồn tại"
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgstr "Kích thước"
 
@@ -4791,7 +4787,7 @@ msgstr "Đường dẫn khóa SSL"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "Đường dẫn khóa SSL là bắt buộc khi bật HTTPS"
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgstr "Đăng nhập SSO"
 
@@ -4826,7 +4822,7 @@ msgstr "Tĩnh"
 msgid "Status"
 msgstr "Trạng thái"
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr "Đã dừng"
 
@@ -4929,11 +4925,11 @@ msgstr ""
 "liên kết này để viết tệp cấu hình tương ứng: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51 src/language/curd.ts:55
+#: src/language/curd.ts:53 src/language/curd.ts:57
 msgid "Support single or batch upload of files"
 msgstr "Hỗ trợ tải lên một hoặc nhiều tệp"
 
-#: src/language/curd.ts:52 src/language/curd.ts:56
+#: src/language/curd.ts:54 src/language/curd.ts:58
 msgid "Support uploading entire folders"
 msgstr "Hỗ trợ tải lên toàn bộ thư mục"
 
@@ -5143,7 +5139,7 @@ msgstr ""
 "Số Công an chỉ được chứa chữ cái, unicode, số, dấu gạch ngang, dấu gạch "
 "dài, dấu hai chấm và dấu chấm."
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5211,15 +5207,15 @@ msgstr "Thư mục này được bảo vệ và không thể xóa vì lý do an
 msgid "This field is required"
 msgstr "Trường này là bắt buộc"
 
-#: src/constants/form_errors.ts:3 src/language/curd.ts:41
+#: src/constants/form_errors.ts:3 src/language/curd.ts:43
 msgid "This field should be a valid email address"
 msgstr "Trường này phải là một địa chỉ email hợp lệ"
 
-#: src/constants/form_errors.ts:5 src/language/curd.ts:43
+#: src/constants/form_errors.ts:5 src/language/curd.ts:45
 msgid "This field should be a valid hostname"
 msgstr "Trường này phải là một tên máy chủ hợp lệ"
 
-#: src/constants/form_errors.ts:2 src/language/curd.ts:40
+#: src/constants/form_errors.ts:2 src/language/curd.ts:42
 msgid "This field should not be empty"
 msgstr "Trường này không được để trống"
 
@@ -5227,7 +5223,7 @@ msgstr "Trường này không được để trống"
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "Trường này chỉ được chứa chữ cái, ký tự Unicode, số và -_."
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "-_./:"
@@ -5257,7 +5253,7 @@ msgstr ""
 "Mã thông báo này sẽ chỉ hiển thị một lần và không thể lấy lại sau này. Vui "
 "lòng đảm bảo lưu trữ nó ở nơi an toàn."
 
-#: src/constants/form_errors.ts:4 src/language/curd.ts:42
+#: src/constants/form_errors.ts:4 src/language/curd.ts:44
 msgid "This value is already taken"
 msgstr "Giá trị này đã được sử dụng"
 
@@ -5297,7 +5293,7 @@ msgstr "Hạn chế"
 msgid "Thursday"
 msgstr "Thứ Năm"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:65
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
 #: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
@@ -5327,7 +5323,7 @@ msgstr ""
 "Để bật tính năng này, bạn cần cài đặt ứng dụng Google Authenticator hoặc "
 "Microsoft Authenticator trên điện thoại di động của mình."
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
@@ -5394,6 +5390,10 @@ msgstr "Tổng số tiến trình Nginx"
 msgid "Total Nginx Processes"
 msgstr "Tổng số tiến trình Nginx"
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "Tổng nhận"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
@@ -5403,6 +5403,10 @@ msgstr "Tổng số yêu cầu"
 msgid "Total Requests / Total Connections"
 msgstr "Tổng số yêu cầu / Tổng số kết nối"
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr "Tổng gửi"
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgstr "TOTP"
@@ -5496,11 +5500,11 @@ msgstr "Nâng cấp thành công"
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "Đang cập nhật Nginx UI, vui lòng đợi..."
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgstr "Tải lên tệp"
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgstr "Tải lên thư mục"
 
@@ -5552,7 +5556,7 @@ msgstr "Người dùng chưa bật OTP làm 2FA"
 msgid "User Profile"
 msgstr "Hồ sơ người dùng"
 
-#: src/views/other/Login.vue:222 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Username"
@@ -5618,7 +5622,7 @@ msgstr "Quá trình chờ đợi"
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgstr "Lưu ý"
 
@@ -5785,7 +5789,7 @@ msgstr "Bạn có thể đóng hộp thoại này sau %{countdown} giây"
 msgid "You can close this dialog now"
 msgstr "Bạn có thể đóng hộp thoại này ngay bây giờ"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
@@ -5818,6 +5822,9 @@ msgstr "Mã cũ của bạn sẽ không còn hoạt động nữa."
 msgid "Your passkeys"
 msgstr "Khóa truy cập của bạn"
 
+#~ msgid "Link Start"
+#~ msgstr "Liên kết bắt đầu"
+
 #~ msgid "Enable failed"
 #~ msgstr "Bật không thành công"
 

+ 67 - 60
app/src/language/zh_CN/app.po

@@ -165,8 +165,8 @@ msgstr "实际工作进程与配置比例"
 msgid "Add"
 msgstr "添加"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgstr "添加通行密钥"
 
@@ -218,7 +218,7 @@ msgstr "额外选项"
 msgid "Advance Mode"
 msgstr "高级模式"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:99
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:104
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr "之后,请刷新此页面并再次点击添加通行密钥。"
 
@@ -540,7 +540,7 @@ msgstr "批量修改"
 msgid "Batch Upgrade"
 msgstr "批量升级"
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgstr "以下是您选定的需要批量修改的项目"
 
@@ -607,7 +607,7 @@ msgstr "基于 worker_processes * worker_connections 计算得出。实际性能
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
-#: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/components/NgxConfigEditor/NgxUpstream.vue:37 src/language/curd.ts:37
 #: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
@@ -903,11 +903,11 @@ msgstr "清除成功"
 msgid "Click or drag backup file to this area to upload"
 msgstr "单击或拖动备份文件到此区域上传"
 
-#: src/language/curd.ts:49 src/language/curd.ts:53
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Click or drag files to this area to upload"
 msgstr "点击或拖拽文件到此处上传"
 
-#: src/language/curd.ts:50 src/language/curd.ts:54
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Click or drag folders to this area to upload"
 msgstr "点击或拖拽文件夹到此处上传"
 
@@ -1039,7 +1039,7 @@ msgstr "配置 SSL"
 msgid "Confirm New Password"
 msgstr "确认新密码"
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgstr "已连接"
 
@@ -1557,7 +1557,7 @@ msgstr "下载最新版本"
 msgid "Dry run mode enabled"
 msgstr "试运行模式已启动"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
@@ -2229,7 +2229,7 @@ msgstr "文件夹"
 msgid "Folder"
 msgstr "文件夹"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
@@ -2396,7 +2396,7 @@ msgid ""
 "option."
 msgstr "如果要自动撤销旧证书,请启用此选项。"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr "如果您的浏览器支持 WebAuthn Passkey,则会出现一个对话框。"
 
@@ -2634,7 +2634,7 @@ msgstr "留空表示不修改"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "留空为默认:https://api.openai.com/"
 
-#: src/language/curd.ts:37
+#: src/language/curd.ts:39
 msgid "Leave blank if do not want to modify"
 msgstr "如果不想修改,请留空"
 
@@ -2659,10 +2659,10 @@ msgstr "Lego 禁用 CNAME 支持"
 msgid "License"
 msgstr "开源许可"
 
-#: src/views/dashboard/Environments.vue:133
-#: src/views/dashboard/Environments.vue:148
-msgid "Link Start"
-msgstr "接"
+#: src/views/dashboard/components/NodeAnalyticItem.vue:116
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
+msgid "Link"
+msgstr "接"
 
 #: src/language/curd.ts:23
 msgid "List"
@@ -2747,7 +2747,7 @@ msgstr ""
 msgid "Log List"
 msgstr "日志列表"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:271
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:277
 msgid "Login"
 msgstr "登录"
 
@@ -2986,7 +2986,7 @@ msgstr "多行指令"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:80
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3014,14 +3014,6 @@ msgstr "网络"
 msgid "Network Statistics"
 msgstr "流量统计"
 
-#: src/views/dashboard/ServerAnalytic.vue:283
-msgid "Network Total Receive"
-msgstr "下载流量"
-
-#: src/views/dashboard/ServerAnalytic.vue:289
-msgid "Network Total Send"
-msgstr "上传流量"
-
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgstr "新建DNS验证提供程序错误:{0}"
@@ -3131,7 +3123,7 @@ msgstr "Nginx 配置路径"
 msgid "Nginx Configurations Directory"
 msgstr "Nginx 配置目录"
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgstr "控制 Nginx"
 
@@ -3270,7 +3262,7 @@ msgstr "检查 nginx.conf 是否包含 streams-enabled 的目录"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
-#: src/components/Notification/Notification.vue:108 src/language/curd.ts:38
+#: src/components/Notification/Notification.vue:108 src/language/curd.ts:40
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3423,7 +3415,7 @@ msgstr "官方文档"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
-#: src/views/dashboard/Environments.vue:99
+#: src/views/dashboard/Environments.vue:101
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgstr "离线"
@@ -3456,7 +3448,7 @@ msgstr "一旦验证完成,这些记录将被删除。"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
-#: src/views/dashboard/Environments.vue:92
+#: src/views/dashboard/Environments.vue:94
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgstr "在线"
@@ -3473,7 +3465,7 @@ msgstr "开放"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:280
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:286
 msgid "Or"
 msgstr "或"
 
@@ -3543,7 +3535,7 @@ msgid ""
 "password replacement or as a 2FA method."
 msgstr "Passkey 是一种网络认证凭据,可通过指纹、面部识别、设备密码或 PIN 码验证身份。它们可用作密码替代品或二步验证方法。"
 
-#: src/views/other/Login.vue:232 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:238 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "密码"
 
@@ -3569,7 +3561,7 @@ msgstr "密码不匹配"
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3635,7 +3627,7 @@ msgid ""
 "count, etc."
 msgstr "请启用 stub_status 模块,以获取请求统计信息、连接数等。"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
@@ -3810,7 +3802,7 @@ msgstr "进程分布"
 msgid "Process information"
 msgstr "进程信息"
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgstr "处理中 {count}/{total}"
 
@@ -3924,7 +3916,7 @@ msgstr "注册失败"
 msgid "Register On Startup"
 msgstr "启动时注册"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgstr "Passkey 注册成功"
 
@@ -3949,7 +3941,7 @@ msgid "Release Note"
 msgstr "发行日志"
 
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgstr "重载"
 
@@ -3985,7 +3977,7 @@ msgstr "重载远程 Nginx 成功"
 msgid "Reload request failed, please check your network connection"
 msgstr "重载请求失败,请检查网络连接"
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgstr "重载中"
 
@@ -4134,7 +4126,7 @@ msgstr "驻留集大小:实际驻留在物理内存中的内存,包括所有
 msgid "Responses"
 msgstr "响应"
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgstr "重启"
 
@@ -4164,7 +4156,7 @@ msgstr "重启远程 Nginx 成功"
 msgid "Restart request failed, please check your network connection"
 msgstr "重启请求失败,请检查网络连接"
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgstr "重启中"
 
@@ -4238,7 +4230,7 @@ msgstr "依赖方 ID"
 msgid "Run Mode"
 msgstr "运行模式"
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgstr "运行中"
 
@@ -4406,6 +4398,10 @@ msgstr "部署 %{name} 到 %{node} 失败"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "成功将站点 %{name} 保存到 %{node} 中"
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr "保存成功"
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
@@ -4494,7 +4490,7 @@ msgstr "全选"
 msgid "Select an action after sync"
 msgstr "选择同步后的操作"
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgstr "已选择 {count} 个文件"
 
@@ -4606,7 +4602,7 @@ msgstr "共享内存区"
 msgid "Show"
 msgstr "显示"
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgstr "使用 Passkey 登录"
 
@@ -4650,7 +4646,7 @@ msgstr "Sites-available 目录不存在"
 msgid "Sites-enabled directory not exist"
 msgstr "Sites-enabled 目录不存在"
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgstr "大小"
 
@@ -4715,7 +4711,7 @@ msgstr "SSL 密钥路径"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "启用 HTTPS 时需要 SSL 密钥路径"
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgstr "SSO 登录"
 
@@ -4750,7 +4746,7 @@ msgstr "静态"
 msgid "Status"
 msgstr "状态"
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr "已停止"
 
@@ -4847,11 +4843,11 @@ msgstr ""
 "支持通过 WebSocket 协议与后端通信,如果您正在使用 Nginx 反向代理了 Nginx UI "
 "请参考:https://nginxui.com/guide/nginx-proxy-example.html 编写配置文件"
 
-#: src/language/curd.ts:51 src/language/curd.ts:55
+#: src/language/curd.ts:53 src/language/curd.ts:57
 msgid "Support single or batch upload of files"
 msgstr "支持单个或多个文件上传"
 
-#: src/language/curd.ts:52 src/language/curd.ts:56
+#: src/language/curd.ts:54 src/language/curd.ts:58
 msgid "Support uploading entire folders"
 msgstr "支持上传整个文件夹"
 
@@ -5046,7 +5042,7 @@ msgid ""
 "hyphens, dashes, colons, and dots."
 msgstr "公安备案号只能包含字母、单码、数字、连字符、破折号、冒号和点。"
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5106,15 +5102,15 @@ msgstr "此目录受保护,为确保系统安全无法删除。"
 msgid "This field is required"
 msgstr "此字段必填"
 
-#: src/constants/form_errors.ts:3 src/language/curd.ts:41
+#: src/constants/form_errors.ts:3 src/language/curd.ts:43
 msgid "This field should be a valid email address"
 msgstr "该字段应是有效的电子邮件地址"
 
-#: src/constants/form_errors.ts:5 src/language/curd.ts:43
+#: src/constants/form_errors.ts:5 src/language/curd.ts:45
 msgid "This field should be a valid hostname"
 msgstr "该字段应是有效的主机名"
 
-#: src/constants/form_errors.ts:2 src/language/curd.ts:40
+#: src/constants/form_errors.ts:2 src/language/curd.ts:42
 msgid "This field should not be empty"
 msgstr "该字段不能为空"
 
@@ -5122,7 +5118,7 @@ msgstr "该字段不能为空"
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "该字段只能包含字母、unicode 字符、数字和 -_。"
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "-_./:"
@@ -5146,7 +5142,7 @@ msgid ""
 "make sure to save it in a secure location."
 msgstr "此 Token 只显示一次,以后无法找回。请确保将其保存在安全位置。"
 
-#: src/constants/form_errors.ts:4 src/language/curd.ts:42
+#: src/constants/form_errors.ts:4 src/language/curd.ts:44
 msgid "This value is already taken"
 msgstr "该字段的值已经存在"
 
@@ -5180,7 +5176,7 @@ msgstr "限流"
 msgid "Thursday"
 msgstr "星期四"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:65
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
 #: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
@@ -5206,7 +5202,7 @@ msgid ""
 "on your mobile phone."
 msgstr "要启用该功能,您需要在手机上安装 Google 或 Microsoft Authenticator 应用程序。"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
@@ -5267,6 +5263,10 @@ msgstr "Nginx 进程总数"
 msgid "Total Nginx Processes"
 msgstr "Nginx 进程总数"
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "总接收量"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
@@ -5276,6 +5276,10 @@ msgstr "总请求数"
 msgid "Total Requests / Total Connections"
 msgstr "请求总数/连接总数"
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr "总发送"
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgstr "TOTP"
@@ -5367,11 +5371,11 @@ msgstr "升级成功"
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "正在升级 Nginx UI,请等待..."
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgstr "上传文件"
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgstr "上传文件夹"
 
@@ -5423,7 +5427,7 @@ msgstr "用户未启用 OTP 作为 2FA"
 msgid "User Profile"
 msgstr "用户资料"
 
-#: src/views/other/Login.vue:222 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "用户名"
@@ -5489,7 +5493,7 @@ msgstr "等待处理"
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgstr "警告"
 
@@ -5641,7 +5645,7 @@ msgstr "您可以在 %{countdown} 秒后关闭此对话框"
 msgid "You can close this dialog now"
 msgstr "现在可以关闭此对话框"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
@@ -5670,6 +5674,9 @@ msgstr "您的旧代码将不再有效。"
 msgid "Your passkeys"
 msgstr "你的 Passkeys"
 
+#~ msgid "Link Start"
+#~ msgstr "链接"
+
 #~ msgid "Enable failed"
 #~ msgstr "启用失败"
 

+ 67 - 60
app/src/language/zh_TW/app.po

@@ -169,8 +169,8 @@ msgstr "實際工作進程與配置比例"
 msgid "Add"
 msgstr "新增"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgstr "新增通行金鑰"
 
@@ -222,7 +222,7 @@ msgstr "其他設定"
 msgid "Advance Mode"
 msgstr "進階模式"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:99
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:104
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr "之後,請重新整理此頁面並再次點擊新增通行金鑰。"
 
@@ -544,7 +544,7 @@ msgstr "批次修改"
 msgid "Batch Upgrade"
 msgstr "批次升級"
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgstr "以下是您要批次修改的選定項目"
 
@@ -611,7 +611,7 @@ msgstr "基於 worker_processes * worker_connections 計算得出。實際效能
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
-#: src/components/NgxConfigEditor/NgxUpstream.vue:37
+#: src/components/NgxConfigEditor/NgxUpstream.vue:37 src/language/curd.ts:37
 #: src/views/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
@@ -907,11 +907,11 @@ msgstr "清除成功"
 msgid "Click or drag backup file to this area to upload"
 msgstr "點選或拖曳備份檔案至此區域上傳"
 
-#: src/language/curd.ts:49 src/language/curd.ts:53
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Click or drag files to this area to upload"
 msgstr "點擊或拖拽文件到此處上傳"
 
-#: src/language/curd.ts:50 src/language/curd.ts:54
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Click or drag folders to this area to upload"
 msgstr "點擊或拖拽文件夾到此處上傳"
 
@@ -1043,7 +1043,7 @@ msgstr "設定 SSL"
 msgid "Confirm New Password"
 msgstr "確認新密碼"
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgstr "已連線"
 
@@ -1561,7 +1561,7 @@ msgstr "正在下載最新版本"
 msgid "Dry run mode enabled"
 msgstr "試運轉模式已啟用"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
@@ -2233,7 +2233,7 @@ msgstr "資料夾"
 msgid "Folder"
 msgstr "資料夾"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
@@ -2400,7 +2400,7 @@ msgid ""
 "option."
 msgstr "如果您想要自動撤銷舊憑證,請啟用此選項。"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr "如果您的瀏覽器支援 WebAuthn 通行金鑰,將會顯示一個對話框。"
 
@@ -2638,7 +2638,7 @@ msgstr "留空表示不修改"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "預設留空:https://api.openai.com/"
 
-#: src/language/curd.ts:37
+#: src/language/curd.ts:39
 msgid "Leave blank if do not want to modify"
 msgstr "留空表示不修改"
 
@@ -2663,10 +2663,10 @@ msgstr "Lego 停用 CNAME 支援"
 msgid "License"
 msgstr "開源授權"
 
-#: src/views/dashboard/Environments.vue:133
-#: src/views/dashboard/Environments.vue:148
-msgid "Link Start"
-msgstr "連結開始"
+#: src/views/dashboard/components/NodeAnalyticItem.vue:116
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
+msgid "Link"
+msgstr "連結"
 
 #: src/language/curd.ts:23
 msgid "List"
@@ -2751,7 +2751,7 @@ msgstr ""
 msgid "Log List"
 msgstr "日誌列表"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:271
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:277
 msgid "Login"
 msgstr "登入"
 
@@ -2990,7 +2990,7 @@ msgstr "多行指令"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:75
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:80
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3018,14 +3018,6 @@ msgstr "網路"
 msgid "Network Statistics"
 msgstr "網路統計"
 
-#: src/views/dashboard/ServerAnalytic.vue:283
-msgid "Network Total Receive"
-msgstr "下載流量"
-
-#: src/views/dashboard/ServerAnalytic.vue:289
-msgid "Network Total Send"
-msgstr "上傳流量"
-
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgstr "新建DNS驗證提供程序錯誤:{0}"
@@ -3135,7 +3127,7 @@ msgstr "Nginx 設定路徑"
 msgid "Nginx Configurations Directory"
 msgstr "Nginx 設定目錄"
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgstr "Nginx 控制元件"
 
@@ -3274,7 +3266,7 @@ msgstr "Nginx.conf 包含 streams-enabled 目錄"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
-#: src/components/Notification/Notification.vue:108 src/language/curd.ts:38
+#: src/components/Notification/Notification.vue:108 src/language/curd.ts:40
 #: src/views/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3427,7 +3419,7 @@ msgstr "官方文件"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
-#: src/views/dashboard/Environments.vue:99
+#: src/views/dashboard/Environments.vue:101
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgstr "離線"
@@ -3460,7 +3452,7 @@ msgstr "驗證完成後,記錄將被刪除。"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
-#: src/views/dashboard/Environments.vue:92
+#: src/views/dashboard/Environments.vue:94
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgstr "線上"
@@ -3477,7 +3469,7 @@ msgstr "開放"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:280
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:286
 msgid "Or"
 msgstr "或"
 
@@ -3549,7 +3541,7 @@ msgstr ""
 "通行金鑰是 WebAuthn 認證,透過觸控、面部辨識、裝置密碼或 PIN 碼來驗證您的身份。它們可以用作密碼替代品或作為雙重身份驗證 (2FA) "
 "方法。"
 
-#: src/views/other/Login.vue:232 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:238 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "密碼"
 
@@ -3575,7 +3567,7 @@ msgstr "密碼不匹配"
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3641,7 +3633,7 @@ msgid ""
 "count, etc."
 msgstr "請啟用 stub_status 模組以取得請求統計、連線數量等資訊"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
@@ -3816,7 +3808,7 @@ msgstr "行程分布"
 msgid "Process information"
 msgstr "行程資訊"
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgstr "處理中 {count}/{total}"
 
@@ -3930,7 +3922,7 @@ msgstr "註冊失敗"
 msgid "Register On Startup"
 msgstr "啟動時註冊"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgstr "通行金鑰註冊成功"
 
@@ -3955,7 +3947,7 @@ msgid "Release Note"
 msgstr "發行公告"
 
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgstr "重新載入"
 
@@ -3991,7 +3983,7 @@ msgstr "遠端 Nginx 重新載入成功"
 msgid "Reload request failed, please check your network connection"
 msgstr "重新載入請求失敗,請檢查您的網路連線"
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgstr "重新載入中"
 
@@ -4140,7 +4132,7 @@ msgstr "常駐集大小:實際存在於實體記憶體中的記憶體,包含
 msgid "Responses"
 msgstr "回應"
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgstr "重新啟動"
 
@@ -4170,7 +4162,7 @@ msgstr "遠端 Nginx 重啟成功"
 msgid "Restart request failed, please check your network connection"
 msgstr "重新啟動請求失敗,請檢查您的網路連線"
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgstr "正在重新啟動"
 
@@ -4244,7 +4236,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgstr "執行模式"
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgstr "執行中"
 
@@ -4412,6 +4404,10 @@ msgstr "儲存串流 %{name} 至 %{node} 失敗"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "串流 %{name} 成功儲存至 %{node}"
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr "儲存成功"
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
@@ -4500,7 +4496,7 @@ msgstr "全選"
 msgid "Select an action after sync"
 msgstr "同步後選擇操作"
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgstr "已選擇 {count} 個檔案"
 
@@ -4612,7 +4608,7 @@ msgstr "共享記憶體區域"
 msgid "Show"
 msgstr "顯示"
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgstr "使用通行金鑰登入"
 
@@ -4656,7 +4652,7 @@ msgstr "sites-available 資料夾不存在"
 msgid "Sites-enabled directory not exist"
 msgstr "sites-enabled 資料夾不存在"
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgstr "大小"
 
@@ -4721,7 +4717,7 @@ msgstr "SSL 金鑰路徑"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "啟用 HTTPS 時必須提供 SSL 金鑰路徑"
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgstr "SSO 登入"
 
@@ -4756,7 +4752,7 @@ msgstr "靜態"
 msgid "Status"
 msgstr "狀態"
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr "已停止"
 
@@ -4853,11 +4849,11 @@ msgstr ""
 "支援透過 WebSocket 協議與後端進行通訊。如果您的 Nginx UI 是透過 Nginx "
 "反向代理使用,請參考此連結編寫對應的設定文件:https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51 src/language/curd.ts:55
+#: src/language/curd.ts:53 src/language/curd.ts:57
 msgid "Support single or batch upload of files"
 msgstr "支援單個或多個檔案上傳"
 
-#: src/language/curd.ts:52 src/language/curd.ts:56
+#: src/language/curd.ts:54 src/language/curd.ts:58
 msgid "Support uploading entire folders"
 msgstr "支援上傳整個資料夾"
 
@@ -5052,7 +5048,7 @@ msgid ""
 "hyphens, dashes, colons, and dots."
 msgstr "公安編號僅能包含字母、Unicode 字元、數字、連字號、破折號、冒號和句點。"
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5112,15 +5108,15 @@ msgstr "此目錄受保護,為確保系統安全無法刪除。"
 msgid "This field is required"
 msgstr "此欄位為必填項"
 
-#: src/constants/form_errors.ts:3 src/language/curd.ts:41
+#: src/constants/form_errors.ts:3 src/language/curd.ts:43
 msgid "This field should be a valid email address"
 msgstr "此欄位應為有效的電子郵件地址"
 
-#: src/constants/form_errors.ts:5 src/language/curd.ts:43
+#: src/constants/form_errors.ts:5 src/language/curd.ts:45
 msgid "This field should be a valid hostname"
 msgstr "此欄位應為有效的主機名稱"
 
-#: src/constants/form_errors.ts:2 src/language/curd.ts:40
+#: src/constants/form_errors.ts:2 src/language/curd.ts:42
 msgid "This field should not be empty"
 msgstr "此欄位不應為空"
 
@@ -5128,7 +5124,7 @@ msgstr "此欄位不應為空"
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "此欄位僅能包含字母、Unicode 字元、數字、連字號、破折號和底線。"
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "-_./:"
@@ -5152,7 +5148,7 @@ msgid ""
 "make sure to save it in a secure location."
 msgstr "此令牌僅顯示一次且無法後續找回,請務必將其儲存在安全的地方。"
 
-#: src/constants/form_errors.ts:4 src/language/curd.ts:42
+#: src/constants/form_errors.ts:4 src/language/curd.ts:44
 msgid "This value is already taken"
 msgstr "此值已被使用"
 
@@ -5186,7 +5182,7 @@ msgstr "節流"
 msgid "Thursday"
 msgstr "星期四"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:65
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:70
 #: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
@@ -5212,7 +5208,7 @@ msgid ""
 "on your mobile phone."
 msgstr "要啟用它,您需要在手機上安裝 Google 或 Microsoft Authenticator 應用程式。"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
@@ -5273,6 +5269,10 @@ msgstr "Nginx 行程總數"
 msgid "Total Nginx Processes"
 msgstr "Nginx 行程總數"
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "總接收量"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
@@ -5282,6 +5282,10 @@ msgstr "總請求數"
 msgid "Total Requests / Total Connections"
 msgstr "總請求數 / 總連線數"
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr "總發送"
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgstr "TOTP"
@@ -5373,11 +5377,11 @@ msgstr "升級成功"
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "正在升級 Nginx UI,請稍候..."
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgstr "上傳檔案"
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgstr "上傳資料夾"
 
@@ -5429,7 +5433,7 @@ msgstr "使用者未啟用 OTP 作為雙重身份驗證 (2FA)"
 msgid "User Profile"
 msgstr "用戶資料"
 
-#: src/views/other/Login.vue:222 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "使用者名稱"
@@ -5495,7 +5499,7 @@ msgstr "等待過程"
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgstr "警告"
 
@@ -5647,7 +5651,7 @@ msgstr "您可以在 %{countdown} 秒後關閉此對話框"
 msgid "You can close this dialog now"
 msgstr "你可以關閉這個對話框了"
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
@@ -5676,6 +5680,9 @@ msgstr "您的舊代碼將不再有效。"
 msgid "Your passkeys"
 msgstr "您的通行金鑰"
 
+#~ msgid "Link Start"
+#~ msgstr "連結開始"
+
 #~ msgid "Enable failed"
 #~ msgstr "啟用失敗"
 

+ 1 - 1
app/src/lib/helper/index.ts

@@ -7,7 +7,7 @@ function bytesToSize(bytes: number) {
 
   const k = 1024
 
-  const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
+  const sizes = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']
 
   const i = Math.floor(Math.log(bytes) / Math.log(k))
 

+ 187 - 74
app/src/views/dashboard/Environments.vue

@@ -2,7 +2,7 @@
 import type ReconnectingWebSocket from 'reconnecting-websocket'
 import type { Ref } from 'vue'
 import type { Node } from '@/api/environment'
-import Icon, { LinkOutlined, SendOutlined, ThunderboltOutlined } from '@ant-design/icons-vue'
+import Icon, { LinkOutlined, ThunderboltOutlined } from '@ant-design/icons-vue'
 import analytic from '@/api/analytic'
 import environment from '@/api/environment'
 import logo from '@/assets/img/logo.png'
@@ -71,83 +71,68 @@ const visible = computed(() => {
 <template>
   <ACard
     v-if="visible"
-    class="env-list-card"
+    class="env-list-card w-full max-w-none"
     :title="$gettext('Environments')"
+    :bordered="false"
   >
     <AList
       item-layout="horizontal"
       :data-source="data"
+      class="env-list"
     >
       <template #renderItem="{ item }">
-        <AListItem>
+        <AListItem class="env-list-item">
           <AListItemMeta>
             <template #title>
-              <div class="mb-1">
-                {{ item.name }}
-                <ATag
-                  v-if="item.status"
-                  color="blue"
-                  class="ml-2"
-                >
-                  {{ $gettext('Online') }}
-                </ATag>
-                <ATag
-                  v-else
-                  color="error"
-                  class="ml-2"
-                >
-                  {{ $gettext('Offline') }}
-                </ATag>
+              <div class="env-title-wrapper">
+                <div class="env-tags">
+                  <ATag
+                    v-if="item.status"
+                    color="blue"
+                    :bordered="false"
+                  >
+                    {{ $gettext('Online') }}
+                  </ATag>
+                  <ATag
+                    v-else
+                    color="error"
+                    :bordered="false"
+                  >
+                    {{ $gettext('Offline') }}
+                  </ATag>
+                </div>
+                <span class="env-name">{{ item.name }}</span>
               </div>
 
-              <template v-if="item.status">
-                <div class="runtime-meta mr-2 mb-1">
-                  <Icon :component="pulse" /> {{ formatDateTime(item.response_at) }}
+              <div class="env-meta-wrapper">
+                <template v-if="item.status">
+                  <div class="runtime-meta">
+                    <Icon :component="pulse" />
+                    <span>{{ formatDateTime(item.response_at) }}</span>
+                  </div>
+                  <div class="runtime-meta">
+                    <ThunderboltOutlined />
+                    <span>{{ item.version }}</span>
+                  </div>
+                </template>
+                <div class="runtime-meta">
+                  <LinkOutlined />
+                  <span class="truncate">{{ item.url }}</span>
                 </div>
-                <div class="runtime-meta mr-2 mb-1">
-                  <ThunderboltOutlined />{{ item.version }}
-                </div>
-              </template>
-              <div class="runtime-meta">
-                <LinkOutlined />{{ item.url }}
               </div>
             </template>
             <template #avatar>
-              <AAvatar :src="logo" />
+              <AAvatar :src="logo" class="flex-shrink-0" />
             </template>
             <template #description>
-              <div class="md:flex lg:flex justify-between md:items-center">
+              <div class="env-description">
                 <NodeAnalyticItem
                   :item="item"
-                  class="mt-1 mb-1"
+                  :current-env-id="env.id"
+                  :local-version="version"
+                  :on-link-start="linkStart"
+                  class="node-analytic"
                 />
-
-                <AButton
-                  v-if="item.version === version"
-                  type="primary"
-                  :disabled="!item.status || env.id === item.id"
-                  ghost
-                  @click="linkStart(item)"
-                >
-                  <SendOutlined />
-                  {{ env.id !== item.id ? $gettext('Link Start') : $gettext('Connected') }}
-                </AButton>
-                <ATooltip
-                  v-else
-                  placement="topLeft"
-                >
-                  <template #title>
-                    {{ $gettext('The remote Nginx UI version is not compatible with the local Nginx UI version. '
-                      + 'To avoid potential errors, please upgrade the remote Nginx UI to match the local version.') }}
-                  </template>
-                  <AButton
-                    ghost
-                    disabled
-                  >
-                    <SendOutlined />
-                    {{ $gettext('Link Start') }}
-                  </AButton>
-                </ATooltip>
               </div>
             </template>
           </AListItemMeta>
@@ -158,34 +143,162 @@ const visible = computed(() => {
 </template>
 
 <style scoped lang="less">
-:deep(.ant-list-item-meta-title) {
+.env-list-card {
+  margin-top: 16px;
+
+  // Ensure card doesn't overflow on small screens
+  @media (max-width: 768px) {
+    margin-left: -8px;
+    margin-right: -8px;
+    border-radius: 0;
+  }
+}
+
+.env-list {
+  // Responsive handling for list container
+  .env-list-item {
+    padding: 16px 0;
+
+    @media (max-width: 576px) {
+      padding: 12px 0;
+    }
+  }
+}
+
+// Title area styles
+.env-title-wrapper {
   display: flex;
   align-items: center;
-  @media (max-width: 700px) {
-    display: block;
+  gap: 4px;
+  flex-wrap: wrap;
+  margin-right: 8px;
+
+  .env-name {
+    font-weight: 500;
+    line-height: 1.4;
   }
 }
 
-.env-list-card {
-  margin-top: 16px;
+// Metadata area styles
+.env-meta-wrapper {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 12px;
 
-  .runtime-meta {
-    display: inline-flex;
-    @media (max-width: 700px) {
-      align-items: center;
+  @media (max-width: 768px) {
+    margin-top: 8px;
+    margin-bottom: 8px;
+  }
+
+  @media (max-width: 576px) {
+    gap: 8px;
+  }
+}
+
+.runtime-meta {
+  display: inline-flex;
+  align-items: center;
+  gap: 4px;
+  font-weight: 400;
+  color: #9b9b9b;
+  font-size: 14px;
+  line-height: 1.4;
+  max-width: 100%;
+
+  .anticon {
+    flex-shrink: 0;
+  }
+
+  span {
+    min-width: 0; // Allow text truncation
+  }
+
+  @media (max-width: 576px) {
+    font-size: 12px;
+  }
+}
+
+// Description area styles
+.env-description {
+  margin-top: 8px;
+
+  .node-analytic {
+    width: 100%;
+  }
+}
+
+// Global dark mode class adaptation
+.dark {
+  .ant-list-item-meta-avatar .ant-avatar {
+    border: 1px solid #303030 !important;
+  }
+}
+
+// Deep selector optimizations
+:deep(.ant-list-item-meta) {
+  width: 100%;
+  display: flex;
+
+  .ant-list-item-meta-content {
+    width: 100%;
+    min-width: 0; // Allow content to shrink
+  }
+
+  .ant-list-item-meta-title {
+    margin-bottom: 0;
+    display: flex;
+    align-items: center;
+
+    @media (max-width: 768px) {
+      display: block;
     }
-    font-weight: 400;
-    color: #9b9b9b;
+  }
 
-    .anticon {
-      margin-right: 4px;
+  .ant-list-item-meta-avatar {
+    display: flex;
+    align-items: center;
+    align-self: center; // Vertically center relative to the entire meta container
+
+    .ant-avatar {
+      border: 1px solid #f0f0f0;
+      border-radius: 8px; // Square with rounded corners
+      padding: 2px; // Add padding
+      transition: border-color 0.2s ease;
+    }
+    @media (max-width: 768px) {
+      display: none;
     }
   }
 }
 
-:deep(.ant-list-item-action) {
-  @media(max-width: 500px) {
-    display: none;
+// Responsive breakpoint optimizations
+@media (max-width: 1200px) {
+  .env-meta-wrapper {
+    gap: 10px;
+  }
+}
+
+@media (max-width: 992px) {
+  .env-title-wrapper .env-name {
+    font-size: 15px;
+  }
+
+  .runtime-meta {
+    font-size: 13px;
+  }
+}
+
+@media (max-width: 480px) {
+  .env-title-wrapper {
+    margin-bottom: 6px;
+  }
+
+  .env-meta-wrapper {
+    gap: 6px;
+  }
+
+  .runtime-meta {
+    font-size: 11px;
   }
 }
 </style>

+ 2 - 2
app/src/views/dashboard/ServerAnalytic.vue

@@ -280,13 +280,13 @@ function wsOnMessage(m: MessageEvent) {
             <ACol :span="12">
               <AStatistic
                 :value="bytesToSize(net.last_recv)"
-                :title="$gettext('Network Total Receive')"
+                :title="$gettext('Total Receive')"
               />
             </ACol>
             <ACol :span="12">
               <AStatistic
                 :value="bytesToSize(net.last_sent)"
-                :title="$gettext('Network Total Send')"
+                :title="$gettext('Total Send')"
               />
             </ACol>
           </ARow>

+ 215 - 74
app/src/views/dashboard/components/NodeAnalyticItem.vue

@@ -1,122 +1,200 @@
 <script setup lang="ts">
-import Icon, { ArrowDownOutlined, ArrowUpOutlined, DatabaseOutlined, LineChartOutlined } from '@ant-design/icons-vue'
+import type { Node } from '@/api/environment'
+import Icon, { ArrowDownOutlined, ArrowUpOutlined, DatabaseOutlined, LineChartOutlined, SendOutlined } from '@ant-design/icons-vue'
 import cpu from '@/assets/svg/cpu.svg?component'
 import memory from '@/assets/svg/memory.svg?component'
 import UsageProgressLine from '@/components/Chart/UsageProgressLine.vue'
 import { bytesToSize } from '@/lib/helper'
 
-defineProps<{
-  item: {
-    avg_load: {
-      load1: number
-      load5: number
-      load15: number
-    }
-    network: {
-      bytesSent: number
-      bytesRecv: number
-    }
-    cpu_percent: number
-    cpu_num: number
-    memory_percent: number
-    memory_total: string
-    disk_percent: number
-    disk_total: string
+interface ExtendedNode extends Node {
+  version?: string
+  status?: boolean
+  url?: string
+  avg_load?: {
+    load1: number
+    load5: number
+    load15: number
+  }
+  network?: {
+    bytesSent: number
+    bytesRecv: number
   }
+  cpu_percent?: number
+  cpu_num?: number
+  memory_percent?: number
+  memory_total?: string
+  disk_percent?: number
+  disk_total?: string
+}
+
+defineProps<{
+  item: ExtendedNode
+  currentEnvId?: number
+  localVersion?: string
+  onLinkStart?: (item: ExtendedNode) => void
 }>()
 </script>
 
 <template>
-  <div class="hardware-monitor">
-    <div class="hardware-monitor-item longer">
-      <div class="mb-1">
-        <LineChartOutlined class="mr-1" />
-        <span class="load-avg-describe">1min:</span>{{ item.avg_load?.load1?.toFixed(2) }} ·
-        <span class="load-avg-describe">5min:</span>{{ item.avg_load?.load5?.toFixed(2) }} ·
-        <span class="load-avg-describe">15min:</span>{{ item.avg_load?.load15?.toFixed(2) }}
+  <div class="node-analytics-container">
+    <div class="hardware-monitor justify-between w-full">
+      <div class="hardware-monitor-item longer <lg:mb-2">
+        <div class="mb-1">
+          <LineChartOutlined class="mr-1" />
+          <span class="load-avg-describe">1min:</span>{{ item.avg_load?.load1?.toFixed(2) }} ·
+          <span class="load-avg-describe">5min:</span>{{ item.avg_load?.load5?.toFixed(2) }} ·
+          <span class="load-avg-describe">15min:</span>{{ item.avg_load?.load15?.toFixed(2) }}
+        </div>
+        <div class="flex">
+          <div class="sm:text-sm md:text-xs lg:text-sm">
+            <ArrowUpOutlined />
+            {{ bytesToSize(item?.network?.bytesSent || 0) }}
+          </div>
+          <div class="ml-2 sm:text-sm md:text-xs lg:text-sm">
+            <ArrowDownOutlined />
+            {{ bytesToSize(item?.network?.bytesRecv || 0) }}
+          </div>
+        </div>
       </div>
-      <div class="flex">
-        <div class="sm:text-sm md:text-xs lg:text-sm">
-          <ArrowUpOutlined />
-          {{ bytesToSize(item?.network?.bytesSent) }}
+      <div class="flex justify-between">
+        <div class="<md:block md:flex">
+          <div class="hardware-monitor-item">
+            <UsageProgressLine :percent="item.cpu_percent || 0">
+              <template #icon>
+                <Icon :component="cpu" />
+              </template>
+              <span>{{ item.cpu_num || 0 }} CPU</span>
+            </UsageProgressLine>
+          </div>
+          <div class="hardware-monitor-item">
+            <UsageProgressLine :percent="item.memory_percent || 0">
+              <template #icon>
+                <Icon :component="memory" />
+              </template>
+              <span>{{ item.memory_total || 'N/A' }}</span>
+            </UsageProgressLine>
+          </div>
+          <div class="hardware-monitor-item">
+            <UsageProgressLine :percent="item.disk_percent || 0">
+              <template #icon>
+                <DatabaseOutlined />
+              </template>
+              <span>{{ item.disk_total || 'N/A' }}</span>
+            </UsageProgressLine>
+          </div>
         </div>
-        <div class="ml-2 sm:text-sm md:text-xs lg:text-sm">
-          <ArrowDownOutlined />
-          {{ bytesToSize(item?.network?.bytesRecv) }}
+
+        <!-- Link button section -->
+        <div class="link-button-section">
+          <AButton
+            v-if="item.version === localVersion"
+            type="primary"
+            :disabled="!item.status || currentEnvId === item.id"
+            ghost
+            class="link-btn"
+            @click="onLinkStart?.(item)"
+          >
+            <SendOutlined />
+            <span class="link-btn-text">
+              {{ currentEnvId !== item.id ? $gettext('Link') : $gettext('Connected') }}
+            </span>
+          </AButton>
+          <ATooltip
+            v-else
+            placement="topLeft"
+          >
+            <template #title>
+              {{ $gettext('The remote Nginx UI version is not compatible with the local Nginx UI version. '
+                + 'To avoid potential errors, please upgrade the remote Nginx UI to match the local version.') }}
+            </template>
+            <AButton
+              ghost
+              disabled
+              class="link-btn"
+            >
+              <SendOutlined />
+              <span class="link-btn-text">{{ $gettext('Link') }}</span>
+            </AButton>
+          </ATooltip>
         </div>
       </div>
     </div>
-    <div class="hardware-monitor-item">
-      <UsageProgressLine :percent="item.cpu_percent">
-        <template #icon>
-          <Icon :component="cpu" />
-        </template>
-        <span>{{ item.cpu_num }} CPU</span>
-      </UsageProgressLine>
-    </div>
-    <div class="hardware-monitor-item">
-      <UsageProgressLine :percent="item.memory_percent">
-        <template #icon>
-          <Icon :component="memory" />
-        </template>
-        <span>{{ item.memory_total }}</span>
-      </UsageProgressLine>
-    </div>
-    <div class="hardware-monitor-item">
-      <UsageProgressLine :percent="item.disk_percent">
-        <template #icon>
-          <DatabaseOutlined />
-        </template>
-        <span>{{ item.disk_total }}</span>
-      </UsageProgressLine>
-    </div>
   </div>
 </template>
 
 <style scoped lang="less">
+.node-analytics-container {
+  display: flex;
+  justify-content: space-between;
+  width: 100%;
+  position: relative; // For absolute positioned button on mobile
+
+  @media (max-width: 768px) {
+    flex-direction: column;
+    gap: 16px;
+  }
+}
+
 .hardware-monitor {
   display: flex;
+  flex: 1;
 
   @media (max-width: 1000px) {
     display: block;
   }
 
+  @media (min-width: 768px) and (max-width: 1000px) {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 12px;
+  }
+
   .hardware-monitor-item {
     width: 140px;
     margin-right: 20px;
 
-    @media(min-width: 1800px) {
-      width: 300px;
-      margin-bottom: 10px;
+    @media(min-width: 2100px) {
+      width: 400px;
       margin-right: 50px;
     }
 
+    @media(min-width: 1800px) and (max-width: 2100px) {
+      width: 300px;
+      margin-right: 20px;
+    }
+
     @media(min-width: 1600px) and (max-width: 1800px) {
       width: 270px;
-      margin-bottom: 10px;
       margin-right: 20px;
     }
 
     @media(min-width: 1500px) and (max-width: 1600px) {
-      width: 230px;
-      margin-bottom: 10px;
+      width: 220px;
       margin-right: 30px;
     }
 
     @media(min-width: 1400px) and (max-width: 1500px) {
       width: 180px;
-      margin-bottom: 10px;
       margin-right: 25px;
     }
 
-    @media(min-width: 400px) and (max-width: 1000px) {
+    @media(min-width: 1000px) and (max-width: 1400px) {
+      width: 150px;
+      margin-right: 16px;
+    }
+
+    @media(min-width: 768px) and (max-width: 1000px) {
+      width: 140px;
+      margin-right: 16px;
+      margin-bottom: 12px;
+    }
+
+    @media(min-width: 400px) and (max-width: 768px) {
       width: 280px;
-      margin-bottom: 10px;
     }
 
     @media(max-width: 400px) {
       width: 200px;
-      margin-bottom: 10px;
     }
   }
 
@@ -141,25 +219,88 @@ defineProps<{
       width: 300px;
     }
   }
-  @media (min-width: 1400px) {
+  @media (min-width: 768px) and (max-width: 1000px) {
     .longer {
-      min-width: 300px;
+      width: 200px;
+      flex-shrink: 0;
+    }
+  }
+  @media (min-width: 1000px) and (max-width: 1100px) {
+    .longer {
+      min-width: 180px;
+      .load-avg-describe {
+        display: none;
+      }
     }
   }
-  @media (min-width: 1200px) {
+  @media (min-width: 1100px) and (max-width: 1200px) {
     .longer {
-      min-width: 270px;
+      min-width: 200px;
     }
   }
-  @media (min-width: 400px) and (max-width: 1000px) {
+  @media (min-width: 1200px) and (max-width: 1400px) {
     .longer {
-      min-width: 250px;
+      min-width: 240px;
     }
   }
-  @media (min-width: 1100px) and (max-width: 1200px) {
+  @media (min-width: 1400px) {
     .longer {
-      min-width: 200px;
+      min-width: 300px;
+    }
+  }
+  @media (min-width: 400px) and (max-width: 768px) {
+    .longer {
+      min-width: 250px;
+    }
+  }
+}
+
+.link-button-section {
+  display: flex;
+  align-items: center;
+  margin-left: 16px;
+  flex-shrink: 0;
+
+  .link-btn {
+    min-width: 80px;
+    height: 32px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    gap: 4px;
+
+    .link-btn-text {
+      display: inline;
+
+      @media (max-width: 480px) {
+        display: none;
+      }
+
+      @media(min-width: 1000px) and (max-width: 1400px) {
+        display: none;
+      }
     }
+
+    @media(min-width: 1000px) and (max-width: 1400px) {
+      min-width: 32px;
+      padding: 0 8px;
+    }
+
+    @media (max-width: 480px) {
+      min-width: 32px;
+      padding: 0 8px;
+    }
+  }
+
+  @media (min-width: 768px) and (max-width: 1000px) {
+    margin-left: 8px;
+    align-self: flex-start;
+    margin-top: 8px;
+  }
+
+  @media (max-width: 768px) {
+    margin-left: 0;
+    align-self: center;
   }
 }
 </style>

+ 2 - 2
internal/analytic/disk.go

@@ -68,8 +68,8 @@ func GetDiskStat() (DiskStat, error) {
 	}
 
 	return DiskStat{
-		Used:       humanize.Bytes(totalUsed),
-		Total:      humanize.Bytes(totalSize),
+		Used:       humanize.IBytes(totalUsed),
+		Total:      humanize.IBytes(totalSize),
 		Percentage: overallPercentage,
 		Writes:     DiskWriteRecord[len(DiskWriteRecord)-1],
 		Reads:      DiskReadRecord[len(DiskReadRecord)-1],