1
0
Эх сурвалжийг харах

feat(nginx-dashboard): add modules table

Jacky 21 цаг өмнө
parent
commit
d263340bdf

+ 1 - 1
api/nginx/modules.go

@@ -9,7 +9,7 @@ import (
 
 func GetModules(c *gin.Context) {
 	modules := nginx.GetModules()
-	modulesList := make([]nginx.Module, 0, modules.Len())
+	modulesList := make([]*nginx.Module, 0, modules.Len())
 	for _, module := range modules.AllFromFront() {
 		modulesList = append(modulesList, module)
 	}

+ 203 - 150
app/src/language/ar/app.po

@@ -4,10 +4,10 @@ msgid ""
 msgstr ""
 "PO-Revision-Date: 2024-10-29 14:39+0000\n"
 "Last-Translator: mosaati <mohammed.saati@gmail.com>\n"
-"Language-Team: Arabic "
-"<https://weblate.nginxui.com/projects/nginx-ui/frontend/ar/>\n"
+"Language-Team: Arabic <https://weblate.nginxui.com/projects/nginx-ui/"
+"frontend/ar/>\n"
 "Language: ar\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
 "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
@@ -32,7 +32,8 @@ msgid "[Nginx UI] Certificate successfully revoked"
 msgstr "[Nginx UI] تم إلغاء الشهادة بنجاح"
 
 #: src/language/generate.ts:27
-msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgid ""
+"[Nginx UI] Certificate was used for server, reloading server TLS certificate"
 msgstr "[Nginx UI] تم استخدام الشهادة للخادم، إعادة تحميل شهادة TLS للخادم"
 
 #: src/language/generate.ts:41
@@ -145,7 +146,7 @@ msgid "Action"
 msgstr "إجراء"
 
 #: src/composables/usePerformanceMetrics.ts:84
-#: src/views/dashboard/components/PerformanceTablesCard.vue:43
+#: src/views/dashboard/components/PerformanceTablesCard.vue:44
 msgid "Active connections"
 msgstr "الاتصالات النشطة"
 
@@ -357,7 +358,7 @@ msgstr "الكاتب"
 msgid "Auto"
 msgstr "آلي"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:200
+#: src/views/dashboard/components/PerformanceTablesCard.vue:201
 msgid "auto = CPU cores"
 msgstr "Auto = CPU Cores"
 
@@ -488,14 +489,15 @@ msgstr "ذاكرة التخزين المؤقت"
 
 #: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:178
 msgid "Cache items not accessed within this time will be removed"
-msgstr "سيتم إزالة عناصر الذاكرة المؤقتة التي لم يتم الوصول إليها خلال هذا الوقت"
+msgstr ""
+"سيتم إزالة عناصر الذاكرة المؤقتة التي لم يتم الوصول إليها خلال هذا الوقت"
 
 #: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:350
 msgid "Cache loader processing time threshold"
 msgstr "عتبة وقت معالجة محمل الذاكرة المؤقتة"
 
 #: src/composables/usePerformanceMetrics.ts:139
-#: src/views/dashboard/components/PerformanceTablesCard.vue:94
+#: src/views/dashboard/components/PerformanceTablesCard.vue:95
 msgid "Cache manager processes"
 msgstr "عمليات مدير الذاكرة المؤقتة"
 
@@ -525,7 +527,7 @@ msgid "CADir"
 msgstr "CADir"
 
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:43
-#: src/views/dashboard/components/PerformanceTablesCard.vue:190
+#: src/views/dashboard/components/PerformanceTablesCard.vue:191
 msgid ""
 "Calculated based on worker_processes * worker_connections. Actual "
 "performance depends on hardware, configuration, and workload"
@@ -699,23 +701,23 @@ msgstr "تحقق مرة أخرى"
 #: src/language/generate.ts:17
 msgid ""
 "Check if /var/run/docker.sock exists. If you are using Nginx UI Official "
-"Docker Image, please make sure the docker socket is mounted like this: `-v "
-"/var/run/docker.sock:/var/run/docker.sock`. Nginx UI official image uses "
-"/var/run/docker.sock to communicate with the host Docker Engine via Docker "
-"Client API. This feature is used to control Nginx in another container and "
-"perform container replacement rather than binary replacement during OTA "
-"upgrades of Nginx UI to ensure container dependencies are also upgraded. If "
-"you don't need this feature, please add the environment variable "
+"Docker Image, please make sure the docker socket is mounted like this: `-v /"
+"var/run/docker.sock:/var/run/docker.sock`. Nginx UI official image uses /var/"
+"run/docker.sock to communicate with the host Docker Engine via Docker Client "
+"API. This feature is used to control Nginx in another container and perform "
+"container replacement rather than binary replacement during OTA upgrades of "
+"Nginx UI to ensure container dependencies are also upgraded. If you don't "
+"need this feature, please add the environment variable "
 "NGINX_UI_IGNORE_DOCKER_SOCKET=true to the container."
 msgstr ""
 "تحقق مما إذا كان /var/run/docker.sock موجودًا. إذا كنت تستخدم صورة Docker "
-"الرسمية لـ Nginx UI، يرجى التأكد من توصيل مقبس Docker بهذه الطريقة: `-v "
-"/var/run/docker.sock:/var/run/docker.sock`. تستخدم صورة Nginx UI الرسمية "
-"/var/run/docker.sock للتواصل مع محرك Docker المضيف عبر واجهة برمجة تطبيقات "
-"Docker Client. تُستخدم هذه الميزة للتحكم في Nginx في حاوية أخرى وإجراء "
-"استبدال الحاوية بدلاً من استبدال الثنائي أثناء التحديثات OTA لـ Nginx UI "
-"لضمان تحديث تبعيات الحاوية أيضًا. إذا كنت لا تحتاج إلى هذه الميزة، يرجى "
-"إضافة متغير البيئة NGINX_UI_IGNORE_DOCKER_SOCKET=true إلى الحاوية."
+"الرسمية لـ Nginx UI، يرجى التأكد من توصيل مقبس Docker بهذه الطريقة: `-v /var/"
+"run/docker.sock:/var/run/docker.sock`. تستخدم صورة Nginx UI الرسمية /var/run/"
+"docker.sock للتواصل مع محرك Docker المضيف عبر واجهة برمجة تطبيقات Docker "
+"Client. تُستخدم هذه الميزة للتحكم في Nginx في حاوية أخرى وإجراء استبدال "
+"الحاوية بدلاً من استبدال الثنائي أثناء التحديثات OTA لـ Nginx UI لضمان تحديث "
+"تبعيات الحاوية أيضًا. إذا كنت لا تحتاج إلى هذه الميزة، يرجى إضافة متغير "
+"البيئة NGINX_UI_IGNORE_DOCKER_SOCKET=true إلى الحاوية."
 
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:14
 msgid ""
@@ -727,19 +729,19 @@ msgstr ""
 
 #: src/language/generate.ts:45
 msgid ""
-"Check if the nginx access log path exists. By default, this path is "
-"obtained from 'nginx -V'. If it cannot be obtained or the obtained path "
-"does not point to a valid, existing file, an error will be reported. In "
-"this case, you need to modify the configuration file to specify the access "
-"log path.Refer to the docs for more details: "
-"https://nginxui.com/zh_CN/guide/config-nginx.html#accesslogpath"
+"Check if the nginx access log path exists. By default, this path is obtained "
+"from 'nginx -V'. If it cannot be obtained or the obtained path does not "
+"point to a valid, existing file, an error will be reported. In this case, "
+"you need to modify the configuration file to specify the access log path."
+"Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-"
+"nginx.html#accesslogpath"
 msgstr ""
-"تحقق مما إذا كان مسار سجل الوصول إلى nginx موجودًا. بشكل افتراضي، يتم "
-"الحصول على هذا المسار من 'nginx -V'. إذا لم يتم الحصول عليه أو إذا كان "
-"المسار الذي تم الحصول عليه لا يشير إلى ملف صالح موجود، فسيتم الإبلاغ عن "
-"خطأ. في هذه الحالة، تحتاج إلى تعديل ملف التكوين لتحديد مسار سجل الوصول. "
-"راجع الوثائق لمزيد من التفاصيل: "
-"https://nginxui.com/zh_CN/guide/config-nginx.html#accesslogpath"
+"تحقق مما إذا كان مسار سجل الوصول إلى nginx موجودًا. بشكل افتراضي، يتم الحصول "
+"على هذا المسار من 'nginx -V'. إذا لم يتم الحصول عليه أو إذا كان المسار الذي "
+"تم الحصول عليه لا يشير إلى ملف صالح موجود، فسيتم الإبلاغ عن خطأ. في هذه "
+"الحالة، تحتاج إلى تعديل ملف التكوين لتحديد مسار سجل الوصول. راجع الوثائق "
+"لمزيد من التفاصيل: https://nginxui.com/zh_CN/guide/config-nginx."
+"html#accesslogpath"
 
 #: src/language/generate.ts:34
 msgid "Check if the nginx configuration directory exists"
@@ -754,30 +756,29 @@ msgid ""
 "Check if the nginx error log path exists. By default, this path is obtained "
 "from 'nginx -V'. If it cannot be obtained or the obtained path does not "
 "point to a valid, existing file, an error will be reported. In this case, "
-"you need to modify the configuration file to specify the error log "
-"path.Refer to the docs for more details: "
-"https://nginxui.com/zh_CN/guide/config-nginx.html#errorlogpath"
+"you need to modify the configuration file to specify the error log path."
+"Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-"
+"nginx.html#errorlogpath"
 msgstr ""
 "تحقق مما إذا كان مسار سجل أخطاء nginx موجودًا. بشكل افتراضي، يتم الحصول على "
 "هذا المسار من 'nginx -V'. إذا تعذر الحصول عليه أو إذا كان المسار الذي تم "
-"الحصول عليه لا يشير إلى ملف صالح موجود، فسيتم الإبلاغ عن خطأ. في هذه "
-"الحالة، تحتاج إلى تعديل ملف التكوين لتحديد مسار سجل الأخطاء. راجع الوثائق "
-"لمزيد من التفاصيل: "
-"https://nginxui.com/zh_CN/guide/config-nginx.html#errorlogpath"
+"الحصول عليه لا يشير إلى ملف صالح موجود، فسيتم الإبلاغ عن خطأ. في هذه الحالة، "
+"تحتاج إلى تعديل ملف التكوين لتحديد مسار سجل الأخطاء. راجع الوثائق لمزيد من "
+"التفاصيل: https://nginxui.com/zh_CN/guide/config-nginx.html#errorlogpath"
 
 #: src/language/generate.ts:10
 msgid ""
 "Check if the nginx PID path exists. By default, this path is obtained from "
 "'nginx -V'. If it cannot be obtained, an error will be reported. In this "
 "case, you need to modify the configuration file to specify the Nginx PID "
-"path.Refer to the docs for more details: "
-"https://nginxui.com/zh_CN/guide/config-nginx.html#pidpath"
+"path.Refer to the docs for more details: https://nginxui.com/zh_CN/guide/"
+"config-nginx.html#pidpath"
 msgstr ""
-"تحقق مما إذا كان مسار معرف عملية Nginx موجودًا. بشكل افتراضي، يتم الحصول "
-"على هذا المسار من الأمر 'nginx -V'. إذا تعذر الحصول عليه، سيتم الإبلاغ عن "
-"خطأ. في هذه الحالة، تحتاج إلى تعديل ملف التكوين لتحديد مسار معرف عملية "
-"Nginx. راجع الوثائق لمزيد من التفاصيل: "
-"https://nginxui.com/zh_CN/guide/config-nginx.html#pidpath"
+"تحقق مما إذا كان مسار معرف عملية Nginx موجودًا. بشكل افتراضي، يتم الحصول على "
+"هذا المسار من الأمر 'nginx -V'. إذا تعذر الحصول عليه، سيتم الإبلاغ عن خطأ. "
+"في هذه الحالة، تحتاج إلى تعديل ملف التكوين لتحديد مسار معرف عملية Nginx. "
+"راجع الوثائق لمزيد من التفاصيل: https://nginxui.com/zh_CN/guide/config-nginx."
+"html#pidpath"
 
 #: src/language/generate.ts:22
 msgid "Check if the nginx.conf includes the conf.d directory"
@@ -801,8 +802,8 @@ msgstr ""
 
 #: src/language/generate.ts:23
 msgid ""
-"Check if the streams-available and streams-enabled directories are under "
-"the nginx configuration directory"
+"Check if the streams-available and streams-enabled directories are under the "
+"nginx configuration directory"
 msgstr ""
 "تحقق مما إذا كانت الدلائل streams-available و streams-enabled موجودة ضمن "
 "دليل تكوين nginx"
@@ -926,7 +927,7 @@ msgstr "تم اختبار ملف التكوين بنجاح"
 msgid "Configuration History"
 msgstr "سجل التكوين"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:167
+#: src/views/dashboard/components/PerformanceTablesCard.vue:168
 msgid "Configuration information"
 msgstr "معلومات التكوين"
 
@@ -1413,8 +1414,8 @@ msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
 msgstr ""
-"نظرًا لسياسات الأمان لبعض المتصفحات، لا يمكنك استخدام مفاتيح المرور على "
-"مواقع الويب غير HTTPS، إلا عند التشغيل على localhost."
+"نظرًا لسياسات الأمان لبعض المتصفحات، لا يمكنك استخدام مفاتيح المرور على مواقع "
+"الويب غير HTTPS، إلا عند التشغيل على localhost."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
 #: src/views/site/site_list/SiteList.vue:105
@@ -1428,6 +1429,11 @@ msgstr "مكرر"
 msgid "Duplicate to local successfully"
 msgstr "تم النسخ إلى المحلي بنجاح"
 
+#: src/views/dashboard/components/ModulesTable.vue:88
+#: src/views/dashboard/components/ModulesTable.vue:93
+msgid "Dynamic"
+msgstr "ديناميكي"
+
 #: src/components/StdDesign/StdDetail/StdDetail.vue:110
 msgid "Edit"
 msgstr "تعديل"
@@ -1445,7 +1451,7 @@ msgstr "تعديل التكوين"
 msgid "Edit Site"
 msgstr "تعديل الموقع"
 
-#: src/routes/modules/streams.ts:19
+#: src/routes/modules/streams.ts:20
 msgid "Edit Stream"
 msgstr "تعديل البث"
 
@@ -2156,7 +2162,7 @@ msgstr ""
 msgid "Indexing..."
 msgstr "جاري الفهرسة..."
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:15
+#: src/views/dashboard/components/PerformanceTablesCard.vue:16
 msgid "Indicator"
 msgstr "المؤشر"
 
@@ -2392,6 +2398,11 @@ msgstr "تحميل من الإعدادات"
 msgid "Load successfully"
 msgstr "تم التحميل بنجاح"
 
+#: src/views/dashboard/components/ModulesTable.vue:101
+#: src/views/dashboard/components/ModulesTable.vue:106
+msgid "Loaded"
+msgstr "تم التحميل"
+
 #: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:313
 msgid "Loader Files"
 msgstr "ملفات المحمل"
@@ -2433,12 +2444,12 @@ msgstr "سجل"
 #: src/language/generate.ts:25
 msgid ""
 "Log file %{log_path} is not a regular file. If you are using nginx-ui in "
-"docker container, please refer to "
-"https://nginxui.com/zh_CN/guide/config-nginx-log.html for more information."
+"docker container, please refer to https://nginxui.com/zh_CN/guide/config-"
+"nginx-log.html for more information."
 msgstr ""
 "ملف السجل %{log_path} ليس ملفًا عاديًا. إذا كنت تستخدم nginx-ui في حاوية "
-"Docker، يرجى الرجوع إلى "
-"https://nginxui.com/zh_CN/guide/config-nginx-log.html لمزيد من المعلومات."
+"Docker، يرجى الرجوع إلى https://nginxui.com/zh_CN/guide/config-nginx-log."
+"html لمزيد من المعلومات."
 
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:64
 msgid "Log List"
@@ -2462,19 +2473,19 @@ msgstr "تدوير السجلات"
 
 #: src/views/preference/tabs/LogrotateSettings.vue:13
 msgid ""
-"Logrotate, by default, is enabled in most mainstream Linux distributions "
-"for users who install Nginx UI on the host machine, so you don't need to "
-"modify the parameters on this page. For users who install Nginx UI using "
-"Docker containers, you can manually enable this option. The crontab task "
-"scheduler of Nginx UI will execute the logrotate command at the interval "
-"you set in minutes."
+"Logrotate, by default, is enabled in most mainstream Linux distributions for "
+"users who install Nginx UI on the host machine, so you don't need to modify "
+"the parameters on this page. For users who install Nginx UI using Docker "
+"containers, you can manually enable this option. The crontab task scheduler "
+"of Nginx UI will execute the logrotate command at the interval you set in "
+"minutes."
 msgstr ""
 "بشكل افتراضي، يتم تفعيل تدوير السجلات في معظم توزيعات لينكس الرئيسية "
 "للمستخدمين الذين يقومون بتثبيت واجهة Nginx UI على الجهاز المضيف، لذا لا "
-"تحتاج إلى تعديل معايير في هذه الصفحة. بالنسبة للمستخدمين الذين يقومون "
-"بتثبيت واجهة Nginx UI باستخدام حاويات Docker، يمكنك تمكين هذا الخيار "
-"يدويًا. سيقوم مجدول المهام crontab الخاص بواجهة Nginx UI بتنفيذ أمر تدوير "
-"السجلات في الفاصل الزمني الذي تحدده بالدقائق."
+"تحتاج إلى تعديل معايير في هذه الصفحة. بالنسبة للمستخدمين الذين يقومون بتثبيت "
+"واجهة Nginx UI باستخدام حاويات Docker، يمكنك تمكين هذا الخيار يدويًا. سيقوم "
+"مجدول المهام crontab الخاص بواجهة Nginx UI بتنفيذ أمر تدوير السجلات في "
+"الفاصل الزمني الذي تحدده بالدقائق."
 
 #: src/views/site/components/SiteStatusSegmented.vue:138
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:68
@@ -2535,7 +2546,7 @@ msgstr "عتبة المدير"
 msgid "Manual"
 msgstr "يدوي"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:201
+#: src/views/dashboard/components/PerformanceTablesCard.vue:202
 msgid "manually set"
 msgstr "تم تعيينه يدويًا"
 
@@ -2544,7 +2555,7 @@ msgid "Master"
 msgstr "الرئيسي"
 
 #: src/composables/usePerformanceMetrics.ts:134
-#: src/views/dashboard/components/PerformanceTablesCard.vue:89
+#: src/views/dashboard/components/PerformanceTablesCard.vue:90
 msgid "Master process"
 msgstr "العملية الرئيسية"
 
@@ -2578,7 +2589,7 @@ msgid "Maximum number of concurrent connections"
 msgstr "الحد الأقصى لعدد الاتصالات المتزامنة"
 
 #: src/composables/usePerformanceMetrics.ts:174
-#: src/views/dashboard/components/PerformanceTablesCard.vue:125
+#: src/views/dashboard/components/PerformanceTablesCard.vue:126
 msgid "Maximum number of connections per worker process"
 msgstr "الحد الأقصى لعدد الاتصالات لكل عملية عامل"
 
@@ -2586,7 +2597,7 @@ msgstr "الحد الأقصى لعدد الاتصالات لكل عملية عا
 msgid "Maximum total size of the cache"
 msgstr "الحجم الإجمالي الأقصى للذاكرة المؤقتة"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:195
+#: src/views/dashboard/components/PerformanceTablesCard.vue:196
 msgid "Maximum worker process number:"
 msgstr "الحد الأقصى لعدد عمليات العامل:"
 
@@ -2647,6 +2658,14 @@ msgstr "تعديل التكوين"
 msgid "Modify Mode"
 msgstr "وضع التعديل"
 
+#: src/views/dashboard/components/ModulesTable.vue:28
+msgid "Module"
+msgstr "الوحدة"
+
+#: src/views/dashboard/components/PerformanceTablesCard.vue:215
+msgid "Modules"
+msgstr "الوحدات"
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:51
 msgid "Multi-line Directive"
 msgstr "توجيه متعدد الأسطر"
@@ -2784,7 +2803,7 @@ msgid "Nginx Control Mode"
 msgstr "وضع التحكم في Nginx"
 
 #: src/composables/usePerformanceMetrics.ts:149
-#: src/views/dashboard/components/PerformanceTablesCard.vue:104
+#: src/views/dashboard/components/PerformanceTablesCard.vue:105
 msgid "Nginx CPU usage rate"
 msgstr "معدل استخدام وحدة المعالجة المركزية لـ Nginx"
 
@@ -2821,7 +2840,7 @@ msgid "Nginx Log Directory Whitelist"
 msgstr "قائمة السماح لمجلد سجلات Nginx"
 
 #: src/composables/usePerformanceMetrics.ts:154
-#: src/views/dashboard/components/PerformanceTablesCard.vue:109
+#: src/views/dashboard/components/PerformanceTablesCard.vue:110
 msgid "Nginx Memory usage"
 msgstr "استخدام ذاكرة Nginx"
 
@@ -2871,7 +2890,7 @@ msgstr "أمر اختبار تكوين Nginx"
 msgid "Nginx test failed: {0}"
 msgstr "فشل اختبار Nginx: {0}"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:180
+#: src/views/dashboard/components/PerformanceTablesCard.vue:181
 msgid "Nginx theoretical maximum performance"
 msgstr "أقصى أداء نظري لـ Nginx"
 
@@ -2885,8 +2904,8 @@ msgstr "تمت استعادة تكوين Nginx UI"
 
 #: src/components/SystemRestore/SystemRestoreContent.vue:336
 msgid ""
-"Nginx UI configuration has been restored and will restart automatically in "
-"a few seconds."
+"Nginx UI configuration has been restored and will restart automatically in a "
+"few seconds."
 msgstr "تمت استعادة تكوين Nginx UI وسيتم إعادة التشغيل تلقائيًا خلال بضع ثوانٍ."
 
 #: src/language/generate.ts:38
@@ -2969,6 +2988,11 @@ msgstr "ليس بعد"
 msgid "Not Found"
 msgstr "غير موجود"
 
+#: src/views/dashboard/components/ModulesTable.vue:102
+#: src/views/dashboard/components/ModulesTable.vue:106
+msgid "Not Loaded"
+msgstr "غير محمل"
+
 #: src/components/CertInfo/CertInfo.vue:41
 msgid "Not Valid Before: %{date}"
 msgstr "غير صالح قبل: %{date}"
@@ -3006,16 +3030,18 @@ msgstr "عدد عمليات العامل المتزامنة، يتم الضبط
 
 #: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:315
 msgid "Number of files processed by cache loader at once"
-msgstr "عدد الملفات التي تتم معالجتها بواسطة محمل ذاكرة التخزين المؤقت في وقت واحد"
+msgstr ""
+"عدد الملفات التي تتم معالجتها بواسطة محمل ذاكرة التخزين المؤقت في وقت واحد"
 
 #: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:253
 msgid "Number of files processed by cache manager at once"
-msgstr "عدد الملفات التي تتم معالجتها بواسطة مدير ذاكرة التخزين المؤقت في وقت واحد"
+msgstr ""
+"عدد الملفات التي تتم معالجتها بواسطة مدير ذاكرة التخزين المؤقت في وقت واحد"
 
 #: src/composables/usePerformanceMetrics.ts:129
 #: src/composables/usePerformanceMetrics.ts:169
-#: src/views/dashboard/components/PerformanceTablesCard.vue:120
-#: src/views/dashboard/components/PerformanceTablesCard.vue:84
+#: src/views/dashboard/components/PerformanceTablesCard.vue:121
+#: src/views/dashboard/components/PerformanceTablesCard.vue:85
 msgid "Number of worker processes"
 msgstr "عدد عمليات العامل"
 
@@ -3122,7 +3148,7 @@ msgid "OS:"
 msgstr "نظام التشغيل:"
 
 #: src/composables/usePerformanceMetrics.ts:144
-#: src/views/dashboard/components/PerformanceTablesCard.vue:99
+#: src/views/dashboard/components/PerformanceTablesCard.vue:100
 msgid "Other Nginx processes"
 msgstr "عمليات Nginx الأخرى"
 
@@ -3249,7 +3275,8 @@ msgstr ""
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
-msgstr "يرجى إدخال اسم لمفتاح المرور الذي ترغب في إنشائه ثم انقر على زر موافق أدناه."
+msgstr ""
+"يرجى إدخال اسم لمفتاح المرور الذي ترغب في إنشائه ثم انقر على زر موافق أدناه."
 
 #: src/components/TwoFA/Authorization.vue:85
 msgid "Please enter the OTP code:"
@@ -3285,8 +3312,8 @@ msgstr ""
 #: src/components/Notification/notifications.ts:166
 #: src/language/constants.ts:59
 msgid ""
-"Please generate new recovery codes in the preferences immediately to "
-"prevent lockout."
+"Please generate new recovery codes in the preferences immediately to prevent "
+"lockout."
 msgstr "يرجى إنشاء رموز استرداد جديدة في التفضيلات على الفور لمنع الإغلاق."
 
 #: src/views/config/components/Rename.vue:65
@@ -3328,7 +3355,8 @@ msgid "Please log in."
 msgstr "الرجاء تسجيل الدخول."
 
 #: src/views/certificate/DNSCredential.vue:62
-msgid "Please note that the unit of time configurations below are all in seconds."
+msgid ""
+"Please note that the unit of time configurations below are all in seconds."
 msgstr "يرجى ملاحظة أن تكوين وحدات الوقت أدناه كلها بالثواني."
 
 #: src/views/install/components/InstallView.vue:102
@@ -3388,7 +3416,7 @@ msgstr "تحضير تكوينات Lego"
 msgid "Process Distribution"
 msgstr "توزيع العمليات"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:154
+#: src/views/dashboard/components/PerformanceTablesCard.vue:155
 msgid "Process information"
 msgstr "معلومات العملية"
 
@@ -3421,7 +3449,7 @@ msgid "Read dir failed: {0}"
 msgstr "فشل قراءة الدليل: {0}"
 
 #: src/composables/usePerformanceMetrics.ts:104
-#: src/views/dashboard/components/PerformanceTablesCard.vue:63
+#: src/views/dashboard/components/PerformanceTablesCard.vue:64
 msgid "Read requests"
 msgstr "طلبات القراءة"
 
@@ -3659,7 +3687,7 @@ msgstr "تجديد الشهادة بنجاح"
 msgid "Renew successfully"
 msgstr "تم التجديد بنجاح"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:141
+#: src/views/dashboard/components/PerformanceTablesCard.vue:142
 msgid "Request statistics"
 msgstr "إحصائيات الطلبات"
 
@@ -3693,7 +3721,7 @@ msgstr ""
 "ذاكرة المكتبة المشتركة، والتي سيتم حسابها بشكل متكرر للعديد من العمليات"
 
 #: src/composables/usePerformanceMetrics.ts:109
-#: src/views/dashboard/components/PerformanceTablesCard.vue:68
+#: src/views/dashboard/components/PerformanceTablesCard.vue:69
 msgid "Responses"
 msgstr "الردود"
 
@@ -3879,6 +3907,14 @@ msgstr "امسح رمز الاستجابة السريعة بهاتفك المح
 msgid "SDK"
 msgstr "حزمة تطوير البرمجيات SDK"
 
+#: src/language/constants.ts:62
+msgid "Search"
+msgstr ""
+
+#: src/language/constants.ts:61
+msgid "Search module name"
+msgstr ""
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:109
 msgid "Secret has been copied"
 msgstr "تم نسخ السر"
@@ -3968,19 +4004,19 @@ msgstr "تعيين موفر تحدي HTTP01"
 
 #: src/constants/errors/nginx_log.ts:8
 msgid ""
-"Settings.NginxLogSettings.AccessLogPath is empty, refer to "
-"https://nginxui.com/guide/config-nginx.html for more information"
+"Settings.NginxLogSettings.AccessLogPath is empty, refer to https://nginxui."
+"com/guide/config-nginx.html for more information"
 msgstr ""
-"إعدادات.Settings.NginxLogSettings.AccessLogPath فارغة، راجع "
-"https://nginxui.com/guide/config-nginx.html لمزيد من المعلومات"
+"إعدادات.Settings.NginxLogSettings.AccessLogPath فارغة، راجع https://nginxui."
+"com/guide/config-nginx.html لمزيد من المعلومات"
 
 #: src/constants/errors/nginx_log.ts:7
 msgid ""
-"Settings.NginxLogSettings.ErrorLogPath is empty, refer to "
-"https://nginxui.com/guide/config-nginx.html for more information"
+"Settings.NginxLogSettings.ErrorLogPath is empty, refer to https://nginxui."
+"com/guide/config-nginx.html for more information"
 msgstr ""
-"إعدادات.Settings.NginxLogSettings.ErrorLogPath فارغة، راجع "
-"https://nginxui.com/guide/config-nginx.html لمزيد من المعلومات"
+"إعدادات.Settings.NginxLogSettings.ErrorLogPath فارغة، راجع https://nginxui."
+"com/guide/config-nginx.html لمزيد من المعلومات"
 
 #: src/views/install/components/InstallView.vue:65
 msgid "Setup your Nginx UI"
@@ -4110,8 +4146,14 @@ msgstr "مستقر"
 msgid "Start Restore"
 msgstr "بدء الاستعادة"
 
+#: src/views/dashboard/components/ModulesTable.vue:89
+#: src/views/dashboard/components/ModulesTable.vue:93
+msgid "Static"
+msgstr "ثابت"
+
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/CertificateList/certColumns.tsx:65
+#: src/views/dashboard/components/ModulesTable.vue:97
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:28
 #: src/views/site/site_list/columns.tsx:90 src/views/stream/StreamList.vue:47
@@ -4158,9 +4200,9 @@ msgstr "نجاح"
 #: src/components/SelfCheck/tasks/frontend/websocket.ts:13
 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"
+"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 ""
 "دعم الاتصال مع الخلفية من خلال بروتوكول WebSocket. إذا كنت تستخدم واجهة "
 "Nginx عبر وكيل عكسي لـ Nginx، يرجى الرجوع إلى هذا الرابط لكتابة ملف التكوين "
@@ -4317,11 +4359,10 @@ msgstr "المدخل ليس مفتاح شهادة SSL"
 
 #: src/constants/errors/nginx_log.ts:2
 msgid ""
-"The log path is not under the paths in "
-"settings.NginxSettings.LogDirWhiteList"
+"The log path is not under the paths in settings.NginxSettings.LogDirWhiteList"
 msgstr ""
-"مسار السجل ليس ضمن المسارات الموجودة في "
-"settings.NginxSettings.LogDirWhiteList"
+"مسار السجل ليس ضمن المسارات الموجودة في settings.NginxSettings."
+"LogDirWhiteList"
 
 #: src/views/preference/tabs/OpenAISettings.vue:23
 #: src/views/preference/tabs/OpenAISettings.vue:89
@@ -4333,7 +4374,8 @@ msgstr ""
 "فقط."
 
 #: src/views/preference/tabs/OpenAISettings.vue:90
-msgid "The model used for code completion, if not set, the chat model will be used."
+msgid ""
+"The model used for code completion, if not set, the chat model will be used."
 msgstr ""
 "النموذج المستخدم لإكمال التعليمات البرمجية، إذا لم يتم تعيينه، سيتم استخدام "
 "نموذج الدردشة."
@@ -4397,11 +4439,11 @@ msgstr "عنوان URL غير صالح."
 msgid "The username or password is incorrect"
 msgstr "اسم المستخدم أو كلمة المرور غير صحيحة"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:184
+#: src/views/dashboard/components/PerformanceTablesCard.vue:185
 msgid "Theoretical maximum concurrent connections:"
 msgstr "الحد الأقصى النظري للاتصالات المتزامنة:"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:188
+#: src/views/dashboard/components/PerformanceTablesCard.vue:189
 msgid "Theoretical maximum RPS (Requests Per Second):"
 msgstr "أقصى حد نظري لعدد الطلبات في الثانية (RPS):"
 
@@ -4443,7 +4485,8 @@ msgid "This field should not be empty"
 msgstr "يجب ألا يكون هذا الحقل فارغًا"
 
 #: src/constants/form_errors.ts:6
-msgid "This field should only contain letters, unicode characters, numbers, and -_."
+msgid ""
+"This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "يجب أن يحتوي هذا الحقل على حروف وأحرف يونيكود وأرقام و-_. فقط."
 
 #: src/views/dashboard/NginxDashBoard.vue:150
@@ -4451,8 +4494,8 @@ msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
 msgstr ""
-"توفر هذه الوحدة إحصائيات طلبات Nginx وعدد الاتصالات وما إلى ذلك من "
-"البيانات. بعد تمكينها، يمكنك عرض إحصائيات الأداء"
+"توفر هذه الوحدة إحصائيات طلبات Nginx وعدد الاتصالات وما إلى ذلك من البيانات. "
+"بعد تمكينها، يمكنك عرض إحصائيات الأداء"
 
 #: src/views/certificate/components/RemoveCert.vue:103
 msgid ""
@@ -4489,11 +4532,12 @@ msgid ""
 "This will restore configuration files and database. Nginx UI will restart "
 "after the restoration is complete."
 msgstr ""
-"سيؤدي هذا إلى استعادة ملفات التكوين وقاعدة البيانات. سيعاد تشغيل واجهة "
-"Nginx بعد اكتمال الاستعادة."
+"سيؤدي هذا إلى استعادة ملفات التكوين وقاعدة البيانات. سيعاد تشغيل واجهة Nginx "
+"بعد اكتمال الاستعادة."
 
 #: src/views/environments/list/BatchUpgrader.vue:182
-msgid "This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
+msgid ""
+"This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
 msgstr "سيتم ترقية أو إعادة تثبيت Nginx UI على %{nodeNames} إلى %{version}."
 
 #: src/views/preference/tabs/AuthSettings.vue:124
@@ -4506,7 +4550,7 @@ msgstr "كبح"
 msgid "Tips"
 msgstr "نصائح"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:206
+#: src/views/dashboard/components/PerformanceTablesCard.vue:207
 msgid ""
 "Tips: You can increase the concurrency processing capacity by increasing "
 "worker_processes or worker_connections"
@@ -4543,8 +4587,8 @@ msgstr ""
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:15
 msgid ""
 "To make sure the certification auto-renewal can work normally, we need to "
-"add a location which can proxy the request from authority to backend, and "
-"we need to save this file and reload the Nginx. Are you sure you want to "
+"add a location which can proxy the request from authority to backend, and we "
+"need to save this file and reload the Nginx. Are you sure you want to "
 "continue?"
 msgstr ""
 "لضمان عمل تجديد الشهادة التلقائي بشكل طبيعي، نحتاج إلى إضافة موقع يمكنه "
@@ -4557,9 +4601,9 @@ msgid ""
 "provide an OpenAI-compatible API endpoint, so just set the baseUrl to your "
 "local API."
 msgstr ""
-"لاستخدام نموذج كبير محلي، قم بنشره باستخدام ollama أو vllm أو lmdeploy. "
-"توفر هذه الأدوات نقطة نهاية API متوافقة مع OpenAI، لذا ما عليك سوى تعيين "
-"baseUrl إلى API المحلي الخاص بك."
+"لاستخدام نموذج كبير محلي، قم بنشره باستخدام ollama أو vllm أو lmdeploy. توفر "
+"هذه الأدوات نقطة نهاية API متوافقة مع OpenAI، لذا ما عليك سوى تعيين baseUrl "
+"إلى API المحلي الخاص بك."
 
 #: src/views/dashboard/NginxDashBoard.vue:55
 msgid "Toggle failed"
@@ -4575,12 +4619,12 @@ msgid_plural "Total %{total} items"
 msgstr[0] "إجمالي %{total} عنصر"
 
 #: src/composables/usePerformanceMetrics.ts:94
-#: src/views/dashboard/components/PerformanceTablesCard.vue:53
+#: src/views/dashboard/components/PerformanceTablesCard.vue:54
 msgid "Total connections"
 msgstr "إجمالي الاتصالات"
 
 #: src/composables/usePerformanceMetrics.ts:89
-#: src/views/dashboard/components/PerformanceTablesCard.vue:48
+#: src/views/dashboard/components/PerformanceTablesCard.vue:49
 msgid "Total handshakes"
 msgstr "إجمالي المصافحات"
 
@@ -4593,7 +4637,7 @@ msgid "Total Nginx Processes"
 msgstr "إجمالي عمليات Nginx"
 
 #: src/composables/usePerformanceMetrics.ts:99
-#: src/views/dashboard/components/PerformanceTablesCard.vue:58
+#: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
 msgstr "إجمالي الطلبات"
 
@@ -4622,6 +4666,7 @@ msgid "Two-factor authentication required"
 msgstr "يتطلب المصادقة الثنائية"
 
 #: src/views/certificate/CertificateList/certColumns.tsx:25
+#: src/views/dashboard/components/ModulesTable.vue:84
 #: src/views/nginx_log/NginxLogList.vue:14
 #: src/views/notification/notificationColumns.tsx:9
 #: src/views/preference/components/ExternalNotify/columns.tsx:18
@@ -4726,7 +4771,7 @@ msgstr "يجب ألا يتجاوز طول اسم المستخدم 255 حرفًا
 msgid "Valid"
 msgstr "صالح"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:21
+#: src/views/dashboard/components/PerformanceTablesCard.vue:22
 msgid "Value"
 msgstr "القيمة"
 
@@ -4770,7 +4815,7 @@ msgid "Viewed"
 msgstr "تمت المشاهدة"
 
 #: src/composables/usePerformanceMetrics.ts:114
-#: src/views/dashboard/components/PerformanceTablesCard.vue:73
+#: src/views/dashboard/components/PerformanceTablesCard.vue:74
 msgid "Waiting processes"
 msgstr "عمليات الانتظار"
 
@@ -4788,8 +4833,8 @@ msgid ""
 "you have a valid backup file and security token, and carefully select what "
 "to restore."
 msgstr ""
-"تحذير: ستقوم عملية الاستعادة بالكتابة فوق التكوينات الحالية. تأكد من أن "
-"لديك ملف نسخ احتياطي صالحًا ورمزًا أمنيًا، واختر بعناية ما تريد استعادته."
+"تحذير: ستقوم عملية الاستعادة بالكتابة فوق التكوينات الحالية. تأكد من أن لديك "
+"ملف نسخ احتياطي صالحًا ورمزًا أمنيًا، واختر بعناية ما تريد استعادته."
 
 #: src/views/certificate/DNSCredential.vue:56
 msgid ""
@@ -4799,8 +4844,8 @@ msgstr "سنضيف سجل أو أكثر من سجلات TXT إلى سجلات DN
 
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:140
 msgid ""
-"We will remove the HTTPChallenge configuration from this file and reload "
-"the Nginx. Are you sure you want to continue?"
+"We will remove the HTTPChallenge configuration from this file and reload the "
+"Nginx. Are you sure you want to continue?"
 msgstr ""
 "سنقوم بإزالة تكوين HTTPChallenge من هذا الملف وإعادة تحميل Nginx. هل أنت "
 "متأكد أنك تريد المتابعة؟"
@@ -4890,11 +4935,11 @@ msgstr "نعم"
 
 #: src/views/terminal/Terminal.vue:135
 msgid ""
-"You are accessing this terminal over an insecure HTTP connection on a "
-"non-localhost domain. This may expose sensitive information."
+"You are accessing this terminal over an insecure HTTP connection on a non-"
+"localhost domain. This may expose sensitive information."
 msgstr ""
-"أنت تتصل بهذا الطرف عبر اتصال HTTP غير آمن في نطاق غير محلي. قد يؤدي هذا "
-"إلى كشف معلومات حساسة."
+"أنت تتصل بهذا الطرف عبر اتصال HTTP غير آمن في نطاق غير محلي. قد يؤدي هذا إلى "
+"كشف معلومات حساسة."
 
 #: src/views/system/Upgrade.vue:224
 msgid "You are using the latest version"
@@ -4919,7 +4964,8 @@ msgid ""
 msgstr "لم تقم بتكوين إعدادات Webauthn، لذا لا يمكنك إضافة مفتاح مرور."
 
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:81
-msgid "You have not enabled 2FA yet. Please enable 2FA to generate recovery codes."
+msgid ""
+"You have not enabled 2FA yet. Please enable 2FA to generate recovery codes."
 msgstr ""
 "لم تقم بتمكين المصادقة الثنائية بعد. يرجى تمكين المصادقة الثنائية لإنشاء "
 "رموز الاسترداد."
@@ -4947,12 +4993,12 @@ msgstr "مفاتيح المرور الخاصة بك"
 
 #~ msgid ""
 #~ "Check if /var/run/docker.sock exists. If you are using Nginx UI Official "
-#~ "Docker Image, please make sure the docker socket is mounted like this: `-v "
-#~ "/var/run/docker.sock:/var/run/docker.sock`."
+#~ "Docker Image, please make sure the docker socket is mounted like this: `-"
+#~ "v /var/run/docker.sock:/var/run/docker.sock`."
 #~ msgstr ""
 #~ "تحقق مما إذا كان /var/run/docker.sock موجودًا. إذا كنت تستخدم صورة Docker "
-#~ "الرسمية لـ Nginx UI، يرجى التأكد من أن مقبس Docker مثبت بهذه الطريقة: `-v "
-#~ "/var/run/docker.sock:/var/run/docker.sock`."
+#~ "الرسمية لـ Nginx UI، يرجى التأكد من أن مقبس Docker مثبت بهذه الطريقة: `-"
+#~ "v /var/run/docker.sock:/var/run/docker.sock`."
 
 #~ msgid "Check if the nginx access log path exists"
 #~ msgstr "تحقق مما إذا كان مسار سجل الوصول لـ nginx موجودًا"
@@ -5002,8 +5048,8 @@ msgstr "مفاتيح المرور الخاصة بك"
 
 #, fuzzy
 #~ msgid ""
-#~ "When you enable/disable, delete, or save this stream, the nodes set in the "
-#~ "Node Group and the nodes selected below will be synchronized."
+#~ "When you enable/disable, delete, or save this stream, the nodes set in "
+#~ "the Node Group and the nodes selected below will be synchronized."
 #~ msgstr ""
 #~ "عند تفعيل/تعطيل، حذف، أو حفظ هذا الموقع، سيتم مزامنة العقد المحددة في فئة "
 #~ "الموقع والعقد المحددة أدناه."
@@ -5070,12 +5116,15 @@ msgstr "مفاتيح المرور الخاصة بك"
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgstr "يرجى ترقية واجهة Nginx البعيدة إلى أحدث إصدار"
 
-#~ msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: %{resp}"
+#~ msgid ""
+#~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
+#~ "%{resp}"
 #~ msgstr ""
 #~ "فشل إعادة تسمية %{orig_path} إلى %{new_path} على %{env_name}، الاستجابة: "
 #~ "%{resp}"
 
-#~ msgid "Rename Site %{site} to %{new_site} on %{node} error, response: %{resp}"
+#~ msgid ""
+#~ "Rename Site %{site} to %{new_site} on %{node} error, response: %{resp}"
 #~ msgstr ""
 #~ "خطأ في إعادة تسمية الموقع %{site} إلى %{new_site} على %{node}، الاستجابة: "
 #~ "%{resp}"
@@ -5090,18 +5139,20 @@ msgstr "مفاتيح المرور الخاصة بك"
 #~ "فشل مزامنة الشهادة %{cert_name} إلى %{env_name}، يرجى ترقية واجهة Nginx "
 #~ "البعيدة إلى أحدث إصدار"
 
-#~ msgid "Sync Certificate %{cert_name} to %{env_name} failed, response: %{resp}"
+#~ msgid ""
+#~ "Sync Certificate %{cert_name} to %{env_name} failed, response: %{resp}"
 #~ msgstr "فشل مزامنة الشهادة %{cert_name} إلى %{env_name}، الاستجابة: %{resp}"
 
 #~ msgid "Sync config %{config_name} to %{env_name} failed, response: %{resp}"
-#~ msgstr "فشل مزامنة التكوين %{config_name} إلى %{env_name}، الاستجابة: %{resp}"
+#~ msgstr ""
+#~ "فشل مزامنة التكوين %{config_name} إلى %{env_name}، الاستجابة: %{resp}"
 
 #~ msgid "Target"
 #~ msgstr "الهدف"
 
 #~ msgid ""
-#~ "If you lose your mobile phone, you can use the recovery code to reset your "
-#~ "2FA."
+#~ "If you lose your mobile phone, you can use the recovery code to reset "
+#~ "your 2FA."
 #~ msgstr ""
 #~ "إذا فقدت هاتفك المحمول، يمكنك استخدام رمز الاسترداد لإعادة تعيين المصادقة "
 #~ "الثنائية."
@@ -5109,7 +5160,8 @@ msgstr "مفاتيح المرور الخاصة بك"
 #~ msgid "Recovery Code:"
 #~ msgstr "رمز الاسترداد:"
 
-#~ msgid "The recovery code is only displayed once, please save it in a safe place."
+#~ msgid ""
+#~ "The recovery code is only displayed once, please save it in a safe place."
 #~ msgstr "رمز الاسترداد يُعرض مرة واحدة فقط، يرجى حفظه في مكان آمن."
 
 #~ msgid "Can't scan? Use text key binding"
@@ -5125,4 +5177,5 @@ msgstr "مفاتيح المرور الخاصة بك"
 #~ msgstr "اسم المستخدم أو كلمة المرور غير صحيحة"
 
 #~ msgid "Too many login failed attempts, please try again later"
-#~ msgstr "عدد كبير جدًا من محاولات تسجيل الدخول الفاشلة، يرجى المحاولة مرة أخرى لاحقًا"
+#~ msgstr ""
+#~ "عدد كبير جدًا من محاولات تسجيل الدخول الفاشلة، يرجى المحاولة مرة أخرى لاحقًا"

+ 3 - 0
app/src/language/constants.ts

@@ -57,4 +57,7 @@ export const msg = [
 
   $gettext('All Recovery Codes Have Been Used'),
   $gettext('Please generate new recovery codes in the preferences immediately to prevent lockout.'),
+
+  $gettext('Search module name'),
+  $gettext('Search'),
 ]

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 221 - 157
app/src/language/de_DE/app.po


+ 67 - 29
app/src/language/en/app.po

@@ -129,7 +129,7 @@ msgid "Action"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:84
-#: src/views/dashboard/components/PerformanceTablesCard.vue:43
+#: src/views/dashboard/components/PerformanceTablesCard.vue:44
 msgid "Active connections"
 msgstr ""
 
@@ -341,7 +341,7 @@ msgstr ""
 msgid "Auto"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:200
+#: src/views/dashboard/components/PerformanceTablesCard.vue:201
 msgid "auto = CPU cores"
 msgstr ""
 
@@ -479,7 +479,7 @@ msgid "Cache loader processing time threshold"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:139
-#: src/views/dashboard/components/PerformanceTablesCard.vue:94
+#: src/views/dashboard/components/PerformanceTablesCard.vue:95
 msgid "Cache manager processes"
 msgstr ""
 
@@ -509,7 +509,7 @@ msgid "CADir"
 msgstr ""
 
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:43
-#: src/views/dashboard/components/PerformanceTablesCard.vue:190
+#: src/views/dashboard/components/PerformanceTablesCard.vue:191
 msgid ""
 "Calculated based on worker_processes * worker_connections. Actual "
 "performance depends on hardware, configuration, and workload"
@@ -869,7 +869,7 @@ msgstr ""
 msgid "Configuration History"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:167
+#: src/views/dashboard/components/PerformanceTablesCard.vue:168
 msgid "Configuration information"
 msgstr ""
 
@@ -1368,6 +1368,11 @@ msgstr ""
 msgid "Duplicate to local successfully"
 msgstr ""
 
+#: src/views/dashboard/components/ModulesTable.vue:88
+#: src/views/dashboard/components/ModulesTable.vue:93
+msgid "Dynamic"
+msgstr ""
+
 #: src/components/StdDesign/StdDetail/StdDetail.vue:110
 msgid "Edit"
 msgstr ""
@@ -1385,7 +1390,7 @@ msgstr ""
 msgid "Edit Site"
 msgstr ""
 
-#: src/routes/modules/streams.ts:19
+#: src/routes/modules/streams.ts:20
 msgid "Edit Stream"
 msgstr ""
 
@@ -2090,7 +2095,7 @@ msgstr ""
 msgid "Indexing..."
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:15
+#: src/views/dashboard/components/PerformanceTablesCard.vue:16
 msgid "Indicator"
 msgstr ""
 
@@ -2322,6 +2327,11 @@ msgstr ""
 msgid "Load successfully"
 msgstr ""
 
+#: src/views/dashboard/components/ModulesTable.vue:101
+#: src/views/dashboard/components/ModulesTable.vue:106
+msgid "Loaded"
+msgstr ""
+
 #: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:313
 msgid "Loader Files"
 msgstr ""
@@ -2454,7 +2464,7 @@ msgstr ""
 msgid "Manual"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:201
+#: src/views/dashboard/components/PerformanceTablesCard.vue:202
 msgid "manually set"
 msgstr ""
 
@@ -2463,7 +2473,7 @@ msgid "Master"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:134
-#: src/views/dashboard/components/PerformanceTablesCard.vue:89
+#: src/views/dashboard/components/PerformanceTablesCard.vue:90
 msgid "Master process"
 msgstr ""
 
@@ -2497,7 +2507,7 @@ msgid "Maximum number of concurrent connections"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:174
-#: src/views/dashboard/components/PerformanceTablesCard.vue:125
+#: src/views/dashboard/components/PerformanceTablesCard.vue:126
 msgid "Maximum number of connections per worker process"
 msgstr ""
 
@@ -2505,7 +2515,7 @@ msgstr ""
 msgid "Maximum total size of the cache"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:195
+#: src/views/dashboard/components/PerformanceTablesCard.vue:196
 msgid "Maximum worker process number:"
 msgstr ""
 
@@ -2566,6 +2576,14 @@ msgstr ""
 msgid "Modify Mode"
 msgstr ""
 
+#: src/views/dashboard/components/ModulesTable.vue:28
+msgid "Module"
+msgstr ""
+
+#: src/views/dashboard/components/PerformanceTablesCard.vue:215
+msgid "Modules"
+msgstr ""
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:51
 msgid "Multi-line Directive"
 msgstr ""
@@ -2703,7 +2721,7 @@ msgid "Nginx Control Mode"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:149
-#: src/views/dashboard/components/PerformanceTablesCard.vue:104
+#: src/views/dashboard/components/PerformanceTablesCard.vue:105
 msgid "Nginx CPU usage rate"
 msgstr ""
 
@@ -2740,7 +2758,7 @@ msgid "Nginx Log Directory Whitelist"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:154
-#: src/views/dashboard/components/PerformanceTablesCard.vue:109
+#: src/views/dashboard/components/PerformanceTablesCard.vue:110
 msgid "Nginx Memory usage"
 msgstr ""
 
@@ -2790,7 +2808,7 @@ msgstr ""
 msgid "Nginx test failed: {0}"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:180
+#: src/views/dashboard/components/PerformanceTablesCard.vue:181
 msgid "Nginx theoretical maximum performance"
 msgstr ""
 
@@ -2888,6 +2906,11 @@ msgstr ""
 msgid "Not Found"
 msgstr ""
 
+#: src/views/dashboard/components/ModulesTable.vue:102
+#: src/views/dashboard/components/ModulesTable.vue:106
+msgid "Not Loaded"
+msgstr ""
+
 #: src/components/CertInfo/CertInfo.vue:41
 msgid "Not Valid Before: %{date}"
 msgstr ""
@@ -2931,8 +2954,8 @@ msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:129
 #: src/composables/usePerformanceMetrics.ts:169
-#: src/views/dashboard/components/PerformanceTablesCard.vue:120
-#: src/views/dashboard/components/PerformanceTablesCard.vue:84
+#: src/views/dashboard/components/PerformanceTablesCard.vue:121
+#: src/views/dashboard/components/PerformanceTablesCard.vue:85
 msgid "Number of worker processes"
 msgstr ""
 
@@ -3037,7 +3060,7 @@ msgid "OS:"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:144
-#: src/views/dashboard/components/PerformanceTablesCard.vue:99
+#: src/views/dashboard/components/PerformanceTablesCard.vue:100
 msgid "Other Nginx processes"
 msgstr ""
 
@@ -3297,7 +3320,7 @@ msgstr ""
 msgid "Process Distribution"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:154
+#: src/views/dashboard/components/PerformanceTablesCard.vue:155
 msgid "Process information"
 msgstr ""
 
@@ -3330,7 +3353,7 @@ msgid "Read dir failed: {0}"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:104
-#: src/views/dashboard/components/PerformanceTablesCard.vue:63
+#: src/views/dashboard/components/PerformanceTablesCard.vue:64
 msgid "Read requests"
 msgstr ""
 
@@ -3566,7 +3589,7 @@ msgstr ""
 msgid "Renew successfully"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:141
+#: src/views/dashboard/components/PerformanceTablesCard.vue:142
 msgid "Request statistics"
 msgstr ""
 
@@ -3598,7 +3621,7 @@ msgid ""
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:109
-#: src/views/dashboard/components/PerformanceTablesCard.vue:68
+#: src/views/dashboard/components/PerformanceTablesCard.vue:69
 msgid "Responses"
 msgstr ""
 
@@ -3782,6 +3805,14 @@ msgstr ""
 msgid "SDK"
 msgstr ""
 
+#: src/language/constants.ts:62
+msgid "Search"
+msgstr ""
+
+#: src/language/constants.ts:61
+msgid "Search module name"
+msgstr ""
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:109
 msgid "Secret has been copied"
 msgstr ""
@@ -4007,8 +4038,14 @@ msgstr ""
 msgid "Start Restore"
 msgstr ""
 
+#: src/views/dashboard/components/ModulesTable.vue:89
+#: src/views/dashboard/components/ModulesTable.vue:93
+msgid "Static"
+msgstr ""
+
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/CertificateList/certColumns.tsx:65
+#: src/views/dashboard/components/ModulesTable.vue:97
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:28
 #: src/views/site/site_list/columns.tsx:90 src/views/stream/StreamList.vue:47
@@ -4273,11 +4310,11 @@ msgstr ""
 msgid "The username or password is incorrect"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:184
+#: src/views/dashboard/components/PerformanceTablesCard.vue:185
 msgid "Theoretical maximum concurrent connections:"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:188
+#: src/views/dashboard/components/PerformanceTablesCard.vue:189
 msgid "Theoretical maximum RPS (Requests Per Second):"
 msgstr ""
 
@@ -4371,7 +4408,7 @@ msgstr ""
 msgid "Tips"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:206
+#: src/views/dashboard/components/PerformanceTablesCard.vue:207
 msgid ""
 "Tips: You can increase the concurrency processing capacity by increasing "
 "worker_processes or worker_connections"
@@ -4429,12 +4466,12 @@ msgstr[0] ""
 msgstr[1] ""
 
 #: src/composables/usePerformanceMetrics.ts:94
-#: src/views/dashboard/components/PerformanceTablesCard.vue:53
+#: src/views/dashboard/components/PerformanceTablesCard.vue:54
 msgid "Total connections"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:89
-#: src/views/dashboard/components/PerformanceTablesCard.vue:48
+#: src/views/dashboard/components/PerformanceTablesCard.vue:49
 msgid "Total handshakes"
 msgstr ""
 
@@ -4447,7 +4484,7 @@ msgid "Total Nginx Processes"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:99
-#: src/views/dashboard/components/PerformanceTablesCard.vue:58
+#: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
 msgstr ""
 
@@ -4474,6 +4511,7 @@ msgid "Two-factor authentication required"
 msgstr ""
 
 #: src/views/certificate/CertificateList/certColumns.tsx:25
+#: src/views/dashboard/components/ModulesTable.vue:84
 #: src/views/nginx_log/NginxLogList.vue:14
 #: src/views/notification/notificationColumns.tsx:9
 #: src/views/preference/components/ExternalNotify/columns.tsx:18
@@ -4578,7 +4616,7 @@ msgstr ""
 msgid "Valid"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:21
+#: src/views/dashboard/components/PerformanceTablesCard.vue:22
 msgid "Value"
 msgstr ""
 
@@ -4622,7 +4660,7 @@ msgid "Viewed"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:114
-#: src/views/dashboard/components/PerformanceTablesCard.vue:73
+#: src/views/dashboard/components/PerformanceTablesCard.vue:74
 msgid "Waiting processes"
 msgstr ""
 

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 219 - 160
app/src/language/es/app.po


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 227 - 170
app/src/language/fr_FR/app.po


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 276 - 155
app/src/language/ja_JP/app.po


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 272 - 154
app/src/language/ko_KR/app.po


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

@@ -134,7 +134,7 @@ msgid "Action"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:84
-#: src/views/dashboard/components/PerformanceTablesCard.vue:43
+#: src/views/dashboard/components/PerformanceTablesCard.vue:44
 msgid "Active connections"
 msgstr ""
 
@@ -348,7 +348,7 @@ msgstr ""
 msgid "Auto"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:200
+#: src/views/dashboard/components/PerformanceTablesCard.vue:201
 msgid "auto = CPU cores"
 msgstr ""
 
@@ -488,7 +488,7 @@ msgid "Cache loader processing time threshold"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:139
-#: src/views/dashboard/components/PerformanceTablesCard.vue:94
+#: src/views/dashboard/components/PerformanceTablesCard.vue:95
 msgid "Cache manager processes"
 msgstr ""
 
@@ -518,7 +518,7 @@ msgid "CADir"
 msgstr ""
 
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:43
-#: src/views/dashboard/components/PerformanceTablesCard.vue:190
+#: src/views/dashboard/components/PerformanceTablesCard.vue:191
 msgid "Calculated based on worker_processes * worker_connections. Actual performance depends on hardware, configuration, and workload"
 msgstr ""
 
@@ -844,7 +844,7 @@ msgstr ""
 msgid "Configuration History"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:167
+#: src/views/dashboard/components/PerformanceTablesCard.vue:168
 msgid "Configuration information"
 msgstr ""
 
@@ -1346,6 +1346,11 @@ msgstr ""
 msgid "Duplicate to local successfully"
 msgstr ""
 
+#: src/views/dashboard/components/ModulesTable.vue:88
+#: src/views/dashboard/components/ModulesTable.vue:93
+msgid "Dynamic"
+msgstr ""
+
 #: src/components/StdDesign/StdDetail/StdDetail.vue:110
 msgid "Edit"
 msgstr ""
@@ -1364,7 +1369,7 @@ msgstr ""
 msgid "Edit Site"
 msgstr ""
 
-#: src/routes/modules/streams.ts:19
+#: src/routes/modules/streams.ts:20
 msgid "Edit Stream"
 msgstr ""
 
@@ -2064,7 +2069,7 @@ msgstr ""
 msgid "Indexing..."
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:15
+#: src/views/dashboard/components/PerformanceTablesCard.vue:16
 msgid "Indicator"
 msgstr ""
 
@@ -2293,6 +2298,11 @@ msgstr ""
 msgid "Load successfully"
 msgstr ""
 
+#: src/views/dashboard/components/ModulesTable.vue:101
+#: src/views/dashboard/components/ModulesTable.vue:106
+msgid "Loaded"
+msgstr ""
+
 #: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:313
 msgid "Loader Files"
 msgstr ""
@@ -2422,7 +2432,7 @@ msgstr ""
 msgid "Manual"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:201
+#: src/views/dashboard/components/PerformanceTablesCard.vue:202
 msgid "manually set"
 msgstr ""
 
@@ -2431,7 +2441,7 @@ msgid "Master"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:134
-#: src/views/dashboard/components/PerformanceTablesCard.vue:89
+#: src/views/dashboard/components/PerformanceTablesCard.vue:90
 msgid "Master process"
 msgstr ""
 
@@ -2465,7 +2475,7 @@ msgid "Maximum number of concurrent connections"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:174
-#: src/views/dashboard/components/PerformanceTablesCard.vue:125
+#: src/views/dashboard/components/PerformanceTablesCard.vue:126
 msgid "Maximum number of connections per worker process"
 msgstr ""
 
@@ -2473,7 +2483,7 @@ msgstr ""
 msgid "Maximum total size of the cache"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:195
+#: src/views/dashboard/components/PerformanceTablesCard.vue:196
 msgid "Maximum worker process number:"
 msgstr ""
 
@@ -2534,6 +2544,14 @@ msgstr ""
 msgid "Modify Mode"
 msgstr ""
 
+#: src/views/dashboard/components/ModulesTable.vue:28
+msgid "Module"
+msgstr ""
+
+#: src/views/dashboard/components/PerformanceTablesCard.vue:215
+msgid "Modules"
+msgstr ""
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:51
 msgid "Multi-line Directive"
 msgstr ""
@@ -2674,7 +2692,7 @@ msgid "Nginx Control Mode"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:149
-#: src/views/dashboard/components/PerformanceTablesCard.vue:104
+#: src/views/dashboard/components/PerformanceTablesCard.vue:105
 msgid "Nginx CPU usage rate"
 msgstr ""
 
@@ -2712,7 +2730,7 @@ msgid "Nginx Log Directory Whitelist"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:154
-#: src/views/dashboard/components/PerformanceTablesCard.vue:109
+#: src/views/dashboard/components/PerformanceTablesCard.vue:110
 msgid "Nginx Memory usage"
 msgstr ""
 
@@ -2764,7 +2782,7 @@ msgstr ""
 msgid "Nginx test failed: {0}"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:180
+#: src/views/dashboard/components/PerformanceTablesCard.vue:181
 msgid "Nginx theoretical maximum performance"
 msgstr ""
 
@@ -2860,6 +2878,11 @@ msgstr ""
 msgid "Not Found"
 msgstr ""
 
+#: src/views/dashboard/components/ModulesTable.vue:102
+#: src/views/dashboard/components/ModulesTable.vue:106
+msgid "Not Loaded"
+msgstr ""
+
 #: src/components/CertInfo/CertInfo.vue:41
 msgid "Not Valid Before: %{date}"
 msgstr ""
@@ -2901,8 +2924,8 @@ msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:129
 #: src/composables/usePerformanceMetrics.ts:169
-#: src/views/dashboard/components/PerformanceTablesCard.vue:120
-#: src/views/dashboard/components/PerformanceTablesCard.vue:84
+#: src/views/dashboard/components/PerformanceTablesCard.vue:121
+#: src/views/dashboard/components/PerformanceTablesCard.vue:85
 msgid "Number of worker processes"
 msgstr ""
 
@@ -3006,7 +3029,7 @@ msgid "OS:"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:144
-#: src/views/dashboard/components/PerformanceTablesCard.vue:99
+#: src/views/dashboard/components/PerformanceTablesCard.vue:100
 msgid "Other Nginx processes"
 msgstr ""
 
@@ -3254,7 +3277,7 @@ msgstr ""
 msgid "Process Distribution"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:154
+#: src/views/dashboard/components/PerformanceTablesCard.vue:155
 msgid "Process information"
 msgstr ""
 
@@ -3288,7 +3311,7 @@ msgid "Read dir failed: {0}"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:104
-#: src/views/dashboard/components/PerformanceTablesCard.vue:63
+#: src/views/dashboard/components/PerformanceTablesCard.vue:64
 msgid "Read requests"
 msgstr ""
 
@@ -3522,7 +3545,7 @@ msgstr ""
 msgid "Renew successfully"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:141
+#: src/views/dashboard/components/PerformanceTablesCard.vue:142
 msgid "Request statistics"
 msgstr ""
 
@@ -3552,7 +3575,7 @@ msgid "Resident Set Size: Actual memory resident in physical memory, including a
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:109
-#: src/views/dashboard/components/PerformanceTablesCard.vue:68
+#: src/views/dashboard/components/PerformanceTablesCard.vue:69
 msgid "Responses"
 msgstr ""
 
@@ -3735,6 +3758,14 @@ msgstr ""
 msgid "SDK"
 msgstr ""
 
+#: src/language/constants.ts:62
+msgid "Search"
+msgstr ""
+
+#: src/language/constants.ts:61
+msgid "Search module name"
+msgstr ""
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:109
 msgid "Secret has been copied"
 msgstr ""
@@ -3957,8 +3988,14 @@ msgstr ""
 msgid "Start Restore"
 msgstr ""
 
+#: src/views/dashboard/components/ModulesTable.vue:89
+#: src/views/dashboard/components/ModulesTable.vue:93
+msgid "Static"
+msgstr ""
+
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/CertificateList/certColumns.tsx:65
+#: src/views/dashboard/components/ModulesTable.vue:97
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:28
 #: src/views/site/site_list/columns.tsx:90
@@ -4208,11 +4245,11 @@ msgstr ""
 msgid "The username or password is incorrect"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:184
+#: src/views/dashboard/components/PerformanceTablesCard.vue:185
 msgid "Theoretical maximum concurrent connections:"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:188
+#: src/views/dashboard/components/PerformanceTablesCard.vue:189
 msgid "Theoretical maximum RPS (Requests Per Second):"
 msgstr ""
 
@@ -4291,7 +4328,7 @@ msgstr ""
 msgid "Tips"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:206
+#: src/views/dashboard/components/PerformanceTablesCard.vue:207
 msgid "Tips: You can increase the concurrency processing capacity by increasing worker_processes or worker_connections"
 msgstr ""
 
@@ -4335,12 +4372,12 @@ msgstr[0] ""
 msgstr[1] ""
 
 #: src/composables/usePerformanceMetrics.ts:94
-#: src/views/dashboard/components/PerformanceTablesCard.vue:53
+#: src/views/dashboard/components/PerformanceTablesCard.vue:54
 msgid "Total connections"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:89
-#: src/views/dashboard/components/PerformanceTablesCard.vue:48
+#: src/views/dashboard/components/PerformanceTablesCard.vue:49
 msgid "Total handshakes"
 msgstr ""
 
@@ -4353,7 +4390,7 @@ msgid "Total Nginx Processes"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:99
-#: src/views/dashboard/components/PerformanceTablesCard.vue:58
+#: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
 msgstr ""
 
@@ -4378,6 +4415,7 @@ msgid "Two-factor authentication required"
 msgstr ""
 
 #: src/views/certificate/CertificateList/certColumns.tsx:25
+#: src/views/dashboard/components/ModulesTable.vue:84
 #: src/views/nginx_log/NginxLogList.vue:14
 #: src/views/notification/notificationColumns.tsx:9
 #: src/views/preference/components/ExternalNotify/columns.tsx:18
@@ -4486,7 +4524,7 @@ msgstr ""
 msgid "Valid"
 msgstr ""
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:21
+#: src/views/dashboard/components/PerformanceTablesCard.vue:22
 msgid "Value"
 msgstr ""
 
@@ -4530,7 +4568,7 @@ msgid "Viewed"
 msgstr ""
 
 #: src/composables/usePerformanceMetrics.ts:114
-#: src/views/dashboard/components/PerformanceTablesCard.vue:73
+#: src/views/dashboard/components/PerformanceTablesCard.vue:74
 msgid "Waiting processes"
 msgstr ""
 

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 223 - 164
app/src/language/pt_PT/app.po


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 220 - 166
app/src/language/ru_RU/app.po


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 225 - 165
app/src/language/tr_TR/app.po


+ 222 - 171
app/src/language/uk_UA/app.po

@@ -4,11 +4,11 @@ msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "PO-Revision-Date: 2025-04-16 15:12+0000\n"
 "Last-Translator: sergio_from_tauri <dedysobr@gmail.com>\n"
-"Language-Team: Ukrainian "
-"<https://weblate.nginxui.com/projects/nginx-ui/frontend/uk/>\n"
+"Language-Team: Ukrainian <https://weblate.nginxui.com/projects/nginx-ui/"
+"frontend/uk/>\n"
 "Language: uk_UA\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
@@ -17,8 +17,8 @@ msgstr ""
 #: src/language/generate.ts:40
 msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
 msgstr ""
-"[Nginx UI] Користувач ACME: %{name}, Електронна пошта: %{email}, Каталог "
-"CA: %{caDir}"
+"[Nginx UI] Користувач ACME: %{name}, Електронна пошта: %{email}, Каталог CA: "
+"%{caDir}"
 
 #: src/language/generate.ts:26
 msgid "[Nginx UI] Backing up current certificate for later revocation"
@@ -35,10 +35,11 @@ msgid "[Nginx UI] Certificate successfully revoked"
 msgstr "[Nginx UI] Сертифікат успішно відкликано"
 
 #: src/language/generate.ts:27
-msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgid ""
+"[Nginx UI] Certificate was used for server, reloading server TLS certificate"
 msgstr ""
-"[Nginx UI] Сертифікат використовувався для сервера, перезавантаження "
-"TLS-сертифіката сервера"
+"[Nginx UI] Сертифікат використовувався для сервера, перезавантаження TLS-"
+"сертифіката сервера"
 
 #: src/language/generate.ts:41
 msgid "[Nginx UI] Creating client facilitates communication with the CA server"
@@ -150,7 +151,7 @@ msgid "Action"
 msgstr "Дія"
 
 #: src/composables/usePerformanceMetrics.ts:84
-#: src/views/dashboard/components/PerformanceTablesCard.vue:43
+#: src/views/dashboard/components/PerformanceTablesCard.vue:44
 msgid "Active connections"
 msgstr "Активні з’єднання"
 
@@ -210,7 +211,8 @@ msgstr "Розширений режим"
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:99
 msgid "Afterwards, refresh this page and click add passkey again."
-msgstr "Після цього оновіть цю сторінку та натисніть «Додати ключ доступу» знову."
+msgstr ""
+"Після цього оновіть цю сторінку та натисніть «Додати ключ доступу» знову."
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:115
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
@@ -366,7 +368,7 @@ msgstr "Автор"
 msgid "Auto"
 msgstr "Автоматичний"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:200
+#: src/views/dashboard/components/PerformanceTablesCard.vue:201
 msgid "auto = CPU cores"
 msgstr "Auto = CPU ядра"
 
@@ -417,7 +419,8 @@ msgstr "Резервна копія"
 
 #: src/components/SystemRestore/SystemRestoreContent.vue:155
 msgid "Backup file integrity check failed, it may have been tampered with"
-msgstr "Перевірка цілісності резервного файлу не вдалася, можливо, його було змінено"
+msgstr ""
+"Перевірка цілісності резервного файлу не вдалася, можливо, його було змінено"
 
 #: src/constants/errors/backup.ts:41
 msgid "Backup file not found: {0}"
@@ -497,14 +500,15 @@ msgstr "Кеш"
 
 #: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:178
 msgid "Cache items not accessed within this time will be removed"
-msgstr "Елементи кешу, до яких не було звернень протягом цього часу, будуть видалені"
+msgstr ""
+"Елементи кешу, до яких не було звернень протягом цього часу, будуть видалені"
 
 #: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:350
 msgid "Cache loader processing time threshold"
 msgstr "Порог часу обробки завантажувача кешу"
 
 #: src/composables/usePerformanceMetrics.ts:139
-#: src/views/dashboard/components/PerformanceTablesCard.vue:94
+#: src/views/dashboard/components/PerformanceTablesCard.vue:95
 msgid "Cache manager processes"
 msgstr "Процеси керування кешем"
 
@@ -534,7 +538,7 @@ msgid "CADir"
 msgstr "CADir"
 
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:43
-#: src/views/dashboard/components/PerformanceTablesCard.vue:190
+#: src/views/dashboard/components/PerformanceTablesCard.vue:191
 msgid ""
 "Calculated based on worker_processes * worker_connections. Actual "
 "performance depends on hardware, configuration, and workload"
@@ -560,7 +564,8 @@ msgstr "Скасувати"
 
 #: src/constants/errors/user.ts:11
 msgid "Cannot change initial user password in demo mode"
-msgstr "Не вдається змінити початковий пароль користувача в демонстраційному режимі"
+msgstr ""
+"Не вдається змінити початковий пароль користувача в демонстраційному режимі"
 
 #: src/components/ConfigHistory/DiffViewer.vue:67
 #: src/components/ConfigHistory/DiffViewer.vue:84
@@ -699,24 +704,24 @@ msgstr "Перевірте ще раз"
 #: src/language/generate.ts:17
 msgid ""
 "Check if /var/run/docker.sock exists. If you are using Nginx UI Official "
-"Docker Image, please make sure the docker socket is mounted like this: `-v "
-"/var/run/docker.sock:/var/run/docker.sock`. Nginx UI official image uses "
-"/var/run/docker.sock to communicate with the host Docker Engine via Docker "
-"Client API. This feature is used to control Nginx in another container and "
-"perform container replacement rather than binary replacement during OTA "
-"upgrades of Nginx UI to ensure container dependencies are also upgraded. If "
-"you don't need this feature, please add the environment variable "
+"Docker Image, please make sure the docker socket is mounted like this: `-v /"
+"var/run/docker.sock:/var/run/docker.sock`. Nginx UI official image uses /var/"
+"run/docker.sock to communicate with the host Docker Engine via Docker Client "
+"API. This feature is used to control Nginx in another container and perform "
+"container replacement rather than binary replacement during OTA upgrades of "
+"Nginx UI to ensure container dependencies are also upgraded. If you don't "
+"need this feature, please add the environment variable "
 "NGINX_UI_IGNORE_DOCKER_SOCKET=true to the container."
 msgstr ""
 "Перевірте, чи існує /var/run/docker.sock. Якщо ви використовуєте офіційний "
 "образ Docker Nginx UI, переконайтеся, що сокет Docker змонтовано таким "
-"чином: `-v /var/run/docker.sock:/var/run/docker.sock`. Офіційний образ "
-"Nginx UI використовує /var/run/docker.sock для зв’язку з Docker Engine "
-"хоста через API Docker Client. Ця функція використовується для керування "
-"Nginx в іншому контейнері та виконання заміни контейнера замість заміни "
-"бінарного файлу під час OTA-оновлень Nginx UI, щоб гарантувати, що "
-"залежності контейнера також оновлюються. Якщо вам не потрібна ця функція, "
-"додайте змінну середовища NGINX_UI_IGNORE_DOCKER_SOCKET=true до контейнера."
+"чином: `-v /var/run/docker.sock:/var/run/docker.sock`. Офіційний образ Nginx "
+"UI використовує /var/run/docker.sock для зв’язку з Docker Engine хоста через "
+"API Docker Client. Ця функція використовується для керування Nginx в іншому "
+"контейнері та виконання заміни контейнера замість заміни бінарного файлу під "
+"час OTA-оновлень Nginx UI, щоб гарантувати, що залежності контейнера також "
+"оновлюються. Якщо вам не потрібна ця функція, додайте змінну середовища "
+"NGINX_UI_IGNORE_DOCKER_SOCKET=true до контейнера."
 
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:14
 msgid ""
@@ -728,19 +733,19 @@ msgstr ""
 
 #: src/language/generate.ts:45
 msgid ""
-"Check if the nginx access log path exists. By default, this path is "
-"obtained from 'nginx -V'. If it cannot be obtained or the obtained path "
-"does not point to a valid, existing file, an error will be reported. In "
-"this case, you need to modify the configuration file to specify the access "
-"log path.Refer to the docs for more details: "
-"https://nginxui.com/zh_CN/guide/config-nginx.html#accesslogpath"
+"Check if the nginx access log path exists. By default, this path is obtained "
+"from 'nginx -V'. If it cannot be obtained or the obtained path does not "
+"point to a valid, existing file, an error will be reported. In this case, "
+"you need to modify the configuration file to specify the access log path."
+"Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-"
+"nginx.html#accesslogpath"
 msgstr ""
-"Перевірте, чи існує шлях до журналу доступу nginx. За замовчуванням цей "
-"шлях отримується з 'nginx -V'. Якщо його не вдається отримати або отриманий "
-"шлях не вказує на дійсний існуючий файл, буде повідомлено про помилку. У "
-"цьому випадку вам потрібно змінити файл конфігурації, щоб вказати шлях до "
-"журналу доступу. Докладніше див. у документації: "
-"https://nginxui.com/zh_CN/guide/config-nginx.html#accesslogpath"
+"Перевірте, чи існує шлях до журналу доступу nginx. За замовчуванням цей шлях "
+"отримується з 'nginx -V'. Якщо його не вдається отримати або отриманий шлях "
+"не вказує на дійсний існуючий файл, буде повідомлено про помилку. У цьому "
+"випадку вам потрібно змінити файл конфігурації, щоб вказати шлях до журналу "
+"доступу. Докладніше див. у документації: https://nginxui.com/zh_CN/guide/"
+"config-nginx.html#accesslogpath"
 
 #: src/language/generate.ts:34
 msgid "Check if the nginx configuration directory exists"
@@ -755,30 +760,30 @@ msgid ""
 "Check if the nginx error log path exists. By default, this path is obtained "
 "from 'nginx -V'. If it cannot be obtained or the obtained path does not "
 "point to a valid, existing file, an error will be reported. In this case, "
-"you need to modify the configuration file to specify the error log "
-"path.Refer to the docs for more details: "
-"https://nginxui.com/zh_CN/guide/config-nginx.html#errorlogpath"
+"you need to modify the configuration file to specify the error log path."
+"Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-"
+"nginx.html#errorlogpath"
 msgstr ""
-"Перевірте, чи існує шлях до журналу помилок nginx. За замовчуванням цей "
-"шлях отримується з 'nginx -V'. Якщо його не вдається отримати або отриманий "
-"шлях не вказує на дійсний існуючий файл, буде повідомлено про помилку. У "
-"цьому випадку вам потрібно змінити файл конфігурації, щоб вказати шлях до "
-"журналу помилок. Докладніше див. у документації: "
-"https://nginxui.com/zh_CN/guide/config-nginx.html#errorlogpath"
+"Перевірте, чи існує шлях до журналу помилок nginx. За замовчуванням цей шлях "
+"отримується з 'nginx -V'. Якщо його не вдається отримати або отриманий шлях "
+"не вказує на дійсний існуючий файл, буде повідомлено про помилку. У цьому "
+"випадку вам потрібно змінити файл конфігурації, щоб вказати шлях до журналу "
+"помилок. Докладніше див. у документації: https://nginxui.com/zh_CN/guide/"
+"config-nginx.html#errorlogpath"
 
 #: src/language/generate.ts:10
 msgid ""
 "Check if the nginx PID path exists. By default, this path is obtained from "
 "'nginx -V'. If it cannot be obtained, an error will be reported. In this "
 "case, you need to modify the configuration file to specify the Nginx PID "
-"path.Refer to the docs for more details: "
-"https://nginxui.com/zh_CN/guide/config-nginx.html#pidpath"
+"path.Refer to the docs for more details: https://nginxui.com/zh_CN/guide/"
+"config-nginx.html#pidpath"
 msgstr ""
-"Перевірте, чи існує шлях до PID Nginx. За замовчуванням цей шлях "
-"отримується з команди 'nginx -V'. Якщо його не вдається отримати, буде "
-"повідомлено про помилку. У цьому випадку вам потрібно змінити "
-"конфігураційний файл, щоб вказати шлях до PID Nginx. Докладніше див. у "
-"документації: https://nginxui.com/zh_CN/guide/config-nginx.html#pidpath"
+"Перевірте, чи існує шлях до PID Nginx. За замовчуванням цей шлях отримується "
+"з команди 'nginx -V'. Якщо його не вдається отримати, буде повідомлено про "
+"помилку. У цьому випадку вам потрібно змінити конфігураційний файл, щоб "
+"вказати шлях до PID Nginx. Докладніше див. у документації: https://nginxui."
+"com/zh_CN/guide/config-nginx.html#pidpath"
 
 #: src/language/generate.ts:22
 msgid "Check if the nginx.conf includes the conf.d directory"
@@ -802,8 +807,8 @@ msgstr ""
 
 #: src/language/generate.ts:23
 msgid ""
-"Check if the streams-available and streams-enabled directories are under "
-"the nginx configuration directory"
+"Check if the streams-available and streams-enabled directories are under the "
+"nginx configuration directory"
 msgstr ""
 "Перевірте, чи каталоги streams-available та streams-enabled знаходяться в "
 "каталозі конфігурації nginx"
@@ -929,7 +934,7 @@ msgstr "Файл конфігурації успішно протестован
 msgid "Configuration History"
 msgstr "Історія конфігурації"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:167
+#: src/views/dashboard/components/PerformanceTablesCard.vue:168
 msgid "Configuration information"
 msgstr "Інформація про конфігурацію"
 
@@ -1092,8 +1097,8 @@ msgstr ""
 "\"Вірність\" означає точність до змісту та наміру оригінального тексту;\n"
 "\"Плавність\" означає, що переклад має бути зрозумілим та легким для "
 "сприйняття;\n"
-"\"Витонченість\" означає прагнення до культурної естетики перекладу та "
-"краси мови.\n"
+"\"Витонченість\" означає прагнення до культурної естетики перекладу та краси "
+"мови.\n"
 "Мета полягає у створенні перекладу, який був би вірним духу оригіналу,\n"
 "а також відповідав цільовій мові, культурі та естетичним уподобанням "
 "читачів.\n"
@@ -1134,7 +1139,8 @@ msgstr "Користувацький"
 msgid ""
 "Customize the name of local node to be displayed in the environment "
 "indicator."
-msgstr "Налаштуйте назву локального вузла для відображення в індикаторі середовища."
+msgstr ""
+"Налаштуйте назву локального вузла для відображення в індикаторі середовища."
 
 #: src/routes/modules/dashboard.ts:10 src/views/config/ConfigEditor.vue:110
 #: src/views/config/ConfigEditor.vue:161 src/views/config/ConfigList.vue:67
@@ -1151,7 +1157,8 @@ msgstr "Розшифрування не вдалося"
 
 #: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:150
 msgid "Define shared memory zone name and size, e.g. proxy_cache:10m"
-msgstr "Вкажіть назву та розмір зони спільної пам'яті, наприклад proxy_cache:10m"
+msgstr ""
+"Вкажіть назву та розмір зони спільної пам'яті, наприклад proxy_cache:10m"
 
 #: src/components/NgxConfigEditor/NgxServer.vue:78
 #: src/components/NgxConfigEditor/NgxUpstream.vue:129
@@ -1471,7 +1478,8 @@ msgstr "Домен"
 
 #: src/views/certificate/CertificateEditor.vue:112
 msgid "Domains list is empty, try to reopen Auto Cert for %{config}"
-msgstr "Список доменів порожній, спробуйте знову відкрити Auto Cert для %{config}"
+msgstr ""
+"Список доменів порожній, спробуйте знову відкрити Auto Cert для %{config}"
 
 #: src/language/constants.ts:27
 msgid "Download latest release error"
@@ -1491,9 +1499,8 @@ msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
 msgstr ""
-"Через політику безпеки деяких браузерів ви не можете використовувати "
-"пас-ключі на вебсайтах без HTTPS, окрім випадків, коли сайт працює на "
-"localhost."
+"Через політику безпеки деяких браузерів ви не можете використовувати пас-"
+"ключі на вебсайтах без HTTPS, окрім випадків, коли сайт працює на localhost."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
 #: src/views/site/site_list/SiteList.vue:105
@@ -1507,6 +1514,11 @@ msgstr "Дублювати"
 msgid "Duplicate to local successfully"
 msgstr "Успішно дубльовано локально"
 
+#: src/views/dashboard/components/ModulesTable.vue:88
+#: src/views/dashboard/components/ModulesTable.vue:93
+msgid "Dynamic"
+msgstr "Динамічний"
+
 #: src/components/StdDesign/StdDetail/StdDetail.vue:110
 msgid "Edit"
 msgstr "Редагувати"
@@ -1524,7 +1536,7 @@ msgstr "Редагувати конфігурацію"
 msgid "Edit Site"
 msgstr "Редагувати сайт"
 
-#: src/routes/modules/streams.ts:19
+#: src/routes/modules/streams.ts:20
 msgid "Edit Stream"
 msgstr "Редагувати потік"
 
@@ -2054,8 +2066,8 @@ msgid ""
 "Follow the instructions in the dialog to complete the passkey registration "
 "process."
 msgstr ""
-"Дотримуйтесь інструкцій у діалоговому вікні, щоб завершити процес "
-"реєстрації ключа доступу."
+"Дотримуйтесь інструкцій у діалоговому вікні, щоб завершити процес реєстрації "
+"ключа доступу."
 
 #: src/views/preference/tabs/NodeSettings.vue:42
 #: src/views/preference/tabs/NodeSettings.vue:54
@@ -2199,11 +2211,13 @@ msgstr ""
 msgid ""
 "If you want to automatically revoke the old certificate, please enable this "
 "option."
-msgstr "Якщо ви хочете автоматично відкликати старий сертифікат, увімкніть цю опцію."
+msgstr ""
+"Якщо ви хочете автоматично відкликати старий сертифікат, увімкніть цю опцію."
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:70
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
-msgstr "Якщо ваш браузер підтримує WebAuthn Passkey, з’явиться діалогове вікно."
+msgstr ""
+"Якщо ваш браузер підтримує WebAuthn Passkey, з’явиться діалогове вікно."
 
 #: src/components/AutoCertForm/AutoCertForm.vue:107
 msgid ""
@@ -2238,7 +2252,7 @@ msgstr ""
 msgid "Indexing..."
 msgstr "Індексація..."
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:15
+#: src/views/dashboard/components/PerformanceTablesCard.vue:16
 msgid "Indicator"
 msgstr "Індикатор"
 
@@ -2384,8 +2398,8 @@ msgid ""
 "Keep your recovery codes as safe as your password. We recommend saving them "
 "with a password manager."
 msgstr ""
-"Зберігайте ваші коди відновлення так само надійно, як і пароль. "
-"Рекомендуємо зберігати їх у менеджері паролів."
+"Зберігайте ваші коди відновлення так само надійно, як і пароль. Рекомендуємо "
+"зберігати їх у менеджері паролів."
 
 #: src/views/dashboard/components/ParamsOpt/PerformanceConfig.vue:60
 msgid "Keepalive Timeout"
@@ -2426,7 +2440,8 @@ msgstr "Залиште порожнім, щоб не змінювати"
 
 #: src/views/preference/tabs/OpenAISettings.vue:41
 msgid "Leave blank for the default: https://api.openai.com/"
-msgstr "Залиште порожнім для значення за замовчуванням: https://api.openai.com/"
+msgstr ""
+"Залиште порожнім для значення за замовчуванням: https://api.openai.com/"
 
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:79
 msgid "Leave blank if do not want to modify"
@@ -2474,6 +2489,11 @@ msgstr "Завантажити з налаштувань"
 msgid "Load successfully"
 msgstr "Успішно завантажено"
 
+#: src/views/dashboard/components/ModulesTable.vue:101
+#: src/views/dashboard/components/ModulesTable.vue:106
+msgid "Loaded"
+msgstr "Завантажено"
+
 #: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:313
 msgid "Loader Files"
 msgstr "Файли завантажувача"
@@ -2515,13 +2535,12 @@ msgstr "Журнал"
 #: src/language/generate.ts:25
 msgid ""
 "Log file %{log_path} is not a regular file. If you are using nginx-ui in "
-"docker container, please refer to "
-"https://nginxui.com/zh_CN/guide/config-nginx-log.html for more information."
+"docker container, please refer to https://nginxui.com/zh_CN/guide/config-"
+"nginx-log.html for more information."
 msgstr ""
-"Файл журналу %{log_path} не є звичайним файлом. Якщо ви використовуєте "
-"nginx-ui у контейнері Docker, будь ласка, зверніться до "
-"https://nginxui.com/zh_CN/guide/config-nginx-log.html для отримання "
-"додаткової інформації."
+"Файл журналу %{log_path} не є звичайним файлом. Якщо ви використовуєте nginx-"
+"ui у контейнері Docker, будь ласка, зверніться до https://nginxui.com/zh_CN/"
+"guide/config-nginx-log.html для отримання додаткової інформації."
 
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:64
 msgid "Log List"
@@ -2545,16 +2564,16 @@ msgstr "Logrotate"
 
 #: src/views/preference/tabs/LogrotateSettings.vue:13
 msgid ""
-"Logrotate, by default, is enabled in most mainstream Linux distributions "
-"for users who install Nginx UI on the host machine, so you don't need to "
-"modify the parameters on this page. For users who install Nginx UI using "
-"Docker containers, you can manually enable this option. The crontab task "
-"scheduler of Nginx UI will execute the logrotate command at the interval "
-"you set in minutes."
+"Logrotate, by default, is enabled in most mainstream Linux distributions for "
+"users who install Nginx UI on the host machine, so you don't need to modify "
+"the parameters on this page. For users who install Nginx UI using Docker "
+"containers, you can manually enable this option. The crontab task scheduler "
+"of Nginx UI will execute the logrotate command at the interval you set in "
+"minutes."
 msgstr ""
 "Logrotate за замовчуванням увімкнено у більшості популярних дистрибутивів "
-"Linux для користувачів, які встановлюють Nginx UI безпосередньо на "
-"хост-машині, тому вам не потрібно змінювати параметри на цій сторінці. Для "
+"Linux для користувачів, які встановлюють Nginx UI безпосередньо на хост-"
+"машині, тому вам не потрібно змінювати параметри на цій сторінці. Для "
 "користувачів, які встановлюють Nginx UI за допомогою контейнерів Docker, ви "
 "можете вручну активувати цю опцію. Планувальник завдань crontab у Nginx UI "
 "виконуватиме команду logrotate з інтервалом, який ви встановите у хвилинах."
@@ -2618,7 +2637,7 @@ msgstr "Поріг менеджера"
 msgid "Manual"
 msgstr "Вручну"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:201
+#: src/views/dashboard/components/PerformanceTablesCard.vue:202
 msgid "manually set"
 msgstr "встановлено вручну"
 
@@ -2627,7 +2646,7 @@ msgid "Master"
 msgstr "Головний"
 
 #: src/composables/usePerformanceMetrics.ts:134
-#: src/views/dashboard/components/PerformanceTablesCard.vue:89
+#: src/views/dashboard/components/PerformanceTablesCard.vue:90
 msgid "Master process"
 msgstr "Головний процес"
 
@@ -2661,7 +2680,7 @@ msgid "Maximum number of concurrent connections"
 msgstr "Максимальна кількість одночасних з’єднань"
 
 #: src/composables/usePerformanceMetrics.ts:174
-#: src/views/dashboard/components/PerformanceTablesCard.vue:125
+#: src/views/dashboard/components/PerformanceTablesCard.vue:126
 msgid "Maximum number of connections per worker process"
 msgstr "Максимальна кількість з’єднань на один робочий процес"
 
@@ -2669,7 +2688,7 @@ msgstr "Максимальна кількість з’єднань на оди
 msgid "Maximum total size of the cache"
 msgstr "Максимальний загальний розмір кешу"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:195
+#: src/views/dashboard/components/PerformanceTablesCard.vue:196
 msgid "Maximum worker process number:"
 msgstr "Максимальна кількість робочих процесів:"
 
@@ -2730,6 +2749,14 @@ msgstr "Змінити конфігурацію"
 msgid "Modify Mode"
 msgstr "Режим редагування"
 
+#: src/views/dashboard/components/ModulesTable.vue:28
+msgid "Module"
+msgstr "Модуль"
+
+#: src/views/dashboard/components/PerformanceTablesCard.vue:215
+msgid "Modules"
+msgstr "Модулі"
+
 #: src/components/NgxConfigEditor/directive/DirectiveAdd.vue:51
 msgid "Multi-line Directive"
 msgstr "Багаторядкова директива"
@@ -2867,7 +2894,7 @@ msgid "Nginx Control Mode"
 msgstr "Режим керування Nginx"
 
 #: src/composables/usePerformanceMetrics.ts:149
-#: src/views/dashboard/components/PerformanceTablesCard.vue:104
+#: src/views/dashboard/components/PerformanceTablesCard.vue:105
 msgid "Nginx CPU usage rate"
 msgstr "Рівень використання CPU Nginx"
 
@@ -2904,7 +2931,7 @@ msgid "Nginx Log Directory Whitelist"
 msgstr "Білий список каталогів журналів Nginx"
 
 #: src/composables/usePerformanceMetrics.ts:154
-#: src/views/dashboard/components/PerformanceTablesCard.vue:109
+#: src/views/dashboard/components/PerformanceTablesCard.vue:110
 msgid "Nginx Memory usage"
 msgstr "Використання пам'яті Nginx"
 
@@ -2954,7 +2981,7 @@ msgstr "Команда тестування конфігурації Nginx"
 msgid "Nginx test failed: {0}"
 msgstr "Тест Nginx не пройдено: {0}"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:180
+#: src/views/dashboard/components/PerformanceTablesCard.vue:181
 msgid "Nginx theoretical maximum performance"
 msgstr "Теоретична максимальна продуктивність Nginx"
 
@@ -2968,8 +2995,8 @@ msgstr "Конфігурацію Nginx UI відновлено"
 
 #: src/components/SystemRestore/SystemRestoreContent.vue:336
 msgid ""
-"Nginx UI configuration has been restored and will restart automatically in "
-"a few seconds."
+"Nginx UI configuration has been restored and will restart automatically in a "
+"few seconds."
 msgstr ""
 "Конфігурацію Nginx UI відновлено, і вона автоматично перезавантажиться за "
 "кілька секунд."
@@ -3054,6 +3081,11 @@ msgstr "Не пізніше"
 msgid "Not Found"
 msgstr "Не знайдено"
 
+#: src/views/dashboard/components/ModulesTable.vue:102
+#: src/views/dashboard/components/ModulesTable.vue:106
+msgid "Not Loaded"
+msgstr "Не завантажено"
+
 #: src/components/CertInfo/CertInfo.vue:41
 msgid "Not Valid Before: %{date}"
 msgstr "Не дійсний до: %{date}"
@@ -3101,8 +3133,8 @@ msgstr "Кількість файлів, які обробляються мен
 
 #: src/composables/usePerformanceMetrics.ts:129
 #: src/composables/usePerformanceMetrics.ts:169
-#: src/views/dashboard/components/PerformanceTablesCard.vue:120
-#: src/views/dashboard/components/PerformanceTablesCard.vue:84
+#: src/views/dashboard/components/PerformanceTablesCard.vue:121
+#: src/views/dashboard/components/PerformanceTablesCard.vue:85
 msgid "Number of worker processes"
 msgstr "Кількість робочих процесів"
 
@@ -3209,7 +3241,7 @@ msgid "OS:"
 msgstr "ОС:"
 
 #: src/composables/usePerformanceMetrics.ts:144
-#: src/views/dashboard/components/PerformanceTablesCard.vue:99
+#: src/views/dashboard/components/PerformanceTablesCard.vue:100
 msgid "Other Nginx processes"
 msgstr "Інші процеси Nginx"
 
@@ -3352,7 +3384,8 @@ msgstr "Будь ласка, введіть токен безпеки"
 #: src/components/SystemRestore/SystemRestoreContent.vue:210
 #: src/components/SystemRestore/SystemRestoreContent.vue:287
 msgid "Please enter the security token received during backup"
-msgstr "Будь ласка, введіть токен безпеки, отриманий під час резервного копіювання"
+msgstr ""
+"Будь ласка, введіть токен безпеки, отриманий під час резервного копіювання"
 
 #: src/views/certificate/DNSCredential.vue:53
 msgid ""
@@ -3376,8 +3409,8 @@ msgstr ""
 #: src/components/Notification/notifications.ts:166
 #: src/language/constants.ts:59
 msgid ""
-"Please generate new recovery codes in the preferences immediately to "
-"prevent lockout."
+"Please generate new recovery codes in the preferences immediately to prevent "
+"lockout."
 msgstr ""
 "Будь ласка, негайно згенеруйте нові коди відновлення в налаштуваннях, щоб "
 "уникнути блокування."
@@ -3425,7 +3458,8 @@ msgid "Please log in."
 msgstr "Будь ласка, увійдіть."
 
 #: src/views/certificate/DNSCredential.vue:62
-msgid "Please note that the unit of time configurations below are all in seconds."
+msgid ""
+"Please note that the unit of time configurations below are all in seconds."
 msgstr ""
 "Будь ласка, зверніть увагу, що одиницею виміру часу в наведених нижче "
 "налаштуваннях є секунди."
@@ -3437,8 +3471,7 @@ msgstr "Будь ласка, усуньте всі проблеми перед 
 #: src/views/system/Backup/BackupCreator.vue:107
 msgid "Please save this security token, you will need it for restoration:"
 msgstr ""
-"Будь ласка, збережіть цей токен безпеки, він знадобиться вам для "
-"відновлення:"
+"Будь ласка, збережіть цей токен безпеки, він знадобиться вам для відновлення:"
 
 #: src/components/SystemRestore/SystemRestoreContent.vue:107
 msgid "Please select a backup file"
@@ -3489,7 +3522,7 @@ msgstr "Підготовка конфігурацій Lego"
 msgid "Process Distribution"
 msgstr "Розподіл процесів"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:154
+#: src/views/dashboard/components/PerformanceTablesCard.vue:155
 msgid "Process information"
 msgstr "Інформація про процес"
 
@@ -3522,7 +3555,7 @@ msgid "Read dir failed: {0}"
 msgstr "Не вдалося прочитати каталог: {0}"
 
 #: src/composables/usePerformanceMetrics.ts:104
-#: src/views/dashboard/components/PerformanceTablesCard.vue:63
+#: src/views/dashboard/components/PerformanceTablesCard.vue:64
 msgid "Read requests"
 msgstr "Запити на читання"
 
@@ -3765,7 +3798,7 @@ msgstr "Успішне поновлення сертифіката"
 msgid "Renew successfully"
 msgstr "Оновлення успішне"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:141
+#: src/views/dashboard/components/PerformanceTablesCard.vue:142
 msgid "Request statistics"
 msgstr "Статистика запитів"
 
@@ -3795,12 +3828,12 @@ msgid ""
 "shared library memory, which will be repeated calculated for multiple "
 "processes"
 msgstr ""
-"Розмір резидентного набору: Фактична пам'ять, резидентна у фізичній "
-"пам'яті, включаючи всю пам'ять спільних бібліотек, яка буде повторно "
-"обчислюватися для кількох процесів"
+"Розмір резидентного набору: Фактична пам'ять, резидентна у фізичній пам'яті, "
+"включаючи всю пам'ять спільних бібліотек, яка буде повторно обчислюватися "
+"для кількох процесів"
 
 #: src/composables/usePerformanceMetrics.ts:109
-#: src/views/dashboard/components/PerformanceTablesCard.vue:68
+#: src/views/dashboard/components/PerformanceTablesCard.vue:69
 msgid "Responses"
 msgstr "Відповіді"
 
@@ -3990,6 +4023,14 @@ msgstr ""
 msgid "SDK"
 msgstr "SDK"
 
+#: src/language/constants.ts:62
+msgid "Search"
+msgstr ""
+
+#: src/language/constants.ts:61
+msgid "Search module name"
+msgstr ""
+
 #: src/views/preference/components/AuthSettings/TOTP.vue:109
 msgid "Secret has been copied"
 msgstr "Секрет скопійовано"
@@ -4079,21 +4120,19 @@ msgstr "Налаштування провайдера HTTP01-виклику"
 
 #: src/constants/errors/nginx_log.ts:8
 msgid ""
-"Settings.NginxLogSettings.AccessLogPath is empty, refer to "
-"https://nginxui.com/guide/config-nginx.html for more information"
+"Settings.NginxLogSettings.AccessLogPath is empty, refer to https://nginxui."
+"com/guide/config-nginx.html for more information"
 msgstr ""
-"Settings.NginxLogSettings.AccessLogPath порожній, див. "
-"https://nginxui.com/guide/config-nginx.html для отримання додаткової "
-"інформації"
+"Settings.NginxLogSettings.AccessLogPath порожній, див. https://nginxui.com/"
+"guide/config-nginx.html для отримання додаткової інформації"
 
 #: src/constants/errors/nginx_log.ts:7
 msgid ""
-"Settings.NginxLogSettings.ErrorLogPath is empty, refer to "
-"https://nginxui.com/guide/config-nginx.html for more information"
+"Settings.NginxLogSettings.ErrorLogPath is empty, refer to https://nginxui."
+"com/guide/config-nginx.html for more information"
 msgstr ""
-"Settings.NginxLogSettings.ErrorLogPath порожній, див. "
-"https://nginxui.com/guide/config-nginx.html для отримання додаткової "
-"інформації"
+"Settings.NginxLogSettings.ErrorLogPath порожній, див. https://nginxui.com/"
+"guide/config-nginx.html для отримання додаткової інформації"
 
 #: src/views/install/components/InstallView.vue:65
 msgid "Setup your Nginx UI"
@@ -4169,7 +4208,8 @@ msgstr "Вміст SSL-сертифіката"
 
 #: src/constants/errors/system.ts:8
 msgid "SSL certificate file must be under Nginx configuration directory: {0}"
-msgstr "Файл SSL-сертифіката повинен знаходитися в каталозі конфігурації Nginx: {0}"
+msgstr ""
+"Файл SSL-сертифіката повинен знаходитися в каталозі конфігурації Nginx: {0}"
 
 #: src/constants/errors/system.ts:6
 msgid "SSL certificate file not found"
@@ -4223,8 +4263,14 @@ msgstr "Стабільна"
 msgid "Start Restore"
 msgstr "Почати відновлення"
 
+#: src/views/dashboard/components/ModulesTable.vue:89
+#: src/views/dashboard/components/ModulesTable.vue:93
+msgid "Static"
+msgstr "Статичний"
+
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/CertificateList/certColumns.tsx:65
+#: src/views/dashboard/components/ModulesTable.vue:97
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/site/site_edit/components/RightPanel/Basic.vue:28
 #: src/views/site/site_list/columns.tsx:90 src/views/stream/StreamList.vue:47
@@ -4271,14 +4317,14 @@ msgstr "Успіх"
 #: src/components/SelfCheck/tasks/frontend/websocket.ts:13
 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"
+"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 ""
 "Підтримка зв'язку з бекендом через протокол WebSocket. Якщо ваш Nginx UI "
-"використовується через зворотний проксі Nginx, перегляньте це посилання, "
-"щоб написати відповідний конфігураційний файл: "
-"https://nginxui.com/guide/nginx-proxy-example.html"
+"використовується через зворотний проксі Nginx, перегляньте це посилання, щоб "
+"написати відповідний конфігураційний файл: https://nginxui.com/guide/nginx-"
+"proxy-example.html"
 
 #: src/components/SystemRestore/SystemRestoreContent.vue:197
 #: src/components/SystemRestore/SystemRestoreContent.vue:274
@@ -4432,11 +4478,10 @@ msgstr "Введений текст не є ключем SSL-сертифіка
 
 #: src/constants/errors/nginx_log.ts:2
 msgid ""
-"The log path is not under the paths in "
-"settings.NginxSettings.LogDirWhiteList"
+"The log path is not under the paths in settings.NginxSettings.LogDirWhiteList"
 msgstr ""
-"Шлях до журналу не знаходиться серед шляхів у "
-"settings.NginxSettings.LogDirWhiteList"
+"Шлях до журналу не знаходиться серед шляхів у settings.NginxSettings."
+"LogDirWhiteList"
 
 #: src/views/preference/tabs/OpenAISettings.vue:23
 #: src/views/preference/tabs/OpenAISettings.vue:89
@@ -4448,7 +4493,8 @@ msgstr ""
 "двокрапки та крапки."
 
 #: src/views/preference/tabs/OpenAISettings.vue:90
-msgid "The model used for code completion, if not set, the chat model will be used."
+msgid ""
+"The model used for code completion, if not set, the chat model will be used."
 msgstr ""
 "Модель, яка використовується для завершення коду. Якщо вона не встановлена, "
 "буде використовуватися модель чату."
@@ -4513,11 +4559,11 @@ msgstr "URL недійсний."
 msgid "The username or password is incorrect"
 msgstr "Неправильне ім’я користувача або пароль"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:184
+#: src/views/dashboard/components/PerformanceTablesCard.vue:185
 msgid "Theoretical maximum concurrent connections:"
 msgstr "Теоретична максимальна кількість одночасних з’єднань:"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:188
+#: src/views/dashboard/components/PerformanceTablesCard.vue:189
 msgid "Theoretical maximum RPS (Requests Per Second):"
 msgstr "Теоретичний максимум RPS (запитів за секунду):"
 
@@ -4534,8 +4580,7 @@ msgstr ""
 #: src/views/certificate/CertificateEditor.vue:102
 msgid "This Auto Cert item is invalid, please remove it."
 msgstr ""
-"Цей елемент автоматичного сертифікату є недійсним, будь ласка, видаліть "
-"його."
+"Цей елемент автоматичного сертифікату є недійсним, будь ласка, видаліть його."
 
 #: src/views/certificate/CertificateEditor.vue:92
 msgid "This certificate is managed by Nginx UI"
@@ -4561,7 +4606,8 @@ msgid "This field should not be empty"
 msgstr "Це поле не повинно бути порожнім"
 
 #: src/constants/form_errors.ts:6
-msgid "This field should only contain letters, unicode characters, numbers, and -_."
+msgid ""
+"This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "Це поле має містити лише літери, символи Unicode, цифри та -_."
 
 #: src/views/dashboard/NginxDashBoard.vue:150
@@ -4611,8 +4657,10 @@ msgstr ""
 "після завершення відновлення."
 
 #: src/views/environments/list/BatchUpgrader.vue:182
-msgid "This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
-msgstr "Це оновить або перевстановить Nginx UI на %{nodeNames} до версії %{version}."
+msgid ""
+"This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
+msgstr ""
+"Це оновить або перевстановить Nginx UI на %{nodeNames} до версії %{version}."
 
 #: src/views/preference/tabs/AuthSettings.vue:124
 msgid "Throttle"
@@ -4624,7 +4672,7 @@ msgstr "Обмеження"
 msgid "Tips"
 msgstr "Поради"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:206
+#: src/views/dashboard/components/PerformanceTablesCard.vue:207
 msgid ""
 "Tips: You can increase the concurrency processing capacity by increasing "
 "worker_processes or worker_connections"
@@ -4645,8 +4693,8 @@ msgid ""
 "To enable it, you need to install the Google or Microsoft Authenticator app "
 "on your mobile phone."
 msgstr ""
-"Щоб увімкнути його, вам потрібно встановити додаток Google Authenticator "
-"або Microsoft Authenticator на свій мобільний телефон."
+"Щоб увімкнути його, вам потрібно встановити додаток Google Authenticator або "
+"Microsoft Authenticator на свій мобільний телефон."
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:89
 msgid ""
@@ -4655,15 +4703,15 @@ msgid ""
 "and restart Nginx UI."
 msgstr ""
 "Для забезпечення безпеки конфігурацію WebAuthn не можна додати через "
-"інтерфейс. Будь ласка, налаштуйте вручну наступне у файлі конфігурації "
-"app.ini та перезапустіть Nginx UI."
+"інтерфейс. Будь ласка, налаштуйте вручну наступне у файлі конфігурації app."
+"ini та перезапустіть Nginx UI."
 
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:34
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:15
 msgid ""
 "To make sure the certification auto-renewal can work normally, we need to "
-"add a location which can proxy the request from authority to backend, and "
-"we need to save this file and reload the Nginx. Are you sure you want to "
+"add a location which can proxy the request from authority to backend, and we "
+"need to save this file and reload the Nginx. Are you sure you want to "
 "continue?"
 msgstr ""
 "Щоб гарантувати нормальну роботу автоматичного поновлення сертифікатів, нам "
@@ -4695,12 +4743,12 @@ msgid_plural "Total %{total} items"
 msgstr[0] "Всього %{total} елемент"
 
 #: src/composables/usePerformanceMetrics.ts:94
-#: src/views/dashboard/components/PerformanceTablesCard.vue:53
+#: src/views/dashboard/components/PerformanceTablesCard.vue:54
 msgid "Total connections"
 msgstr "Загальна кількість з’єднань"
 
 #: src/composables/usePerformanceMetrics.ts:89
-#: src/views/dashboard/components/PerformanceTablesCard.vue:48
+#: src/views/dashboard/components/PerformanceTablesCard.vue:49
 msgid "Total handshakes"
 msgstr "Загальна кількість рукостискань"
 
@@ -4713,7 +4761,7 @@ msgid "Total Nginx Processes"
 msgstr "Загальна кількість процесів Nginx"
 
 #: src/composables/usePerformanceMetrics.ts:99
-#: src/views/dashboard/components/PerformanceTablesCard.vue:58
+#: src/views/dashboard/components/PerformanceTablesCard.vue:59
 msgid "Total requests"
 msgstr "Загальна кількість запитів"
 
@@ -4742,6 +4790,7 @@ msgid "Two-factor authentication required"
 msgstr "Потрібна двофакторна аутентифікація"
 
 #: src/views/certificate/CertificateList/certColumns.tsx:25
+#: src/views/dashboard/components/ModulesTable.vue:84
 #: src/views/nginx_log/NginxLogList.vue:14
 #: src/views/notification/notificationColumns.tsx:9
 #: src/views/preference/components/ExternalNotify/columns.tsx:18
@@ -4846,7 +4895,7 @@ msgstr "Довжина імені користувача не може пере
 msgid "Valid"
 msgstr "Дійсний"
 
-#: src/views/dashboard/components/PerformanceTablesCard.vue:21
+#: src/views/dashboard/components/PerformanceTablesCard.vue:22
 msgid "Value"
 msgstr "Значення"
 
@@ -4890,7 +4939,7 @@ msgid "Viewed"
 msgstr "Переглянутий"
 
 #: src/composables/usePerformanceMetrics.ts:114
-#: src/views/dashboard/components/PerformanceTablesCard.vue:73
+#: src/views/dashboard/components/PerformanceTablesCard.vue:74
 msgid "Waiting processes"
 msgstr "Процеси очікування"
 
@@ -4922,8 +4971,8 @@ msgstr ""
 
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:140
 msgid ""
-"We will remove the HTTPChallenge configuration from this file and reload "
-"the Nginx. Are you sure you want to continue?"
+"We will remove the HTTPChallenge configuration from this file and reload the "
+"Nginx. Are you sure you want to continue?"
 msgstr ""
 "Ми видалимо конфігурацію HTTPChallenge з цього файлу та перезавантажимо "
 "Nginx. Ви впевнені, що хочете продовжити?"
@@ -5015,8 +5064,8 @@ msgstr "Так"
 
 #: src/views/terminal/Terminal.vue:135
 msgid ""
-"You are accessing this terminal over an insecure HTTP connection on a "
-"non-localhost domain. This may expose sensitive information."
+"You are accessing this terminal over an insecure HTTP connection on a non-"
+"localhost domain. This may expose sensitive information."
 msgstr ""
 "Ви отримуєте доступ до цього терміналу через незахищене HTTP-з’єднання в "
 "домені, який не є локальним. Це може призвести до витоку конфіденційної "
@@ -5042,13 +5091,15 @@ msgstr "Тепер ви можете закрити це діалогове ві
 msgid ""
 "You have not configured the settings of Webauthn, so you cannot add a "
 "passkey."
-msgstr "Ви не налаштували параметри WebAuthn, тому не можете додати ключ доступу."
+msgstr ""
+"Ви не налаштували параметри WebAuthn, тому не можете додати ключ доступу."
 
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:81
-msgid "You have not enabled 2FA yet. Please enable 2FA to generate recovery codes."
+msgid ""
+"You have not enabled 2FA yet. Please enable 2FA to generate recovery codes."
 msgstr ""
-"Ви ще не ввімкнули двофакторну аутентифікацію. Будь ласка, увімкніть її, "
-"щоб згенерувати коди відновлення."
+"Ви ще не ввімкнули двофакторну аутентифікацію. Будь ласка, увімкніть її, щоб "
+"згенерувати коди відновлення."
 
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:94
 msgid "You have not generated recovery codes yet."
@@ -5073,12 +5124,12 @@ msgstr "Ваші ключі доступу"
 
 #~ msgid ""
 #~ "Check if /var/run/docker.sock exists. If you are using Nginx UI Official "
-#~ "Docker Image, please make sure the docker socket is mounted like this: `-v "
-#~ "/var/run/docker.sock:/var/run/docker.sock`."
+#~ "Docker Image, please make sure the docker socket is mounted like this: `-"
+#~ "v /var/run/docker.sock:/var/run/docker.sock`."
 #~ msgstr ""
-#~ "Перевірте, чи існує /var/run/docker.sock. Якщо ви використовуєте офіційний "
-#~ "Docker-образ Nginx UI, переконайтеся, що сокет Docker підключено таким "
-#~ "чином: `-v /var/run/docker.sock:/var/run/docker.sock`."
+#~ "Перевірте, чи існує /var/run/docker.sock. Якщо ви використовуєте "
+#~ "офіційний Docker-образ Nginx UI, переконайтеся, що сокет Docker "
+#~ "підключено таким чином: `-v /var/run/docker.sock:/var/run/docker.sock`."
 
 #~ msgid "Check if the nginx access log path exists"
 #~ msgstr "Перевірити, чи існує шлях до журналу доступу nginx"

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 231 - 177
app/src/language/vi_VN/app.po


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 254 - 152
app/src/language/zh_CN/app.po


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 258 - 156
app/src/language/zh_TW/app.po


+ 122 - 0
app/src/views/dashboard/components/ModulesTable.vue

@@ -0,0 +1,122 @@
+<script setup lang="tsx">
+import type { CustomRender } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer'
+import type { TableColumnType } from 'ant-design-vue'
+import type { FilterResetProps } from 'ant-design-vue/es/table/interface'
+import { useGlobalStore } from '@/pinia'
+import { SearchOutlined } from '@ant-design/icons-vue'
+import { Button as AButton, Input as AInput } from 'ant-design-vue'
+
+const globalStore = useGlobalStore()
+const { modules } = storeToRefs(globalStore)
+
+const searchText = ref('')
+const searchInput = ref<HTMLInputElement>()
+
+function handleSearch(selectedKeys: string[], confirm: () => void) {
+  confirm()
+  searchText.value = selectedKeys[0]
+}
+
+function handleReset(clearFilters?: (param?: FilterResetProps) => void) {
+  clearFilters?.({ confirm: true })
+  searchText.value = ''
+}
+
+// Modules columns
+const modulesColumns: TableColumnType[] = [
+  {
+    title: $gettext('Module'),
+    dataIndex: 'name',
+    width: '800px',
+    filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => (
+      <div style="padding: 8px">
+        <AInput
+          ref={searchInput}
+          value={selectedKeys[0]}
+          placeholder={$gettext('Search module name')}
+          style="width: 188px; margin-bottom: 8px; display: block;"
+          onInput={e => setSelectedKeys(e.target.value ? [e.target.value] : [])}
+          onPressEnter={() => handleSearch(selectedKeys as string[], confirm)}
+          class="mb-2"
+        />
+        <div class="flex justify-between">
+          <AButton
+            type="primary"
+            onClick={() => handleSearch(selectedKeys as string[], confirm)}
+            size="small"
+            class="mr-2"
+          >
+            {$gettext('Search')}
+          </AButton>
+          <AButton
+            onClick={() => handleReset(clearFilters)}
+            size="small"
+          >
+            {$gettext('Reset')}
+          </AButton>
+        </div>
+      </div>
+    ),
+    filterIcon: filtered => (
+      <SearchOutlined style={{ color: filtered ? '#1890ff' : undefined }} />
+    ),
+    onFilter: (value, record) =>
+      record.name && record.name.toString().toLowerCase().includes((value as string).toLowerCase()),
+    onFilterDropdownVisibleChange: visible => {
+      if (visible) {
+        setTimeout(() => {
+          if (searchInput.value) {
+            searchInput.value.focus()
+          }
+        }, 100)
+      }
+    },
+    customRender: (args: CustomRender) => {
+      return (
+        <div>
+          <div>{args.record.name}</div>
+          <div class="text-sm text-gray-500">{args.record.params}</div>
+        </div>
+      )
+    },
+  },
+  {
+    title: $gettext('Type'),
+    dataIndex: 'dynamic',
+    width: '100px',
+    filters: [
+      { text: $gettext('Dynamic'), value: true },
+      { text: $gettext('Static'), value: false },
+    ],
+    onFilter: (value, record) => record.dynamic === value,
+    customRender: ({ record }) => {
+      return <span>{record.dynamic ? $gettext('Dynamic') : $gettext('Static')}</span>
+    },
+  },
+  {
+    title: $gettext('Status'),
+    dataIndex: 'loaded',
+    width: '100px',
+    filters: [
+      { text: $gettext('Loaded'), value: true },
+      { text: $gettext('Not Loaded'), value: false },
+    ],
+    onFilter: (value, record) => record.loaded === value,
+    customRender: ({ record }) => {
+      return <span>{record.loaded ? $gettext('Loaded') : $gettext('Not Loaded')}</span>
+    },
+  },
+]
+</script>
+
+<template>
+  <div class="overflow-x-auto">
+    <ATable
+      :columns="modulesColumns"
+      :data-source="modules"
+      :pagination="false"
+      size="middle"
+      :scroll="{ x: '100%' }"
+    />
+  </div>
+</template>

+ 13 - 1
app/src/views/dashboard/components/PerformanceTablesCard.vue

@@ -1,7 +1,8 @@
-<script setup lang="ts">
+<script setup lang="tsx">
 import type { NginxPerformanceInfo } from '@/api/ngx'
 import type { TableColumnType } from 'ant-design-vue'
 import { InfoCircleOutlined } from '@ant-design/icons-vue'
+import ModulesTable from './ModulesTable.vue'
 
 const props = defineProps<{
   nginxInfo: NginxPerformanceInfo
@@ -209,6 +210,17 @@ const maxRPS = computed(() => {
           </AAlert>
         </div>
       </ATabPane>
+
+      <!-- Modules information -->
+      <ATabPane key="modules" :tab="$gettext('Modules')">
+        <ModulesTable />
+      </ATabPane>
     </ATabs>
   </ACard>
 </template>
+
+<style lang="less" scoped>
+:deep(.ant-tabs-tab) {
+  padding-top: 0;
+}
+</style>

+ 51 - 43
internal/nginx/modules.go

@@ -23,7 +23,7 @@ type Module struct {
 
 // modulesCache stores the cached modules list and related metadata
 var (
-	modulesCache     = orderedmap.NewOrderedMap[string, Module]()
+	modulesCache     = orderedmap.NewOrderedMap[string, *Module]()
 	modulesCacheLock sync.RWMutex
 	lastPIDPath      string
 	lastPIDModTime   time.Time
@@ -35,7 +35,7 @@ func clearModulesCache() {
 	modulesCacheLock.Lock()
 	defer modulesCacheLock.Unlock()
 
-	modulesCache = orderedmap.NewOrderedMap[string, Module]()
+	modulesCache = orderedmap.NewOrderedMap[string, *Module]()
 	lastPIDPath = ""
 	lastPIDModTime = time.Time{}
 	lastPIDSize = 0
@@ -119,16 +119,15 @@ func updateDynamicModulesStatus() {
 	for key := range modulesCache.Keys() {
 		// If the module is already marked as dynamic, check if it's actually loaded
 		if loadedDynamicModules[key] {
-			modulesCache.Set(key, Module{
-				Name:    key,
-				Dynamic: true,
-				Loaded:  true,
-			})
+			module, ok := modulesCache.Get(key)
+			if ok {
+				module.Loaded = true
+			}
 		}
 	}
 }
 
-func GetModules() *orderedmap.OrderedMap[string, Module] {
+func GetModules() *orderedmap.OrderedMap[string, *Module] {
 	modulesCacheLock.RLock()
 	cachedModules := modulesCache
 	modulesCacheLock.RUnlock()
@@ -141,52 +140,61 @@ func GetModules() *orderedmap.OrderedMap[string, Module] {
 	// If PID has changed or we don't have cached modules, get fresh modules
 	out := getNginxV()
 
-	// Regular expression to find built-in modules in nginx -V output
-	builtinRe := regexp.MustCompile(`--with-([a-zA-Z0-9_-]+)(_module)?`)
-	builtinMatches := builtinRe.FindAllStringSubmatch(out, -1)
+	// Regular expression to find module parameters with values
+	paramRe := regexp.MustCompile(`--with-([a-zA-Z0-9_-]+)(?:_module)?(?:=([^"'\s]+|"[^"]*"|'[^']*'))?`)
+	paramMatches := paramRe.FindAllStringSubmatch(out, -1)
+
+	// Update cache
+	modulesCacheLock.Lock()
+	modulesCache = orderedmap.NewOrderedMap[string, *Module]()
 
-	// Extract built-in module names from matches and put in map for quick lookup
-	moduleMap := make(map[string]bool)
-	for _, match := range builtinMatches {
+	// Extract module names and parameters from matches
+	for _, match := range paramMatches {
 		if len(match) > 1 {
 			module := match[1]
-			moduleMap[module] = true
-		}
-	}
+			var params string
+
+			// Check if there's a parameter value
+			if len(match) > 2 && match[2] != "" {
+				params = match[2]
+				// Remove surrounding quotes if present
+				params = strings.TrimPrefix(params, "'")
+				params = strings.TrimPrefix(params, "\"")
+				params = strings.TrimSuffix(params, "'")
+				params = strings.TrimSuffix(params, "\"")
+			}
 
-	// Regular expression to find dynamic modules in nginx -V output
-	dynamicRe := regexp.MustCompile(`--with-([a-zA-Z0-9_-]+)(_module)?=dynamic`)
-	dynamicMatches := dynamicRe.FindAllStringSubmatch(out, -1)
+			// Special handling for configuration options like cc-opt, not actual modules
+			if module == "cc-opt" || module == "ld-opt" || module == "prefix" {
+				modulesCache.Set(module, &Module{
+					Name:    module,
+					Params:  params,
+					Dynamic: false,
+					Loaded:  true,
+				})
+				continue
+			}
 
-	// Extract dynamic module names from matches
-	for _, match := range dynamicMatches {
-		if len(match) > 1 {
-			module := match[1]
-			// Only add if not already in list (to avoid duplicates)
-			if !moduleMap[module] {
-				moduleMap[module] = true
+			// Determine if the module is dynamic
+			isDynamic := false
+			if strings.Contains(out, "--with-"+module+"=dynamic") ||
+				strings.Contains(out, "--with-"+module+"_module=dynamic") {
+				isDynamic = true
 			}
-		}
-	}
 
-	// Update cache
-	modulesCacheLock.Lock()
-	modulesCache = orderedmap.NewOrderedMap[string, Module]()
-	for module := range moduleMap {
-		// Mark modules as built-in (loaded) or dynamic (potentially not loaded)
-		if strings.Contains(out, "--with-"+module+"=dynamic") {
-			modulesCache.Set(module, Module{
-				Name:    module,
-				Dynamic: true,
-				Loaded:  true,
-			})
-		} else {
-			modulesCache.Set(module, Module{
+			if params == "dynamic" {
+				params = ""
+			}
+
+			modulesCache.Set(module, &Module{
 				Name:    module,
-				Dynamic: true,
+				Params:  params,
+				Dynamic: isDynamic,
+				Loaded:  !isDynamic || isDynamic, // Static modules are always loaded, dynamic need to be checked
 			})
 		}
 	}
+
 	modulesCacheLock.Unlock()
 
 	// Update dynamic modules status by checking if they're actually loaded

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно