浏览代码

enhance: responsiveness in dashboard views

0xJacky 3 周之前
父节点
当前提交
93b81b52df

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

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

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

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

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

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

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

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

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

@@ -172,8 +172,8 @@ msgstr "Proporción real de trabajadores a configurados"
 msgid "Add"
 msgid "Add"
 msgstr "Agregar"
 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:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgid "Add a passkey"
 msgstr "Añadir una clave de acceso"
 msgstr "Añadir una clave de acceso"
 
 
@@ -225,7 +225,7 @@ msgstr "Adicional"
 msgid "Advance Mode"
 msgid "Advance Mode"
 msgstr "Modo avanzado"
 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."
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr ""
 msgstr ""
 "Después, actualice esta página y haga clic en agregar clave de acceso "
 "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"
 msgid "Batch Upgrade"
 msgstr "Actualización por lotes"
 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"
 msgid "Belows are selected items that you want to batch modify"
 msgstr ""
 msgstr ""
 "A continuación se muestran los elementos seleccionados que desea modificar "
 "A continuación se muestran los elementos seleccionados que desea modificar "
@@ -638,7 +638,7 @@ msgstr ""
 
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: 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/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: 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 "
 "Haga clic o arrastre el archivo de copia de seguridad a esta área para "
 "cargar"
 "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"
 msgid "Click or drag files to this area to upload"
 msgstr "Haz clic o arrastra archivos a esta área para subirlos"
 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"
 msgid "Click or drag folders to this area to upload"
 msgstr "Haz clic o arrastra carpetas a esta área para subir"
 msgstr "Haz clic o arrastra carpetas a esta área para subir"
 
 
@@ -1094,7 +1094,7 @@ msgstr "Configurar SSL"
 msgid "Confirm New Password"
 msgid "Confirm New Password"
 msgstr "Confirmar nueva contraseña"
 msgstr "Confirmar nueva contraseña"
 
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgid "Connected"
 msgstr "Conectado"
 msgstr "Conectado"
 
 
@@ -1623,7 +1623,7 @@ msgstr "Descargando la última versión"
 msgid "Dry run mode enabled"
 msgid "Dry run mode enabled"
 msgstr "Modo de ejecución de prueba habilitado"
 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 ""
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
 "non-HTTPS websites, except when running on localhost."
@@ -2304,7 +2304,7 @@ msgstr "carpeta"
 msgid "Folder"
 msgid "Folder"
 msgstr "Carpeta"
 msgstr "Carpeta"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
 "process."
@@ -2476,7 +2476,7 @@ msgid ""
 "option."
 "option."
 msgstr "Si desea revocar automáticamente el certificado antiguo, active esta opción."
 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."
 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."
 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/"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "Dejar en blanco para el valor predeterminado: 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"
 msgid "Leave blank if do not want to modify"
 msgstr "Dejar en blanco si no desea modificar"
 msgstr "Dejar en blanco si no desea modificar"
 
 
@@ -2747,10 +2747,10 @@ msgstr "Lego desactivar soporte CNAME"
 msgid "License"
 msgid "License"
 msgstr "Licencia"
 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
 #: src/language/curd.ts:23
 msgid "List"
 msgid "List"
@@ -2837,7 +2837,7 @@ msgstr ""
 msgid "Log List"
 msgid "Log List"
 msgstr "Lista de registros"
 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"
 msgid "Login"
 msgstr "Acceso"
 msgstr "Acceso"
 
 
@@ -3082,7 +3082,7 @@ msgstr "Directiva multilínea"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
 #: 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_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3110,14 +3110,6 @@ msgstr "Red"
 msgid "Network Statistics"
 msgid "Network Statistics"
 msgstr "Estadísticas de red"
 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
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgid "New dns challenge provider error: {0}"
 msgstr "Error en el nuevo proveedor de desafío DNS: {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"
 msgid "Nginx Configurations Directory"
 msgstr "Directorio de configuraciones de Nginx"
 msgstr "Directorio de configuraciones de Nginx"
 
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgid "Nginx Control"
 msgstr "Control de Nginx"
 msgstr "Control de Nginx"
 
 
@@ -3368,7 +3360,7 @@ msgstr "Nginx.conf incluye el directorio streams-enabled"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: 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/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3528,7 +3520,7 @@ msgstr "Documentación oficial"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
 #: 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
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgid "Offline"
 msgstr "Desconectado"
 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/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
 #: 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
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgid "Online"
 msgstr "En línea"
 msgstr "En línea"
@@ -3578,7 +3570,7 @@ msgstr "Abierto"
 msgid "OpenAI"
 msgid "OpenAI"
 msgstr "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"
 msgid "Or"
 msgstr "O"
 msgstr "O"
 
 
@@ -3652,7 +3644,7 @@ msgstr ""
 "dispositivo o un PIN. Se pueden utilizar como reemplazo de contraseña o "
 "dispositivo o un PIN. Se pueden utilizar como reemplazo de contraseña o "
 "como método de autenticación de dos factores."
 "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"
 msgid "Password"
 msgstr "Contraseña"
 msgstr "Contraseña"
 
 
@@ -3678,7 +3670,7 @@ msgstr "Las contraseñas no coinciden"
 
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
 #: 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 "
 "Por favor, active el módulo stub_status para obtener estadísticas de "
 "solicitudes, recuento de conexiones, etc."
 "solicitudes, recuento de conexiones, etc."
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
 "button below."
@@ -3940,7 +3932,7 @@ msgstr "Distribución de procesos"
 msgid "Process information"
 msgid "Process information"
 msgstr "Información del proceso"
 msgstr "Información del proceso"
 
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgid "Processing {count}/{total}"
 msgstr "Procesando {count}/{total}"
 msgstr "Procesando {count}/{total}"
 
 
@@ -4062,7 +4054,7 @@ msgstr "Fallo en el registro"
 msgid "Register On Startup"
 msgid "Register On Startup"
 msgstr "Registrar al inicio"
 msgstr "Registrar al inicio"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgid "Register passkey successfully"
 msgstr "Clave de acceso registrada con éxito"
 msgstr "Clave de acceso registrada con éxito"
 
 
@@ -4087,7 +4079,7 @@ msgid "Release Note"
 msgstr "Nota de versión"
 msgstr "Nota de versión"
 
 
 #: src/components/ChatGPT/ChatMessage.vue:222
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgid "Reload"
 msgstr "Recargar"
 msgstr "Recargar"
 
 
@@ -4123,7 +4115,7 @@ msgstr "Reinicio remoto de Nginx exitoso"
 msgid "Reload request failed, please check your network connection"
 msgid "Reload request failed, please check your network connection"
 msgstr "La solicitud de recarga falló, por favor verifique su conexión de red"
 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"
 msgid "Reloading"
 msgstr "Recargando"
 msgstr "Recargando"
 
 
@@ -4275,7 +4267,7 @@ msgstr ""
 msgid "Responses"
 msgid "Responses"
 msgstr "Respuestas"
 msgstr "Respuestas"
 
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgid "Restart"
 msgstr "Reiniciar"
 msgstr "Reiniciar"
 
 
@@ -4305,7 +4297,7 @@ msgstr "Reinicio remoto de Nginx exitoso"
 msgid "Restart request failed, please check your network connection"
 msgid "Restart request failed, please check your network connection"
 msgstr "La solicitud de reinicio falló, por favor verifique su conexión de red"
 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"
 msgid "Restarting"
 msgstr "Reiniciando"
 msgstr "Reiniciando"
 
 
@@ -4381,7 +4373,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgid "Run Mode"
 msgstr "Modo de ejecución"
 msgstr "Modo de ejecución"
 
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgid "Running"
 msgstr "Corriendo"
 msgstr "Corriendo"
 
 
@@ -4549,6 +4541,10 @@ msgstr "Error al guardar el flujo %{name} en %{node}"
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Flujo %{name} guardado en %{node} correctamente"
 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/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
 msgid "Save successfully"
@@ -4639,7 +4635,7 @@ msgstr "Seleccionar todo"
 msgid "Select an action after sync"
 msgid "Select an action after sync"
 msgstr "Seleccionar una acción después de sincronizar"
 msgstr "Seleccionar una acción después de sincronizar"
 
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgid "Selected {count} files"
 msgstr "Seleccionados {count} archivos"
 msgstr "Seleccionados {count} archivos"
 
 
@@ -4757,7 +4753,7 @@ msgstr "Zona de Memoria Compartida"
 msgid "Show"
 msgid "Show"
 msgstr "Mostrar"
 msgstr "Mostrar"
 
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgid "Sign in with a passkey"
 msgstr "Iniciar sesión con una llave de acceso"
 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"
 msgid "Sites-enabled directory not exist"
 msgstr "El directorio sites-enabled no existe"
 msgstr "El directorio sites-enabled no existe"
 
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgid "Size"
 msgstr "Tamaño"
 msgstr "Tamaño"
 
 
@@ -4870,7 +4866,7 @@ msgstr "Ruta de la clave SSL"
 msgid "SSL key path is required when HTTPS is enabled"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "Se requiere la ruta de la clave SSL cuando HTTPS está habilitado"
 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"
 msgid "SSO Login"
 msgstr "Acceso SSO"
 msgstr "Acceso SSO"
 
 
@@ -4905,7 +4901,7 @@ msgstr "Estático"
 msgid "Status"
 msgid "Status"
 msgstr "Estado"
 msgstr "Estado"
 
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgid "Stopped"
 msgstr "Detenido"
 msgstr "Detenido"
 
 
@@ -5009,11 +5005,11 @@ msgstr ""
 "consulte este enlace para escribir el archivo de configuración "
 "consulte este enlace para escribir el archivo de configuración "
 "correspondiente: https://nginxui.com/guide/nginx-proxy-example.html"
 "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"
 msgid "Support single or batch upload of files"
 msgstr "Soporta carga única o múltiple de archivos"
 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"
 msgid "Support uploading entire folders"
 msgstr "Soporta la carga de carpetas completas"
 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, "
 "El número de seguridad pública solo debe contener letras, unicode, números, "
 "guiones, rayas, dos puntos y puntos."
 "guiones, rayas, dos puntos y puntos."
 
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "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 "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5293,15 +5289,15 @@ msgstr ""
 msgid "This field is required"
 msgid "This field is required"
 msgstr "Este campo es obligatorio"
 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"
 msgid "This field should be a valid email address"
 msgstr "Este campo debe ser una dirección de correo electrónico válida"
 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"
 msgid "This field should be a valid hostname"
 msgstr "Este campo debe ser un nombre de host válido"
 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"
 msgid "This field should not be empty"
 msgstr "Este campo no debe estar vacío"
 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 -_."
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "Este campo solo debe contener letras, caracteres Unicode, números y -_."
 msgstr "Este campo solo debe contener letras, caracteres Unicode, números y -_."
 
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "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. "
 "Este token solo se mostrará una vez y no se podrá recuperar más tarde. "
 "Asegúrese de guardarlo en un lugar seguro."
 "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"
 msgid "This value is already taken"
 msgstr "Este valor ya está elegido"
 msgstr "Este valor ya está elegido"
 
 
@@ -5380,7 +5376,7 @@ msgstr "Acelerador"
 msgid "Thursday"
 msgid "Thursday"
 msgstr "Jueves"
 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/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgid "Tips"
@@ -5412,7 +5408,7 @@ msgstr ""
 "Para habilitarlo, necesitas instalar la aplicación Google Authenticator o "
 "Para habilitarlo, necesitas instalar la aplicación Google Authenticator o "
 "Microsoft Authenticator en tu teléfono móvil."
 "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 ""
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
 "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"
 msgid "Total Nginx Processes"
 msgstr "Total de procesos de Nginx"
 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/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
 msgid "Total requests"
@@ -5488,6 +5488,10 @@ msgstr "Solicitudes totales"
 msgid "Total Requests / Total Connections"
 msgid "Total Requests / Total Connections"
 msgstr "Solicitudes totales / Conexiones totales"
 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
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgid "TOTP"
 msgstr "TOTP"
 msgstr "TOTP"
@@ -5581,11 +5585,11 @@ msgstr "Actualización exitosa"
 msgid "Upgrading Nginx UI, please wait..."
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "Actualizando Nginx UI, por favor espere..."
 msgstr "Actualizando Nginx UI, por favor espere..."
 
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgid "Upload Files"
 msgstr "Subir archivos"
 msgstr "Subir archivos"
 
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgid "Upload Folders"
 msgstr "Subir carpetas"
 msgstr "Subir carpetas"
 
 
@@ -5637,7 +5641,7 @@ msgstr "Usuario no ha habilitado OTP como 2FA"
 msgid "User Profile"
 msgid "User Profile"
 msgstr "Perfil de usuario"
 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
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgid "Username"
 msgstr "Nombre de usuario"
 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/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgid "Warning"
 msgstr "Advertencia"
 msgstr "Advertencia"
 
 
@@ -5874,7 +5878,7 @@ msgstr "Puedes cerrar este diálogo en %{countdown} segundos"
 msgid "You can close this dialog now"
 msgid "You can close this dialog now"
 msgstr "Ahora puede cerrar este cuadro de diálogo"
 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 ""
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
 "passkey."
@@ -5910,6 +5914,9 @@ msgstr "Tus códigos antiguos ya no funcionarán."
 msgid "Your passkeys"
 msgid "Your passkeys"
 msgstr "Sus llaves de acceso"
 msgstr "Sus llaves de acceso"
 
 
+#~ msgid "Link Start"
+#~ msgstr "Iniciar conexión"
+
 #~ msgid "Enable failed"
 #~ msgid "Enable failed"
 #~ msgstr "Falló la habilitación"
 #~ 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"
 msgid "Add"
 msgstr "Ajouter"
 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:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgid "Add a passkey"
 msgstr "Ajouter une clé d'accès"
 msgstr "Ajouter une clé d'accès"
 
 
@@ -223,7 +223,7 @@ msgstr "Supplémentaire"
 msgid "Advance Mode"
 msgid "Advance Mode"
 msgstr "Mode avancé"
 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."
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr ""
 msgstr ""
 "Ensuite, rafraîchissez cette page et cliquez à nouveau sur ajouter une clé "
 "Ensuite, rafraîchissez cette page et cliquez à nouveau sur ajouter une clé "
@@ -563,7 +563,7 @@ msgstr "Modification par lot"
 msgid "Batch Upgrade"
 msgid "Batch Upgrade"
 msgstr "Mise à jour par lot"
 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"
 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"
 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/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: 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/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: 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 "
 "Cliquez sur ou faites glisser le fichier de sauvegarde vers cette zone pour "
 "télécharger"
 "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"
 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"
 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"
 msgid "Click or drag folders to this area to upload"
 msgstr "Cliquez ou faites glisser des dossiers dans cette zone pour télécharger"
 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"
 msgid "Confirm New Password"
 msgstr "Confirmer le nouveau mot de passe"
 msgstr "Confirmer le nouveau mot de passe"
 
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgid "Connected"
 msgstr "Connecté"
 msgstr "Connecté"
 
 
@@ -1617,7 +1617,7 @@ msgstr "Téléchargement de la dernière version"
 msgid "Dry run mode enabled"
 msgid "Dry run mode enabled"
 msgstr "Mode de simulation activé"
 msgstr "Mode de simulation activé"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
 "non-HTTPS websites, except when running on localhost."
@@ -2298,7 +2298,7 @@ msgstr "dossier"
 msgid "Folder"
 msgid "Folder"
 msgstr "Dossier"
 msgstr "Dossier"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
 "process."
@@ -2472,7 +2472,7 @@ msgstr ""
 "Si vous souhaitez révoquer automatiquement l'ancien certificat, veuillez "
 "Si vous souhaitez révoquer automatiquement l'ancien certificat, veuillez "
 "activer cette option."
 "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."
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr ""
 msgstr ""
 "Si votre navigateur prend en charge la clé d'accès WebAuthn, une boîte de "
 "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/"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "Laissez vide pour la valeur par défaut : 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"
 msgid "Leave blank if do not want to modify"
 msgstr "Laisser vide si vous ne souhaitez pas modifier"
 msgstr "Laisser vide si vous ne souhaitez pas modifier"
 
 
@@ -2745,10 +2745,10 @@ msgstr "Lego désactiver la prise en charge CNAME"
 msgid "License"
 msgid "License"
 msgstr "Licence"
 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
 #: src/language/curd.ts:23
 msgid "List"
 msgid "List"
@@ -2835,7 +2835,7 @@ msgstr ""
 msgid "Log List"
 msgid "Log List"
 msgstr "Liste des journaux"
 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"
 msgid "Login"
 msgstr "Connexion"
 msgstr "Connexion"
 
 
@@ -3080,7 +3080,7 @@ msgstr "Directive multiligne"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
 #: 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_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3108,14 +3108,6 @@ msgstr "Réseau"
 msgid "Network Statistics"
 msgid "Network Statistics"
 msgstr "Statistiques du réseau"
 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
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgid "New dns challenge provider error: {0}"
 msgstr "Erreur du nouveau fournisseur de défi DNS : {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"
 msgid "Nginx Configurations Directory"
 msgstr "Répertoire des configurations Nginx"
 msgstr "Répertoire des configurations Nginx"
 
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgid "Nginx Control"
 msgstr "Contrôle Nginx"
 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/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: 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/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3525,7 +3517,7 @@ msgstr "Documentation officielle"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
 #: 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
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgid "Offline"
 msgstr "Hors ligne"
 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/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
 #: 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
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgid "Online"
 msgstr "En ligne"
 msgstr "En ligne"
@@ -3575,7 +3567,7 @@ msgstr "Ouvert"
 msgid "OpenAI"
 msgid "OpenAI"
 msgstr "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"
 msgid "Or"
 msgstr "Ou"
 msgstr "Ou"
 
 
@@ -3649,7 +3641,7 @@ msgstr ""
 "ou un code PIN. Elles peuvent être utilisées comme remplacement d'un mot de "
 "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)."
 "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"
 msgid "Password"
 msgstr "Mot de passe"
 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:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: 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/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3745,7 +3737,7 @@ msgstr ""
 "Veuillez activer le module stub_status pour obtenir des statistiques de "
 "Veuillez activer le module stub_status pour obtenir des statistiques de "
 "requêtes, le nombre de connexions, etc."
 "requêtes, le nombre de connexions, etc."
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
 "button below."
@@ -3937,7 +3929,7 @@ msgstr "Répartition des processus"
 msgid "Process information"
 msgid "Process information"
 msgstr "Informations sur le processus"
 msgstr "Informations sur le processus"
 
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgid "Processing {count}/{total}"
 msgstr "Traitement en cours {count}/{total}"
 msgstr "Traitement en cours {count}/{total}"
 
 
@@ -4059,7 +4051,7 @@ msgstr "Échec de l'enregistrement"
 msgid "Register On Startup"
 msgid "Register On Startup"
 msgstr "Enregistrer au démarrage"
 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"
 msgid "Register passkey successfully"
 msgstr "Clé d'accès enregistrée avec succès"
 msgstr "Clé d'accès enregistrée avec succès"
 
 
@@ -4084,7 +4076,7 @@ msgid "Release Note"
 msgstr "Note de version"
 msgstr "Note de version"
 
 
 #: src/components/ChatGPT/ChatMessage.vue:222
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgid "Reload"
 msgstr "Recharger"
 msgstr "Recharger"
 
 
@@ -4122,7 +4114,7 @@ msgstr ""
 "La demande de rechargement a échoué, veuillez vérifier votre connexion "
 "La demande de rechargement a échoué, veuillez vérifier votre connexion "
 "réseau"
 "réseau"
 
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgid "Reloading"
 msgstr "Rechargement"
 msgstr "Rechargement"
 
 
@@ -4274,7 +4266,7 @@ msgstr ""
 msgid "Responses"
 msgid "Responses"
 msgstr "Réponses"
 msgstr "Réponses"
 
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgid "Restart"
 msgstr "Redémarrer"
 msgstr "Redémarrer"
 
 
@@ -4304,7 +4296,7 @@ msgstr "Redémarrage distant de Nginx réussi"
 msgid "Restart request failed, please check your network connection"
 msgid "Restart request failed, please check your network connection"
 msgstr "La demande de redémarrage a échoué, veuillez vérifier votre connexion réseau"
 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"
 msgid "Restarting"
 msgstr "Redémarrage"
 msgstr "Redémarrage"
 
 
@@ -4380,7 +4372,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgid "Run Mode"
 msgstr "Mode d'exécution"
 msgstr "Mode d'exécution"
 
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgid "Running"
 msgstr "En cours d'éxécution"
 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"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Flux %{name} enregistré sur %{node} avec succès"
 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/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
 msgid "Save successfully"
@@ -4638,7 +4634,7 @@ msgstr "Tout sélectionner"
 msgid "Select an action after sync"
 msgid "Select an action after sync"
 msgstr "Sélectionner une action après la synchronisation"
 msgstr "Sélectionner une action après la synchronisation"
 
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgid "Selected {count} files"
 msgstr "{count} fichiers sélectionnés"
 msgstr "{count} fichiers sélectionnés"
 
 
@@ -4756,7 +4752,7 @@ msgstr "Zone de Mémoire Partagée"
 msgid "Show"
 msgid "Show"
 msgstr "Afficher"
 msgstr "Afficher"
 
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgid "Sign in with a passkey"
 msgstr "Se connecter avec une clé d'accès"
 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"
 msgid "Sites-enabled directory not exist"
 msgstr "Le répertoire sites-enabled n'existe pas"
 msgstr "Le répertoire sites-enabled n'existe pas"
 
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgid "Size"
 msgstr "Taille"
 msgstr "Taille"
 
 
@@ -4869,7 +4865,7 @@ msgstr "Chemin de la clé SSL"
 msgid "SSL key path is required when HTTPS is enabled"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "Le chemin de la clé SSL est requis lorsque HTTPS est activé"
 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"
 msgid "SSO Login"
 msgstr "Connexion SSO"
 msgstr "Connexion SSO"
 
 
@@ -4904,7 +4900,7 @@ msgstr "Statique"
 msgid "Status"
 msgid "Status"
 msgstr "Statut"
 msgstr "Statut"
 
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgid "Stopped"
 msgstr "Arrêté"
 msgstr "Arrêté"
 
 
@@ -5008,11 +5004,11 @@ msgstr ""
 "Nginx, veuillez consulter ce lien pour écrire le fichier de configuration "
 "Nginx, veuillez consulter ce lien pour écrire le fichier de configuration "
 "correspondant : https://nginxui.com/guide/nginx-proxy-example.html"
 "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"
 msgid "Support single or batch upload of files"
 msgstr "Prise en charge du téléchargement unique ou en lot de fichiers"
 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"
 msgid "Support uploading entire folders"
 msgstr "Prend en charge le téléchargement de dossiers entiers"
 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, "
 "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."
 "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 ""
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "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 "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5295,15 +5291,15 @@ msgstr ""
 msgid "This field is required"
 msgid "This field is required"
 msgstr "Ce champ est obligatoire"
 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"
 msgid "This field should be a valid email address"
 msgstr "Ce champ doit être une adresse email valide"
 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"
 msgid "This field should be a valid hostname"
 msgstr "Ce champ doit être un nom d'hôte valide"
 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"
 msgid "This field should not be empty"
 msgstr "Ce champ ne doit pas être vide"
 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 "
 "Ce champ ne doit contenir que des lettres, des caractères Unicode, des "
 "chiffres et -_."
 "chiffres et -_."
 
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "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 "
 "ultérieurement. Veuillez vous assurer de le sauvegarder dans un endroit "
 "sécurisé."
 "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"
 msgid "This value is already taken"
 msgstr "Cette valeur est déjà utilisée"
 msgstr "Cette valeur est déjà utilisée"
 
 
@@ -5387,7 +5383,7 @@ msgstr "Limitation"
 msgid "Thursday"
 msgid "Thursday"
 msgstr "Jeudi"
 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/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgid "Tips"
@@ -5419,7 +5415,7 @@ msgstr ""
 "Pour l'activer, vous devez installer l'application Google Authenticator ou "
 "Pour l'activer, vous devez installer l'application Google Authenticator ou "
 "Microsoft Authenticator sur votre téléphone portable."
 "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 ""
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
 "Please manually configure the following in the app.ini configuration file "
@@ -5487,6 +5483,10 @@ msgstr "Total des processus Nginx"
 msgid "Total Nginx Processes"
 msgid "Total Nginx Processes"
 msgstr "Total des processus Nginx"
 msgstr "Total des processus Nginx"
 
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "Réception totale"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
 msgid "Total requests"
@@ -5496,6 +5496,10 @@ msgstr "Requêtes totales"
 msgid "Total Requests / Total Connections"
 msgid "Total Requests / Total Connections"
 msgstr "Requêtes totales / Connexions totales"
 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
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgid "TOTP"
 msgstr "TOTP"
 msgstr "TOTP"
@@ -5589,11 +5593,11 @@ msgstr "Mise à niveau réussie"
 msgid "Upgrading Nginx UI, please wait..."
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "Mise à jour de Nginx UI, veuillez patienter..."
 msgstr "Mise à jour de Nginx UI, veuillez patienter..."
 
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgid "Upload Files"
 msgstr "Téléverser des fichiers"
 msgstr "Téléverser des fichiers"
 
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgid "Upload Folders"
 msgstr "Télécharger des dossiers"
 msgstr "Télécharger des dossiers"
 
 
@@ -5645,7 +5649,7 @@ msgstr "L'utilisateur n'a pas activé l'OTP comme 2FA"
 msgid "User Profile"
 msgid "User Profile"
 msgstr "Profil utilisateur"
 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
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgid "Username"
 msgstr "Nom d'utilisateur"
 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/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgid "Warning"
 msgstr "Avertissement"
 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"
 msgid "You can close this dialog now"
 msgstr "Vous pouvez maintenant fermer cette boîte de dialogue"
 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 ""
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
 "passkey."
@@ -5921,6 +5925,9 @@ msgstr "Vos anciens codes ne fonctionneront plus."
 msgid "Your passkeys"
 msgid "Your passkeys"
 msgstr "Vos clés d'accès"
 msgstr "Vos clés d'accès"
 
 
+#~ msgid "Link Start"
+#~ msgstr "Démarrer la liaison"
+
 #~ msgid "Enable failed"
 #~ msgid "Enable failed"
 #~ msgstr "Échec de l'activation"
 #~ msgstr "Échec de l'activation"
 
 

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

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

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

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

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

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

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

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

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

@@ -170,8 +170,8 @@ msgstr "Фактическое соотношение рабочих к наст
 msgid "Add"
 msgid "Add"
 msgstr "Добавить"
 msgstr "Добавить"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgid "Add a passkey"
 msgstr "Добавить ключ доступа"
 msgstr "Добавить ключ доступа"
 
 
@@ -223,7 +223,7 @@ msgstr "Дополнительно"
 msgid "Advance Mode"
 msgid "Advance Mode"
 msgstr "Расширенный режим"
 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."
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr "После этого обновите эту страницу и снова нажмите «Добавить ключ доступа»."
 msgstr "После этого обновите эту страницу и снова нажмите «Добавить ключ доступа»."
 
 
@@ -561,7 +561,7 @@ msgstr "Массовое изменение"
 msgid "Batch Upgrade"
 msgid "Batch Upgrade"
 msgstr "Пакетное обновление"
 msgstr "Пакетное обновление"
 
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgid "Belows are selected items that you want to batch modify"
 msgstr "Ниже приведены выбранные элементы, которые вы хотите изменить"
 msgstr "Ниже приведены выбранные элементы, которые вы хотите изменить"
 
 
@@ -632,7 +632,7 @@ msgstr ""
 
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: 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/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: 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"
 msgid "Click or drag files to this area to upload"
 msgstr "Нажмите или перетащите файлы в эту область для загрузки"
 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"
 msgid "Click or drag folders to this area to upload"
 msgstr "Нажмите или перетащите папки в эту область для загрузки"
 msgstr "Нажмите или перетащите папки в эту область для загрузки"
 
 
@@ -1086,7 +1086,7 @@ msgstr "Настроить SSL"
 msgid "Confirm New Password"
 msgid "Confirm New Password"
 msgstr "Подтвердите новый пароль"
 msgstr "Подтвердите новый пароль"
 
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgid "Connected"
 msgstr "Подключено"
 msgstr "Подключено"
 
 
@@ -1609,7 +1609,7 @@ msgstr "Загрузка последней версии"
 msgid "Dry run mode enabled"
 msgid "Dry run mode enabled"
 msgstr "Включен пробный режим"
 msgstr "Включен пробный режим"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
 "non-HTTPS websites, except when running on localhost."
@@ -2288,7 +2288,7 @@ msgstr "папка"
 msgid "Folder"
 msgid "Folder"
 msgstr "Папка"
 msgstr "Папка"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
 "process."
@@ -2460,7 +2460,7 @@ msgid ""
 "option."
 "option."
 msgstr "Если вы хотите автоматически отозвать старый сертификат, включите эту опцию."
 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."
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr "Если ваш браузер поддерживает WebAuthn Passkey, появится диалоговое окно."
 msgstr "Если ваш браузер поддерживает WebAuthn Passkey, появится диалоговое окно."
 
 
@@ -2706,7 +2706,7 @@ msgstr "Оставьте пустым без изменений"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "Оставьте пустым для значения по умолчанию: 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"
 msgid "Leave blank if do not want to modify"
 msgstr "Оставьте пустым, если не хотите изменять"
 msgstr "Оставьте пустым, если не хотите изменять"
 
 
@@ -2731,10 +2731,10 @@ msgstr "Lego отключить поддержку CNAME"
 msgid "License"
 msgid "License"
 msgstr "Лицензия"
 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
 #: src/language/curd.ts:23
 msgid "List"
 msgid "List"
@@ -2821,7 +2821,7 @@ msgstr ""
 msgid "Log List"
 msgid "Log List"
 msgstr "Список журналов"
 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"
 msgid "Login"
 msgstr "Логин"
 msgstr "Логин"
 
 
@@ -3065,7 +3065,7 @@ msgstr "Многострочная директива"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
 #: 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_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3093,14 +3093,6 @@ msgstr "Сеть"
 msgid "Network Statistics"
 msgid "Network Statistics"
 msgstr "Статистика сети"
 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
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgid "New dns challenge provider error: {0}"
 msgstr "Ошибка нового поставщика DNS-проверки: {0}"
 msgstr "Ошибка нового поставщика DNS-проверки: {0}"
@@ -3210,7 +3202,7 @@ msgstr "Путь к конфигурации Nginx"
 msgid "Nginx Configurations Directory"
 msgid "Nginx Configurations Directory"
 msgstr "Каталог конфигураций Nginx"
 msgstr "Каталог конфигураций Nginx"
 
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgid "Nginx Control"
 msgstr "Управление Nginx"
 msgstr "Управление Nginx"
 
 
@@ -3351,7 +3343,7 @@ msgstr "Nginx.conf включает каталог streams-enabled"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: 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/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3510,7 +3502,7 @@ msgstr "Официальная документация"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
 #: 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
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgid "Offline"
 msgstr "Оффлайн"
 msgstr "Оффлайн"
@@ -3543,7 +3535,7 @@ msgstr "После завершения проверки записи будут
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
 #: 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
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgid "Online"
 msgstr "Онлайн"
 msgstr "Онлайн"
@@ -3560,7 +3552,7 @@ msgstr "Открыт"
 msgid "OpenAI"
 msgid "OpenAI"
 msgstr "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"
 msgid "Or"
 msgstr "Или"
 msgstr "Или"
 
 
@@ -3634,7 +3626,7 @@ msgstr ""
 "могут использоваться вместо пароля или в качестве метода двухфакторной "
 "могут использоваться вместо пароля или в качестве метода двухфакторной "
 "аутентификации (2FA)."
 "аутентификации (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"
 msgid "Password"
 msgstr "Пароль"
 msgstr "Пароль"
 
 
@@ -3660,7 +3652,7 @@ msgstr "Пароли не совпадают"
 
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3728,7 +3720,7 @@ msgstr ""
 "Пожалуйста, включите модуль stub_status, чтобы получать статистику "
 "Пожалуйста, включите модуль stub_status, чтобы получать статистику "
 "запросов, количество соединений и т. д."
 "запросов, количество соединений и т. д."
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
 "button below."
@@ -3922,7 +3914,7 @@ msgstr "Распределение процессов"
 msgid "Process information"
 msgid "Process information"
 msgstr "Информация о процессе"
 msgstr "Информация о процессе"
 
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgid "Processing {count}/{total}"
 msgstr "Обработка {count}/{total}"
 msgstr "Обработка {count}/{total}"
 
 
@@ -4043,7 +4035,7 @@ msgstr "Регистрация не удалась"
 msgid "Register On Startup"
 msgid "Register On Startup"
 msgstr "Регистрация при запуске"
 msgstr "Регистрация при запуске"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgid "Register passkey successfully"
 msgstr "Ключ доступа успешно зарегистрирован"
 msgstr "Ключ доступа успешно зарегистрирован"
 
 
@@ -4068,7 +4060,7 @@ msgid "Release Note"
 msgstr "Что нового"
 msgstr "Что нового"
 
 
 #: src/components/ChatGPT/ChatMessage.vue:222
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgid "Reload"
 msgstr "Перегрузить"
 msgstr "Перегрузить"
 
 
@@ -4104,7 +4096,7 @@ msgstr "Удаленная перезагрузка Nginx успешно вып
 msgid "Reload request failed, please check your network connection"
 msgid "Reload request failed, please check your network connection"
 msgstr "Не удалось выполнить запрос на перезагрузку, проверьте подключение к сети"
 msgstr "Не удалось выполнить запрос на перезагрузку, проверьте подключение к сети"
 
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgid "Reloading"
 msgstr "Перезагружается"
 msgstr "Перезагружается"
 
 
@@ -4256,7 +4248,7 @@ msgstr ""
 msgid "Responses"
 msgid "Responses"
 msgstr "Ответы"
 msgstr "Ответы"
 
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgid "Restart"
 msgstr "Перезапуск"
 msgstr "Перезапуск"
 
 
@@ -4286,7 +4278,7 @@ msgstr "Удалённая перезагрузка Nginx успешно вып
 msgid "Restart request failed, please check your network connection"
 msgid "Restart request failed, please check your network connection"
 msgstr "Запрос на перезапуск не выполнен, проверьте подключение к сети"
 msgstr "Запрос на перезапуск не выполнен, проверьте подключение к сети"
 
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgid "Restarting"
 msgstr "Перезапускается"
 msgstr "Перезапускается"
 
 
@@ -4362,7 +4354,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgid "Run Mode"
 msgstr "Режим работы"
 msgstr "Режим работы"
 
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgid "Running"
 msgstr "Выполняется"
 msgstr "Выполняется"
 
 
@@ -4530,6 +4522,10 @@ msgstr "Не удалось сохранить поток %{name} на %{node}"
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Поток %{name} успешно сохранён на %{node}"
 msgstr "Поток %{name} успешно сохранён на %{node}"
 
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr "Сохранено успешно"
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
 msgid "Save successfully"
@@ -4620,7 +4616,7 @@ msgstr "Выбрать все"
 msgid "Select an action after sync"
 msgid "Select an action after sync"
 msgstr "Выберите действие после синхронизации"
 msgstr "Выберите действие после синхронизации"
 
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgid "Selected {count} files"
 msgstr "Выбрано {count} файлов"
 msgstr "Выбрано {count} файлов"
 
 
@@ -4734,7 +4730,7 @@ msgstr "Зона общей памяти"
 msgid "Show"
 msgid "Show"
 msgstr "Показать"
 msgstr "Показать"
 
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgid "Sign in with a passkey"
 msgstr "Войти с помощью ключа доступа"
 msgstr "Войти с помощью ключа доступа"
 
 
@@ -4778,7 +4774,7 @@ msgstr "Каталог sites-available не существует"
 msgid "Sites-enabled directory not exist"
 msgid "Sites-enabled directory not exist"
 msgstr "Каталог sites-enabled не существует"
 msgstr "Каталог sites-enabled не существует"
 
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgid "Size"
 msgstr "Размер"
 msgstr "Размер"
 
 
@@ -4843,7 +4839,7 @@ msgstr "Путь к SSL-ключу"
 msgid "SSL key path is required when HTTPS is enabled"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "Путь к SSL-ключу обязателен при включении HTTPS"
 msgstr "Путь к SSL-ключу обязателен при включении HTTPS"
 
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgid "SSO Login"
 msgstr "SSO Вход"
 msgstr "SSO Вход"
 
 
@@ -4878,7 +4874,7 @@ msgstr "Статический"
 msgid "Status"
 msgid "Status"
 msgstr "Статус"
 msgstr "Статус"
 
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgid "Stopped"
 msgstr "Остановлен"
 msgstr "Остановлен"
 
 
@@ -4981,11 +4977,11 @@ msgstr ""
 "написать соответствующий конфигурационный файл: "
 "написать соответствующий конфигурационный файл: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 "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"
 msgid "Support single or batch upload of files"
 msgstr "Поддержка одиночной или пакетной загрузки файлов"
 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"
 msgid "Support uploading entire folders"
 msgstr "Поддержка загрузки целых папок"
 msgstr "Поддержка загрузки целых папок"
 
 
@@ -5195,7 +5191,7 @@ msgstr ""
 "Номер общественной безопасности должен содержать только буквы, юникод, "
 "Номер общественной безопасности должен содержать только буквы, юникод, "
 "цифры, дефисы, тире, двоеточия и точки."
 "цифры, дефисы, тире, двоеточия и точки."
 
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "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 "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5263,15 +5259,15 @@ msgstr "Этот каталог защищен и не может быть уд
 msgid "This field is required"
 msgid "This field is required"
 msgstr "Это поле обязательно для заполнения"
 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"
 msgid "This field should be a valid email address"
 msgstr "Это поле должно содержать действительный адрес электронной почты"
 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"
 msgid "This field should be a valid hostname"
 msgstr "Это поле должно содержать допустимое имя хоста"
 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"
 msgid "This field should not be empty"
 msgstr "Это поле обязательно к заполнению"
 msgstr "Это поле обязательно к заполнению"
 
 
@@ -5279,7 +5275,7 @@ msgstr "Это поле обязательно к заполнению"
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "Это поле должно содержать только буквы, символы Юникода, цифры и -_."
 msgstr "Это поле должно содержать только буквы, символы Юникода, цифры и -_."
 
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "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"
 msgid "This value is already taken"
 msgstr "Это значение уже занято"
 msgstr "Это значение уже занято"
 
 
@@ -5350,7 +5346,7 @@ msgstr "Ограничение"
 msgid "Thursday"
 msgid "Thursday"
 msgstr "Четверг"
 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/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgid "Tips"
@@ -5380,7 +5376,7 @@ msgstr ""
 "Чтобы включить это, вам нужно установить приложение Google или Microsoft "
 "Чтобы включить это, вам нужно установить приложение Google или Microsoft "
 "Authenticator на свой мобильный телефон."
 "Authenticator на свой мобильный телефон."
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
 "Please manually configure the following in the app.ini configuration file "
@@ -5447,6 +5443,10 @@ msgstr "Всего процессов Nginx"
 msgid "Total Nginx Processes"
 msgid "Total Nginx Processes"
 msgstr "Общее количество процессов Nginx"
 msgstr "Общее количество процессов Nginx"
 
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "Всего получено"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
 msgid "Total requests"
@@ -5456,6 +5456,10 @@ msgstr "Всего запросов"
 msgid "Total Requests / Total Connections"
 msgid "Total Requests / Total Connections"
 msgstr "Всего запросов / Всего соединений"
 msgstr "Всего запросов / Всего соединений"
 
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr "Всего отправлено"
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgid "TOTP"
 msgstr "TOTP"
 msgstr "TOTP"
@@ -5549,11 +5553,11 @@ msgstr "Обновлено успешно"
 msgid "Upgrading Nginx UI, please wait..."
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "Обновление Nginx UI, подождите..."
 msgstr "Обновление Nginx UI, подождите..."
 
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgid "Upload Files"
 msgstr "Загрузить файлы"
 msgstr "Загрузить файлы"
 
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgid "Upload Folders"
 msgstr "Загрузить папки"
 msgstr "Загрузить папки"
 
 
@@ -5605,7 +5609,7 @@ msgstr "Пользователь не включил OTP в качестве 2FA
 msgid "User Profile"
 msgid "User Profile"
 msgstr "Профиль пользователя"
 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
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgid "Username"
 msgstr "Имя пользователя"
 msgstr "Имя пользователя"
@@ -5671,7 +5675,7 @@ msgstr "Процессы ожидания"
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgid "Warning"
 msgstr "Внимание"
 msgstr "Внимание"
 
 
@@ -5840,7 +5844,7 @@ msgstr "Вы можете закрыть это окно через %{countdown}
 msgid "You can close this dialog now"
 msgid "You can close this dialog now"
 msgstr "Теперь вы можете закрыть это диалоговое окно"
 msgstr "Теперь вы можете закрыть это диалоговое окно"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
 "passkey."
@@ -5874,6 +5878,9 @@ msgstr "Ваши старые коды больше не будут работа
 msgid "Your passkeys"
 msgid "Your passkeys"
 msgstr "Ваши ключи доступа"
 msgstr "Ваши ключи доступа"
 
 
+#~ msgid "Link Start"
+#~ msgstr "Начало ссылки"
+
 #~ msgid "Enable failed"
 #~ msgid "Enable failed"
 #~ msgstr "Не удалось включить"
 #~ 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"
 msgid "Add"
 msgstr "Ekle"
 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:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgid "Add a passkey"
 msgstr "Bir geçiş anahtarı ekle"
 msgstr "Bir geçiş anahtarı ekle"
 
 
@@ -219,7 +219,7 @@ msgstr "İlave bilgi"
 msgid "Advance Mode"
 msgid "Advance Mode"
 msgstr "Gelişmiş Mod"
 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."
 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."
 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"
 msgid "Batch Upgrade"
 msgstr "Toplu Yükseltme"
 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"
 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"
 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/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: 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/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: 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"
 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"
 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"
 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"
 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"
 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"
 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"
 msgid "Confirm New Password"
 msgstr "Yeni Şifreyi Onayla"
 msgstr "Yeni Şifreyi Onayla"
 
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgid "Connected"
 msgstr "Bağlandı"
 msgstr "Bağlandı"
 
 
@@ -1601,7 +1601,7 @@ msgstr "En son sürüm indiriliyor"
 msgid "Dry run mode enabled"
 msgid "Dry run mode enabled"
 msgstr "Deneme modu etkinleştirildi(Dry-run)"
 msgstr "Deneme modu etkinleştirildi(Dry-run)"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
 "non-HTTPS websites, except when running on localhost."
@@ -2278,7 +2278,7 @@ msgstr "klasör"
 msgid "Folder"
 msgid "Folder"
 msgstr "Klasör"
 msgstr "Klasör"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
 "process."
@@ -2452,7 +2452,7 @@ msgstr ""
 "Eski sertifikayı otomatik olarak iptal etmek istiyorsanız, bu seçeneği "
 "Eski sertifikayı otomatik olarak iptal etmek istiyorsanız, bu seçeneği "
 "etkinleştirin."
 "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."
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr ""
 msgstr ""
 "Tarayıcınız WebAuthn Passkey'i destekliyorsa, bir iletişim kutusu "
 "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/"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "Varsayılan için boş bırakın: 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"
 msgid "Leave blank if do not want to modify"
 msgstr "Değiştirmek istemiyorsanız boş bırakın"
 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"
 msgid "License"
 msgstr "Lisans"
 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
 #: src/language/curd.ts:23
 msgid "List"
 msgid "List"
@@ -2814,7 +2814,7 @@ msgstr ""
 msgid "Log List"
 msgid "Log List"
 msgstr "Günlük Listesi"
 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"
 msgid "Login"
 msgstr "Giriş"
 msgstr "Giriş"
 
 
@@ -3058,7 +3058,7 @@ msgstr "Çok Satırlı Yönergeler"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
 #: 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_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3086,14 +3086,6 @@ msgstr "Ağ"
 msgid "Network Statistics"
 msgid "Network Statistics"
 msgstr "Ağ İstatistikleri"
 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
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgid "New dns challenge provider error: {0}"
 msgstr "Yeni DNS sorgulama sağlayıcı hatası: {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"
 msgid "Nginx Configurations Directory"
 msgstr "Nginx Yapılandırma Dizini"
 msgstr "Nginx Yapılandırma Dizini"
 
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgid "Nginx Control"
 msgstr "Nginx Kontrolü"
 msgstr "Nginx Kontrolü"
 
 
@@ -3344,7 +3336,7 @@ msgstr "Nginx.conf, streams-enabled dizinini içerir"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: 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/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3503,7 +3495,7 @@ msgstr "Resmi Belge"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
 #: 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
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgid "Offline"
 msgstr "Çevrimdışı"
 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/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
 #: 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
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgid "Online"
 msgstr "Çevrimiçi"
 msgstr "Çevrimiçi"
@@ -3553,7 +3545,7 @@ msgstr "Açık"
 msgid "OpenAI"
 msgid "OpenAI"
 msgstr "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"
 msgid "Or"
 msgstr "Veya"
 msgstr "Veya"
 
 
@@ -3626,7 +3618,7 @@ msgstr ""
 "kimliğinizi doğrulayan WebAuthn kimlik bilgileridir. Bir şifre yerine veya "
 "kimliğinizi doğrulayan WebAuthn kimlik bilgileridir. Bir şifre yerine veya "
 "iki faktörlü kimlik doğrulama (2FA) yöntemi olarak kullanılabilirler."
 "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"
 msgid "Password"
 msgstr "Şifre"
 msgstr "Şifre"
 
 
@@ -3652,7 +3644,7 @@ msgstr "Şifreler eşleşmiyor"
 
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
 #: 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 "
 "İstek istatistikleri, bağlantı sayısı vb. bilgileri almak için lütfen "
 "stub_status modülünü etkinleştirin."
 "stub_status modülünü etkinleştirin."
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
 "button below."
@@ -3910,7 +3902,7 @@ msgstr "Süreç Dağılımı"
 msgid "Process information"
 msgid "Process information"
 msgstr "Süreç bilgisi"
 msgstr "Süreç bilgisi"
 
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgid "Processing {count}/{total}"
 msgstr "İşleniyor {count}/{total}"
 msgstr "İşleniyor {count}/{total}"
 
 
@@ -4030,7 +4022,7 @@ msgstr "Kayıt başarısız"
 msgid "Register On Startup"
 msgid "Register On Startup"
 msgstr "Başlangıçta Kayıt Ol"
 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"
 msgid "Register passkey successfully"
 msgstr "Geçiş anahtarı başarıyla kaydedildi"
 msgstr "Geçiş anahtarı başarıyla kaydedildi"
 
 
@@ -4055,7 +4047,7 @@ msgid "Release Note"
 msgstr "Sürüm Notları"
 msgstr "Sürüm Notları"
 
 
 #: src/components/ChatGPT/ChatMessage.vue:222
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgid "Reload"
 msgstr "Yeniden Yükle"
 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"
 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"
 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"
 msgid "Reloading"
 msgstr "Yeniden Yükleniyor"
 msgstr "Yeniden Yükleniyor"
 
 
@@ -4252,7 +4244,7 @@ msgstr ""
 msgid "Responses"
 msgid "Responses"
 msgstr "Yanıtlar"
 msgstr "Yanıtlar"
 
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgid "Restart"
 msgstr "Yeniden Başlat"
 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"
 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"
 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"
 msgid "Restarting"
 msgstr "Yeniden Başlatılıyor"
 msgstr "Yeniden Başlatılıyor"
 
 
@@ -4358,7 +4350,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgid "Run Mode"
 msgstr "Çalışma Modu"
 msgstr "Çalışma Modu"
 
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgid "Running"
 msgstr "Koşma"
 msgstr "Koşma"
 
 
@@ -4526,6 +4518,10 @@ msgstr "Akış %{name}, %{node} üzerine kaydedilemedi"
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Akış %{name}, %{node} üzerine başarıyla kaydedildi"
 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/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
 msgid "Save successfully"
@@ -4614,7 +4610,7 @@ msgstr "Tümünü seç"
 msgid "Select an action after sync"
 msgid "Select an action after sync"
 msgstr "Senkronizasyon sonrası eylem seçin"
 msgstr "Senkronizasyon sonrası eylem seçin"
 
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgid "Selected {count} files"
 msgstr "Seçilen {count} dosya"
 msgstr "Seçilen {count} dosya"
 
 
@@ -4730,7 +4726,7 @@ msgstr "Paylaşılan Bellek Bölgesi"
 msgid "Show"
 msgid "Show"
 msgstr "Göster"
 msgstr "Göster"
 
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgid "Sign in with a passkey"
 msgstr "Bir anahtarla oturum aç"
 msgstr "Bir anahtarla oturum aç"
 
 
@@ -4774,7 +4770,7 @@ msgstr "Sites-available dizini mevcut değil"
 msgid "Sites-enabled directory not exist"
 msgid "Sites-enabled directory not exist"
 msgstr "Sites-enabled dizini mevcut değil"
 msgstr "Sites-enabled dizini mevcut değil"
 
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgid "Size"
 msgstr "Boyut"
 msgstr "Boyut"
 
 
@@ -4839,7 +4835,7 @@ msgstr "SSL Anahtar Yolu"
 msgid "SSL key path is required when HTTPS is enabled"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "HTTPS etkinleştirildiğinde SSL anahtar yolu gereklidir"
 msgstr "HTTPS etkinleştirildiğinde SSL anahtar yolu gereklidir"
 
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgid "SSO Login"
 msgstr "SSO Girişi"
 msgstr "SSO Girişi"
 
 
@@ -4874,7 +4870,7 @@ msgstr "Statik"
 msgid "Status"
 msgid "Status"
 msgstr "Durum"
 msgstr "Durum"
 
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgid "Stopped"
 msgstr "Durduruldu"
 msgstr "Durduruldu"
 
 
@@ -4977,11 +4973,11 @@ msgstr ""
 "dosyasını yazmak için bu bağlantıya bakın: "
 "dosyasını yazmak için bu bağlantıya bakın: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 "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"
 msgid "Support single or batch upload of files"
 msgstr "Tek veya toplu dosya yüklemeyi destekler"
 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"
 msgid "Support uploading entire folders"
 msgstr "Tüm klasörlerin yüklenmesini destekler"
 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, "
 "Kamu Güvenlik Numarası yalnızca harfler, unicode, sayılar, kısa çizgiler, "
 "uzun çizgiler, iki nokta üst üste ve noktalar içermelidir."
 "uzun çizgiler, iki nokta üst üste ve noktalar içermelidir."
 
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "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 "
 "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"
 msgid "This field is required"
 msgstr "Bu alan zorunludur"
 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"
 msgid "This field should be a valid email address"
 msgstr "Bu alan geçerli bir e-posta adresi olmalıdır"
 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"
 msgid "This field should be a valid hostname"
 msgstr "Bu alan geçerli bir ana bilgisayar adı olmalıdır"
 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"
 msgid "This field should not be empty"
 msgstr "Bu alan boş bırakılamaz"
 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 -_."
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "Bu alan yalnızca harfler, Unicode karakterler, sayılar ve -_ içermelidir."
 msgstr "Bu alan yalnızca harfler, Unicode karakterler, sayılar ve -_ içermelidir."
 
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "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. "
 "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."
 "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"
 msgid "This value is already taken"
 msgstr "Bu değer zaten alınmış"
 msgstr "Bu değer zaten alınmış"
 
 
@@ -5347,7 +5343,7 @@ msgstr "Kısıtlama"
 msgid "Thursday"
 msgid "Thursday"
 msgstr "Perşembe"
 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/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgid "Tips"
@@ -5377,7 +5373,7 @@ msgstr ""
 "Etkinleştirmek için telefonunuza Google Authenticator veya Microsoft "
 "Etkinleştirmek için telefonunuza Google Authenticator veya Microsoft "
 "Authenticator uygulamasını yüklemeniz gerekir."
 "Authenticator uygulamasını yüklemeniz gerekir."
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
 "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"
 msgid "Total Nginx Processes"
 msgstr "Toplam Nginx Süreçleri"
 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/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
 msgid "Total requests"
@@ -5453,6 +5453,10 @@ msgstr "Toplam istekler"
 msgid "Total Requests / Total Connections"
 msgid "Total Requests / Total Connections"
 msgstr "Toplam İstekler / Toplam Bağlantılar"
 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
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgid "TOTP"
 msgstr "TOTP"
 msgstr "TOTP"
@@ -5546,11 +5550,11 @@ msgstr "Başarıyla yükseltildi"
 msgid "Upgrading Nginx UI, please wait..."
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "Nginx UI güncelleniyor, lütfen bekleyin..."
 msgstr "Nginx UI güncelleniyor, lütfen bekleyin..."
 
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgid "Upload Files"
 msgstr "Dosyaları Yükle"
 msgstr "Dosyaları Yükle"
 
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgid "Upload Folders"
 msgstr "Klasörleri Yükle"
 msgstr "Klasörleri Yükle"
 
 
@@ -5602,7 +5606,7 @@ msgstr "Kullanıcı OTP'yi 2FA olarak etkinleştirmedi"
 msgid "User Profile"
 msgid "User Profile"
 msgstr "Kullanıcı Profili"
 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
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgid "Username"
 msgstr "Kullanıcı Adı"
 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/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgid "Warning"
 msgstr "Uyarı"
 msgstr "Uyarı"
 
 
@@ -5838,7 +5842,7 @@ msgstr "Bu iletişim kutusunu %{countdown} saniye içinde kapatabilirsiniz"
 msgid "You can close this dialog now"
 msgid "You can close this dialog now"
 msgstr "Şimdi bu iletişim kutusunu kapatabilirsiniz"
 msgstr "Şimdi bu iletişim kutusunu kapatabilirsiniz"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
 "passkey."
@@ -5873,6 +5877,9 @@ msgstr "Eski kodlarınız artık çalışmayacak."
 msgid "Your passkeys"
 msgid "Your passkeys"
 msgstr "Geçiş Anahtarlarınız"
 msgstr "Geçiş Anahtarlarınız"
 
 
+#~ msgid "Link Start"
+#~ msgstr "Bağlantı Başlat"
+
 #~ msgid "Enable failed"
 #~ msgid "Enable failed"
 #~ msgstr "Etkinleştirme başarısız"
 #~ msgstr "Etkinleştirme başarısız"
 
 

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

@@ -170,8 +170,8 @@ msgstr "Фактичне співвідношення робочих до нал
 msgid "Add"
 msgid "Add"
 msgstr "Додати"
 msgstr "Додати"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgid "Add a passkey"
 msgstr "Додати ключ доступу"
 msgstr "Додати ключ доступу"
 
 
@@ -223,7 +223,7 @@ msgstr "Додатково"
 msgid "Advance Mode"
 msgid "Advance Mode"
 msgstr "Розширений режим"
 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."
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr "Після цього оновіть цю сторінку та натисніть «Додати ключ доступу» знову."
 msgstr "Після цього оновіть цю сторінку та натисніть «Додати ключ доступу» знову."
 
 
@@ -559,7 +559,7 @@ msgstr "Масове редагування"
 msgid "Batch Upgrade"
 msgid "Batch Upgrade"
 msgstr "Групове оновлення"
 msgstr "Групове оновлення"
 
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgid "Belows are selected items that you want to batch modify"
 msgstr "Нижче наведені елементи, які ви обрали для групового редагування"
 msgstr "Нижче наведені елементи, які ви обрали для групового редагування"
 
 
@@ -629,7 +629,7 @@ msgstr ""
 
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: 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/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: 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"
 msgid "Click or drag files to this area to upload"
 msgstr "Натисніть або перетягніть файли в цю область для завантаження"
 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"
 msgid "Click or drag folders to this area to upload"
 msgstr "Натисніть або перетягніть папки в цю область для завантаження"
 msgstr "Натисніть або перетягніть папки в цю область для завантаження"
 
 
@@ -1080,7 +1080,7 @@ msgstr "Налаштувати SSL"
 msgid "Confirm New Password"
 msgid "Confirm New Password"
 msgstr "Підтвердити новий пароль"
 msgstr "Підтвердити новий пароль"
 
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgid "Connected"
 msgstr "Підключено"
 msgstr "Підключено"
 
 
@@ -1675,7 +1675,7 @@ msgstr "Завантаження останнього релізу"
 msgid "Dry run mode enabled"
 msgid "Dry run mode enabled"
 msgstr "Увімкнено тестовий режим"
 msgstr "Увімкнено тестовий режим"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
 "non-HTTPS websites, except when running on localhost."
@@ -2354,7 +2354,7 @@ msgstr "папка"
 msgid "Folder"
 msgid "Folder"
 msgstr "Папка"
 msgstr "Папка"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
 "process."
@@ -2526,7 +2526,7 @@ msgid ""
 "option."
 "option."
 msgstr "Якщо ви хочете автоматично відкликати старий сертифікат, увімкніть цю опцію."
 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."
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr "Якщо ваш браузер підтримує WebAuthn Passkey, з’явиться діалогове вікно."
 msgstr "Якщо ваш браузер підтримує WebAuthn Passkey, з’явиться діалогове вікно."
 
 
@@ -2772,7 +2772,7 @@ msgstr "Залиште порожнім, щоб не змінювати"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "Залиште порожнім для значення за замовчуванням: 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"
 msgid "Leave blank if do not want to modify"
 msgstr "Залиште порожнім, якщо не хочете змінювати"
 msgstr "Залиште порожнім, якщо не хочете змінювати"
 
 
@@ -2797,10 +2797,10 @@ msgstr "Lego вимкнути підтримку CNAME"
 msgid "License"
 msgid "License"
 msgstr "Ліцензія"
 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
 #: src/language/curd.ts:23
 msgid "List"
 msgid "List"
@@ -2887,7 +2887,7 @@ msgstr ""
 msgid "Log List"
 msgid "Log List"
 msgstr "Список журналів"
 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"
 msgid "Login"
 msgstr "Увійти"
 msgstr "Увійти"
 
 
@@ -3131,7 +3131,7 @@ msgstr "Багаторядкова директива"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
 #: 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_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3159,14 +3159,6 @@ msgstr "Мережа"
 msgid "Network Statistics"
 msgid "Network Statistics"
 msgstr "Мережева статистика"
 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
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgid "New dns challenge provider error: {0}"
 msgstr "Помилка нового постачальника DNS-виклику: {0}"
 msgstr "Помилка нового постачальника DNS-виклику: {0}"
@@ -3276,7 +3268,7 @@ msgstr "Шлях до конфігурації Nginx"
 msgid "Nginx Configurations Directory"
 msgid "Nginx Configurations Directory"
 msgstr "Каталог конфігурацій Nginx"
 msgstr "Каталог конфігурацій Nginx"
 
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgid "Nginx Control"
 msgstr "Керування Nginx"
 msgstr "Керування Nginx"
 
 
@@ -3417,7 +3409,7 @@ msgstr "Nginx.conf включає каталог streams-enabled"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: 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/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3576,7 +3568,7 @@ msgstr "Офіційна документація"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
 #: 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
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgid "Offline"
 msgstr "Офлайн"
 msgstr "Офлайн"
@@ -3609,7 +3601,7 @@ msgstr "Після завершення перевірки записи буду
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
 #: 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
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgid "Online"
 msgstr "Онлайн"
 msgstr "Онлайн"
@@ -3626,7 +3618,7 @@ msgstr "Відкрито"
 msgid "OpenAI"
 msgid "OpenAI"
 msgstr "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"
 msgid "Or"
 msgstr "Або"
 msgstr "Або"
 
 
@@ -3700,7 +3692,7 @@ msgstr ""
 "можуть використовуватися замість пароля або як метод двофакторної "
 "можуть використовуватися замість пароля або як метод двофакторної "
 "аутентифікації (2FA)."
 "аутентифікації (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"
 msgid "Password"
 msgstr "Пароль"
 msgstr "Пароль"
 
 
@@ -3726,7 +3718,7 @@ msgstr "Паролі не збігаються"
 
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3794,7 +3786,7 @@ msgstr ""
 "Будь ласка, увімкніть модуль stub_status, щоб отримати статистику запитів, "
 "Будь ласка, увімкніть модуль stub_status, щоб отримати статистику запитів, "
 "кількість з’єднань тощо."
 "кількість з’єднань тощо."
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
 "button below."
@@ -3984,7 +3976,7 @@ msgstr "Розподіл процесів"
 msgid "Process information"
 msgid "Process information"
 msgstr "Інформація про процес"
 msgstr "Інформація про процес"
 
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgid "Processing {count}/{total}"
 msgstr "Обробка {count}/{total}"
 msgstr "Обробка {count}/{total}"
 
 
@@ -4106,7 +4098,7 @@ msgstr "Не вдалося зареєструвати"
 msgid "Register On Startup"
 msgid "Register On Startup"
 msgstr "Реєстрація при запуску"
 msgstr "Реєстрація при запуску"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgid "Register passkey successfully"
 msgstr "Ключ доступу успішно зареєстровано"
 msgstr "Ключ доступу успішно зареєстровано"
 
 
@@ -4131,7 +4123,7 @@ msgid "Release Note"
 msgstr "Примітки до версії"
 msgstr "Примітки до версії"
 
 
 #: src/components/ChatGPT/ChatMessage.vue:222
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgid "Reload"
 msgstr "Перезавантажити"
 msgstr "Перезавантажити"
 
 
@@ -4169,7 +4161,7 @@ msgstr ""
 "Не вдалося виконати запит на перезавантаження, будь ласка, перевірте "
 "Не вдалося виконати запит на перезавантаження, будь ласка, перевірте "
 "підключення до мережі"
 "підключення до мережі"
 
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgid "Reloading"
 msgstr "Перезавантаження"
 msgstr "Перезавантаження"
 
 
@@ -4321,7 +4313,7 @@ msgstr ""
 msgid "Responses"
 msgid "Responses"
 msgstr "Відповіді"
 msgstr "Відповіді"
 
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgid "Restart"
 msgstr "Перезавантажити"
 msgstr "Перезавантажити"
 
 
@@ -4353,7 +4345,7 @@ msgstr ""
 "Не вдалося виконати запит на перезавантаження, будь ласка, перевірте "
 "Не вдалося виконати запит на перезавантаження, будь ласка, перевірте "
 "підключення до мережі"
 "підключення до мережі"
 
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgid "Restarting"
 msgstr "Перезапуск"
 msgstr "Перезапуск"
 
 
@@ -4429,7 +4421,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgid "Run Mode"
 msgstr "Режим роботи"
 msgstr "Режим роботи"
 
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgid "Running"
 msgstr "Біг"
 msgstr "Біг"
 
 
@@ -4597,6 +4589,10 @@ msgstr "Не вдалося зберегти потік %{name} на %{node}"
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Потік %{name} успішно збережено на %{node}"
 msgstr "Потік %{name} успішно збережено на %{node}"
 
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr "Успішно збережено"
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
 msgid "Save successfully"
@@ -4687,7 +4683,7 @@ msgstr "Вибрати все"
 msgid "Select an action after sync"
 msgid "Select an action after sync"
 msgstr "Виберіть дію після синхронізації"
 msgstr "Виберіть дію після синхронізації"
 
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgid "Selected {count} files"
 msgstr "Вибрано {count} файлів"
 msgstr "Вибрано {count} файлів"
 
 
@@ -4805,7 +4801,7 @@ msgstr "Зона спільної пам'яті"
 msgid "Show"
 msgid "Show"
 msgstr "Показати"
 msgstr "Показати"
 
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgid "Sign in with a passkey"
 msgstr "Увійти за допомогою ключа доступу"
 msgstr "Увійти за допомогою ключа доступу"
 
 
@@ -4849,7 +4845,7 @@ msgstr "Каталог Sites-available не існує"
 msgid "Sites-enabled directory not exist"
 msgid "Sites-enabled directory not exist"
 msgstr "Каталог sites-enabled не існує"
 msgstr "Каталог sites-enabled не існує"
 
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgid "Size"
 msgstr "Розмір"
 msgstr "Розмір"
 
 
@@ -4914,7 +4910,7 @@ msgstr "Шлях до SSL-ключа"
 msgid "SSL key path is required when HTTPS is enabled"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "Шлях до SSL-ключа обов’язковий при ввімкненні HTTPS"
 msgstr "Шлях до SSL-ключа обов’язковий при ввімкненні HTTPS"
 
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgid "SSO Login"
 msgstr "Вхід через SSO"
 msgstr "Вхід через SSO"
 
 
@@ -4949,7 +4945,7 @@ msgstr "Статичний"
 msgid "Status"
 msgid "Status"
 msgstr "Статус"
 msgstr "Статус"
 
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgid "Stopped"
 msgstr "Зупинено"
 msgstr "Зупинено"
 
 
@@ -5052,11 +5048,11 @@ msgstr ""
 "щоб написати відповідний конфігураційний файл: "
 "щоб написати відповідний конфігураційний файл: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 "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"
 msgid "Support single or batch upload of files"
 msgstr "Підтримка одиночного або пакетного завантаження файлів"
 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"
 msgid "Support uploading entire folders"
 msgstr "Підтримка завантаження цілих папок"
 msgstr "Підтримка завантаження цілих папок"
 
 
@@ -5266,7 +5262,7 @@ msgstr ""
 "Номер громадської безпеки повинен містити лише літери, unicode, цифри, "
 "Номер громадської безпеки повинен містити лише літери, unicode, цифри, "
 "дефіси, тире, двокрапки та крапки."
 "дефіси, тире, двокрапки та крапки."
 
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "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 "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5336,15 +5332,15 @@ msgstr "Цей каталог захищений і не може бути ви
 msgid "This field is required"
 msgid "This field is required"
 msgstr "Це поле обов'язкове"
 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"
 msgid "This field should be a valid email address"
 msgstr "Це поле має містити дійсну електронну адресу"
 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"
 msgid "This field should be a valid hostname"
 msgstr "Це поле має містити дійсну назву хоста"
 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"
 msgid "This field should not be empty"
 msgstr "Це поле не повинно бути порожнім"
 msgstr "Це поле не повинно бути порожнім"
 
 
@@ -5352,7 +5348,7 @@ msgstr "Це поле не повинно бути порожнім"
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "Це поле має містити лише літери, символи Unicode, цифри та -_."
 msgstr "Це поле має містити лише літери, символи Unicode, цифри та -_."
 
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "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"
 msgid "This value is already taken"
 msgstr "Це значення вже використовується"
 msgstr "Це значення вже використовується"
 
 
@@ -5420,7 +5416,7 @@ msgstr "Обмеження"
 msgid "Thursday"
 msgid "Thursday"
 msgstr "Четвер"
 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/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgid "Tips"
@@ -5450,7 +5446,7 @@ msgstr ""
 "Щоб увімкнути його, вам потрібно встановити додаток Google Authenticator "
 "Щоб увімкнути його, вам потрібно встановити додаток Google Authenticator "
 "або Microsoft Authenticator на свій мобільний телефон."
 "або Microsoft Authenticator на свій мобільний телефон."
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
 "Please manually configure the following in the app.ini configuration file "
@@ -5517,6 +5513,10 @@ msgstr "Загальна кількість процесів Nginx"
 msgid "Total Nginx Processes"
 msgid "Total Nginx Processes"
 msgstr "Загальна кількість процесів Nginx"
 msgstr "Загальна кількість процесів Nginx"
 
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "Загальний прийом"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
 msgid "Total requests"
@@ -5526,6 +5526,10 @@ msgstr "Загальна кількість запитів"
 msgid "Total Requests / Total Connections"
 msgid "Total Requests / Total Connections"
 msgstr "Загальна кількість запитів / Загальна кількість з’єднань"
 msgstr "Загальна кількість запитів / Загальна кількість з’єднань"
 
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr "Всього відправлено"
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgid "TOTP"
 msgstr "TOTP"
 msgstr "TOTP"
@@ -5619,11 +5623,11 @@ msgstr "Успішно оновлено"
 msgid "Upgrading Nginx UI, please wait..."
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "Оновлення Nginx UI, зачекайте..."
 msgstr "Оновлення Nginx UI, зачекайте..."
 
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgid "Upload Files"
 msgstr "Завантажити файли"
 msgstr "Завантажити файли"
 
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgid "Upload Folders"
 msgstr "Завантажити папки"
 msgstr "Завантажити папки"
 
 
@@ -5675,7 +5679,7 @@ msgstr "Користувач не увімкнув OTP як 2FA"
 msgid "User Profile"
 msgid "User Profile"
 msgstr "Профіль користувача"
 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
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgid "Username"
 msgstr "Ім’я користувача"
 msgstr "Ім’я користувача"
@@ -5741,7 +5745,7 @@ msgstr "Процеси очікування"
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgid "Warning"
 msgstr "Попередження"
 msgstr "Попередження"
 
 
@@ -5910,7 +5914,7 @@ msgstr "Ви можете закрити це вікно через %{countdown}
 msgid "You can close this dialog now"
 msgid "You can close this dialog now"
 msgstr "Тепер ви можете закрити це діалогове вікно"
 msgstr "Тепер ви можете закрити це діалогове вікно"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
 "passkey."
@@ -5943,6 +5947,9 @@ msgstr "Ваші старі коди більше не працюватимут
 msgid "Your passkeys"
 msgid "Your passkeys"
 msgstr "Ваші ключі доступу"
 msgstr "Ваші ключі доступу"
 
 
+#~ msgid "Link Start"
+#~ msgstr "Почати зв’язок"
+
 #~ msgid "Enable failed"
 #~ msgid "Enable failed"
 #~ msgstr "Не вдалося увімкнути"
 #~ 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"
 msgid "Add"
 msgstr "Thêm"
 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:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgid "Add a passkey"
 msgstr "Thêm khóa truy cập"
 msgstr "Thêm khóa truy cập"
 
 
@@ -214,7 +214,7 @@ msgstr "Bổ sung"
 msgid "Advance Mode"
 msgid "Advance Mode"
 msgstr "Nâng cao"
 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."
 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."
 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"
 msgid "Batch Upgrade"
 msgstr "Nâng cấp hàng loạt"
 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"
 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"
 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/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: 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/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: 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"
 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"
 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"
 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"
 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"
 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"
 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"
 msgid "Confirm New Password"
 msgstr "Xác nhận mật khẩu mới"
 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"
 msgid "Connected"
 msgstr "Đã kết nối"
 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"
 msgid "Dry run mode enabled"
 msgstr "Đã bật chế độ Dry run"
 msgstr "Đã bật chế độ Dry run"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
 "non-HTTPS websites, except when running on localhost."
@@ -2255,7 +2255,7 @@ msgstr "thư mục"
 msgid "Folder"
 msgid "Folder"
 msgstr "Thư mục"
 msgstr "Thư mục"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
 "process."
@@ -2426,7 +2426,7 @@ msgid ""
 "option."
 "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."
 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."
 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."
 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/"
 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/"
 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"
 msgid "Leave blank if do not want to modify"
 msgstr "Để trống nếu không muốn thay đổi"
 msgstr "Để trống nếu không muốn thay đổi"
 
 
@@ -2697,10 +2697,10 @@ msgstr "Lego tắt hỗ trợ CNAME"
 msgid "License"
 msgid "License"
 msgstr "Giấy phép"
 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
 #: src/language/curd.ts:23
 msgid "List"
 msgid "List"
@@ -2787,7 +2787,7 @@ msgstr ""
 msgid "Log List"
 msgid "Log List"
 msgstr "Danh sách nhật ký"
 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"
 msgid "Login"
 msgstr "Đăng nhập"
 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/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
 #: 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_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3059,14 +3059,6 @@ msgstr "Mạng"
 msgid "Network Statistics"
 msgid "Network Statistics"
 msgstr "Thống kê mạng"
 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
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgid "New dns challenge provider error: {0}"
 msgstr "Lỗi nhà cung cấp thử thách DNS mới: {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"
 msgid "Nginx Configurations Directory"
 msgstr "Thư mục cấu hình Nginx"
 msgstr "Thư mục cấu hình Nginx"
 
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgid "Nginx Control"
 msgstr "Điều khiển Nginx"
 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/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: 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/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
 #: 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/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
 #: 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
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgid "Offline"
 msgstr "Ngoại tuyến"
 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/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
 #: 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
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgid "Online"
 msgstr "Trực tuyến"
 msgstr "Trực tuyến"
@@ -3524,7 +3516,7 @@ msgstr "Mở"
 msgid "OpenAI"
 msgid "OpenAI"
 msgstr "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"
 msgid "Or"
 msgstr "Hoặc"
 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 "
 "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)."
 "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"
 msgid "Password"
 msgstr "Mật khẩu"
 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:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: 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/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
 #: 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, "
 "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."
 "v.v."
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
 "button below."
@@ -3873,7 +3865,7 @@ msgstr "Phân bổ quy trình"
 msgid "Process information"
 msgid "Process information"
 msgstr "Thông tin tiến trình"
 msgstr "Thông tin tiến trình"
 
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgid "Processing {count}/{total}"
 msgstr "Đang xử lý {count}/{total}"
 msgstr "Đang xử lý {count}/{total}"
 
 
@@ -3993,7 +3985,7 @@ msgstr "Đăng ký thất bại"
 msgid "Register On Startup"
 msgid "Register On Startup"
 msgstr "Đăng ký khi khởi động"
 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"
 msgid "Register passkey successfully"
 msgstr "Đăng ký khóa truy cập thành công"
 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"
 msgstr "Ghi chú phát hành"
 
 
 #: src/components/ChatGPT/ChatMessage.vue:222
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgid "Reload"
 msgstr "Tải lại"
 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"
 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"
 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"
 msgid "Reloading"
 msgstr "Đang tải lại"
 msgstr "Đang tải lại"
 
 
@@ -4206,7 +4198,7 @@ msgstr ""
 msgid "Responses"
 msgid "Responses"
 msgstr "Phản hồi"
 msgstr "Phản hồi"
 
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgid "Restart"
 msgstr "Khởi động lại"
 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"
 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"
 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"
 msgid "Restarting"
 msgstr "Đang khởi động lại"
 msgstr "Đang khởi động lại"
 
 
@@ -4312,7 +4304,7 @@ msgstr "RPID"
 msgid "Run Mode"
 msgid "Run Mode"
 msgstr "Chế độ chạy"
 msgstr "Chế độ chạy"
 
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgid "Running"
 msgstr "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"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Đã lưu luồng %{name} vào %{node} thành công"
 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/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
 msgid "Save successfully"
@@ -4568,7 +4564,7 @@ msgstr "Chọn tất cả"
 msgid "Select an action after sync"
 msgid "Select an action after sync"
 msgstr "Chọn hành động sau khi đồng bộ"
 msgstr "Chọn hành động sau khi đồng bộ"
 
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgid "Selected {count} files"
 msgstr "Đã chọn {count} tệp"
 msgstr "Đã chọn {count} tệp"
 
 
@@ -4682,7 +4678,7 @@ msgstr "Vùng Bộ Nhớ Chia Sẻ"
 msgid "Show"
 msgid "Show"
 msgstr "Hiển thị"
 msgstr "Hiển thị"
 
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgid "Sign in with a passkey"
 msgstr "Đăng nhập bằng khóa truy cập"
 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"
 msgid "Sites-enabled directory not exist"
 msgstr "Thư mục sites-enabled không tồn tại"
 msgstr "Thư mục sites-enabled không tồn tại"
 
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgid "Size"
 msgstr "Kích thước"
 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"
 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"
 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"
 msgid "SSO Login"
 msgstr "Đăng nhập SSO"
 msgstr "Đăng nhập SSO"
 
 
@@ -4826,7 +4822,7 @@ msgstr "Tĩnh"
 msgid "Status"
 msgid "Status"
 msgstr "Trạng thái"
 msgstr "Trạng thái"
 
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgid "Stopped"
 msgstr "Đã dừng"
 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: "
 "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"
 "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"
 msgid "Support single or batch upload of files"
 msgstr "Hỗ trợ tải lên một hoặc nhiều tệp"
 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"
 msgid "Support uploading entire folders"
 msgstr "Hỗ trợ tải lên toàn bộ thư mục"
 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 "
 "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."
 "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 ""
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "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 "
 "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"
 msgid "This field is required"
 msgstr "Trường này là bắt buộc"
 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"
 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ệ"
 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"
 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ệ"
 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"
 msgid "This field should not be empty"
 msgstr "Trường này không được để trống"
 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 -_."
 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à -_."
 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 ""
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "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 "
 "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."
 "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"
 msgid "This value is already taken"
 msgstr "Giá trị này đã được sử dụng"
 msgstr "Giá trị này đã được sử dụng"
 
 
@@ -5297,7 +5293,7 @@ msgstr "Hạn chế"
 msgid "Thursday"
 msgid "Thursday"
 msgstr "Thứ Năm"
 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/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 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 "
 "Để 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."
 "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 ""
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
 "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"
 msgid "Total Nginx Processes"
 msgstr "Tổng số tiến trình Nginx"
 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/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
 msgid "Total requests"
@@ -5403,6 +5403,10 @@ msgstr "Tổng số yêu cầu"
 msgid "Total Requests / Total Connections"
 msgid "Total Requests / Total Connections"
 msgstr "Tổng số yêu cầu / Tổng số kết nối"
 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
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgid "TOTP"
 msgstr "TOTP"
 msgstr "TOTP"
@@ -5496,11 +5500,11 @@ msgstr "Nâng cấp thành công"
 msgid "Upgrading Nginx UI, please wait..."
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "Đang cập nhật Nginx UI, vui lòng đợi..."
 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"
 msgid "Upload Files"
 msgstr "Tải lên tệp"
 msgstr "Tải lên tệp"
 
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgid "Upload Folders"
 msgstr "Tải lên thư mục"
 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"
 msgid "User Profile"
 msgstr "Hồ sơ người dùng"
 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
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgid "Username"
 msgstr "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/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgid "Warning"
 msgstr "Lưu ý"
 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"
 msgid "You can close this dialog now"
 msgstr "Bạn có thể đóng hộp thoại này ngay bây giờ"
 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 ""
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
 "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"
 msgid "Your passkeys"
 msgstr "Khóa truy cập của bạn"
 msgstr "Khóa truy cập của bạn"
 
 
+#~ msgid "Link Start"
+#~ msgstr "Liên kết bắt đầu"
+
 #~ msgid "Enable failed"
 #~ msgid "Enable failed"
 #~ msgstr "Bật không thành công"
 #~ 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"
 msgid "Add"
 msgstr "添加"
 msgstr "添加"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:45
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:49
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:53
 msgid "Add a passkey"
 msgid "Add a passkey"
 msgstr "添加通行密钥"
 msgstr "添加通行密钥"
 
 
@@ -218,7 +218,7 @@ msgstr "额外选项"
 msgid "Advance Mode"
 msgid "Advance Mode"
 msgstr "高级模式"
 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."
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr "之后,请刷新此页面并再次点击添加通行密钥。"
 msgstr "之后,请刷新此页面并再次点击添加通行密钥。"
 
 
@@ -540,7 +540,7 @@ msgstr "批量修改"
 msgid "Batch Upgrade"
 msgid "Batch Upgrade"
 msgstr "批量升级"
 msgstr "批量升级"
 
 
-#: src/language/curd.ts:36
+#: src/language/curd.ts:38
 msgid "Belows are selected items that you want to batch modify"
 msgid "Belows are selected items that you want to batch modify"
 msgstr "以下是您选定的需要批量修改的项目"
 msgstr "以下是您选定的需要批量修改的项目"
 
 
@@ -607,7 +607,7 @@ msgstr "基于 worker_processes * worker_connections 计算得出。实际性能
 
 
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/ChatGPT/ChatMessage.vue:216
 #: src/components/NgxConfigEditor/NgxServer.vue:61
 #: 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/config/components/Delete.vue:98
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
 #: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/components/SiteStatusSelect.vue:124
@@ -903,11 +903,11 @@ msgstr "清除成功"
 msgid "Click or drag backup file to this area to upload"
 msgid "Click or drag backup file to this area to upload"
 msgstr "单击或拖动备份文件到此区域上传"
 msgstr "单击或拖动备份文件到此区域上传"
 
 
-#: src/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"
 msgid "Click or drag files to this area to upload"
 msgstr "点击或拖拽文件到此处上传"
 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"
 msgid "Click or drag folders to this area to upload"
 msgstr "点击或拖拽文件夹到此处上传"
 msgstr "点击或拖拽文件夹到此处上传"
 
 
@@ -1039,7 +1039,7 @@ msgstr "配置 SSL"
 msgid "Confirm New Password"
 msgid "Confirm New Password"
 msgstr "确认新密码"
 msgstr "确认新密码"
 
 
-#: src/views/dashboard/Environments.vue:133
+#: src/views/dashboard/components/NodeAnalyticItem.vue:99
 msgid "Connected"
 msgid "Connected"
 msgstr "已连接"
 msgstr "已连接"
 
 
@@ -1557,7 +1557,7 @@ msgstr "下载最新版本"
 msgid "Dry run mode enabled"
 msgid "Dry run mode enabled"
 msgstr "试运行模式已启动"
 msgstr "试运行模式已启动"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:101
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:106
 msgid ""
 msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
 "non-HTTPS websites, except when running on localhost."
@@ -2229,7 +2229,7 @@ msgstr "文件夹"
 msgid "Folder"
 msgid "Folder"
 msgstr "文件夹"
 msgstr "文件夹"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:71
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid ""
 msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
 "process."
@@ -2396,7 +2396,7 @@ msgid ""
 "option."
 "option."
 msgstr "如果要自动撤销旧证书,请启用此选项。"
 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."
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr "如果您的浏览器支持 WebAuthn Passkey,则会出现一个对话框。"
 msgstr "如果您的浏览器支持 WebAuthn Passkey,则会出现一个对话框。"
 
 
@@ -2634,7 +2634,7 @@ msgstr "留空表示不修改"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgid "Leave blank for the default: https://api.openai.com/"
 msgstr "留空为默认: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"
 msgid "Leave blank if do not want to modify"
 msgstr "如果不想修改,请留空"
 msgstr "如果不想修改,请留空"
 
 
@@ -2659,10 +2659,10 @@ msgstr "Lego 禁用 CNAME 支持"
 msgid "License"
 msgid "License"
 msgstr "开源许可"
 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
 #: src/language/curd.ts:23
 msgid "List"
 msgid "List"
@@ -2747,7 +2747,7 @@ msgstr ""
 msgid "Log List"
 msgid "Log List"
 msgstr "日志列表"
 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"
 msgid "Login"
 msgstr "登录"
 msgstr "登录"
 
 
@@ -2986,7 +2986,7 @@ msgstr "多行指令"
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/group/columns.ts:7
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/environments/list/envColumns.tsx:8
 #: src/views/nginx_log/NginxLogList.vue:51
 #: 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_edit/components/RightPanel/Basic.vue:35
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/columns.tsx:29
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
@@ -3014,14 +3014,6 @@ msgstr "网络"
 msgid "Network Statistics"
 msgid "Network Statistics"
 msgstr "流量统计"
 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
 #: src/constants/errors/cert.ts:15
 msgid "New dns challenge provider error: {0}"
 msgid "New dns challenge provider error: {0}"
 msgstr "新建DNS验证提供程序错误:{0}"
 msgstr "新建DNS验证提供程序错误:{0}"
@@ -3131,7 +3123,7 @@ msgstr "Nginx 配置路径"
 msgid "Nginx Configurations Directory"
 msgid "Nginx Configurations Directory"
 msgstr "Nginx 配置目录"
 msgstr "Nginx 配置目录"
 
 
-#: src/components/NginxControl/NginxControl.vue:64
+#: src/components/NginxControl/NginxControl.vue:68
 msgid "Nginx Control"
 msgid "Nginx Control"
 msgstr "控制 Nginx"
 msgstr "控制 Nginx"
 
 
@@ -3270,7 +3262,7 @@ msgstr "检查 nginx.conf 是否包含 streams-enabled 的目录"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:169
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:99
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: 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/notification/Notification.vue:38
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
 #: src/views/preference/tabs/CertSettings.vue:73
@@ -3423,7 +3415,7 @@ msgstr "官方文档"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NgxConfigEditor/NgxUpstream.vue:151
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/NodeSelector/NodeSelector.vue:107
 #: src/components/ProxyTargets/ProxyTargets.vue:29
 #: 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
 #: src/views/environments/list/envColumns.tsx:55
 msgid "Offline"
 msgid "Offline"
 msgstr "离线"
 msgstr "离线"
@@ -3456,7 +3448,7 @@ msgstr "一旦验证完成,这些记录将被删除。"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:185
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:101
 #: src/components/NodeSelector/NodeSelector.vue:87
 #: 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
 #: src/views/environments/list/envColumns.tsx:51
 msgid "Online"
 msgid "Online"
 msgstr "在线"
 msgstr "在线"
@@ -3473,7 +3465,7 @@ msgstr "开放"
 msgid "OpenAI"
 msgid "OpenAI"
 msgstr "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"
 msgid "Or"
 msgstr "或"
 msgstr "或"
 
 
@@ -3543,7 +3535,7 @@ msgid ""
 "password replacement or as a 2FA method."
 "password replacement or as a 2FA method."
 msgstr "Passkey 是一种网络认证凭据,可通过指纹、面部识别、设备密码或 PIN 码验证身份。它们可用作密码替代品或二步验证方法。"
 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"
 msgid "Password"
 msgstr "密码"
 msgstr "密码"
 
 
@@ -3569,7 +3561,7 @@ msgstr "密码不匹配"
 
 
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
-#: src/language/curd.ts:59
+#: src/language/curd.ts:61
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/ConfigRightPanel/Basic.vue:41
 #: src/views/config/components/Delete.vue:124
 #: src/views/config/components/Delete.vue:124
 #: src/views/nginx_log/NginxLogList.vue:59
 #: src/views/nginx_log/NginxLogList.vue:59
@@ -3635,7 +3627,7 @@ msgid ""
 "count, etc."
 "count, etc."
 msgstr "请启用 stub_status 模块,以获取请求统计信息、连接数等。"
 msgstr "请启用 stub_status 模块,以获取请求统计信息、连接数等。"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:69
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:74
 msgid ""
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
 "button below."
@@ -3810,7 +3802,7 @@ msgstr "进程分布"
 msgid "Process information"
 msgid "Process information"
 msgstr "进程信息"
 msgstr "进程信息"
 
 
-#: src/language/curd.ts:58
+#: src/language/curd.ts:60
 msgid "Processing {count}/{total}"
 msgid "Processing {count}/{total}"
 msgstr "处理中 {count}/{total}"
 msgstr "处理中 {count}/{total}"
 
 
@@ -3924,7 +3916,7 @@ msgstr "注册失败"
 msgid "Register On Startup"
 msgid "Register On Startup"
 msgstr "启动时注册"
 msgstr "启动时注册"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:25
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:26
 msgid "Register passkey successfully"
 msgid "Register passkey successfully"
 msgstr "Passkey 注册成功"
 msgstr "Passkey 注册成功"
 
 
@@ -3949,7 +3941,7 @@ msgid "Release Note"
 msgstr "发行日志"
 msgstr "发行日志"
 
 
 #: src/components/ChatGPT/ChatMessage.vue:222
 #: src/components/ChatGPT/ChatMessage.vue:222
-#: src/components/NginxControl/NginxControl.vue:99
+#: src/components/NginxControl/NginxControl.vue:103
 msgid "Reload"
 msgid "Reload"
 msgstr "重载"
 msgstr "重载"
 
 
@@ -3985,7 +3977,7 @@ msgstr "重载远程 Nginx 成功"
 msgid "Reload request failed, please check your network connection"
 msgid "Reload request failed, please check your network connection"
 msgstr "重载请求失败,请检查网络连接"
 msgstr "重载请求失败,请检查网络连接"
 
 
-#: src/components/NginxControl/NginxControl.vue:73
+#: src/components/NginxControl/NginxControl.vue:77
 msgid "Reloading"
 msgid "Reloading"
 msgstr "重载中"
 msgstr "重载中"
 
 
@@ -4134,7 +4126,7 @@ msgstr "驻留集大小:实际驻留在物理内存中的内存,包括所有
 msgid "Responses"
 msgid "Responses"
 msgstr "响应"
 msgstr "响应"
 
 
-#: src/components/NginxControl/NginxControl.vue:92
+#: src/components/NginxControl/NginxControl.vue:96
 msgid "Restart"
 msgid "Restart"
 msgstr "重启"
 msgstr "重启"
 
 
@@ -4164,7 +4156,7 @@ msgstr "重启远程 Nginx 成功"
 msgid "Restart request failed, please check your network connection"
 msgid "Restart request failed, please check your network connection"
 msgstr "重启请求失败,请检查网络连接"
 msgstr "重启请求失败,请检查网络连接"
 
 
-#: src/components/NginxControl/NginxControl.vue:78
+#: src/components/NginxControl/NginxControl.vue:82
 msgid "Restarting"
 msgid "Restarting"
 msgstr "重启中"
 msgstr "重启中"
 
 
@@ -4238,7 +4230,7 @@ msgstr "依赖方 ID"
 msgid "Run Mode"
 msgid "Run Mode"
 msgstr "运行模式"
 msgstr "运行模式"
 
 
-#: src/components/NginxControl/NginxControl.vue:68
+#: src/components/NginxControl/NginxControl.vue:72
 msgid "Running"
 msgid "Running"
 msgstr "运行中"
 msgstr "运行中"
 
 
@@ -4406,6 +4398,10 @@ msgstr "部署 %{name} 到 %{node} 失败"
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "成功将站点 %{name} 保存到 %{node} 中"
 msgstr "成功将站点 %{name} 保存到 %{node} 中"
 
 
+#: src/language/curd.ts:36
+msgid "Save successful"
+msgstr "保存成功"
+
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/language/curd.ts:35 src/views/certificate/store.ts:14
 #: src/views/preference/store/index.ts:120
 #: src/views/preference/store/index.ts:120
 msgid "Save successfully"
 msgid "Save successfully"
@@ -4494,7 +4490,7 @@ msgstr "全选"
 msgid "Select an action after sync"
 msgid "Select an action after sync"
 msgstr "选择同步后的操作"
 msgstr "选择同步后的操作"
 
 
-#: src/language/curd.ts:57
+#: src/language/curd.ts:59
 msgid "Selected {count} files"
 msgid "Selected {count} files"
 msgstr "已选择 {count} 个文件"
 msgstr "已选择 {count} 个文件"
 
 
@@ -4606,7 +4602,7 @@ msgstr "共享内存区"
 msgid "Show"
 msgid "Show"
 msgstr "显示"
 msgstr "显示"
 
 
-#: src/views/other/Login.vue:289
+#: src/views/other/Login.vue:295
 msgid "Sign in with a passkey"
 msgid "Sign in with a passkey"
 msgstr "使用 Passkey 登录"
 msgstr "使用 Passkey 登录"
 
 
@@ -4650,7 +4646,7 @@ msgstr "Sites-available 目录不存在"
 msgid "Sites-enabled directory not exist"
 msgid "Sites-enabled directory not exist"
 msgstr "Sites-enabled 目录不存在"
 msgstr "Sites-enabled 目录不存在"
 
 
-#: src/language/curd.ts:60
+#: src/language/curd.ts:62
 msgid "Size"
 msgid "Size"
 msgstr "大小"
 msgstr "大小"
 
 
@@ -4715,7 +4711,7 @@ msgstr "SSL 密钥路径"
 msgid "SSL key path is required when HTTPS is enabled"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "启用 HTTPS 时需要 SSL 密钥路径"
 msgstr "启用 HTTPS 时需要 SSL 密钥路径"
 
 
-#: src/views/other/Login.vue:246
+#: src/views/other/Login.vue:252
 msgid "SSO Login"
 msgid "SSO Login"
 msgstr "SSO 登录"
 msgstr "SSO 登录"
 
 
@@ -4750,7 +4746,7 @@ msgstr "静态"
 msgid "Status"
 msgid "Status"
 msgstr "状态"
 msgstr "状态"
 
 
-#: src/components/NginxControl/NginxControl.vue:83
+#: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgid "Stopped"
 msgstr "已停止"
 msgstr "已停止"
 
 
@@ -4847,11 +4843,11 @@ msgstr ""
 "支持通过 WebSocket 协议与后端通信,如果您正在使用 Nginx 反向代理了 Nginx UI "
 "支持通过 WebSocket 协议与后端通信,如果您正在使用 Nginx 反向代理了 Nginx UI "
 "请参考:https://nginxui.com/guide/nginx-proxy-example.html 编写配置文件"
 "请参考: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"
 msgid "Support single or batch upload of files"
 msgstr "支持单个或多个文件上传"
 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"
 msgid "Support uploading entire folders"
 msgstr "支持上传整个文件夹"
 msgstr "支持上传整个文件夹"
 
 
@@ -5046,7 +5042,7 @@ msgid ""
 "hyphens, dashes, colons, and dots."
 "hyphens, dashes, colons, and dots."
 msgstr "公安备案号只能包含字母、单码、数字、连字符、破折号、冒号和点。"
 msgstr "公安备案号只能包含字母、单码、数字、连字符、破折号、冒号和点。"
 
 
-#: src/views/dashboard/Environments.vue:140
+#: src/views/dashboard/components/NodeAnalyticItem.vue:107
 msgid ""
 msgid ""
 "The remote Nginx UI version is not compatible with the local Nginx UI "
 "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 "
 "version. To avoid potential errors, please upgrade the remote Nginx UI to "
@@ -5106,15 +5102,15 @@ msgstr "此目录受保护,为确保系统安全无法删除。"
 msgid "This field is required"
 msgid "This field is required"
 msgstr "此字段必填"
 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"
 msgid "This field should be a valid email address"
 msgstr "该字段应是有效的电子邮件地址"
 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"
 msgid "This field should be a valid hostname"
 msgstr "该字段应是有效的主机名"
 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"
 msgid "This field should not be empty"
 msgstr "该字段不能为空"
 msgstr "该字段不能为空"
 
 
@@ -5122,7 +5118,7 @@ msgstr "该字段不能为空"
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "该字段只能包含字母、unicode 字符、数字和 -_。"
 msgstr "该字段只能包含字母、unicode 字符、数字和 -_。"
 
 
-#: src/language/curd.ts:44
+#: src/language/curd.ts:46
 msgid ""
 msgid ""
 "This field should only contain letters, unicode characters, numbers, and "
 "This field should only contain letters, unicode characters, numbers, and "
 "-_./:"
 "-_./:"
@@ -5146,7 +5142,7 @@ msgid ""
 "make sure to save it in a secure location."
 "make sure to save it in a secure location."
 msgstr "此 Token 只显示一次,以后无法找回。请确保将其保存在安全位置。"
 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"
 msgid "This value is already taken"
 msgstr "该字段的值已经存在"
 msgstr "该字段的值已经存在"
 
 
@@ -5180,7 +5176,7 @@ msgstr "限流"
 msgid "Thursday"
 msgid "Thursday"
 msgstr "星期四"
 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/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgid "Tips"
@@ -5206,7 +5202,7 @@ msgid ""
 "on your mobile phone."
 "on your mobile phone."
 msgstr "要启用该功能,您需要在手机上安装 Google 或 Microsoft Authenticator 应用程序。"
 msgstr "要启用该功能,您需要在手机上安装 Google 或 Microsoft Authenticator 应用程序。"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:89
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:94
 msgid ""
 msgid ""
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "To ensure security, Webauthn configuration cannot be added through the UI. "
 "Please manually configure the following in the app.ini configuration file "
 "Please manually configure the following in the app.ini configuration file "
@@ -5267,6 +5263,10 @@ msgstr "Nginx 进程总数"
 msgid "Total Nginx Processes"
 msgid "Total Nginx Processes"
 msgstr "Nginx 进程总数"
 msgstr "Nginx 进程总数"
 
 
+#: src/views/dashboard/ServerAnalytic.vue:283
+msgid "Total Receive"
+msgstr "总接收量"
+
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/composables/usePerformanceMetrics.ts:99
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 #: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
 msgid "Total requests"
@@ -5276,6 +5276,10 @@ msgstr "总请求数"
 msgid "Total Requests / Total Connections"
 msgid "Total Requests / Total Connections"
 msgstr "请求总数/连接总数"
 msgstr "请求总数/连接总数"
 
 
+#: src/views/dashboard/ServerAnalytic.vue:289
+msgid "Total Send"
+msgstr "总发送"
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 #: src/views/preference/components/AuthSettings/TOTP.vue:66
 msgid "TOTP"
 msgid "TOTP"
 msgstr "TOTP"
 msgstr "TOTP"
@@ -5367,11 +5371,11 @@ msgstr "升级成功"
 msgid "Upgrading Nginx UI, please wait..."
 msgid "Upgrading Nginx UI, please wait..."
 msgstr "正在升级 Nginx UI,请等待..."
 msgstr "正在升级 Nginx UI,请等待..."
 
 
-#: src/language/curd.ts:47
+#: src/language/curd.ts:49
 msgid "Upload Files"
 msgid "Upload Files"
 msgstr "上传文件"
 msgstr "上传文件"
 
 
-#: src/language/curd.ts:48
+#: src/language/curd.ts:50
 msgid "Upload Folders"
 msgid "Upload Folders"
 msgstr "上传文件夹"
 msgstr "上传文件夹"
 
 
@@ -5423,7 +5427,7 @@ msgstr "用户未启用 OTP 作为 2FA"
 msgid "User Profile"
 msgid "User Profile"
 msgstr "用户资料"
 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
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgid "Username"
 msgstr "用户名"
 msgstr "用户名"
@@ -5489,7 +5493,7 @@ msgstr "等待处理"
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/constants/index.ts:23 src/views/backup/components/BackupCreator.vue:138
 #: src/views/config/InspectConfig.vue:51
 #: src/views/config/InspectConfig.vue:51
 #: src/views/notification/notificationColumns.tsx:21
 #: src/views/notification/notificationColumns.tsx:21
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:82
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
 msgid "Warning"
 msgid "Warning"
 msgstr "警告"
 msgstr "警告"
 
 
@@ -5641,7 +5645,7 @@ msgstr "您可以在 %{countdown} 秒后关闭此对话框"
 msgid "You can close this dialog now"
 msgid "You can close this dialog now"
 msgstr "现在可以关闭此对话框"
 msgstr "现在可以关闭此对话框"
 
 
-#: src/views/preference/components/AuthSettings/AddPasskey.vue:87
+#: src/views/preference/components/AuthSettings/AddPasskey.vue:92
 msgid ""
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
 "passkey."
@@ -5670,6 +5674,9 @@ msgstr "您的旧代码将不再有效。"
 msgid "Your passkeys"
 msgid "Your passkeys"
 msgstr "你的 Passkeys"
 msgstr "你的 Passkeys"
 
 
+#~ msgid "Link Start"
+#~ msgstr "链接"
+
 #~ msgid "Enable failed"
 #~ msgid "Enable failed"
 #~ msgstr "启用失败"
 #~ msgstr "启用失败"
 
 

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

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

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

@@ -7,7 +7,7 @@ function bytesToSize(bytes: number) {
 
 
   const k = 1024
   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))
   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 ReconnectingWebSocket from 'reconnecting-websocket'
 import type { Ref } from 'vue'
 import type { Ref } from 'vue'
 import type { Node } from '@/api/environment'
 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 analytic from '@/api/analytic'
 import environment from '@/api/environment'
 import environment from '@/api/environment'
 import logo from '@/assets/img/logo.png'
 import logo from '@/assets/img/logo.png'
@@ -71,83 +71,68 @@ const visible = computed(() => {
 <template>
 <template>
   <ACard
   <ACard
     v-if="visible"
     v-if="visible"
-    class="env-list-card"
+    class="env-list-card w-full max-w-none"
     :title="$gettext('Environments')"
     :title="$gettext('Environments')"
+    :bordered="false"
   >
   >
     <AList
     <AList
       item-layout="horizontal"
       item-layout="horizontal"
       :data-source="data"
       :data-source="data"
+      class="env-list"
     >
     >
       <template #renderItem="{ item }">
       <template #renderItem="{ item }">
-        <AListItem>
+        <AListItem class="env-list-item">
           <AListItemMeta>
           <AListItemMeta>
             <template #title>
             <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>
               </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>
-                <div class="runtime-meta mr-2 mb-1">
-                  <ThunderboltOutlined />{{ item.version }}
-                </div>
-              </template>
-              <div class="runtime-meta">
-                <LinkOutlined />{{ item.url }}
               </div>
               </div>
             </template>
             </template>
             <template #avatar>
             <template #avatar>
-              <AAvatar :src="logo" />
+              <AAvatar :src="logo" class="flex-shrink-0" />
             </template>
             </template>
             <template #description>
             <template #description>
-              <div class="md:flex lg:flex justify-between md:items-center">
+              <div class="env-description">
                 <NodeAnalyticItem
                 <NodeAnalyticItem
                   :item="item"
                   :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>
               </div>
             </template>
             </template>
           </AListItemMeta>
           </AListItemMeta>
@@ -158,34 +143,162 @@ const visible = computed(() => {
 </template>
 </template>
 
 
 <style scoped lang="less">
 <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;
   display: flex;
   align-items: center;
   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>
 </style>

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

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

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

@@ -1,122 +1,200 @@
 <script setup lang="ts">
 <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 cpu from '@/assets/svg/cpu.svg?component'
 import memory from '@/assets/svg/memory.svg?component'
 import memory from '@/assets/svg/memory.svg?component'
 import UsageProgressLine from '@/components/Chart/UsageProgressLine.vue'
 import UsageProgressLine from '@/components/Chart/UsageProgressLine.vue'
 import { bytesToSize } from '@/lib/helper'
 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>
 </script>
 
 
 <template>
 <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>
-      <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>
-        <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>
     </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>
   </div>
 </template>
 </template>
 
 
 <style scoped lang="less">
 <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 {
 .hardware-monitor {
   display: flex;
   display: flex;
+  flex: 1;
 
 
   @media (max-width: 1000px) {
   @media (max-width: 1000px) {
     display: block;
     display: block;
   }
   }
 
 
+  @media (min-width: 768px) and (max-width: 1000px) {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 12px;
+  }
+
   .hardware-monitor-item {
   .hardware-monitor-item {
     width: 140px;
     width: 140px;
     margin-right: 20px;
     margin-right: 20px;
 
 
-    @media(min-width: 1800px) {
-      width: 300px;
-      margin-bottom: 10px;
+    @media(min-width: 2100px) {
+      width: 400px;
       margin-right: 50px;
       margin-right: 50px;
     }
     }
 
 
+    @media(min-width: 1800px) and (max-width: 2100px) {
+      width: 300px;
+      margin-right: 20px;
+    }
+
     @media(min-width: 1600px) and (max-width: 1800px) {
     @media(min-width: 1600px) and (max-width: 1800px) {
       width: 270px;
       width: 270px;
-      margin-bottom: 10px;
       margin-right: 20px;
       margin-right: 20px;
     }
     }
 
 
     @media(min-width: 1500px) and (max-width: 1600px) {
     @media(min-width: 1500px) and (max-width: 1600px) {
-      width: 230px;
-      margin-bottom: 10px;
+      width: 220px;
       margin-right: 30px;
       margin-right: 30px;
     }
     }
 
 
     @media(min-width: 1400px) and (max-width: 1500px) {
     @media(min-width: 1400px) and (max-width: 1500px) {
       width: 180px;
       width: 180px;
-      margin-bottom: 10px;
       margin-right: 25px;
       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;
       width: 280px;
-      margin-bottom: 10px;
     }
     }
 
 
     @media(max-width: 400px) {
     @media(max-width: 400px) {
       width: 200px;
       width: 200px;
-      margin-bottom: 10px;
     }
     }
   }
   }
 
 
@@ -141,25 +219,88 @@ defineProps<{
       width: 300px;
       width: 300px;
     }
     }
   }
   }
-  @media (min-width: 1400px) {
+  @media (min-width: 768px) and (max-width: 1000px) {
     .longer {
     .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 {
     .longer {
-      min-width: 270px;
+      min-width: 200px;
     }
     }
   }
   }
-  @media (min-width: 400px) and (max-width: 1000px) {
+  @media (min-width: 1200px) and (max-width: 1400px) {
     .longer {
     .longer {
-      min-width: 250px;
+      min-width: 240px;
     }
     }
   }
   }
-  @media (min-width: 1100px) and (max-width: 1200px) {
+  @media (min-width: 1400px) {
     .longer {
     .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>
 </style>

+ 2 - 2
internal/analytic/disk.go

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