Browse Source

feat(nginx-dashboard): add modules table

Jacky 1 day ago
parent
commit
d263340bdf

+ 1 - 1
api/nginx/modules.go

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

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

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

File diff suppressed because it is too large
+ 221 - 157
app/src/language/de_DE/app.po


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

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

File diff suppressed because it is too large
+ 219 - 160
app/src/language/es/app.po


File diff suppressed because it is too large
+ 227 - 170
app/src/language/fr_FR/app.po


File diff suppressed because it is too large
+ 276 - 155
app/src/language/ja_JP/app.po


File diff suppressed because it is too large
+ 272 - 154
app/src/language/ko_KR/app.po


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

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

File diff suppressed because it is too large
+ 223 - 164
app/src/language/pt_PT/app.po


File diff suppressed because it is too large
+ 220 - 166
app/src/language/ru_RU/app.po


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

File diff suppressed because it is too large
+ 231 - 177
app/src/language/vi_VN/app.po


File diff suppressed because it is too large
+ 254 - 152
app/src/language/zh_CN/app.po


File diff suppressed because it is too large
+ 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 { NginxPerformanceInfo } from '@/api/ngx'
 import type { TableColumnType } from 'ant-design-vue'
 import type { TableColumnType } from 'ant-design-vue'
 import { InfoCircleOutlined } from '@ant-design/icons-vue'
 import { InfoCircleOutlined } from '@ant-design/icons-vue'
+import ModulesTable from './ModulesTable.vue'
 
 
 const props = defineProps<{
 const props = defineProps<{
   nginxInfo: NginxPerformanceInfo
   nginxInfo: NginxPerformanceInfo
@@ -209,6 +210,17 @@ const maxRPS = computed(() => {
           </AAlert>
           </AAlert>
         </div>
         </div>
       </ATabPane>
       </ATabPane>
+
+      <!-- Modules information -->
+      <ATabPane key="modules" :tab="$gettext('Modules')">
+        <ModulesTable />
+      </ATabPane>
     </ATabs>
     </ATabs>
   </ACard>
   </ACard>
 </template>
 </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
 // modulesCache stores the cached modules list and related metadata
 var (
 var (
-	modulesCache     = orderedmap.NewOrderedMap[string, Module]()
+	modulesCache     = orderedmap.NewOrderedMap[string, *Module]()
 	modulesCacheLock sync.RWMutex
 	modulesCacheLock sync.RWMutex
 	lastPIDPath      string
 	lastPIDPath      string
 	lastPIDModTime   time.Time
 	lastPIDModTime   time.Time
@@ -35,7 +35,7 @@ func clearModulesCache() {
 	modulesCacheLock.Lock()
 	modulesCacheLock.Lock()
 	defer modulesCacheLock.Unlock()
 	defer modulesCacheLock.Unlock()
 
 
-	modulesCache = orderedmap.NewOrderedMap[string, Module]()
+	modulesCache = orderedmap.NewOrderedMap[string, *Module]()
 	lastPIDPath = ""
 	lastPIDPath = ""
 	lastPIDModTime = time.Time{}
 	lastPIDModTime = time.Time{}
 	lastPIDSize = 0
 	lastPIDSize = 0
@@ -119,16 +119,15 @@ func updateDynamicModulesStatus() {
 	for key := range modulesCache.Keys() {
 	for key := range modulesCache.Keys() {
 		// If the module is already marked as dynamic, check if it's actually loaded
 		// If the module is already marked as dynamic, check if it's actually loaded
 		if loadedDynamicModules[key] {
 		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()
 	modulesCacheLock.RLock()
 	cachedModules := modulesCache
 	cachedModules := modulesCache
 	modulesCacheLock.RUnlock()
 	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
 	// If PID has changed or we don't have cached modules, get fresh modules
 	out := getNginxV()
 	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 {
 		if len(match) > 1 {
 			module := 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,
 				Name:    module,
-				Dynamic: true,
+				Params:  params,
+				Dynamic: isDynamic,
+				Loaded:  !isDynamic || isDynamic, // Static modules are always loaded, dynamic need to be checked
 			})
 			})
 		}
 		}
 	}
 	}
+
 	modulesCacheLock.Unlock()
 	modulesCacheLock.Unlock()
 
 
 	// Update dynamic modules status by checking if they're actually loaded
 	// Update dynamic modules status by checking if they're actually loaded

Some files were not shown because too many files changed in this diff