Selaa lähdekoodia

feat(nginx_log): add index_path configuration for custom index storage

0xJacky 6 päivää sitten
vanhempi
commit
6567d929eb

+ 5 - 1
api/nginx_log/router.go

@@ -4,7 +4,7 @@ import "github.com/gin-gonic/gin"
 
 // InitRouter registers all the nginx log related routes
 func InitRouter(r *gin.RouterGroup) {
-	r.GET("nginx_log", Log)
+
 	r.GET("nginx_logs", GetLogList)
 	r.POST("nginx_log/page", GetNginxLogPage)
 	r.POST("nginx_log/analytics", GetLogAnalytics)
@@ -20,3 +20,7 @@ func InitRouter(r *gin.RouterGroup) {
 	r.POST("nginx_log/settings/advanced_indexing/disable", DisableAdvancedIndexing)
 	r.GET("nginx_log/settings/advanced_indexing/status", GetAdvancedIndexingStatus)
 }
+
+func InitWebSocketRouter(r *gin.RouterGroup) {
+	r.GET("nginx_log", Log)
+}

+ 1 - 0
app.example.ini

@@ -64,6 +64,7 @@ RestartCmd      = start-stop-daemon --start --quiet --pidfile /var/run/nginx.pid
 
 [nginx_log]
 AdvancedIndexingEnabled = false
+IndexPath =
 
 [node]
 Name             = Local

+ 0 - 19
app/components.d.ts

@@ -10,30 +10,18 @@ declare module 'vue' {
   export interface GlobalComponents {
     AAlert: typeof import('ant-design-vue/es')['Alert']
     AApp: typeof import('ant-design-vue/es')['App']
-    AAutoComplete: typeof import('ant-design-vue/es')['AutoComplete']
     AAvatar: typeof import('ant-design-vue/es')['Avatar']
     ABadge: typeof import('ant-design-vue/es')['Badge']
     ABreadcrumb: typeof import('ant-design-vue/es')['Breadcrumb']
     ABreadcrumbItem: typeof import('ant-design-vue/es')['BreadcrumbItem']
     AButton: typeof import('ant-design-vue/es')['Button']
     ACard: typeof import('ant-design-vue/es')['Card']
-    ACheckbox: typeof import('ant-design-vue/es')['Checkbox']
-    ACheckboxGroup: typeof import('ant-design-vue/es')['CheckboxGroup']
     ACol: typeof import('ant-design-vue/es')['Col']
-    ACollapse: typeof import('ant-design-vue/es')['Collapse']
-    ACollapsePanel: typeof import('ant-design-vue/es')['CollapsePanel']
-    AComment: typeof import('ant-design-vue/es')['Comment']
     AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider']
     ADivider: typeof import('ant-design-vue/es')['Divider']
     ADrawer: typeof import('ant-design-vue/es')['Drawer']
-    ADropdown: typeof import('ant-design-vue/es')['Dropdown']
-    AEmpty: typeof import('ant-design-vue/es')['Empty']
-    AForm: typeof import('ant-design-vue/es')['Form']
-    AFormItem: typeof import('ant-design-vue/es')['FormItem']
     AInput: typeof import('ant-design-vue/es')['Input']
     AInputGroup: typeof import('ant-design-vue/es')['InputGroup']
-    AInputNumber: typeof import('ant-design-vue/es')['InputNumber']
-    AInputPassword: typeof import('ant-design-vue/es')['InputPassword']
     ALayout: typeof import('ant-design-vue/es')['Layout']
     ALayoutContent: typeof import('ant-design-vue/es')['LayoutContent']
     ALayoutFooter: typeof import('ant-design-vue/es')['LayoutFooter']
@@ -43,28 +31,21 @@ declare module 'vue' {
     AListItem: typeof import('ant-design-vue/es')['ListItem']
     AListItemMeta: typeof import('ant-design-vue/es')['ListItemMeta']
     AMenu: typeof import('ant-design-vue/es')['Menu']
-    AMenuDivider: typeof import('ant-design-vue/es')['MenuDivider']
     AMenuItem: typeof import('ant-design-vue/es')['MenuItem']
     AModal: typeof import('ant-design-vue/es')['Modal']
     APopconfirm: typeof import('ant-design-vue/es')['Popconfirm']
     APopover: typeof import('ant-design-vue/es')['Popover']
     AppProvider: typeof import('./src/components/AppProvider.vue')['default']
     AProgress: typeof import('ant-design-vue/es')['Progress']
-    ARangePicker: typeof import('ant-design-vue/es')['RangePicker']
     ARow: typeof import('ant-design-vue/es')['Row']
-    ASegmented: typeof import('ant-design-vue/es')['Segmented']
     ASelect: typeof import('ant-design-vue/es')['Select']
     ASelectOption: typeof import('ant-design-vue/es')['SelectOption']
     ASpace: typeof import('ant-design-vue/es')['Space']
-    ASpin: typeof import('ant-design-vue/es')['Spin']
     AStatistic: typeof import('ant-design-vue/es')['Statistic']
     ASubMenu: typeof import('ant-design-vue/es')['SubMenu']
-    ASwitch: typeof import('ant-design-vue/es')['Switch']
-    ATable: typeof import('ant-design-vue/es')['Table']
     ATabPane: typeof import('ant-design-vue/es')['TabPane']
     ATabs: typeof import('ant-design-vue/es')['Tabs']
     ATag: typeof import('ant-design-vue/es')['Tag']
-    ATextarea: typeof import('ant-design-vue/es')['Textarea']
     ATooltip: typeof import('ant-design-vue/es')['Tooltip']
     ATypographyText: typeof import('ant-design-vue/es')['TypographyText']
     ATypographyTitle: typeof import('ant-design-vue/es')['TypographyTitle']

+ 1 - 0
app/src/api/settings.ts

@@ -72,6 +72,7 @@ export interface NginxSettings {
 
 export interface NginxLogSettings {
   advanced_indexing_enabled: boolean
+  index_path: string
 }
 
 export interface NodeSettings {

+ 197 - 202
app/src/language/ar/app.po

@@ -5,10 +5,10 @@ msgid ""
 msgstr ""
 "PO-Revision-Date: 2025-07-14 07:37+0000\n"
 "Last-Translator: mosaati <mohammed.saati@gmail.com>\n"
-"Language-Team: Arabic <https://weblate.nginxui.com/projects/nginx-ui/"
-"frontend/ar/>\n"
+"Language-Team: Arabic "
+"<https://weblate.nginxui.com/projects/nginx-ui/frontend/ar/>\n"
 "Language: ar\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
 "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
@@ -33,8 +33,7 @@ msgid "[Nginx UI] Certificate successfully revoked"
 msgstr "[Nginx UI] تم إلغاء الشهادة بنجاح"
 
 #: src/language/generate.ts:39
-msgid ""
-"[Nginx UI] Certificate was used for server, reloading server TLS certificate"
+msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
 msgstr "[Nginx UI] تم استخدام الشهادة للخادم، إعادة تحميل شهادة TLS للخادم"
 
 #: src/language/generate.ts:40
@@ -110,7 +109,15 @@ msgstr "تم نسخ {label} إلى الحافظة"
 msgid "* Includes nodes from group %{groupName} and manually selected nodes"
 msgstr "* يتضمن عقدًا من مجموعة %{groupName} وعقدًا مختارة يدويًا"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:168
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:141
+msgid ""
+"* Index files are stored in the \"log-index\" directory within your Nginx "
+"UI config path by default."
+msgstr ""
+"* يتم تخزين ملفات الفهرس في دليل \"log-index\" ضمن مسار تكوين واجهة NGINX "
+"افتراضيًا."
+
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:176
 msgid ""
 "* Performance metrics measured on Apple M2 Pro (12-core) with 32GB RAM. "
 "Actual performance may vary based on your hardware configuration."
@@ -272,7 +279,7 @@ msgstr "تم تمكين الفهرسة المتقدمة ولكن فشل بدء 
 msgid "Advanced indexing enabled successfully"
 msgstr "تم تمكين الفهرسة المتقدمة بنجاح"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:245
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:253
 msgid "Advanced log indexing features are free and open source for all users"
 msgstr "ميزات الفهرسة المتقدمة للسجلات مجانية ومفتوحة المصدر لجميع المستخدمين"
 
@@ -280,7 +287,7 @@ msgstr "ميزات الفهرسة المتقدمة للسجلات مجانية 
 msgid "Advanced memory pooling system"
 msgstr "نظام تجميع الذاكرة المتقدم"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:193
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:201
 msgid "Advanced search & filtering"
 msgstr "البحث المتقدم والتصفية"
 
@@ -322,8 +329,7 @@ msgid "Any"
 msgstr "أي"
 
 #: src/components/AutoCertForm/AutoCertForm.vue:209
-msgid ""
-"Any reachable IP address can be used with private Certificate Authorities"
+msgid "Any reachable IP address can be used with private Certificate Authorities"
 msgstr "يمكن استخدام أي عنوان IP قابل للوصول مع سلطات الشهادات الخاصة"
 
 #: src/views/preference/tabs/OpenAISettings.vue:32
@@ -512,7 +518,7 @@ msgstr "AutoCert قيد التشغيل، يرجى الانتظار..."
 msgid "AutoCert is running..."
 msgstr "AutoCert قيد التشغيل..."
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:213
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:221
 msgid "Automated log rotation detection"
 msgstr "الكشف التلقائي عن تدوير السجلات"
 
@@ -601,14 +607,13 @@ msgstr "جدول النسخ الاحتياطي"
 
 #: src/components/Notification/notifications.ts:38
 msgid "Backup task %{backup_name} completed successfully, file: %{file_path}"
-msgstr ""
-"تم إنجاز مهمة النسخ الاحتياطي %{backup_name} بنجاح، الملف: %{file_path}"
+msgstr "تم إنجاز مهمة النسخ الاحتياطي %{backup_name} بنجاح، الملف: %{file_path}"
 
 #: src/components/Notification/notifications.ts:34
-msgid ""
-"Backup task %{backup_name} failed during storage upload, error: %{error}"
+msgid "Backup task %{backup_name} failed during storage upload, error: %{error}"
 msgstr ""
-"فشلت مهمة النسخ الاحتياطي %{backup_name} أثناء تحميل التخزين، الخطأ: %{error}"
+"فشلت مهمة النسخ الاحتياطي %{backup_name} أثناء تحميل التخزين، الخطأ: "
+"%{error}"
 
 #: src/components/Notification/notifications.ts:30
 msgid "Backup task %{backup_name} failed to execute, error: %{error}"
@@ -684,7 +689,7 @@ msgstr "المتصفح"
 msgid "Browser Statistics"
 msgstr "إحصائيات المتصفح"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:267
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:275
 msgid ""
 "By enabling advanced indexing, you acknowledge that your system meets the "
 "requirements and understand the performance implications. This will start "
@@ -703,8 +708,7 @@ msgstr "الذاكرة المؤقتة"
 
 #: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:177
 msgid "Cache items not accessed within this time will be removed"
-msgstr ""
-"سيتم إزالة عناصر الذاكرة المؤقتة التي لم يتم الوصول إليها خلال هذا الوقت"
+msgstr "سيتم إزالة عناصر الذاكرة المؤقتة التي لم يتم الوصول إليها خلال هذا الوقت"
 
 #: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:349
 msgid "Cache loader processing time threshold"
@@ -970,23 +974,23 @@ msgstr "فحص الأيقونة"
 #: src/language/generate.ts:6
 msgid ""
 "Check if /var/run/docker.sock exists. If you are using Nginx UI Official "
-"Docker Image, please make sure the docker socket is mounted like this: `-v /"
-"var/run/docker.sock:/var/run/docker.sock`. Nginx UI official image uses /var/"
-"run/docker.sock to communicate with the host Docker Engine via Docker Client "
-"API. This feature is used to control Nginx in another container and perform "
-"container replacement rather than binary replacement during OTA upgrades of "
-"Nginx UI to ensure container dependencies are also upgraded. If you don't "
-"need this feature, please add the environment variable "
+"Docker Image, please make sure the docker socket is mounted like this: `-v "
+"/var/run/docker.sock:/var/run/docker.sock`. Nginx UI official image uses "
+"/var/run/docker.sock to communicate with the host Docker Engine via Docker "
+"Client API. This feature is used to control Nginx in another container and "
+"perform container replacement rather than binary replacement during OTA "
+"upgrades of Nginx UI to ensure container dependencies are also upgraded. If "
+"you don't need this feature, please add the environment variable "
 "NGINX_UI_IGNORE_DOCKER_SOCKET=true to the container."
 msgstr ""
 "تحقق مما إذا كان /var/run/docker.sock موجودًا. إذا كنت تستخدم صورة Docker "
-"الرسمية لـ Nginx UI، يرجى التأكد من توصيل مقبس Docker بهذه الطريقة: `-v /var/"
-"run/docker.sock:/var/run/docker.sock`. تستخدم صورة Nginx UI الرسمية /var/run/"
-"docker.sock للتواصل مع محرك Docker المضيف عبر واجهة برمجة تطبيقات Docker "
-"Client. تُستخدم هذه الميزة للتحكم في Nginx في حاوية أخرى وإجراء استبدال "
-"الحاوية بدلاً من استبدال الثنائي أثناء التحديثات OTA لـ Nginx UI لضمان تحديث "
-"تبعيات الحاوية أيضًا. إذا كنت لا تحتاج إلى هذه الميزة، يرجى إضافة متغير "
-"البيئة NGINX_UI_IGNORE_DOCKER_SOCKET=true إلى الحاوية."
+"الرسمية لـ Nginx UI، يرجى التأكد من توصيل مقبس Docker بهذه الطريقة: `-v "
+"/var/run/docker.sock:/var/run/docker.sock`. تستخدم صورة Nginx UI الرسمية "
+"/var/run/docker.sock للتواصل مع محرك Docker المضيف عبر واجهة برمجة تطبيقات "
+"Docker Client. تُستخدم هذه الميزة للتحكم في Nginx في حاوية أخرى وإجراء "
+"استبدال الحاوية بدلاً من استبدال الثنائي أثناء التحديثات OTA لـ Nginx UI "
+"لضمان تحديث تبعيات الحاوية أيضًا. إذا كنت لا تحتاج إلى هذه الميزة، يرجى "
+"إضافة متغير البيئة NGINX_UI_IGNORE_DOCKER_SOCKET=true إلى الحاوية."
 
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:14
 msgid ""
@@ -997,25 +1001,24 @@ msgstr ""
 "استخدام ميزات Passkeys والحافظة"
 
 #: src/language/generate.ts:7
-msgid ""
-"Check if the conf.d directory is under the nginx configuration directory"
+msgid "Check if the conf.d directory is under the nginx configuration directory"
 msgstr "تحقق مما إذا كان دليل conf.d موجودًا ضمن دليل تكوين nginx"
 
 #: src/language/generate.ts:9
 msgid ""
-"Check if the nginx access log path exists. By default, this path is obtained "
-"from 'nginx -V'. If it cannot be obtained or the obtained path does not "
-"point to a valid, existing file, an error will be reported. In this case, "
-"you need to modify the configuration file to specify the access log path."
-"Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-"
-"nginx.html#accesslogpath"
+"Check if the nginx access log path exists. By default, this path is "
+"obtained from 'nginx -V'. If it cannot be obtained or the obtained path "
+"does not point to a valid, existing file, an error will be reported. In "
+"this case, you need to modify the configuration file to specify the access "
+"log path.Refer to the docs for more details: "
+"https://nginxui.com/zh_CN/guide/config-nginx.html#accesslogpath"
 msgstr ""
-"تحقق مما إذا كان مسار سجل الوصول إلى nginx موجودًا. بشكل افتراضي، يتم الحصول "
-"على هذا المسار من 'nginx -V'. إذا لم يتم الحصول عليه أو إذا كان المسار الذي "
-"تم الحصول عليه لا يشير إلى ملف صالح موجود، فسيتم الإبلاغ عن خطأ. في هذه "
-"الحالة، تحتاج إلى تعديل ملف التكوين لتحديد مسار سجل الوصول. راجع الوثائق "
-"لمزيد من التفاصيل: https://nginxui.com/zh_CN/guide/config-nginx."
-"html#accesslogpath"
+"تحقق مما إذا كان مسار سجل الوصول إلى nginx موجودًا. بشكل افتراضي، يتم "
+"الحصول على هذا المسار من 'nginx -V'. إذا لم يتم الحصول عليه أو إذا كان "
+"المسار الذي تم الحصول عليه لا يشير إلى ملف صالح موجود، فسيتم الإبلاغ عن "
+"خطأ. في هذه الحالة، تحتاج إلى تعديل ملف التكوين لتحديد مسار سجل الوصول. "
+"راجع الوثائق لمزيد من التفاصيل: "
+"https://nginxui.com/zh_CN/guide/config-nginx.html#accesslogpath"
 
 #: src/language/generate.ts:10
 msgid "Check if the nginx configuration directory exists"
@@ -1031,28 +1034,29 @@ msgid ""
 "from 'nginx -V'. If it cannot be obtained or the obtained path does not "
 "point to a valid, existing file, an error will be reported. In this case, "
 "you need to modify the configuration file to specify the error log path. "
-"Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-"
-"nginx.html#errorlogpath"
+"Refer to the docs for more details: "
+"https://nginxui.com/zh_CN/guide/config-nginx.html#errorlogpath"
 msgstr ""
 "تحقق مما إذا كان مسار سجل أخطاء nginx موجودًا. بشكل افتراضي، يتم الحصول على "
 "هذا المسار من 'nginx -V'. إذا تعذر الحصول عليه أو إذا كان المسار الذي تم "
-"الحصول عليه لا يشير إلى ملف صالح موجود، فسيتم الإبلاغ عن خطأ. في هذه الحالة، "
-"تحتاج إلى تعديل ملف التكوين لتحديد مسار سجل الأخطاء. راجع الوثائق لمزيد من "
-"التفاصيل: https://nginxui.com/zh_CN/guide/config-nginx.html#errorlogpath"
+"الحصول عليه لا يشير إلى ملف صالح موجود، فسيتم الإبلاغ عن خطأ. في هذه "
+"الحالة، تحتاج إلى تعديل ملف التكوين لتحديد مسار سجل الأخطاء. راجع الوثائق "
+"لمزيد من التفاصيل: "
+"https://nginxui.com/zh_CN/guide/config-nginx.html#errorlogpath"
 
 #: src/language/generate.ts:8
 msgid ""
 "Check if the nginx PID path exists. By default, this path is obtained from "
 "'nginx -V'. If it cannot be obtained, an error will be reported. In this "
 "case, you need to modify the configuration file to specify the Nginx PID "
-"path.Refer to the docs for more details: https://nginxui.com/zh_CN/guide/"
-"config-nginx.html#pidpath"
+"path.Refer to the docs for more details: "
+"https://nginxui.com/zh_CN/guide/config-nginx.html#pidpath"
 msgstr ""
-"تحقق مما إذا كان مسار معرف عملية Nginx موجودًا. بشكل افتراضي، يتم الحصول على "
-"هذا المسار من الأمر 'nginx -V'. إذا تعذر الحصول عليه، سيتم الإبلاغ عن خطأ. "
-"في هذه الحالة، تحتاج إلى تعديل ملف التكوين لتحديد مسار معرف عملية Nginx. "
-"راجع الوثائق لمزيد من التفاصيل: https://nginxui.com/zh_CN/guide/config-nginx."
-"html#pidpath"
+"تحقق مما إذا كان مسار معرف عملية Nginx موجودًا. بشكل افتراضي، يتم الحصول "
+"على هذا المسار من الأمر 'nginx -V'. إذا تعذر الحصول عليه، سيتم الإبلاغ عن "
+"خطأ. في هذه الحالة، تحتاج إلى تعديل ملف التكوين لتحديد مسار معرف عملية "
+"Nginx. راجع الوثائق لمزيد من التفاصيل: "
+"https://nginxui.com/zh_CN/guide/config-nginx.html#pidpath"
 
 #: src/language/generate.ts:13
 msgid "Check if the nginx sbin path exists"
@@ -1080,8 +1084,8 @@ msgstr ""
 
 #: src/language/generate.ts:18
 msgid ""
-"Check if the streams-available and streams-enabled directories are under the "
-"nginx configuration directory"
+"Check if the streams-available and streams-enabled directories are under "
+"the nginx configuration directory"
 msgstr ""
 "تحقق مما إذا كانت الدلائل streams-available و streams-enabled موجودة ضمن "
 "دليل تكوين nginx"
@@ -1226,7 +1230,7 @@ msgstr "فهرسة كاملة مع إمكانيات البحث"
 msgid "components"
 msgstr "المكونات"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:221
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:229
 msgid "Compressed log file support"
 msgstr "دعم ملفات السجل المضغوطة"
 
@@ -1302,7 +1306,7 @@ msgstr "تأكيد الحذف"
 msgid "Confirm New Password"
 msgstr "تأكيد كلمة المرور الجديدة"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:266
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:274
 msgid "Confirmation Required"
 msgstr "مطلوب تأكيد"
 
@@ -1440,7 +1444,7 @@ msgstr "بيانات الاعتماد"
 msgid "Cron Expression"
 msgstr "تعبير كرون"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:217
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:225
 msgid "Cross-file timeline correlation"
 msgstr "ارتباط الجدول الزمني عبر الملفات"
 
@@ -1924,8 +1928,8 @@ msgid ""
 "Due to the security policies of some browsers, you cannot use passkeys on "
 "non-HTTPS websites, except when running on localhost."
 msgstr ""
-"نظرًا لسياسات الأمان لبعض المتصفحات، لا يمكنك استخدام مفاتيح المرور على مواقع "
-"الويب غير HTTPS، إلا عند التشغيل على localhost."
+"نظرًا لسياسات الأمان لبعض المتصفحات، لا يمكنك استخدام مفاتيح المرور على "
+"مواقع الويب غير HTTPS، إلا عند التشغيل على localhost."
 
 #: src/components/LLM/LLMSessionTabs.vue:287
 #: src/components/LLM/LLMSessionTabs.vue:378
@@ -1946,7 +1950,7 @@ msgstr "تم النسخ إلى المحلي بنجاح"
 msgid "Dynamic"
 msgstr "ديناميكي"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:189
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:197
 msgid "Dynamic shard management"
 msgstr "إدارة الأجزاء الديناميكية"
 
@@ -2213,11 +2217,11 @@ msgstr "سجلات الأخطاء"
 
 #: src/views/nginx_log/structured/StructuredLogViewer.vue:668
 msgid ""
-"Error logs do not support structured analysis as they contain free-form text "
-"messages."
+"Error logs do not support structured analysis as they contain free-form "
+"text messages."
 msgstr "لا تدعم سجلات الأخطاء التحليل المنظم لأنها تحتوي على رسائل نصية حرة."
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:225
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:233
 msgid "Error pattern recognition"
 msgstr "التعرف على أنماط الأخطاء"
 
@@ -2245,7 +2249,7 @@ msgstr "تنفيذ في كل شهر في اليوم %{day} عند الساعة %
 msgid "Expand"
 msgstr "توسيع"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:145
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:153
 msgid "Expected Performance"
 msgstr "الأداء المتوقع"
 
@@ -2274,15 +2278,15 @@ msgstr "تصدير إكسل"
 msgid ""
 "External Account Binding HMAC Key (optional). Should be in Base64 URL "
 "encoding format."
-msgstr ""
-"مفتاح HMAC لربط الحساب الخارجي (اختياري). يجب أن يكون بتنسيق Base64 URL."
+msgstr "مفتاح HMAC لربط الحساب الخارجي (اختياري). يجب أن يكون بتنسيق Base64 URL."
 
 #: src/views/certificate/ACMEUser.vue:92
 msgid ""
-"External Account Binding Key ID (optional). Required for some ACME providers "
-"like ZeroSSL."
+"External Account Binding Key ID (optional). Required for some ACME "
+"providers like ZeroSSL."
 msgstr ""
-"معرف مفتاح الربط الحساب الخارجي (اختياري). مطلوب لبعض موفري ACME مثل ZeroSSL."
+"معرف مفتاح الربط الحساب الخارجي (اختياري). مطلوب لبعض موفري ACME مثل "
+"ZeroSSL."
 
 #: src/views/preference/tabs/NginxSettings.vue:49
 msgid "External Docker Container"
@@ -2697,7 +2701,7 @@ msgstr "فشل في كتابة الملف المشفر: {0}"
 msgid "Failed to write security key file: {0}"
 msgstr "فشل في كتابة ملف مفتاح الأمان: {0}"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:179
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:187
 msgid "Features"
 msgstr "الميزات"
 
@@ -2784,16 +2788,15 @@ msgstr "للمستخدمين الصينيين"
 msgid "For Chinese user: https://cloud.nginxui.com/"
 msgstr "للمستخدمين الصين: /https://cloud.nginxui.com"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:257
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:265
 msgid "For commercial or professional use, contact"
 msgstr "للاستخدام التجاري أو المهني، يرجى الاتصال بـ"
 
 #: src/views/nginx_log/structured/StructuredLogViewer.vue:670
-msgid ""
-"For error logs, please use the Raw Log Viewer for better viewing experience."
+msgid "For error logs, please use the Raw Log Viewer for better viewing experience."
 msgstr ""
-"بالنسبة لسجلات الأخطاء، يرجى استخدام عارض السجلات الخام للحصول على تجربة عرض "
-"أفضل."
+"بالنسبة لسجلات الأخطاء، يرجى استخدام عارض السجلات الخام للحصول على تجربة "
+"عرض أفضل."
 
 #: src/components/AutoCertForm/AutoCertForm.vue:140
 msgid ""
@@ -2805,11 +2808,11 @@ msgstr ""
 
 #: src/components/AutoCertForm/AutoCertForm.vue:188
 msgid ""
-"For IP-based certificates, please specify the server IP address that will be "
-"included in the certificate."
+"For IP-based certificates, please specify the server IP address that will "
+"be included in the certificate."
 msgstr ""
-"بالنسبة للشهادات القائمة على IP، يرجى تحديد عنوان IP الخاص بالخادم الذي سيتم "
-"تضمينه في الشهادة."
+"بالنسبة للشهادات القائمة على IP، يرجى تحديد عنوان IP الخاص بالخادم الذي "
+"سيتم تضمينه في الشهادة."
 
 #: src/constants/errors/middleware.ts:4
 msgid "Form parse failed"
@@ -2843,7 +2846,7 @@ msgstr "واجهة المستخدم"
 msgid "Full Text Search"
 msgstr "بحث النص الكامل"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:209
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:217
 msgid "Full-text search support"
 msgstr "دعم البحث النصي الكامل"
 
@@ -2918,8 +2921,8 @@ msgid ""
 "gRPC health check requires server to implement gRPC Health Check service "
 "(grpc.health.v1.Health)."
 msgstr ""
-"يتطلب فحص صحة gRPC أن يقوم الخادم بتنفيذ خدمة فحص صحة gRPC (grpc.health.v1."
-"Health)."
+"يتطلب فحص صحة gRPC أن يقوم الخادم بتنفيذ خدمة فحص صحة gRPC "
+"(grpc.health.v1.Health)."
 
 #: src/views/dashboard/components/SiteHealthCheckModal.vue:501
 msgid ""
@@ -3032,6 +3035,14 @@ msgid ""
 "option."
 msgstr "إذا كنت ترغب في إلغاء الشهادة القديمة تلقائيًا، يرجى تمكين هذا الخيار."
 
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:142
+msgid ""
+"If you want to change the storage location, you can set the `IndexPath` of "
+"`nginx_log` section in the Nginx UI config."
+msgstr ""
+"إذا كنت ترغب في تغيير موقع التخزين، يمكنك تعيين `IndexPath` لقسم "
+"`nginx_log` في تكوين واجهة Nginx."
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr "إذا كان متصفحك يدعم WebAuthn Passkey، ستظهر نافذة حوار."
@@ -3065,7 +3076,7 @@ msgstr ""
 "يشمل العملية الرئيسية وعمليات العامل وعمليات التخزين المؤقت وعمليات Nginx "
 "الأخرى"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:205
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:213
 msgid "Incremental index scanning"
 msgstr "مسح فهرس تدريجي"
 
@@ -3521,12 +3532,12 @@ msgstr "سجل"
 #: src/language/generate.ts:23
 msgid ""
 "Log file %{log_path} is not a regular file. If you are using nginx-ui in "
-"docker container, please refer to https://nginxui.com/zh_CN/guide/config-"
-"nginx-log.html for more information."
+"docker container, please refer to "
+"https://nginxui.com/zh_CN/guide/config-nginx-log.html for more information."
 msgstr ""
 "ملف السجل %{log_path} ليس ملفًا عاديًا. إذا كنت تستخدم nginx-ui في حاوية "
-"Docker، يرجى الرجوع إلى https://nginxui.com/zh_CN/guide/config-nginx-log."
-"html لمزيد من المعلومات."
+"Docker، يرجى الرجوع إلى "
+"https://nginxui.com/zh_CN/guide/config-nginx-log.html لمزيد من المعلومات."
 
 #: src/constants/errors/nginx_log.ts:14
 msgid "Log file does not exist"
@@ -3578,19 +3589,19 @@ msgstr "تدوير السجلات"
 
 #: src/views/preference/tabs/LogrotateSettings.vue:13
 msgid ""
-"Logrotate, by default, is enabled in most mainstream Linux distributions for "
-"users who install Nginx UI on the host machine, so you don't need to modify "
-"the parameters on this page. For users who install Nginx UI using Docker "
-"containers, you can manually enable this option. The crontab task scheduler "
-"of Nginx UI will execute the logrotate command at the interval you set in "
-"minutes."
+"Logrotate, by default, is enabled in most mainstream Linux distributions "
+"for users who install Nginx UI on the host machine, so you don't need to "
+"modify the parameters on this page. For users who install Nginx UI using "
+"Docker containers, you can manually enable this option. The crontab task "
+"scheduler of Nginx UI will execute the logrotate command at the interval "
+"you set in minutes."
 msgstr ""
 "بشكل افتراضي، يتم تفعيل تدوير السجلات في معظم توزيعات لينكس الرئيسية "
 "للمستخدمين الذين يقومون بتثبيت واجهة Nginx UI على الجهاز المضيف، لذا لا "
-"تحتاج إلى تعديل معايير في هذه الصفحة. بالنسبة للمستخدمين الذين يقومون بتثبيت "
-"واجهة Nginx UI باستخدام حاويات Docker، يمكنك تمكين هذا الخيار يدويًا. سيقوم "
-"مجدول المهام crontab الخاص بواجهة Nginx UI بتنفيذ أمر تدوير السجلات في "
-"الفاصل الزمني الذي تحدده بالدقائق."
+"تحتاج إلى تعديل معايير في هذه الصفحة. بالنسبة للمستخدمين الذين يقومون "
+"بتثبيت واجهة Nginx UI باستخدام حاويات Docker، يمكنك تمكين هذا الخيار "
+"يدويًا. سيقوم مجدول المهام crontab الخاص بواجهة Nginx UI بتنفيذ أمر تدوير "
+"السجلات في الفاصل الزمني الذي تحدده بالدقائق."
 
 #: src/composables/useGeoTranslation.ts:166
 #: src/views/nginx_log/dashboard/components/ChinaMapChart/ChinaMapChart.vue:135
@@ -3843,7 +3854,7 @@ msgstr "يوميًا في اليوم %{day} الساعة %{time}"
 msgid "Mozilla/5.0..."
 msgstr "Mozilla/5.0..."
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:229
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:237
 msgid "Multi-dimensional data visualization"
 msgstr "تصور البيانات متعدد الأبعاد"
 
@@ -4146,8 +4157,8 @@ msgstr "تمت استعادة تكوين Nginx UI"
 
 #: src/components/SystemRestore/SystemRestoreContent.vue:336
 msgid ""
-"Nginx UI configuration has been restored and will restart automatically in a "
-"few seconds."
+"Nginx UI configuration has been restored and will restart automatically in "
+"a few seconds."
 msgstr "تمت استعادة تكوين Nginx UI وسيتم إعادة التشغيل تلقائيًا خلال بضع ثوانٍ."
 
 #: src/language/generate.ts:30
@@ -4337,13 +4348,11 @@ msgstr "عدد عمليات العامل المتزامنة، يتم الضبط
 
 #: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:314
 msgid "Number of files processed by cache loader at once"
-msgstr ""
-"عدد الملفات التي تتم معالجتها بواسطة محمل ذاكرة التخزين المؤقت في وقت واحد"
+msgstr "عدد الملفات التي تتم معالجتها بواسطة محمل ذاكرة التخزين المؤقت في وقت واحد"
 
 #: src/views/dashboard/components/ParamsOpt/ProxyCacheConfig.vue:252
 msgid "Number of files processed by cache manager at once"
-msgstr ""
-"عدد الملفات التي تتم معالجتها بواسطة مدير ذاكرة التخزين المؤقت في وقت واحد"
+msgstr "عدد الملفات التي تتم معالجتها بواسطة مدير ذاكرة التخزين المؤقت في وقت واحد"
 
 #: src/composables/usePerformanceMetrics.ts:129
 #: src/composables/usePerformanceMetrics.ts:169
@@ -4393,7 +4402,7 @@ msgstr "الوثيقة الرسمية"
 msgid "Offline"
 msgstr "غير متصل"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:201
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:209
 msgid "Offline GeoIP analysis"
 msgstr "تحليل GeoIP دون اتصال"
 
@@ -4443,7 +4452,7 @@ msgstr "يُسمح فقط بملفات zip"
 msgid "Open"
 msgstr "مفتوح"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:238
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:246
 msgid "Open Source Limitation"
 msgstr "قيود المصدر المفتوح"
 
@@ -4667,8 +4676,7 @@ msgstr "الرجاء إدخال"
 msgid ""
 "Please enter a name for the passkey you wish to create and click the OK "
 "button below."
-msgstr ""
-"يرجى إدخال اسم لمفتاح المرور الذي ترغب في إنشائه ثم انقر على زر موافق أدناه."
+msgstr "يرجى إدخال اسم لمفتاح المرور الذي ترغب في إنشائه ثم انقر على زر موافق أدناه."
 
 #: src/components/AutoCertForm/AutoCertForm.vue:98
 msgid "Please enter a valid IPv4 address (0-255 per octet)"
@@ -4728,8 +4736,8 @@ msgstr ""
 #: src/components/Notification/notifications.ts:194
 #: src/language/constants.ts:59
 msgid ""
-"Please generate new recovery codes in the preferences immediately to prevent "
-"lockout."
+"Please generate new recovery codes in the preferences immediately to "
+"prevent lockout."
 msgstr "يرجى إنشاء رموز استرداد جديدة في التفضيلات على الفور لمنع الإغلاق."
 
 #: src/views/config/components/ConfigRightPanel/Basic.vue:27
@@ -4771,8 +4779,7 @@ msgid "Please log in."
 msgstr "الرجاء تسجيل الدخول."
 
 #: src/views/certificate/DNSCredential.vue:102
-msgid ""
-"Please note that the unit of time configurations below are all in seconds."
+msgid "Please note that the unit of time configurations below are all in seconds."
 msgstr "يرجى ملاحظة أن تكوين وحدات الوقت أدناه كلها بالثواني."
 
 #: src/views/install/components/InstallView.vue:102
@@ -4907,7 +4914,8 @@ msgstr "البروتوكول"
 #: src/views/preference/tabs/ServerSettings.vue:47
 msgid ""
 "Protocol configuration only takes effect when directly connecting. If using "
-"reverse proxy, please configure the protocol separately in the reverse proxy."
+"reverse proxy, please configure the protocol separately in the reverse "
+"proxy."
 msgstr ""
 "إعدادات البروتوكول تتأثر فقط عند الاتصال المباشر. إذا كنت تستخدم خادم وكيل "
 "عكسي، يرجى تكوين البروتوكول بشكل منفصل في خادم الوكيل العكسي."
@@ -4981,7 +4989,7 @@ msgstr "طلبات القراءة"
 msgid "Reads"
 msgstr "يقرأ"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:197
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:205
 msgid "Real-time analytics dashboard"
 msgstr "لوحة تحليلات في الوقت الفعلي"
 
@@ -5793,19 +5801,19 @@ msgstr "الإعدادات"
 
 #: src/constants/errors/nginx_log.ts:8
 msgid ""
-"Settings.NginxLogSettings.AccessLogPath is empty, refer to https://nginxui."
-"com/guide/config-nginx.html for more information"
+"Settings.NginxLogSettings.AccessLogPath is empty, refer to "
+"https://nginxui.com/guide/config-nginx.html for more information"
 msgstr ""
-"إعدادات.Settings.NginxLogSettings.AccessLogPath فارغة، راجع https://nginxui."
-"com/guide/config-nginx.html لمزيد من المعلومات"
+"إعدادات.Settings.NginxLogSettings.AccessLogPath فارغة، راجع "
+"https://nginxui.com/guide/config-nginx.html لمزيد من المعلومات"
 
 #: src/constants/errors/nginx_log.ts:7
 msgid ""
-"Settings.NginxLogSettings.ErrorLogPath is empty, refer to https://nginxui."
-"com/guide/config-nginx.html for more information"
+"Settings.NginxLogSettings.ErrorLogPath is empty, refer to "
+"https://nginxui.com/guide/config-nginx.html for more information"
 msgstr ""
-"إعدادات.Settings.NginxLogSettings.ErrorLogPath فارغة، راجع https://nginxui."
-"com/guide/config-nginx.html لمزيد من المعلومات"
+"إعدادات.Settings.NginxLogSettings.ErrorLogPath فارغة، راجع "
+"https://nginxui.com/guide/config-nginx.html لمزيد من المعلومات"
 
 #: src/views/install/components/InstallView.vue:65
 msgid "Setup your Nginx UI"
@@ -6104,9 +6112,9 @@ msgstr "الأحد"
 #: src/components/SelfCheck/tasks/frontend/websocket.ts:13
 msgid ""
 "Support communication with the backend through the WebSocket protocol. If "
-"your Nginx UI is being used via an Nginx reverse proxy, please refer to this "
-"link to write the corresponding configuration file: https://nginxui.com/"
-"guide/nginx-proxy-example.html"
+"your Nginx UI is being used via an Nginx reverse proxy, please refer to "
+"this link to write the corresponding configuration file: "
+"https://nginxui.com/guide/nginx-proxy-example.html"
 msgstr ""
 "دعم الاتصال مع الخلفية من خلال بروتوكول WebSocket. إذا كنت تستخدم واجهة "
 "Nginx عبر وكيل عكسي لـ Nginx، يرجى الرجوع إلى هذا الرابط لكتابة ملف التكوين "
@@ -6297,8 +6305,7 @@ msgstr ""
 msgid ""
 "The ICP Number should only contain letters, unicode, numbers, hyphens, "
 "dashes, colons, and dots."
-msgstr ""
-"يجب أن يحتوي رقم ICP على أحرف، يونيكود، أرقام، شرطات، نقاط، ونقطتين فقط."
+msgstr "يجب أن يحتوي رقم ICP على أحرف، يونيكود، أرقام، شرطات، نقاط، ونقطتين فقط."
 
 #: src/views/certificate/components/CertificateContentEditor.vue:115
 msgid "The input is not a SSL Certificate"
@@ -6310,10 +6317,11 @@ msgstr "المدخل ليس مفتاح شهادة SSL"
 
 #: src/constants/errors/nginx_log.ts:2
 msgid ""
-"The log path is not under the paths in settings.NginxSettings.LogDirWhiteList"
+"The log path is not under the paths in "
+"settings.NginxSettings.LogDirWhiteList"
 msgstr ""
-"مسار السجل ليس ضمن المسارات الموجودة في settings.NginxSettings."
-"LogDirWhiteList"
+"مسار السجل ليس ضمن المسارات الموجودة في "
+"settings.NginxSettings.LogDirWhiteList"
 
 #: src/views/preference/tabs/OpenAISettings.vue:23
 #: src/views/preference/tabs/OpenAISettings.vue:89
@@ -6325,8 +6333,7 @@ msgstr ""
 "فقط."
 
 #: src/views/preference/tabs/OpenAISettings.vue:90
-msgid ""
-"The model used for code completion, if not set, the chat model will be used."
+msgid "The model used for code completion, if not set, the chat model will be used."
 msgstr ""
 "النموذج المستخدم لإكمال التعليمات البرمجية، إذا لم يتم تعيينه، سيتم استخدام "
 "نموذج الدردشة."
@@ -6335,8 +6342,7 @@ msgstr ""
 msgid ""
 "The node name should only contain letters, unicode, numbers, hyphens, "
 "dashes, colons, and dots."
-msgstr ""
-"يجب أن يحتوي اسم العقدة على أحرف، يونيكود، أرقام، شرطات، نقاط، ونقطتين فقط."
+msgstr "يجب أن يحتوي اسم العقدة على أحرف، يونيكود، أرقام، شرطات، نقاط، ونقطتين فقط."
 
 #: src/views/site/site_add/SiteAdd.vue:96
 msgid "The parameter of server_name is required"
@@ -6442,14 +6448,13 @@ msgid "This field should not be empty"
 msgstr "يجب ألا يكون هذا الحقل فارغًا"
 
 #: src/constants/form_errors.ts:6
-msgid ""
-"This field should only contain letters, unicode characters, numbers, and -_."
+msgid "This field should only contain letters, unicode characters, numbers, and -_."
 msgstr "يجب أن يحتوي هذا الحقل على حروف وأحرف يونيكود وأرقام و-_. فقط."
 
 #: src/language/curd.ts:46
 msgid ""
-"This field should only contain letters, unicode characters, numbers, and -"
-"_./:"
+"This field should only contain letters, unicode characters, numbers, and "
+"-_./:"
 msgstr "يجب أن يحتوي هذا الحقل فقط على أحرف وأحرف يونيكود وأرقام و -_./:"
 
 #: src/components/Notification/notifications.ts:94
@@ -6461,8 +6466,8 @@ msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
 msgstr ""
-"توفر هذه الوحدة إحصائيات طلبات Nginx وعدد الاتصالات وما إلى ذلك من البيانات. "
-"بعد تمكينها، يمكنك عرض إحصائيات الأداء"
+"توفر هذه الوحدة إحصائيات طلبات Nginx وعدد الاتصالات وما إلى ذلك من "
+"البيانات. بعد تمكينها، يمكنك عرض إحصائيات الأداء"
 
 #: src/views/nginx_log/dashboard/components/DateRangeSelector.vue:25
 msgid "This month"
@@ -6482,9 +6487,9 @@ msgstr ""
 
 #: src/components/AutoCertForm/AutoCertForm.vue:128
 msgid ""
-"This site is configured as a default server (default_server) for HTTPS (port "
-"443). IP certificates require Certificate Authority (CA) support and may not "
-"be available with all ACME providers."
+"This site is configured as a default server (default_server) for HTTPS "
+"(port 443). IP certificates require Certificate Authority (CA) support and "
+"may not be available with all ACME providers."
 msgstr ""
 "تم تكوين هذا الموقع كخادم افتراضي (default_server) لـ HTTPS (المنفذ 443). "
 "تتطلب شهادات IP دعمًا من سلطة الشهادات (CA) وقد لا تكون متاحة مع جميع موفري "
@@ -6492,8 +6497,8 @@ msgstr ""
 
 #: src/components/AutoCertForm/AutoCertForm.vue:132
 msgid ""
-"This site uses wildcard server name (_) which typically indicates an IP-"
-"based certificate. IP certificates require Certificate Authority (CA) "
+"This site uses wildcard server name (_) which typically indicates an "
+"IP-based certificate. IP certificates require Certificate Authority (CA) "
 "support and may not be available with all ACME providers."
 msgstr ""
 "يستخدم هذا الموقع اسم خادم شامل (_) والذي يشير عادةً إلى شهادة قائمة على "
@@ -6543,12 +6548,11 @@ msgid ""
 "This will restore configuration files and database. Nginx UI will restart "
 "after the restoration is complete."
 msgstr ""
-"سيؤدي هذا إلى استعادة ملفات التكوين وقاعدة البيانات. سيعاد تشغيل واجهة Nginx "
-"بعد اكتمال الاستعادة."
+"سيؤدي هذا إلى استعادة ملفات التكوين وقاعدة البيانات. سيعاد تشغيل واجهة "
+"Nginx بعد اكتمال الاستعادة."
 
 #: src/views/node/BatchUpgrader.vue:186
-msgid ""
-"This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
+msgid "This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
 msgstr "سيتم ترقية أو إعادة تثبيت Nginx UI على %{nodeNames} إلى %{version}."
 
 #: src/views/preference/tabs/AuthSettings.vue:89
@@ -6619,8 +6623,8 @@ msgstr ""
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:15
 msgid ""
 "To make sure the certification auto-renewal can work normally, we need to "
-"add a location which can proxy the request from authority to backend, and we "
-"need to save this file and reload the Nginx. Are you sure you want to "
+"add a location which can proxy the request from authority to backend, and "
+"we need to save this file and reload the Nginx. Are you sure you want to "
 "continue?"
 msgstr ""
 "لضمان عمل تجديد الشهادة التلقائي بشكل طبيعي، نحتاج إلى إضافة موقع يمكنه "
@@ -6633,9 +6637,9 @@ msgid ""
 "provide an OpenAI-compatible API endpoint, so just set the baseUrl to your "
 "local API."
 msgstr ""
-"لاستخدام نموذج كبير محلي، قم بنشره باستخدام ollama أو vllm أو lmdeploy. توفر "
-"هذه الأدوات نقطة نهاية API متوافقة مع OpenAI، لذا ما عليك سوى تعيين baseUrl "
-"إلى API المحلي الخاص بك."
+"لاستخدام نموذج كبير محلي، قم بنشره باستخدام ollama أو vllm أو lmdeploy. "
+"توفر هذه الأدوات نقطة نهاية API متوافقة مع OpenAI، لذا ما عليك سوى تعيين "
+"baseUrl إلى API المحلي الخاص بك."
 
 #: src/views/dashboard/NginxDashBoard.vue:57
 msgid "Toggle failed"
@@ -7027,8 +7031,8 @@ msgid ""
 "you have a valid backup file and security token, and carefully select what "
 "to restore."
 msgstr ""
-"تحذير: ستقوم عملية الاستعادة بالكتابة فوق التكوينات الحالية. تأكد من أن لديك "
-"ملف نسخ احتياطي صالحًا ورمزًا أمنيًا، واختر بعناية ما تريد استعادته."
+"تحذير: ستقوم عملية الاستعادة بالكتابة فوق التكوينات الحالية. تأكد من أن "
+"لديك ملف نسخ احتياطي صالحًا ورمزًا أمنيًا، واختر بعناية ما تريد استعادته."
 
 #: src/components/AutoCertForm/AutoCertForm.vue:103
 msgid ""
@@ -7040,7 +7044,7 @@ msgstr ""
 "Encrypt إصدار شهادات لعناوين IP الخاصة. استخدم عنوان IP عام أو فكر في "
 "استخدام سلطة تصديق خاصة."
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:251
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:259
 msgid "We do not accept any feature requests"
 msgstr "نحن لا نقبل أي طلبات ميزات"
 
@@ -7052,8 +7056,8 @@ msgstr "سنضيف سجل أو أكثر من سجلات TXT إلى سجلات DN
 
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 msgid ""
-"We will remove the HTTPChallenge configuration from this file and reload the "
-"Nginx. Are you sure you want to continue?"
+"We will remove the HTTPChallenge configuration from this file and reload "
+"the Nginx. Are you sure you want to continue?"
 msgstr ""
 "سنقوم بإزالة تكوين HTTPChallenge من هذا الملف وإعادة تحميل Nginx. هل أنت "
 "متأكد أنك تريد المتابعة؟"
@@ -7106,8 +7110,8 @@ msgid ""
 "When you enable/disable, delete, or save this site, the nodes set in the "
 "namespace and the nodes selected below will be synchronized."
 msgstr ""
-"عند تمكين/تعطيل أو حذف أو حفظ هذا الموقع، سيتم مزامنة العقد المحددة في مساحة "
-"الاسم والعقد المحددة أدناه."
+"عند تمكين/تعطيل أو حذف أو حفظ هذا الموقع، سيتم مزامنة العقد المحددة في "
+"مساحة الاسم والعقد المحددة أدناه."
 
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:141
 msgid ""
@@ -7177,11 +7181,11 @@ msgstr "نعم"
 
 #: src/views/terminal/Terminal.vue:200
 msgid ""
-"You are accessing this terminal over an insecure HTTP connection on a non-"
-"localhost domain. This may expose sensitive information."
+"You are accessing this terminal over an insecure HTTP connection on a "
+"non-localhost domain. This may expose sensitive information."
 msgstr ""
-"أنت تتصل بهذا الطرف عبر اتصال HTTP غير آمن في نطاق غير محلي. قد يؤدي هذا إلى "
-"كشف معلومات حساسة."
+"أنت تتصل بهذا الطرف عبر اتصال HTTP غير آمن في نطاق غير محلي. قد يؤدي هذا "
+"إلى كشف معلومات حساسة."
 
 #: src/constants/errors/config.ts:8
 msgid "You are not allowed to delete a file outside of the nginx config path"
@@ -7210,8 +7214,7 @@ msgid ""
 msgstr "لم تقم بتكوين إعدادات Webauthn، لذا لا يمكنك إضافة مفتاح مرور."
 
 #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:82
-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 ""
 "لم تقم بتمكين المصادقة الثنائية بعد. يرجى تمكين المصادقة الثنائية لإنشاء "
 "رموز الاسترداد."
@@ -7237,7 +7240,7 @@ msgstr "رموزك القديمة لن تعمل بعد الآن."
 msgid "Your passkeys"
 msgstr "مفاتيح المرور الخاصة بك"
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:185
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:193
 msgid "Zero-allocation pipeline"
 msgstr "خط أنابيب بدون تخصيص"
 
@@ -7388,14 +7391,13 @@ msgstr "خط أنابيب بدون تخصيص"
 
 #~ msgid ""
 #~ "Support communication with the backend through the Server-Sent Events "
-#~ "protocol. If your Nginx UI is being used via an Nginx reverse proxy, "
-#~ "please refer to this link to write the corresponding configuration file: "
+#~ "protocol. If your Nginx UI is being used via an Nginx reverse proxy, please "
+#~ "refer to this link to write the corresponding configuration file: "
 #~ "https://nginxui.com/guide/nginx-proxy-example.html"
 #~ msgstr ""
-#~ "دعم الاتصال مع الخلفية من خلال بروتوكول Server-Sent Events. إذا كنت "
-#~ "تستخدم واجهة Nginx UI عبر وكيل عكسي لـ Nginx، يرجى الرجوع إلى هذا الرابط "
-#~ "لكتابة ملف التكوين المقابل: https://nginxui.com/guide/nginx-proxy-example."
-#~ "html"
+#~ "دعم الاتصال مع الخلفية من خلال بروتوكول Server-Sent Events. إذا كنت تستخدم "
+#~ "واجهة Nginx UI عبر وكيل عكسي لـ Nginx، يرجى الرجوع إلى هذا الرابط لكتابة "
+#~ "ملف التكوين المقابل: https://nginxui.com/guide/nginx-proxy-example.html"
 
 #~ msgid "If left blank, the default CA Dir will be used."
 #~ msgstr "إذا تُرك فارغًا، سيتم استخدام دليل CA الافتراضي."
@@ -7486,12 +7488,12 @@ msgstr "خط أنابيب بدون تخصيص"
 
 #~ msgid ""
 #~ "Check if /var/run/docker.sock exists. If you are using Nginx UI Official "
-#~ "Docker Image, please make sure the docker socket is mounted like this: `-"
-#~ "v /var/run/docker.sock:/var/run/docker.sock`."
+#~ "Docker Image, please make sure the docker socket is mounted like this: `-v "
+#~ "/var/run/docker.sock:/var/run/docker.sock`."
 #~ msgstr ""
 #~ "تحقق مما إذا كان /var/run/docker.sock موجودًا. إذا كنت تستخدم صورة Docker "
-#~ "الرسمية لـ Nginx UI، يرجى التأكد من أن مقبس Docker مثبت بهذه الطريقة: `-"
-#~ "v /var/run/docker.sock:/var/run/docker.sock`."
+#~ "الرسمية لـ Nginx UI، يرجى التأكد من أن مقبس Docker مثبت بهذه الطريقة: `-v "
+#~ "/var/run/docker.sock:/var/run/docker.sock`."
 
 #~ msgid "Check if the nginx access log path exists"
 #~ msgstr "تحقق مما إذا كان مسار سجل الوصول لـ nginx موجودًا"
@@ -7527,8 +7529,8 @@ msgstr "خط أنابيب بدون تخصيص"
 
 #, fuzzy
 #~ msgid ""
-#~ "When you enable/disable, delete, or save this stream, the nodes set in "
-#~ "the Node Group and the nodes selected below will be synchronized."
+#~ "When you enable/disable, delete, or save this stream, the nodes set in the "
+#~ "Node Group and the nodes selected below will be synchronized."
 #~ msgstr ""
 #~ "عند تفعيل/تعطيل، حذف، أو حفظ هذا الموقع، سيتم مزامنة العقد المحددة في فئة "
 #~ "الموقع والعقد المحددة أدناه."
@@ -7591,15 +7593,12 @@ msgstr "خط أنابيب بدون تخصيص"
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgstr "يرجى ترقية واجهة Nginx البعيدة إلى أحدث إصدار"
 
-#~ msgid ""
-#~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
-#~ "%{resp}"
+#~ msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: %{resp}"
 #~ msgstr ""
 #~ "فشل إعادة تسمية %{orig_path} إلى %{new_path} على %{env_name}، الاستجابة: "
 #~ "%{resp}"
 
-#~ msgid ""
-#~ "Rename Site %{site} to %{new_site} on %{node} error, response: %{resp}"
+#~ msgid "Rename Site %{site} to %{new_site} on %{node} error, response: %{resp}"
 #~ msgstr ""
 #~ "خطأ في إعادة تسمية الموقع %{site} إلى %{new_site} على %{node}، الاستجابة: "
 #~ "%{resp}"
@@ -7614,23 +7613,20 @@ msgstr "خط أنابيب بدون تخصيص"
 #~ "فشل مزامنة الشهادة %{cert_name} إلى %{env_name}، يرجى ترقية واجهة Nginx "
 #~ "البعيدة إلى أحدث إصدار"
 
-#~ msgid ""
-#~ "Sync Certificate %{cert_name} to %{env_name} failed, response: %{resp}"
+#~ msgid "Sync Certificate %{cert_name} to %{env_name} failed, response: %{resp}"
 #~ msgstr "فشل مزامنة الشهادة %{cert_name} إلى %{env_name}، الاستجابة: %{resp}"
 
 #~ msgid "Sync config %{config_name} to %{env_name} failed, response: %{resp}"
-#~ msgstr ""
-#~ "فشل مزامنة التكوين %{config_name} إلى %{env_name}، الاستجابة: %{resp}"
+#~ msgstr "فشل مزامنة التكوين %{config_name} إلى %{env_name}، الاستجابة: %{resp}"
 
 #~ msgid ""
-#~ "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 ""
 #~ "إذا فقدت هاتفك المحمول، يمكنك استخدام رمز الاسترداد لإعادة تعيين المصادقة "
 #~ "الثنائية."
 
-#~ msgid ""
-#~ "The recovery code is only displayed once, please save it in a safe place."
+#~ msgid "The recovery code is only displayed once, please save it in a safe place."
 #~ msgstr "رمز الاسترداد يُعرض مرة واحدة فقط، يرجى حفظه في مكان آمن."
 
 #~ msgid "Can't scan? Use text key binding"
@@ -7640,5 +7636,4 @@ msgstr "خط أنابيب بدون تخصيص"
 #~ msgstr "اسم المستخدم أو كلمة المرور غير صحيحة"
 
 #~ msgid "Too many login failed attempts, please try again later"
-#~ msgstr ""
-#~ "عدد كبير جدًا من محاولات تسجيل الدخول الفاشلة، يرجى المحاولة مرة أخرى لاحقًا"
+#~ msgstr "عدد كبير جدًا من محاولات تسجيل الدخول الفاشلة، يرجى المحاولة مرة أخرى لاحقًا"

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 189 - 205
app/src/language/de_DE/app.po


+ 33 - 21
app/src/language/en/app.po

@@ -92,7 +92,13 @@ msgstr ""
 msgid "* Includes nodes from group %{groupName} and manually selected nodes"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:168
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:141
+msgid ""
+"* Index files are stored in the \"log-index\" directory within your Nginx UI "
+"config path by default."
+msgstr ""
+
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:176
 msgid ""
 "* Performance metrics measured on Apple M2 Pro (12-core) with 32GB RAM. "
 "Actual performance may vary based on your hardware configuration."
@@ -252,7 +258,7 @@ msgstr ""
 msgid "Advanced indexing enabled successfully"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:245
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:253
 msgid "Advanced log indexing features are free and open source for all users"
 msgstr ""
 
@@ -260,7 +266,7 @@ msgstr ""
 msgid "Advanced memory pooling system"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:193
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:201
 msgid "Advanced search & filtering"
 msgstr ""
 
@@ -490,7 +496,7 @@ msgstr ""
 msgid "AutoCert is running..."
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:213
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:221
 msgid "Automated log rotation detection"
 msgstr ""
 
@@ -660,7 +666,7 @@ msgstr ""
 msgid "Browser Statistics"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:267
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:275
 msgid ""
 "By enabling advanced indexing, you acknowledge that your system meets the "
 "requirements and understand the performance implications. This will start "
@@ -1159,7 +1165,7 @@ msgstr ""
 msgid "components"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:221
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:229
 msgid "Compressed log file support"
 msgstr ""
 
@@ -1235,7 +1241,7 @@ msgstr ""
 msgid "Confirm New Password"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:266
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:274
 msgid "Confirmation Required"
 msgstr ""
 
@@ -1371,7 +1377,7 @@ msgstr ""
 msgid "Cron Expression"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:217
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:225
 msgid "Cross-file timeline correlation"
 msgstr ""
 
@@ -1871,7 +1877,7 @@ msgstr ""
 msgid "Dynamic"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:189
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:197
 msgid "Dynamic shard management"
 msgstr ""
 
@@ -2139,7 +2145,7 @@ msgid ""
 "messages."
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:225
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:233
 msgid "Error pattern recognition"
 msgstr ""
 
@@ -2167,7 +2173,7 @@ msgstr ""
 msgid "Expand"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:145
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:153
 msgid "Expected Performance"
 msgstr ""
 
@@ -2617,7 +2623,7 @@ msgstr ""
 msgid "Failed to write security key file: {0}"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:179
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:187
 msgid "Features"
 msgstr ""
 
@@ -2704,7 +2710,7 @@ msgstr ""
 msgid "For Chinese user: https://cloud.nginxui.com/"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:257
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:265
 msgid "For commercial or professional use, contact"
 msgstr ""
 
@@ -2757,7 +2763,7 @@ msgstr ""
 msgid "Full Text Search"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:209
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:217
 msgid "Full-text search support"
 msgstr ""
 
@@ -2940,6 +2946,12 @@ msgid ""
 "option."
 msgstr ""
 
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:142
+msgid ""
+"If you want to change the storage location, you can set the `IndexPath` of "
+"`nginx_log` section in the Nginx UI config."
+msgstr ""
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr ""
@@ -2969,7 +2981,7 @@ msgid ""
 "processes"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:205
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:213
 msgid "Incremental index scanning"
 msgstr ""
 
@@ -3732,7 +3744,7 @@ msgstr ""
 msgid "Mozilla/5.0..."
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:229
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:237
 msgid "Multi-dimensional data visualization"
 msgstr ""
 
@@ -4272,7 +4284,7 @@ msgstr ""
 msgid "Offline"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:201
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:209
 msgid "Offline GeoIP analysis"
 msgstr ""
 
@@ -4322,7 +4334,7 @@ msgstr ""
 msgid "Open"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:238
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:246
 msgid "Open Source Limitation"
 msgstr ""
 
@@ -4850,7 +4862,7 @@ msgstr ""
 msgid "Reads"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:197
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:205
 msgid "Real-time analytics dashboard"
 msgstr ""
 
@@ -6832,7 +6844,7 @@ msgid ""
 "or consider using a private CA."
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:251
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:259
 msgid "We do not accept any feature requests"
 msgstr ""
 
@@ -7016,6 +7028,6 @@ msgstr ""
 msgid "Your passkeys"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:185
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:193
 msgid "Zero-allocation pipeline"
 msgstr ""

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 201 - 202
app/src/language/es/app.po


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 198 - 209
app/src/language/fr_FR/app.po


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 173 - 268
app/src/language/ja_JP/app.po


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 178 - 253
app/src/language/ko_KR/app.po


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

@@ -95,7 +95,11 @@ msgstr ""
 msgid "* Includes nodes from group %{groupName} and manually selected nodes"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:168
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:141
+msgid "* Index files are stored in the \"log-index\" directory within your Nginx UI config path by default."
+msgstr ""
+
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:176
 msgid "* Performance metrics measured on Apple M2 Pro (12-core) with 32GB RAM. Actual performance may vary based on your hardware configuration."
 msgstr ""
 
@@ -261,7 +265,7 @@ msgstr ""
 msgid "Advanced indexing enabled successfully"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:245
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:253
 msgid "Advanced log indexing features are free and open source for all users"
 msgstr ""
 
@@ -269,7 +273,7 @@ msgstr ""
 msgid "Advanced memory pooling system"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:193
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:201
 msgid "Advanced search & filtering"
 msgstr ""
 
@@ -498,7 +502,7 @@ msgstr ""
 msgid "AutoCert is running..."
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:213
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:221
 msgid "Automated log rotation detection"
 msgstr ""
 
@@ -668,7 +672,7 @@ msgstr ""
 msgid "Browser Statistics"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:267
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:275
 msgid "By enabling advanced indexing, you acknowledge that your system meets the requirements and understand the performance implications. This will start indexing existing log files immediately."
 msgstr ""
 
@@ -1134,7 +1138,7 @@ msgstr ""
 msgid "components"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:221
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:229
 msgid "Compressed log file support"
 msgstr ""
 
@@ -1210,7 +1214,7 @@ msgstr ""
 msgid "Confirm New Password"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:266
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:274
 msgid "Confirmation Required"
 msgstr ""
 
@@ -1345,7 +1349,7 @@ msgstr ""
 msgid "Cron Expression"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:217
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:225
 msgid "Cross-file timeline correlation"
 msgstr ""
 
@@ -1849,7 +1853,7 @@ msgstr ""
 msgid "Dynamic"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:189
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:197
 msgid "Dynamic shard management"
 msgstr ""
 
@@ -2116,7 +2120,7 @@ msgstr ""
 msgid "Error logs do not support structured analysis as they contain free-form text messages."
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:225
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:233
 msgid "Error pattern recognition"
 msgstr ""
 
@@ -2144,7 +2148,7 @@ msgstr ""
 msgid "Expand"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:145
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:153
 msgid "Expected Performance"
 msgstr ""
 
@@ -2590,7 +2594,7 @@ msgstr ""
 msgid "Failed to write security key file: {0}"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:179
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:187
 msgid "Features"
 msgstr ""
 
@@ -2676,7 +2680,7 @@ msgstr ""
 msgid "For Chinese user: https://cloud.nginxui.com/"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:257
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:265
 msgid "For commercial or professional use, contact"
 msgstr ""
 
@@ -2725,7 +2729,7 @@ msgstr ""
 msgid "Full Text Search"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:209
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:217
 msgid "Full-text search support"
 msgstr ""
 
@@ -2901,6 +2905,10 @@ msgstr ""
 msgid "If you want to automatically revoke the old certificate, please enable this option."
 msgstr ""
 
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:142
+msgid "If you want to change the storage location, you can set the `IndexPath` of `nginx_log` section in the Nginx UI config."
+msgstr ""
+
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:76
 msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
 msgstr ""
@@ -2926,7 +2934,7 @@ msgstr ""
 msgid "Includes master process, worker processes, cache processes, and other Nginx processes"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:205
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:213
 msgid "Incremental index scanning"
 msgstr ""
 
@@ -3684,7 +3692,7 @@ msgstr ""
 msgid "Mozilla/5.0..."
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:229
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:237
 msgid "Multi-dimensional data visualization"
 msgstr ""
 
@@ -4228,7 +4236,7 @@ msgstr ""
 msgid "Offline"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:201
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:209
 msgid "Offline GeoIP analysis"
 msgstr ""
 
@@ -4280,7 +4288,7 @@ msgstr ""
 msgid "Open"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:238
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:246
 msgid "Open Source Limitation"
 msgstr ""
 
@@ -4800,7 +4808,7 @@ msgstr ""
 msgid "Reads"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:197
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:205
 msgid "Real-time analytics dashboard"
 msgstr ""
 
@@ -6734,7 +6742,7 @@ msgstr ""
 msgid "Warning: This appears to be a private IP address. Public CAs like Let's Encrypt cannot issue certificates for private IPs. Use a public IP address or consider using a private CA."
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:251
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:259
 msgid "We do not accept any feature requests"
 msgstr ""
 
@@ -6901,6 +6909,6 @@ msgstr ""
 msgid "Your passkeys"
 msgstr ""
 
-#: src/views/nginx_log/components/IndexingSettingsModal.vue:185
+#: src/views/nginx_log/components/IndexingSettingsModal.vue:193
 msgid "Zero-allocation pipeline"
 msgstr ""

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 195 - 206
app/src/language/pt_PT/app.po


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 198 - 201
app/src/language/ru_RU/app.po


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 199 - 208
app/src/language/tr_TR/app.po


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 211 - 213
app/src/language/uk_UA/app.po


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 213 - 213
app/src/language/vi_VN/app.po


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 178 - 240
app/src/language/zh_CN/app.po


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 184 - 246
app/src/language/zh_TW/app.po


+ 8 - 0
app/src/views/nginx_log/components/IndexingSettingsModal.vue

@@ -134,6 +134,14 @@ function handleCancel() {
             </AListItem>
           </template>
         </AList>
+
+        <!-- Subtle note about Bleve index storage location -->
+        <div class="mt-2">
+          <ATypographyText type="secondary" class="text-xs">
+            {{ $gettext('* Index files are stored in the "log-index" directory within your Nginx UI config path by default.') }}
+            {{ $gettext('If you want to change the storage location, you can set the `IndexPath` of `nginx_log` section in the Nginx UI config.') }}
+          </ATypographyText>
+        </div>
       </div>
 
       <ADivider />

+ 1 - 0
app/src/views/preference/store/index.ts

@@ -69,6 +69,7 @@ const useSystemSettingsStore = defineStore('systemSettings', () => {
     },
     nginx_log: {
       advanced_indexing_enabled: false,
+      index_path: '',
     },
     node: {
       name: '',

+ 25 - 9
docs/guide/config-nginx-log.md

@@ -13,19 +13,34 @@ This section covers configuration options for Nginx log processing and analysis
 
 This option enables advanced indexing for Nginx logs, which provides high-performance log search and analysis capabilities.
 
-### System Requirements
+#### Behavior When Disabled (Basic Mode)
 
-#### Minimum Requirements
+When `AdvancedIndexingEnabled` is set to `false`, Nginx UI still discovers log entries from your Nginx configuration and shows them in the Logs list. In this basic mode:
+
+- You can view the list of detected log files (grouped by simple rotation patterns), but advanced features like indexing metrics, document counts, and search shards are not available.
+- Real-time viewing (tail) continues to work based on resolved access/error log paths.
+
+### IndexPath
+
+- Type: `string`
+- Version: `>= v2.2.0`
+
+- By default, Bleve index files are stored in the `log-index` directory located under your Nginx UI config directory (for example, `/usr/local/nginx-ui/log-index`).
+- If the config directory cannot be determined, the fallback path is `./log-index` relative to the application.
+
+## System Requirements
+
+### Minimum Requirements
 - **CPU**: 1 core minimum
 - **Memory**: 2GB RAM minimum
 - **Storage**: At least 20GB available disk space
 
-#### Recommended Configuration
+### Recommended Configuration
 - **CPU**: 2+ cores recommended
 - **Memory**: 4GB+ RAM recommended
 - **Storage**: SSD storage for better I/O performance
 
-### Performance Metrics
+## Performance Metrics
 
 Based on production validation and comprehensive testing (M2 Pro 12 cores, September 2025):
 
@@ -38,23 +53,23 @@ Based on production validation and comprehensive testing (M2 Pro 12 cores, Septe
 | **Adaptive Scaling** | **12→36 workers** | Dynamic resource optimization |
 | **Batch Optimization** | **1000→6000** | Real-time throughput tuning |
 
-### Features
+## Features
 
 When advanced indexing is enabled, you get access to the following features:
 
-#### Core Capabilities
+### Core Capabilities
 - **Zero-allocation pipeline** - Optimized memory usage for high-performance processing
 - **Dynamic shard management** - Intelligent distribution of log data across shards
 - **Incremental index scanning** - Only indexes new log entries for efficiency
 - **Automated log rotation detection** - Seamlessly handles rotated log files
 
-#### Search & Analysis
+### Search & Analysis
 - **Advanced search & filtering** - Complex queries with multiple criteria
 - **Full-text search with regex support** - Powerful pattern matching capabilities
 - **Cross-file timeline correlation** - Analyze events across multiple log files
 - **Error pattern recognition** - Automatic detection of error patterns
 
-#### Data Processing
+### Data Processing
 - **Compressed log file support** - Works with gzipped and other compressed formats
 - **Offline GeoIP analysis** - Location-based analytics without external services
 - **Real-time analytics dashboard** - Live monitoring and statistics
@@ -74,4 +89,5 @@ Advanced indexing delivers enterprise-grade performance with **~10,000 records/s
 
 ::: warning Initial Indexing
 When you enable advanced indexing, the system will immediately start indexing existing log files. This initial indexing process may temporarily impact system performance.
-:::
+:::
+

+ 1 - 0
docs/guide/env.md

@@ -93,6 +93,7 @@ Applicable for version v2.0.0-beta.37 and above.
 | Configuration Setting  | Environment Variable                   |
 |------------------------|---------------------------------------|
 | AdvancedIndexingEnabled | NGINX_UI_NGINX_LOG_ADVANCED_INDEXING_ENABLED |
+| IndexPath               | NGINX_UI_NGINX_LOG_INDEX_PATH                |
 
 ## Node
 | Configuration Setting | Environment Variable            |

+ 25 - 9
docs/zh_CN/guide/config-nginx-log.md

@@ -13,19 +13,34 @@
 
 此选项启用 Nginx 日志的高级索引功能,提供高性能的日志搜索和分析能力。
 
-### 系统要求
+#### 关闭时的行为(基础模式)
 
-#### 最低要求
+当 `AdvancedIndexingEnabled` 为 `false` 时,Nginx UI 仍会从 Nginx 配置中发现日志入口,并在日志列表中展示。在基础模式下:
+
+- 可以查看已检测到的日志文件列表(基于简单的轮转规则进行分组),但不提供索引指标、文档计数和分片搜索等高级功能。
+- 基于解析到的访问/错误日志路径,实时查看(tail)仍可使用。
+
+### IndexPath
+
+- 类型:`string`
+- 版本:`>= v2.2.0`
+
+- 默认情况下,Bleve 索引文件存放在 Nginx UI 配置目录下的 `log-index` 目录(例如:`/usr/local/nginx-ui/log-index`)。
+- 如果无法确定配置目录,回退路径为应用相对路径的 `./log-index`。
+
+## 系统要求
+
+### 最低要求
 - **CPU**: 最少 1 核心
 - **内存**: 最少 2GB RAM
 - **存储**: 至少 20GB 可用磁盘空间
 
-#### 推荐配置
+### 推荐配置
 - **CPU**: 建议 2 核心或以上
 - **内存**: 建议 4GB RAM 或以上
 - **存储**: 建议使用 SSD 以获得更好的 I/O 性能
 
-### 性能指标
+## 性能指标
 
 基于生产环境验证和全面测试(M2 Pro 12核心,2025年9月):
 
@@ -38,23 +53,23 @@
 | **自适应扩展** | **12→36 工作线程** | 动态资源优化 |
 | **批处理优化** | **1000→6000** | 实时吞吐量调优 |
 
-### 功能特性
+## 功能特性
 
 启用高级索引后,您将获得以下功能:
 
-#### 核心能力
+### 核心能力
 - **零分配管道** - 优化内存使用以实现高性能处理
 - **动态分片管理** - 智能分布日志数据到各个分片
 - **增量索引扫描** - 仅索引新的日志条目以提高效率
 - **自动日志轮转检测** - 无缝处理轮转的日志文件
 
-#### 搜索与分析
+### 搜索与分析
 - **高级搜索和过滤** - 支持多条件的复杂查询
 - **支持正则表达式的全文搜索** - 强大的模式匹配能力
 - **跨文件时间线关联** - 分析多个日志文件中的事件
 - **错误模式识别** - 自动检测错误模式
 
-#### 数据处理
+### 数据处理
 - **压缩日志文件支持** - 支持 gzip 和其他压缩格式
 - **离线 GeoIP 分析** - 无需外部服务的位置分析
 - **实时分析仪表板** - 实时监控和统计
@@ -74,4 +89,5 @@
 
 ::: warning 初始索引
 当您启用高级索引时,系统将立即开始索引现有日志文件。此初始索引过程可能会暂时影响系统性能。
-:::
+:::
+

+ 1 - 0
docs/zh_CN/guide/env.md

@@ -104,6 +104,7 @@
 | 配置                     | 环境变量                                       |
 |-------------------------|-----------------------------------------------|
 | AdvancedIndexingEnabled | NGINX_UI_NGINX_LOG_ADVANCED_INDEXING_ENABLED |
+| IndexPath               | NGINX_UI_NGINX_LOG_INDEX_PATH                |
 
 ## Node
 

+ 25 - 9
docs/zh_TW/guide/config-nginx-log.md

@@ -13,19 +13,35 @@
 
 此選項啟用 Nginx 日誌的進階索引功能,提供高效能的日誌搜尋和分析能力。
 
-### 系統需求
+#### 關閉時的行為(基礎模式)
 
-#### 最低需求
+當 `AdvancedIndexingEnabled` 為 `false` 時,Nginx UI 仍會從 Nginx 設定中發現日誌入口,並在日誌列表中顯示。在基礎模式下:
+
+- 可檢視已偵測到的日誌檔列表(基於簡單的輪轉規則進行分組),但不提供索引指標、文件計數與分片搜尋等進階功能。
+- 依據解析出的存取/錯誤日誌路徑,即時檢視(tail)仍可使用。
+
+### IndexPath
+
+- 類型:`string`
+- 版本:`>= v2.2.0`
+
+- 預設情況下,Bleve 索引檔存放於 Nginx UI 設定目錄下的 `log-index` 目錄(例如:`/usr/local/nginx-ui/log-index`)。
+- 若無法判定設定目錄,則回退至應用相對路徑的 `./log-index`。
+
+
+## 系統需求
+
+### 最低需求
 - **CPU**: 最少 1 核心
 - **記憶體**: 最少 2GB RAM
 - **儲存**: 至少 20GB 可用磁碟空間
 
-#### 建議配置
+### 建議配置
 - **CPU**: 建議 2 核心或以上
 - **記憶體**: 建議 4GB RAM 或以上
 - **儲存**: 建議使用 SSD 以獲得更好的 I/O 效能
 
-### 效能指標
+## 效能指標
 
 基於生產環境驗證和全面測試(M2 Pro 12核心,2025年9月):
 
@@ -38,23 +54,23 @@
 | **自適應擴展** | **12→36 工作執行緒** | 動態資源最佳化 |
 | **批次處理最佳化** | **1000→6000** | 即時吞吐量調優 |
 
-### 功能特性
+## 功能特性
 
 啟用進階索引後,您將獲得以下功能:
 
-#### 核心能力
+### 核心能力
 - **零分配管道** - 最佳化記憶體使用以實現高效能處理
 - **動態分片管理** - 智慧分布日誌資料到各個分片
 - **增量索引掃描** - 僅索引新的日誌條目以提高效率
 - **自動日誌輪轉偵測** - 無縫處理輪轉的日誌檔案
 
-#### 搜尋與分析
+### 搜尋與分析
 - **進階搜尋和過濾** - 支援多條件的複雜查詢
 - **支援正規表示式的全文搜尋** - 強大的模式比對能力
 - **跨檔案時間線關聯** - 分析多個日誌檔案中的事件
 - **錯誤模式識別** - 自動偵測錯誤模式
 
-#### 資料處理
+### 資料處理
 - **壓縮日誌檔案支援** - 支援 gzip 和其他壓縮格式
 - **離線 GeoIP 分析** - 無需外部服務的位置分析
 - **即時分析儀表板** - 即時監控和統計
@@ -74,4 +90,4 @@
 
 ::: warning 初始索引
 當您啟用進階索引時,系統將立即開始索引現有日誌檔案。此初始索引過程可能會暫時影響系統效能。
-:::
+:::

+ 1 - 0
docs/zh_TW/guide/env.md

@@ -104,6 +104,7 @@
 | 設定                     | 環境變數                                       |
 |-------------------------|-----------------------------------------------|
 | AdvancedIndexingEnabled | NGINX_UI_NGINX_LOG_ADVANCED_INDEXING_ENABLED |
+| IndexPath               | NGINX_UI_NGINX_LOG_INDEX_PATH                |
 
 ## Node
 

+ 12 - 0
internal/nginx_log/modern_services.go

@@ -124,6 +124,18 @@ func initializeWithDefaults(ctx context.Context) error {
 
 // getConfigDirIndexPath returns the index path relative to the config file directory
 func getConfigDirIndexPath() string {
+	// Use custom path if configured
+	if settings.NginxLogSettings.IndexPath != "" {
+		indexPath := settings.NginxLogSettings.IndexPath
+		// Ensure the directory exists
+		if err := os.MkdirAll(indexPath, 0755); err != nil {
+			logger.Warnf("Failed to create custom index directory at %s: %v, using default", indexPath, err)
+		} else {
+			logger.Infof("Using custom index path: %s", indexPath)
+			return indexPath
+		}
+	}
+
 	// Get the config file path from cosy settings
 	if cSettings.ConfPath != "" {
 		configDir := filepath.Dir(cSettings.ConfPath)

+ 2 - 1
router/routers.go

@@ -95,6 +95,7 @@ func InitRouter() {
 			notification.InitRouter(g)
 			external_notify.InitRouter(g)
 			backup.InitAutoBackupRouter(g)
+			nginxLog.InitRouter(g)
 		}
 
 		// Authorization required and websocket request
@@ -107,7 +108,7 @@ func InitRouter() {
 			{
 				terminal.InitRouter(o)
 			}
-			nginxLog.InitRouter(w)
+			nginxLog.InitWebSocketRouter(w)
 			upstream.InitRouter(w)
 			system.InitWebSocketRouter(w)
 			nginx.InitWebSocketRouter(w)

+ 2 - 1
settings/nginx_log.go

@@ -1,7 +1,8 @@
 package settings
 
 type NginxLog struct {
-	AdvancedIndexingEnabled bool `json:"advanced_indexing_enabled"`
+	AdvancedIndexingEnabled bool   `json:"advanced_indexing_enabled"`
+	IndexPath               string `json:"index_path"`
 }
 
 var NginxLogSettings = &NginxLog{}

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä