Browse Source

feat(CORS): add CORS middleware to allow all origins and update ws URL handling for dev

Jacky 3 days ago
parent
commit
3058ec11e6

+ 1 - 1
app/.env

@@ -1 +1 @@
-VITE_PROXY_TARGET=http://127.0.0.1:9000
+VITE_PROXY_TARGET=http://127.0.0.1:9001

+ 103 - 103
app/pnpm-lock.yaml

@@ -1102,63 +1102,63 @@ packages:
   '@types/yauzl@2.10.3':
     resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
 
-  '@typescript-eslint/eslint-plugin@8.34.1':
-    resolution: {integrity: sha512-STXcN6ebF6li4PxwNeFnqF8/2BNDvBupf2OPx2yWNzr6mKNGF7q49VM00Pz5FaomJyqvbXpY6PhO+T9w139YEQ==}
+  '@typescript-eslint/eslint-plugin@8.35.0':
+    resolution: {integrity: sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
-      '@typescript-eslint/parser': ^8.34.1
+      '@typescript-eslint/parser': ^8.35.0
       eslint: ^8.57.0 || ^9.0.0
       typescript: '>=4.8.4 <5.9.0'
 
-  '@typescript-eslint/parser@8.34.1':
-    resolution: {integrity: sha512-4O3idHxhyzjClSMJ0a29AcoK0+YwnEqzI6oz3vlRf3xw0zbzt15MzXwItOlnr5nIth6zlY2RENLsOPvhyrKAQA==}
+  '@typescript-eslint/parser@8.35.0':
+    resolution: {integrity: sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
       typescript: '>=4.8.4 <5.9.0'
 
-  '@typescript-eslint/project-service@8.34.1':
-    resolution: {integrity: sha512-nuHlOmFZfuRwLJKDGQOVc0xnQrAmuq1Mj/ISou5044y1ajGNp2BNliIqp7F2LPQ5sForz8lempMFCovfeS1XoA==}
+  '@typescript-eslint/project-service@8.35.0':
+    resolution: {integrity: sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       typescript: '>=4.8.4 <5.9.0'
 
-  '@typescript-eslint/scope-manager@8.34.1':
-    resolution: {integrity: sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA==}
+  '@typescript-eslint/scope-manager@8.35.0':
+    resolution: {integrity: sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@typescript-eslint/tsconfig-utils@8.34.1':
-    resolution: {integrity: sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg==}
+  '@typescript-eslint/tsconfig-utils@8.35.0':
+    resolution: {integrity: sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       typescript: '>=4.8.4 <5.9.0'
 
-  '@typescript-eslint/type-utils@8.34.1':
-    resolution: {integrity: sha512-Tv7tCCr6e5m8hP4+xFugcrwTOucB8lshffJ6zf1mF1TbU67R+ntCc6DzLNKM+s/uzDyv8gLq7tufaAhIBYeV8g==}
+  '@typescript-eslint/type-utils@8.35.0':
+    resolution: {integrity: sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
       typescript: '>=4.8.4 <5.9.0'
 
-  '@typescript-eslint/types@8.34.1':
-    resolution: {integrity: sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==}
+  '@typescript-eslint/types@8.35.0':
+    resolution: {integrity: sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@typescript-eslint/typescript-estree@8.34.1':
-    resolution: {integrity: sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA==}
+  '@typescript-eslint/typescript-estree@8.35.0':
+    resolution: {integrity: sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       typescript: '>=4.8.4 <5.9.0'
 
-  '@typescript-eslint/utils@8.34.1':
-    resolution: {integrity: sha512-mqOwUdZ3KjtGk7xJJnLbHxTuWVn3GO2WZZuM+Slhkun4+qthLdXx32C8xIXbO1kfCECb3jIs3eoxK3eryk7aoQ==}
+  '@typescript-eslint/utils@8.35.0':
+    resolution: {integrity: sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
       typescript: '>=4.8.4 <5.9.0'
 
-  '@typescript-eslint/visitor-keys@8.34.1':
-    resolution: {integrity: sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw==}
+  '@typescript-eslint/visitor-keys@8.35.0':
+    resolution: {integrity: sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
   '@unocss/astro@66.2.3':
@@ -1289,14 +1289,14 @@ packages:
       vitest:
         optional: true
 
-  '@volar/language-core@2.4.14':
-    resolution: {integrity: sha512-X6beusV0DvuVseaOEy7GoagS4rYHgDHnTrdOj5jeUb49fW5ceQyP9Ej5rBhqgz2wJggl+2fDbbojq1XKaxDi6w==}
+  '@volar/language-core@2.4.15':
+    resolution: {integrity: sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==}
 
-  '@volar/source-map@2.4.14':
-    resolution: {integrity: sha512-5TeKKMh7Sfxo8021cJfmBzcjfY1SsXsPMMjMvjY7ivesdnybqqS+GxGAoXHAOUawQTwtdUxgP65Im+dEmvWtYQ==}
+  '@volar/source-map@2.4.15':
+    resolution: {integrity: sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==}
 
-  '@volar/typescript@2.4.14':
-    resolution: {integrity: sha512-p8Z6f/bZM3/HyCdRNFZOEEzts51uV8WHeN8Tnfnm2EBv6FDB2TQLzfVx7aJvnl8ofKAOnS64B2O8bImBFaauRw==}
+  '@volar/typescript@2.4.15':
+    resolution: {integrity: sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==}
 
   '@vue-macros/common@1.16.1':
     resolution: {integrity: sha512-Pn/AWMTjoMYuquepLZP813BIcq8DTZiNCoaceuNlvaYuOTd8DqBZWc5u0uOMQZMInwME1mdSmmBAcTluiV9Jtg==}
@@ -1937,8 +1937,8 @@ packages:
   eastasianwidth@0.2.0:
     resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
 
-  electron-to-chromium@1.5.171:
-    resolution: {integrity: sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==}
+  electron-to-chromium@1.5.173:
+    resolution: {integrity: sha512-2bFhXP2zqSfQHugjqJIDFVwa+qIxyNApenmXTp9EjaKtdPrES5Qcn9/aSFy/NaP2E+fWG/zxKu/LBvY36p5VNQ==}
 
   emoji-regex@8.0.0:
     resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -1952,8 +1952,8 @@ packages:
   end-of-stream@1.4.5:
     resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
 
-  enhanced-resolve@5.18.1:
-    resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
+  enhanced-resolve@5.18.2:
+    resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==}
     engines: {node: '>=10.13.0'}
 
   entities@4.5.0:
@@ -2097,8 +2097,8 @@ packages:
       typescript:
         optional: true
 
-  eslint-plugin-jsdoc@51.2.1:
-    resolution: {integrity: sha512-iE2qpG/kaA9xXfEcTNSsxNvH5O8+o38VBGLwl2oZisQaM1JRGftTLJAGQrj7YZjSkp3n9VCrNTjOpo3ONhTApQ==}
+  eslint-plugin-jsdoc@51.2.3:
+    resolution: {integrity: sha512-pagzxFubOih+O6XSB1D8BkDkJjF4G4/v8s9pRg4FkXQJLu0e3QJg621ayhmnhyc5mNBpp3cYCNiUyeLQs7oz7w==}
     engines: {node: '>=20.11.0'}
     peerDependencies:
       eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
@@ -2661,8 +2661,8 @@ packages:
   isexe@2.0.0:
     resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
 
-  isomorphic-git@1.31.0:
-    resolution: {integrity: sha512-huMXDX1pMuBc0+GQSp7zD4ejqmrhqwWlK2X7p2dZyb7p2DKZWva4kRc4aH+0EE92W1j3+D7N4VRv35RCMWAeCQ==}
+  isomorphic-git@1.31.1:
+    resolution: {integrity: sha512-aQ2fg2Qf69Abhu4C3WkRDhr5WcY40mQpIALC2+HTJjeyKlKT/7pXm9KUEtcCbR6TnLxmzOO98IFQvkY6cBIzaw==}
     engines: {node: '>=14.17'}
     hasBin: true
 
@@ -3849,8 +3849,8 @@ packages:
     peerDependencies:
       vue: ^3.4.36
 
-  vue-eslint-parser@10.1.3:
-    resolution: {integrity: sha512-dbCBnd2e02dYWsXoqX5yKUZlOt+ExIpq7hmHKPb5ZqKcjf++Eo0hMseFTZMLKThrUk61m+Uv6A2YSBve6ZvuDQ==}
+  vue-eslint-parser@10.1.4:
+    resolution: {integrity: sha512-EIZvCukIEMHEb3mxOKemtvWR1fcUAdWWAgkfyjmRHzvyhrZvBvH9oz69+thDIWhGiIQjZnPkCn8yHqvjM+a9eg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
@@ -4045,8 +4045,8 @@ snapshots:
       '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.29.0(jiti@2.4.2))
       '@eslint/markdown': 6.6.0
       '@stylistic/eslint-plugin': 5.0.0(eslint@9.29.0(jiti@2.4.2))
-      '@typescript-eslint/eslint-plugin': 8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
-      '@typescript-eslint/parser': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      '@typescript-eslint/eslint-plugin': 8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      '@typescript-eslint/parser': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
       '@vitest/eslint-plugin': 1.2.7(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
       ansis: 4.1.0
       cac: 6.7.14
@@ -4057,7 +4057,7 @@ snapshots:
       eslint-plugin-antfu: 3.1.1(eslint@9.29.0(jiti@2.4.2))
       eslint-plugin-command: 3.3.1(eslint@9.29.0(jiti@2.4.2))
       eslint-plugin-import-lite: 0.3.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
-      eslint-plugin-jsdoc: 51.2.1(eslint@9.29.0(jiti@2.4.2))
+      eslint-plugin-jsdoc: 51.2.3(eslint@9.29.0(jiti@2.4.2))
       eslint-plugin-jsonc: 2.20.1(eslint@9.29.0(jiti@2.4.2))
       eslint-plugin-n: 17.20.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
       eslint-plugin-no-only-tests: 3.3.0
@@ -4066,8 +4066,8 @@ snapshots:
       eslint-plugin-regexp: 2.9.0(eslint@9.29.0(jiti@2.4.2))
       eslint-plugin-toml: 0.12.0(eslint@9.29.0(jiti@2.4.2))
       eslint-plugin-unicorn: 59.0.1(eslint@9.29.0(jiti@2.4.2))
-      eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))
-      eslint-plugin-vue: 10.2.0(eslint@9.29.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.29.0(jiti@2.4.2)))
+      eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))
+      eslint-plugin-vue: 10.2.0(eslint@9.29.0(jiti@2.4.2))(vue-eslint-parser@10.1.4(eslint@9.29.0(jiti@2.4.2)))
       eslint-plugin-yml: 1.18.0(eslint@9.29.0(jiti@2.4.2))
       eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.17)(eslint@9.29.0(jiti@2.4.2))
       globals: 16.2.0
@@ -4075,7 +4075,7 @@ snapshots:
       local-pkg: 1.1.1
       parse-gitignore: 2.0.0
       toml-eslint-parser: 0.10.0
-      vue-eslint-parser: 10.1.3(eslint@9.29.0(jiti@2.4.2))
+      vue-eslint-parser: 10.1.4(eslint@9.29.0(jiti@2.4.2))
       yaml-eslint-parser: 1.3.0
     transitivePeerDependencies:
       - '@eslint/json'
@@ -4278,7 +4278,7 @@ snapshots:
   '@es-joy/jsdoccomment@0.50.2':
     dependencies:
       '@types/estree': 1.0.8
-      '@typescript-eslint/types': 8.34.1
+      '@typescript-eslint/types': 8.35.0
       comment-parser: 1.4.1
       esquery: 1.6.0
       jsdoc-type-pratt-parser: 4.1.0
@@ -4286,7 +4286,7 @@ snapshots:
   '@es-joy/jsdoccomment@0.52.0':
     dependencies:
       '@types/estree': 1.0.8
-      '@typescript-eslint/types': 8.34.1
+      '@typescript-eslint/types': 8.35.0
       comment-parser: 1.4.1
       esquery: 1.6.0
       jsdoc-type-pratt-parser: 4.1.0
@@ -4738,7 +4738,7 @@ snapshots:
   '@stylistic/eslint-plugin@5.0.0(eslint@9.29.0(jiti@2.4.2))':
     dependencies:
       '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2))
-      '@typescript-eslint/types': 8.34.1
+      '@typescript-eslint/types': 8.35.0
       eslint: 9.29.0(jiti@2.4.2)
       eslint-visitor-keys: 4.2.1
       espree: 10.4.0
@@ -4816,14 +4816,14 @@ snapshots:
       '@types/node': 24.0.3
     optional: true
 
-  '@typescript-eslint/eslint-plugin@8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)':
+  '@typescript-eslint/eslint-plugin@8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)':
     dependencies:
       '@eslint-community/regexpp': 4.12.1
-      '@typescript-eslint/parser': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
-      '@typescript-eslint/scope-manager': 8.34.1
-      '@typescript-eslint/type-utils': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
-      '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
-      '@typescript-eslint/visitor-keys': 8.34.1
+      '@typescript-eslint/parser': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      '@typescript-eslint/scope-manager': 8.35.0
+      '@typescript-eslint/type-utils': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      '@typescript-eslint/visitor-keys': 8.35.0
       eslint: 9.29.0(jiti@2.4.2)
       graphemer: 1.4.0
       ignore: 7.0.5
@@ -4833,40 +4833,40 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)':
+  '@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)':
     dependencies:
-      '@typescript-eslint/scope-manager': 8.34.1
-      '@typescript-eslint/types': 8.34.1
-      '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3)
-      '@typescript-eslint/visitor-keys': 8.34.1
+      '@typescript-eslint/scope-manager': 8.35.0
+      '@typescript-eslint/types': 8.35.0
+      '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3)
+      '@typescript-eslint/visitor-keys': 8.35.0
       debug: 4.4.1
       eslint: 9.29.0(jiti@2.4.2)
       typescript: 5.8.3
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/project-service@8.34.1(typescript@5.8.3)':
+  '@typescript-eslint/project-service@8.35.0(typescript@5.8.3)':
     dependencies:
-      '@typescript-eslint/tsconfig-utils': 8.34.1(typescript@5.8.3)
-      '@typescript-eslint/types': 8.34.1
+      '@typescript-eslint/tsconfig-utils': 8.35.0(typescript@5.8.3)
+      '@typescript-eslint/types': 8.35.0
       debug: 4.4.1
       typescript: 5.8.3
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/scope-manager@8.34.1':
+  '@typescript-eslint/scope-manager@8.35.0':
     dependencies:
-      '@typescript-eslint/types': 8.34.1
-      '@typescript-eslint/visitor-keys': 8.34.1
+      '@typescript-eslint/types': 8.35.0
+      '@typescript-eslint/visitor-keys': 8.35.0
 
-  '@typescript-eslint/tsconfig-utils@8.34.1(typescript@5.8.3)':
+  '@typescript-eslint/tsconfig-utils@8.35.0(typescript@5.8.3)':
     dependencies:
       typescript: 5.8.3
 
-  '@typescript-eslint/type-utils@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)':
+  '@typescript-eslint/type-utils@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)':
     dependencies:
-      '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3)
-      '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
       debug: 4.4.1
       eslint: 9.29.0(jiti@2.4.2)
       ts-api-utils: 2.1.0(typescript@5.8.3)
@@ -4874,14 +4874,14 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/types@8.34.1': {}
+  '@typescript-eslint/types@8.35.0': {}
 
-  '@typescript-eslint/typescript-estree@8.34.1(typescript@5.8.3)':
+  '@typescript-eslint/typescript-estree@8.35.0(typescript@5.8.3)':
     dependencies:
-      '@typescript-eslint/project-service': 8.34.1(typescript@5.8.3)
-      '@typescript-eslint/tsconfig-utils': 8.34.1(typescript@5.8.3)
-      '@typescript-eslint/types': 8.34.1
-      '@typescript-eslint/visitor-keys': 8.34.1
+      '@typescript-eslint/project-service': 8.35.0(typescript@5.8.3)
+      '@typescript-eslint/tsconfig-utils': 8.35.0(typescript@5.8.3)
+      '@typescript-eslint/types': 8.35.0
+      '@typescript-eslint/visitor-keys': 8.35.0
       debug: 4.4.1
       fast-glob: 3.3.3
       is-glob: 4.0.3
@@ -4892,20 +4892,20 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/utils@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)':
+  '@typescript-eslint/utils@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)':
     dependencies:
       '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2))
-      '@typescript-eslint/scope-manager': 8.34.1
-      '@typescript-eslint/types': 8.34.1
-      '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3)
+      '@typescript-eslint/scope-manager': 8.35.0
+      '@typescript-eslint/types': 8.35.0
+      '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3)
       eslint: 9.29.0(jiti@2.4.2)
       typescript: 5.8.3
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/visitor-keys@8.34.1':
+  '@typescript-eslint/visitor-keys@8.35.0':
     dependencies:
-      '@typescript-eslint/types': 8.34.1
+      '@typescript-eslint/types': 8.35.0
       eslint-visitor-keys: 4.2.1
 
   '@unocss/astro@66.2.3(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))':
@@ -5100,22 +5100,22 @@ snapshots:
 
   '@vitest/eslint-plugin@1.2.7(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)':
     dependencies:
-      '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
       eslint: 9.29.0(jiti@2.4.2)
     optionalDependencies:
       typescript: 5.8.3
     transitivePeerDependencies:
       - supports-color
 
-  '@volar/language-core@2.4.14':
+  '@volar/language-core@2.4.15':
     dependencies:
-      '@volar/source-map': 2.4.14
+      '@volar/source-map': 2.4.15
 
-  '@volar/source-map@2.4.14': {}
+  '@volar/source-map@2.4.15': {}
 
-  '@volar/typescript@2.4.14':
+  '@volar/typescript@2.4.15':
     dependencies:
-      '@volar/language-core': 2.4.14
+      '@volar/language-core': 2.4.15
       path-browserify: 1.0.1
       vscode-uri: 3.1.0
 
@@ -5216,7 +5216,7 @@ snapshots:
 
   '@vue/language-core@2.2.10(typescript@5.8.3)':
     dependencies:
-      '@volar/language-core': 2.4.14
+      '@volar/language-core': 2.4.15
       '@vue/compiler-dom': 3.5.17
       '@vue/compiler-vue2': 2.7.16
       '@vue/shared': 3.5.17
@@ -5475,7 +5475,7 @@ snapshots:
   browserslist@4.25.0:
     dependencies:
       caniuse-lite: 1.0.30001724
-      electron-to-chromium: 1.5.171
+      electron-to-chromium: 1.5.173
       node-releases: 2.0.19
       update-browserslist-db: 1.1.3(browserslist@4.25.0)
 
@@ -5807,7 +5807,7 @@ snapshots:
 
   eastasianwidth@0.2.0: {}
 
-  electron-to-chromium@1.5.171: {}
+  electron-to-chromium@1.5.173: {}
 
   emoji-regex@8.0.0: {}
 
@@ -5822,7 +5822,7 @@ snapshots:
     dependencies:
       once: 1.4.0
 
-  enhanced-resolve@5.18.1:
+  enhanced-resolve@5.18.2:
     dependencies:
       graceful-fs: 4.2.11
       tapable: 2.2.2
@@ -6040,12 +6040,12 @@ snapshots:
   eslint-plugin-import-lite@0.3.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3):
     dependencies:
       '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2))
-      '@typescript-eslint/types': 8.34.1
+      '@typescript-eslint/types': 8.35.0
       eslint: 9.29.0(jiti@2.4.2)
     optionalDependencies:
       typescript: 5.8.3
 
-  eslint-plugin-jsdoc@51.2.1(eslint@9.29.0(jiti@2.4.2)):
+  eslint-plugin-jsdoc@51.2.3(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
       '@es-joy/jsdoccomment': 0.52.0
       are-docs-informative: 0.0.2
@@ -6078,8 +6078,8 @@ snapshots:
   eslint-plugin-n@17.20.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3):
     dependencies:
       '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2))
-      '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
-      enhanced-resolve: 5.18.1
+      '@typescript-eslint/utils': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      enhanced-resolve: 5.18.2
       eslint: 9.29.0(jiti@2.4.2)
       eslint-plugin-es-x: 7.8.0(eslint@9.29.0(jiti@2.4.2))
       get-tsconfig: 4.10.1
@@ -6096,8 +6096,8 @@ snapshots:
 
   eslint-plugin-perfectionist@4.15.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3):
     dependencies:
-      '@typescript-eslint/types': 8.34.1
-      '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      '@typescript-eslint/types': 8.35.0
+      '@typescript-eslint/utils': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
       eslint: 9.29.0(jiti@2.4.2)
       natural-orderby: 5.0.0
     transitivePeerDependencies:
@@ -6169,13 +6169,13 @@ snapshots:
       semver: 7.7.2
       strip-indent: 4.0.0
 
-  eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2)):
+  eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
       eslint: 9.29.0(jiti@2.4.2)
     optionalDependencies:
-      '@typescript-eslint/eslint-plugin': 8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
+      '@typescript-eslint/eslint-plugin': 8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)
 
-  eslint-plugin-vue@10.2.0(eslint@9.29.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.29.0(jiti@2.4.2))):
+  eslint-plugin-vue@10.2.0(eslint@9.29.0(jiti@2.4.2))(vue-eslint-parser@10.1.4(eslint@9.29.0(jiti@2.4.2))):
     dependencies:
       '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2))
       eslint: 9.29.0(jiti@2.4.2)
@@ -6183,7 +6183,7 @@ snapshots:
       nth-check: 2.1.1
       postcss-selector-parser: 6.1.2
       semver: 7.7.2
-      vue-eslint-parser: 10.1.3(eslint@9.29.0(jiti@2.4.2))
+      vue-eslint-parser: 10.1.4(eslint@9.29.0(jiti@2.4.2))
       xml-name-validator: 4.0.0
 
   eslint-plugin-yml@1.18.0(eslint@9.29.0(jiti@2.4.2)):
@@ -6707,7 +6707,7 @@ snapshots:
 
   isexe@2.0.0: {}
 
-  isomorphic-git@1.31.0:
+  isomorphic-git@1.31.1:
     dependencies:
       async-lock: 1.4.1
       clean-git-ref: 2.0.1
@@ -8122,7 +8122,7 @@ snapshots:
 
   vite-plugin-build-id@0.5.0:
     dependencies:
-      isomorphic-git: 1.31.0
+      isomorphic-git: 1.31.1
       node-object-hash: 3.1.1
       picocolors: 1.1.1
       typescript: 5.8.3
@@ -8172,7 +8172,7 @@ snapshots:
       dompurify: 3.2.6
       vue: 3.5.17(typescript@5.8.3)
 
-  vue-eslint-parser@10.1.3(eslint@9.29.0(jiti@2.4.2)):
+  vue-eslint-parser@10.1.4(eslint@9.29.0(jiti@2.4.2)):
     dependencies:
       debug: 4.4.1
       eslint: 9.29.0(jiti@2.4.2)
@@ -8203,7 +8203,7 @@ snapshots:
 
   vue-tsc@2.2.10(typescript@5.8.3):
     dependencies:
-      '@volar/typescript': 2.4.14
+      '@volar/typescript': 2.4.15
       '@vue/language-core': 2.2.10(typescript@5.8.3)
       typescript: 5.8.3
 

+ 62 - 5
app/src/composables/useSSE.ts

@@ -17,12 +17,40 @@ export interface SSEOptions {
   reconnectInterval?: number
 }
 
+/**
+ * Build SSE URL based on environment
+ */
+function buildSSEUrl(url: string): string {
+  // In development mode, connect directly to backend server
+  if (import.meta.env.DEV) {
+    const proxyTarget = import.meta.env.VITE_PROXY_TARGET || 'http://localhost:9000'
+
+    return urlJoin(proxyTarget, url)
+  }
+
+  // In production mode, use relative path
+  return urlJoin(window.location.pathname, url)
+}
+
 /**
  * SSE Composable
  * Provide the ability to create, manage, and automatically clean up SSE connections
  */
 export function useSSE() {
   const sseInstance = shallowRef<SSE>()
+  const reconnectTimer = shallowRef<ReturnType<typeof setTimeout>>()
+  const isReconnecting = ref(false)
+  const currentOptions = shallowRef<SSEOptions>()
+
+  /**
+   * Clear reconnect timer
+   */
+  function clearReconnectTimer() {
+    if (reconnectTimer.value) {
+      clearTimeout(reconnectTimer.value)
+      reconnectTimer.value = undefined
+    }
+  }
 
   /**
    * Connect to SSE service
@@ -36,7 +64,18 @@ export function useSSE() {
       reconnectInterval = 5000,
     } = options
 
-    const fullUrl = urlJoin(window.location.pathname, url)
+    // Store current options for reconnection
+    currentOptions.value = options
+
+    // Clear any existing reconnect timer
+    clearReconnectTimer()
+
+    // Disconnect existing connection before creating new one
+    if (sseInstance.value) {
+      sseInstance.value.close()
+    }
+
+    const fullUrl = buildSSEUrl(url)
 
     const headers: Record<string, string> = {}
 
@@ -58,6 +97,9 @@ export function useSSE() {
         return
       }
 
+      // Reset reconnecting state on successful message
+      isReconnecting.value = false
+
       try {
         const parsedData = parseData ? JSON.parse(e.data) : e.data
         onMessage?.(parsedData)
@@ -71,10 +113,19 @@ export function useSSE() {
     sse.onerror = () => {
       onError?.()
 
-      // Reconnect logic
-      setTimeout(() => {
-        connect(options)
-      }, reconnectInterval)
+      // Only attempt reconnection if not already reconnecting and we have current options
+      if (!isReconnecting.value && currentOptions.value) {
+        isReconnecting.value = true
+
+        // Clear any existing timer before setting new one
+        clearReconnectTimer()
+
+        reconnectTimer.value = setTimeout(() => {
+          if (currentOptions.value && isReconnecting.value) {
+            connect(currentOptions.value)
+          }
+        }, reconnectInterval)
+      }
     }
 
     sseInstance.value = sse
@@ -85,6 +136,11 @@ export function useSSE() {
    * Disconnect SSE connection
    */
   function disconnect() {
+    // Clear reconnect timer and state
+    clearReconnectTimer()
+    isReconnecting.value = false
+    currentOptions.value = undefined
+
     if (sseInstance.value) {
       sseInstance.value.close()
       sseInstance.value = undefined
@@ -102,5 +158,6 @@ export function useSSE() {
     connect,
     disconnect,
     sseInstance,
+    isReconnecting: readonly(isReconnecting),
   }
 }

+ 21 - 21
app/src/language/ar/app.po

@@ -638,7 +638,7 @@ msgstr "لا يمكن المقارنة: المحتوى المفقود"
 msgid "Cannot delete protected path: {0}"
 msgstr "لا يمكن حذف المسار المحمي: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:129
+#: src/views/dashboard/NginxDashBoard.vue:134
 msgid "Cannot get performance data in this state"
 msgstr "لا يمكن الحصول على بيانات الأداء في هذه الحالة"
 
@@ -1064,7 +1064,7 @@ msgstr "تأكيد كلمة المرور الجديدة"
 msgid "Connected"
 msgstr "متصل"
 
-#: src/views/dashboard/NginxDashBoard.vue:82
+#: src/views/dashboard/NginxDashBoard.vue:87
 msgid "Connection error, trying to reconnect..."
 msgstr "خطأ في الاتصال، جاري محاولة إعادة الاتصال..."
 
@@ -1723,7 +1723,7 @@ msgstr "فشل تمكين الدفق %{name} على %{node}"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "تم تمكين الدفق %{name} على %{node} بنجاح"
 
-#: src/views/dashboard/NginxDashBoard.vue:147
+#: src/views/dashboard/NginxDashBoard.vue:152
 msgid "Enable stub_status module"
 msgstr "تمكين وحدة stub_status"
 
@@ -2306,7 +2306,7 @@ msgstr "توليد مفتاح خاص لتسجيل الحساب"
 msgid "Get acme user error: {0}"
 msgstr "خطأ في الحصول على مستخدم ACME: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:138
+#: src/views/dashboard/NginxDashBoard.vue:143
 msgid "Get data failed"
 msgstr "فشل الحصول على البيانات"
 
@@ -2637,7 +2637,7 @@ msgstr "وقت آخر نسخة احتياطية"
 msgid "Last checked at"
 msgstr "آخر فحص في"
 
-#: src/views/dashboard/NginxDashBoard.vue:113
+#: src/views/dashboard/NginxDashBoard.vue:118
 msgid "Last update"
 msgstr "آخر تحديث"
 
@@ -2724,7 +2724,7 @@ msgstr "وقت توقف المحمل"
 msgid "Loader Threshold"
 msgstr "عتبة المحمل"
 
-#: src/views/dashboard/NginxDashBoard.vue:175
+#: src/views/dashboard/NginxDashBoard.vue:180
 msgid "Loading data..."
 msgstr "جارٍ تحميل البيانات..."
 
@@ -2767,11 +2767,11 @@ msgstr ""
 msgid "Log List"
 msgstr "قائمة السجلات"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:263
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:267
 msgid "Login"
 msgstr "تسجيل الدخول"
 
-#: src/views/other/Login.vue:75
+#: src/views/other/Login.vue:76
 msgid "Login successful"
 msgstr "تم تسجيل الدخول بنجاح"
 
@@ -3022,7 +3022,7 @@ msgstr "توجيه متعدد الأسطر"
 msgid "Name"
 msgstr "اسم"
 
-#: src/views/dashboard/NginxDashBoard.vue:170
+#: src/views/dashboard/NginxDashBoard.vue:175
 msgid "Need to enable the stub_status module"
 msgstr "يجب تمكين وحدة stub_status"
 
@@ -3174,8 +3174,8 @@ msgstr "خطأ في Nginx: {0}"
 
 #: src/components/NgxConfigEditor/NginxStatusAlert.vue:15
 #: src/composables/useNginxPerformance.ts:43
-#: src/views/dashboard/NginxDashBoard.vue:109
-#: src/views/dashboard/NginxDashBoard.vue:128
+#: src/views/dashboard/NginxDashBoard.vue:114
+#: src/views/dashboard/NginxDashBoard.vue:133
 #: src/views/dashboard/NginxDashBoard.vue:77
 msgid "Nginx is not running"
 msgstr "Nginx لا يعمل"
@@ -3184,7 +3184,7 @@ msgstr "Nginx لا يعمل"
 msgid "Nginx is not running in another container"
 msgstr "إن Nginx لا يعمل في حاوية أخرى"
 
-#: src/views/dashboard/NginxDashBoard.vue:109
+#: src/views/dashboard/NginxDashBoard.vue:114
 msgid "Nginx is running"
 msgstr "إن Nginx يعمل"
 
@@ -3296,7 +3296,7 @@ msgstr "لا"
 msgid "No Action"
 msgstr "لا إجراء"
 
-#: src/views/dashboard/NginxDashBoard.vue:177
+#: src/views/dashboard/NginxDashBoard.vue:182
 msgid "No data"
 msgstr "لا توجد بيانات"
 
@@ -3487,7 +3487,7 @@ msgstr "مفتوح"
 msgid "OpenAI"
 msgstr "أوبن أي آي"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:272
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:276
 msgid "Or"
 msgstr "أو"
 
@@ -3560,7 +3560,7 @@ msgstr ""
 "التعرف على الوجه أو كلمة مرور الجهاز أو رقم التعريف الشخصي. يمكن استخدامها "
 "كبديل لكلمة المرور أو كطريقة للمصادقة الثنائية."
 
-#: src/views/other/Login.vue:224 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "كلمة المرور"
 
@@ -3622,7 +3622,7 @@ msgstr "خطأ في تنفيذ ترقية النواة"
 msgid "Performance"
 msgstr "الأداء"
 
-#: src/views/dashboard/NginxDashBoard.vue:182
+#: src/views/dashboard/NginxDashBoard.vue:187
 msgid "Performance Metrics"
 msgstr "مقاييس الأداء"
 
@@ -3646,7 +3646,7 @@ msgstr "مسار PID غير موجود"
 msgid "Plain text is empty"
 msgstr "النص العادي فارغ"
 
-#: src/views/dashboard/NginxDashBoard.vue:171
+#: src/views/dashboard/NginxDashBoard.vue:176
 msgid ""
 "Please enable the stub_status module to get request statistics, connection "
 "count, etc."
@@ -4625,7 +4625,7 @@ msgstr "منطقة الذاكرة المشتركة"
 msgid "Show"
 msgstr "عرض"
 
-#: src/views/other/Login.vue:281
+#: src/views/other/Login.vue:285
 msgid "Sign in with a passkey"
 msgstr "تسجيل الدخول باستخدام مفتاح المرور"
 
@@ -4730,7 +4730,7 @@ msgstr "مسار مفتاح SSL"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "مسار مفتاح SSL مطلوب عند تمكين HTTPS"
 
-#: src/views/other/Login.vue:238
+#: src/views/other/Login.vue:242
 msgid "SSO Login"
 msgstr "تسجيل الدخول عبر SSO"
 
@@ -5169,7 +5169,7 @@ msgid ""
 "_./:"
 msgstr "يجب أن يحتوي هذا الحقل على أحرف وأحرف يونيكود وأرقام و -_./: فقط"
 
-#: src/views/dashboard/NginxDashBoard.vue:150
+#: src/views/dashboard/NginxDashBoard.vue:155
 msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
@@ -5481,7 +5481,7 @@ msgstr "المستخدم لم يتم تفعيل OTP كعامل ثنائي"
 msgid "User Profile"
 msgstr "ملف المستخدم"
 
-#: src/views/other/Login.vue:214 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:218 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "اسم المستخدم"

+ 21 - 21
app/src/language/de_DE/app.po

@@ -655,7 +655,7 @@ msgstr "Kann nicht vergleichen: Fehlende Inhalte"
 msgid "Cannot delete protected path: {0}"
 msgstr "Geschützter Pfad kann nicht gelöscht werden: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:129
+#: src/views/dashboard/NginxDashBoard.vue:134
 msgid "Cannot get performance data in this state"
 msgstr "In diesem Zustand können Leistungsdaten nicht erhalten"
 
@@ -1081,7 +1081,7 @@ msgstr "Neues Passwort bestätigen"
 msgid "Connected"
 msgstr "Verbunden"
 
-#: src/views/dashboard/NginxDashBoard.vue:82
+#: src/views/dashboard/NginxDashBoard.vue:87
 msgid "Connection error, trying to reconnect..."
 msgstr "Verbindungsfehler, versuche erneut zu verbinden..."
 
@@ -1754,7 +1754,7 @@ msgstr "Aktivierung des Streams %{name} auf %{node} fehlgeschlagen"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "Stream %{name} auf %{node} erfolgreich aktiviert"
 
-#: src/views/dashboard/NginxDashBoard.vue:147
+#: src/views/dashboard/NginxDashBoard.vue:152
 msgid "Enable stub_status module"
 msgstr "Aktiviere stub_status-Modul"
 
@@ -2339,7 +2339,7 @@ msgstr "Generiere privaten Schlüssel zur Registrierung des Kontos"
 msgid "Get acme user error: {0}"
 msgstr "Fehler beim Abrufen des ACME-Benutzers: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:138
+#: src/views/dashboard/NginxDashBoard.vue:143
 msgid "Get data failed"
 msgstr "Datenabruf fehlgeschlagen"
 
@@ -2675,7 +2675,7 @@ msgstr "Letzter Sicherungszeitpunkt"
 msgid "Last checked at"
 msgstr "Zuletzt überprüft am"
 
-#: src/views/dashboard/NginxDashBoard.vue:113
+#: src/views/dashboard/NginxDashBoard.vue:118
 msgid "Last update"
 msgstr "Letzte Aktualisierung"
 
@@ -2763,7 +2763,7 @@ msgstr "Loader-Pause"
 msgid "Loader Threshold"
 msgstr "Laderschwelle"
 
-#: src/views/dashboard/NginxDashBoard.vue:175
+#: src/views/dashboard/NginxDashBoard.vue:180
 msgid "Loading data..."
 msgstr "Daten werden geladen..."
 
@@ -2806,11 +2806,11 @@ msgstr ""
 msgid "Log List"
 msgstr "Protokollliste"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:263
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:267
 msgid "Login"
 msgstr "Login"
 
-#: src/views/other/Login.vue:75
+#: src/views/other/Login.vue:76
 msgid "Login successful"
 msgstr "Login erfolgreich"
 
@@ -3062,7 +3062,7 @@ msgstr "Mehrzeilige Direktive"
 msgid "Name"
 msgstr "Name"
 
-#: src/views/dashboard/NginxDashBoard.vue:170
+#: src/views/dashboard/NginxDashBoard.vue:175
 msgid "Need to enable the stub_status module"
 msgstr "Das stub_status-Modul muss aktiviert werden"
 
@@ -3214,8 +3214,8 @@ msgstr "Nginx-Fehler: {0}"
 
 #: src/components/NgxConfigEditor/NginxStatusAlert.vue:15
 #: src/composables/useNginxPerformance.ts:43
-#: src/views/dashboard/NginxDashBoard.vue:109
-#: src/views/dashboard/NginxDashBoard.vue:128
+#: src/views/dashboard/NginxDashBoard.vue:114
+#: src/views/dashboard/NginxDashBoard.vue:133
 #: src/views/dashboard/NginxDashBoard.vue:77
 msgid "Nginx is not running"
 msgstr "Nginx läuft nicht"
@@ -3224,7 +3224,7 @@ msgstr "Nginx läuft nicht"
 msgid "Nginx is not running in another container"
 msgstr "Nginx läuft nicht in einem anderen Container"
 
-#: src/views/dashboard/NginxDashBoard.vue:109
+#: src/views/dashboard/NginxDashBoard.vue:114
 msgid "Nginx is running"
 msgstr "Nginx läuft"
 
@@ -3339,7 +3339,7 @@ msgstr "Nein"
 msgid "No Action"
 msgstr "Keine Aktion"
 
-#: src/views/dashboard/NginxDashBoard.vue:177
+#: src/views/dashboard/NginxDashBoard.vue:182
 msgid "No data"
 msgstr "Keine Daten"
 
@@ -3534,7 +3534,7 @@ msgstr "Offen"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:272
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:276
 msgid "Or"
 msgstr "Oder"
 
@@ -3607,7 +3607,7 @@ msgstr ""
 "Berührung, Gesichtserkennung, ein Gerätepasswort oder eine PIN validieren. "
 "Sie können als Passwortersatz oder als 2FA-Methode verwendet werden."
 
-#: src/views/other/Login.vue:224 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "Passwort"
 
@@ -3670,7 +3670,7 @@ msgstr "Führe Core-Upgrade-Fehler aus"
 msgid "Performance"
 msgstr "Leistung"
 
-#: src/views/dashboard/NginxDashBoard.vue:182
+#: src/views/dashboard/NginxDashBoard.vue:187
 msgid "Performance Metrics"
 msgstr "Leistungsmetriken"
 
@@ -3694,7 +3694,7 @@ msgstr "PID-Pfad existiert nicht"
 msgid "Plain text is empty"
 msgstr "Klartext ist leer"
 
-#: src/views/dashboard/NginxDashBoard.vue:171
+#: src/views/dashboard/NginxDashBoard.vue:176
 msgid ""
 "Please enable the stub_status module to get request statistics, connection "
 "count, etc."
@@ -4705,7 +4705,7 @@ msgstr "Gemeinsamer Speicherbereich"
 msgid "Show"
 msgstr "Zeige"
 
-#: src/views/other/Login.vue:281
+#: src/views/other/Login.vue:285
 msgid "Sign in with a passkey"
 msgstr "Mit einem Passkey anmelden"
 
@@ -4814,7 +4814,7 @@ msgstr "SSL-Schlüsselpfad"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "Der SSL-Schlüsselpfad ist erforderlich, wenn HTTPS aktiviert ist"
 
-#: src/views/other/Login.vue:238
+#: src/views/other/Login.vue:242
 msgid "SSO Login"
 msgstr "SSO-Anmeldung"
 
@@ -5265,7 +5265,7 @@ msgid ""
 msgstr ""
 "Dieses Feld darf nur Buchstaben, Unicode-Zeichen, Zahlen und -_./: enthalten"
 
-#: src/views/dashboard/NginxDashBoard.vue:150
+#: src/views/dashboard/NginxDashBoard.vue:155
 msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
@@ -5583,7 +5583,7 @@ msgstr "Benutzer hat OTP nicht als 2FA aktiviert"
 msgid "User Profile"
 msgstr "Benutzerprofil"
 
-#: src/views/other/Login.vue:214 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:218 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Benutzername"

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

@@ -614,7 +614,7 @@ msgstr ""
 msgid "Cannot delete protected path: {0}"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:129
+#: src/views/dashboard/NginxDashBoard.vue:134
 msgid "Cannot get performance data in this state"
 msgstr ""
 
@@ -1002,7 +1002,7 @@ msgstr ""
 msgid "Connected"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:82
+#: src/views/dashboard/NginxDashBoard.vue:87
 msgid "Connection error, trying to reconnect..."
 msgstr ""
 
@@ -1658,7 +1658,7 @@ msgstr ""
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:147
+#: src/views/dashboard/NginxDashBoard.vue:152
 msgid "Enable stub_status module"
 msgstr ""
 
@@ -2241,7 +2241,7 @@ msgstr ""
 msgid "Get acme user error: {0}"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:138
+#: src/views/dashboard/NginxDashBoard.vue:143
 msgid "Get data failed"
 msgstr ""
 
@@ -2562,7 +2562,7 @@ msgstr ""
 msgid "Last checked at"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:113
+#: src/views/dashboard/NginxDashBoard.vue:118
 msgid "Last update"
 msgstr ""
 
@@ -2649,7 +2649,7 @@ msgstr ""
 msgid "Loader Threshold"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:175
+#: src/views/dashboard/NginxDashBoard.vue:180
 msgid "Loading data..."
 msgstr ""
 
@@ -2689,11 +2689,11 @@ msgstr ""
 msgid "Log List"
 msgstr ""
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:263
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:267
 msgid "Login"
 msgstr ""
 
-#: src/views/other/Login.vue:75
+#: src/views/other/Login.vue:76
 msgid "Login successful"
 msgstr ""
 
@@ -2936,7 +2936,7 @@ msgstr ""
 msgid "Name"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:170
+#: src/views/dashboard/NginxDashBoard.vue:175
 msgid "Need to enable the stub_status module"
 msgstr ""
 
@@ -3088,8 +3088,8 @@ msgstr ""
 
 #: src/components/NgxConfigEditor/NginxStatusAlert.vue:15
 #: src/composables/useNginxPerformance.ts:43
-#: src/views/dashboard/NginxDashBoard.vue:109
-#: src/views/dashboard/NginxDashBoard.vue:128
+#: src/views/dashboard/NginxDashBoard.vue:114
+#: src/views/dashboard/NginxDashBoard.vue:133
 #: src/views/dashboard/NginxDashBoard.vue:77
 msgid "Nginx is not running"
 msgstr ""
@@ -3098,7 +3098,7 @@ msgstr ""
 msgid "Nginx is not running in another container"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:109
+#: src/views/dashboard/NginxDashBoard.vue:114
 msgid "Nginx is running"
 msgstr ""
 
@@ -3210,7 +3210,7 @@ msgstr ""
 msgid "No Action"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:177
+#: src/views/dashboard/NginxDashBoard.vue:182
 msgid "No data"
 msgstr ""
 
@@ -3395,7 +3395,7 @@ msgstr ""
 msgid "OpenAI"
 msgstr ""
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:272
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:276
 msgid "Or"
 msgstr ""
 
@@ -3465,7 +3465,7 @@ msgid ""
 "password replacement or as a 2FA method."
 msgstr ""
 
-#: src/views/other/Login.vue:224 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr ""
 
@@ -3527,7 +3527,7 @@ msgstr ""
 msgid "Performance"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:182
+#: src/views/dashboard/NginxDashBoard.vue:187
 msgid "Performance Metrics"
 msgstr ""
 
@@ -3551,7 +3551,7 @@ msgstr ""
 msgid "Plain text is empty"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:171
+#: src/views/dashboard/NginxDashBoard.vue:176
 msgid ""
 "Please enable the stub_status module to get request statistics, connection "
 "count, etc."
@@ -4513,7 +4513,7 @@ msgstr ""
 msgid "Show"
 msgstr ""
 
-#: src/views/other/Login.vue:281
+#: src/views/other/Login.vue:285
 msgid "Sign in with a passkey"
 msgstr ""
 
@@ -4618,7 +4618,7 @@ msgstr ""
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr ""
 
-#: src/views/other/Login.vue:238
+#: src/views/other/Login.vue:242
 msgid "SSO Login"
 msgstr ""
 
@@ -5028,7 +5028,7 @@ msgid ""
 "_./:"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:150
+#: src/views/dashboard/NginxDashBoard.vue:155
 msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
@@ -5316,7 +5316,7 @@ msgstr ""
 msgid "User Profile"
 msgstr ""
 
-#: src/views/other/Login.vue:214 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:218 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr ""

+ 21 - 21
app/src/language/es/app.po

@@ -663,7 +663,7 @@ msgstr "No se puede comparar: faltando contenido"
 msgid "Cannot delete protected path: {0}"
 msgstr "No se puede eliminar la ruta protegida: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:129
+#: src/views/dashboard/NginxDashBoard.vue:134
 msgid "Cannot get performance data in this state"
 msgstr "No se puede obtener datos de rendimiento en este estado"
 
@@ -1087,7 +1087,7 @@ msgstr "Confirmar nueva contraseña"
 msgid "Connected"
 msgstr "Conectado"
 
-#: src/views/dashboard/NginxDashBoard.vue:82
+#: src/views/dashboard/NginxDashBoard.vue:87
 msgid "Connection error, trying to reconnect..."
 msgstr "Error de conexión, intentando reconectar..."
 
@@ -1756,7 +1756,7 @@ msgstr "No se pudo habilitar el flujo %{name} en %{node}"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "Habilitar el flujo %{name} en %{node} correctamente"
 
-#: src/views/dashboard/NginxDashBoard.vue:147
+#: src/views/dashboard/NginxDashBoard.vue:152
 msgid "Enable stub_status module"
 msgstr "Habilitar módulo stub_status"
 
@@ -2344,7 +2344,7 @@ msgstr "Generando clave privada para registrar cuenta"
 msgid "Get acme user error: {0}"
 msgstr "Error al obtener el usuario de ACME: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:138
+#: src/views/dashboard/NginxDashBoard.vue:143
 msgid "Get data failed"
 msgstr "Error al obtener los datos"
 
@@ -2679,7 +2679,7 @@ msgstr "Hora del último respaldo"
 msgid "Last checked at"
 msgstr "Comprobado por última vez el"
 
-#: src/views/dashboard/NginxDashBoard.vue:113
+#: src/views/dashboard/NginxDashBoard.vue:118
 msgid "Last update"
 msgstr "Última actualización"
 
@@ -2767,7 +2767,7 @@ msgstr "Pausa del cargador"
 msgid "Loader Threshold"
 msgstr "Umbral del cargador"
 
-#: src/views/dashboard/NginxDashBoard.vue:175
+#: src/views/dashboard/NginxDashBoard.vue:180
 msgid "Loading data..."
 msgstr "Cargando datos..."
 
@@ -2810,11 +2810,11 @@ msgstr ""
 msgid "Log List"
 msgstr "Lista de registros"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:263
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:267
 msgid "Login"
 msgstr "Acceso"
 
-#: src/views/other/Login.vue:75
+#: src/views/other/Login.vue:76
 msgid "Login successful"
 msgstr "Acceso exitoso"
 
@@ -3066,7 +3066,7 @@ msgstr "Directiva multilínea"
 msgid "Name"
 msgstr "Nombre"
 
-#: src/views/dashboard/NginxDashBoard.vue:170
+#: src/views/dashboard/NginxDashBoard.vue:175
 msgid "Need to enable the stub_status module"
 msgstr "Es necesario habilitar el módulo stub_status"
 
@@ -3218,8 +3218,8 @@ msgstr "Error de Nginx: {0}"
 
 #: src/components/NgxConfigEditor/NginxStatusAlert.vue:15
 #: src/composables/useNginxPerformance.ts:43
-#: src/views/dashboard/NginxDashBoard.vue:109
-#: src/views/dashboard/NginxDashBoard.vue:128
+#: src/views/dashboard/NginxDashBoard.vue:114
+#: src/views/dashboard/NginxDashBoard.vue:133
 #: src/views/dashboard/NginxDashBoard.vue:77
 msgid "Nginx is not running"
 msgstr "Nginx no se está ejecutando"
@@ -3228,7 +3228,7 @@ msgstr "Nginx no se está ejecutando"
 msgid "Nginx is not running in another container"
 msgstr "Nginx no se está ejecutando en otro contenedor"
 
-#: src/views/dashboard/NginxDashBoard.vue:109
+#: src/views/dashboard/NginxDashBoard.vue:114
 msgid "Nginx is running"
 msgstr "Nginx está en ejecución"
 
@@ -3343,7 +3343,7 @@ msgstr "No"
 msgid "No Action"
 msgstr "Sin acción"
 
-#: src/views/dashboard/NginxDashBoard.vue:177
+#: src/views/dashboard/NginxDashBoard.vue:182
 msgid "No data"
 msgstr "Sin datos"
 
@@ -3535,7 +3535,7 @@ msgstr "Abierto"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:272
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:276
 msgid "Or"
 msgstr "O"
 
@@ -3609,7 +3609,7 @@ msgstr ""
 "dispositivo o un PIN. Se pueden utilizar como reemplazo de contraseña o como "
 "método de autenticación de dos factores."
 
-#: src/views/other/Login.vue:224 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "Contraseña"
 
@@ -3672,7 +3672,7 @@ msgstr "Error al ejecutar la actualización del kernel"
 msgid "Performance"
 msgstr "Rendimiento"
 
-#: src/views/dashboard/NginxDashBoard.vue:182
+#: src/views/dashboard/NginxDashBoard.vue:187
 msgid "Performance Metrics"
 msgstr "Métricas de rendimiento"
 
@@ -3696,7 +3696,7 @@ msgstr "La ruta del PID no existe"
 msgid "Plain text is empty"
 msgstr "El texto plano está vacío"
 
-#: src/views/dashboard/NginxDashBoard.vue:171
+#: src/views/dashboard/NginxDashBoard.vue:176
 msgid ""
 "Please enable the stub_status module to get request statistics, connection "
 "count, etc."
@@ -4703,7 +4703,7 @@ msgstr "Zona de Memoria Compartida"
 msgid "Show"
 msgstr "Mostrar"
 
-#: src/views/other/Login.vue:281
+#: src/views/other/Login.vue:285
 msgid "Sign in with a passkey"
 msgstr "Iniciar sesión con una llave de acceso"
 
@@ -4812,7 +4812,7 @@ msgstr "Ruta de la clave SSL"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "Se requiere la ruta de la clave SSL cuando HTTPS está habilitado"
 
-#: src/views/other/Login.vue:238
+#: src/views/other/Login.vue:242
 msgid "SSO Login"
 msgstr "Acceso SSO"
 
@@ -5260,7 +5260,7 @@ msgid ""
 msgstr ""
 "Este campo solo debe contener letras, caracteres Unicode, números y -_./:"
 
-#: src/views/dashboard/NginxDashBoard.vue:150
+#: src/views/dashboard/NginxDashBoard.vue:155
 msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
@@ -5577,7 +5577,7 @@ msgstr "Usuario no ha habilitado OTP como 2FA"
 msgid "User Profile"
 msgstr "Perfil de usuario"
 
-#: src/views/other/Login.vue:214 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:218 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Nombre de usuario"

+ 21 - 21
app/src/language/fr_FR/app.po

@@ -663,7 +663,7 @@ msgstr "Impossible de comparer: contenu manquant"
 msgid "Cannot delete protected path: {0}"
 msgstr "Impossible de supprimer le chemin protégé : {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:129
+#: src/views/dashboard/NginxDashBoard.vue:134
 msgid "Cannot get performance data in this state"
 msgstr "Impossible d'obtenir des données de performance dans cet état"
 
@@ -1090,7 +1090,7 @@ msgstr "Confirmer le nouveau mot de passe"
 msgid "Connected"
 msgstr "Connecté"
 
-#: src/views/dashboard/NginxDashBoard.vue:82
+#: src/views/dashboard/NginxDashBoard.vue:87
 msgid "Connection error, trying to reconnect..."
 msgstr "Erreur de connexion, tentative de reconnexion..."
 
@@ -1760,7 +1760,7 @@ msgstr "Échec de l'activation du flux %{name} sur %{node}"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "Activation du flux %{name} sur %{node} réussie"
 
-#: src/views/dashboard/NginxDashBoard.vue:147
+#: src/views/dashboard/NginxDashBoard.vue:152
 msgid "Enable stub_status module"
 msgstr "Activer le module stub_status"
 
@@ -2347,7 +2347,7 @@ msgstr "Génération de clé privée pour l'enregistrement du compte"
 msgid "Get acme user error: {0}"
 msgstr "Erreur lors de la récupération de l'utilisateur ACME: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:138
+#: src/views/dashboard/NginxDashBoard.vue:143
 msgid "Get data failed"
 msgstr "Échec de la récupération des données"
 
@@ -2686,7 +2686,7 @@ msgstr "Dernière heure de sauvegarde"
 msgid "Last checked at"
 msgstr "Dernière vérification le"
 
-#: src/views/dashboard/NginxDashBoard.vue:113
+#: src/views/dashboard/NginxDashBoard.vue:118
 msgid "Last update"
 msgstr "Dernière mise à jour"
 
@@ -2773,7 +2773,7 @@ msgstr "Pause du chargeur"
 msgid "Loader Threshold"
 msgstr "Seuil du chargeur"
 
-#: src/views/dashboard/NginxDashBoard.vue:175
+#: src/views/dashboard/NginxDashBoard.vue:180
 msgid "Loading data..."
 msgstr "Chargement des données..."
 
@@ -2816,11 +2816,11 @@ msgstr ""
 msgid "Log List"
 msgstr "Liste des journaux"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:263
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:267
 msgid "Login"
 msgstr "Connexion"
 
-#: src/views/other/Login.vue:75
+#: src/views/other/Login.vue:76
 msgid "Login successful"
 msgstr "Connexion réussie"
 
@@ -3072,7 +3072,7 @@ msgstr "Directive multiligne"
 msgid "Name"
 msgstr "Nom"
 
-#: src/views/dashboard/NginxDashBoard.vue:170
+#: src/views/dashboard/NginxDashBoard.vue:175
 msgid "Need to enable the stub_status module"
 msgstr "Il faut activer le module stub_status"
 
@@ -3224,8 +3224,8 @@ msgstr "Erreur Nginx : {0}"
 
 #: src/components/NgxConfigEditor/NginxStatusAlert.vue:15
 #: src/composables/useNginxPerformance.ts:43
-#: src/views/dashboard/NginxDashBoard.vue:109
-#: src/views/dashboard/NginxDashBoard.vue:128
+#: src/views/dashboard/NginxDashBoard.vue:114
+#: src/views/dashboard/NginxDashBoard.vue:133
 #: src/views/dashboard/NginxDashBoard.vue:77
 msgid "Nginx is not running"
 msgstr "Nginx n'est pas en cours d'exécution"
@@ -3234,7 +3234,7 @@ msgstr "Nginx n'est pas en cours d'exécution"
 msgid "Nginx is not running in another container"
 msgstr "Nginx ne fonctionne pas dans un autre conteneur"
 
-#: src/views/dashboard/NginxDashBoard.vue:109
+#: src/views/dashboard/NginxDashBoard.vue:114
 msgid "Nginx is running"
 msgstr "Nginx est en cours d'exécution"
 
@@ -3350,7 +3350,7 @@ msgstr "Non"
 msgid "No Action"
 msgstr "Aucune action"
 
-#: src/views/dashboard/NginxDashBoard.vue:177
+#: src/views/dashboard/NginxDashBoard.vue:182
 msgid "No data"
 msgstr "Aucune donnée"
 
@@ -3542,7 +3542,7 @@ msgstr "Ouvert"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:272
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:276
 msgid "Or"
 msgstr "Ou"
 
@@ -3616,7 +3616,7 @@ msgstr ""
 "ou un code PIN. Elles peuvent être utilisées comme remplacement d'un mot de "
 "passe ou comme méthode d'authentification à deux facteurs (2FA)."
 
-#: src/views/other/Login.vue:224 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "Mot de passe"
 
@@ -3680,7 +3680,7 @@ msgstr "Erreur lors de la mise a niveau du core"
 msgid "Performance"
 msgstr "Performance"
 
-#: src/views/dashboard/NginxDashBoard.vue:182
+#: src/views/dashboard/NginxDashBoard.vue:187
 msgid "Performance Metrics"
 msgstr "Métriques de performance"
 
@@ -3704,7 +3704,7 @@ msgstr "Le chemin du PID n'existe pas"
 msgid "Plain text is empty"
 msgstr "Le texte en clair est vide"
 
-#: src/views/dashboard/NginxDashBoard.vue:171
+#: src/views/dashboard/NginxDashBoard.vue:176
 msgid ""
 "Please enable the stub_status module to get request statistics, connection "
 "count, etc."
@@ -4710,7 +4710,7 @@ msgstr "Zone de Mémoire Partagée"
 msgid "Show"
 msgstr "Afficher"
 
-#: src/views/other/Login.vue:281
+#: src/views/other/Login.vue:285
 msgid "Sign in with a passkey"
 msgstr "Se connecter avec une clé d'accès"
 
@@ -4819,7 +4819,7 @@ msgstr "Chemin de la clé SSL"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "Le chemin de la clé SSL est requis lorsque HTTPS est activé"
 
-#: src/views/other/Login.vue:238
+#: src/views/other/Login.vue:242
 msgid "SSO Login"
 msgstr "Connexion SSO"
 
@@ -5273,7 +5273,7 @@ msgstr ""
 "Ce champ ne doit contenir que des lettres, des caractères Unicode, des "
 "chiffres et -_./:"
 
-#: src/views/dashboard/NginxDashBoard.vue:150
+#: src/views/dashboard/NginxDashBoard.vue:155
 msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
@@ -5594,7 +5594,7 @@ msgstr "L'utilisateur n'a pas activé l'OTP comme 2FA"
 msgid "User Profile"
 msgstr "Profil utilisateur"
 
-#: src/views/other/Login.vue:214 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:218 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Nom d'utilisateur"

+ 21 - 21
app/src/language/ja_JP/app.po

@@ -647,7 +647,7 @@ msgstr "比較できません:不足しているコンテンツ"
 msgid "Cannot delete protected path: {0}"
 msgstr "保護されたパスを削除できません: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:129
+#: src/views/dashboard/NginxDashBoard.vue:134
 msgid "Cannot get performance data in this state"
 msgstr "この状態でパフォーマンスデータを取得できません"
 
@@ -1065,7 +1065,7 @@ msgstr "新しいパスワードを確認"
 msgid "Connected"
 msgstr "接続済み"
 
-#: src/views/dashboard/NginxDashBoard.vue:82
+#: src/views/dashboard/NginxDashBoard.vue:87
 msgid "Connection error, trying to reconnect..."
 msgstr "接続エラー、再接続を試みています..."
 
@@ -1725,7 +1725,7 @@ msgstr "ストリーム %{name} を %{node} で有効化できませんでした
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "ストリーム %{name} を %{node} で有効化しました"
 
-#: src/views/dashboard/NginxDashBoard.vue:147
+#: src/views/dashboard/NginxDashBoard.vue:152
 msgid "Enable stub_status module"
 msgstr "stub_status モジュールを有効にする"
 
@@ -2308,7 +2308,7 @@ msgstr "アカウント登録用の秘密鍵を生成中"
 msgid "Get acme user error: {0}"
 msgstr "ACMEユーザーの取得エラー: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:138
+#: src/views/dashboard/NginxDashBoard.vue:143
 msgid "Get data failed"
 msgstr "データの取得に失敗しました"
 
@@ -2642,7 +2642,7 @@ msgstr "最終バックアップ時刻"
 msgid "Last checked at"
 msgstr "最終確認日時"
 
-#: src/views/dashboard/NginxDashBoard.vue:113
+#: src/views/dashboard/NginxDashBoard.vue:118
 msgid "Last update"
 msgstr "最終更新"
 
@@ -2731,7 +2731,7 @@ msgstr "ローダー スリープ"
 msgid "Loader Threshold"
 msgstr "ローダー閾値"
 
-#: src/views/dashboard/NginxDashBoard.vue:175
+#: src/views/dashboard/NginxDashBoard.vue:180
 msgid "Loading data..."
 msgstr "データを読み込んでいます..."
 
@@ -2774,11 +2774,11 @@ msgstr ""
 msgid "Log List"
 msgstr "ログリスト"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:263
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:267
 msgid "Login"
 msgstr "ログイン"
 
-#: src/views/other/Login.vue:75
+#: src/views/other/Login.vue:76
 msgid "Login successful"
 msgstr "ログインに成功しました"
 
@@ -3029,7 +3029,7 @@ msgstr "複数行ディレクティブ"
 msgid "Name"
 msgstr "名前"
 
-#: src/views/dashboard/NginxDashBoard.vue:170
+#: src/views/dashboard/NginxDashBoard.vue:175
 msgid "Need to enable the stub_status module"
 msgstr "stub_statusモジュールを有効にする必要があります"
 
@@ -3181,8 +3181,8 @@ msgstr "Nginxエラー: {0}"
 
 #: src/components/NgxConfigEditor/NginxStatusAlert.vue:15
 #: src/composables/useNginxPerformance.ts:43
-#: src/views/dashboard/NginxDashBoard.vue:109
-#: src/views/dashboard/NginxDashBoard.vue:128
+#: src/views/dashboard/NginxDashBoard.vue:114
+#: src/views/dashboard/NginxDashBoard.vue:133
 #: src/views/dashboard/NginxDashBoard.vue:77
 msgid "Nginx is not running"
 msgstr "Nginx は実行されていません"
@@ -3191,7 +3191,7 @@ msgstr "Nginx は実行されていません"
 msgid "Nginx is not running in another container"
 msgstr "Nginx は他のコンテナで実行されていません"
 
-#: src/views/dashboard/NginxDashBoard.vue:109
+#: src/views/dashboard/NginxDashBoard.vue:114
 msgid "Nginx is running"
 msgstr "Nginx は実行中です"
 
@@ -3303,7 +3303,7 @@ msgstr "いいえ"
 msgid "No Action"
 msgstr "アクションなし"
 
-#: src/views/dashboard/NginxDashBoard.vue:177
+#: src/views/dashboard/NginxDashBoard.vue:182
 msgid "No data"
 msgstr "データなし"
 
@@ -3492,7 +3492,7 @@ msgstr "開いている"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:272
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:276
 msgid "Or"
 msgstr "または"
 
@@ -3565,7 +3565,7 @@ msgstr ""
 "認する WebAuthn 認証情報です。パスワードの代わりや 2FA 方法として使用できま"
 "す。"
 
-#: src/views/other/Login.vue:224 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "パスワード"
 
@@ -3627,7 +3627,7 @@ msgstr "コアアップグレード実行エラー"
 msgid "Performance"
 msgstr "パフォーマンス"
 
-#: src/views/dashboard/NginxDashBoard.vue:182
+#: src/views/dashboard/NginxDashBoard.vue:187
 msgid "Performance Metrics"
 msgstr "パフォーマンスメトリクス"
 
@@ -3651,7 +3651,7 @@ msgstr "PID パスが存在しません"
 msgid "Plain text is empty"
 msgstr "プレーンテキストが空です"
 
-#: src/views/dashboard/NginxDashBoard.vue:171
+#: src/views/dashboard/NginxDashBoard.vue:176
 msgid ""
 "Please enable the stub_status module to get request statistics, connection "
 "count, etc."
@@ -4639,7 +4639,7 @@ msgstr "共有メモリゾーン"
 msgid "Show"
 msgstr "表示"
 
-#: src/views/other/Login.vue:281
+#: src/views/other/Login.vue:285
 msgid "Sign in with a passkey"
 msgstr "パスキーでサインイン"
 
@@ -4744,7 +4744,7 @@ msgstr "SSLキーのパス"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "HTTPS を有効にするには SSL キーのパスが必要です"
 
-#: src/views/other/Login.vue:238
+#: src/views/other/Login.vue:242
 msgid "SSO Login"
 msgstr "SSOログイン"
 
@@ -5190,7 +5190,7 @@ msgstr ""
 "このフィールドには、文字、Unicode文字、数字、および -_./: のみを含める必要が"
 "あります"
 
-#: src/views/dashboard/NginxDashBoard.vue:150
+#: src/views/dashboard/NginxDashBoard.vue:155
 msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
@@ -5504,7 +5504,7 @@ msgstr "ユーザーはOTPを2FAとして有効にしていません"
 msgid "User Profile"
 msgstr "ユーザープロフィール"
 
-#: src/views/other/Login.vue:214 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:218 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "ユーザー名"

+ 21 - 21
app/src/language/ko_KR/app.po

@@ -637,7 +637,7 @@ msgstr "비교할 수 없습니다 : 내용 누락"
 msgid "Cannot delete protected path: {0}"
 msgstr "보호된 경로를 삭제할 수 없습니다: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:129
+#: src/views/dashboard/NginxDashBoard.vue:134
 msgid "Cannot get performance data in this state"
 msgstr "이 상태에서 성능 데이터를 얻을 수 없습니다"
 
@@ -1051,7 +1051,7 @@ msgstr "새 비밀번호 확인"
 msgid "Connected"
 msgstr "연결됨"
 
-#: src/views/dashboard/NginxDashBoard.vue:82
+#: src/views/dashboard/NginxDashBoard.vue:87
 msgid "Connection error, trying to reconnect..."
 msgstr "연결 오류, 다시 연결 시도 중..."
 
@@ -1711,7 +1711,7 @@ msgstr "%{node}에서 스트림 %{name} 활성화 실패"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "%{node}에서 스트림 %{name} 활성화 성공"
 
-#: src/views/dashboard/NginxDashBoard.vue:147
+#: src/views/dashboard/NginxDashBoard.vue:152
 msgid "Enable stub_status module"
 msgstr "stub_status 모듈 활성화"
 
@@ -2294,7 +2294,7 @@ msgstr "계정 등록을 위한 개인 키 생성 중"
 msgid "Get acme user error: {0}"
 msgstr "ACME 사용자 가져오기 오류: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:138
+#: src/views/dashboard/NginxDashBoard.vue:143
 msgid "Get data failed"
 msgstr "데이터 가져오기 실패"
 
@@ -2624,7 +2624,7 @@ msgstr "마지막 백업 시간"
 msgid "Last checked at"
 msgstr "마지막 확인 시간"
 
-#: src/views/dashboard/NginxDashBoard.vue:113
+#: src/views/dashboard/NginxDashBoard.vue:118
 msgid "Last update"
 msgstr "마지막 업데이트"
 
@@ -2711,7 +2711,7 @@ msgstr "로더 슬립"
 msgid "Loader Threshold"
 msgstr "로더 임계값"
 
-#: src/views/dashboard/NginxDashBoard.vue:175
+#: src/views/dashboard/NginxDashBoard.vue:180
 msgid "Loading data..."
 msgstr "데이터를 불러오는 중..."
 
@@ -2754,11 +2754,11 @@ msgstr ""
 msgid "Log List"
 msgstr "로그 목록"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:263
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:267
 msgid "Login"
 msgstr "로그인"
 
-#: src/views/other/Login.vue:75
+#: src/views/other/Login.vue:76
 msgid "Login successful"
 msgstr "로그인 성공"
 
@@ -3008,7 +3008,7 @@ msgstr "여러 줄 지시문"
 msgid "Name"
 msgstr "이름"
 
-#: src/views/dashboard/NginxDashBoard.vue:170
+#: src/views/dashboard/NginxDashBoard.vue:175
 msgid "Need to enable the stub_status module"
 msgstr "stub_status 모듈을 활성화해야 합니다"
 
@@ -3160,8 +3160,8 @@ msgstr "Nginx 오류: {0}"
 
 #: src/components/NgxConfigEditor/NginxStatusAlert.vue:15
 #: src/composables/useNginxPerformance.ts:43
-#: src/views/dashboard/NginxDashBoard.vue:109
-#: src/views/dashboard/NginxDashBoard.vue:128
+#: src/views/dashboard/NginxDashBoard.vue:114
+#: src/views/dashboard/NginxDashBoard.vue:133
 #: src/views/dashboard/NginxDashBoard.vue:77
 msgid "Nginx is not running"
 msgstr "Nginx가 실행 중이 아닙니다"
@@ -3170,7 +3170,7 @@ msgstr "Nginx가 실행 중이 아닙니다"
 msgid "Nginx is not running in another container"
 msgstr "Nginx가 다른 컨테이너에서 실행되고 있지 않습니다"
 
-#: src/views/dashboard/NginxDashBoard.vue:109
+#: src/views/dashboard/NginxDashBoard.vue:114
 msgid "Nginx is running"
 msgstr "Nginx가 실행 중입니다"
 
@@ -3282,7 +3282,7 @@ msgstr "아니요"
 msgid "No Action"
 msgstr "작업 없음"
 
-#: src/views/dashboard/NginxDashBoard.vue:177
+#: src/views/dashboard/NginxDashBoard.vue:182
 msgid "No data"
 msgstr "데이터 없음"
 
@@ -3471,7 +3471,7 @@ msgstr "열림"
 msgid "OpenAI"
 msgstr "오픈AI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:272
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:276
 msgid "Or"
 msgstr "또는"
 
@@ -3544,7 +3544,7 @@ msgstr ""
 "웹인증(WebAuthn) 자격 증명입니다. 비밀번호 대체 또는 2FA 방법으로 사용할 수 "
 "있습니다."
 
-#: src/views/other/Login.vue:224 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "비밀번호"
 
@@ -3606,7 +3606,7 @@ msgstr "핵심 업그레이드 오류 수행"
 msgid "Performance"
 msgstr "성능"
 
-#: src/views/dashboard/NginxDashBoard.vue:182
+#: src/views/dashboard/NginxDashBoard.vue:187
 msgid "Performance Metrics"
 msgstr "성능 메트릭"
 
@@ -3630,7 +3630,7 @@ msgstr "PID 경로가 존재하지 않습니다"
 msgid "Plain text is empty"
 msgstr "평문이 비어 있습니다"
 
-#: src/views/dashboard/NginxDashBoard.vue:171
+#: src/views/dashboard/NginxDashBoard.vue:176
 msgid ""
 "Please enable the stub_status module to get request statistics, connection "
 "count, etc."
@@ -4612,7 +4612,7 @@ msgstr "공유 메모리 영역"
 msgid "Show"
 msgstr "표시"
 
-#: src/views/other/Login.vue:281
+#: src/views/other/Login.vue:285
 msgid "Sign in with a passkey"
 msgstr "패스키로 로그인"
 
@@ -4717,7 +4717,7 @@ msgstr "SSL 키 경로"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "HTTPS가 활성화된 경우 SSL 키 경로가 필요합니다"
 
-#: src/views/other/Login.vue:238
+#: src/views/other/Login.vue:242
 msgid "SSO Login"
 msgstr "SSO 로그인"
 
@@ -5152,7 +5152,7 @@ msgid ""
 "_./:"
 msgstr "이 필드에는 문자, 유니코드 문자, 숫자 및 -_./: 만 포함되어야 합니다"
 
-#: src/views/dashboard/NginxDashBoard.vue:150
+#: src/views/dashboard/NginxDashBoard.vue:155
 msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
@@ -5465,7 +5465,7 @@ msgstr "사용자가 OTP를 2FA로 활성화하지 않음"
 msgid "User Profile"
 msgstr "사용자 프로필"
 
-#: src/views/other/Login.vue:214 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:218 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "사용자 이름"

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

@@ -620,7 +620,7 @@ msgstr ""
 msgid "Cannot delete protected path: {0}"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:129
+#: src/views/dashboard/NginxDashBoard.vue:134
 msgid "Cannot get performance data in this state"
 msgstr ""
 
@@ -979,7 +979,7 @@ msgstr ""
 msgid "Connected"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:82
+#: src/views/dashboard/NginxDashBoard.vue:87
 msgid "Connection error, trying to reconnect..."
 msgstr ""
 
@@ -1636,7 +1636,7 @@ msgstr ""
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:147
+#: src/views/dashboard/NginxDashBoard.vue:152
 msgid "Enable stub_status module"
 msgstr ""
 
@@ -2220,7 +2220,7 @@ msgstr ""
 msgid "Get acme user error: {0}"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:138
+#: src/views/dashboard/NginxDashBoard.vue:143
 msgid "Get data failed"
 msgstr ""
 
@@ -2530,7 +2530,7 @@ msgstr ""
 msgid "Last checked at"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:113
+#: src/views/dashboard/NginxDashBoard.vue:118
 msgid "Last update"
 msgstr ""
 
@@ -2617,7 +2617,7 @@ msgstr ""
 msgid "Loader Threshold"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:175
+#: src/views/dashboard/NginxDashBoard.vue:180
 msgid "Loading data..."
 msgstr ""
 
@@ -2656,11 +2656,11 @@ msgid "Log List"
 msgstr ""
 
 #: src/routes/modules/auth.ts:14
-#: src/views/other/Login.vue:263
+#: src/views/other/Login.vue:267
 msgid "Login"
 msgstr ""
 
-#: src/views/other/Login.vue:75
+#: src/views/other/Login.vue:76
 msgid "Login successful"
 msgstr ""
 
@@ -2898,7 +2898,7 @@ msgstr ""
 msgid "Name"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:170
+#: src/views/dashboard/NginxDashBoard.vue:175
 msgid "Need to enable the stub_status module"
 msgstr ""
 
@@ -3051,8 +3051,8 @@ msgstr ""
 
 #: src/components/NgxConfigEditor/NginxStatusAlert.vue:15
 #: src/composables/useNginxPerformance.ts:43
-#: src/views/dashboard/NginxDashBoard.vue:109
-#: src/views/dashboard/NginxDashBoard.vue:128
+#: src/views/dashboard/NginxDashBoard.vue:114
+#: src/views/dashboard/NginxDashBoard.vue:133
 #: src/views/dashboard/NginxDashBoard.vue:77
 msgid "Nginx is not running"
 msgstr ""
@@ -3061,7 +3061,7 @@ msgstr ""
 msgid "Nginx is not running in another container"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:109
+#: src/views/dashboard/NginxDashBoard.vue:114
 msgid "Nginx is running"
 msgstr ""
 
@@ -3175,7 +3175,7 @@ msgstr ""
 msgid "No Action"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:177
+#: src/views/dashboard/NginxDashBoard.vue:182
 msgid "No data"
 msgstr ""
 
@@ -3359,7 +3359,7 @@ msgid "OpenAI"
 msgstr ""
 
 #: src/components/TwoFA/Authorization.vue:100
-#: src/views/other/Login.vue:272
+#: src/views/other/Login.vue:276
 msgid "Or"
 msgstr ""
 
@@ -3426,7 +3426,7 @@ msgstr ""
 msgid "Passkeys are webauthn credentials that validate your identity using touch, facial recognition, a device password, or a PIN. They can be used as a password replacement or as a 2FA method."
 msgstr ""
 
-#: src/views/other/Login.vue:224
+#: src/views/other/Login.vue:228
 #: src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr ""
@@ -3490,7 +3490,7 @@ msgstr ""
 msgid "Performance"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:182
+#: src/views/dashboard/NginxDashBoard.vue:187
 msgid "Performance Metrics"
 msgstr ""
 
@@ -3514,7 +3514,7 @@ msgstr ""
 msgid "Plain text is empty"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:171
+#: src/views/dashboard/NginxDashBoard.vue:176
 msgid "Please enable the stub_status module to get request statistics, connection count, etc."
 msgstr ""
 
@@ -4461,7 +4461,7 @@ msgstr ""
 msgid "Show"
 msgstr ""
 
-#: src/views/other/Login.vue:281
+#: src/views/other/Login.vue:285
 msgid "Sign in with a passkey"
 msgstr ""
 
@@ -4566,7 +4566,7 @@ msgstr ""
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr ""
 
-#: src/views/other/Login.vue:238
+#: src/views/other/Login.vue:242
 msgid "SSO Login"
 msgstr ""
 
@@ -4955,7 +4955,7 @@ msgstr ""
 msgid "This field should only contain letters, unicode characters, numbers, and -_./:"
 msgstr ""
 
-#: src/views/dashboard/NginxDashBoard.vue:150
+#: src/views/dashboard/NginxDashBoard.vue:155
 msgid "This module provides Nginx request statistics, connection count, etc. data. After enabling it, you can view performance statistics"
 msgstr ""
 
@@ -5219,7 +5219,7 @@ msgstr ""
 msgid "User Profile"
 msgstr ""
 
-#: src/views/other/Login.vue:214
+#: src/views/other/Login.vue:218
 #: src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127
 #: src/views/user/UserProfile.vue:131

+ 21 - 21
app/src/language/pt_PT/app.po

@@ -651,7 +651,7 @@ msgstr "Não posso comparar: conteúdo ausente"
 msgid "Cannot delete protected path: {0}"
 msgstr "Não é possível eliminar o caminho protegido: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:129
+#: src/views/dashboard/NginxDashBoard.vue:134
 msgid "Cannot get performance data in this state"
 msgstr "Não é possível obter dados de desempenho neste estado"
 
@@ -1078,7 +1078,7 @@ msgstr "Confirmar nova palavra-passe"
 msgid "Connected"
 msgstr "Conectado"
 
-#: src/views/dashboard/NginxDashBoard.vue:82
+#: src/views/dashboard/NginxDashBoard.vue:87
 msgid "Connection error, trying to reconnect..."
 msgstr "Erro de conexão, tentando reconectar..."
 
@@ -1743,7 +1743,7 @@ msgstr "Falha ao ativar o fluxo %{name} em %{node}"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "Ativar o fluxo %{name} em %{node} com sucesso"
 
-#: src/views/dashboard/NginxDashBoard.vue:147
+#: src/views/dashboard/NginxDashBoard.vue:152
 msgid "Enable stub_status module"
 msgstr "Ativar módulo stub_status"
 
@@ -2329,7 +2329,7 @@ msgstr "Gerar chave privada para registo de conta"
 msgid "Get acme user error: {0}"
 msgstr "Erro ao obter o utilizador ACME: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:138
+#: src/views/dashboard/NginxDashBoard.vue:143
 msgid "Get data failed"
 msgstr "Falha ao obter os dados"
 
@@ -2665,7 +2665,7 @@ msgstr "Hora do último backup"
 msgid "Last checked at"
 msgstr "Última verificação em"
 
-#: src/views/dashboard/NginxDashBoard.vue:113
+#: src/views/dashboard/NginxDashBoard.vue:118
 msgid "Last update"
 msgstr "Última atualização"
 
@@ -2753,7 +2753,7 @@ msgstr "Pausa do Carregador"
 msgid "Loader Threshold"
 msgstr "Limiar do carregador"
 
-#: src/views/dashboard/NginxDashBoard.vue:175
+#: src/views/dashboard/NginxDashBoard.vue:180
 msgid "Loading data..."
 msgstr "A carregar dados..."
 
@@ -2796,11 +2796,11 @@ msgstr ""
 msgid "Log List"
 msgstr "Lista de registos"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:263
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:267
 msgid "Login"
 msgstr "Autenticar"
 
-#: src/views/other/Login.vue:75
+#: src/views/other/Login.vue:76
 msgid "Login successful"
 msgstr "Autenticado com sucesso"
 
@@ -3051,7 +3051,7 @@ msgstr "Diretiva Multilinha"
 msgid "Name"
 msgstr "Nome"
 
-#: src/views/dashboard/NginxDashBoard.vue:170
+#: src/views/dashboard/NginxDashBoard.vue:175
 msgid "Need to enable the stub_status module"
 msgstr "É necessário ativar o módulo stub_status"
 
@@ -3203,8 +3203,8 @@ msgstr "Erro do Nginx: {0}"
 
 #: src/components/NgxConfigEditor/NginxStatusAlert.vue:15
 #: src/composables/useNginxPerformance.ts:43
-#: src/views/dashboard/NginxDashBoard.vue:109
-#: src/views/dashboard/NginxDashBoard.vue:128
+#: src/views/dashboard/NginxDashBoard.vue:114
+#: src/views/dashboard/NginxDashBoard.vue:133
 #: src/views/dashboard/NginxDashBoard.vue:77
 msgid "Nginx is not running"
 msgstr "O Nginx não está em execução"
@@ -3213,7 +3213,7 @@ msgstr "O Nginx não está em execução"
 msgid "Nginx is not running in another container"
 msgstr "O Nginx não está em execução noutro contentor"
 
-#: src/views/dashboard/NginxDashBoard.vue:109
+#: src/views/dashboard/NginxDashBoard.vue:114
 msgid "Nginx is running"
 msgstr "O Nginx está em execução"
 
@@ -3328,7 +3328,7 @@ msgstr "Não"
 msgid "No Action"
 msgstr "Sem ação"
 
-#: src/views/dashboard/NginxDashBoard.vue:177
+#: src/views/dashboard/NginxDashBoard.vue:182
 msgid "No data"
 msgstr "Sem dados"
 
@@ -3520,7 +3520,7 @@ msgstr "Aberto"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:272
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:276
 msgid "Or"
 msgstr "Ou"
 
@@ -3594,7 +3594,7 @@ msgstr ""
 "Podem ser usadas como substituto de palavra-passe ou como método de "
 "autenticação de dois fatores (2FA)."
 
-#: src/views/other/Login.vue:224 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "Palavra-passe"
 
@@ -3656,7 +3656,7 @@ msgstr "Erro ao efectuar actualização do core"
 msgid "Performance"
 msgstr "Desempenho"
 
-#: src/views/dashboard/NginxDashBoard.vue:182
+#: src/views/dashboard/NginxDashBoard.vue:187
 msgid "Performance Metrics"
 msgstr "Métricas de desempenho"
 
@@ -3680,7 +3680,7 @@ msgstr "O caminho do PID não existe"
 msgid "Plain text is empty"
 msgstr "O texto simples está vazio"
 
-#: src/views/dashboard/NginxDashBoard.vue:171
+#: src/views/dashboard/NginxDashBoard.vue:176
 msgid ""
 "Please enable the stub_status module to get request statistics, connection "
 "count, etc."
@@ -4684,7 +4684,7 @@ msgstr "Zona de Memória Partilhada"
 msgid "Show"
 msgstr "Mostrar"
 
-#: src/views/other/Login.vue:281
+#: src/views/other/Login.vue:285
 msgid "Sign in with a passkey"
 msgstr "Iniciar sessão com uma chave de acesso"
 
@@ -4792,7 +4792,7 @@ msgstr "Caminho da chave SSL"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "O caminho da chave SSL é necessário quando o HTTPS está ativado"
 
-#: src/views/other/Login.vue:238
+#: src/views/other/Login.vue:242
 msgid "SSO Login"
 msgstr "Autenticação SSO"
 
@@ -5241,7 +5241,7 @@ msgid ""
 msgstr ""
 "Este campo deve conter apenas letras, caracteres Unicode, números e -_./:"
 
-#: src/views/dashboard/NginxDashBoard.vue:150
+#: src/views/dashboard/NginxDashBoard.vue:155
 msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
@@ -5556,7 +5556,7 @@ msgstr "Utilizador não ativou OTP como 2FA"
 msgid "User Profile"
 msgstr "Perfil do utilizador"
 
-#: src/views/other/Login.vue:214 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:218 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Nome de Utilizador"

+ 21 - 21
app/src/language/ru_RU/app.po

@@ -656,7 +656,7 @@ msgstr "Невозможно сравнить: отсутствующий кон
 msgid "Cannot delete protected path: {0}"
 msgstr "Невозможно удалить защищенный путь: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:129
+#: src/views/dashboard/NginxDashBoard.vue:134
 msgid "Cannot get performance data in this state"
 msgstr "Не может получить данные о производительности в этом состоянии"
 
@@ -1079,7 +1079,7 @@ msgstr "Подтвердите новый пароль"
 msgid "Connected"
 msgstr "Подключено"
 
-#: src/views/dashboard/NginxDashBoard.vue:82
+#: src/views/dashboard/NginxDashBoard.vue:87
 msgid "Connection error, trying to reconnect..."
 msgstr "Ошибка соединения, попытка переподключения..."
 
@@ -1743,7 +1743,7 @@ msgstr "Не удалось включить поток %{name} на %{node}"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "Поток %{name} успешно включён на %{node}"
 
-#: src/views/dashboard/NginxDashBoard.vue:147
+#: src/views/dashboard/NginxDashBoard.vue:152
 msgid "Enable stub_status module"
 msgstr "Включить модуль stub_status"
 
@@ -2328,7 +2328,7 @@ msgstr "Генерация приватного ключа для регистр
 msgid "Get acme user error: {0}"
 msgstr "Ошибка получения пользователя ACME: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:138
+#: src/views/dashboard/NginxDashBoard.vue:143
 msgid "Get data failed"
 msgstr "Не удалось получить данные"
 
@@ -2663,7 +2663,7 @@ msgstr "Время последнего резервного копирован
 msgid "Last checked at"
 msgstr "Последняя проверка в"
 
-#: src/views/dashboard/NginxDashBoard.vue:113
+#: src/views/dashboard/NginxDashBoard.vue:118
 msgid "Last update"
 msgstr "Последнее обновление"
 
@@ -2750,7 +2750,7 @@ msgstr "Пауза загрузчика"
 msgid "Loader Threshold"
 msgstr "Порог загрузчика"
 
-#: src/views/dashboard/NginxDashBoard.vue:175
+#: src/views/dashboard/NginxDashBoard.vue:180
 msgid "Loading data..."
 msgstr "Загрузка данных..."
 
@@ -2793,11 +2793,11 @@ msgstr ""
 msgid "Log List"
 msgstr "Список журналов"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:263
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:267
 msgid "Login"
 msgstr "Логин"
 
-#: src/views/other/Login.vue:75
+#: src/views/other/Login.vue:76
 msgid "Login successful"
 msgstr "Авторизация успешна"
 
@@ -3048,7 +3048,7 @@ msgstr "Многострочная директива"
 msgid "Name"
 msgstr "Имя"
 
-#: src/views/dashboard/NginxDashBoard.vue:170
+#: src/views/dashboard/NginxDashBoard.vue:175
 msgid "Need to enable the stub_status module"
 msgstr "Необходимо включить модуль stub_status"
 
@@ -3200,8 +3200,8 @@ msgstr "Ошибка Nginx: {0}"
 
 #: src/components/NgxConfigEditor/NginxStatusAlert.vue:15
 #: src/composables/useNginxPerformance.ts:43
-#: src/views/dashboard/NginxDashBoard.vue:109
-#: src/views/dashboard/NginxDashBoard.vue:128
+#: src/views/dashboard/NginxDashBoard.vue:114
+#: src/views/dashboard/NginxDashBoard.vue:133
 #: src/views/dashboard/NginxDashBoard.vue:77
 msgid "Nginx is not running"
 msgstr "Nginx не работает"
@@ -3210,7 +3210,7 @@ msgstr "Nginx не работает"
 msgid "Nginx is not running in another container"
 msgstr "Nginx не работает в другом контейнере"
 
-#: src/views/dashboard/NginxDashBoard.vue:109
+#: src/views/dashboard/NginxDashBoard.vue:114
 msgid "Nginx is running"
 msgstr "Nginx работает"
 
@@ -3324,7 +3324,7 @@ msgstr "Нет"
 msgid "No Action"
 msgstr "Нет действия"
 
-#: src/views/dashboard/NginxDashBoard.vue:177
+#: src/views/dashboard/NginxDashBoard.vue:182
 msgid "No data"
 msgstr "Нет данных"
 
@@ -3515,7 +3515,7 @@ msgstr "Открыт"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:272
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:276
 msgid "Or"
 msgstr "Или"
 
@@ -3589,7 +3589,7 @@ msgstr ""
 "могут использоваться вместо пароля или в качестве метода двухфакторной "
 "аутентификации (2FA)."
 
-#: src/views/other/Login.vue:224 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "Пароль"
 
@@ -3651,7 +3651,7 @@ msgstr "Ошибка обновления ядра"
 msgid "Performance"
 msgstr "Производительность"
 
-#: src/views/dashboard/NginxDashBoard.vue:182
+#: src/views/dashboard/NginxDashBoard.vue:187
 msgid "Performance Metrics"
 msgstr "Метрики производительности"
 
@@ -3675,7 +3675,7 @@ msgstr "Путь PID не существует"
 msgid "Plain text is empty"
 msgstr "Открытый текст пуст"
 
-#: src/views/dashboard/NginxDashBoard.vue:171
+#: src/views/dashboard/NginxDashBoard.vue:176
 msgid ""
 "Please enable the stub_status module to get request statistics, connection "
 "count, etc."
@@ -4677,7 +4677,7 @@ msgstr "Зона общей памяти"
 msgid "Show"
 msgstr "Показать"
 
-#: src/views/other/Login.vue:281
+#: src/views/other/Login.vue:285
 msgid "Sign in with a passkey"
 msgstr "Войти с помощью ключа доступа"
 
@@ -4783,7 +4783,7 @@ msgstr "Путь к SSL-ключу"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "Путь к SSL-ключу обязателен при включении HTTPS"
 
-#: src/views/other/Login.vue:238
+#: src/views/other/Login.vue:242
 msgid "SSO Login"
 msgstr "SSO Вход"
 
@@ -5226,7 +5226,7 @@ msgid ""
 "_./:"
 msgstr "Это поле должно содержать только буквы, символы Unicode, цифры и -_./:"
 
-#: src/views/dashboard/NginxDashBoard.vue:150
+#: src/views/dashboard/NginxDashBoard.vue:155
 msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
@@ -5543,7 +5543,7 @@ msgstr "Пользователь не включил OTP в качестве 2FA
 msgid "User Profile"
 msgstr "Профиль пользователя"
 
-#: src/views/other/Login.vue:214 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:218 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Имя пользователя"

+ 21 - 21
app/src/language/tr_TR/app.po

@@ -649,7 +649,7 @@ msgstr "Karşılaştırılamaz: Eksik İçerik"
 msgid "Cannot delete protected path: {0}"
 msgstr "Korunan yol silinemez: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:129
+#: src/views/dashboard/NginxDashBoard.vue:134
 msgid "Cannot get performance data in this state"
 msgstr "Bu durumda performans verileri alamıyorum"
 
@@ -1074,7 +1074,7 @@ msgstr "Yeni Şifreyi Onayla"
 msgid "Connected"
 msgstr "Bağlandı"
 
-#: src/views/dashboard/NginxDashBoard.vue:82
+#: src/views/dashboard/NginxDashBoard.vue:87
 msgid "Connection error, trying to reconnect..."
 msgstr "Bağlantı hatası, yeniden bağlanılmaya çalışılıyor..."
 
@@ -1741,7 +1741,7 @@ msgstr "%{node} üzerinde %{name} akışı etkinleştirilemedi"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "%{node} üzerinde %{name} akışı başarıyla etkinleştirildi"
 
-#: src/views/dashboard/NginxDashBoard.vue:147
+#: src/views/dashboard/NginxDashBoard.vue:152
 msgid "Enable stub_status module"
 msgstr "stub_status modülünü etkinleştir"
 
@@ -2326,7 +2326,7 @@ msgstr "Hesap kaydı için özel anahtar oluşturuluyor"
 msgid "Get acme user error: {0}"
 msgstr "ACME kullanıcısı alınırken hata: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:138
+#: src/views/dashboard/NginxDashBoard.vue:143
 msgid "Get data failed"
 msgstr "Veri alınamadı"
 
@@ -2663,7 +2663,7 @@ msgstr "Son Yedekleme Zamanı"
 msgid "Last checked at"
 msgstr "En son şu tarihte kontrol edildi"
 
-#: src/views/dashboard/NginxDashBoard.vue:113
+#: src/views/dashboard/NginxDashBoard.vue:118
 msgid "Last update"
 msgstr "Son güncelleme"
 
@@ -2750,7 +2750,7 @@ msgstr "Yükleyici Bekleme Süresi"
 msgid "Loader Threshold"
 msgstr "Yükleyici Eşiği"
 
-#: src/views/dashboard/NginxDashBoard.vue:175
+#: src/views/dashboard/NginxDashBoard.vue:180
 msgid "Loading data..."
 msgstr "Veriler yükleniyor..."
 
@@ -2793,11 +2793,11 @@ msgstr ""
 msgid "Log List"
 msgstr "Günlük Listesi"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:263
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:267
 msgid "Login"
 msgstr "Giriş"
 
-#: src/views/other/Login.vue:75
+#: src/views/other/Login.vue:76
 msgid "Login successful"
 msgstr "Giriş Başarılı"
 
@@ -3048,7 +3048,7 @@ msgstr "Çok Satırlı Yönergeler"
 msgid "Name"
 msgstr "İsim"
 
-#: src/views/dashboard/NginxDashBoard.vue:170
+#: src/views/dashboard/NginxDashBoard.vue:175
 msgid "Need to enable the stub_status module"
 msgstr "stub_status modülünün etkinleştirilmesi gerekiyor"
 
@@ -3200,8 +3200,8 @@ msgstr "Nginx hatası: {0}"
 
 #: src/components/NgxConfigEditor/NginxStatusAlert.vue:15
 #: src/composables/useNginxPerformance.ts:43
-#: src/views/dashboard/NginxDashBoard.vue:109
-#: src/views/dashboard/NginxDashBoard.vue:128
+#: src/views/dashboard/NginxDashBoard.vue:114
+#: src/views/dashboard/NginxDashBoard.vue:133
 #: src/views/dashboard/NginxDashBoard.vue:77
 msgid "Nginx is not running"
 msgstr "Nginx çalışmıyor"
@@ -3210,7 +3210,7 @@ msgstr "Nginx çalışmıyor"
 msgid "Nginx is not running in another container"
 msgstr "Nginx başka bir konteynerde çalışmıyor"
 
-#: src/views/dashboard/NginxDashBoard.vue:109
+#: src/views/dashboard/NginxDashBoard.vue:114
 msgid "Nginx is running"
 msgstr "Nginx çalışıyor"
 
@@ -3324,7 +3324,7 @@ msgstr "Hayır"
 msgid "No Action"
 msgstr "Eylem Yok"
 
-#: src/views/dashboard/NginxDashBoard.vue:177
+#: src/views/dashboard/NginxDashBoard.vue:182
 msgid "No data"
 msgstr "Veri yok"
 
@@ -3515,7 +3515,7 @@ msgstr "Açık"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:272
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:276
 msgid "Or"
 msgstr "Veya"
 
@@ -3588,7 +3588,7 @@ msgstr ""
 "kimliğinizi doğrulayan WebAuthn kimlik bilgileridir. Bir şifre yerine veya "
 "iki faktörlü kimlik doğrulama (2FA) yöntemi olarak kullanılabilirler."
 
-#: src/views/other/Login.vue:224 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "Şifre"
 
@@ -3650,7 +3650,7 @@ msgstr "Çekirdek yükseltme hatası"
 msgid "Performance"
 msgstr "Performans"
 
-#: src/views/dashboard/NginxDashBoard.vue:182
+#: src/views/dashboard/NginxDashBoard.vue:187
 msgid "Performance Metrics"
 msgstr "Performans Metrikleri"
 
@@ -3674,7 +3674,7 @@ msgstr "PID yolu mevcut değil"
 msgid "Plain text is empty"
 msgstr "Düz metin boş"
 
-#: src/views/dashboard/NginxDashBoard.vue:171
+#: src/views/dashboard/NginxDashBoard.vue:176
 msgid ""
 "Please enable the stub_status module to get request statistics, connection "
 "count, etc."
@@ -4682,7 +4682,7 @@ msgstr "Paylaşılan Bellek Bölgesi"
 msgid "Show"
 msgstr "Göster"
 
-#: src/views/other/Login.vue:281
+#: src/views/other/Login.vue:285
 msgid "Sign in with a passkey"
 msgstr "Bir anahtarla oturum aç"
 
@@ -4787,7 +4787,7 @@ msgstr "SSL Anahtar Yolu"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "HTTPS etkinleştirildiğinde SSL anahtar yolu gereklidir"
 
-#: src/views/other/Login.vue:238
+#: src/views/other/Login.vue:242
 msgid "SSO Login"
 msgstr "SSO Girişi"
 
@@ -5234,7 +5234,7 @@ msgid ""
 msgstr ""
 "Bu alan yalnızca harfler, Unicode karakterler, sayılar ve -_./: içermelidir"
 
-#: src/views/dashboard/NginxDashBoard.vue:150
+#: src/views/dashboard/NginxDashBoard.vue:155
 msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
@@ -5550,7 +5550,7 @@ msgstr "Kullanıcı OTP'yi 2FA olarak etkinleştirmedi"
 msgid "User Profile"
 msgstr "Kullanıcı Profili"
 
-#: src/views/other/Login.vue:214 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:218 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Kullanıcı Adı"

+ 21 - 21
app/src/language/uk_UA/app.po

@@ -657,7 +657,7 @@ msgstr "Не вдається порівняти: відсутній вміст"
 msgid "Cannot delete protected path: {0}"
 msgstr "Неможливо видалити захищений шлях: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:129
+#: src/views/dashboard/NginxDashBoard.vue:134
 msgid "Cannot get performance data in this state"
 msgstr "Не вдається отримати дані про ефективність у цьому стані"
 
@@ -1077,7 +1077,7 @@ msgstr "Підтвердити новий пароль"
 msgid "Connected"
 msgstr "Підключено"
 
-#: src/views/dashboard/NginxDashBoard.vue:82
+#: src/views/dashboard/NginxDashBoard.vue:87
 msgid "Connection error, trying to reconnect..."
 msgstr "Помилка з'єднання, спроба повторного підключення..."
 
@@ -1814,7 +1814,7 @@ msgstr "Не вдалося увімкнути потік %{name} на %{node}"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "Потік %{name} успішно ввімкнено на %{node}"
 
-#: src/views/dashboard/NginxDashBoard.vue:147
+#: src/views/dashboard/NginxDashBoard.vue:152
 msgid "Enable stub_status module"
 msgstr "Увімкнути модуль stub_status"
 
@@ -2399,7 +2399,7 @@ msgstr "Генерація приватного ключа для реєстра
 msgid "Get acme user error: {0}"
 msgstr "Помилка отримання користувача ACME: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:138
+#: src/views/dashboard/NginxDashBoard.vue:143
 msgid "Get data failed"
 msgstr "Не вдалося отримати дані"
 
@@ -2733,7 +2733,7 @@ msgstr "Час останньої резервної копії"
 msgid "Last checked at"
 msgstr "Остання перевірка"
 
-#: src/views/dashboard/NginxDashBoard.vue:113
+#: src/views/dashboard/NginxDashBoard.vue:118
 msgid "Last update"
 msgstr "Останнє оновлення"
 
@@ -2821,7 +2821,7 @@ msgstr "Час очікування завантажувача"
 msgid "Loader Threshold"
 msgstr "Поріг завантажувача"
 
-#: src/views/dashboard/NginxDashBoard.vue:175
+#: src/views/dashboard/NginxDashBoard.vue:180
 msgid "Loading data..."
 msgstr "Завантаження даних..."
 
@@ -2864,11 +2864,11 @@ msgstr ""
 msgid "Log List"
 msgstr "Список журналів"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:263
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:267
 msgid "Login"
 msgstr "Увійти"
 
-#: src/views/other/Login.vue:75
+#: src/views/other/Login.vue:76
 msgid "Login successful"
 msgstr "Успішний вхід"
 
@@ -3119,7 +3119,7 @@ msgstr "Багаторядкова директива"
 msgid "Name"
 msgstr "Ім'я"
 
-#: src/views/dashboard/NginxDashBoard.vue:170
+#: src/views/dashboard/NginxDashBoard.vue:175
 msgid "Need to enable the stub_status module"
 msgstr "Потрібно активувати модуль stub_status"
 
@@ -3271,8 +3271,8 @@ msgstr "Помилка Nginx: {0}"
 
 #: src/components/NgxConfigEditor/NginxStatusAlert.vue:15
 #: src/composables/useNginxPerformance.ts:43
-#: src/views/dashboard/NginxDashBoard.vue:109
-#: src/views/dashboard/NginxDashBoard.vue:128
+#: src/views/dashboard/NginxDashBoard.vue:114
+#: src/views/dashboard/NginxDashBoard.vue:133
 #: src/views/dashboard/NginxDashBoard.vue:77
 msgid "Nginx is not running"
 msgstr "Nginx не працює"
@@ -3281,7 +3281,7 @@ msgstr "Nginx не працює"
 msgid "Nginx is not running in another container"
 msgstr "Nginx не працює в іншому контейнері"
 
-#: src/views/dashboard/NginxDashBoard.vue:109
+#: src/views/dashboard/NginxDashBoard.vue:114
 msgid "Nginx is running"
 msgstr "Nginx працює"
 
@@ -3395,7 +3395,7 @@ msgstr "Ні"
 msgid "No Action"
 msgstr "Без дії"
 
-#: src/views/dashboard/NginxDashBoard.vue:177
+#: src/views/dashboard/NginxDashBoard.vue:182
 msgid "No data"
 msgstr "Немає даних"
 
@@ -3586,7 +3586,7 @@ msgstr "Відкрито"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:272
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:276
 msgid "Or"
 msgstr "Або"
 
@@ -3660,7 +3660,7 @@ msgstr ""
 "можуть використовуватися замість пароля або як метод двофакторної "
 "аутентифікації (2FA)."
 
-#: src/views/other/Login.vue:224 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "Пароль"
 
@@ -3722,7 +3722,7 @@ msgstr "Помилка виконання оновлення ядра"
 msgid "Performance"
 msgstr "Продуктивність"
 
-#: src/views/dashboard/NginxDashBoard.vue:182
+#: src/views/dashboard/NginxDashBoard.vue:187
 msgid "Performance Metrics"
 msgstr "Метрики продуктивності"
 
@@ -3746,7 +3746,7 @@ msgstr "Шлях PID не існує"
 msgid "Plain text is empty"
 msgstr "Звичайний текст порожній"
 
-#: src/views/dashboard/NginxDashBoard.vue:171
+#: src/views/dashboard/NginxDashBoard.vue:176
 msgid ""
 "Please enable the stub_status module to get request statistics, connection "
 "count, etc."
@@ -4749,7 +4749,7 @@ msgstr "Зона спільної пам'яті"
 msgid "Show"
 msgstr "Показати"
 
-#: src/views/other/Login.vue:281
+#: src/views/other/Login.vue:285
 msgid "Sign in with a passkey"
 msgstr "Увійти за допомогою ключа доступу"
 
@@ -4855,7 +4855,7 @@ msgstr "Шлях до SSL-ключа"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "Шлях до SSL-ключа обов’язковий при ввімкненні HTTPS"
 
-#: src/views/other/Login.vue:238
+#: src/views/other/Login.vue:242
 msgid "SSO Login"
 msgstr "Вхід через SSO"
 
@@ -5299,7 +5299,7 @@ msgid ""
 "_./:"
 msgstr "Це поле має містити лише літери, символи Unicode, цифри та -_./:"
 
-#: src/views/dashboard/NginxDashBoard.vue:150
+#: src/views/dashboard/NginxDashBoard.vue:155
 msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
@@ -5614,7 +5614,7 @@ msgstr "Користувач не увімкнув OTP як 2FA"
 msgid "User Profile"
 msgstr "Профіль користувача"
 
-#: src/views/other/Login.vue:214 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:218 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Ім’я користувача"

+ 21 - 21
app/src/language/vi_VN/app.po

@@ -637,7 +637,7 @@ msgstr "Không thể so sánh: Thiếu nội dung"
 msgid "Cannot delete protected path: {0}"
 msgstr "Không thể xóa đường dẫn được bảo vệ: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:129
+#: src/views/dashboard/NginxDashBoard.vue:134
 msgid "Cannot get performance data in this state"
 msgstr "Không thể nhận được dữ liệu hiệu suất ở trạng thái này"
 
@@ -1056,7 +1056,7 @@ msgstr "Xác nhận mật khẩu mới"
 msgid "Connected"
 msgstr "Đã kết nối"
 
-#: src/views/dashboard/NginxDashBoard.vue:82
+#: src/views/dashboard/NginxDashBoard.vue:87
 msgid "Connection error, trying to reconnect..."
 msgstr "Lỗi kết nối, đang thử kết nối lại..."
 
@@ -1718,7 +1718,7 @@ msgstr "Không thể bật luồng %{name} trên %{node}"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "Đã bật luồng %{name} trên %{node} thành công"
 
-#: src/views/dashboard/NginxDashBoard.vue:147
+#: src/views/dashboard/NginxDashBoard.vue:152
 msgid "Enable stub_status module"
 msgstr "Bật module stub_status"
 
@@ -2303,7 +2303,7 @@ msgstr "Tạo khóa riêng để đăng ký tài khoản"
 msgid "Get acme user error: {0}"
 msgstr "Lỗi khi lấy người dùng ACME: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:138
+#: src/views/dashboard/NginxDashBoard.vue:143
 msgid "Get data failed"
 msgstr "Không thể lấy dữ liệu"
 
@@ -2635,7 +2635,7 @@ msgstr "Thời gian sao lưu cuối cùng"
 msgid "Last checked at"
 msgstr "Kiểm tra lần cuối lúc"
 
-#: src/views/dashboard/NginxDashBoard.vue:113
+#: src/views/dashboard/NginxDashBoard.vue:118
 msgid "Last update"
 msgstr "Cập nhật cuối cùng"
 
@@ -2722,7 +2722,7 @@ msgstr "Thời gian nghỉ của bộ nạp"
 msgid "Loader Threshold"
 msgstr "Ngưỡng tải"
 
-#: src/views/dashboard/NginxDashBoard.vue:175
+#: src/views/dashboard/NginxDashBoard.vue:180
 msgid "Loading data..."
 msgstr "Đang tải dữ liệu..."
 
@@ -2765,11 +2765,11 @@ msgstr ""
 msgid "Log List"
 msgstr "Danh sách nhật ký"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:263
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:267
 msgid "Login"
 msgstr "Đăng nhập"
 
-#: src/views/other/Login.vue:75
+#: src/views/other/Login.vue:76
 msgid "Login successful"
 msgstr "Đăng nhập thành công"
 
@@ -3020,7 +3020,7 @@ msgstr "Chỉ thị nhiều dòng"
 msgid "Name"
 msgstr "Tên"
 
-#: src/views/dashboard/NginxDashBoard.vue:170
+#: src/views/dashboard/NginxDashBoard.vue:175
 msgid "Need to enable the stub_status module"
 msgstr "Cần bật module stub_status"
 
@@ -3172,8 +3172,8 @@ msgstr "Lỗi Nginx: {0}"
 
 #: src/components/NgxConfigEditor/NginxStatusAlert.vue:15
 #: src/composables/useNginxPerformance.ts:43
-#: src/views/dashboard/NginxDashBoard.vue:109
-#: src/views/dashboard/NginxDashBoard.vue:128
+#: src/views/dashboard/NginxDashBoard.vue:114
+#: src/views/dashboard/NginxDashBoard.vue:133
 #: src/views/dashboard/NginxDashBoard.vue:77
 msgid "Nginx is not running"
 msgstr "Nginx không đang chạy"
@@ -3182,7 +3182,7 @@ msgstr "Nginx không đang chạy"
 msgid "Nginx is not running in another container"
 msgstr "Nginx không chạy trong một container khác"
 
-#: src/views/dashboard/NginxDashBoard.vue:109
+#: src/views/dashboard/NginxDashBoard.vue:114
 msgid "Nginx is running"
 msgstr "Nginx đang chạy"
 
@@ -3295,7 +3295,7 @@ msgstr "Không"
 msgid "No Action"
 msgstr "Không hành động"
 
-#: src/views/dashboard/NginxDashBoard.vue:177
+#: src/views/dashboard/NginxDashBoard.vue:182
 msgid "No data"
 msgstr "Không có dữ liệu"
 
@@ -3484,7 +3484,7 @@ msgstr "Mở"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:272
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:276
 msgid "Or"
 msgstr "Hoặc"
 
@@ -3558,7 +3558,7 @@ msgstr ""
 "thể được sử dụng để thay thế mật khẩu hoặc làm phương thức xác thực hai yếu "
 "tố (2FA)."
 
-#: src/views/other/Login.vue:224 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "Mật khẩu"
 
@@ -3620,7 +3620,7 @@ msgstr "Nâng cấp core không thành công"
 msgid "Performance"
 msgstr "Hiệu suất"
 
-#: src/views/dashboard/NginxDashBoard.vue:182
+#: src/views/dashboard/NginxDashBoard.vue:187
 msgid "Performance Metrics"
 msgstr "Chỉ số hiệu suất"
 
@@ -3644,7 +3644,7 @@ msgstr "Đường dẫn PID không tồn tại"
 msgid "Plain text is empty"
 msgstr "Văn bản thuần túy trống"
 
-#: src/views/dashboard/NginxDashBoard.vue:171
+#: src/views/dashboard/NginxDashBoard.vue:176
 msgid ""
 "Please enable the stub_status module to get request statistics, connection "
 "count, etc."
@@ -4633,7 +4633,7 @@ msgstr "Vùng Bộ Nhớ Chia Sẻ"
 msgid "Show"
 msgstr "Hiển thị"
 
-#: src/views/other/Login.vue:281
+#: src/views/other/Login.vue:285
 msgid "Sign in with a passkey"
 msgstr "Đăng nhập bằng khóa truy cập"
 
@@ -4738,7 +4738,7 @@ msgstr "Đường dẫn khóa SSL"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "Đường dẫn khóa SSL là bắt buộc khi bật HTTPS"
 
-#: src/views/other/Login.vue:238
+#: src/views/other/Login.vue:242
 msgid "SSO Login"
 msgstr "Đăng nhập SSO"
 
@@ -5181,7 +5181,7 @@ msgid ""
 "_./:"
 msgstr "Trường này chỉ được chứa chữ cái, ký tự Unicode, số và -_./:"
 
-#: src/views/dashboard/NginxDashBoard.vue:150
+#: src/views/dashboard/NginxDashBoard.vue:155
 msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
@@ -5497,7 +5497,7 @@ msgstr "Người dùng chưa bật OTP làm 2FA"
 msgid "User Profile"
 msgstr "Hồ sơ người dùng"
 
-#: src/views/other/Login.vue:214 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:218 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Username"

+ 21 - 21
app/src/language/zh_CN/app.po

@@ -633,7 +633,7 @@ msgstr "无法比较:内容缺失"
 msgid "Cannot delete protected path: {0}"
 msgstr "无法删除受保护的路径:{0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:129
+#: src/views/dashboard/NginxDashBoard.vue:134
 msgid "Cannot get performance data in this state"
 msgstr "在此状态下无法获取性能数据"
 
@@ -1039,7 +1039,7 @@ msgstr "确认新密码"
 msgid "Connected"
 msgstr "已连接"
 
-#: src/views/dashboard/NginxDashBoard.vue:82
+#: src/views/dashboard/NginxDashBoard.vue:87
 msgid "Connection error, trying to reconnect..."
 msgstr "连接错误,正在尝试重新连接..."
 
@@ -1697,7 +1697,7 @@ msgstr "在 %{node} 中启用 %{name} 失败"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "在 %{node} 上启用 %{name} 成功"
 
-#: src/views/dashboard/NginxDashBoard.vue:147
+#: src/views/dashboard/NginxDashBoard.vue:152
 msgid "Enable stub_status module"
 msgstr "启用 stub_status 模块"
 
@@ -2280,7 +2280,7 @@ msgstr "正在生成私钥用于注册账户"
 msgid "Get acme user error: {0}"
 msgstr "获取 ACME 用户错误: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:138
+#: src/views/dashboard/NginxDashBoard.vue:143
 msgid "Get data failed"
 msgstr "获取数据失败"
 
@@ -2604,7 +2604,7 @@ msgstr "上次备份时间"
 msgid "Last checked at"
 msgstr "最后检查时间"
 
-#: src/views/dashboard/NginxDashBoard.vue:113
+#: src/views/dashboard/NginxDashBoard.vue:118
 msgid "Last update"
 msgstr "上次更新"
 
@@ -2691,7 +2691,7 @@ msgstr "加载器睡眠"
 msgid "Loader Threshold"
 msgstr "加载器阈值"
 
-#: src/views/dashboard/NginxDashBoard.vue:175
+#: src/views/dashboard/NginxDashBoard.vue:180
 msgid "Loading data..."
 msgstr "正在加载数据..."
 
@@ -2733,11 +2733,11 @@ msgstr ""
 msgid "Log List"
 msgstr "日志列表"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:263
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:267
 msgid "Login"
 msgstr "登录"
 
-#: src/views/other/Login.vue:75
+#: src/views/other/Login.vue:76
 msgid "Login successful"
 msgstr "登录成功"
 
@@ -2986,7 +2986,7 @@ msgstr "多行指令"
 msgid "Name"
 msgstr "名称"
 
-#: src/views/dashboard/NginxDashBoard.vue:170
+#: src/views/dashboard/NginxDashBoard.vue:175
 msgid "Need to enable the stub_status module"
 msgstr "需要启用 stub_status 模块"
 
@@ -3138,8 +3138,8 @@ msgstr "Nginx 错误:{0}"
 
 #: src/components/NgxConfigEditor/NginxStatusAlert.vue:15
 #: src/composables/useNginxPerformance.ts:43
-#: src/views/dashboard/NginxDashBoard.vue:109
-#: src/views/dashboard/NginxDashBoard.vue:128
+#: src/views/dashboard/NginxDashBoard.vue:114
+#: src/views/dashboard/NginxDashBoard.vue:133
 #: src/views/dashboard/NginxDashBoard.vue:77
 msgid "Nginx is not running"
 msgstr "Nginx 未启动"
@@ -3148,7 +3148,7 @@ msgstr "Nginx 未启动"
 msgid "Nginx is not running in another container"
 msgstr "Nginx 未在另一个容器中运行"
 
-#: src/views/dashboard/NginxDashBoard.vue:109
+#: src/views/dashboard/NginxDashBoard.vue:114
 msgid "Nginx is running"
 msgstr "Nginx 正在运行"
 
@@ -3260,7 +3260,7 @@ msgstr "取消"
 msgid "No Action"
 msgstr "无操作"
 
-#: src/views/dashboard/NginxDashBoard.vue:177
+#: src/views/dashboard/NginxDashBoard.vue:182
 msgid "No data"
 msgstr "没有数据"
 
@@ -3445,7 +3445,7 @@ msgstr "开放"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:272
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:276
 msgid "Or"
 msgstr "或"
 
@@ -3517,7 +3517,7 @@ msgstr ""
 "Passkey 是一种网络认证凭据,可通过指纹、面部识别、设备密码或 PIN 码验证身份。"
 "它们可用作密码替代品或二步验证方法。"
 
-#: src/views/other/Login.vue:224 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "密码"
 
@@ -3579,7 +3579,7 @@ msgstr "执行核心升级错误"
 msgid "Performance"
 msgstr "性能"
 
-#: src/views/dashboard/NginxDashBoard.vue:182
+#: src/views/dashboard/NginxDashBoard.vue:187
 msgid "Performance Metrics"
 msgstr "性能指标"
 
@@ -3603,7 +3603,7 @@ msgstr "PID 路径不存在"
 msgid "Plain text is empty"
 msgstr "原文为空"
 
-#: src/views/dashboard/NginxDashBoard.vue:171
+#: src/views/dashboard/NginxDashBoard.vue:176
 msgid ""
 "Please enable the stub_status module to get request statistics, connection "
 "count, etc."
@@ -4575,7 +4575,7 @@ msgstr "共享内存区"
 msgid "Show"
 msgstr "显示"
 
-#: src/views/other/Login.vue:281
+#: src/views/other/Login.vue:285
 msgid "Sign in with a passkey"
 msgstr "使用 Passkey 登录"
 
@@ -4680,7 +4680,7 @@ msgstr "SSL 密钥路径"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "启用 HTTPS 时需要 SSL 密钥路径"
 
-#: src/views/other/Login.vue:238
+#: src/views/other/Login.vue:242
 msgid "SSO Login"
 msgstr "SSO 登录"
 
@@ -5101,7 +5101,7 @@ msgid ""
 "_./:"
 msgstr "此字段应仅包含字母、Unicode字符、数字和 -_./:"
 
-#: src/views/dashboard/NginxDashBoard.vue:150
+#: src/views/dashboard/NginxDashBoard.vue:155
 msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
@@ -5397,7 +5397,7 @@ msgstr "用户未启用 OTP 作为 2FA"
 msgid "User Profile"
 msgstr "用户资料"
 
-#: src/views/other/Login.vue:214 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:218 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "用户名"

+ 21 - 21
app/src/language/zh_TW/app.po

@@ -637,7 +637,7 @@ msgstr "無法比較:缺少內容"
 msgid "Cannot delete protected path: {0}"
 msgstr "無法刪除受保護的路徑:{0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:129
+#: src/views/dashboard/NginxDashBoard.vue:134
 msgid "Cannot get performance data in this state"
 msgstr "目前狀態無法取得效能資料"
 
@@ -1044,7 +1044,7 @@ msgstr "確認新密碼"
 msgid "Connected"
 msgstr "已連線"
 
-#: src/views/dashboard/NginxDashBoard.vue:82
+#: src/views/dashboard/NginxDashBoard.vue:87
 msgid "Connection error, trying to reconnect..."
 msgstr "連線錯誤,正在嘗試重新連線..."
 
@@ -1702,7 +1702,7 @@ msgstr "在 %{node} 上啟用串流 %{name} 失敗"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "在 %{node} 上成功啟用串流 %{name}"
 
-#: src/views/dashboard/NginxDashBoard.vue:147
+#: src/views/dashboard/NginxDashBoard.vue:152
 msgid "Enable stub_status module"
 msgstr "啟用stub_status模組"
 
@@ -2285,7 +2285,7 @@ msgstr "產生註冊帳號的私鑰"
 msgid "Get acme user error: {0}"
 msgstr "獲取 ACME 用戶錯誤: {0}"
 
-#: src/views/dashboard/NginxDashBoard.vue:138
+#: src/views/dashboard/NginxDashBoard.vue:143
 msgid "Get data failed"
 msgstr "取得資料失敗"
 
@@ -2609,7 +2609,7 @@ msgstr "上次備份時間"
 msgid "Last checked at"
 msgstr "上次檢查時間"
 
-#: src/views/dashboard/NginxDashBoard.vue:113
+#: src/views/dashboard/NginxDashBoard.vue:118
 msgid "Last update"
 msgstr "最後更新時間"
 
@@ -2696,7 +2696,7 @@ msgstr "載入器休眠時間"
 msgid "Loader Threshold"
 msgstr "載入器門檻值"
 
-#: src/views/dashboard/NginxDashBoard.vue:175
+#: src/views/dashboard/NginxDashBoard.vue:180
 msgid "Loading data..."
 msgstr "資料載入中…"
 
@@ -2738,11 +2738,11 @@ msgstr ""
 msgid "Log List"
 msgstr "日誌列表"
 
-#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:263
+#: src/routes/modules/auth.ts:14 src/views/other/Login.vue:267
 msgid "Login"
 msgstr "登入"
 
-#: src/views/other/Login.vue:75
+#: src/views/other/Login.vue:76
 msgid "Login successful"
 msgstr "登入成功"
 
@@ -2990,7 +2990,7 @@ msgstr "多行指令"
 msgid "Name"
 msgstr "名稱"
 
-#: src/views/dashboard/NginxDashBoard.vue:170
+#: src/views/dashboard/NginxDashBoard.vue:175
 msgid "Need to enable the stub_status module"
 msgstr "需要啟用 stub_status 模組"
 
@@ -3142,8 +3142,8 @@ msgstr "Nginx 錯誤:{0}"
 
 #: src/components/NgxConfigEditor/NginxStatusAlert.vue:15
 #: src/composables/useNginxPerformance.ts:43
-#: src/views/dashboard/NginxDashBoard.vue:109
-#: src/views/dashboard/NginxDashBoard.vue:128
+#: src/views/dashboard/NginxDashBoard.vue:114
+#: src/views/dashboard/NginxDashBoard.vue:133
 #: src/views/dashboard/NginxDashBoard.vue:77
 msgid "Nginx is not running"
 msgstr "Nginx 未執行"
@@ -3152,7 +3152,7 @@ msgstr "Nginx 未執行"
 msgid "Nginx is not running in another container"
 msgstr "Nginx 未在另一個容器中運行"
 
-#: src/views/dashboard/NginxDashBoard.vue:109
+#: src/views/dashboard/NginxDashBoard.vue:114
 msgid "Nginx is running"
 msgstr "Nginx 執行中"
 
@@ -3264,7 +3264,7 @@ msgstr "取消"
 msgid "No Action"
 msgstr "無行動"
 
-#: src/views/dashboard/NginxDashBoard.vue:177
+#: src/views/dashboard/NginxDashBoard.vue:182
 msgid "No data"
 msgstr "無數據"
 
@@ -3449,7 +3449,7 @@ msgstr "開放"
 msgid "OpenAI"
 msgstr "OpenAI"
 
-#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:272
+#: src/components/TwoFA/Authorization.vue:100 src/views/other/Login.vue:276
 msgid "Or"
 msgstr "或"
 
@@ -3521,7 +3521,7 @@ msgstr ""
 "通行金鑰是 WebAuthn 認證,透過觸控、面部辨識、裝置密碼或 PIN 碼來驗證您的身"
 "份。它們可以用作密碼替代品或作為雙重身份驗證 (2FA) 方法。"
 
-#: src/views/other/Login.vue:224 src/views/user/userColumns.tsx:16
+#: src/views/other/Login.vue:228 src/views/user/userColumns.tsx:16
 msgid "Password"
 msgstr "密碼"
 
@@ -3583,7 +3583,7 @@ msgstr "執行核心升級錯誤"
 msgid "Performance"
 msgstr "效能"
 
-#: src/views/dashboard/NginxDashBoard.vue:182
+#: src/views/dashboard/NginxDashBoard.vue:187
 msgid "Performance Metrics"
 msgstr "效能指標"
 
@@ -3607,7 +3607,7 @@ msgstr "PID 路徑不存在"
 msgid "Plain text is empty"
 msgstr "純文字為空"
 
-#: src/views/dashboard/NginxDashBoard.vue:171
+#: src/views/dashboard/NginxDashBoard.vue:176
 msgid ""
 "Please enable the stub_status module to get request statistics, connection "
 "count, etc."
@@ -4578,7 +4578,7 @@ msgstr "共享記憶體區域"
 msgid "Show"
 msgstr "顯示"
 
-#: src/views/other/Login.vue:281
+#: src/views/other/Login.vue:285
 msgid "Sign in with a passkey"
 msgstr "使用通行金鑰登入"
 
@@ -4683,7 +4683,7 @@ msgstr "SSL 金鑰路徑"
 msgid "SSL key path is required when HTTPS is enabled"
 msgstr "啟用 HTTPS 時必須提供 SSL 金鑰路徑"
 
-#: src/views/other/Login.vue:238
+#: src/views/other/Login.vue:242
 msgid "SSO Login"
 msgstr "SSO 登入"
 
@@ -5105,7 +5105,7 @@ msgid ""
 "_./:"
 msgstr "此欄位應僅包含字母、Unicode字符、數字和 -_./:"
 
-#: src/views/dashboard/NginxDashBoard.vue:150
+#: src/views/dashboard/NginxDashBoard.vue:155
 msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
@@ -5402,7 +5402,7 @@ msgstr "使用者未啟用 OTP 作為雙重身份驗證 (2FA)"
 msgid "User Profile"
 msgstr "用戶資料"
 
-#: src/views/other/Login.vue:214 src/views/user/userColumns.tsx:7
+#: src/views/other/Login.vue:218 src/views/user/userColumns.tsx:7
 #: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "使用者名稱"

+ 19 - 5
app/src/lib/websocket/index.ts

@@ -3,16 +3,30 @@ import ReconnectingWebSocket from 'reconnecting-websocket'
 import { urlJoin } from '@/lib/helper'
 import { useSettingsStore, useUserStore } from '@/pinia'
 
+/**
+ * Build WebSocket URL based on environment
+ */
+function buildWebSocketUrl(url: string, token: string, nodeId?: number): string {
+  const node_id = nodeId && nodeId > 0 ? `&x_node_id=${nodeId}` : ''
+
+  // In development mode, connect directly to backend server
+  if (import.meta.env.DEV) {
+    const proxyTarget = import.meta.env.VITE_PROXY_TARGET || 'http://localhost:9000'
+    const wsTarget = proxyTarget.replace(/^https?:/, location.protocol === 'https:' ? 'wss:' : 'ws:')
+    return urlJoin(wsTarget, url, `?token=${btoa(token)}`, node_id)
+  }
+
+  // In production mode, use current host
+  const protocol = location.protocol === 'https:' ? 'wss://' : 'ws://'
+  return urlJoin(protocol + window.location.host, window.location.pathname, url, `?token=${btoa(token)}`, node_id)
+}
+
 function ws(url: string, reconnect: boolean = true): ReconnectingWebSocket | WebSocket {
   const user = useUserStore()
   const settings = useSettingsStore()
   const { token } = storeToRefs(user)
 
-  const protocol = location.protocol === 'https:' ? 'wss://' : 'ws://'
-
-  const node_id = (settings.environment.id > 0) ? (`&x_node_id=${settings.environment.id}`) : ''
-
-  const _url = urlJoin(protocol + window.location.host, window.location.pathname, url, `?token=${btoa(token.value)}`, node_id)
+  const _url = buildWebSocketUrl(url, token.value, settings.environment.id)
 
   if (reconnect)
     return new ReconnectingWebSocket(_url, undefined, { maxRetries: 10 })

+ 1 - 3
app/vite.config.ts

@@ -82,11 +82,9 @@ export default defineConfig(({ mode }) => {
       port: Number.parseInt(env.VITE_PORT) || 3002,
       proxy: {
         '/api': {
-          target: env.VITE_PROXY_TARGET || 'http://localhost:9000',
+          target: env.VITE_PROXY_TARGET || 'http://localhost:9001',
           changeOrigin: true,
           secure: false,
-          ws: true,
-          timeout: 60000,
         },
       },
     },

+ 3 - 2
go.mod

@@ -127,6 +127,7 @@ require (
 	github.com/felixge/httpsnoop v1.0.4 // indirect
 	github.com/fxamacker/cbor/v2 v2.8.0 // indirect
 	github.com/gabriel-vasile/mimetype v1.4.9 // indirect
+	github.com/gin-contrib/cors v1.7.6 // indirect
 	github.com/gin-contrib/sse v1.1.0 // indirect
 	github.com/go-errors/errors v1.5.1 // indirect
 	github.com/go-jose/go-jose/v4 v4.1.0 // indirect
@@ -246,7 +247,7 @@ require (
 	github.com/tklauser/numcpus v0.10.0 // indirect
 	github.com/transip/gotransip/v6 v6.26.0 // indirect
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
-	github.com/ugorji/go/codec v1.2.14 // indirect
+	github.com/ugorji/go/codec v1.3.0 // indirect
 	github.com/ultradns/ultradns-go-sdk v1.8.0-20241010134910-243eeec // indirect
 	github.com/uozi-tech/cosy-driver-mysql v0.2.2 // indirect
 	github.com/uozi-tech/cosy-driver-postgres v0.2.1 // indirect
@@ -265,7 +266,7 @@ require (
 	go.opentelemetry.io/otel/trace v1.36.0 // indirect
 	go.uber.org/multierr v1.11.0 // indirect
 	go.uber.org/zap v1.27.0 // indirect
-	golang.org/x/arch v0.17.0 // indirect
+	golang.org/x/arch v0.18.0 // indirect
 	golang.org/x/mod v0.25.0 // indirect
 	golang.org/x/oauth2 v0.30.0 // indirect
 	golang.org/x/sync v0.15.0 // indirect

+ 6 - 0
go.sum

@@ -1024,6 +1024,8 @@ github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj2
 github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
 github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/gin-contrib/cors v1.7.6 h1:3gQ8GMzs1Ylpf70y8bMw4fVpycXIeX1ZemuSQIsnQQY=
+github.com/gin-contrib/cors v1.7.6/go.mod h1:Ulcl+xN4jel9t1Ry8vqph23a60FwH9xVLd+3ykmTjOk=
 github.com/gin-contrib/pprof v1.5.3 h1:Bj5SxJ3kQDVez/s/+f9+meedJIqLS+xlkIVDe/lcvgM=
 github.com/gin-contrib/pprof v1.5.3/go.mod h1:0+LQSZ4SLO0B6+2n6JBzaEygpTBxe/nI+YEYpfQQ6xY=
 github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
@@ -1940,6 +1942,8 @@ github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65E
 github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
 github.com/ugorji/go/codec v1.2.14 h1:yOQvXCBc3Ij46LRkRoh4Yd5qK6LVOgi0bYOXfb7ifjw=
 github.com/ugorji/go/codec v1.2.14/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
+github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
 github.com/ultradns/ultradns-go-sdk v1.8.0-20241010134910-243eeec h1:2s/ghQ8wKE+UzD/hf3P4Gd1j0JI9ncbxv+nsypPoUYI=
 github.com/ultradns/ultradns-go-sdk v1.8.0-20241010134910-243eeec/go.mod h1:BZr7Qs3ku1ckpqed8tCRSqTlp8NAeZfAVpfx4OzXMss=
 github.com/uozi-tech/cosy v1.21.1 h1:S2jK0EwwbMkPD2VGiMfNzDAmh8NSvT7c+rn45wUJoTI=
@@ -2079,6 +2083,8 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
 go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
 golang.org/x/arch v0.17.0 h1:4O3dfLzd+lQewptAHqjewQZQDyEdejz3VwgeYwkZneU=
 golang.org/x/arch v0.17.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
+golang.org/x/arch v0.18.0 h1:WN9poc33zL4AzGxqf8VtpKUnGvMi8O9lhNyBMF/85qc=
+golang.org/x/arch v0.18.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=

+ 21 - 0
internal/middleware/cors.go

@@ -0,0 +1,21 @@
+package middleware
+
+import (
+	"time"
+
+	"github.com/gin-contrib/cors"
+	"github.com/gin-gonic/gin"
+)
+
+func CORS() gin.HandlerFunc {
+	config := cors.Config{
+		AllowAllOrigins:  true,
+		AllowMethods:     []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"},
+		AllowHeaders:     []string{"*"},
+		ExposeHeaders:    []string{"*"},
+		AllowCredentials: false,
+		MaxAge:           12 * time.Hour,
+	}
+
+	return cors.New(config)
+}

+ 3 - 0
router/routers.go

@@ -36,6 +36,9 @@ import (
 func InitRouter() {
 	r := cosy.GetEngine()
 
+	// Add CORS middleware to allow all origins
+	r.Use(middleware.CORS())
+
 	initEmbedRoute(r)
 
 	pages.InitRouter(r)