diff --git a/.devcontainer/start.sh b/.devcontainer/start.sh index 184b6a1e..6ca743f6 100755 --- a/.devcontainer/start.sh +++ b/.devcontainer/start.sh @@ -1,5 +1,8 @@ #!/bin/bash +# install air +go install github.com/air-verse/air@latest + # install zsh-autosuggestions git clone https://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions diff --git a/.github/workflows/weblate-pull.yml b/.github/workflows/weblate-pull.yml index 3d3d66fb..8a7b0f5a 100644 --- a/.github/workflows/weblate-pull.yml +++ b/.github/workflows/weblate-pull.yml @@ -21,7 +21,7 @@ jobs: - name: Setup Python uses: actions/setup-python@v5 with: - python-version: '3.13.2' + python-version: '3.13.3' - name: Install wlc run: pip install wlc diff --git a/.github/workflows/weblate-sync.yml b/.github/workflows/weblate-sync.yml index 0cd094aa..25d7d8e7 100644 --- a/.github/workflows/weblate-sync.yml +++ b/.github/workflows/weblate-sync.yml @@ -51,7 +51,7 @@ jobs: - name: Setup python uses: actions/setup-python@v5 with: - python-version: '3.13.2' + python-version: '3.13.3' - name: Install wlc run: pip install wlc diff --git a/api/external_notify/external_notify.go b/api/external_notify/external_notify.go new file mode 100644 index 00000000..b5d97bbb --- /dev/null +++ b/api/external_notify/external_notify.go @@ -0,0 +1,13 @@ +package external_notify + +import ( + "github.com/0xJacky/Nginx-UI/model" + "github.com/gin-gonic/gin" + "github.com/uozi-tech/cosy" +) + +func InitRouter(r *gin.RouterGroup) { + c := cosy.Api[model.ExternalNotify]("/external_notifies") + + c.InitRouter(r) +} diff --git a/app/package.json b/app/package.json index 42086905..b80b4a92 100644 --- a/app/package.json +++ b/app/package.json @@ -2,7 +2,7 @@ "name": "nginx-ui-app-next", "type": "module", "version": "2.0.0-rc.5", - "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808", + "packageManager": "pnpm@10.8.0+sha512.0e82714d1b5b43c74610193cb20734897c1d00de89d0e18420aebc5977fa13d780a9cb05734624e81ebd81cc876cd464794850641c48b9544326b5622ca29971", "scripts": { "dev": "vite --host", "typecheck": "vue-tsc --noEmit", @@ -19,9 +19,9 @@ "@simplewebauthn/browser": "^13.1.0", "@vue/reactivity": "^3.5.13", "@vue/shared": "^3.5.13", - "@vueuse/components": "^13.0.0", - "@vueuse/core": "^13.0.0", - "@vueuse/integrations": "^13.0.0", + "@vueuse/components": "^13.1.0", + "@vueuse/core": "^13.1.0", + "@vueuse/integrations": "^13.1.0", "@xterm/addon-attach": "^0.11.0", "@xterm/addon-fit": "^0.10.0", "@xterm/xterm": "^5.5.0", @@ -32,10 +32,10 @@ "highlight.js": "^11.11.1", "jsencrypt": "^3.3.2", "lodash": "^4.17.21", - "marked": "^15.0.7", + "marked": "^15.0.8", "marked-highlight": "^2.2.1", "nprogress": "^0.2.0", - "pinia": "^3.0.1", + "pinia": "^3.0.2", "pinia-plugin-persistedstate": "^4.2.0", "reconnecting-websocket": "^4.4.0", "sortablejs": "^1.15.6", @@ -53,7 +53,7 @@ "vuedraggable": "^4.1.0" }, "devDependencies": { - "@antfu/eslint-config": "^4.11.0", + "@antfu/eslint-config": "^4.12.0", "@iconify-json/fa": "1.2.1", "@iconify-json/tabler": "^1.2.17", "@iconify/tools": "^4.1.2", @@ -71,7 +71,7 @@ "autoprefixer": "^10.4.21", "eslint": "9.24.0", "eslint-plugin-sonarjs": "^3.0.2", - "less": "^4.2.2", + "less": "^4.3.0", "postcss": "^8.5.3", "typescript": "5.8.3", "unplugin-auto-import": "^19.1.2", diff --git a/app/pnpm-lock.yaml b/app/pnpm-lock.yaml index 277c5e65..49424e3f 100644 --- a/app/pnpm-lock.yaml +++ b/app/pnpm-lock.yaml @@ -27,14 +27,14 @@ importers: specifier: ^3.5.13 version: 3.5.13 '@vueuse/components': - specifier: ^13.0.0 - version: 13.0.0(vue@3.5.13(typescript@5.8.3)) + specifier: ^13.1.0 + version: 13.1.0(vue@3.5.13(typescript@5.8.3)) '@vueuse/core': - specifier: ^13.0.0 - version: 13.0.0(vue@3.5.13(typescript@5.8.3)) + specifier: ^13.1.0 + version: 13.1.0(vue@3.5.13(typescript@5.8.3)) '@vueuse/integrations': - specifier: ^13.0.0 - version: 13.0.0(async-validator@4.2.5)(axios@1.8.4)(nprogress@0.2.0)(sortablejs@1.15.6)(universal-cookie@8.0.1)(vue@3.5.13(typescript@5.8.3)) + specifier: ^13.1.0 + version: 13.1.0(async-validator@4.2.5)(axios@1.8.4)(nprogress@0.2.0)(sortablejs@1.15.6)(universal-cookie@8.0.1)(vue@3.5.13(typescript@5.8.3)) '@xterm/addon-attach': specifier: ^0.11.0 version: 0.11.0(@xterm/xterm@5.5.0) @@ -66,20 +66,20 @@ importers: specifier: ^4.17.21 version: 4.17.21 marked: - specifier: ^15.0.7 - version: 15.0.7 + specifier: ^15.0.8 + version: 15.0.8 marked-highlight: specifier: ^2.2.1 - version: 2.2.1(marked@15.0.7) + version: 2.2.1(marked@15.0.8) nprogress: specifier: ^0.2.0 version: 0.2.0 pinia: - specifier: ^3.0.1 - version: 3.0.1(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)) + specifier: ^3.0.2 + version: 3.0.2(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)) pinia-plugin-persistedstate: specifier: ^4.2.0 - version: 4.2.0(pinia@3.0.1(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3))) + version: 4.2.0(pinia@3.0.2(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3))) reconnecting-websocket: specifier: ^4.4.0 version: 4.4.0 @@ -94,7 +94,7 @@ importers: version: 8.0.1 unocss: specifier: ^66.0.0 - version: 66.0.0(postcss@8.5.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3)) + version: 66.0.0(postcss@8.5.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3)) vite-plugin-build-id: specifier: 0.5.0 version: 0.5.0 @@ -124,8 +124,8 @@ importers: version: 4.1.0(vue@3.5.13(typescript@5.8.3)) devDependencies: '@antfu/eslint-config': - specifier: ^4.11.0 - version: 4.11.0(@typescript-eslint/utils@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(@vue/compiler-sfc@3.5.13)(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + specifier: ^4.12.0 + version: 4.12.0(@vue/compiler-sfc@3.5.13)(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) '@iconify-json/fa': specifier: 1.2.1 version: 1.2.1 @@ -155,10 +155,10 @@ importers: version: 1.15.8 '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.3(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3)) + version: 5.2.3(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.1.2(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3)) + version: 4.1.2(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3)) '@vue/compiler-sfc': specifier: ^3.5.13 version: 3.5.13 @@ -178,8 +178,8 @@ importers: specifier: ^3.0.2 version: 3.0.2(eslint@9.24.0(jiti@2.4.2)) less: - specifier: ^4.2.2 - version: 4.2.2 + specifier: ^4.3.0 + version: 4.3.0 postcss: specifier: ^8.5.3 version: 8.5.3 @@ -188,7 +188,7 @@ importers: version: 5.8.3 unplugin-auto-import: specifier: ^19.1.2 - version: 19.1.2(@nuxt/kit@3.16.2)(@vueuse/core@13.0.0(vue@3.5.13(typescript@5.8.3))) + version: 19.1.2(@nuxt/kit@3.16.2)(@vueuse/core@13.1.0(vue@3.5.13(typescript@5.8.3))) unplugin-vue-components: specifier: ^28.4.1 version: 28.4.1(@babel/parser@7.27.0)(@nuxt/kit@3.16.2)(vue@3.5.13(typescript@5.8.3)) @@ -197,7 +197,7 @@ importers: version: 1.5.5(vue@3.5.13(typescript@5.8.3)) vite: specifier: ^6.2.5 - version: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1) + version: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1) vite-svg-loader: specifier: ^5.1.0 version: 5.1.0(vue@3.5.13(typescript@5.8.3)) @@ -225,11 +225,11 @@ packages: peerDependencies: vue: '>=3.0.3' - '@antfu/eslint-config@4.11.0': - resolution: {integrity: sha512-KMLIrZflEFsOEF/N0Xl8iVaheLTdgT3gAwXVzdG5Ng8ieNhBsRsaThnqI7of10kh6psSBLJ6SkNK+ZF98fQIXQ==} + '@antfu/eslint-config@4.12.0': + resolution: {integrity: sha512-8NszLFXu9/cwOP/qliYS3heD+9ZCouGgOWQmsXgDHLNkjC9IjI1yXBOp6Xs4EvwTKsSAZp3SVw382M8naqMQUg==} hasBin: true peerDependencies: - '@eslint-react/eslint-plugin': ^1.19.0 + '@eslint-react/eslint-plugin': ^1.38.4 '@prettier/plugin-xml': ^3.4.1 '@unocss/eslint-plugin': '>=0.50.0' astro-eslint-parser: ^1.0.2 @@ -397,11 +397,11 @@ packages: resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} engines: {node: '>=6.9.0'} - '@clack/core@0.4.1': - resolution: {integrity: sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==} + '@clack/core@0.4.2': + resolution: {integrity: sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg==} - '@clack/prompts@0.10.0': - resolution: {integrity: sha512-H3rCl6CwW1NdQt9rE3n373t7o5cthPv7yUoxF2ytZvyvlJv89C5RYMJu83Hed8ODgys5vpBU0GKxIRG83jd8NQ==} + '@clack/prompts@0.10.1': + resolution: {integrity: sha512-Q0T02vx8ZM9XSv9/Yde0jTmmBQufZhPJfYAg2XrrrxWWaZgq1rr8nU8Hv710BQ1dhoP8rtY7YUdpGej2Qza/cw==} '@ctrl/tinycolor@3.6.1': resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} @@ -885,6 +885,10 @@ packages: resolution: {integrity: sha512-vsJDAkYR6qCPu+ioGScGiMYR7LvZYIXh/dlQeviqoTWNCVfKTLYD/LkNWH4Mxsv2a5vpIRc77FN5DnmK1eBggQ==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@pkgr/core@0.2.2': + resolution: {integrity: sha512-25L86MyPvnlQoX2MTIV2OiUcb6vJ6aRbFa9pbwByn95INKD5mFH2smgjDhq+fwJoqAgvgbdJLj6Tz7V9X5CFAQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@polka/url@1.0.0-next.28': resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} @@ -1096,16 +1100,16 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.29.0': - resolution: {integrity: sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==} + '@typescript-eslint/eslint-plugin@8.29.1': + resolution: {integrity: sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.29.0': - resolution: {integrity: sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==} + '@typescript-eslint/parser@8.29.1': + resolution: {integrity: sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1115,8 +1119,12 @@ packages: resolution: {integrity: sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.29.0': - resolution: {integrity: sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==} + '@typescript-eslint/scope-manager@8.29.1': + resolution: {integrity: sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.29.1': + resolution: {integrity: sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1126,12 +1134,22 @@ packages: resolution: {integrity: sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.29.1': + resolution: {integrity: sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.29.0': resolution: {integrity: sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/typescript-estree@8.29.1': + resolution: {integrity: sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/utils@8.29.0': resolution: {integrity: sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1139,10 +1157,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/utils@8.29.1': + resolution: {integrity: sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==} + 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.29.0': resolution: {integrity: sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.29.1': + resolution: {integrity: sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@unocss/astro@66.0.0': resolution: {integrity: sha512-GBhXT6JPqXjDXoJZTXhySk83NgOt0UigChqrUUdG4x7Z+DVYkDBION8vZUJjw0OdIaxNQ4euGWu4GDsMF6gQQg==} peerDependencies: @@ -1226,78 +1255,78 @@ packages: peerDependencies: vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 - '@unrs/resolver-binding-darwin-arm64@1.3.3': - resolution: {integrity: sha512-EpRILdWr3/xDa/7MoyfO7JuBIJqpBMphtu4+80BK1bRfFcniVT74h3Z7q1+WOc92FuIAYatB1vn9TJR67sORGw==} + '@unrs/resolver-binding-darwin-arm64@1.4.1': + resolution: {integrity: sha512-8Tv+Bsd0BjGwfEedIyor4inw8atppRxM5BdUnIt+3mAm/QXUm7Dw74CHnXpfZKXkp07EXJGiA8hStqCINAWhdw==} cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.3.3': - resolution: {integrity: sha512-ntj/g7lPyqwinMJWZ+DKHBse8HhVxswGTmNgFKJtdgGub3M3zp5BSZ3bvMP+kBT6dnYJLSVlDqdwOq1P8i0+/g==} + '@unrs/resolver-binding-darwin-x64@1.4.1': + resolution: {integrity: sha512-X8c3PhWziEMKAzZz+YAYWfwawi5AEgzy/hmfizAB4C70gMHLKmInJcp1270yYAOs7z07YVFI220pp50z24Jk3A==} cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.3.3': - resolution: {integrity: sha512-l6BT8f2CU821EW7U8hSUK8XPq4bmyTlt9Mn4ERrfjJNoCw0/JoHAh9amZZtV3cwC3bwwIat+GUnrcHTG9+qixw==} + '@unrs/resolver-binding-freebsd-x64@1.4.1': + resolution: {integrity: sha512-UUr/nREy1UdtxXQnmLaaTXFGOcGxPwNIzeJdb3KXai3TKtC1UgNOB9s8KOA4TaxOUBR/qVgL5BvBwmUjD5yuVA==} cpu: [x64] os: [freebsd] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.3.3': - resolution: {integrity: sha512-8ScEc5a4y7oE2BonRvzJ+2GSkBaYWyh0/Ko4Q25e/ix6ANpJNhwEPZvCR6GVRmsQAYMIfQvYLdM6YEN+qRjnAQ==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.4.1': + resolution: {integrity: sha512-e3pII53dEeS8inkX6A1ad2UXE0nuoWCqik4kOxaDnls0uJUq0ntdj5d9IYd+bv5TDwf9DSge/xPOvCmRYH+Tsw==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.3.3': - resolution: {integrity: sha512-8qQ6l1VTzLNd3xb2IEXISOKwMGXDCzY/UNy/7SovFW2Sp0K3YbL7Ao7R18v6SQkLqQlhhqSBIFRk+u6+qu5R5A==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.4.1': + resolution: {integrity: sha512-e/AKKd9gR+HNmVyDEPI/PIz2t0DrA3cyonHNhHVjrkxe8pMCiYiqhtn1+h+yIpHUtUlM6Y1FNIdivFa+r7wrEQ==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.3.3': - resolution: {integrity: sha512-v81R2wjqcWXJlQY23byqYHt9221h4anQ6wwN64oMD/WAE+FmxPHFZee5bhRkNVtzqO/q7wki33VFWlhiADwUeQ==} + '@unrs/resolver-binding-linux-arm64-gnu@1.4.1': + resolution: {integrity: sha512-vtIu34luF1jRktlHtiwm2mjuE8oJCsFiFr8hT5+tFQdqFKjPhbJXn83LswKsOhy0GxAEevpXDI4xxEwkjuXIPA==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-arm64-musl@1.3.3': - resolution: {integrity: sha512-cAOx/j0u5coMg4oct/BwMzvWJdVciVauUvsd+GQB/1FZYKQZmqPy0EjJzJGbVzFc6gbnfEcSqvQE6gvbGf2N8Q==} + '@unrs/resolver-binding-linux-arm64-musl@1.4.1': + resolution: {integrity: sha512-H3PaOuGyhFXiyJd+09uPhGl4gocmhyi1BRzvsP8Lv5AQO3p3/ZY7WjV4t2NkBksm9tMjf3YbOVHyPWi2eWsNYw==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-ppc64-gnu@1.3.3': - resolution: {integrity: sha512-mq2blqwErgDJD4gtFDlTX/HZ7lNP8YCHYFij2gkXPtMzrXxPW1hOtxL6xg4NWxvnj4bppppb0W3s/buvM55yfg==} + '@unrs/resolver-binding-linux-ppc64-gnu@1.4.1': + resolution: {integrity: sha512-4+GmJcaaFntCi1S01YByqp8wLMjV/FyQyHVGm0vedIhL1Vfx7uHkz/sZmKsidRwokBGuxi92GFmSzqT2O8KcNA==} cpu: [ppc64] os: [linux] - '@unrs/resolver-binding-linux-s390x-gnu@1.3.3': - resolution: {integrity: sha512-u0VRzfFYysarYHnztj2k2xr+eu9rmgoTUUgCCIT37Nr+j0A05Xk2c3RY8Mh5+DhCl2aYibihnaAEJHeR0UOFIQ==} + '@unrs/resolver-binding-linux-s390x-gnu@1.4.1': + resolution: {integrity: sha512-6RDQVCmtFYTlhy89D5ixTqo9bTQqFhvNN0Ey1wJs5r+01Dq15gPHRXv2jF2bQATtMrOfYwv+R2ZR9ew1N1N3YQ==} cpu: [s390x] os: [linux] - '@unrs/resolver-binding-linux-x64-gnu@1.3.3': - resolution: {integrity: sha512-OrVo5ZsG29kBF0Ug95a2KidS16PqAMmQNozM6InbquOfW/udouk063e25JVLqIBhHLB2WyBnixOQ19tmeC/hIg==} + '@unrs/resolver-binding-linux-x64-gnu@1.4.1': + resolution: {integrity: sha512-XpU9uzIkD86+19NjCXxlVPISMUrVXsXo5htxtuG+uJ59p5JauSRZsIxQxzzfKzkxEjdvANPM/lS1HFoX6A6QeA==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-linux-x64-musl@1.3.3': - resolution: {integrity: sha512-PYnmrwZ4HMp9SkrOhqPghY/aoL+Rtd4CQbr93GlrRTjK6kDzfMfgz3UH3jt6elrQAfupa1qyr1uXzeVmoEAxUA==} + '@unrs/resolver-binding-linux-x64-musl@1.4.1': + resolution: {integrity: sha512-3CDjG/spbTKCSHl66QP2ekHSD+H34i7utuDIM5gzoNBcZ1gTO0Op09Wx5cikXnhORRf9+HyDWzm37vU1PLSM1A==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-wasm32-wasi@1.3.3': - resolution: {integrity: sha512-81AnQY6fShmktQw4hWDUIilsKSdvr/acdJ5azAreu2IWNlaJOKphJSsUVWE+yCk6kBMoQyG9ZHCb/krb5K0PEA==} + '@unrs/resolver-binding-wasm32-wasi@1.4.1': + resolution: {integrity: sha512-50tYhvbCTnuzMn7vmP8IV2UKF7ITo1oihygEYq9wW2DUb/Y+QMqBHJUSCABRngATjZ4shOK6f2+s0gQX6ElENQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/resolver-binding-win32-arm64-msvc@1.3.3': - resolution: {integrity: sha512-X/42BMNw7cW6xrB9syuP5RusRnWGoq+IqvJO8IDpp/BZg64J1uuIW6qA/1Cl13Y4LyLXbJVYbYNSKwR/FiHEng==} + '@unrs/resolver-binding-win32-arm64-msvc@1.4.1': + resolution: {integrity: sha512-KyJiIne/AqV4IW0wyQO34wSMuJwy3VxVQOfIXIPyQ/Up6y/zi2P/WwXb78gHsLiGRUqCA9LOoCX+6dQZde0g1g==} cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.3.3': - resolution: {integrity: sha512-EGNnNGQxMU5aTN7js3ETYvuw882zcO+dsVjs+DwO2j/fRVKth87C8e2GzxW1L3+iWAXMyJhvFBKRavk9Og1Z6A==} + '@unrs/resolver-binding-win32-ia32-msvc@1.4.1': + resolution: {integrity: sha512-y2NUD7pygrBolN2NoXUrwVqBpKPhF8DiSNE5oB5/iFO49r2DpoYqdj5HPb3F42fPBH5qNqj6Zg63+xCEzAD2hw==} cpu: [ia32] os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.3.3': - resolution: {integrity: sha512-GraLbYqOJcmW1qY3osB+2YIiD62nVf2/bVLHZmrb4t/YSUwE03l7TwcDJl08T/Tm3SVhepX8RQkpzWbag/Sb4w==} + '@unrs/resolver-binding-win32-x64-msvc@1.4.1': + resolution: {integrity: sha512-hVXaObGI2lGFmrtT77KSbPQ3I+zk9IU500wobjk0+oX59vg/0VqAzABNtt3YSQYgXTC2a/LYxekLfND/wlt0yQ==} cpu: [x64] os: [win32] @@ -1315,10 +1344,9 @@ packages: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - '@vitest/eslint-plugin@1.1.39': - resolution: {integrity: sha512-l5/MUFCYI8nxwr62JHlWwXfeQNS8E7xy71lSLGQ3CrjGjBdWLs1Rtee+BvYwy2m4YVPwYqUwdcAIOaZOwPUpfg==} + '@vitest/eslint-plugin@1.1.40': + resolution: {integrity: sha512-M7RpSSVa98U0gtDcLfoZqLuv4Wk/G7o6TqTULwVbPO/TU7qaw41XNP0t68+JVgtgy/WkVGbxVQMBdj3XsywKcQ==} peerDependencies: - '@typescript-eslint/utils': ^8.24.0 eslint: '>= 8.57.0' typescript: '>= 5.0.0' vitest: '*' @@ -1425,18 +1453,18 @@ packages: vue: optional: true - '@vueuse/components@13.0.0': - resolution: {integrity: sha512-rcGp3c5Yu4SVLGUhBXT0q227nduFx1HTKzJBQkPLpIhwG1SB8RZ5bbri9sbusGaFZB5CYc6jza5+gfSJ7YidIg==} + '@vueuse/components@13.1.0': + resolution: {integrity: sha512-2cqRdRJ1CP/a9WpDAlIZneaivUuwze2e8W0CjKHbWqJ9p7nldccwMyEqKC7N6naYvipG469IGfYk6rnT/hoKfA==} peerDependencies: vue: ^3.5.0 - '@vueuse/core@13.0.0': - resolution: {integrity: sha512-rkgb4a8/0b234lMGCT29WkCjPfsX0oxrIRR7FDndRoW3FsaC9NBzefXg/9TLhAgwM11f49XnutshM4LzJBrQ5g==} + '@vueuse/core@13.1.0': + resolution: {integrity: sha512-PAauvdRXZvTWXtGLg8cPUFjiZEddTqmogdwYpnn60t08AA5a8Q4hZokBnpTOnVNqySlFlTcRYIC8OqreV4hv3Q==} peerDependencies: vue: ^3.5.0 - '@vueuse/integrations@13.0.0': - resolution: {integrity: sha512-PXARslYRWf4u0xjdW6N5eC5kVQj2z/dxfZ7ildI1okLm2AwmhL+wiWzaNMSJMxTKX4ew7kNe70yJg1QjnWmE5w==} + '@vueuse/integrations@13.1.0': + resolution: {integrity: sha512-wJ6aANdUs4SOpVabChQK+uLIwxRTUAEmn1DJnflGG7Wq6yaipiRmp6as/Md201FjJnquQt8MecIPbFv8HSBeDA==} peerDependencies: async-validator: ^4 axios: ^1 @@ -1477,11 +1505,11 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@13.0.0': - resolution: {integrity: sha512-TRNksqmvtvqsuHf7bbgH9OSXEV2b6+M3BSN4LR5oxWKykOFT9gV78+C2/0++Pq9KCp9KQ1OQDPvGlWNQpOb2Mw==} + '@vueuse/metadata@13.1.0': + resolution: {integrity: sha512-+TDd7/a78jale5YbHX9KHW3cEDav1lz1JptwDvep2zSG8XjCsVE+9mHIzjTOaPbHUAk5XiE4jXLz51/tS+aKQw==} - '@vueuse/shared@13.0.0': - resolution: {integrity: sha512-9MiHhAPw+sqCF/RLo8V6HsjRqEdNEWVpDLm2WBRW2G/kSQjb8X901sozXpSCaeLG0f7TEfMrT4XNaA5m1ez7Dg==} + '@vueuse/shared@13.1.0': + resolution: {integrity: sha512-IVS/qRRjhPTZ6C2/AM3jieqXACGwFZwWTdw5sNTSKk2m/ZpkuuN+ri+WCVUP8TqaKwJYt/KuMwmXspMAw8E6ew==} peerDependencies: vue: ^3.5.0 @@ -1653,8 +1681,8 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - builtin-modules@4.0.0: - resolution: {integrity: sha512-p1n8zyCkt1BVrKNFymOHjcDSAl7oq/gUvfgULv2EblgpPVQlQr9yHnWjg9IJ2MhfwPqiYqMMrr01OY7yQoK2yA==} + builtin-modules@5.0.0: + resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} engines: {node: '>=18.20'} bytes@3.1.2: @@ -2114,8 +2142,8 @@ packages: peerDependencies: eslint: '>=8' - eslint-plugin-import-x@4.10.0: - resolution: {integrity: sha512-5ej+0WILhX3D6wkcdsyYmPp10SUIK6fmuZ6KS8nf9MD8CJ6/S/3Dl7m21g+MLeaTMsvcEXo3JunNAbgHwXxs/g==} + eslint-plugin-import-x@4.10.2: + resolution: {integrity: sha512-jO3Y6+zBUyTX5MVbbLSzoz6fe65t+WEBaXStRLM4EBhZWbuSwAH3cLwARtM0Yp4zRtZGp9sL2zzK7G9JkHR8LA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2170,11 +2198,11 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-plugin-unicorn@57.0.0: - resolution: {integrity: sha512-zUYYa6zfNdTeG9BISWDlcLmz16c+2Ck2o5ZDHh0UzXJz3DEP7xjmlVDTzbyV0W+XksgZ0q37WEWzN2D2Ze+g9Q==} - engines: {node: '>=18.18'} + eslint-plugin-unicorn@58.0.0: + resolution: {integrity: sha512-fc3iaxCm9chBWOHPVjn+Czb/wHS0D2Mko7wkOdobqo9R2bbFObc4LyZaLTNy0mhZOP84nKkLhTUQxlLOZ7EjKw==} + engines: {node: ^18.20.0 || ^20.10.0 || >=21.0.0} peerDependencies: - eslint: '>=9.20.0' + eslint: '>=9.22.0' eslint-plugin-unused-imports@4.1.4: resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} @@ -2567,8 +2595,8 @@ packages: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} - is-builtin-module@4.0.0: - resolution: {integrity: sha512-rWP3AMAalQSesXO8gleROyL2iKU73SX5Er66losQn9rWOWL4Gef0a/xOEOVqjWGMuR2vHG3FJ8UUmT700O8oFg==} + is-builtin-module@5.0.0: + resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} engines: {node: '>=18.20'} is-callable@1.2.7: @@ -2749,9 +2777,9 @@ packages: kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - less@4.2.2: - resolution: {integrity: sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==} - engines: {node: '>=6'} + less@4.3.0: + resolution: {integrity: sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==} + engines: {node: '>=14'} hasBin: true levn@0.4.1: @@ -2817,8 +2845,8 @@ packages: peerDependencies: marked: '>=4 <16' - marked@15.0.7: - resolution: {integrity: sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg==} + marked@15.0.8: + resolution: {integrity: sha512-rli4l2LyZqpQuRve5C0rkn6pj3hT8EWPC+zkAxFTAJLxRbENfTAhEQq9itrmf1Y81QtAX5D/MYlGlIomNgj9lA==} engines: {node: '>= 18'} hasBin: true @@ -3245,8 +3273,8 @@ packages: pinia: optional: true - pinia@3.0.1: - resolution: {integrity: sha512-WXglsDzztOTH6IfcJ99ltYZin2mY8XZCXujkYWVIJlBjqsP6ST7zw+Aarh63E1cDVYeyUcPCxPHzJpEOmzB6Wg==} + pinia@3.0.2: + resolution: {integrity: sha512-sH2JK3wNY809JOeiiURUR0wehJ9/gd9qFN2Y828jCbxEzKEmEt0pzCXwqiSTfuRsK9vQsOflSdnbdBOGrhtn+g==} peerDependencies: typescript: '>=4.4.4' vue: ^2.7.0 || ^3.5.11 @@ -3795,8 +3823,8 @@ packages: resolution: {integrity: sha512-Qp+iiD+qCRnUek+nDoYvtWX7tfnYyXsrOnJ452FRTgOyKmTM7TUJ3l+PLPJOOWPTUyKISKp4isC5JJPSXUjGgw==} engines: {node: '>=18.12.0'} - unrs-resolver@1.3.3: - resolution: {integrity: sha512-PFLAGQzYlyjniXdbmQ3dnGMZJXX5yrl2YS4DLRfR3BhgUsE1zpRIrccp9XMOGRfIHpdFvCn/nr5N1KMVda4x3A==} + unrs-resolver@1.4.1: + resolution: {integrity: sha512-MhPB3wBI5BR8TGieTb08XuYlE8oFVEXdSAgat3psdlRyejl8ojQ8iqPcjh094qCZ1r+TnkxzP6BeCd/umfHckQ==} untyped@2.0.0: resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==} @@ -3873,8 +3901,8 @@ packages: peerDependencies: vue: ^3.0.0 - vue-eslint-parser@10.1.2: - resolution: {integrity: sha512-1guOfYgNlD7JH2popr/bt5vc7Mzt6quRCnEbqLgpMHvoHEGV1oImzdqrLd+oMD76cHt8ilBP4cda9WA72TLFDQ==} + vue-eslint-parser@10.1.3: + resolution: {integrity: sha512-dbCBnd2e02dYWsXoqX5yKUZlOt+ExIpq7hmHKPb5ZqKcjf++Eo0hMseFTZMLKThrUk61m+Uv6A2YSBve6ZvuDQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -4041,16 +4069,16 @@ snapshots: '@ant-design/icons-svg': 4.4.2 vue: 3.5.13(typescript@5.8.3) - '@antfu/eslint-config@4.11.0(@typescript-eslint/utils@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(@vue/compiler-sfc@3.5.13)(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@antfu/eslint-config@4.12.0(@vue/compiler-sfc@3.5.13)(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@antfu/install-pkg': 1.0.0 - '@clack/prompts': 0.10.0 + '@clack/prompts': 0.10.1 '@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.24.0(jiti@2.4.2)) '@eslint/markdown': 6.3.0 '@stylistic/eslint-plugin': 4.2.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/eslint-plugin': 8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@vitest/eslint-plugin': 1.1.39(@typescript-eslint/utils@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@vitest/eslint-plugin': 1.1.40(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) ansis: 3.17.0 cac: 6.7.14 eslint: 9.24.0(jiti@2.4.2) @@ -4059,7 +4087,7 @@ snapshots: eslint-merge-processors: 2.0.0(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-antfu: 3.1.1(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-command: 3.2.0(eslint@9.24.0(jiti@2.4.2)) - eslint-plugin-import-x: 4.10.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + eslint-plugin-import-x: 4.10.2(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) eslint-plugin-jsdoc: 50.6.9(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-jsonc: 2.20.0(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-n: 17.17.0(eslint@9.24.0(jiti@2.4.2)) @@ -4068,9 +4096,9 @@ snapshots: eslint-plugin-pnpm: 0.3.1(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-regexp: 2.7.0(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-toml: 0.12.0(eslint@9.24.0(jiti@2.4.2)) - eslint-plugin-unicorn: 57.0.0(eslint@9.24.0(jiti@2.4.2)) - eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)) - eslint-plugin-vue: 10.0.0(eslint@9.24.0(jiti@2.4.2))(vue-eslint-parser@10.1.2(eslint@9.24.0(jiti@2.4.2))) + eslint-plugin-unicorn: 58.0.0(eslint@9.24.0(jiti@2.4.2)) + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)) + eslint-plugin-vue: 10.0.0(eslint@9.24.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.24.0(jiti@2.4.2))) eslint-plugin-yml: 1.17.0(eslint@9.24.0(jiti@2.4.2)) eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.13)(eslint@9.24.0(jiti@2.4.2)) globals: 16.0.0 @@ -4078,11 +4106,10 @@ snapshots: local-pkg: 1.1.1 parse-gitignore: 2.0.0 toml-eslint-parser: 0.10.0 - vue-eslint-parser: 10.1.2(eslint@9.24.0(jiti@2.4.2)) + vue-eslint-parser: 10.1.3(eslint@9.24.0(jiti@2.4.2)) yaml-eslint-parser: 1.3.0 transitivePeerDependencies: - '@eslint/json' - - '@typescript-eslint/utils' - '@vue/compiler-sfc' - supports-color - typescript @@ -4264,14 +4291,14 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@clack/core@0.4.1': + '@clack/core@0.4.2': dependencies: picocolors: 1.1.1 sisteransi: 1.0.5 - '@clack/prompts@0.10.0': + '@clack/prompts@0.10.1': dependencies: - '@clack/core': 0.4.1 + '@clack/core': 0.4.2 picocolors: 1.1.1 sisteransi: 1.0.5 @@ -4670,6 +4697,8 @@ snapshots: '@pkgr/core@0.2.0': {} + '@pkgr/core@0.2.2': {} + '@polka/url@1.0.0-next.28': {} '@rollup/rollup-android-arm-eabi@4.39.0': @@ -4838,14 +4867,14 @@ snapshots: '@types/node': 22.14.0 optional: true - '@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.29.0 - '@typescript-eslint/type-utils': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.29.0 + '@typescript-eslint/parser': 8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.29.1 + '@typescript-eslint/type-utils': 8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.29.1 eslint: 9.24.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 @@ -4855,12 +4884,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.29.0 - '@typescript-eslint/types': 8.29.0 - '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.29.0 + '@typescript-eslint/scope-manager': 8.29.1 + '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.29.1 debug: 4.4.0 eslint: 9.24.0(jiti@2.4.2) typescript: 5.8.3 @@ -4872,10 +4901,15 @@ snapshots: '@typescript-eslint/types': 8.29.0 '@typescript-eslint/visitor-keys': 8.29.0 - '@typescript-eslint/type-utils@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/scope-manager@8.29.1': dependencies: - '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/visitor-keys': 8.29.1 + + '@typescript-eslint/type-utils@8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) debug: 4.4.0 eslint: 9.24.0(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) @@ -4885,6 +4919,8 @@ snapshots: '@typescript-eslint/types@8.29.0': {} + '@typescript-eslint/types@8.29.1': {} + '@typescript-eslint/typescript-estree@8.29.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 8.29.0 @@ -4899,6 +4935,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.29.1(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/visitor-keys': 8.29.1 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@2.4.2)) @@ -4910,18 +4960,34 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.29.1 + '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) + eslint: 9.24.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.29.0': dependencies: '@typescript-eslint/types': 8.29.0 eslint-visitor-keys: 4.2.0 - '@unocss/astro@66.0.0(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3))': + '@typescript-eslint/visitor-keys@8.29.1': + dependencies: + '@typescript-eslint/types': 8.29.1 + eslint-visitor-keys: 4.2.0 + + '@unocss/astro@66.0.0(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3))': dependencies: '@unocss/core': 66.0.0 '@unocss/reset': 66.0.0 - '@unocss/vite': 66.0.0(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3)) + '@unocss/vite': 66.0.0(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3)) optionalDependencies: - vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1) + vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1) transitivePeerDependencies: - vue @@ -5046,7 +5112,7 @@ snapshots: dependencies: '@unocss/core': 66.0.0 - '@unocss/vite@66.0.0(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3))': + '@unocss/vite@66.0.0(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3))': dependencies: '@ampproject/remapping': 2.3.0 '@unocss/config': 66.0.0 @@ -5056,75 +5122,74 @@ snapshots: magic-string: 0.30.17 tinyglobby: 0.2.12 unplugin-utils: 0.2.4 - vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1) + vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1) transitivePeerDependencies: - vue - '@unrs/resolver-binding-darwin-arm64@1.3.3': + '@unrs/resolver-binding-darwin-arm64@1.4.1': optional: true - '@unrs/resolver-binding-darwin-x64@1.3.3': + '@unrs/resolver-binding-darwin-x64@1.4.1': optional: true - '@unrs/resolver-binding-freebsd-x64@1.3.3': + '@unrs/resolver-binding-freebsd-x64@1.4.1': optional: true - '@unrs/resolver-binding-linux-arm-gnueabihf@1.3.3': + '@unrs/resolver-binding-linux-arm-gnueabihf@1.4.1': optional: true - '@unrs/resolver-binding-linux-arm-musleabihf@1.3.3': + '@unrs/resolver-binding-linux-arm-musleabihf@1.4.1': optional: true - '@unrs/resolver-binding-linux-arm64-gnu@1.3.3': + '@unrs/resolver-binding-linux-arm64-gnu@1.4.1': optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.3.3': + '@unrs/resolver-binding-linux-arm64-musl@1.4.1': optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.3.3': + '@unrs/resolver-binding-linux-ppc64-gnu@1.4.1': optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.3.3': + '@unrs/resolver-binding-linux-s390x-gnu@1.4.1': optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.3.3': + '@unrs/resolver-binding-linux-x64-gnu@1.4.1': optional: true - '@unrs/resolver-binding-linux-x64-musl@1.3.3': + '@unrs/resolver-binding-linux-x64-musl@1.4.1': optional: true - '@unrs/resolver-binding-wasm32-wasi@1.3.3': + '@unrs/resolver-binding-wasm32-wasi@1.4.1': dependencies: '@napi-rs/wasm-runtime': 0.2.8 optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.3.3': + '@unrs/resolver-binding-win32-arm64-msvc@1.4.1': optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.3.3': + '@unrs/resolver-binding-win32-ia32-msvc@1.4.1': optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.3.3': + '@unrs/resolver-binding-win32-x64-msvc@1.4.1': optional: true - '@vitejs/plugin-vue-jsx@4.1.2(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3))': + '@vitejs/plugin-vue-jsx@4.1.2(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3))': dependencies: '@babel/core': 7.26.10 '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.26.10) '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.26.10) - vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1) + vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1) vue: 3.5.13(typescript@5.8.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.3(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3))': + '@vitejs/plugin-vue@5.2.3(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3))': dependencies: - vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1) + vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1) vue: 3.5.13(typescript@5.8.3) - '@vitest/eslint-plugin@1.1.39(@typescript-eslint/utils@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@vitest/eslint-plugin@1.1.40(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/utils': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.24.0(jiti@2.4.2) optionalDependencies: typescript: 5.8.3 @@ -5278,23 +5343,23 @@ snapshots: typescript: 5.8.3 vue: 3.5.13(typescript@5.8.3) - '@vueuse/components@13.0.0(vue@3.5.13(typescript@5.8.3))': + '@vueuse/components@13.1.0(vue@3.5.13(typescript@5.8.3))': dependencies: - '@vueuse/core': 13.0.0(vue@3.5.13(typescript@5.8.3)) - '@vueuse/shared': 13.0.0(vue@3.5.13(typescript@5.8.3)) + '@vueuse/core': 13.1.0(vue@3.5.13(typescript@5.8.3)) + '@vueuse/shared': 13.1.0(vue@3.5.13(typescript@5.8.3)) vue: 3.5.13(typescript@5.8.3) - '@vueuse/core@13.0.0(vue@3.5.13(typescript@5.8.3))': + '@vueuse/core@13.1.0(vue@3.5.13(typescript@5.8.3))': dependencies: '@types/web-bluetooth': 0.0.21 - '@vueuse/metadata': 13.0.0 - '@vueuse/shared': 13.0.0(vue@3.5.13(typescript@5.8.3)) + '@vueuse/metadata': 13.1.0 + '@vueuse/shared': 13.1.0(vue@3.5.13(typescript@5.8.3)) vue: 3.5.13(typescript@5.8.3) - '@vueuse/integrations@13.0.0(async-validator@4.2.5)(axios@1.8.4)(nprogress@0.2.0)(sortablejs@1.15.6)(universal-cookie@8.0.1)(vue@3.5.13(typescript@5.8.3))': + '@vueuse/integrations@13.1.0(async-validator@4.2.5)(axios@1.8.4)(nprogress@0.2.0)(sortablejs@1.15.6)(universal-cookie@8.0.1)(vue@3.5.13(typescript@5.8.3))': dependencies: - '@vueuse/core': 13.0.0(vue@3.5.13(typescript@5.8.3)) - '@vueuse/shared': 13.0.0(vue@3.5.13(typescript@5.8.3)) + '@vueuse/core': 13.1.0(vue@3.5.13(typescript@5.8.3)) + '@vueuse/shared': 13.1.0(vue@3.5.13(typescript@5.8.3)) vue: 3.5.13(typescript@5.8.3) optionalDependencies: async-validator: 4.2.5 @@ -5303,9 +5368,9 @@ snapshots: sortablejs: 1.15.6 universal-cookie: 8.0.1 - '@vueuse/metadata@13.0.0': {} + '@vueuse/metadata@13.1.0': {} - '@vueuse/shared@13.0.0(vue@3.5.13(typescript@5.8.3))': + '@vueuse/shared@13.1.0(vue@3.5.13(typescript@5.8.3))': dependencies: vue: 3.5.13(typescript@5.8.3) @@ -5501,7 +5566,7 @@ snapshots: builtin-modules@3.3.0: {} - builtin-modules@4.0.0: {} + builtin-modules@5.0.0: {} bytes@3.1.2: {} @@ -6051,9 +6116,9 @@ snapshots: eslint: 9.24.0(jiti@2.4.2) eslint-compat-utils: 0.5.1(eslint@9.24.0(jiti@2.4.2)) - eslint-plugin-import-x@4.10.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): + eslint-plugin-import-x@4.10.2(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@pkgr/core': 0.2.0 + '@pkgr/core': 0.2.2 '@types/doctrine': 0.0.9 '@typescript-eslint/utils': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) debug: 4.4.0 @@ -6066,7 +6131,7 @@ snapshots: semver: 7.7.1 stable-hash: 0.0.5 tslib: 2.8.1 - unrs-resolver: 1.3.3 + unrs-resolver: 1.4.1 transitivePeerDependencies: - supports-color - typescript @@ -6170,18 +6235,19 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-unicorn@57.0.0(eslint@9.24.0(jiti@2.4.2)): + eslint-plugin-unicorn@58.0.0(eslint@9.24.0(jiti@2.4.2)): dependencies: '@babel/helper-validator-identifier': 7.25.9 '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@2.4.2)) + '@eslint/plugin-kit': 0.2.8 ci-info: 4.2.0 clean-regexp: 1.0.0 core-js-compat: 3.41.0 eslint: 9.24.0(jiti@2.4.2) esquery: 1.6.0 - globals: 15.15.0 + globals: 16.0.0 indent-string: 5.0.0 - is-builtin-module: 4.0.0 + is-builtin-module: 5.0.0 jsesc: 3.1.0 pluralize: 8.0.0 read-package-up: 11.0.0 @@ -6190,13 +6256,13 @@ snapshots: semver: 7.7.1 strip-indent: 4.0.0 - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)): dependencies: eslint: 9.24.0(jiti@2.4.2) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - eslint-plugin-vue@10.0.0(eslint@9.24.0(jiti@2.4.2))(vue-eslint-parser@10.1.2(eslint@9.24.0(jiti@2.4.2))): + eslint-plugin-vue@10.0.0(eslint@9.24.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.24.0(jiti@2.4.2))): dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@2.4.2)) eslint: 9.24.0(jiti@2.4.2) @@ -6204,7 +6270,7 @@ snapshots: nth-check: 2.1.1 postcss-selector-parser: 6.1.2 semver: 7.7.1 - vue-eslint-parser: 10.1.2(eslint@9.24.0(jiti@2.4.2)) + vue-eslint-parser: 10.1.3(eslint@9.24.0(jiti@2.4.2)) xml-name-validator: 4.0.0 eslint-plugin-yml@1.17.0(eslint@9.24.0(jiti@2.4.2)): @@ -6628,9 +6694,9 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-builtin-module@4.0.0: + is-builtin-module@5.0.0: dependencies: - builtin-modules: 4.0.0 + builtin-modules: 5.0.0 is-callable@1.2.7: {} @@ -6799,7 +6865,7 @@ snapshots: kolorist@1.8.0: {} - less@4.2.2: + less@4.3.0: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 @@ -6871,11 +6937,11 @@ snapshots: markdown-table@3.0.4: {} - marked-highlight@2.2.1(marked@15.0.7): + marked-highlight@2.2.1(marked@15.0.8): dependencies: - marked: 15.0.7 + marked: 15.0.8 - marked@15.0.7: {} + marked@15.0.8: {} math-intrinsics@1.1.0: {} @@ -7433,18 +7499,18 @@ snapshots: pify@4.0.1: {} - pinia-plugin-persistedstate@4.2.0(pinia@3.0.1(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3))): + pinia-plugin-persistedstate@4.2.0(pinia@3.0.2(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3))): dependencies: '@nuxt/kit': 3.16.2 deep-pick-omit: 1.2.1 defu: 6.1.4 destr: 2.0.5 optionalDependencies: - pinia: 3.0.1(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)) + pinia: 3.0.2(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)) transitivePeerDependencies: - magicast - pinia@3.0.1(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)): + pinia@3.0.2(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)): dependencies: '@vue/devtools-api': 7.7.2 vue: 3.5.13(typescript@5.8.3) @@ -8034,9 +8100,9 @@ snapshots: dependencies: cookie: 1.0.2 - unocss@66.0.0(postcss@8.5.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3)): + unocss@66.0.0(postcss@8.5.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3)): dependencies: - '@unocss/astro': 66.0.0(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3)) + '@unocss/astro': 66.0.0(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3)) '@unocss/cli': 66.0.0 '@unocss/core': 66.0.0 '@unocss/postcss': 66.0.0(postcss@8.5.3) @@ -8053,15 +8119,15 @@ snapshots: '@unocss/transformer-compile-class': 66.0.0 '@unocss/transformer-directives': 66.0.0 '@unocss/transformer-variant-group': 66.0.0 - '@unocss/vite': 66.0.0(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3)) + '@unocss/vite': 66.0.0(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1))(vue@3.5.13(typescript@5.8.3)) optionalDependencies: - vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1) + vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1) transitivePeerDependencies: - postcss - supports-color - vue - unplugin-auto-import@19.1.2(@nuxt/kit@3.16.2)(@vueuse/core@13.0.0(vue@3.5.13(typescript@5.8.3))): + unplugin-auto-import@19.1.2(@nuxt/kit@3.16.2)(@vueuse/core@13.1.0(vue@3.5.13(typescript@5.8.3))): dependencies: local-pkg: 1.1.1 magic-string: 0.30.17 @@ -8071,7 +8137,7 @@ snapshots: unplugin-utils: 0.2.4 optionalDependencies: '@nuxt/kit': 3.16.2 - '@vueuse/core': 13.0.0(vue@3.5.13(typescript@5.8.3)) + '@vueuse/core': 13.1.0(vue@3.5.13(typescript@5.8.3)) unplugin-utils@0.2.4: dependencies: @@ -8113,23 +8179,23 @@ snapshots: acorn: 8.14.1 webpack-virtual-modules: 0.6.2 - unrs-resolver@1.3.3: + unrs-resolver@1.4.1: optionalDependencies: - '@unrs/resolver-binding-darwin-arm64': 1.3.3 - '@unrs/resolver-binding-darwin-x64': 1.3.3 - '@unrs/resolver-binding-freebsd-x64': 1.3.3 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.3.3 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.3.3 - '@unrs/resolver-binding-linux-arm64-gnu': 1.3.3 - '@unrs/resolver-binding-linux-arm64-musl': 1.3.3 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.3.3 - '@unrs/resolver-binding-linux-s390x-gnu': 1.3.3 - '@unrs/resolver-binding-linux-x64-gnu': 1.3.3 - '@unrs/resolver-binding-linux-x64-musl': 1.3.3 - '@unrs/resolver-binding-wasm32-wasi': 1.3.3 - '@unrs/resolver-binding-win32-arm64-msvc': 1.3.3 - '@unrs/resolver-binding-win32-ia32-msvc': 1.3.3 - '@unrs/resolver-binding-win32-x64-msvc': 1.3.3 + '@unrs/resolver-binding-darwin-arm64': 1.4.1 + '@unrs/resolver-binding-darwin-x64': 1.4.1 + '@unrs/resolver-binding-freebsd-x64': 1.4.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.4.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.4.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.4.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.4.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.4.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.4.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.4.1 + '@unrs/resolver-binding-linux-x64-musl': 1.4.1 + '@unrs/resolver-binding-wasm32-wasi': 1.4.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.4.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.4.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.4.1 untyped@2.0.0: dependencies: @@ -8168,7 +8234,7 @@ snapshots: svgo: 3.3.2 vue: 3.5.13(typescript@5.8.3) - vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.2.2)(tsx@4.19.2)(yaml@2.7.1): + vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(less@4.3.0)(tsx@4.19.2)(yaml@2.7.1): dependencies: esbuild: 0.25.2 postcss: 8.5.3 @@ -8177,7 +8243,7 @@ snapshots: '@types/node': 22.14.0 fsevents: 2.3.3 jiti: 2.4.2 - less: 4.2.2 + less: 4.3.0 tsx: 4.19.2 yaml: 2.7.1 @@ -8188,7 +8254,7 @@ snapshots: dompurify: 3.2.5 vue: 3.5.13(typescript@5.8.3) - vue-eslint-parser@10.1.2(eslint@9.24.0(jiti@2.4.2)): + vue-eslint-parser@10.1.3(eslint@9.24.0(jiti@2.4.2)): dependencies: debug: 4.4.0 eslint: 9.24.0(jiti@2.4.2) diff --git a/app/src/api/external_notify.ts b/app/src/api/external_notify.ts new file mode 100644 index 00000000..ff52f7d5 --- /dev/null +++ b/app/src/api/external_notify.ts @@ -0,0 +1,17 @@ +import type { ModelBase } from '@/api/curd' +import Curd from '@/api/curd' + +export interface ExternalNotify extends ModelBase { + type: string + config: Record +} + +class ExternalNotifyCurd extends Curd { + constructor() { + super('/external_notifies') + } +} + +const externalNotify: ExternalNotifyCurd = new ExternalNotifyCurd() + +export default externalNotify diff --git a/app/src/components/Notification/notifications.ts b/app/src/components/Notification/notifications.ts index bb19db1e..01f6486d 100644 --- a/app/src/components/Notification/notifications.ts +++ b/app/src/components/Notification/notifications.ts @@ -4,7 +4,45 @@ const notifications: Record string, content: (args: any) => string }> = { + // cluster module notifications + 'Reload Remote Nginx Error': { + title: () => $gettext('Reload Remote Nginx Error'), + content: (args: any) => $gettext('Reload Nginx on %{node} failed, response: %{resp}', args), + }, + 'Reload Remote Nginx Success': { + title: () => $gettext('Reload Remote Nginx Success'), + content: (args: any) => $gettext('Reload Nginx on %{node} successfully', args), + }, + 'Restart Remote Nginx Error': { + title: () => $gettext('Restart Remote Nginx Error'), + content: (args: any) => $gettext('Restart Nginx on %{node} failed, response: %{resp}', args), + }, + 'Restart Remote Nginx Success': { + title: () => $gettext('Restart Remote Nginx Success'), + content: (args: any) => $gettext('Restart Nginx on %{node} successfully', args), + }, + // cert module notifications + 'Certificate Expired': { + title: () => $gettext('Certificate Expired'), + content: (args: any) => $gettext('Certificate %{name} has expired', args), + }, + 'Certificate Expiration Notice': { + title: () => $gettext('Certificate Expiration Notice'), + content: (args: any) => $gettext('Certificate %{name} will expire in %{days} days', args), + }, + 'Certificate Expiring Soon': { + title: () => $gettext('Certificate Expiring Soon'), + content: (args: any) => $gettext('Certificate %{name} will expire in %{days} days', args), + }, + 'Certificate Expiring Soon_1': { + title: () => $gettext('Certificate Expiring Soon'), + content: (args: any) => $gettext('Certificate %{name} will expire in %{days} days', args), + }, + 'Certificate Expiring Soon_2': { + title: () => $gettext('Certificate Expiring Soon'), + content: (args: any) => $gettext('Certificate %{name} will expire in 1 day', args), + }, 'Sync Certificate Error': { title: () => $gettext('Sync Certificate Error'), content: (args: any) => $gettext('Sync Certificate %{cert_name} to %{env_name} failed', args), @@ -137,24 +175,6 @@ const notifications: Record string, content: (args: any) title: () => $gettext('All Recovery Codes Have Been Used'), content: (args: any) => $gettext('Please generate new recovery codes in the preferences immediately to prevent lockout.', args), }, - - // cluster module notifications - 'Reload Remote Nginx Error': { - title: () => $gettext('Reload Remote Nginx Error'), - content: (args: any) => $gettext('Reload Nginx on %{node} failed, response: %{resp}', args), - }, - 'Reload Remote Nginx Success': { - title: () => $gettext('Reload Remote Nginx Success'), - content: (args: any) => $gettext('Reload Nginx on %{node} successfully', args), - }, - 'Restart Remote Nginx Error': { - title: () => $gettext('Restart Remote Nginx Error'), - content: (args: any) => $gettext('Restart Nginx on %{node} failed, response: %{resp}', args), - }, - 'Restart Remote Nginx Success': { - title: () => $gettext('Restart Remote Nginx Success'), - content: (args: any) => $gettext('Restart Nginx on %{node} successfully', args), - }, } export default notifications diff --git a/app/src/constants/errors/notification.ts b/app/src/constants/errors/notification.ts new file mode 100644 index 00000000..ace06cdc --- /dev/null +++ b/app/src/constants/errors/notification.ts @@ -0,0 +1,4 @@ +export default { + 404001: () => $gettext('Notifier not found'), + 400001: () => $gettext('Invalid notifier config'), +} diff --git a/app/src/language/ar/app.po b/app/src/language/ar/app.po index 3423f6a2..58a1f201 100644 --- a/app/src/language/ar/app.po +++ b/app/src/language/ar/app.po @@ -48,6 +48,7 @@ msgstr "مستخدم ACME" #: src/views/nginx_log/NginxLogList.vue:53 #: src/views/notification/notificationColumns.tsx:66 #: src/views/preference/AuthSettings.vue:30 +#: src/views/preference/components/ExternalNotify/columns.ts:46 #: src/views/site/site_list/columns.tsx:117 src/views/stream/StreamList.vue:74 #: src/views/user/userColumns.tsx:60 msgid "Action" @@ -112,7 +113,7 @@ msgstr "بعد ذلك، قم بتحديث هذه الصفحة وانقر فوق msgid "All" msgstr "الكل" -#: src/components/Notification/notifications.ts:137 +#: src/components/Notification/notifications.ts:175 #: src/language/constants.ts:58 msgid "All Recovery Codes Have Been Used" msgstr "" @@ -138,7 +139,7 @@ msgstr "رمز API" msgid "API Type" msgstr "رمز API" -#: src/views/preference/Preference.vue:162 +#: src/views/preference/Preference.vue:163 msgid "App" msgstr "" @@ -195,7 +196,7 @@ msgstr "هل أنت متأكد أنك تريد حذف هذا العنصر نها msgid "Are you sure you want to delete this item?" msgstr "هل أنت متأكد أنك تريد حذف هذا العنصر؟" -#: src/views/site/site_list/SiteList.vue:163 +#: src/views/site/site_list/SiteList.vue:167 #: src/views/stream/StreamList.vue:227 msgid "Are you sure you want to delete?" msgstr "هل أنت متأكد أنك تريد الحذف؟" @@ -243,7 +244,7 @@ msgstr "محاولات" msgid "Attempts" msgstr "محاولات" -#: src/views/preference/Preference.vue:186 +#: src/views/preference/Preference.vue:193 msgid "Auth" msgstr "مصادقة" @@ -327,12 +328,16 @@ msgstr "عناوين IP المحظورة" msgid "Banned Until" msgstr "محظور حتى" +#: src/views/preference/components/ExternalNotify/bark.ts:5 +msgid "Bark" +msgstr "" + #: src/views/site/site_add/SiteAdd.vue:95 msgid "Base information" msgstr "المعلومات الأساسية" #: src/views/config/ConfigEditor.vue:290 -#: src/views/site/site_edit/RightSettings.vue:53 +#: src/views/site/site_edit/RightSettings.vue:52 #: src/views/stream/components/RightSettings.vue:79 msgid "Basic" msgstr "أساسي" @@ -405,7 +410,7 @@ msgstr "" msgid "Cannot remove initial user" msgstr "مستخدم النظام الأولي" -#: src/views/preference/Preference.vue:192 +#: src/views/preference/Preference.vue:199 msgid "Cert" msgstr "شهادة" @@ -413,11 +418,43 @@ msgstr "شهادة" msgid "Cert path is not under the nginx conf dir" msgstr "" +#: src/components/Notification/notifications.ts:28 +#, fuzzy +msgid "Certificate %{name} has expired" +msgstr "نماذج التكوين" + +#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:36 +#: src/components/Notification/notifications.ts:40 +msgid "Certificate %{name} will expire in %{days} days" +msgstr "" + +#: src/components/Notification/notifications.ts:44 +msgid "Certificate %{name} will expire in 1 day" +msgstr "" + #: src/constants/errors/cert.ts:4 #, fuzzy msgid "Certificate decode error" msgstr "خطأ في مزامنة الشهادة" +#: src/components/Notification/notifications.ts:31 +#, fuzzy +msgid "Certificate Expiration Notice" +msgstr "نماذج التكوين" + +#: src/components/Notification/notifications.ts:27 +#, fuzzy +msgid "Certificate Expired" +msgstr "قائمة الشهادات" + +#: src/components/Notification/notifications.ts:35 +#: src/components/Notification/notifications.ts:39 +#: src/components/Notification/notifications.ts:43 +#, fuzzy +msgid "Certificate Expiring Soon" +msgstr "خطأ في مزامنة الشهادة" + #: src/constants/errors/cert.ts:5 #, fuzzy msgid "Certificate parse error" @@ -681,6 +718,7 @@ msgstr "" #: src/views/environments/group/columns.ts:31 #: src/views/notification/notificationColumns.tsx:59 +#: src/views/preference/components/ExternalNotify/columns.ts:41 #: src/views/preference/components/Passkey.vue:95 #: src/views/user/userColumns.tsx:48 msgid "Created at" @@ -752,7 +790,7 @@ msgstr "وصف" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519 #: src/views/site/ngx_conf/NgxServer.vue:110 #: src/views/site/ngx_conf/NgxUpstream.vue:128 -#: src/views/site/site_list/SiteList.vue:172 +#: src/views/site/site_list/SiteList.vue:176 #: src/views/stream/StreamList.vue:236 msgid "Delete" msgstr "حذف" @@ -762,44 +800,44 @@ msgstr "حذف" msgid "Delete Permanently" msgstr "حذف نهائي" -#: src/components/Notification/notifications.ts:37 src/language/constants.ts:50 +#: src/components/Notification/notifications.ts:75 src/language/constants.ts:50 msgid "Delete Remote Site Error" msgstr "خطأ حذف الموقع البعيد" -#: src/components/Notification/notifications.ts:41 src/language/constants.ts:49 +#: src/components/Notification/notifications.ts:79 src/language/constants.ts:49 msgid "Delete Remote Site Success" msgstr "نجح حذف الموقع البعيد" -#: src/components/Notification/notifications.ts:95 +#: src/components/Notification/notifications.ts:133 #, fuzzy msgid "Delete Remote Stream Error" msgstr "خطأ حذف الموقع البعيد" -#: src/components/Notification/notifications.ts:99 +#: src/components/Notification/notifications.ts:137 #, fuzzy msgid "Delete Remote Stream Success" msgstr "نجح حذف الموقع البعيد" -#: src/components/Notification/notifications.ts:38 +#: src/components/Notification/notifications.ts:76 #, fuzzy msgid "Delete site %{name} from %{node} failed" msgstr "فشل نشر {conf_name}% إلى {node_name}%" -#: src/components/Notification/notifications.ts:42 +#: src/components/Notification/notifications.ts:80 #, fuzzy msgid "Delete site %{name} from %{node} successfully" msgstr "تمت إزالة الموقع %{site} من %{node} بنجاح" -#: src/views/site/site_list/SiteList.vue:94 +#: src/views/site/site_list/SiteList.vue:98 msgid "Delete site: %{site_name}" msgstr "حذف الموقع: ‎%{site_name}" -#: src/components/Notification/notifications.ts:96 +#: src/components/Notification/notifications.ts:134 #, fuzzy msgid "Delete stream %{name} from %{node} failed" msgstr "فشل نشر {conf_name}% إلى {node_name}%" -#: src/components/Notification/notifications.ts:100 +#: src/components/Notification/notifications.ts:138 #, fuzzy msgid "Delete stream %{name} from %{node} successfully" msgstr "تمت إزالة الموقع %{site} من %{node} بنجاح" @@ -837,6 +875,10 @@ msgstr "تفاصيل" msgid "Development Mode" msgstr "وضع التطوير" +#: src/views/preference/components/ExternalNotify/dingtalk.ts:5 +msgid "DingTalk" +msgstr "" + #: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89 msgid "Directive" msgstr "توجيه" @@ -870,60 +912,60 @@ msgstr "تعطيل" msgid "Disable auto-renewal failed for %{name}" msgstr "فشل تعطيل التجديد التلقائي لـ {name}%" -#: src/components/Notification/notifications.ts:45 src/language/constants.ts:52 +#: src/components/Notification/notifications.ts:83 src/language/constants.ts:52 msgid "Disable Remote Site Error" msgstr "خطأ في تعطيل الموقع البعيد" -#: src/components/Notification/notifications.ts:69 -#, fuzzy -msgid "Disable Remote Site Maintenance Error" -msgstr "خطأ في تعطيل الموقع البعيد" - -#: src/components/Notification/notifications.ts:73 -#, fuzzy -msgid "Disable Remote Site Maintenance Success" -msgstr "تعطيل الموقع البعيد بنجاح" - -#: src/components/Notification/notifications.ts:49 src/language/constants.ts:51 -msgid "Disable Remote Site Success" -msgstr "تعطيل الموقع البعيد بنجاح" - -#: src/components/Notification/notifications.ts:103 -#, fuzzy -msgid "Disable Remote Stream Error" -msgstr "خطأ في تعطيل الموقع البعيد" - #: src/components/Notification/notifications.ts:107 #, fuzzy +msgid "Disable Remote Site Maintenance Error" +msgstr "خطأ في تعطيل الموقع البعيد" + +#: src/components/Notification/notifications.ts:111 +#, fuzzy +msgid "Disable Remote Site Maintenance Success" +msgstr "تعطيل الموقع البعيد بنجاح" + +#: src/components/Notification/notifications.ts:87 src/language/constants.ts:51 +msgid "Disable Remote Site Success" +msgstr "تعطيل الموقع البعيد بنجاح" + +#: src/components/Notification/notifications.ts:141 +#, fuzzy +msgid "Disable Remote Stream Error" +msgstr "خطأ في تعطيل الموقع البعيد" + +#: src/components/Notification/notifications.ts:145 +#, fuzzy msgid "Disable Remote Stream Success" msgstr "تعطيل الموقع البعيد بنجاح" -#: src/components/Notification/notifications.ts:46 +#: src/components/Notification/notifications.ts:84 #, fuzzy msgid "Disable site %{name} from %{node} failed" msgstr "تم تعطيل الموقع %{site} على %{node} بنجاح" -#: src/components/Notification/notifications.ts:50 +#: src/components/Notification/notifications.ts:88 #, fuzzy msgid "Disable site %{name} from %{node} successfully" msgstr "تم تعطيل الموقع %{site} على %{node} بنجاح" -#: src/components/Notification/notifications.ts:70 +#: src/components/Notification/notifications.ts:108 #, fuzzy msgid "Disable site %{name} maintenance on %{node} failed" msgstr "تم تعطيل الموقع %{site} على %{node} بنجاح" -#: src/components/Notification/notifications.ts:74 +#: src/components/Notification/notifications.ts:112 #, fuzzy msgid "Disable site %{name} maintenance on %{node} successfully" msgstr "تم تعطيل الموقع %{site} على %{node} بنجاح" -#: src/components/Notification/notifications.ts:104 +#: src/components/Notification/notifications.ts:142 #, fuzzy msgid "Disable stream %{name} from %{node} failed" msgstr "فشل تفعيل %{conf_name} في %{node_name}" -#: src/components/Notification/notifications.ts:108 +#: src/components/Notification/notifications.ts:146 #, fuzzy msgid "Disable stream %{name} from %{node} successfully" msgstr "تم تعطيل الموقع %{site} على %{node} بنجاح" @@ -1039,7 +1081,7 @@ msgstr "" "الويب غير HTTPS، إلا عند التشغيل على localhost." #: src/views/site/site_list/SiteDuplicate.vue:72 -#: src/views/site/site_list/SiteList.vue:158 +#: src/views/site/site_list/SiteList.vue:162 #: src/views/stream/components/StreamDuplicate.vue:64 #: src/views/stream/StreamList.vue:222 msgid "Duplicate" @@ -1107,60 +1149,60 @@ msgstr "فشل التفعيل" msgid "Enable HTTPS" msgstr "تفعيل TOTP" -#: src/components/Notification/notifications.ts:53 src/language/constants.ts:54 +#: src/components/Notification/notifications.ts:91 src/language/constants.ts:54 msgid "Enable Remote Site Error" msgstr "خطأ في تفعيل الموقع البعيد" -#: src/components/Notification/notifications.ts:61 +#: src/components/Notification/notifications.ts:99 #, fuzzy msgid "Enable Remote Site Maintenance Error" msgstr "خطأ في تفعيل الموقع البعيد" -#: src/components/Notification/notifications.ts:65 +#: src/components/Notification/notifications.ts:103 #, fuzzy msgid "Enable Remote Site Maintenance Success" msgstr "نجح تفعيل الموقع البعيد" -#: src/components/Notification/notifications.ts:57 src/language/constants.ts:53 +#: src/components/Notification/notifications.ts:95 src/language/constants.ts:53 msgid "Enable Remote Site Success" msgstr "نجح تفعيل الموقع البعيد" -#: src/components/Notification/notifications.ts:111 +#: src/components/Notification/notifications.ts:149 #, fuzzy msgid "Enable Remote Stream Error" msgstr "خطأ في تفعيل الموقع البعيد" -#: src/components/Notification/notifications.ts:115 +#: src/components/Notification/notifications.ts:153 #, fuzzy msgid "Enable Remote Stream Success" msgstr "نجح تفعيل الموقع البعيد" -#: src/components/Notification/notifications.ts:62 +#: src/components/Notification/notifications.ts:100 #, fuzzy msgid "Enable site %{name} maintenance on %{node} failed" msgstr "فشل تفعيل %{conf_name} في %{node_name}" -#: src/components/Notification/notifications.ts:66 +#: src/components/Notification/notifications.ts:104 #, fuzzy msgid "Enable site %{name} maintenance on %{node} successfully" msgstr "تم تفعيل الموقع %{site} على %{node} بنجاح" -#: src/components/Notification/notifications.ts:54 +#: src/components/Notification/notifications.ts:92 #, fuzzy msgid "Enable site %{name} on %{node} failed" msgstr "فشل تفعيل %{conf_name} في %{node_name}" -#: src/components/Notification/notifications.ts:58 +#: src/components/Notification/notifications.ts:96 #, fuzzy msgid "Enable site %{name} on %{node} successfully" msgstr "تم تفعيل الموقع %{site} على %{node} بنجاح" -#: src/components/Notification/notifications.ts:112 +#: src/components/Notification/notifications.ts:150 #, fuzzy msgid "Enable stream %{name} on %{node} failed" msgstr "فشل تفعيل %{conf_name} في %{node_name}" -#: src/components/Notification/notifications.ts:116 +#: src/components/Notification/notifications.ts:154 #, fuzzy msgid "Enable stream %{name} on %{node} successfully" msgstr "تم تفعيل الموقع %{site} على %{node} بنجاح" @@ -1248,6 +1290,11 @@ msgstr "تنتهي في: %{date}" msgid "Export" msgstr "تصدير" +#: src/views/preference/ExternalNotify.vue:10 +#: src/views/preference/Preference.vue:169 +msgid "External Notify" +msgstr "" + #: src/views/site/cert/components/ObtainCertLive.vue:94 msgid "Fail to obtain certificate" msgstr "فشل في الحصول على الشهادة" @@ -1652,7 +1699,7 @@ msgstr "الصفحة الرئيسية" msgid "Host" msgstr "مضيف HTTP" -#: src/views/preference/Preference.vue:174 +#: src/views/preference/Preference.vue:181 #, fuzzy msgid "HTTP" msgstr "HTTP01" @@ -1713,12 +1760,12 @@ msgid "Import Certificate" msgstr "استيراد شهادة" #: src/views/nginx_log/NginxLogList.vue:137 -#: src/views/site/site_list/SiteList.vue:128 +#: src/views/site/site_list/SiteList.vue:132 msgid "Indexed" msgstr "" #: src/views/nginx_log/NginxLogList.vue:134 -#: src/views/site/site_list/SiteList.vue:125 +#: src/views/site/site_list/SiteList.vue:129 msgid "Indexing..." msgstr "" @@ -1802,6 +1849,11 @@ msgstr "اسم ملف غير صالح" msgid "Invalid folder name" msgstr "اسم المجلد غير صالح" +#: src/constants/errors/notification.ts:3 +#, fuzzy +msgid "Invalid notifier config" +msgstr "رمز 2FA أو الاسترداد غير صالح" + #: src/constants/errors/user.ts:4 #, fuzzy msgid "Invalid otp code" @@ -1865,6 +1917,19 @@ msgstr "" msgid "Key Type" msgstr "نوع المفتاح" +#: src/views/preference/components/ExternalNotify/columns.ts:29 +msgid "Language" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark.ts:5 +msgid "Lark" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark_custom.ts:5 +#, fuzzy +msgid "Lark Custom" +msgstr "مخصص" + #: src/views/system/Upgrade.vue:179 msgid "Last checked at" msgstr "آخر فحص في" @@ -1961,7 +2026,7 @@ msgstr "تم تسجيل الدخول بنجاح" msgid "Logout successful" msgstr "تم تسجيل الخروج بنجاح" -#: src/views/preference/Preference.vue:210 +#: src/views/preference/Preference.vue:217 msgid "Logrotate" msgstr "تدوير السجلات" @@ -2009,7 +2074,7 @@ msgstr "" msgid "Manage Configs" msgstr "إدارة التكوينات" -#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:121 +#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:125 msgid "Manage Sites" msgstr "إدارة المواقع" @@ -2085,7 +2150,7 @@ msgstr "توجيه متعدد الأسطر" #: src/views/nginx_log/NginxLogList.vue:37 #: src/views/preference/components/AddPasskey.vue:75 #: src/views/site/ngx_conf/NgxUpstream.vue:177 -#: src/views/site/site_edit/RightSettings.vue:64 +#: src/views/site/site_edit/RightSettings.vue:63 #: src/views/site/site_list/columns.tsx:17 #: src/views/site/site_list/SiteDuplicate.vue:79 #: src/views/stream/components/RightSettings.vue:87 @@ -2133,7 +2198,7 @@ msgstr "تم إصدار نسخة جديدة" msgid "Next" msgstr "التالي" -#: src/views/preference/Preference.vue:198 +#: src/views/preference/Preference.vue:205 msgid "Nginx" msgstr "Nginx" @@ -2273,7 +2338,7 @@ msgstr "خطأ في تحليل تكوين Nginx" #: src/views/preference/CertSettings.vue:73 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97 #: src/views/site/ngx_conf/LocationEditor.vue:88 -#: src/views/site/site_list/SiteList.vue:161 +#: src/views/site/site_list/SiteList.vue:165 #: src/views/stream/StreamList.vue:225 msgid "No" msgstr "لا" @@ -2288,12 +2353,12 @@ msgstr "إجراء" msgid "No records selected" msgstr "" -#: src/views/preference/Preference.vue:168 +#: src/views/preference/Preference.vue:175 #, fuzzy msgid "Node" msgstr "اسم العقدة" -#: src/views/site/site_edit/RightSettings.vue:67 +#: src/views/site/site_edit/RightSettings.vue:66 #: src/views/site/site_list/columns.tsx:63 #: src/views/stream/components/RightSettings.vue:90 #: src/views/stream/StreamList.vue:30 @@ -2337,7 +2402,7 @@ msgstr "غير صالح قبل: %{date}" msgid "Note" msgstr "ملاحظة" -#: src/views/site/site_edit/RightSettings.vue:96 +#: src/views/site/site_edit/RightSettings.vue:95 #: src/views/stream/components/RightSettings.vue:118 msgid "" "Note, if the configuration file include other configurations or " @@ -2355,6 +2420,11 @@ msgstr "إشعار" msgid "Notifications" msgstr "الإشعارات" +#: src/constants/errors/notification.ts:2 +#, fuzzy +msgid "Notifier not found" +msgstr "لم يتم العثور على الملف" + #: src/views/site/cert/components/ObtainCert.vue:182 msgid "Obtain certificate" msgstr "الحصول على شهادة" @@ -2399,7 +2469,7 @@ msgstr "حسنًا" #: src/views/site/ngx_conf/NgxServer.vue:79 #: src/views/site/ngx_conf/NgxUpstream.vue:33 #: src/views/site/site_edit/components/SiteStatusSegmented.vue:121 -#: src/views/site/site_list/SiteList.vue:162 +#: src/views/site/site_list/SiteList.vue:166 #: src/views/stream/components/RightSettings.vue:54 #: src/views/stream/StreamList.vue:226 #: src/views/system/Backup/BackupCreator.vue:149 @@ -2422,7 +2492,7 @@ msgstr "متصل" msgid "Only zip files are allowed" msgstr "" -#: src/views/preference/Preference.vue:204 +#: src/views/preference/Preference.vue:211 msgid "OpenAI" msgstr "أوبن أي آي" @@ -2569,7 +2639,7 @@ msgstr "" "يرجى أولاً إضافة بيانات الاعتماد في الشهادات > بيانات اعتماد DNS، ثم اختيار " "أحد بيانات الاعتماد أدناه لطلب API لمزود DNS." -#: src/components/Notification/notifications.ts:138 +#: src/components/Notification/notifications.ts:176 #: src/language/constants.ts:59 msgid "" "Please generate new recovery codes in the preferences immediately to prevent " @@ -2660,7 +2730,7 @@ msgstr "إجراء" msgid "Pre-release" msgstr "ما قبل الإصدار" -#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:151 +#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:152 msgid "Preference" msgstr "تفضيل" @@ -2794,22 +2864,22 @@ msgstr "إعادة تحميل" msgid "Reload Nginx" msgstr "إعادة تحميل nginx" -#: src/components/Notification/notifications.ts:144 +#: src/components/Notification/notifications.ts:10 #, fuzzy msgid "Reload Nginx on %{node} failed, response: %{resp}" msgstr "خطأ في إزالة الموقع %{site} من %{node}، الاستجابة: %{resp}" -#: src/components/Notification/notifications.ts:148 +#: src/components/Notification/notifications.ts:14 #, fuzzy msgid "Reload Nginx on %{node} successfully" msgstr "تمت ترقية Nginx UI على %{node} بنجاح 🎉" -#: src/components/Notification/notifications.ts:143 +#: src/components/Notification/notifications.ts:9 #, fuzzy msgid "Reload Remote Nginx Error" msgstr "خطأ في إعادة تسمية الموقع البعيد" -#: src/components/Notification/notifications.ts:147 +#: src/components/Notification/notifications.ts:13 #, fuzzy msgid "Reload Remote Nginx Success" msgstr "تم إعادة تسمية الموقع البعيد بنجاح" @@ -2848,57 +2918,59 @@ msgstr "تمت الإزالة بنجاح" msgid "Rename" msgstr "إعادة تسمية" -#: src/components/Notification/notifications.ts:28 +#: src/components/Notification/notifications.ts:66 #, fuzzy msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed" msgstr "تم إعادة تسمية %{orig_path} إلى %{new_path} على %{env_name} بنجاح" -#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:70 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully" msgstr "تم إعادة تسمية %{orig_path} إلى %{new_path} على %{env_name} بنجاح" -#: src/components/Notification/notifications.ts:27 src/language/constants.ts:42 +#: src/components/Notification/notifications.ts:65 src/language/constants.ts:42 msgid "Rename Remote Config Error" msgstr "خطأ في إعادة تسمية التكوين البعيد" -#: src/components/Notification/notifications.ts:31 src/language/constants.ts:41 +#: src/components/Notification/notifications.ts:69 src/language/constants.ts:41 msgid "Rename Remote Config Success" msgstr "إعادة تسمية تكوين البعيد بنجاح" -#: src/components/Notification/notifications.ts:77 src/language/constants.ts:56 +#: src/components/Notification/notifications.ts:115 +#: src/language/constants.ts:56 msgid "Rename Remote Site Error" msgstr "خطأ في إعادة تسمية الموقع البعيد" -#: src/components/Notification/notifications.ts:81 src/language/constants.ts:55 +#: src/components/Notification/notifications.ts:119 +#: src/language/constants.ts:55 msgid "Rename Remote Site Success" msgstr "تم إعادة تسمية الموقع البعيد بنجاح" -#: src/components/Notification/notifications.ts:119 +#: src/components/Notification/notifications.ts:157 #, fuzzy msgid "Rename Remote Stream Error" msgstr "خطأ في إعادة تسمية الموقع البعيد" -#: src/components/Notification/notifications.ts:123 +#: src/components/Notification/notifications.ts:161 #, fuzzy msgid "Rename Remote Stream Success" msgstr "تم إعادة تسمية الموقع البعيد بنجاح" -#: src/components/Notification/notifications.ts:78 +#: src/components/Notification/notifications.ts:116 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} failed" msgstr "إعادة تسمية الموقع %{site} إلى %{new_site} على %{node} بنجاح" -#: src/components/Notification/notifications.ts:82 +#: src/components/Notification/notifications.ts:120 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} successfully" msgstr "إعادة تسمية الموقع %{site} إلى %{new_site} على %{node} بنجاح" -#: src/components/Notification/notifications.ts:120 +#: src/components/Notification/notifications.ts:158 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} failed" msgstr "إعادة تسمية الموقع %{site} إلى %{new_site} على %{node} بنجاح" -#: src/components/Notification/notifications.ts:124 +#: src/components/Notification/notifications.ts:162 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} successfully" msgstr "إعادة تسمية الموقع %{site} إلى %{new_site} على %{node} بنجاح" @@ -2958,22 +3030,22 @@ msgstr "إعادة تشغيل" msgid "Restart Nginx" msgstr "إعادة التشغيل" -#: src/components/Notification/notifications.ts:152 +#: src/components/Notification/notifications.ts:18 #, fuzzy msgid "Restart Nginx on %{node} failed, response: %{resp}" msgstr "خطأ في تفعيل الموقع %{site} على %{node}، الاستجابة: %{resp}" -#: src/components/Notification/notifications.ts:156 +#: src/components/Notification/notifications.ts:22 #, fuzzy msgid "Restart Nginx on %{node} successfully" msgstr "تمت ترقية Nginx UI على %{node} بنجاح 🎉" -#: src/components/Notification/notifications.ts:151 +#: src/components/Notification/notifications.ts:17 #, fuzzy msgid "Restart Remote Nginx Error" msgstr "خطأ في إعادة تسمية الموقع البعيد" -#: src/components/Notification/notifications.ts:155 +#: src/components/Notification/notifications.ts:21 #, fuzzy msgid "Restart Remote Nginx Success" msgstr "تم إعادة تسمية الموقع البعيد بنجاح" @@ -3040,7 +3112,7 @@ msgstr "يعمل" #: src/views/config/components/ConfigName.vue:59 #: src/views/config/ConfigEditor.vue:271 #: src/views/preference/components/Passkey.vue:130 -#: src/views/preference/Preference.vue:221 +#: src/views/preference/Preference.vue:228 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127 #: src/views/site/site_edit/components/ConfigName.vue:52 #: src/views/site/site_edit/SiteEdit.vue:292 @@ -3058,40 +3130,42 @@ msgstr "حفظ التوجيه" msgid "Save error %{msg}" msgstr "خطأ في الحفظ %{msg}" -#: src/components/Notification/notifications.ts:85 src/language/constants.ts:48 +#: src/components/Notification/notifications.ts:123 +#: src/language/constants.ts:48 msgid "Save Remote Site Error" msgstr "خطأ في حفظ الموقع البعيد" -#: src/components/Notification/notifications.ts:89 src/language/constants.ts:47 +#: src/components/Notification/notifications.ts:127 +#: src/language/constants.ts:47 msgid "Save Remote Site Success" msgstr "حفظ الموقع البعيد بنجاح" -#: src/components/Notification/notifications.ts:127 +#: src/components/Notification/notifications.ts:165 #, fuzzy msgid "Save Remote Stream Error" msgstr "خطأ في حفظ الموقع البعيد" -#: src/components/Notification/notifications.ts:131 +#: src/components/Notification/notifications.ts:169 #, fuzzy msgid "Save Remote Stream Success" msgstr "حفظ الموقع البعيد بنجاح" -#: src/components/Notification/notifications.ts:86 +#: src/components/Notification/notifications.ts:124 #, fuzzy msgid "Save site %{name} to %{node} failed" msgstr "تم حفظ الموقع %{site} إلى %{node} بنجاح" -#: src/components/Notification/notifications.ts:90 +#: src/components/Notification/notifications.ts:128 #, fuzzy msgid "Save site %{name} to %{node} successfully" msgstr "تم حفظ الموقع %{site} إلى %{node} بنجاح" -#: src/components/Notification/notifications.ts:128 +#: src/components/Notification/notifications.ts:166 #, fuzzy msgid "Save stream %{name} to %{node} failed" msgstr "فشل نشر {conf_name}% إلى {node_name}%" -#: src/components/Notification/notifications.ts:132 +#: src/components/Notification/notifications.ts:170 #, fuzzy msgid "Save stream %{name} to %{node} successfully" msgstr "تم حفظ الموقع %{site} إلى %{node} بنجاح" @@ -3099,7 +3173,7 @@ msgstr "تم حفظ الموقع %{site} إلى %{node} بنجاح" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97 #: src/views/certificate/CertificateEditor.vue:49 -#: src/views/preference/Preference.vue:123 +#: src/views/preference/Preference.vue:124 msgid "Save successfully" msgstr "تم الحفظ بنجاح" @@ -3150,7 +3224,7 @@ msgstr "" msgid "Send" msgstr "إرسال" -#: src/views/preference/Preference.vue:156 +#: src/views/preference/Preference.vue:157 #, fuzzy msgid "Server" msgstr "معلومات الخادم" @@ -3335,7 +3409,7 @@ msgstr "" #: src/views/certificate/ACMEUser.vue:65 #: src/views/certificate/CertificateList/certColumns.tsx:65 #: src/views/environments/list/envColumns.tsx:44 -#: src/views/site/site_edit/RightSettings.vue:56 +#: src/views/site/site_edit/RightSettings.vue:55 #: src/views/site/site_list/columns.tsx:80 src/views/stream/StreamList.vue:47 msgid "Status" msgstr "الحالة" @@ -3412,38 +3486,38 @@ msgstr "مزامنة" msgid "Sync Certificate" msgstr "مزامنة الشهادة" -#: src/components/Notification/notifications.ts:10 +#: src/components/Notification/notifications.ts:48 #, fuzzy msgid "Sync Certificate %{cert_name} to %{env_name} failed" msgstr "نجح مزامنة الشهادة %{cert_name} إلى %{env_name}" -#: src/components/Notification/notifications.ts:14 +#: src/components/Notification/notifications.ts:52 msgid "Sync Certificate %{cert_name} to %{env_name} successfully" msgstr "نجح مزامنة الشهادة %{cert_name} إلى %{env_name}" -#: src/components/Notification/notifications.ts:9 src/language/constants.ts:39 +#: src/components/Notification/notifications.ts:47 src/language/constants.ts:39 msgid "Sync Certificate Error" msgstr "خطأ في مزامنة الشهادة" -#: src/components/Notification/notifications.ts:13 src/language/constants.ts:38 +#: src/components/Notification/notifications.ts:51 src/language/constants.ts:38 msgid "Sync Certificate Success" msgstr "تمت مزامنة الشهادة بنجاح" -#: src/components/Notification/notifications.ts:20 +#: src/components/Notification/notifications.ts:58 #, fuzzy msgid "Sync config %{config_name} to %{env_name} failed" msgstr "تمت مزامنة التكوين %{config_name} إلى %{env_name} بنجاح" -#: src/components/Notification/notifications.ts:24 +#: src/components/Notification/notifications.ts:62 #, fuzzy msgid "Sync config %{config_name} to %{env_name} successfully" msgstr "تمت مزامنة التكوين %{config_name} إلى %{env_name} بنجاح" -#: src/components/Notification/notifications.ts:19 src/language/constants.ts:45 +#: src/components/Notification/notifications.ts:57 src/language/constants.ts:45 msgid "Sync Config Error" msgstr "خطأ في تزامن التكوين" -#: src/components/Notification/notifications.ts:23 src/language/constants.ts:44 +#: src/components/Notification/notifications.ts:61 src/language/constants.ts:44 msgid "Sync Config Success" msgstr "تمت مزامنة التكوين بنجاح" @@ -3452,8 +3526,8 @@ msgstr "تمت مزامنة التكوين بنجاح" msgid "Sync Nodes" msgstr "مزامنة العقد" -#: src/views/site/site_edit/RightSettings.vue:102 -#: src/views/site/site_edit/RightSettings.vue:89 +#: src/views/site/site_edit/RightSettings.vue:101 +#: src/views/site/site_edit/RightSettings.vue:88 #: src/views/stream/components/RightSettings.vue:111 #: src/views/stream/components/RightSettings.vue:124 msgid "Sync strategy" @@ -3463,7 +3537,7 @@ msgstr "استراتيجية المزامنة" msgid "Sync to" msgstr "مزامنة إلى" -#: src/views/site/site_edit/RightSettings.vue:86 +#: src/views/site/site_edit/RightSettings.vue:85 #: src/views/stream/components/RightSettings.vue:108 msgid "Synchronization" msgstr "مزامنة" @@ -3496,7 +3570,11 @@ msgstr "تم إعادة تشغيل Nginx بنجاح" msgid "Task not found" msgstr "غير موجود" -#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:180 +#: src/views/preference/components/ExternalNotify/telegram.ts:5 +msgid "Telegram" +msgstr "" + +#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:187 #: src/views/terminal/Terminal.vue:129 msgid "Terminal" msgstr "محطة" @@ -3767,6 +3845,7 @@ msgstr "يتطلب المصادقة الثنائية" #: src/views/certificate/CertificateList/certColumns.tsx:25 #: src/views/nginx_log/NginxLogList.vue:21 #: src/views/notification/notificationColumns.tsx:9 +#: src/views/preference/components/ExternalNotify/columns.ts:17 msgid "Type" msgstr "نوع" @@ -3783,7 +3862,7 @@ msgstr "تم التحديث بنجاح" #: src/views/config/configColumns.tsx:36 src/views/config/ConfigEditor.vue:325 #: src/views/environments/group/columns.ts:37 #: src/views/environments/list/envColumns.tsx:90 -#: src/views/site/site_edit/RightSettings.vue:76 +#: src/views/site/site_edit/RightSettings.vue:75 #: src/views/site/site_list/columns.tsx:110 #: src/views/stream/components/RightSettings.vue:99 #: src/views/stream/StreamList.vue:67 src/views/user/userColumns.tsx:54 @@ -3946,7 +4025,7 @@ msgstr "" "التشغيل. بشكل عام، لا تقم بتمكين هذا إلا إذا كنت في بيئة تطوير وتستخدم " "Pebble كسلطة شهادات." -#: src/views/site/site_edit/RightSettings.vue:92 +#: src/views/site/site_edit/RightSettings.vue:91 #, fuzzy msgid "" "When you enable/disable, delete, or save this site, the nodes set in the " @@ -4044,6 +4123,18 @@ msgstr "" msgid "Your passkeys" msgstr "مفاتيح المرور الخاصة بك" +#, fuzzy +#~ msgid "Access Token" +#~ msgstr "سجلات الدخول" + +#, fuzzy +#~ msgid "Bot Token" +#~ msgstr "رمز API" + +#, fuzzy +#~ msgid "Server URL" +#~ msgstr "معلومات الخادم" + #~ msgid "Do you want to disable this site?" #~ msgstr "هل تريد تعطيل هذا الموقع؟" diff --git a/app/src/language/de_DE/app.po b/app/src/language/de_DE/app.po index 1b569339..5c05e0c4 100644 --- a/app/src/language/de_DE/app.po +++ b/app/src/language/de_DE/app.po @@ -45,6 +45,7 @@ msgstr "Benutzername" #: src/views/nginx_log/NginxLogList.vue:53 #: src/views/notification/notificationColumns.tsx:66 #: src/views/preference/AuthSettings.vue:30 +#: src/views/preference/components/ExternalNotify/columns.ts:46 #: src/views/site/site_list/columns.tsx:117 src/views/stream/StreamList.vue:74 #: src/views/user/userColumns.tsx:60 msgid "Action" @@ -115,7 +116,7 @@ msgstr "" msgid "All" msgstr "Alle" -#: src/components/Notification/notifications.ts:137 +#: src/components/Notification/notifications.ts:175 #: src/language/constants.ts:58 msgid "All Recovery Codes Have Been Used" msgstr "" @@ -140,7 +141,7 @@ msgstr "API-Token" msgid "API Type" msgstr "API-Typ" -#: src/views/preference/Preference.vue:162 +#: src/views/preference/Preference.vue:163 #, fuzzy msgid "App" msgstr "Anwenden" @@ -204,7 +205,7 @@ msgstr "Bist du sicher, dass du diese Richtlinie löschen möchtest?" msgid "Are you sure you want to delete this item?" msgstr "Bist du sicher, dass du diese Richtlinie löschen möchtest?" -#: src/views/site/site_list/SiteList.vue:163 +#: src/views/site/site_list/SiteList.vue:167 #: src/views/stream/StreamList.vue:227 #, fuzzy msgid "Are you sure you want to delete?" @@ -257,7 +258,7 @@ msgstr "Versuche" msgid "Attempts" msgstr "Versuche" -#: src/views/preference/Preference.vue:186 +#: src/views/preference/Preference.vue:193 msgid "Auth" msgstr "Authentifizierung" @@ -342,12 +343,16 @@ msgstr "Gesperrte IPs" msgid "Banned Until" msgstr "Gesperrt bis" +#: src/views/preference/components/ExternalNotify/bark.ts:5 +msgid "Bark" +msgstr "" + #: src/views/site/site_add/SiteAdd.vue:95 msgid "Base information" msgstr "Basisinformationen" #: src/views/config/ConfigEditor.vue:290 -#: src/views/site/site_edit/RightSettings.vue:53 +#: src/views/site/site_edit/RightSettings.vue:52 #: src/views/stream/components/RightSettings.vue:79 #, fuzzy msgid "Basic" @@ -423,7 +428,7 @@ msgstr "" msgid "Cannot remove initial user" msgstr "System-Startbenutzer" -#: src/views/preference/Preference.vue:192 +#: src/views/preference/Preference.vue:199 msgid "Cert" msgstr "Zertifikat" @@ -431,11 +436,43 @@ msgstr "Zertifikat" msgid "Cert path is not under the nginx conf dir" msgstr "" +#: src/components/Notification/notifications.ts:28 +#, fuzzy +msgid "Certificate %{name} has expired" +msgstr "Konfigurationen" + +#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:36 +#: src/components/Notification/notifications.ts:40 +msgid "Certificate %{name} will expire in %{days} days" +msgstr "" + +#: src/components/Notification/notifications.ts:44 +msgid "Certificate %{name} will expire in 1 day" +msgstr "" + #: src/constants/errors/cert.ts:4 #, fuzzy msgid "Certificate decode error" msgstr "Zertifikat ist gültig" +#: src/components/Notification/notifications.ts:31 +#, fuzzy +msgid "Certificate Expiration Notice" +msgstr "Konfigurationen" + +#: src/components/Notification/notifications.ts:27 +#, fuzzy +msgid "Certificate Expired" +msgstr "Zertifikat ist gültig" + +#: src/components/Notification/notifications.ts:35 +#: src/components/Notification/notifications.ts:39 +#: src/components/Notification/notifications.ts:43 +#, fuzzy +msgid "Certificate Expiring Soon" +msgstr "Certificate has expired" + #: src/constants/errors/cert.ts:5 #, fuzzy msgid "Certificate parse error" @@ -704,6 +741,7 @@ msgstr "" #: src/views/environments/group/columns.ts:31 #: src/views/notification/notificationColumns.tsx:59 +#: src/views/preference/components/ExternalNotify/columns.ts:41 #: src/views/preference/components/Passkey.vue:95 #: src/views/user/userColumns.tsx:48 msgid "Created at" @@ -777,7 +815,7 @@ msgstr "Beschreibung" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519 #: src/views/site/ngx_conf/NgxServer.vue:110 #: src/views/site/ngx_conf/NgxUpstream.vue:128 -#: src/views/site/site_list/SiteList.vue:172 +#: src/views/site/site_list/SiteList.vue:176 #: src/views/stream/StreamList.vue:236 msgid "Delete" msgstr "Löschen" @@ -787,46 +825,46 @@ msgstr "Löschen" msgid "Delete Permanently" msgstr "Permanent löschen" -#: src/components/Notification/notifications.ts:37 src/language/constants.ts:50 +#: src/components/Notification/notifications.ts:75 src/language/constants.ts:50 #, fuzzy msgid "Delete Remote Site Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:41 src/language/constants.ts:49 +#: src/components/Notification/notifications.ts:79 src/language/constants.ts:49 #, fuzzy msgid "Delete Remote Site Success" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:95 +#: src/components/Notification/notifications.ts:133 #, fuzzy msgid "Delete Remote Stream Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:99 +#: src/components/Notification/notifications.ts:137 #, fuzzy msgid "Delete Remote Stream Success" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:38 +#: src/components/Notification/notifications.ts:76 #, fuzzy msgid "Delete site %{name} from %{node} failed" msgstr "Ausführen von %{conf_name} auf %{node_name} fehlgeschlagen" -#: src/components/Notification/notifications.ts:42 +#: src/components/Notification/notifications.ts:80 #, fuzzy msgid "Delete site %{name} from %{node} successfully" msgstr "Speichern erfolgreich" -#: src/views/site/site_list/SiteList.vue:94 +#: src/views/site/site_list/SiteList.vue:98 msgid "Delete site: %{site_name}" msgstr "Seite löschen: %{site_name}" -#: src/components/Notification/notifications.ts:96 +#: src/components/Notification/notifications.ts:134 #, fuzzy msgid "Delete stream %{name} from %{node} failed" msgstr "Ausführen von %{conf_name} auf %{node_name} fehlgeschlagen" -#: src/components/Notification/notifications.ts:100 +#: src/components/Notification/notifications.ts:138 #, fuzzy msgid "Delete stream %{name} from %{node} successfully" msgstr "Speichern erfolgreich" @@ -865,6 +903,10 @@ msgstr "Details" msgid "Development Mode" msgstr "Entwicklungsmodus" +#: src/views/preference/components/ExternalNotify/dingtalk.ts:5 +msgid "DingTalk" +msgstr "" + #: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89 msgid "Directive" msgstr "Anweisung" @@ -899,62 +941,62 @@ msgstr "Deaktiviert" msgid "Disable auto-renewal failed for %{name}" msgstr "Automatische Verlängerung deaktiviert für %{name}" -#: src/components/Notification/notifications.ts:45 src/language/constants.ts:52 +#: src/components/Notification/notifications.ts:83 src/language/constants.ts:52 #, fuzzy msgid "Disable Remote Site Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:69 +#: src/components/Notification/notifications.ts:107 #, fuzzy msgid "Disable Remote Site Maintenance Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:73 +#: src/components/Notification/notifications.ts:111 #, fuzzy msgid "Disable Remote Site Maintenance Success" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:49 src/language/constants.ts:51 +#: src/components/Notification/notifications.ts:87 src/language/constants.ts:51 #, fuzzy msgid "Disable Remote Site Success" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:103 +#: src/components/Notification/notifications.ts:141 #, fuzzy msgid "Disable Remote Stream Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:107 +#: src/components/Notification/notifications.ts:145 #, fuzzy msgid "Disable Remote Stream Success" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:46 +#: src/components/Notification/notifications.ts:84 #, fuzzy msgid "Disable site %{name} from %{node} failed" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:50 +#: src/components/Notification/notifications.ts:88 #, fuzzy msgid "Disable site %{name} from %{node} successfully" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:70 +#: src/components/Notification/notifications.ts:108 #, fuzzy msgid "Disable site %{name} maintenance on %{node} failed" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:74 +#: src/components/Notification/notifications.ts:112 #, fuzzy msgid "Disable site %{name} maintenance on %{node} successfully" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:104 +#: src/components/Notification/notifications.ts:142 #, fuzzy msgid "Disable stream %{name} from %{node} failed" msgstr "Aktivieren von %{conf_name} in %{node_name} fehlgeschlagen" -#: src/components/Notification/notifications.ts:108 +#: src/components/Notification/notifications.ts:146 #, fuzzy msgid "Disable stream %{name} from %{node} successfully" msgstr "Speichern erfolgreich" @@ -1076,7 +1118,7 @@ msgstr "" "werden." #: src/views/site/site_list/SiteDuplicate.vue:72 -#: src/views/site/site_list/SiteList.vue:158 +#: src/views/site/site_list/SiteList.vue:162 #: src/views/stream/components/StreamDuplicate.vue:64 #: src/views/stream/StreamList.vue:222 msgid "Duplicate" @@ -1149,62 +1191,62 @@ msgstr "Aktivieren fehlgeschlagen" msgid "Enable HTTPS" msgstr "Aktiviere TLS" -#: src/components/Notification/notifications.ts:53 src/language/constants.ts:54 +#: src/components/Notification/notifications.ts:91 src/language/constants.ts:54 #, fuzzy msgid "Enable Remote Site Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:61 +#: src/components/Notification/notifications.ts:99 #, fuzzy msgid "Enable Remote Site Maintenance Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:65 +#: src/components/Notification/notifications.ts:103 #, fuzzy msgid "Enable Remote Site Maintenance Success" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:57 src/language/constants.ts:53 +#: src/components/Notification/notifications.ts:95 src/language/constants.ts:53 #, fuzzy msgid "Enable Remote Site Success" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:111 +#: src/components/Notification/notifications.ts:149 #, fuzzy msgid "Enable Remote Stream Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:115 +#: src/components/Notification/notifications.ts:153 #, fuzzy msgid "Enable Remote Stream Success" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:62 +#: src/components/Notification/notifications.ts:100 #, fuzzy msgid "Enable site %{name} maintenance on %{node} failed" msgstr "Aktivieren von %{conf_name} in %{node_name} fehlgeschlagen" -#: src/components/Notification/notifications.ts:66 +#: src/components/Notification/notifications.ts:104 #, fuzzy msgid "Enable site %{name} maintenance on %{node} successfully" msgstr "Erfolgreich gespeichert" -#: src/components/Notification/notifications.ts:54 +#: src/components/Notification/notifications.ts:92 #, fuzzy msgid "Enable site %{name} on %{node} failed" msgstr "Aktivieren von %{conf_name} in %{node_name} fehlgeschlagen" -#: src/components/Notification/notifications.ts:58 +#: src/components/Notification/notifications.ts:96 #, fuzzy msgid "Enable site %{name} on %{node} successfully" msgstr "Erfolgreich gespeichert" -#: src/components/Notification/notifications.ts:112 +#: src/components/Notification/notifications.ts:150 #, fuzzy msgid "Enable stream %{name} on %{node} failed" msgstr "Aktivieren von %{conf_name} in %{node_name} fehlgeschlagen" -#: src/components/Notification/notifications.ts:116 +#: src/components/Notification/notifications.ts:154 #, fuzzy msgid "Enable stream %{name} on %{node} successfully" msgstr "Erfolgreich gespeichert" @@ -1295,6 +1337,11 @@ msgstr "Ablaufdatum: %{date}" msgid "Export" msgstr "Exportieren" +#: src/views/preference/ExternalNotify.vue:10 +#: src/views/preference/Preference.vue:169 +msgid "External Notify" +msgstr "" + #: src/views/site/cert/components/ObtainCertLive.vue:94 #, fuzzy msgid "Fail to obtain certificate" @@ -1700,7 +1747,7 @@ msgstr "Startseite" msgid "Host" msgstr "" -#: src/views/preference/Preference.vue:174 +#: src/views/preference/Preference.vue:181 msgid "HTTP" msgstr "" @@ -1764,12 +1811,12 @@ msgid "Import Certificate" msgstr "Zertifikatsstatus" #: src/views/nginx_log/NginxLogList.vue:137 -#: src/views/site/site_list/SiteList.vue:128 +#: src/views/site/site_list/SiteList.vue:132 msgid "Indexed" msgstr "" #: src/views/nginx_log/NginxLogList.vue:134 -#: src/views/site/site_list/SiteList.vue:125 +#: src/views/site/site_list/SiteList.vue:129 msgid "Indexing..." msgstr "" @@ -1854,6 +1901,11 @@ msgstr "Ungültige E-Mail!" msgid "Invalid folder name" msgstr "Ungültiger Ordnername" +#: src/constants/errors/notification.ts:3 +#, fuzzy +msgid "Invalid notifier config" +msgstr "Ungültiger 2FA- oder Wiederherstellungscode" + #: src/constants/errors/user.ts:4 #, fuzzy msgid "Invalid otp code" @@ -1919,6 +1971,19 @@ msgstr "" msgid "Key Type" msgstr "Schlüsseltyp" +#: src/views/preference/components/ExternalNotify/columns.ts:29 +msgid "Language" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark.ts:5 +msgid "Lark" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark_custom.ts:5 +#, fuzzy +msgid "Lark Custom" +msgstr "Benutzerdefiniert" + #: src/views/system/Upgrade.vue:179 msgid "Last checked at" msgstr "Zuletzt überprüft am" @@ -2024,7 +2089,7 @@ msgstr "Login erfolgreich" msgid "Logout successful" msgstr "Logout erfolgreich" -#: src/views/preference/Preference.vue:210 +#: src/views/preference/Preference.vue:217 msgid "Logrotate" msgstr "Logrotate" @@ -2074,7 +2139,7 @@ msgstr "" msgid "Manage Configs" msgstr "Verwalte Konfigurationen" -#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:121 +#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:125 msgid "Manage Sites" msgstr "Verwalte Seiten" @@ -2157,7 +2222,7 @@ msgstr "Einzelne Anweisung" #: src/views/nginx_log/NginxLogList.vue:37 #: src/views/preference/components/AddPasskey.vue:75 #: src/views/site/ngx_conf/NgxUpstream.vue:177 -#: src/views/site/site_edit/RightSettings.vue:64 +#: src/views/site/site_edit/RightSettings.vue:63 #: src/views/site/site_list/columns.tsx:17 #: src/views/site/site_list/SiteDuplicate.vue:79 #: src/views/stream/components/RightSettings.vue:87 @@ -2207,7 +2272,7 @@ msgstr "Neue Version veröffentlicht" msgid "Next" msgstr "Nächster" -#: src/views/preference/Preference.vue:198 +#: src/views/preference/Preference.vue:205 msgid "Nginx" msgstr "" @@ -2351,7 +2416,7 @@ msgstr "Name der Konfiguration" #: src/views/preference/CertSettings.vue:73 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97 #: src/views/site/ngx_conf/LocationEditor.vue:88 -#: src/views/site/site_list/SiteList.vue:161 +#: src/views/site/site_list/SiteList.vue:165 #: src/views/stream/StreamList.vue:225 msgid "No" msgstr "Nein" @@ -2366,12 +2431,12 @@ msgstr "Aktion" msgid "No records selected" msgstr "" -#: src/views/preference/Preference.vue:168 +#: src/views/preference/Preference.vue:175 #, fuzzy msgid "Node" msgstr "Benuztername" -#: src/views/site/site_edit/RightSettings.vue:67 +#: src/views/site/site_edit/RightSettings.vue:66 #: src/views/site/site_list/columns.tsx:63 #: src/views/stream/components/RightSettings.vue:90 #: src/views/stream/StreamList.vue:30 @@ -2416,7 +2481,7 @@ msgstr "Nich gültig vor: %{date}" msgid "Note" msgstr "Notiz" -#: src/views/site/site_edit/RightSettings.vue:96 +#: src/views/site/site_edit/RightSettings.vue:95 #: src/views/stream/components/RightSettings.vue:118 msgid "" "Note, if the configuration file include other configurations or " @@ -2437,6 +2502,11 @@ msgstr "Zertifikat ist gültig" msgid "Notifications" msgstr "Zertifikat ist gültig" +#: src/constants/errors/notification.ts:2 +#, fuzzy +msgid "Notifier not found" +msgstr "File Not Found" + #: src/views/site/cert/components/ObtainCert.vue:182 #, fuzzy msgid "Obtain certificate" @@ -2482,7 +2552,7 @@ msgstr "OK" #: src/views/site/ngx_conf/NgxServer.vue:79 #: src/views/site/ngx_conf/NgxUpstream.vue:33 #: src/views/site/site_edit/components/SiteStatusSegmented.vue:121 -#: src/views/site/site_list/SiteList.vue:162 +#: src/views/site/site_list/SiteList.vue:166 #: src/views/stream/components/RightSettings.vue:54 #: src/views/stream/StreamList.vue:226 #: src/views/system/Backup/BackupCreator.vue:149 @@ -2506,7 +2576,7 @@ msgstr "" msgid "Only zip files are allowed" msgstr "" -#: src/views/preference/Preference.vue:204 +#: src/views/preference/Preference.vue:211 msgid "OpenAI" msgstr "" @@ -2658,7 +2728,7 @@ msgstr "" "Anmeldeinformationen hinzu und wähle dann eine der unten aufgeführten " "Anmeldeinformationen aus, um die API des DNS-Anbieters anzufordern." -#: src/components/Notification/notifications.ts:138 +#: src/components/Notification/notifications.ts:176 #: src/language/constants.ts:59 msgid "" "Please generate new recovery codes in the preferences immediately to prevent " @@ -2756,7 +2826,7 @@ msgstr "Aktionen" msgid "Pre-release" msgstr "Vorabversion" -#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:151 +#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:152 msgid "Preference" msgstr "Einstellungen" @@ -2898,22 +2968,22 @@ msgstr "Neu laden" msgid "Reload Nginx" msgstr "Lade Nginx neu" -#: src/components/Notification/notifications.ts:144 +#: src/components/Notification/notifications.ts:10 #, fuzzy msgid "Reload Nginx on %{node} failed, response: %{resp}" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:148 +#: src/components/Notification/notifications.ts:14 #, fuzzy msgid "Reload Nginx on %{node} successfully" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:143 +#: src/components/Notification/notifications.ts:9 #, fuzzy msgid "Reload Remote Nginx Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:147 +#: src/components/Notification/notifications.ts:13 #, fuzzy msgid "Reload Remote Nginx Success" msgstr "Zertifikat ist gültig" @@ -2955,62 +3025,64 @@ msgstr "Speichern erfolgreich" msgid "Rename" msgstr "Benuztername" -#: src/components/Notification/notifications.ts:28 +#: src/components/Notification/notifications.ts:66 #, fuzzy msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:70 #, fuzzy msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:27 src/language/constants.ts:42 +#: src/components/Notification/notifications.ts:65 src/language/constants.ts:42 #, fuzzy msgid "Rename Remote Config Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:31 src/language/constants.ts:41 +#: src/components/Notification/notifications.ts:69 src/language/constants.ts:41 #, fuzzy msgid "Rename Remote Config Success" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:77 src/language/constants.ts:56 +#: src/components/Notification/notifications.ts:115 +#: src/language/constants.ts:56 #, fuzzy msgid "Rename Remote Site Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:81 src/language/constants.ts:55 +#: src/components/Notification/notifications.ts:119 +#: src/language/constants.ts:55 #, fuzzy msgid "Rename Remote Site Success" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:119 +#: src/components/Notification/notifications.ts:157 #, fuzzy msgid "Rename Remote Stream Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:123 +#: src/components/Notification/notifications.ts:161 #, fuzzy msgid "Rename Remote Stream Success" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:78 +#: src/components/Notification/notifications.ts:116 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} failed" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:82 +#: src/components/Notification/notifications.ts:120 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} successfully" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:120 +#: src/components/Notification/notifications.ts:158 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} failed" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:124 +#: src/components/Notification/notifications.ts:162 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} successfully" msgstr "Speichern erfolgreich" @@ -3076,22 +3148,22 @@ msgstr "Neustart" msgid "Restart Nginx" msgstr "Starte neu" -#: src/components/Notification/notifications.ts:152 +#: src/components/Notification/notifications.ts:18 #, fuzzy msgid "Restart Nginx on %{node} failed, response: %{resp}" msgstr "Erfolgreich gespeichert" -#: src/components/Notification/notifications.ts:156 +#: src/components/Notification/notifications.ts:22 #, fuzzy msgid "Restart Nginx on %{node} successfully" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:151 +#: src/components/Notification/notifications.ts:17 #, fuzzy msgid "Restart Remote Nginx Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:155 +#: src/components/Notification/notifications.ts:21 #, fuzzy msgid "Restart Remote Nginx Success" msgstr "Zertifikat ist gültig" @@ -3159,7 +3231,7 @@ msgstr "Arbeite" #: src/views/config/components/ConfigName.vue:59 #: src/views/config/ConfigEditor.vue:271 #: src/views/preference/components/Passkey.vue:130 -#: src/views/preference/Preference.vue:221 +#: src/views/preference/Preference.vue:228 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127 #: src/views/site/site_edit/components/ConfigName.vue:52 #: src/views/site/site_edit/SiteEdit.vue:292 @@ -3177,42 +3249,44 @@ msgstr "Anweisung speichern" msgid "Save error %{msg}" msgstr "Fehler beim Speichern %{msg}" -#: src/components/Notification/notifications.ts:85 src/language/constants.ts:48 +#: src/components/Notification/notifications.ts:123 +#: src/language/constants.ts:48 #, fuzzy msgid "Save Remote Site Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:89 src/language/constants.ts:47 +#: src/components/Notification/notifications.ts:127 +#: src/language/constants.ts:47 #, fuzzy msgid "Save Remote Site Success" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:127 +#: src/components/Notification/notifications.ts:165 #, fuzzy msgid "Save Remote Stream Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:131 +#: src/components/Notification/notifications.ts:169 #, fuzzy msgid "Save Remote Stream Success" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:86 +#: src/components/Notification/notifications.ts:124 #, fuzzy msgid "Save site %{name} to %{node} failed" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:90 +#: src/components/Notification/notifications.ts:128 #, fuzzy msgid "Save site %{name} to %{node} successfully" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:128 +#: src/components/Notification/notifications.ts:166 #, fuzzy msgid "Save stream %{name} to %{node} failed" msgstr "Ausführen von %{conf_name} auf %{node_name} fehlgeschlagen" -#: src/components/Notification/notifications.ts:132 +#: src/components/Notification/notifications.ts:170 #, fuzzy msgid "Save stream %{name} to %{node} successfully" msgstr "Speichern erfolgreich" @@ -3220,7 +3294,7 @@ msgstr "Speichern erfolgreich" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97 #: src/views/certificate/CertificateEditor.vue:49 -#: src/views/preference/Preference.vue:123 +#: src/views/preference/Preference.vue:124 #, fuzzy msgid "Save successfully" msgstr "Speichern erfolgreich" @@ -3273,7 +3347,7 @@ msgstr "" msgid "Send" msgstr "Senden" -#: src/views/preference/Preference.vue:156 +#: src/views/preference/Preference.vue:157 #, fuzzy msgid "Server" msgstr "Serverinformationen" @@ -3463,7 +3537,7 @@ msgstr "" #: src/views/certificate/ACMEUser.vue:65 #: src/views/certificate/CertificateList/certColumns.tsx:65 #: src/views/environments/list/envColumns.tsx:44 -#: src/views/site/site_edit/RightSettings.vue:56 +#: src/views/site/site_edit/RightSettings.vue:55 #: src/views/site/site_list/columns.tsx:80 src/views/stream/StreamList.vue:47 msgid "Status" msgstr "Status" @@ -3539,42 +3613,42 @@ msgstr "Synchronisieren" msgid "Sync Certificate" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:10 +#: src/components/Notification/notifications.ts:48 #, fuzzy msgid "Sync Certificate %{cert_name} to %{env_name} failed" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:14 +#: src/components/Notification/notifications.ts:52 #, fuzzy msgid "Sync Certificate %{cert_name} to %{env_name} successfully" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:9 src/language/constants.ts:39 +#: src/components/Notification/notifications.ts:47 src/language/constants.ts:39 #, fuzzy msgid "Sync Certificate Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:13 src/language/constants.ts:38 +#: src/components/Notification/notifications.ts:51 src/language/constants.ts:38 #, fuzzy msgid "Sync Certificate Success" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:20 +#: src/components/Notification/notifications.ts:58 #, fuzzy msgid "Sync config %{config_name} to %{env_name} failed" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:24 +#: src/components/Notification/notifications.ts:62 #, fuzzy msgid "Sync config %{config_name} to %{env_name} successfully" msgstr "Speichern erfolgreich" -#: src/components/Notification/notifications.ts:19 src/language/constants.ts:45 +#: src/components/Notification/notifications.ts:57 src/language/constants.ts:45 #, fuzzy msgid "Sync Config Error" msgstr "Zertifikat ist gültig" -#: src/components/Notification/notifications.ts:23 src/language/constants.ts:44 +#: src/components/Notification/notifications.ts:61 src/language/constants.ts:44 #, fuzzy msgid "Sync Config Success" msgstr "Zertifikat ist gültig" @@ -3584,8 +3658,8 @@ msgstr "Zertifikat ist gültig" msgid "Sync Nodes" msgstr "Synchrone Knoten" -#: src/views/site/site_edit/RightSettings.vue:102 -#: src/views/site/site_edit/RightSettings.vue:89 +#: src/views/site/site_edit/RightSettings.vue:101 +#: src/views/site/site_edit/RightSettings.vue:88 #: src/views/stream/components/RightSettings.vue:111 #: src/views/stream/components/RightSettings.vue:124 #, fuzzy @@ -3596,7 +3670,7 @@ msgstr "Zertifikat ist gültig" msgid "Sync to" msgstr "Synchronisieren mit" -#: src/views/site/site_edit/RightSettings.vue:86 +#: src/views/site/site_edit/RightSettings.vue:85 #: src/views/stream/components/RightSettings.vue:108 msgid "Synchronization" msgstr "Synchronisation" @@ -3629,7 +3703,11 @@ msgstr "Speichern erfolgreich" msgid "Task not found" msgstr "File Not Found" -#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:180 +#: src/views/preference/components/ExternalNotify/telegram.ts:5 +msgid "Telegram" +msgstr "" + +#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:187 #: src/views/terminal/Terminal.vue:129 msgid "Terminal" msgstr "Terminal" @@ -3902,6 +3980,7 @@ msgstr "Zwei-Faktor-Authentifizierung erforderlich" #: src/views/certificate/CertificateList/certColumns.tsx:25 #: src/views/nginx_log/NginxLogList.vue:21 #: src/views/notification/notificationColumns.tsx:9 +#: src/views/preference/components/ExternalNotify/columns.ts:17 msgid "Type" msgstr "Typ" @@ -3919,7 +3998,7 @@ msgstr "Speichern erfolgreich" #: src/views/config/configColumns.tsx:36 src/views/config/ConfigEditor.vue:325 #: src/views/environments/group/columns.ts:37 #: src/views/environments/list/envColumns.tsx:90 -#: src/views/site/site_edit/RightSettings.vue:76 +#: src/views/site/site_edit/RightSettings.vue:75 #: src/views/site/site_list/columns.tsx:110 #: src/views/stream/components/RightSettings.vue:99 #: src/views/stream/StreamList.vue:67 src/views/user/userColumns.tsx:54 @@ -4091,7 +4170,7 @@ msgstr "" "denn, du befindest dich in einer Entwicklerumgebung und verwendest Pebble " "als CA." -#: src/views/site/site_edit/RightSettings.vue:92 +#: src/views/site/site_edit/RightSettings.vue:91 #, fuzzy msgid "" "When you enable/disable, delete, or save this site, the nodes set in the " @@ -4191,6 +4270,18 @@ msgstr "" msgid "Your passkeys" msgstr "Deine Passkeys" +#, fuzzy +#~ msgid "Access Token" +#~ msgstr "Zugriffslog" + +#, fuzzy +#~ msgid "Bot Token" +#~ msgstr "API-Token" + +#, fuzzy +#~ msgid "Server URL" +#~ msgstr "Serverinformationen" + #, fuzzy #~ msgid "Do you want to disable this site?" #~ msgstr "Bist du sicher, dass du diese Richtlinie löschen möchtest?" diff --git a/app/src/language/en/app.po b/app/src/language/en/app.po index 763cbc5a..631d0a31 100644 --- a/app/src/language/en/app.po +++ b/app/src/language/en/app.po @@ -46,6 +46,7 @@ msgstr "Username" #: src/views/nginx_log/NginxLogList.vue:53 #: src/views/notification/notificationColumns.tsx:66 #: src/views/preference/AuthSettings.vue:30 +#: src/views/preference/components/ExternalNotify/columns.ts:46 #: src/views/site/site_list/columns.tsx:117 src/views/stream/StreamList.vue:74 #: src/views/user/userColumns.tsx:60 msgid "Action" @@ -114,7 +115,7 @@ msgstr "" msgid "All" msgstr "" -#: src/components/Notification/notifications.ts:137 +#: src/components/Notification/notifications.ts:175 #: src/language/constants.ts:58 msgid "All Recovery Codes Have Been Used" msgstr "" @@ -140,7 +141,7 @@ msgstr "" msgid "API Type" msgstr "" -#: src/views/preference/Preference.vue:162 +#: src/views/preference/Preference.vue:163 msgid "App" msgstr "" @@ -203,7 +204,7 @@ msgstr "Are you sure you want to remove this directive?" msgid "Are you sure you want to delete this item?" msgstr "Are you sure you want to remove this directive?" -#: src/views/site/site_list/SiteList.vue:163 +#: src/views/site/site_list/SiteList.vue:167 #: src/views/stream/StreamList.vue:227 #, fuzzy msgid "Are you sure you want to delete?" @@ -254,7 +255,7 @@ msgstr "" msgid "Attempts" msgstr "" -#: src/views/preference/Preference.vue:186 +#: src/views/preference/Preference.vue:193 msgid "Auth" msgstr "" @@ -339,12 +340,16 @@ msgstr "" msgid "Banned Until" msgstr "" +#: src/views/preference/components/ExternalNotify/bark.ts:5 +msgid "Bark" +msgstr "" + #: src/views/site/site_add/SiteAdd.vue:95 msgid "Base information" msgstr "Base information" #: src/views/config/ConfigEditor.vue:290 -#: src/views/site/site_edit/RightSettings.vue:53 +#: src/views/site/site_edit/RightSettings.vue:52 #: src/views/stream/components/RightSettings.vue:79 #, fuzzy msgid "Basic" @@ -417,7 +422,7 @@ msgstr "" msgid "Cannot remove initial user" msgstr "" -#: src/views/preference/Preference.vue:192 +#: src/views/preference/Preference.vue:199 msgid "Cert" msgstr "" @@ -425,11 +430,43 @@ msgstr "" msgid "Cert path is not under the nginx conf dir" msgstr "" +#: src/components/Notification/notifications.ts:28 +#, fuzzy +msgid "Certificate %{name} has expired" +msgstr "Configurations" + +#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:36 +#: src/components/Notification/notifications.ts:40 +msgid "Certificate %{name} will expire in %{days} days" +msgstr "" + +#: src/components/Notification/notifications.ts:44 +msgid "Certificate %{name} will expire in 1 day" +msgstr "" + #: src/constants/errors/cert.ts:4 #, fuzzy msgid "Certificate decode error" msgstr "Certificate is valid" +#: src/components/Notification/notifications.ts:31 +#, fuzzy +msgid "Certificate Expiration Notice" +msgstr "Configurations" + +#: src/components/Notification/notifications.ts:27 +#, fuzzy +msgid "Certificate Expired" +msgstr "Certificate is valid" + +#: src/components/Notification/notifications.ts:35 +#: src/components/Notification/notifications.ts:39 +#: src/components/Notification/notifications.ts:43 +#, fuzzy +msgid "Certificate Expiring Soon" +msgstr "Certificate has expired" + #: src/constants/errors/cert.ts:5 #, fuzzy msgid "Certificate parse error" @@ -696,6 +733,7 @@ msgstr "" #: src/views/environments/group/columns.ts:31 #: src/views/notification/notificationColumns.tsx:59 +#: src/views/preference/components/ExternalNotify/columns.ts:41 #: src/views/preference/components/Passkey.vue:95 #: src/views/user/userColumns.tsx:48 msgid "Created at" @@ -768,7 +806,7 @@ msgstr "Enable failed" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519 #: src/views/site/ngx_conf/NgxServer.vue:110 #: src/views/site/ngx_conf/NgxUpstream.vue:128 -#: src/views/site/site_list/SiteList.vue:172 +#: src/views/site/site_list/SiteList.vue:176 #: src/views/stream/StreamList.vue:236 msgid "Delete" msgstr "" @@ -778,46 +816,46 @@ msgstr "" msgid "Delete Permanently" msgstr "" -#: src/components/Notification/notifications.ts:37 src/language/constants.ts:50 +#: src/components/Notification/notifications.ts:75 src/language/constants.ts:50 #, fuzzy msgid "Delete Remote Site Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:41 src/language/constants.ts:49 +#: src/components/Notification/notifications.ts:79 src/language/constants.ts:49 #, fuzzy msgid "Delete Remote Site Success" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:95 +#: src/components/Notification/notifications.ts:133 #, fuzzy msgid "Delete Remote Stream Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:99 +#: src/components/Notification/notifications.ts:137 #, fuzzy msgid "Delete Remote Stream Success" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:38 +#: src/components/Notification/notifications.ts:76 #, fuzzy msgid "Delete site %{name} from %{node} failed" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:42 +#: src/components/Notification/notifications.ts:80 #, fuzzy msgid "Delete site %{name} from %{node} successfully" msgstr "Saved successfully" -#: src/views/site/site_list/SiteList.vue:94 +#: src/views/site/site_list/SiteList.vue:98 msgid "Delete site: %{site_name}" msgstr "" -#: src/components/Notification/notifications.ts:96 +#: src/components/Notification/notifications.ts:134 #, fuzzy msgid "Delete stream %{name} from %{node} failed" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:100 +#: src/components/Notification/notifications.ts:138 #, fuzzy msgid "Delete stream %{name} from %{node} successfully" msgstr "Saved successfully" @@ -856,6 +894,10 @@ msgstr "" msgid "Development Mode" msgstr "Development Mode" +#: src/views/preference/components/ExternalNotify/dingtalk.ts:5 +msgid "DingTalk" +msgstr "" + #: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89 msgid "Directive" msgstr "Directive" @@ -890,62 +932,62 @@ msgstr "Disabled" msgid "Disable auto-renewal failed for %{name}" msgstr "Disable auto-renewal failed for %{name}" -#: src/components/Notification/notifications.ts:45 src/language/constants.ts:52 +#: src/components/Notification/notifications.ts:83 src/language/constants.ts:52 #, fuzzy msgid "Disable Remote Site Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:69 +#: src/components/Notification/notifications.ts:107 #, fuzzy msgid "Disable Remote Site Maintenance Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:73 +#: src/components/Notification/notifications.ts:111 #, fuzzy msgid "Disable Remote Site Maintenance Success" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:49 src/language/constants.ts:51 +#: src/components/Notification/notifications.ts:87 src/language/constants.ts:51 #, fuzzy msgid "Disable Remote Site Success" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:103 +#: src/components/Notification/notifications.ts:141 #, fuzzy msgid "Disable Remote Stream Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:107 +#: src/components/Notification/notifications.ts:145 #, fuzzy msgid "Disable Remote Stream Success" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:46 +#: src/components/Notification/notifications.ts:84 #, fuzzy msgid "Disable site %{name} from %{node} failed" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:50 +#: src/components/Notification/notifications.ts:88 #, fuzzy msgid "Disable site %{name} from %{node} successfully" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:70 +#: src/components/Notification/notifications.ts:108 #, fuzzy msgid "Disable site %{name} maintenance on %{node} failed" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:74 +#: src/components/Notification/notifications.ts:112 #, fuzzy msgid "Disable site %{name} maintenance on %{node} successfully" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:104 +#: src/components/Notification/notifications.ts:142 #, fuzzy msgid "Disable stream %{name} from %{node} failed" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:108 +#: src/components/Notification/notifications.ts:146 #, fuzzy msgid "Disable stream %{name} from %{node} successfully" msgstr "Saved successfully" @@ -1061,7 +1103,7 @@ msgid "" msgstr "" #: src/views/site/site_list/SiteDuplicate.vue:72 -#: src/views/site/site_list/SiteList.vue:158 +#: src/views/site/site_list/SiteList.vue:162 #: src/views/stream/components/StreamDuplicate.vue:64 #: src/views/stream/StreamList.vue:222 #, fuzzy @@ -1135,62 +1177,62 @@ msgstr "Enable failed" msgid "Enable HTTPS" msgstr "Enable TLS" -#: src/components/Notification/notifications.ts:53 src/language/constants.ts:54 +#: src/components/Notification/notifications.ts:91 src/language/constants.ts:54 #, fuzzy msgid "Enable Remote Site Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:61 +#: src/components/Notification/notifications.ts:99 #, fuzzy msgid "Enable Remote Site Maintenance Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:65 +#: src/components/Notification/notifications.ts:103 #, fuzzy msgid "Enable Remote Site Maintenance Success" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:57 src/language/constants.ts:53 +#: src/components/Notification/notifications.ts:95 src/language/constants.ts:53 #, fuzzy msgid "Enable Remote Site Success" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:111 +#: src/components/Notification/notifications.ts:149 #, fuzzy msgid "Enable Remote Stream Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:115 +#: src/components/Notification/notifications.ts:153 #, fuzzy msgid "Enable Remote Stream Success" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:62 +#: src/components/Notification/notifications.ts:100 #, fuzzy msgid "Enable site %{name} maintenance on %{node} failed" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:66 +#: src/components/Notification/notifications.ts:104 #, fuzzy msgid "Enable site %{name} maintenance on %{node} successfully" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:54 +#: src/components/Notification/notifications.ts:92 #, fuzzy msgid "Enable site %{name} on %{node} failed" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:58 +#: src/components/Notification/notifications.ts:96 #, fuzzy msgid "Enable site %{name} on %{node} successfully" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:112 +#: src/components/Notification/notifications.ts:150 #, fuzzy msgid "Enable stream %{name} on %{node} failed" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:116 +#: src/components/Notification/notifications.ts:154 #, fuzzy msgid "Enable stream %{name} on %{node} successfully" msgstr "Saved successfully" @@ -1280,6 +1322,11 @@ msgstr "Expiration Date: %{date}" msgid "Export" msgstr "" +#: src/views/preference/ExternalNotify.vue:10 +#: src/views/preference/Preference.vue:169 +msgid "External Notify" +msgstr "" + #: src/views/site/cert/components/ObtainCertLive.vue:94 #, fuzzy msgid "Fail to obtain certificate" @@ -1688,7 +1735,7 @@ msgstr "Home" msgid "Host" msgstr "" -#: src/views/preference/Preference.vue:174 +#: src/views/preference/Preference.vue:181 msgid "HTTP" msgstr "" @@ -1745,12 +1792,12 @@ msgid "Import Certificate" msgstr "Certificate Status" #: src/views/nginx_log/NginxLogList.vue:137 -#: src/views/site/site_list/SiteList.vue:128 +#: src/views/site/site_list/SiteList.vue:132 msgid "Indexed" msgstr "" #: src/views/nginx_log/NginxLogList.vue:134 -#: src/views/site/site_list/SiteList.vue:125 +#: src/views/site/site_list/SiteList.vue:129 msgid "Indexing..." msgstr "" @@ -1838,6 +1885,11 @@ msgstr "Invalid E-mail!" msgid "Invalid folder name" msgstr "Invalid E-mail!" +#: src/constants/errors/notification.ts:3 +#, fuzzy +msgid "Invalid notifier config" +msgstr "Invalid E-mail!" + #: src/constants/errors/user.ts:4 #, fuzzy msgid "Invalid otp code" @@ -1904,6 +1956,18 @@ msgstr "" msgid "Key Type" msgstr "" +#: src/views/preference/components/ExternalNotify/columns.ts:29 +msgid "Language" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark.ts:5 +msgid "Lark" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark_custom.ts:5 +msgid "Lark Custom" +msgstr "" + #: src/views/system/Upgrade.vue:179 #, fuzzy msgid "Last checked at" @@ -2009,7 +2073,7 @@ msgstr "Login successful" msgid "Logout successful" msgstr "Logout successful" -#: src/views/preference/Preference.vue:210 +#: src/views/preference/Preference.vue:217 msgid "Logrotate" msgstr "" @@ -2052,7 +2116,7 @@ msgstr "" msgid "Manage Configs" msgstr "Manage Configs" -#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:121 +#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:125 msgid "Manage Sites" msgstr "Manage Sites" @@ -2135,7 +2199,7 @@ msgstr "Single Directive" #: src/views/nginx_log/NginxLogList.vue:37 #: src/views/preference/components/AddPasskey.vue:75 #: src/views/site/ngx_conf/NgxUpstream.vue:177 -#: src/views/site/site_edit/RightSettings.vue:64 +#: src/views/site/site_edit/RightSettings.vue:63 #: src/views/site/site_list/columns.tsx:17 #: src/views/site/site_list/SiteDuplicate.vue:79 #: src/views/stream/components/RightSettings.vue:87 @@ -2185,7 +2249,7 @@ msgstr "" msgid "Next" msgstr "Next" -#: src/views/preference/Preference.vue:198 +#: src/views/preference/Preference.vue:205 msgid "Nginx" msgstr "" @@ -2328,7 +2392,7 @@ msgstr "Configuration Name" #: src/views/preference/CertSettings.vue:73 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97 #: src/views/site/ngx_conf/LocationEditor.vue:88 -#: src/views/site/site_list/SiteList.vue:161 +#: src/views/site/site_list/SiteList.vue:165 #: src/views/stream/StreamList.vue:225 msgid "No" msgstr "No" @@ -2343,12 +2407,12 @@ msgstr "Action" msgid "No records selected" msgstr "" -#: src/views/preference/Preference.vue:168 +#: src/views/preference/Preference.vue:175 #, fuzzy msgid "Node" msgstr "Username" -#: src/views/site/site_edit/RightSettings.vue:67 +#: src/views/site/site_edit/RightSettings.vue:66 #: src/views/site/site_list/columns.tsx:63 #: src/views/stream/components/RightSettings.vue:90 #: src/views/stream/StreamList.vue:30 @@ -2394,7 +2458,7 @@ msgstr "Not Valid Before: %{date}" msgid "Note" msgstr "" -#: src/views/site/site_edit/RightSettings.vue:96 +#: src/views/site/site_edit/RightSettings.vue:95 #: src/views/stream/components/RightSettings.vue:118 msgid "" "Note, if the configuration file include other configurations or " @@ -2412,6 +2476,11 @@ msgstr "Certificate is valid" msgid "Notifications" msgstr "Certificate is valid" +#: src/constants/errors/notification.ts:2 +#, fuzzy +msgid "Notifier not found" +msgstr "File Not Found" + #: src/views/site/cert/components/ObtainCert.vue:182 #, fuzzy msgid "Obtain certificate" @@ -2456,7 +2525,7 @@ msgstr "" #: src/views/site/ngx_conf/NgxServer.vue:79 #: src/views/site/ngx_conf/NgxUpstream.vue:33 #: src/views/site/site_edit/components/SiteStatusSegmented.vue:121 -#: src/views/site/site_list/SiteList.vue:162 +#: src/views/site/site_list/SiteList.vue:166 #: src/views/stream/components/RightSettings.vue:54 #: src/views/stream/StreamList.vue:226 #: src/views/system/Backup/BackupCreator.vue:149 @@ -2479,7 +2548,7 @@ msgstr "" msgid "Only zip files are allowed" msgstr "" -#: src/views/preference/Preference.vue:204 +#: src/views/preference/Preference.vue:211 msgid "OpenAI" msgstr "" @@ -2620,7 +2689,7 @@ msgid "" "select one of the credentialsbelow to request the API of the DNS provider." msgstr "" -#: src/components/Notification/notifications.ts:138 +#: src/components/Notification/notifications.ts:176 #: src/language/constants.ts:59 msgid "" "Please generate new recovery codes in the preferences immediately to prevent " @@ -2710,7 +2779,7 @@ msgstr "Action" msgid "Pre-release" msgstr "" -#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:151 +#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:152 msgid "Preference" msgstr "" @@ -2851,22 +2920,22 @@ msgstr "" msgid "Reload Nginx" msgstr "" -#: src/components/Notification/notifications.ts:144 +#: src/components/Notification/notifications.ts:10 #, fuzzy msgid "Reload Nginx on %{node} failed, response: %{resp}" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:148 +#: src/components/Notification/notifications.ts:14 #, fuzzy msgid "Reload Nginx on %{node} successfully" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:143 +#: src/components/Notification/notifications.ts:9 #, fuzzy msgid "Reload Remote Nginx Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:147 +#: src/components/Notification/notifications.ts:13 #, fuzzy msgid "Reload Remote Nginx Success" msgstr "Certificate is valid" @@ -2908,62 +2977,64 @@ msgstr "Saved successfully" msgid "Rename" msgstr "Username" -#: src/components/Notification/notifications.ts:28 +#: src/components/Notification/notifications.ts:66 #, fuzzy msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:70 #, fuzzy msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:27 src/language/constants.ts:42 +#: src/components/Notification/notifications.ts:65 src/language/constants.ts:42 #, fuzzy msgid "Rename Remote Config Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:31 src/language/constants.ts:41 +#: src/components/Notification/notifications.ts:69 src/language/constants.ts:41 #, fuzzy msgid "Rename Remote Config Success" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:77 src/language/constants.ts:56 +#: src/components/Notification/notifications.ts:115 +#: src/language/constants.ts:56 #, fuzzy msgid "Rename Remote Site Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:81 src/language/constants.ts:55 +#: src/components/Notification/notifications.ts:119 +#: src/language/constants.ts:55 #, fuzzy msgid "Rename Remote Site Success" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:119 +#: src/components/Notification/notifications.ts:157 #, fuzzy msgid "Rename Remote Stream Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:123 +#: src/components/Notification/notifications.ts:161 #, fuzzy msgid "Rename Remote Stream Success" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:78 +#: src/components/Notification/notifications.ts:116 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} failed" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:82 +#: src/components/Notification/notifications.ts:120 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} successfully" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:120 +#: src/components/Notification/notifications.ts:158 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} failed" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:124 +#: src/components/Notification/notifications.ts:162 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} successfully" msgstr "Saved successfully" @@ -3028,22 +3099,22 @@ msgstr "" msgid "Restart Nginx" msgstr "" -#: src/components/Notification/notifications.ts:152 +#: src/components/Notification/notifications.ts:18 #, fuzzy msgid "Restart Nginx on %{node} failed, response: %{resp}" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:156 +#: src/components/Notification/notifications.ts:22 #, fuzzy msgid "Restart Nginx on %{node} successfully" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:151 +#: src/components/Notification/notifications.ts:17 #, fuzzy msgid "Restart Remote Nginx Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:155 +#: src/components/Notification/notifications.ts:21 #, fuzzy msgid "Restart Remote Nginx Success" msgstr "Certificate is valid" @@ -3111,7 +3182,7 @@ msgstr "" #: src/views/config/components/ConfigName.vue:59 #: src/views/config/ConfigEditor.vue:271 #: src/views/preference/components/Passkey.vue:130 -#: src/views/preference/Preference.vue:221 +#: src/views/preference/Preference.vue:228 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127 #: src/views/site/site_edit/components/ConfigName.vue:52 #: src/views/site/site_edit/SiteEdit.vue:292 @@ -3129,42 +3200,44 @@ msgstr "Save Directive" msgid "Save error %{msg}" msgstr "Save error %{msg}" -#: src/components/Notification/notifications.ts:85 src/language/constants.ts:48 +#: src/components/Notification/notifications.ts:123 +#: src/language/constants.ts:48 #, fuzzy msgid "Save Remote Site Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:89 src/language/constants.ts:47 +#: src/components/Notification/notifications.ts:127 +#: src/language/constants.ts:47 #, fuzzy msgid "Save Remote Site Success" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:127 +#: src/components/Notification/notifications.ts:165 #, fuzzy msgid "Save Remote Stream Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:131 +#: src/components/Notification/notifications.ts:169 #, fuzzy msgid "Save Remote Stream Success" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:86 +#: src/components/Notification/notifications.ts:124 #, fuzzy msgid "Save site %{name} to %{node} failed" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:90 +#: src/components/Notification/notifications.ts:128 #, fuzzy msgid "Save site %{name} to %{node} successfully" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:128 +#: src/components/Notification/notifications.ts:166 #, fuzzy msgid "Save stream %{name} to %{node} failed" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:132 +#: src/components/Notification/notifications.ts:170 #, fuzzy msgid "Save stream %{name} to %{node} successfully" msgstr "Saved successfully" @@ -3172,7 +3245,7 @@ msgstr "Saved successfully" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97 #: src/views/certificate/CertificateEditor.vue:49 -#: src/views/preference/Preference.vue:123 +#: src/views/preference/Preference.vue:124 #, fuzzy msgid "Save successfully" msgstr "Saved successfully" @@ -3225,7 +3298,7 @@ msgstr "" msgid "Send" msgstr "Send" -#: src/views/preference/Preference.vue:156 +#: src/views/preference/Preference.vue:157 #, fuzzy msgid "Server" msgstr "Server Info" @@ -3415,7 +3488,7 @@ msgstr "" #: src/views/certificate/ACMEUser.vue:65 #: src/views/certificate/CertificateList/certColumns.tsx:65 #: src/views/environments/list/envColumns.tsx:44 -#: src/views/site/site_edit/RightSettings.vue:56 +#: src/views/site/site_edit/RightSettings.vue:55 #: src/views/site/site_list/columns.tsx:80 src/views/stream/StreamList.vue:47 msgid "Status" msgstr "Status" @@ -3493,42 +3566,42 @@ msgstr "" msgid "Sync Certificate" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:10 +#: src/components/Notification/notifications.ts:48 #, fuzzy msgid "Sync Certificate %{cert_name} to %{env_name} failed" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:14 +#: src/components/Notification/notifications.ts:52 #, fuzzy msgid "Sync Certificate %{cert_name} to %{env_name} successfully" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:9 src/language/constants.ts:39 +#: src/components/Notification/notifications.ts:47 src/language/constants.ts:39 #, fuzzy msgid "Sync Certificate Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:13 src/language/constants.ts:38 +#: src/components/Notification/notifications.ts:51 src/language/constants.ts:38 #, fuzzy msgid "Sync Certificate Success" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:20 +#: src/components/Notification/notifications.ts:58 #, fuzzy msgid "Sync config %{config_name} to %{env_name} failed" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:24 +#: src/components/Notification/notifications.ts:62 #, fuzzy msgid "Sync config %{config_name} to %{env_name} successfully" msgstr "Saved successfully" -#: src/components/Notification/notifications.ts:19 src/language/constants.ts:45 +#: src/components/Notification/notifications.ts:57 src/language/constants.ts:45 #, fuzzy msgid "Sync Config Error" msgstr "Certificate is valid" -#: src/components/Notification/notifications.ts:23 src/language/constants.ts:44 +#: src/components/Notification/notifications.ts:61 src/language/constants.ts:44 #, fuzzy msgid "Sync Config Success" msgstr "Certificate is valid" @@ -3538,8 +3611,8 @@ msgstr "Certificate is valid" msgid "Sync Nodes" msgstr "" -#: src/views/site/site_edit/RightSettings.vue:102 -#: src/views/site/site_edit/RightSettings.vue:89 +#: src/views/site/site_edit/RightSettings.vue:101 +#: src/views/site/site_edit/RightSettings.vue:88 #: src/views/stream/components/RightSettings.vue:111 #: src/views/stream/components/RightSettings.vue:124 #, fuzzy @@ -3551,7 +3624,7 @@ msgstr "Certificate is valid" msgid "Sync to" msgstr "Certificate is valid" -#: src/views/site/site_edit/RightSettings.vue:86 +#: src/views/site/site_edit/RightSettings.vue:85 #: src/views/stream/components/RightSettings.vue:108 msgid "Synchronization" msgstr "" @@ -3582,7 +3655,11 @@ msgstr "Saved successfully" msgid "Task not found" msgstr "File Not Found" -#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:180 +#: src/views/preference/components/ExternalNotify/telegram.ts:5 +msgid "Telegram" +msgstr "" + +#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:187 #: src/views/terminal/Terminal.vue:129 msgid "Terminal" msgstr "Terminal" @@ -3832,6 +3909,7 @@ msgstr "" #: src/views/certificate/CertificateList/certColumns.tsx:25 #: src/views/nginx_log/NginxLogList.vue:21 #: src/views/notification/notificationColumns.tsx:9 +#: src/views/preference/components/ExternalNotify/columns.ts:17 msgid "Type" msgstr "" @@ -3849,7 +3927,7 @@ msgstr "Saved successfully" #: src/views/config/configColumns.tsx:36 src/views/config/ConfigEditor.vue:325 #: src/views/environments/group/columns.ts:37 #: src/views/environments/list/envColumns.tsx:90 -#: src/views/site/site_edit/RightSettings.vue:76 +#: src/views/site/site_edit/RightSettings.vue:75 #: src/views/site/site_list/columns.tsx:110 #: src/views/stream/components/RightSettings.vue:99 #: src/views/stream/StreamList.vue:67 src/views/user/userColumns.tsx:54 @@ -4015,7 +4093,7 @@ msgid "" "Pebble as CA." msgstr "" -#: src/views/site/site_edit/RightSettings.vue:92 +#: src/views/site/site_edit/RightSettings.vue:91 msgid "" "When you enable/disable, delete, or save this site, the nodes set in the " "Node Group and the nodes selected below will be synchronized." @@ -4108,6 +4186,14 @@ msgstr "" msgid "Your passkeys" msgstr "" +#, fuzzy +#~ msgid "Access Token" +#~ msgstr "Sites List" + +#, fuzzy +#~ msgid "Server URL" +#~ msgstr "Server Info" + #, fuzzy #~ msgid "Do you want to disable this site?" #~ msgstr "Are you sure you want to remove this directive?" diff --git a/app/src/language/es/app.po b/app/src/language/es/app.po index 22741818..4222f1ed 100644 --- a/app/src/language/es/app.po +++ b/app/src/language/es/app.po @@ -51,6 +51,7 @@ msgstr "Usuario ACME" #: src/views/nginx_log/NginxLogList.vue:53 #: src/views/notification/notificationColumns.tsx:66 #: src/views/preference/AuthSettings.vue:30 +#: src/views/preference/components/ExternalNotify/columns.ts:46 #: src/views/site/site_list/columns.tsx:117 src/views/stream/StreamList.vue:74 #: src/views/user/userColumns.tsx:60 msgid "Action" @@ -117,7 +118,7 @@ msgstr "" msgid "All" msgstr "Todo" -#: src/components/Notification/notifications.ts:137 +#: src/components/Notification/notifications.ts:175 #: src/language/constants.ts:58 msgid "All Recovery Codes Have Been Used" msgstr "" @@ -143,7 +144,7 @@ msgstr "Token de la API" msgid "API Type" msgstr "Token de la API" -#: src/views/preference/Preference.vue:162 +#: src/views/preference/Preference.vue:163 msgid "App" msgstr "" @@ -200,7 +201,7 @@ msgstr "¿Está seguro de que desea eliminar este elemento de forma permanente?" msgid "Are you sure you want to delete this item?" msgstr "¿Está seguro de que quiere borrar este elemento?" -#: src/views/site/site_list/SiteList.vue:163 +#: src/views/site/site_list/SiteList.vue:167 #: src/views/stream/StreamList.vue:227 msgid "Are you sure you want to delete?" msgstr "¿Está seguro de que quiere borrar?" @@ -248,7 +249,7 @@ msgstr "Intentos" msgid "Attempts" msgstr "Intentos" -#: src/views/preference/Preference.vue:186 +#: src/views/preference/Preference.vue:193 msgid "Auth" msgstr "Autenticación" @@ -332,12 +333,16 @@ msgstr "IPs prohibidas" msgid "Banned Until" msgstr "Bloqueado hasta" +#: src/views/preference/components/ExternalNotify/bark.ts:5 +msgid "Bark" +msgstr "" + #: src/views/site/site_add/SiteAdd.vue:95 msgid "Base information" msgstr "Información general" #: src/views/config/ConfigEditor.vue:290 -#: src/views/site/site_edit/RightSettings.vue:53 +#: src/views/site/site_edit/RightSettings.vue:52 #: src/views/stream/components/RightSettings.vue:79 msgid "Basic" msgstr "Básico" @@ -412,7 +417,7 @@ msgstr "" msgid "Cannot remove initial user" msgstr "Usuario inicial del sistema" -#: src/views/preference/Preference.vue:192 +#: src/views/preference/Preference.vue:199 msgid "Cert" msgstr "Certificado" @@ -420,11 +425,43 @@ msgstr "Certificado" msgid "Cert path is not under the nginx conf dir" msgstr "" +#: src/components/Notification/notifications.ts:28 +#, fuzzy +msgid "Certificate %{name} has expired" +msgstr "Plantillas de configuración" + +#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:36 +#: src/components/Notification/notifications.ts:40 +msgid "Certificate %{name} will expire in %{days} days" +msgstr "" + +#: src/components/Notification/notifications.ts:44 +msgid "Certificate %{name} will expire in 1 day" +msgstr "" + #: src/constants/errors/cert.ts:4 #, fuzzy msgid "Certificate decode error" msgstr "Error de Certificado de Sincronización" +#: src/components/Notification/notifications.ts:31 +#, fuzzy +msgid "Certificate Expiration Notice" +msgstr "Plantillas de configuración" + +#: src/components/Notification/notifications.ts:27 +#, fuzzy +msgid "Certificate Expired" +msgstr "Lista de Certificados" + +#: src/components/Notification/notifications.ts:35 +#: src/components/Notification/notifications.ts:39 +#: src/components/Notification/notifications.ts:43 +#, fuzzy +msgid "Certificate Expiring Soon" +msgstr "El certificado expiró" + #: src/constants/errors/cert.ts:5 #, fuzzy msgid "Certificate parse error" @@ -680,6 +717,7 @@ msgstr "" #: src/views/environments/group/columns.ts:31 #: src/views/notification/notificationColumns.tsx:59 +#: src/views/preference/components/ExternalNotify/columns.ts:41 #: src/views/preference/components/Passkey.vue:95 #: src/views/user/userColumns.tsx:48 msgid "Created at" @@ -753,7 +791,7 @@ msgstr "Descripción" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519 #: src/views/site/ngx_conf/NgxServer.vue:110 #: src/views/site/ngx_conf/NgxUpstream.vue:128 -#: src/views/site/site_list/SiteList.vue:172 +#: src/views/site/site_list/SiteList.vue:176 #: src/views/stream/StreamList.vue:236 msgid "Delete" msgstr "Eliminar" @@ -763,44 +801,44 @@ msgstr "Eliminar" msgid "Delete Permanently" msgstr "Eliminar Permanentemente" -#: src/components/Notification/notifications.ts:37 src/language/constants.ts:50 +#: src/components/Notification/notifications.ts:75 src/language/constants.ts:50 msgid "Delete Remote Site Error" msgstr "Error al eliminar sitio remoto" -#: src/components/Notification/notifications.ts:41 src/language/constants.ts:49 +#: src/components/Notification/notifications.ts:79 src/language/constants.ts:49 msgid "Delete Remote Site Success" msgstr "Borrado del sitio remoto correcto" -#: src/components/Notification/notifications.ts:95 +#: src/components/Notification/notifications.ts:133 #, fuzzy msgid "Delete Remote Stream Error" msgstr "Error al eliminar sitio remoto" -#: src/components/Notification/notifications.ts:99 +#: src/components/Notification/notifications.ts:137 #, fuzzy msgid "Delete Remote Stream Success" msgstr "Borrado del sitio remoto correcto" -#: src/components/Notification/notifications.ts:38 +#: src/components/Notification/notifications.ts:76 #, fuzzy msgid "Delete site %{name} from %{node} failed" msgstr "Falló el desplegado de %{conf_name} a %{node_name}" -#: src/components/Notification/notifications.ts:42 +#: src/components/Notification/notifications.ts:80 #, fuzzy msgid "Delete site %{name} from %{node} successfully" msgstr "Duplicado con éxito de %{conf_name} a %{node_name}" -#: src/views/site/site_list/SiteList.vue:94 +#: src/views/site/site_list/SiteList.vue:98 msgid "Delete site: %{site_name}" msgstr "Eliminar sitio: %{site_name}" -#: src/components/Notification/notifications.ts:96 +#: src/components/Notification/notifications.ts:134 #, fuzzy msgid "Delete stream %{name} from %{node} failed" msgstr "Falló el desplegado de %{conf_name} a %{node_name}" -#: src/components/Notification/notifications.ts:100 +#: src/components/Notification/notifications.ts:138 #, fuzzy msgid "Delete stream %{name} from %{node} successfully" msgstr "Duplicado con éxito de %{conf_name} a %{node_name}" @@ -838,6 +876,10 @@ msgstr "Detalles" msgid "Development Mode" msgstr "Modo de desarrollo" +#: src/views/preference/components/ExternalNotify/dingtalk.ts:5 +msgid "DingTalk" +msgstr "" + #: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89 msgid "Directive" msgstr "Directiva" @@ -871,60 +913,60 @@ msgstr "Desactivar" msgid "Disable auto-renewal failed for %{name}" msgstr "No se pudo desactivar la renovación automática por %{name}" -#: src/components/Notification/notifications.ts:45 src/language/constants.ts:52 +#: src/components/Notification/notifications.ts:83 src/language/constants.ts:52 msgid "Disable Remote Site Error" msgstr "Error al deshabilitar el sitio remoto" -#: src/components/Notification/notifications.ts:69 -#, fuzzy -msgid "Disable Remote Site Maintenance Error" -msgstr "Error al deshabilitar el sitio remoto" - -#: src/components/Notification/notifications.ts:73 -#, fuzzy -msgid "Disable Remote Site Maintenance Success" -msgstr "Deshabilitado de sitio remoto exitoso" - -#: src/components/Notification/notifications.ts:49 src/language/constants.ts:51 -msgid "Disable Remote Site Success" -msgstr "Deshabilitado de sitio remoto exitoso" - -#: src/components/Notification/notifications.ts:103 -#, fuzzy -msgid "Disable Remote Stream Error" -msgstr "Error al deshabilitar el sitio remoto" - #: src/components/Notification/notifications.ts:107 #, fuzzy +msgid "Disable Remote Site Maintenance Error" +msgstr "Error al deshabilitar el sitio remoto" + +#: src/components/Notification/notifications.ts:111 +#, fuzzy +msgid "Disable Remote Site Maintenance Success" +msgstr "Deshabilitado de sitio remoto exitoso" + +#: src/components/Notification/notifications.ts:87 src/language/constants.ts:51 +msgid "Disable Remote Site Success" +msgstr "Deshabilitado de sitio remoto exitoso" + +#: src/components/Notification/notifications.ts:141 +#, fuzzy +msgid "Disable Remote Stream Error" +msgstr "Error al deshabilitar el sitio remoto" + +#: src/components/Notification/notifications.ts:145 +#, fuzzy msgid "Disable Remote Stream Success" msgstr "Deshabilitado de sitio remoto exitoso" -#: src/components/Notification/notifications.ts:46 +#: src/components/Notification/notifications.ts:84 #, fuzzy msgid "Disable site %{name} from %{node} failed" msgstr "Habilitado exitoso de %{conf_name} en %{node_name}" -#: src/components/Notification/notifications.ts:50 +#: src/components/Notification/notifications.ts:88 #, fuzzy msgid "Disable site %{name} from %{node} successfully" msgstr "Habilitado exitoso de %{conf_name} en %{node_name}" -#: src/components/Notification/notifications.ts:70 +#: src/components/Notification/notifications.ts:108 #, fuzzy msgid "Disable site %{name} maintenance on %{node} failed" msgstr "Habilitado exitoso de %{conf_name} en %{node_name}" -#: src/components/Notification/notifications.ts:74 +#: src/components/Notification/notifications.ts:112 #, fuzzy msgid "Disable site %{name} maintenance on %{node} successfully" msgstr "Habilitado exitoso de %{conf_name} en %{node_name}" -#: src/components/Notification/notifications.ts:104 +#: src/components/Notification/notifications.ts:142 #, fuzzy msgid "Disable stream %{name} from %{node} failed" msgstr "Falló el habilitado de %{conf_name} en %{node_name}" -#: src/components/Notification/notifications.ts:108 +#: src/components/Notification/notifications.ts:146 #, fuzzy msgid "Disable stream %{name} from %{node} successfully" msgstr "Habilitado exitoso de %{conf_name} en %{node_name}" @@ -1039,7 +1081,7 @@ msgstr "" "ejecutan en el host local." #: src/views/site/site_list/SiteDuplicate.vue:72 -#: src/views/site/site_list/SiteList.vue:158 +#: src/views/site/site_list/SiteList.vue:162 #: src/views/stream/components/StreamDuplicate.vue:64 #: src/views/stream/StreamList.vue:222 msgid "Duplicate" @@ -1107,62 +1149,62 @@ msgstr "Falló la habilitación" msgid "Enable HTTPS" msgstr "Habilitar TLS" -#: src/components/Notification/notifications.ts:53 src/language/constants.ts:54 +#: src/components/Notification/notifications.ts:91 src/language/constants.ts:54 #, fuzzy msgid "Enable Remote Site Error" msgstr "Error al renombrar la configuración remota" -#: src/components/Notification/notifications.ts:61 +#: src/components/Notification/notifications.ts:99 #, fuzzy msgid "Enable Remote Site Maintenance Error" msgstr "Error al renombrar la configuración remota" -#: src/components/Notification/notifications.ts:65 +#: src/components/Notification/notifications.ts:103 #, fuzzy msgid "Enable Remote Site Maintenance Success" msgstr "Renombrar Configuración Remota Exitosa" -#: src/components/Notification/notifications.ts:57 src/language/constants.ts:53 +#: src/components/Notification/notifications.ts:95 src/language/constants.ts:53 #, fuzzy msgid "Enable Remote Site Success" msgstr "Renombrar Configuración Remota Exitosa" -#: src/components/Notification/notifications.ts:111 +#: src/components/Notification/notifications.ts:149 #, fuzzy msgid "Enable Remote Stream Error" msgstr "Error al renombrar la configuración remota" -#: src/components/Notification/notifications.ts:115 +#: src/components/Notification/notifications.ts:153 #, fuzzy msgid "Enable Remote Stream Success" msgstr "Renombrar Configuración Remota Exitosa" -#: src/components/Notification/notifications.ts:62 +#: src/components/Notification/notifications.ts:100 #, fuzzy msgid "Enable site %{name} maintenance on %{node} failed" msgstr "Falló el habilitado de %{conf_name} en %{node_name}" -#: src/components/Notification/notifications.ts:66 +#: src/components/Notification/notifications.ts:104 #, fuzzy msgid "Enable site %{name} maintenance on %{node} successfully" msgstr "Habilitado exitoso de %{conf_name} en %{node_name}" -#: src/components/Notification/notifications.ts:54 +#: src/components/Notification/notifications.ts:92 #, fuzzy msgid "Enable site %{name} on %{node} failed" msgstr "Falló el habilitado de %{conf_name} en %{node_name}" -#: src/components/Notification/notifications.ts:58 +#: src/components/Notification/notifications.ts:96 #, fuzzy msgid "Enable site %{name} on %{node} successfully" msgstr "Habilitado exitoso de %{conf_name} en %{node_name}" -#: src/components/Notification/notifications.ts:112 +#: src/components/Notification/notifications.ts:150 #, fuzzy msgid "Enable stream %{name} on %{node} failed" msgstr "Falló el habilitado de %{conf_name} en %{node_name}" -#: src/components/Notification/notifications.ts:116 +#: src/components/Notification/notifications.ts:154 #, fuzzy msgid "Enable stream %{name} on %{node} successfully" msgstr "Habilitado exitoso de %{conf_name} en %{node_name}" @@ -1251,6 +1293,11 @@ msgstr "Vencido el: %{date}" msgid "Export" msgstr "Exportar" +#: src/views/preference/ExternalNotify.vue:10 +#: src/views/preference/Preference.vue:169 +msgid "External Notify" +msgstr "" + #: src/views/site/cert/components/ObtainCertLive.vue:94 msgid "Fail to obtain certificate" msgstr "Falla al obtener el certificado" @@ -1653,7 +1700,7 @@ msgstr "Inicio" msgid "Host" msgstr "Host HTTP" -#: src/views/preference/Preference.vue:174 +#: src/views/preference/Preference.vue:181 #, fuzzy msgid "HTTP" msgstr "HTTP01" @@ -1716,12 +1763,12 @@ msgid "Import Certificate" msgstr "Importar Certificado" #: src/views/nginx_log/NginxLogList.vue:137 -#: src/views/site/site_list/SiteList.vue:128 +#: src/views/site/site_list/SiteList.vue:132 msgid "Indexed" msgstr "" #: src/views/nginx_log/NginxLogList.vue:134 -#: src/views/site/site_list/SiteList.vue:125 +#: src/views/site/site_list/SiteList.vue:129 msgid "Indexing..." msgstr "" @@ -1803,6 +1850,11 @@ msgstr "Nombre de archivo inválido" msgid "Invalid folder name" msgstr "Nombre de carpeta inválido" +#: src/constants/errors/notification.ts:3 +#, fuzzy +msgid "Invalid notifier config" +msgstr "Código 2FA o de recuperación inválido" + #: src/constants/errors/user.ts:4 #, fuzzy msgid "Invalid otp code" @@ -1865,6 +1917,19 @@ msgstr "" msgid "Key Type" msgstr "Tipo llave" +#: src/views/preference/components/ExternalNotify/columns.ts:29 +msgid "Language" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark.ts:5 +msgid "Lark" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark_custom.ts:5 +#, fuzzy +msgid "Lark Custom" +msgstr "Personalizado" + #: src/views/system/Upgrade.vue:179 msgid "Last checked at" msgstr "Comprobado por última vez el" @@ -1963,7 +2028,7 @@ msgstr "Acceso exitoso" msgid "Logout successful" msgstr "Cierre de sesión exitoso" -#: src/views/preference/Preference.vue:210 +#: src/views/preference/Preference.vue:217 msgid "Logrotate" msgstr "Rotación de logs" @@ -2012,7 +2077,7 @@ msgstr "" msgid "Manage Configs" msgstr "Administrar configuraciones" -#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:121 +#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:125 msgid "Manage Sites" msgstr "Administrar sitios" @@ -2088,7 +2153,7 @@ msgstr "Directiva multilínea" #: src/views/nginx_log/NginxLogList.vue:37 #: src/views/preference/components/AddPasskey.vue:75 #: src/views/site/ngx_conf/NgxUpstream.vue:177 -#: src/views/site/site_edit/RightSettings.vue:64 +#: src/views/site/site_edit/RightSettings.vue:63 #: src/views/site/site_list/columns.tsx:17 #: src/views/site/site_list/SiteDuplicate.vue:79 #: src/views/stream/components/RightSettings.vue:87 @@ -2136,7 +2201,7 @@ msgstr "Se liberó una nueva versión" msgid "Next" msgstr "Siguiente" -#: src/views/preference/Preference.vue:198 +#: src/views/preference/Preference.vue:205 msgid "Nginx" msgstr "Nginx" @@ -2279,7 +2344,7 @@ msgstr "Error de análisis de configuración de Nginx" #: src/views/preference/CertSettings.vue:73 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97 #: src/views/site/ngx_conf/LocationEditor.vue:88 -#: src/views/site/site_list/SiteList.vue:161 +#: src/views/site/site_list/SiteList.vue:165 #: src/views/stream/StreamList.vue:225 msgid "No" msgstr "No" @@ -2294,12 +2359,12 @@ msgstr "Acción" msgid "No records selected" msgstr "" -#: src/views/preference/Preference.vue:168 +#: src/views/preference/Preference.vue:175 #, fuzzy msgid "Node" msgstr "Nuevo nombre" -#: src/views/site/site_edit/RightSettings.vue:67 +#: src/views/site/site_edit/RightSettings.vue:66 #: src/views/site/site_list/columns.tsx:63 #: src/views/stream/components/RightSettings.vue:90 #: src/views/stream/StreamList.vue:30 @@ -2344,7 +2409,7 @@ msgstr "No válido antes: %{date}" msgid "Note" msgstr "Nota" -#: src/views/site/site_edit/RightSettings.vue:96 +#: src/views/site/site_edit/RightSettings.vue:95 #: src/views/stream/components/RightSettings.vue:118 msgid "" "Note, if the configuration file include other configurations or " @@ -2363,6 +2428,11 @@ msgstr "Notificación" msgid "Notifications" msgstr "Notificaciones" +#: src/constants/errors/notification.ts:2 +#, fuzzy +msgid "Notifier not found" +msgstr "Archivo no Encontrado" + #: src/views/site/cert/components/ObtainCert.vue:182 msgid "Obtain certificate" msgstr "Obtener certificado" @@ -2407,7 +2477,7 @@ msgstr "Ok" #: src/views/site/ngx_conf/NgxServer.vue:79 #: src/views/site/ngx_conf/NgxUpstream.vue:33 #: src/views/site/site_edit/components/SiteStatusSegmented.vue:121 -#: src/views/site/site_list/SiteList.vue:162 +#: src/views/site/site_list/SiteList.vue:166 #: src/views/stream/components/RightSettings.vue:54 #: src/views/stream/StreamList.vue:226 #: src/views/system/Backup/BackupCreator.vue:149 @@ -2430,7 +2500,7 @@ msgstr "En línea" msgid "Only zip files are allowed" msgstr "" -#: src/views/preference/Preference.vue:204 +#: src/views/preference/Preference.vue:211 msgid "OpenAI" msgstr "OpenAI" @@ -2583,7 +2653,7 @@ msgstr "" "luego seleccione una de las credenciales de aquí debajo para llamar a la API " "del proveedor de DNS." -#: src/components/Notification/notifications.ts:138 +#: src/components/Notification/notifications.ts:176 #: src/language/constants.ts:59 msgid "" "Please generate new recovery codes in the preferences immediately to prevent " @@ -2680,7 +2750,7 @@ msgstr "Acción" msgid "Pre-release" msgstr "Prelanzamiento" -#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:151 +#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:152 msgid "Preference" msgstr "Configuración" @@ -2819,22 +2889,22 @@ msgstr "Recargar" msgid "Reload Nginx" msgstr "Recargando Nginx" -#: src/components/Notification/notifications.ts:144 +#: src/components/Notification/notifications.ts:10 #, fuzzy msgid "Reload Nginx on %{node} failed, response: %{resp}" msgstr "Eliminar sitio: %{site_name}" -#: src/components/Notification/notifications.ts:148 +#: src/components/Notification/notifications.ts:14 #, fuzzy msgid "Reload Nginx on %{node} successfully" msgstr "Interfaz de usuario de Nginx actualizada en %{node} con éxito 🎉" -#: src/components/Notification/notifications.ts:143 +#: src/components/Notification/notifications.ts:9 #, fuzzy msgid "Reload Remote Nginx Error" msgstr "Error al renombrar la configuración remota" -#: src/components/Notification/notifications.ts:147 +#: src/components/Notification/notifications.ts:13 #, fuzzy msgid "Reload Remote Nginx Success" msgstr "Renombrar Configuración Remota Exitosa" @@ -2873,59 +2943,61 @@ msgstr "Eliminado con éxito" msgid "Rename" msgstr "Renombrar" -#: src/components/Notification/notifications.ts:28 +#: src/components/Notification/notifications.ts:66 #, fuzzy msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed" msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito" -#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:70 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully" msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito" -#: src/components/Notification/notifications.ts:27 src/language/constants.ts:42 +#: src/components/Notification/notifications.ts:65 src/language/constants.ts:42 msgid "Rename Remote Config Error" msgstr "Error al renombrar la configuración remota" -#: src/components/Notification/notifications.ts:31 src/language/constants.ts:41 +#: src/components/Notification/notifications.ts:69 src/language/constants.ts:41 msgid "Rename Remote Config Success" msgstr "Renombrar Configuración Remota Exitosa" -#: src/components/Notification/notifications.ts:77 src/language/constants.ts:56 +#: src/components/Notification/notifications.ts:115 +#: src/language/constants.ts:56 #, fuzzy msgid "Rename Remote Site Error" msgstr "Error al renombrar la configuración remota" -#: src/components/Notification/notifications.ts:81 src/language/constants.ts:55 +#: src/components/Notification/notifications.ts:119 +#: src/language/constants.ts:55 #, fuzzy msgid "Rename Remote Site Success" msgstr "Renombrar Configuración Remota Exitosa" -#: src/components/Notification/notifications.ts:119 +#: src/components/Notification/notifications.ts:157 #, fuzzy msgid "Rename Remote Stream Error" msgstr "Error al renombrar la configuración remota" -#: src/components/Notification/notifications.ts:123 +#: src/components/Notification/notifications.ts:161 #, fuzzy msgid "Rename Remote Stream Success" msgstr "Renombrar Configuración Remota Exitosa" -#: src/components/Notification/notifications.ts:78 +#: src/components/Notification/notifications.ts:116 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} failed" msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito" -#: src/components/Notification/notifications.ts:82 +#: src/components/Notification/notifications.ts:120 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} successfully" msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito" -#: src/components/Notification/notifications.ts:120 +#: src/components/Notification/notifications.ts:158 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} failed" msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito" -#: src/components/Notification/notifications.ts:124 +#: src/components/Notification/notifications.ts:162 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} successfully" msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito" @@ -2986,22 +3058,22 @@ msgstr "Reiniciar" msgid "Restart Nginx" msgstr "Reiniciando" -#: src/components/Notification/notifications.ts:152 +#: src/components/Notification/notifications.ts:18 #, fuzzy msgid "Restart Nginx on %{node} failed, response: %{resp}" msgstr "Habilitado exitoso de %{conf_name} en %{node_name}" -#: src/components/Notification/notifications.ts:156 +#: src/components/Notification/notifications.ts:22 #, fuzzy msgid "Restart Nginx on %{node} successfully" msgstr "Interfaz de usuario de Nginx actualizada en %{node} con éxito 🎉" -#: src/components/Notification/notifications.ts:151 +#: src/components/Notification/notifications.ts:17 #, fuzzy msgid "Restart Remote Nginx Error" msgstr "Error al renombrar la configuración remota" -#: src/components/Notification/notifications.ts:155 +#: src/components/Notification/notifications.ts:21 #, fuzzy msgid "Restart Remote Nginx Success" msgstr "Renombrar Configuración Remota Exitosa" @@ -3068,7 +3140,7 @@ msgstr "Corriendo" #: src/views/config/components/ConfigName.vue:59 #: src/views/config/ConfigEditor.vue:271 #: src/views/preference/components/Passkey.vue:130 -#: src/views/preference/Preference.vue:221 +#: src/views/preference/Preference.vue:228 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127 #: src/views/site/site_edit/components/ConfigName.vue:52 #: src/views/site/site_edit/SiteEdit.vue:292 @@ -3086,42 +3158,44 @@ msgstr "Guardar Directiva" msgid "Save error %{msg}" msgstr "Error al guardar %{msg}" -#: src/components/Notification/notifications.ts:85 src/language/constants.ts:48 +#: src/components/Notification/notifications.ts:123 +#: src/language/constants.ts:48 #, fuzzy msgid "Save Remote Site Error" msgstr "Error al renombrar la configuración remota" -#: src/components/Notification/notifications.ts:89 src/language/constants.ts:47 +#: src/components/Notification/notifications.ts:127 +#: src/language/constants.ts:47 #, fuzzy msgid "Save Remote Site Success" msgstr "Renombrar Configuración Remota Exitosa" -#: src/components/Notification/notifications.ts:127 +#: src/components/Notification/notifications.ts:165 #, fuzzy msgid "Save Remote Stream Error" msgstr "Error al renombrar la configuración remota" -#: src/components/Notification/notifications.ts:131 +#: src/components/Notification/notifications.ts:169 #, fuzzy msgid "Save Remote Stream Success" msgstr "Renombrar Configuración Remota Exitosa" -#: src/components/Notification/notifications.ts:86 +#: src/components/Notification/notifications.ts:124 #, fuzzy msgid "Save site %{name} to %{node} failed" msgstr "Duplicado con éxito de %{conf_name} a %{node_name}" -#: src/components/Notification/notifications.ts:90 +#: src/components/Notification/notifications.ts:128 #, fuzzy msgid "Save site %{name} to %{node} successfully" msgstr "Duplicado con éxito de %{conf_name} a %{node_name}" -#: src/components/Notification/notifications.ts:128 +#: src/components/Notification/notifications.ts:166 #, fuzzy msgid "Save stream %{name} to %{node} failed" msgstr "Falló el desplegado de %{conf_name} a %{node_name}" -#: src/components/Notification/notifications.ts:132 +#: src/components/Notification/notifications.ts:170 #, fuzzy msgid "Save stream %{name} to %{node} successfully" msgstr "Duplicado con éxito de %{conf_name} a %{node_name}" @@ -3129,7 +3203,7 @@ msgstr "Duplicado con éxito de %{conf_name} a %{node_name}" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97 #: src/views/certificate/CertificateEditor.vue:49 -#: src/views/preference/Preference.vue:123 +#: src/views/preference/Preference.vue:124 msgid "Save successfully" msgstr "Guardado con éxito" @@ -3182,7 +3256,7 @@ msgstr "" msgid "Send" msgstr "Enviado" -#: src/views/preference/Preference.vue:156 +#: src/views/preference/Preference.vue:157 #, fuzzy msgid "Server" msgstr "Información del servidor" @@ -3365,7 +3439,7 @@ msgstr "" #: src/views/certificate/ACMEUser.vue:65 #: src/views/certificate/CertificateList/certColumns.tsx:65 #: src/views/environments/list/envColumns.tsx:44 -#: src/views/site/site_edit/RightSettings.vue:56 +#: src/views/site/site_edit/RightSettings.vue:55 #: src/views/site/site_list/columns.tsx:80 src/views/stream/StreamList.vue:47 msgid "Status" msgstr "Estado" @@ -3441,38 +3515,38 @@ msgstr "Sincronizar" msgid "Sync Certificate" msgstr "Sincronizar Certificado" -#: src/components/Notification/notifications.ts:10 +#: src/components/Notification/notifications.ts:48 #, fuzzy msgid "Sync Certificate %{cert_name} to %{env_name} failed" msgstr "Sincronización del Certificado %{cert_name} a %{env_name} exitosa" -#: src/components/Notification/notifications.ts:14 +#: src/components/Notification/notifications.ts:52 msgid "Sync Certificate %{cert_name} to %{env_name} successfully" msgstr "Sincronización del Certificado %{cert_name} a %{env_name} exitosa" -#: src/components/Notification/notifications.ts:9 src/language/constants.ts:39 +#: src/components/Notification/notifications.ts:47 src/language/constants.ts:39 msgid "Sync Certificate Error" msgstr "Error de Certificado de Sincronización" -#: src/components/Notification/notifications.ts:13 src/language/constants.ts:38 +#: src/components/Notification/notifications.ts:51 src/language/constants.ts:38 msgid "Sync Certificate Success" msgstr "Sincronización del Certificado exitosa" -#: src/components/Notification/notifications.ts:20 +#: src/components/Notification/notifications.ts:58 #, fuzzy msgid "Sync config %{config_name} to %{env_name} failed" msgstr "Sincronizar configuración %{config_name} con %{env_name} exitosamente" -#: src/components/Notification/notifications.ts:24 +#: src/components/Notification/notifications.ts:62 #, fuzzy msgid "Sync config %{config_name} to %{env_name} successfully" msgstr "Sincronizar configuración %{config_name} con %{env_name} exitosamente" -#: src/components/Notification/notifications.ts:19 src/language/constants.ts:45 +#: src/components/Notification/notifications.ts:57 src/language/constants.ts:45 msgid "Sync Config Error" msgstr "Error de Configuración de Sincronización" -#: src/components/Notification/notifications.ts:23 src/language/constants.ts:44 +#: src/components/Notification/notifications.ts:61 src/language/constants.ts:44 msgid "Sync Config Success" msgstr "Configuración de sincronización exitosa" @@ -3482,8 +3556,8 @@ msgstr "Configuración de sincronización exitosa" msgid "Sync Nodes" msgstr "Sincronizar con" -#: src/views/site/site_edit/RightSettings.vue:102 -#: src/views/site/site_edit/RightSettings.vue:89 +#: src/views/site/site_edit/RightSettings.vue:101 +#: src/views/site/site_edit/RightSettings.vue:88 #: src/views/stream/components/RightSettings.vue:111 #: src/views/stream/components/RightSettings.vue:124 #, fuzzy @@ -3494,7 +3568,7 @@ msgstr "Sincronizar Certificado" msgid "Sync to" msgstr "Sincronizar con" -#: src/views/site/site_edit/RightSettings.vue:86 +#: src/views/site/site_edit/RightSettings.vue:85 #: src/views/stream/components/RightSettings.vue:108 msgid "Synchronization" msgstr "Sincronización" @@ -3527,7 +3601,11 @@ msgstr "Nginx reiniciado con éxito" msgid "Task not found" msgstr "Archivo no Encontrado" -#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:180 +#: src/views/preference/components/ExternalNotify/telegram.ts:5 +msgid "Telegram" +msgstr "" + +#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:187 #: src/views/terminal/Terminal.vue:129 msgid "Terminal" msgstr "Terminal" @@ -3808,6 +3886,7 @@ msgstr "Se requiere autenticación de dos factores" #: src/views/certificate/CertificateList/certColumns.tsx:25 #: src/views/nginx_log/NginxLogList.vue:21 #: src/views/notification/notificationColumns.tsx:9 +#: src/views/preference/components/ExternalNotify/columns.ts:17 msgid "Type" msgstr "Tipo" @@ -3825,7 +3904,7 @@ msgstr "Actualización exitosa" #: src/views/config/configColumns.tsx:36 src/views/config/ConfigEditor.vue:325 #: src/views/environments/group/columns.ts:37 #: src/views/environments/list/envColumns.tsx:90 -#: src/views/site/site_edit/RightSettings.vue:76 +#: src/views/site/site_edit/RightSettings.vue:75 #: src/views/site/site_list/columns.tsx:110 #: src/views/stream/components/RightSettings.vue:99 #: src/views/stream/StreamList.vue:67 src/views/user/userColumns.tsx:54 @@ -3990,7 +4069,7 @@ msgstr "" "los usuarios al iniciarse. Por lo general, no habilite esta opción a menos " "que se encuentre en un entorno de desarrollo y utilice Pebble como CA." -#: src/views/site/site_edit/RightSettings.vue:92 +#: src/views/site/site_edit/RightSettings.vue:91 #, fuzzy msgid "" "When you enable/disable, delete, or save this site, the nodes set in the " @@ -4092,6 +4171,18 @@ msgstr "" msgid "Your passkeys" msgstr "Sus llaves de acceso" +#, fuzzy +#~ msgid "Access Token" +#~ msgstr "Logs de acceso" + +#, fuzzy +#~ msgid "Bot Token" +#~ msgstr "Token" + +#, fuzzy +#~ msgid "Server URL" +#~ msgstr "Información del servidor" + #~ msgid "Do you want to disable this site?" #~ msgstr "¿Quieres deshabilitar este sitio?" @@ -4332,6 +4423,3 @@ msgstr "Sus llaves de acceso" #~ msgstr "" #~ "Si se deben configurar las expresiones regulares de API para que se " #~ "sincronicen con este entorno" - -#~ msgid "Token" -#~ msgstr "Token" diff --git a/app/src/language/fr_FR/app.po b/app/src/language/fr_FR/app.po index 93cdb41d..1991f42b 100644 --- a/app/src/language/fr_FR/app.po +++ b/app/src/language/fr_FR/app.po @@ -50,6 +50,7 @@ msgstr "Nom d'utilisateur" #: src/views/nginx_log/NginxLogList.vue:53 #: src/views/notification/notificationColumns.tsx:66 #: src/views/preference/AuthSettings.vue:30 +#: src/views/preference/components/ExternalNotify/columns.ts:46 #: src/views/site/site_list/columns.tsx:117 src/views/stream/StreamList.vue:74 #: src/views/user/userColumns.tsx:60 msgid "Action" @@ -119,7 +120,7 @@ msgstr "" msgid "All" msgstr "Tous" -#: src/components/Notification/notifications.ts:137 +#: src/components/Notification/notifications.ts:175 #: src/language/constants.ts:58 msgid "All Recovery Codes Have Been Used" msgstr "Tous les codes de récupération ont été utilisés" @@ -146,7 +147,7 @@ msgstr "Jeton d'API" msgid "API Type" msgstr "Jeton d'API" -#: src/views/preference/Preference.vue:162 +#: src/views/preference/Preference.vue:163 #, fuzzy msgid "App" msgstr "Appliquer" @@ -210,7 +211,7 @@ msgstr "Etes-vous sûr que vous voulez supprimer ?" msgid "Are you sure you want to delete this item?" msgstr "Etes-vous sûr que vous voulez supprimer ?" -#: src/views/site/site_list/SiteList.vue:163 +#: src/views/site/site_list/SiteList.vue:167 #: src/views/stream/StreamList.vue:227 msgid "Are you sure you want to delete?" msgstr "Etes-vous sûr que vous voulez supprimer ?" @@ -260,7 +261,7 @@ msgstr "Tenter de corriger" msgid "Attempts" msgstr "Tentatives" -#: src/views/preference/Preference.vue:186 +#: src/views/preference/Preference.vue:193 #, fuzzy msgid "Auth" msgstr "Autheur" @@ -345,12 +346,16 @@ msgstr "IPs bannies" msgid "Banned Until" msgstr "Banni durant" +#: src/views/preference/components/ExternalNotify/bark.ts:5 +msgid "Bark" +msgstr "" + #: src/views/site/site_add/SiteAdd.vue:95 msgid "Base information" msgstr "Information générale" #: src/views/config/ConfigEditor.vue:290 -#: src/views/site/site_edit/RightSettings.vue:53 +#: src/views/site/site_edit/RightSettings.vue:52 #: src/views/stream/components/RightSettings.vue:79 msgid "Basic" msgstr "Basique" @@ -425,7 +430,7 @@ msgstr "" msgid "Cannot remove initial user" msgstr "Impossible de retirer l'utilisateur initial" -#: src/views/preference/Preference.vue:192 +#: src/views/preference/Preference.vue:199 #, fuzzy msgid "Cert" msgstr "Auto Cert" @@ -434,11 +439,43 @@ msgstr "Auto Cert" msgid "Cert path is not under the nginx conf dir" msgstr "Le chemin du certificat n'est pas dans le dossier conf de nginx" +#: src/components/Notification/notifications.ts:28 +#, fuzzy +msgid "Certificate %{name} has expired" +msgstr "Modèles de configuration" + +#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:36 +#: src/components/Notification/notifications.ts:40 +msgid "Certificate %{name} will expire in %{days} days" +msgstr "" + +#: src/components/Notification/notifications.ts:44 +msgid "Certificate %{name} will expire in 1 day" +msgstr "" + #: src/constants/errors/cert.ts:4 #, fuzzy msgid "Certificate decode error" msgstr "Changer de certificat" +#: src/components/Notification/notifications.ts:31 +#, fuzzy +msgid "Certificate Expiration Notice" +msgstr "Modèles de configuration" + +#: src/components/Notification/notifications.ts:27 +#, fuzzy +msgid "Certificate Expired" +msgstr "Liste des certifications" + +#: src/components/Notification/notifications.ts:35 +#: src/components/Notification/notifications.ts:39 +#: src/components/Notification/notifications.ts:43 +#, fuzzy +msgid "Certificate Expiring Soon" +msgstr "Le certificat a expiré" + #: src/constants/errors/cert.ts:5 #, fuzzy msgid "Certificate parse error" @@ -708,6 +745,7 @@ msgstr "" #: src/views/environments/group/columns.ts:31 #: src/views/notification/notificationColumns.tsx:59 +#: src/views/preference/components/ExternalNotify/columns.ts:41 #: src/views/preference/components/Passkey.vue:95 #: src/views/user/userColumns.tsx:48 msgid "Created at" @@ -782,7 +820,7 @@ msgstr "Description" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519 #: src/views/site/ngx_conf/NgxServer.vue:110 #: src/views/site/ngx_conf/NgxUpstream.vue:128 -#: src/views/site/site_list/SiteList.vue:172 +#: src/views/site/site_list/SiteList.vue:176 #: src/views/stream/StreamList.vue:236 msgid "Delete" msgstr "Supprimer" @@ -792,46 +830,46 @@ msgstr "Supprimer" msgid "Delete Permanently" msgstr "Supprimer définitivement" -#: src/components/Notification/notifications.ts:37 src/language/constants.ts:50 +#: src/components/Notification/notifications.ts:75 src/language/constants.ts:50 #, fuzzy msgid "Delete Remote Site Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:41 src/language/constants.ts:49 +#: src/components/Notification/notifications.ts:79 src/language/constants.ts:49 #, fuzzy msgid "Delete Remote Site Success" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:95 +#: src/components/Notification/notifications.ts:133 #, fuzzy msgid "Delete Remote Stream Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:99 +#: src/components/Notification/notifications.ts:137 #, fuzzy msgid "Delete Remote Stream Success" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:38 +#: src/components/Notification/notifications.ts:76 #, fuzzy msgid "Delete site %{name} from %{node} failed" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:42 +#: src/components/Notification/notifications.ts:80 #, fuzzy msgid "Delete site %{name} from %{node} successfully" msgstr "Dupliqué avec succès" -#: src/views/site/site_list/SiteList.vue:94 +#: src/views/site/site_list/SiteList.vue:98 msgid "Delete site: %{site_name}" msgstr "Supprimer le site : %{site_name}" -#: src/components/Notification/notifications.ts:96 +#: src/components/Notification/notifications.ts:134 #, fuzzy msgid "Delete stream %{name} from %{node} failed" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:100 +#: src/components/Notification/notifications.ts:138 #, fuzzy msgid "Delete stream %{name} from %{node} successfully" msgstr "Dupliqué avec succès" @@ -871,6 +909,10 @@ msgstr "Détails" msgid "Development Mode" msgstr "Mode développement" +#: src/views/preference/components/ExternalNotify/dingtalk.ts:5 +msgid "DingTalk" +msgstr "" + #: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89 msgid "Directive" msgstr "Directive" @@ -906,62 +948,62 @@ msgstr "Désactivé" msgid "Disable auto-renewal failed for %{name}" msgstr "La désactivation du renouvellement automatique a échoué pour %{name}" -#: src/components/Notification/notifications.ts:45 src/language/constants.ts:52 +#: src/components/Notification/notifications.ts:83 src/language/constants.ts:52 #, fuzzy msgid "Disable Remote Site Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:69 +#: src/components/Notification/notifications.ts:107 #, fuzzy msgid "Disable Remote Site Maintenance Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:73 +#: src/components/Notification/notifications.ts:111 #, fuzzy msgid "Disable Remote Site Maintenance Success" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:49 src/language/constants.ts:51 +#: src/components/Notification/notifications.ts:87 src/language/constants.ts:51 #, fuzzy msgid "Disable Remote Site Success" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:103 +#: src/components/Notification/notifications.ts:141 #, fuzzy msgid "Disable Remote Stream Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:107 +#: src/components/Notification/notifications.ts:145 #, fuzzy msgid "Disable Remote Stream Success" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:46 +#: src/components/Notification/notifications.ts:84 #, fuzzy msgid "Disable site %{name} from %{node} failed" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:50 +#: src/components/Notification/notifications.ts:88 #, fuzzy msgid "Disable site %{name} from %{node} successfully" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:70 +#: src/components/Notification/notifications.ts:108 #, fuzzy msgid "Disable site %{name} maintenance on %{node} failed" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:74 +#: src/components/Notification/notifications.ts:112 #, fuzzy msgid "Disable site %{name} maintenance on %{node} successfully" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:104 +#: src/components/Notification/notifications.ts:142 #, fuzzy msgid "Disable stream %{name} from %{node} failed" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:108 +#: src/components/Notification/notifications.ts:146 #, fuzzy msgid "Disable stream %{name} from %{node} successfully" msgstr "Dupliqué avec succès" @@ -1082,7 +1124,7 @@ msgstr "" "exécuté sur localhost." #: src/views/site/site_list/SiteDuplicate.vue:72 -#: src/views/site/site_list/SiteList.vue:158 +#: src/views/site/site_list/SiteList.vue:162 #: src/views/stream/components/StreamDuplicate.vue:64 #: src/views/stream/StreamList.vue:222 msgid "Duplicate" @@ -1155,62 +1197,62 @@ msgstr "Échec de l'activation" msgid "Enable HTTPS" msgstr "Activer TLS" -#: src/components/Notification/notifications.ts:53 src/language/constants.ts:54 +#: src/components/Notification/notifications.ts:91 src/language/constants.ts:54 #, fuzzy msgid "Enable Remote Site Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:61 +#: src/components/Notification/notifications.ts:99 #, fuzzy msgid "Enable Remote Site Maintenance Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:65 +#: src/components/Notification/notifications.ts:103 #, fuzzy msgid "Enable Remote Site Maintenance Success" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:57 src/language/constants.ts:53 +#: src/components/Notification/notifications.ts:95 src/language/constants.ts:53 #, fuzzy msgid "Enable Remote Site Success" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:111 +#: src/components/Notification/notifications.ts:149 #, fuzzy msgid "Enable Remote Stream Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:115 +#: src/components/Notification/notifications.ts:153 #, fuzzy msgid "Enable Remote Stream Success" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:62 +#: src/components/Notification/notifications.ts:100 #, fuzzy msgid "Enable site %{name} maintenance on %{node} failed" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:66 +#: src/components/Notification/notifications.ts:104 #, fuzzy msgid "Enable site %{name} maintenance on %{node} successfully" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:54 +#: src/components/Notification/notifications.ts:92 #, fuzzy msgid "Enable site %{name} on %{node} failed" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:58 +#: src/components/Notification/notifications.ts:96 #, fuzzy msgid "Enable site %{name} on %{node} successfully" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:112 +#: src/components/Notification/notifications.ts:150 #, fuzzy msgid "Enable stream %{name} on %{node} failed" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:116 +#: src/components/Notification/notifications.ts:154 #, fuzzy msgid "Enable stream %{name} on %{node} successfully" msgstr "Dupliqué avec succès" @@ -1302,6 +1344,11 @@ msgstr "Date d'expiration : %{date}" msgid "Export" msgstr "Exporter" +#: src/views/preference/ExternalNotify.vue:10 +#: src/views/preference/Preference.vue:169 +msgid "External Notify" +msgstr "" + #: src/views/site/cert/components/ObtainCertLive.vue:94 #, fuzzy msgid "Fail to obtain certificate" @@ -1714,7 +1761,7 @@ msgstr "Menu principal" msgid "Host" msgstr "Host HTTP" -#: src/views/preference/Preference.vue:174 +#: src/views/preference/Preference.vue:181 #, fuzzy msgid "HTTP" msgstr "HTTP01" @@ -1782,12 +1829,12 @@ msgid "Import Certificate" msgstr "État du certificat" #: src/views/nginx_log/NginxLogList.vue:137 -#: src/views/site/site_list/SiteList.vue:128 +#: src/views/site/site_list/SiteList.vue:132 msgid "Indexed" msgstr "" #: src/views/nginx_log/NginxLogList.vue:134 -#: src/views/site/site_list/SiteList.vue:125 +#: src/views/site/site_list/SiteList.vue:129 msgid "Indexing..." msgstr "" @@ -1871,6 +1918,11 @@ msgstr "Nom de fichier invalide" msgid "Invalid folder name" msgstr "Nom du répertoire invalide" +#: src/constants/errors/notification.ts:3 +#, fuzzy +msgid "Invalid notifier config" +msgstr "Code otp invalide" + #: src/constants/errors/user.ts:4 msgid "Invalid otp code" msgstr "Code otp invalide" @@ -1937,6 +1989,19 @@ msgstr "" msgid "Key Type" msgstr "Type" +#: src/views/preference/components/ExternalNotify/columns.ts:29 +msgid "Language" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark.ts:5 +msgid "Lark" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark_custom.ts:5 +#, fuzzy +msgid "Lark Custom" +msgstr "Custom" + #: src/views/system/Upgrade.vue:179 msgid "Last checked at" msgstr "Dernière vérification le" @@ -2044,7 +2109,7 @@ msgstr "Connexion réussie" msgid "Logout successful" msgstr "Déconnexion réussie" -#: src/views/preference/Preference.vue:210 +#: src/views/preference/Preference.vue:217 msgid "Logrotate" msgstr "" @@ -2087,7 +2152,7 @@ msgstr "" msgid "Manage Configs" msgstr "Gérer les configurations" -#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:121 +#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:125 msgid "Manage Sites" msgstr "Gérer les sites" @@ -2168,7 +2233,7 @@ msgstr "Directive multiligne" #: src/views/nginx_log/NginxLogList.vue:37 #: src/views/preference/components/AddPasskey.vue:75 #: src/views/site/ngx_conf/NgxUpstream.vue:177 -#: src/views/site/site_edit/RightSettings.vue:64 +#: src/views/site/site_edit/RightSettings.vue:63 #: src/views/site/site_list/columns.tsx:17 #: src/views/site/site_list/SiteDuplicate.vue:79 #: src/views/stream/components/RightSettings.vue:87 @@ -2218,7 +2283,7 @@ msgstr "Nouvelle version publiée" msgid "Next" msgstr "Suivant" -#: src/views/preference/Preference.vue:198 +#: src/views/preference/Preference.vue:205 #, fuzzy msgid "Nginx" msgstr "Journal Nginx" @@ -2363,7 +2428,7 @@ msgstr "Erreur d'analyse de configuration Nginx" #: src/views/preference/CertSettings.vue:73 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97 #: src/views/site/ngx_conf/LocationEditor.vue:88 -#: src/views/site/site_list/SiteList.vue:161 +#: src/views/site/site_list/SiteList.vue:165 #: src/views/stream/StreamList.vue:225 msgid "No" msgstr "Non" @@ -2378,12 +2443,12 @@ msgstr "Action" msgid "No records selected" msgstr "" -#: src/views/preference/Preference.vue:168 +#: src/views/preference/Preference.vue:175 #, fuzzy msgid "Node" msgstr "Nom d'utilisateur" -#: src/views/site/site_edit/RightSettings.vue:67 +#: src/views/site/site_edit/RightSettings.vue:66 #: src/views/site/site_list/columns.tsx:63 #: src/views/stream/components/RightSettings.vue:90 #: src/views/stream/StreamList.vue:30 @@ -2429,7 +2494,7 @@ msgstr "Non valide avant : %{date}" msgid "Note" msgstr "Note" -#: src/views/site/site_edit/RightSettings.vue:96 +#: src/views/site/site_edit/RightSettings.vue:95 #: src/views/stream/components/RightSettings.vue:118 msgid "" "Note, if the configuration file include other configurations or " @@ -2447,6 +2512,11 @@ msgstr "Certification" msgid "Notifications" msgstr "Certification" +#: src/constants/errors/notification.ts:2 +#, fuzzy +msgid "Notifier not found" +msgstr "Fichier introuvable" + #: src/views/site/cert/components/ObtainCert.vue:182 msgid "Obtain certificate" msgstr "Obtenir un certificat" @@ -2489,7 +2559,7 @@ msgstr "" #: src/views/site/ngx_conf/NgxServer.vue:79 #: src/views/site/ngx_conf/NgxUpstream.vue:33 #: src/views/site/site_edit/components/SiteStatusSegmented.vue:121 -#: src/views/site/site_list/SiteList.vue:162 +#: src/views/site/site_list/SiteList.vue:166 #: src/views/stream/components/RightSettings.vue:54 #: src/views/stream/StreamList.vue:226 #: src/views/system/Backup/BackupCreator.vue:149 @@ -2512,7 +2582,7 @@ msgstr "" msgid "Only zip files are allowed" msgstr "" -#: src/views/preference/Preference.vue:204 +#: src/views/preference/Preference.vue:211 msgid "OpenAI" msgstr "OpenAI" @@ -2656,7 +2726,7 @@ msgstr "" "des informations d'identification ci-dessous pour demander l'API du " "fournisseur DNS." -#: src/components/Notification/notifications.ts:138 +#: src/components/Notification/notifications.ts:176 #: src/language/constants.ts:59 msgid "" "Please generate new recovery codes in the preferences immediately to prevent " @@ -2749,7 +2819,7 @@ msgstr "Action" msgid "Pre-release" msgstr "" -#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:151 +#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:152 msgid "Preference" msgstr "Préférence" @@ -2893,22 +2963,22 @@ msgstr "Recharger" msgid "Reload Nginx" msgstr "Rechargement de nginx" -#: src/components/Notification/notifications.ts:144 +#: src/components/Notification/notifications.ts:10 #, fuzzy msgid "Reload Nginx on %{node} failed, response: %{resp}" msgstr "Supprimer le site : %{site_name}" -#: src/components/Notification/notifications.ts:148 +#: src/components/Notification/notifications.ts:14 #, fuzzy msgid "Reload Nginx on %{node} successfully" msgstr "Mise à niveau réussie" -#: src/components/Notification/notifications.ts:143 +#: src/components/Notification/notifications.ts:9 #, fuzzy msgid "Reload Remote Nginx Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:147 +#: src/components/Notification/notifications.ts:13 #, fuzzy msgid "Reload Remote Nginx Success" msgstr "Changer de certificat" @@ -2950,62 +3020,64 @@ msgstr "Enregistré avec succès" msgid "Rename" msgstr "Nom d'utilisateur" -#: src/components/Notification/notifications.ts:28 +#: src/components/Notification/notifications.ts:66 #, fuzzy msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:70 #, fuzzy msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:27 src/language/constants.ts:42 +#: src/components/Notification/notifications.ts:65 src/language/constants.ts:42 #, fuzzy msgid "Rename Remote Config Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:31 src/language/constants.ts:41 +#: src/components/Notification/notifications.ts:69 src/language/constants.ts:41 #, fuzzy msgid "Rename Remote Config Success" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:77 src/language/constants.ts:56 +#: src/components/Notification/notifications.ts:115 +#: src/language/constants.ts:56 #, fuzzy msgid "Rename Remote Site Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:81 src/language/constants.ts:55 +#: src/components/Notification/notifications.ts:119 +#: src/language/constants.ts:55 #, fuzzy msgid "Rename Remote Site Success" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:119 +#: src/components/Notification/notifications.ts:157 #, fuzzy msgid "Rename Remote Stream Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:123 +#: src/components/Notification/notifications.ts:161 #, fuzzy msgid "Rename Remote Stream Success" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:78 +#: src/components/Notification/notifications.ts:116 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} failed" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:82 +#: src/components/Notification/notifications.ts:120 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} successfully" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:120 +#: src/components/Notification/notifications.ts:158 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} failed" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:124 +#: src/components/Notification/notifications.ts:162 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} successfully" msgstr "Dupliqué avec succès" @@ -3072,22 +3144,22 @@ msgstr "Redémarrer" msgid "Restart Nginx" msgstr "Redémarrage" -#: src/components/Notification/notifications.ts:152 +#: src/components/Notification/notifications.ts:18 #, fuzzy msgid "Restart Nginx on %{node} failed, response: %{resp}" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:156 +#: src/components/Notification/notifications.ts:22 #, fuzzy msgid "Restart Nginx on %{node} successfully" msgstr "Mise à niveau réussie" -#: src/components/Notification/notifications.ts:151 +#: src/components/Notification/notifications.ts:17 #, fuzzy msgid "Restart Remote Nginx Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:155 +#: src/components/Notification/notifications.ts:21 #, fuzzy msgid "Restart Remote Nginx Success" msgstr "Changer de certificat" @@ -3154,7 +3226,7 @@ msgstr "En cours d'éxécution" #: src/views/config/components/ConfigName.vue:59 #: src/views/config/ConfigEditor.vue:271 #: src/views/preference/components/Passkey.vue:130 -#: src/views/preference/Preference.vue:221 +#: src/views/preference/Preference.vue:228 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127 #: src/views/site/site_edit/components/ConfigName.vue:52 #: src/views/site/site_edit/SiteEdit.vue:292 @@ -3172,42 +3244,44 @@ msgstr "Enregistrer la directive" msgid "Save error %{msg}" msgstr "Enregistrer l'erreur %{msg}" -#: src/components/Notification/notifications.ts:85 src/language/constants.ts:48 +#: src/components/Notification/notifications.ts:123 +#: src/language/constants.ts:48 #, fuzzy msgid "Save Remote Site Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:89 src/language/constants.ts:47 +#: src/components/Notification/notifications.ts:127 +#: src/language/constants.ts:47 #, fuzzy msgid "Save Remote Site Success" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:127 +#: src/components/Notification/notifications.ts:165 #, fuzzy msgid "Save Remote Stream Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:131 +#: src/components/Notification/notifications.ts:169 #, fuzzy msgid "Save Remote Stream Success" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:86 +#: src/components/Notification/notifications.ts:124 #, fuzzy msgid "Save site %{name} to %{node} failed" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:90 +#: src/components/Notification/notifications.ts:128 #, fuzzy msgid "Save site %{name} to %{node} successfully" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:128 +#: src/components/Notification/notifications.ts:166 #, fuzzy msgid "Save stream %{name} to %{node} failed" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:132 +#: src/components/Notification/notifications.ts:170 #, fuzzy msgid "Save stream %{name} to %{node} successfully" msgstr "Dupliqué avec succès" @@ -3215,7 +3289,7 @@ msgstr "Dupliqué avec succès" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97 #: src/views/certificate/CertificateEditor.vue:49 -#: src/views/preference/Preference.vue:123 +#: src/views/preference/Preference.vue:124 msgid "Save successfully" msgstr "Sauvegarde réussie" @@ -3266,7 +3340,7 @@ msgstr "" msgid "Send" msgstr "Envoyer" -#: src/views/preference/Preference.vue:156 +#: src/views/preference/Preference.vue:157 #, fuzzy msgid "Server" msgstr "Informations sur le serveur" @@ -3455,7 +3529,7 @@ msgstr "" #: src/views/certificate/ACMEUser.vue:65 #: src/views/certificate/CertificateList/certColumns.tsx:65 #: src/views/environments/list/envColumns.tsx:44 -#: src/views/site/site_edit/RightSettings.vue:56 +#: src/views/site/site_edit/RightSettings.vue:55 #: src/views/site/site_list/columns.tsx:80 src/views/stream/StreamList.vue:47 msgid "Status" msgstr "Statut" @@ -3534,42 +3608,42 @@ msgstr "" msgid "Sync Certificate" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:10 +#: src/components/Notification/notifications.ts:48 #, fuzzy msgid "Sync Certificate %{cert_name} to %{env_name} failed" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:14 +#: src/components/Notification/notifications.ts:52 #, fuzzy msgid "Sync Certificate %{cert_name} to %{env_name} successfully" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:9 src/language/constants.ts:39 +#: src/components/Notification/notifications.ts:47 src/language/constants.ts:39 #, fuzzy msgid "Sync Certificate Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:13 src/language/constants.ts:38 +#: src/components/Notification/notifications.ts:51 src/language/constants.ts:38 #, fuzzy msgid "Sync Certificate Success" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:20 +#: src/components/Notification/notifications.ts:58 #, fuzzy msgid "Sync config %{config_name} to %{env_name} failed" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:24 +#: src/components/Notification/notifications.ts:62 #, fuzzy msgid "Sync config %{config_name} to %{env_name} successfully" msgstr "Dupliqué avec succès" -#: src/components/Notification/notifications.ts:19 src/language/constants.ts:45 +#: src/components/Notification/notifications.ts:57 src/language/constants.ts:45 #, fuzzy msgid "Sync Config Error" msgstr "Changer de certificat" -#: src/components/Notification/notifications.ts:23 src/language/constants.ts:44 +#: src/components/Notification/notifications.ts:61 src/language/constants.ts:44 #, fuzzy msgid "Sync Config Success" msgstr "Changer de certificat" @@ -3579,8 +3653,8 @@ msgstr "Changer de certificat" msgid "Sync Nodes" msgstr "" -#: src/views/site/site_edit/RightSettings.vue:102 -#: src/views/site/site_edit/RightSettings.vue:89 +#: src/views/site/site_edit/RightSettings.vue:101 +#: src/views/site/site_edit/RightSettings.vue:88 #: src/views/stream/components/RightSettings.vue:111 #: src/views/stream/components/RightSettings.vue:124 #, fuzzy @@ -3592,7 +3666,7 @@ msgstr "Changer de certificat" msgid "Sync to" msgstr "Changer de certificat" -#: src/views/site/site_edit/RightSettings.vue:86 +#: src/views/site/site_edit/RightSettings.vue:85 #: src/views/stream/components/RightSettings.vue:108 msgid "Synchronization" msgstr "" @@ -3625,7 +3699,11 @@ msgstr "Nginx a redémarré avec succès" msgid "Task not found" msgstr "Fichier introuvable" -#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:180 +#: src/views/preference/components/ExternalNotify/telegram.ts:5 +msgid "Telegram" +msgstr "" + +#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:187 #: src/views/terminal/Terminal.vue:129 msgid "Terminal" msgstr "Terminal" @@ -3882,6 +3960,7 @@ msgstr "" #: src/views/certificate/CertificateList/certColumns.tsx:25 #: src/views/nginx_log/NginxLogList.vue:21 #: src/views/notification/notificationColumns.tsx:9 +#: src/views/preference/components/ExternalNotify/columns.ts:17 msgid "Type" msgstr "Type" @@ -3899,7 +3978,7 @@ msgstr "Mis à jour avec succés" #: src/views/config/configColumns.tsx:36 src/views/config/ConfigEditor.vue:325 #: src/views/environments/group/columns.ts:37 #: src/views/environments/list/envColumns.tsx:90 -#: src/views/site/site_edit/RightSettings.vue:76 +#: src/views/site/site_edit/RightSettings.vue:75 #: src/views/site/site_list/columns.tsx:110 #: src/views/stream/components/RightSettings.vue:99 #: src/views/stream/StreamList.vue:67 src/views/user/userColumns.tsx:54 @@ -4063,7 +4142,7 @@ msgid "" "Pebble as CA." msgstr "" -#: src/views/site/site_edit/RightSettings.vue:92 +#: src/views/site/site_edit/RightSettings.vue:91 msgid "" "When you enable/disable, delete, or save this site, the nodes set in the " "Node Group and the nodes selected below will be synchronized." @@ -4155,6 +4234,18 @@ msgstr "" msgid "Your passkeys" msgstr "" +#, fuzzy +#~ msgid "Access Token" +#~ msgstr "Journaux d'accès" + +#, fuzzy +#~ msgid "Bot Token" +#~ msgstr "Jeton d'API" + +#, fuzzy +#~ msgid "Server URL" +#~ msgstr "Informations sur le serveur" + #~ msgid "Do you want to disable this site?" #~ msgstr "Voulez-vous désactiver ce site ?" @@ -4343,10 +4434,6 @@ msgstr "" #~ msgid "Theme" #~ msgstr "Thème" -#, fuzzy -#~ msgid "Token" -#~ msgstr "Jeton d'API" - #~ msgid "Git" #~ msgstr "Git" diff --git a/app/src/language/ko_KR/app.po b/app/src/language/ko_KR/app.po index 3a3ff5ba..f0ef7a7b 100644 --- a/app/src/language/ko_KR/app.po +++ b/app/src/language/ko_KR/app.po @@ -49,6 +49,7 @@ msgstr "ACME 사용자" #: src/views/nginx_log/NginxLogList.vue:53 #: src/views/notification/notificationColumns.tsx:66 #: src/views/preference/AuthSettings.vue:30 +#: src/views/preference/components/ExternalNotify/columns.ts:46 #: src/views/site/site_list/columns.tsx:117 src/views/stream/StreamList.vue:74 #: src/views/user/userColumns.tsx:60 msgid "Action" @@ -113,7 +114,7 @@ msgstr "" msgid "All" msgstr "" -#: src/components/Notification/notifications.ts:137 +#: src/components/Notification/notifications.ts:175 #: src/language/constants.ts:58 msgid "All Recovery Codes Have Been Used" msgstr "" @@ -139,7 +140,7 @@ msgstr "API 토큰" msgid "API Type" msgstr "API 토큰" -#: src/views/preference/Preference.vue:162 +#: src/views/preference/Preference.vue:163 msgid "App" msgstr "앱" @@ -193,7 +194,7 @@ msgstr "이 항목을 영구적으로 삭제하시겠습니까?" msgid "Are you sure you want to delete this item?" msgstr "이 항목을 삭제하시겠습니까?" -#: src/views/site/site_list/SiteList.vue:163 +#: src/views/site/site_list/SiteList.vue:167 #: src/views/stream/StreamList.vue:227 msgid "Are you sure you want to delete?" msgstr "정말 삭제하시겠습니까?" @@ -238,7 +239,7 @@ msgstr "수정 시도" msgid "Attempts" msgstr "시도 횟수" -#: src/views/preference/Preference.vue:186 +#: src/views/preference/Preference.vue:193 msgid "Auth" msgstr "인증" @@ -322,12 +323,16 @@ msgstr "차단된 IP" msgid "Banned Until" msgstr "차단될 시간" +#: src/views/preference/components/ExternalNotify/bark.ts:5 +msgid "Bark" +msgstr "" + #: src/views/site/site_add/SiteAdd.vue:95 msgid "Base information" msgstr "기본 정보" #: src/views/config/ConfigEditor.vue:290 -#: src/views/site/site_edit/RightSettings.vue:53 +#: src/views/site/site_edit/RightSettings.vue:52 #: src/views/stream/components/RightSettings.vue:79 msgid "Basic" msgstr "기본" @@ -399,7 +404,7 @@ msgstr "" msgid "Cannot remove initial user" msgstr "" -#: src/views/preference/Preference.vue:192 +#: src/views/preference/Preference.vue:199 #, fuzzy msgid "Cert" msgstr "자동 인증" @@ -408,11 +413,43 @@ msgstr "자동 인증" msgid "Cert path is not under the nginx conf dir" msgstr "" +#: src/components/Notification/notifications.ts:28 +#, fuzzy +msgid "Certificate %{name} has expired" +msgstr "구성 템플릿" + +#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:36 +#: src/components/Notification/notifications.ts:40 +msgid "Certificate %{name} will expire in %{days} days" +msgstr "" + +#: src/components/Notification/notifications.ts:44 +msgid "Certificate %{name} will expire in 1 day" +msgstr "" + #: src/constants/errors/cert.ts:4 #, fuzzy msgid "Certificate decode error" msgstr "인증서 갱신 오류" +#: src/components/Notification/notifications.ts:31 +#, fuzzy +msgid "Certificate Expiration Notice" +msgstr "구성 템플릿" + +#: src/components/Notification/notifications.ts:27 +#, fuzzy +msgid "Certificate Expired" +msgstr "인증서 목록" + +#: src/components/Notification/notifications.ts:35 +#: src/components/Notification/notifications.ts:39 +#: src/components/Notification/notifications.ts:43 +#, fuzzy +msgid "Certificate Expiring Soon" +msgstr "인증서가 만료되었습니다" + #: src/constants/errors/cert.ts:5 #, fuzzy msgid "Certificate parse error" @@ -670,6 +707,7 @@ msgstr "" #: src/views/environments/group/columns.ts:31 #: src/views/notification/notificationColumns.tsx:59 +#: src/views/preference/components/ExternalNotify/columns.ts:41 #: src/views/preference/components/Passkey.vue:95 #: src/views/user/userColumns.tsx:48 msgid "Created at" @@ -742,7 +780,7 @@ msgstr "설명" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519 #: src/views/site/ngx_conf/NgxServer.vue:110 #: src/views/site/ngx_conf/NgxUpstream.vue:128 -#: src/views/site/site_list/SiteList.vue:172 +#: src/views/site/site_list/SiteList.vue:176 #: src/views/stream/StreamList.vue:236 msgid "Delete" msgstr "삭제" @@ -752,46 +790,46 @@ msgstr "삭제" msgid "Delete Permanently" msgstr "" -#: src/components/Notification/notifications.ts:37 src/language/constants.ts:50 +#: src/components/Notification/notifications.ts:75 src/language/constants.ts:50 #, fuzzy msgid "Delete Remote Site Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:41 src/language/constants.ts:49 +#: src/components/Notification/notifications.ts:79 src/language/constants.ts:49 #, fuzzy msgid "Delete Remote Site Success" msgstr "인증서 갱신 성공" -#: src/components/Notification/notifications.ts:95 +#: src/components/Notification/notifications.ts:133 #, fuzzy msgid "Delete Remote Stream Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:99 +#: src/components/Notification/notifications.ts:137 #, fuzzy msgid "Delete Remote Stream Success" msgstr "인증서 갱신 성공" -#: src/components/Notification/notifications.ts:38 +#: src/components/Notification/notifications.ts:76 #, fuzzy msgid "Delete site %{name} from %{node} failed" msgstr "%{conf_name}을(를) %{node_name}(으)로 배포 실패" -#: src/components/Notification/notifications.ts:42 +#: src/components/Notification/notifications.ts:80 #, fuzzy msgid "Delete site %{name} from %{node} successfully" msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" -#: src/views/site/site_list/SiteList.vue:94 +#: src/views/site/site_list/SiteList.vue:98 msgid "Delete site: %{site_name}" msgstr "사이트 삭제: %{site_name}" -#: src/components/Notification/notifications.ts:96 +#: src/components/Notification/notifications.ts:134 #, fuzzy msgid "Delete stream %{name} from %{node} failed" msgstr "%{conf_name}을(를) %{node_name}(으)로 배포 실패" -#: src/components/Notification/notifications.ts:100 +#: src/components/Notification/notifications.ts:138 #, fuzzy msgid "Delete stream %{name} from %{node} successfully" msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" @@ -829,6 +867,10 @@ msgstr "세부 사항" msgid "Development Mode" msgstr "개발 모드" +#: src/views/preference/components/ExternalNotify/dingtalk.ts:5 +msgid "DingTalk" +msgstr "" + #: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89 msgid "Directive" msgstr "지시문" @@ -862,62 +904,62 @@ msgstr "비활성화" msgid "Disable auto-renewal failed for %{name}" msgstr "%{name}의 자동 갱신 비활성화 실패" -#: src/components/Notification/notifications.ts:45 src/language/constants.ts:52 +#: src/components/Notification/notifications.ts:83 src/language/constants.ts:52 #, fuzzy msgid "Disable Remote Site Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:69 +#: src/components/Notification/notifications.ts:107 #, fuzzy msgid "Disable Remote Site Maintenance Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:73 +#: src/components/Notification/notifications.ts:111 #, fuzzy msgid "Disable Remote Site Maintenance Success" msgstr "인증서 갱신 성공" -#: src/components/Notification/notifications.ts:49 src/language/constants.ts:51 +#: src/components/Notification/notifications.ts:87 src/language/constants.ts:51 #, fuzzy msgid "Disable Remote Site Success" msgstr "인증서 갱신 성공" -#: src/components/Notification/notifications.ts:103 +#: src/components/Notification/notifications.ts:141 #, fuzzy msgid "Disable Remote Stream Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:107 +#: src/components/Notification/notifications.ts:145 #, fuzzy msgid "Disable Remote Stream Success" msgstr "인증서 갱신 성공" -#: src/components/Notification/notifications.ts:46 +#: src/components/Notification/notifications.ts:84 #, fuzzy msgid "Disable site %{name} from %{node} failed" msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨" -#: src/components/Notification/notifications.ts:50 +#: src/components/Notification/notifications.ts:88 #, fuzzy msgid "Disable site %{name} from %{node} successfully" msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨" -#: src/components/Notification/notifications.ts:70 +#: src/components/Notification/notifications.ts:108 #, fuzzy msgid "Disable site %{name} maintenance on %{node} failed" msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨" -#: src/components/Notification/notifications.ts:74 +#: src/components/Notification/notifications.ts:112 #, fuzzy msgid "Disable site %{name} maintenance on %{node} successfully" msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨" -#: src/components/Notification/notifications.ts:104 +#: src/components/Notification/notifications.ts:142 #, fuzzy msgid "Disable stream %{name} from %{node} failed" msgstr "%{node_name}에서 %{conf_name} 활성화 실패" -#: src/components/Notification/notifications.ts:108 +#: src/components/Notification/notifications.ts:146 #, fuzzy msgid "Disable stream %{name} from %{node} successfully" msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨" @@ -1028,7 +1070,7 @@ msgid "" msgstr "" #: src/views/site/site_list/SiteDuplicate.vue:72 -#: src/views/site/site_list/SiteList.vue:158 +#: src/views/site/site_list/SiteList.vue:162 #: src/views/stream/components/StreamDuplicate.vue:64 #: src/views/stream/StreamList.vue:222 msgid "Duplicate" @@ -1098,62 +1140,62 @@ msgstr "활성화 실패" msgid "Enable HTTPS" msgstr "TLS 활성화" -#: src/components/Notification/notifications.ts:53 src/language/constants.ts:54 +#: src/components/Notification/notifications.ts:91 src/language/constants.ts:54 #, fuzzy msgid "Enable Remote Site Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:61 +#: src/components/Notification/notifications.ts:99 #, fuzzy msgid "Enable Remote Site Maintenance Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:65 +#: src/components/Notification/notifications.ts:103 #, fuzzy msgid "Enable Remote Site Maintenance Success" msgstr "인증서 갱신 성공" -#: src/components/Notification/notifications.ts:57 src/language/constants.ts:53 +#: src/components/Notification/notifications.ts:95 src/language/constants.ts:53 #, fuzzy msgid "Enable Remote Site Success" msgstr "인증서 갱신 성공" -#: src/components/Notification/notifications.ts:111 +#: src/components/Notification/notifications.ts:149 #, fuzzy msgid "Enable Remote Stream Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:115 +#: src/components/Notification/notifications.ts:153 #, fuzzy msgid "Enable Remote Stream Success" msgstr "인증서 갱신 성공" -#: src/components/Notification/notifications.ts:62 +#: src/components/Notification/notifications.ts:100 #, fuzzy msgid "Enable site %{name} maintenance on %{node} failed" msgstr "%{node_name}에서 %{conf_name} 활성화 실패" -#: src/components/Notification/notifications.ts:66 +#: src/components/Notification/notifications.ts:104 #, fuzzy msgid "Enable site %{name} maintenance on %{node} successfully" msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨" -#: src/components/Notification/notifications.ts:54 +#: src/components/Notification/notifications.ts:92 #, fuzzy msgid "Enable site %{name} on %{node} failed" msgstr "%{node_name}에서 %{conf_name} 활성화 실패" -#: src/components/Notification/notifications.ts:58 +#: src/components/Notification/notifications.ts:96 #, fuzzy msgid "Enable site %{name} on %{node} successfully" msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨" -#: src/components/Notification/notifications.ts:112 +#: src/components/Notification/notifications.ts:150 #, fuzzy msgid "Enable stream %{name} on %{node} failed" msgstr "%{node_name}에서 %{conf_name} 활성화 실패" -#: src/components/Notification/notifications.ts:116 +#: src/components/Notification/notifications.ts:154 #, fuzzy msgid "Enable stream %{name} on %{node} successfully" msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨" @@ -1244,6 +1286,11 @@ msgstr "%{date}에 만료됨" msgid "Export" msgstr "내보내기" +#: src/views/preference/ExternalNotify.vue:10 +#: src/views/preference/Preference.vue:169 +msgid "External Notify" +msgstr "" + #: src/views/site/cert/components/ObtainCertLive.vue:94 #, fuzzy msgid "Fail to obtain certificate" @@ -1646,7 +1693,7 @@ msgstr "홈" msgid "Host" msgstr "HTTP 호스트" -#: src/views/preference/Preference.vue:174 +#: src/views/preference/Preference.vue:181 #, fuzzy msgid "HTTP" msgstr "HTTP01" @@ -1704,12 +1751,12 @@ msgid "Import Certificate" msgstr "인증서 상태" #: src/views/nginx_log/NginxLogList.vue:137 -#: src/views/site/site_list/SiteList.vue:128 +#: src/views/site/site_list/SiteList.vue:132 msgid "Indexed" msgstr "" #: src/views/nginx_log/NginxLogList.vue:134 -#: src/views/site/site_list/SiteList.vue:125 +#: src/views/site/site_list/SiteList.vue:129 msgid "Indexing..." msgstr "" @@ -1794,6 +1841,11 @@ msgstr "Invalid E-mail!" msgid "Invalid folder name" msgstr "" +#: src/constants/errors/notification.ts:3 +#, fuzzy +msgid "Invalid notifier config" +msgstr "유효함" + #: src/constants/errors/user.ts:4 #, fuzzy msgid "Invalid otp code" @@ -1857,6 +1909,19 @@ msgstr "" msgid "Key Type" msgstr "키 유형" +#: src/views/preference/components/ExternalNotify/columns.ts:29 +msgid "Language" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark.ts:5 +msgid "Lark" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark_custom.ts:5 +#, fuzzy +msgid "Lark Custom" +msgstr "사용자 정의" + #: src/views/system/Upgrade.vue:179 msgid "Last checked at" msgstr "마지막 확인 시간" @@ -1961,7 +2026,7 @@ msgstr "로그인 성공" msgid "Logout successful" msgstr "로그아웃 성공" -#: src/views/preference/Preference.vue:210 +#: src/views/preference/Preference.vue:217 msgid "Logrotate" msgstr "로그관리" @@ -2009,7 +2074,7 @@ msgstr "" msgid "Manage Configs" msgstr "구성 관리" -#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:121 +#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:125 msgid "Manage Sites" msgstr "사이트 관리" @@ -2092,7 +2157,7 @@ msgstr "단일 지시문" #: src/views/nginx_log/NginxLogList.vue:37 #: src/views/preference/components/AddPasskey.vue:75 #: src/views/site/ngx_conf/NgxUpstream.vue:177 -#: src/views/site/site_edit/RightSettings.vue:64 +#: src/views/site/site_edit/RightSettings.vue:63 #: src/views/site/site_list/columns.tsx:17 #: src/views/site/site_list/SiteDuplicate.vue:79 #: src/views/stream/components/RightSettings.vue:87 @@ -2142,7 +2207,7 @@ msgstr "새 버전 출시" msgid "Next" msgstr "다음" -#: src/views/preference/Preference.vue:198 +#: src/views/preference/Preference.vue:205 msgid "Nginx" msgstr "Nginx" @@ -2287,7 +2352,7 @@ msgstr "Nginx 구성 오류름" #: src/views/preference/CertSettings.vue:73 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97 #: src/views/site/ngx_conf/LocationEditor.vue:88 -#: src/views/site/site_list/SiteList.vue:161 +#: src/views/site/site_list/SiteList.vue:165 #: src/views/stream/StreamList.vue:225 msgid "No" msgstr "아니요" @@ -2302,12 +2367,12 @@ msgstr "작업" msgid "No records selected" msgstr "" -#: src/views/preference/Preference.vue:168 +#: src/views/preference/Preference.vue:175 #, fuzzy msgid "Node" msgstr "이름 변경" -#: src/views/site/site_edit/RightSettings.vue:67 +#: src/views/site/site_edit/RightSettings.vue:66 #: src/views/site/site_list/columns.tsx:63 #: src/views/stream/components/RightSettings.vue:90 #: src/views/stream/StreamList.vue:30 @@ -2352,7 +2417,7 @@ msgstr "유효 시작일: %{date}" msgid "Note" msgstr "참고" -#: src/views/site/site_edit/RightSettings.vue:96 +#: src/views/site/site_edit/RightSettings.vue:95 #: src/views/stream/components/RightSettings.vue:118 msgid "" "Note, if the configuration file include other configurations or " @@ -2370,6 +2435,11 @@ msgstr "알림" msgid "Notifications" msgstr "알림" +#: src/constants/errors/notification.ts:2 +#, fuzzy +msgid "Notifier not found" +msgstr "파일을 찾을 수 없음" + #: src/views/site/cert/components/ObtainCert.vue:182 #, fuzzy msgid "Obtain certificate" @@ -2413,7 +2483,7 @@ msgstr "" #: src/views/site/ngx_conf/NgxServer.vue:79 #: src/views/site/ngx_conf/NgxUpstream.vue:33 #: src/views/site/site_edit/components/SiteStatusSegmented.vue:121 -#: src/views/site/site_list/SiteList.vue:162 +#: src/views/site/site_list/SiteList.vue:166 #: src/views/stream/components/RightSettings.vue:54 #: src/views/stream/StreamList.vue:226 #: src/views/system/Backup/BackupCreator.vue:149 @@ -2436,7 +2506,7 @@ msgstr "온라인" msgid "Only zip files are allowed" msgstr "" -#: src/views/preference/Preference.vue:204 +#: src/views/preference/Preference.vue:211 msgid "OpenAI" msgstr "오픈AI" @@ -2578,7 +2648,7 @@ msgstr "" "먼저 인증서 > DNS 자격 증명에 자격 증명을 추가한 다음,DNS 제공자의 API를 요청" "하려면 아래 자격 증명 중 하나를 선택해주세요." -#: src/components/Notification/notifications.ts:138 +#: src/components/Notification/notifications.ts:176 #: src/language/constants.ts:59 msgid "" "Please generate new recovery codes in the preferences immediately to prevent " @@ -2673,7 +2743,7 @@ msgstr "작업" msgid "Pre-release" msgstr "사전 출시" -#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:151 +#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:152 msgid "Preference" msgstr "환경설정" @@ -2816,22 +2886,22 @@ msgstr "리로드" msgid "Reload Nginx" msgstr "Nginx 리로딩 중" -#: src/components/Notification/notifications.ts:144 +#: src/components/Notification/notifications.ts:10 #, fuzzy msgid "Reload Nginx on %{node} failed, response: %{resp}" msgstr "사이트 삭제: %{site_name}" -#: src/components/Notification/notifications.ts:148 +#: src/components/Notification/notifications.ts:14 #, fuzzy msgid "Reload Nginx on %{node} successfully" msgstr "성공적으로 저장되었습니다" -#: src/components/Notification/notifications.ts:143 +#: src/components/Notification/notifications.ts:9 #, fuzzy msgid "Reload Remote Nginx Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:147 +#: src/components/Notification/notifications.ts:13 #, fuzzy msgid "Reload Remote Nginx Success" msgstr "인증서 갱신 성공" @@ -2873,62 +2943,64 @@ msgstr "성공적으로 제거됨" msgid "Rename" msgstr "이름 변경" -#: src/components/Notification/notifications.ts:28 +#: src/components/Notification/notifications.ts:66 #, fuzzy msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed" msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" -#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:70 #, fuzzy msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully" msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" -#: src/components/Notification/notifications.ts:27 src/language/constants.ts:42 +#: src/components/Notification/notifications.ts:65 src/language/constants.ts:42 #, fuzzy msgid "Rename Remote Config Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:31 src/language/constants.ts:41 +#: src/components/Notification/notifications.ts:69 src/language/constants.ts:41 #, fuzzy msgid "Rename Remote Config Success" msgstr "인증서 갱신 성공" -#: src/components/Notification/notifications.ts:77 src/language/constants.ts:56 +#: src/components/Notification/notifications.ts:115 +#: src/language/constants.ts:56 #, fuzzy msgid "Rename Remote Site Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:81 src/language/constants.ts:55 +#: src/components/Notification/notifications.ts:119 +#: src/language/constants.ts:55 #, fuzzy msgid "Rename Remote Site Success" msgstr "인증서 갱신 성공" -#: src/components/Notification/notifications.ts:119 +#: src/components/Notification/notifications.ts:157 #, fuzzy msgid "Rename Remote Stream Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:123 +#: src/components/Notification/notifications.ts:161 #, fuzzy msgid "Rename Remote Stream Success" msgstr "인증서 갱신 성공" -#: src/components/Notification/notifications.ts:78 +#: src/components/Notification/notifications.ts:116 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} failed" msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" -#: src/components/Notification/notifications.ts:82 +#: src/components/Notification/notifications.ts:120 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} successfully" msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" -#: src/components/Notification/notifications.ts:120 +#: src/components/Notification/notifications.ts:158 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} failed" msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" -#: src/components/Notification/notifications.ts:124 +#: src/components/Notification/notifications.ts:162 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} successfully" msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" @@ -2995,22 +3067,22 @@ msgstr "재시작" msgid "Restart Nginx" msgstr "재시작 중" -#: src/components/Notification/notifications.ts:152 +#: src/components/Notification/notifications.ts:18 #, fuzzy msgid "Restart Nginx on %{node} failed, response: %{resp}" msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨" -#: src/components/Notification/notifications.ts:156 +#: src/components/Notification/notifications.ts:22 #, fuzzy msgid "Restart Nginx on %{node} successfully" msgstr "성공적으로 저장되었습니다" -#: src/components/Notification/notifications.ts:151 +#: src/components/Notification/notifications.ts:17 #, fuzzy msgid "Restart Remote Nginx Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:155 +#: src/components/Notification/notifications.ts:21 #, fuzzy msgid "Restart Remote Nginx Success" msgstr "인증서 갱신 성공" @@ -3078,7 +3150,7 @@ msgstr "실행 중" #: src/views/config/components/ConfigName.vue:59 #: src/views/config/ConfigEditor.vue:271 #: src/views/preference/components/Passkey.vue:130 -#: src/views/preference/Preference.vue:221 +#: src/views/preference/Preference.vue:228 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127 #: src/views/site/site_edit/components/ConfigName.vue:52 #: src/views/site/site_edit/SiteEdit.vue:292 @@ -3096,42 +3168,44 @@ msgstr "지시문 저장" msgid "Save error %{msg}" msgstr "저장 오류 %{msg}" -#: src/components/Notification/notifications.ts:85 src/language/constants.ts:48 +#: src/components/Notification/notifications.ts:123 +#: src/language/constants.ts:48 #, fuzzy msgid "Save Remote Site Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:89 src/language/constants.ts:47 +#: src/components/Notification/notifications.ts:127 +#: src/language/constants.ts:47 #, fuzzy msgid "Save Remote Site Success" msgstr "인증서 갱신 성공" -#: src/components/Notification/notifications.ts:127 +#: src/components/Notification/notifications.ts:165 #, fuzzy msgid "Save Remote Stream Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:131 +#: src/components/Notification/notifications.ts:169 #, fuzzy msgid "Save Remote Stream Success" msgstr "인증서 갱신 성공" -#: src/components/Notification/notifications.ts:86 +#: src/components/Notification/notifications.ts:124 #, fuzzy msgid "Save site %{name} to %{node} failed" msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" -#: src/components/Notification/notifications.ts:90 +#: src/components/Notification/notifications.ts:128 #, fuzzy msgid "Save site %{name} to %{node} successfully" msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" -#: src/components/Notification/notifications.ts:128 +#: src/components/Notification/notifications.ts:166 #, fuzzy msgid "Save stream %{name} to %{node} failed" msgstr "%{conf_name}을(를) %{node_name}(으)로 배포 실패" -#: src/components/Notification/notifications.ts:132 +#: src/components/Notification/notifications.ts:170 #, fuzzy msgid "Save stream %{name} to %{node} successfully" msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" @@ -3139,7 +3213,7 @@ msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97 #: src/views/certificate/CertificateEditor.vue:49 -#: src/views/preference/Preference.vue:123 +#: src/views/preference/Preference.vue:124 #, fuzzy msgid "Save successfully" msgstr "성공적으로 저장됨" @@ -3190,7 +3264,7 @@ msgstr "" msgid "Send" msgstr "보내기" -#: src/views/preference/Preference.vue:156 +#: src/views/preference/Preference.vue:157 #, fuzzy msgid "Server" msgstr "서버 정보" @@ -3377,7 +3451,7 @@ msgstr "" #: src/views/certificate/ACMEUser.vue:65 #: src/views/certificate/CertificateList/certColumns.tsx:65 #: src/views/environments/list/envColumns.tsx:44 -#: src/views/site/site_edit/RightSettings.vue:56 +#: src/views/site/site_edit/RightSettings.vue:55 #: src/views/site/site_list/columns.tsx:80 src/views/stream/StreamList.vue:47 msgid "Status" msgstr "상태" @@ -3454,42 +3528,42 @@ msgstr "" msgid "Sync Certificate" msgstr "인증서 갱신" -#: src/components/Notification/notifications.ts:10 +#: src/components/Notification/notifications.ts:48 #, fuzzy msgid "Sync Certificate %{cert_name} to %{env_name} failed" msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" -#: src/components/Notification/notifications.ts:14 +#: src/components/Notification/notifications.ts:52 #, fuzzy msgid "Sync Certificate %{cert_name} to %{env_name} successfully" msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" -#: src/components/Notification/notifications.ts:9 src/language/constants.ts:39 +#: src/components/Notification/notifications.ts:47 src/language/constants.ts:39 #, fuzzy msgid "Sync Certificate Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:13 src/language/constants.ts:38 +#: src/components/Notification/notifications.ts:51 src/language/constants.ts:38 #, fuzzy msgid "Sync Certificate Success" msgstr "인증서 갱신 성공" -#: src/components/Notification/notifications.ts:20 +#: src/components/Notification/notifications.ts:58 #, fuzzy msgid "Sync config %{config_name} to %{env_name} failed" msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" -#: src/components/Notification/notifications.ts:24 +#: src/components/Notification/notifications.ts:62 #, fuzzy msgid "Sync config %{config_name} to %{env_name} successfully" msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함" -#: src/components/Notification/notifications.ts:19 src/language/constants.ts:45 +#: src/components/Notification/notifications.ts:57 src/language/constants.ts:45 #, fuzzy msgid "Sync Config Error" msgstr "인증서 갱신 오류" -#: src/components/Notification/notifications.ts:23 src/language/constants.ts:44 +#: src/components/Notification/notifications.ts:61 src/language/constants.ts:44 #, fuzzy msgid "Sync Config Success" msgstr "인증서 갱신 성공" @@ -3499,8 +3573,8 @@ msgstr "인증서 갱신 성공" msgid "Sync Nodes" msgstr "" -#: src/views/site/site_edit/RightSettings.vue:102 -#: src/views/site/site_edit/RightSettings.vue:89 +#: src/views/site/site_edit/RightSettings.vue:101 +#: src/views/site/site_edit/RightSettings.vue:88 #: src/views/stream/components/RightSettings.vue:111 #: src/views/stream/components/RightSettings.vue:124 #, fuzzy @@ -3511,7 +3585,7 @@ msgstr "인증서 갱신" msgid "Sync to" msgstr "" -#: src/views/site/site_edit/RightSettings.vue:86 +#: src/views/site/site_edit/RightSettings.vue:85 #: src/views/stream/components/RightSettings.vue:108 msgid "Synchronization" msgstr "" @@ -3544,7 +3618,11 @@ msgstr "Nginx가 성공적으로 재시작됨" msgid "Task not found" msgstr "파일을 찾을 수 없음" -#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:180 +#: src/views/preference/components/ExternalNotify/telegram.ts:5 +msgid "Telegram" +msgstr "" + +#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:187 #: src/views/terminal/Terminal.vue:129 msgid "Terminal" msgstr "터미널" @@ -3797,6 +3875,7 @@ msgstr "" #: src/views/certificate/CertificateList/certColumns.tsx:25 #: src/views/nginx_log/NginxLogList.vue:21 #: src/views/notification/notificationColumns.tsx:9 +#: src/views/preference/components/ExternalNotify/columns.ts:17 msgid "Type" msgstr "유형" @@ -3814,7 +3893,7 @@ msgstr "성공적으로 저장되었습니다" #: src/views/config/configColumns.tsx:36 src/views/config/ConfigEditor.vue:325 #: src/views/environments/group/columns.ts:37 #: src/views/environments/list/envColumns.tsx:90 -#: src/views/site/site_edit/RightSettings.vue:76 +#: src/views/site/site_edit/RightSettings.vue:75 #: src/views/site/site_list/columns.tsx:110 #: src/views/stream/components/RightSettings.vue:99 #: src/views/stream/StreamList.vue:67 src/views/user/userColumns.tsx:54 @@ -3983,7 +4062,7 @@ msgid "" "Pebble as CA." msgstr "" -#: src/views/site/site_edit/RightSettings.vue:92 +#: src/views/site/site_edit/RightSettings.vue:91 msgid "" "When you enable/disable, delete, or save this site, the nodes set in the " "Node Group and the nodes selected below will be synchronized." @@ -4075,6 +4154,18 @@ msgstr "" msgid "Your passkeys" msgstr "" +#, fuzzy +#~ msgid "Access Token" +#~ msgstr "접근 로그" + +#, fuzzy +#~ msgid "Bot Token" +#~ msgstr "API 토큰" + +#, fuzzy +#~ msgid "Server URL" +#~ msgstr "서버 정보" + #~ msgid "Do you want to disable this site?" #~ msgstr "이 사이트를 비활성화하시겠습니까?" diff --git a/app/src/language/messages.pot b/app/src/language/messages.pot index 1bb1d54d..f559aca2 100644 --- a/app/src/language/messages.pot +++ b/app/src/language/messages.pot @@ -38,6 +38,7 @@ msgstr "" #: src/views/nginx_log/NginxLogList.vue:53 #: src/views/notification/notificationColumns.tsx:66 #: src/views/preference/AuthSettings.vue:30 +#: src/views/preference/components/ExternalNotify/columns.ts:46 #: src/views/site/site_list/columns.tsx:117 #: src/views/stream/StreamList.vue:74 #: src/views/user/userColumns.tsx:60 @@ -105,7 +106,7 @@ msgstr "" msgid "All" msgstr "" -#: src/components/Notification/notifications.ts:137 +#: src/components/Notification/notifications.ts:175 #: src/language/constants.ts:58 msgid "All Recovery Codes Have Been Used" msgstr "" @@ -130,7 +131,7 @@ msgstr "" msgid "API Type" msgstr "" -#: src/views/preference/Preference.vue:162 +#: src/views/preference/Preference.vue:163 msgid "App" msgstr "" @@ -183,7 +184,7 @@ msgstr "" msgid "Are you sure you want to delete this item?" msgstr "" -#: src/views/site/site_list/SiteList.vue:163 +#: src/views/site/site_list/SiteList.vue:167 #: src/views/stream/StreamList.vue:227 msgid "Are you sure you want to delete?" msgstr "" @@ -228,7 +229,7 @@ msgstr "" msgid "Attempts" msgstr "" -#: src/views/preference/Preference.vue:186 +#: src/views/preference/Preference.vue:193 msgid "Auth" msgstr "" @@ -311,12 +312,16 @@ msgstr "" msgid "Banned Until" msgstr "" +#: src/views/preference/components/ExternalNotify/bark.ts:5 +msgid "Bark" +msgstr "" + #: src/views/site/site_add/SiteAdd.vue:95 msgid "Base information" msgstr "" #: src/views/config/ConfigEditor.vue:290 -#: src/views/site/site_edit/RightSettings.vue:53 +#: src/views/site/site_edit/RightSettings.vue:52 #: src/views/stream/components/RightSettings.vue:79 msgid "Basic" msgstr "" @@ -386,7 +391,7 @@ msgstr "" msgid "Cannot remove initial user" msgstr "" -#: src/views/preference/Preference.vue:192 +#: src/views/preference/Preference.vue:199 msgid "Cert" msgstr "" @@ -394,10 +399,38 @@ msgstr "" msgid "Cert path is not under the nginx conf dir" msgstr "" +#: src/components/Notification/notifications.ts:28 +msgid "Certificate %{name} has expired" +msgstr "" + +#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:36 +#: src/components/Notification/notifications.ts:40 +msgid "Certificate %{name} will expire in %{days} days" +msgstr "" + +#: src/components/Notification/notifications.ts:44 +msgid "Certificate %{name} will expire in 1 day" +msgstr "" + #: src/constants/errors/cert.ts:4 msgid "Certificate decode error" msgstr "" +#: src/components/Notification/notifications.ts:31 +msgid "Certificate Expiration Notice" +msgstr "" + +#: src/components/Notification/notifications.ts:27 +msgid "Certificate Expired" +msgstr "" + +#: src/components/Notification/notifications.ts:35 +#: src/components/Notification/notifications.ts:39 +#: src/components/Notification/notifications.ts:43 +msgid "Certificate Expiring Soon" +msgstr "" + #: src/constants/errors/cert.ts:5 msgid "Certificate parse error" msgstr "" @@ -637,6 +670,7 @@ msgstr "" #: src/views/environments/group/columns.ts:31 #: src/views/notification/notificationColumns.tsx:59 +#: src/views/preference/components/ExternalNotify/columns.ts:41 #: src/views/preference/components/Passkey.vue:95 #: src/views/user/userColumns.tsx:48 msgid "Created at" @@ -706,7 +740,7 @@ msgstr "" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519 #: src/views/site/ngx_conf/NgxServer.vue:110 #: src/views/site/ngx_conf/NgxUpstream.vue:128 -#: src/views/site/site_list/SiteList.vue:172 +#: src/views/site/site_list/SiteList.vue:176 #: src/views/stream/StreamList.vue:236 msgid "Delete" msgstr "" @@ -716,41 +750,41 @@ msgstr "" msgid "Delete Permanently" msgstr "" -#: src/components/Notification/notifications.ts:37 +#: src/components/Notification/notifications.ts:75 #: src/language/constants.ts:50 msgid "Delete Remote Site Error" msgstr "" -#: src/components/Notification/notifications.ts:41 +#: src/components/Notification/notifications.ts:79 #: src/language/constants.ts:49 msgid "Delete Remote Site Success" msgstr "" -#: src/components/Notification/notifications.ts:95 +#: src/components/Notification/notifications.ts:133 msgid "Delete Remote Stream Error" msgstr "" -#: src/components/Notification/notifications.ts:99 +#: src/components/Notification/notifications.ts:137 msgid "Delete Remote Stream Success" msgstr "" -#: src/components/Notification/notifications.ts:38 +#: src/components/Notification/notifications.ts:76 msgid "Delete site %{name} from %{node} failed" msgstr "" -#: src/components/Notification/notifications.ts:42 +#: src/components/Notification/notifications.ts:80 msgid "Delete site %{name} from %{node} successfully" msgstr "" -#: src/views/site/site_list/SiteList.vue:94 +#: src/views/site/site_list/SiteList.vue:98 msgid "Delete site: %{site_name}" msgstr "" -#: src/components/Notification/notifications.ts:96 +#: src/components/Notification/notifications.ts:134 msgid "Delete stream %{name} from %{node} failed" msgstr "" -#: src/components/Notification/notifications.ts:100 +#: src/components/Notification/notifications.ts:138 msgid "Delete stream %{name} from %{node} successfully" msgstr "" @@ -788,6 +822,10 @@ msgstr "" msgid "Development Mode" msgstr "" +#: src/views/preference/components/ExternalNotify/dingtalk.ts:5 +msgid "DingTalk" +msgstr "" + #: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89 msgid "Directive" msgstr "" @@ -820,53 +858,53 @@ msgstr "" msgid "Disable auto-renewal failed for %{name}" msgstr "" -#: src/components/Notification/notifications.ts:45 +#: src/components/Notification/notifications.ts:83 #: src/language/constants.ts:52 msgid "Disable Remote Site Error" msgstr "" -#: src/components/Notification/notifications.ts:69 +#: src/components/Notification/notifications.ts:107 msgid "Disable Remote Site Maintenance Error" msgstr "" -#: src/components/Notification/notifications.ts:73 +#: src/components/Notification/notifications.ts:111 msgid "Disable Remote Site Maintenance Success" msgstr "" -#: src/components/Notification/notifications.ts:49 +#: src/components/Notification/notifications.ts:87 #: src/language/constants.ts:51 msgid "Disable Remote Site Success" msgstr "" -#: src/components/Notification/notifications.ts:103 +#: src/components/Notification/notifications.ts:141 msgid "Disable Remote Stream Error" msgstr "" -#: src/components/Notification/notifications.ts:107 +#: src/components/Notification/notifications.ts:145 msgid "Disable Remote Stream Success" msgstr "" -#: src/components/Notification/notifications.ts:46 +#: src/components/Notification/notifications.ts:84 msgid "Disable site %{name} from %{node} failed" msgstr "" -#: src/components/Notification/notifications.ts:50 +#: src/components/Notification/notifications.ts:88 msgid "Disable site %{name} from %{node} successfully" msgstr "" -#: src/components/Notification/notifications.ts:70 +#: src/components/Notification/notifications.ts:108 msgid "Disable site %{name} maintenance on %{node} failed" msgstr "" -#: src/components/Notification/notifications.ts:74 +#: src/components/Notification/notifications.ts:112 msgid "Disable site %{name} maintenance on %{node} successfully" msgstr "" -#: src/components/Notification/notifications.ts:104 +#: src/components/Notification/notifications.ts:142 msgid "Disable stream %{name} from %{node} failed" msgstr "" -#: src/components/Notification/notifications.ts:108 +#: src/components/Notification/notifications.ts:146 msgid "Disable stream %{name} from %{node} successfully" msgstr "" @@ -973,7 +1011,7 @@ msgid "Due to the security policies of some browsers, you cannot use passkeys on msgstr "" #: src/views/site/site_list/SiteDuplicate.vue:72 -#: src/views/site/site_list/SiteList.vue:158 +#: src/views/site/site_list/SiteList.vue:162 #: src/views/stream/components/StreamDuplicate.vue:64 #: src/views/stream/StreamList.vue:222 msgid "Duplicate" @@ -1039,53 +1077,53 @@ msgstr "" msgid "Enable HTTPS" msgstr "" -#: src/components/Notification/notifications.ts:53 +#: src/components/Notification/notifications.ts:91 #: src/language/constants.ts:54 msgid "Enable Remote Site Error" msgstr "" -#: src/components/Notification/notifications.ts:61 +#: src/components/Notification/notifications.ts:99 msgid "Enable Remote Site Maintenance Error" msgstr "" -#: src/components/Notification/notifications.ts:65 +#: src/components/Notification/notifications.ts:103 msgid "Enable Remote Site Maintenance Success" msgstr "" -#: src/components/Notification/notifications.ts:57 +#: src/components/Notification/notifications.ts:95 #: src/language/constants.ts:53 msgid "Enable Remote Site Success" msgstr "" -#: src/components/Notification/notifications.ts:111 +#: src/components/Notification/notifications.ts:149 msgid "Enable Remote Stream Error" msgstr "" -#: src/components/Notification/notifications.ts:115 +#: src/components/Notification/notifications.ts:153 msgid "Enable Remote Stream Success" msgstr "" -#: src/components/Notification/notifications.ts:62 +#: src/components/Notification/notifications.ts:100 msgid "Enable site %{name} maintenance on %{node} failed" msgstr "" -#: src/components/Notification/notifications.ts:66 +#: src/components/Notification/notifications.ts:104 msgid "Enable site %{name} maintenance on %{node} successfully" msgstr "" -#: src/components/Notification/notifications.ts:54 +#: src/components/Notification/notifications.ts:92 msgid "Enable site %{name} on %{node} failed" msgstr "" -#: src/components/Notification/notifications.ts:58 +#: src/components/Notification/notifications.ts:96 msgid "Enable site %{name} on %{node} successfully" msgstr "" -#: src/components/Notification/notifications.ts:112 +#: src/components/Notification/notifications.ts:150 msgid "Enable stream %{name} on %{node} failed" msgstr "" -#: src/components/Notification/notifications.ts:116 +#: src/components/Notification/notifications.ts:154 msgid "Enable stream %{name} on %{node} successfully" msgstr "" @@ -1174,6 +1212,11 @@ msgstr "" msgid "Export" msgstr "" +#: src/views/preference/ExternalNotify.vue:10 +#: src/views/preference/Preference.vue:169 +msgid "External Notify" +msgstr "" + #: src/views/site/cert/components/ObtainCertLive.vue:94 msgid "Fail to obtain certificate" msgstr "" @@ -1533,7 +1576,7 @@ msgstr "" msgid "Host" msgstr "" -#: src/views/preference/Preference.vue:174 +#: src/views/preference/Preference.vue:181 msgid "HTTP" msgstr "" @@ -1583,12 +1626,12 @@ msgid "Import Certificate" msgstr "" #: src/views/nginx_log/NginxLogList.vue:137 -#: src/views/site/site_list/SiteList.vue:128 +#: src/views/site/site_list/SiteList.vue:132 msgid "Indexed" msgstr "" #: src/views/nginx_log/NginxLogList.vue:134 -#: src/views/site/site_list/SiteList.vue:125 +#: src/views/site/site_list/SiteList.vue:129 msgid "Indexing..." msgstr "" @@ -1668,6 +1711,10 @@ msgstr "" msgid "Invalid folder name" msgstr "" +#: src/constants/errors/notification.ts:3 +msgid "Invalid notifier config" +msgstr "" + #: src/constants/errors/user.ts:4 msgid "Invalid otp code" msgstr "" @@ -1725,6 +1772,18 @@ msgstr "" msgid "Key Type" msgstr "" +#: src/views/preference/components/ExternalNotify/columns.ts:29 +msgid "Language" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark.ts:5 +msgid "Lark" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark_custom.ts:5 +msgid "Lark Custom" +msgstr "" + #: src/views/system/Upgrade.vue:179 msgid "Last checked at" msgstr "" @@ -1823,7 +1882,7 @@ msgstr "" msgid "Logout successful" msgstr "" -#: src/views/preference/Preference.vue:210 +#: src/views/preference/Preference.vue:217 msgid "Logrotate" msgstr "" @@ -1856,7 +1915,7 @@ msgid "Manage Configs" msgstr "" #: src/routes/modules/sites.ts:10 -#: src/views/site/site_list/SiteList.vue:121 +#: src/views/site/site_list/SiteList.vue:125 msgid "Manage Sites" msgstr "" @@ -1935,7 +1994,7 @@ msgstr "" #: src/views/nginx_log/NginxLogList.vue:37 #: src/views/preference/components/AddPasskey.vue:75 #: src/views/site/ngx_conf/NgxUpstream.vue:177 -#: src/views/site/site_edit/RightSettings.vue:64 +#: src/views/site/site_edit/RightSettings.vue:63 #: src/views/site/site_list/columns.tsx:17 #: src/views/site/site_list/SiteDuplicate.vue:79 #: src/views/stream/components/RightSettings.vue:87 @@ -1983,7 +2042,7 @@ msgstr "" msgid "Next" msgstr "" -#: src/views/preference/Preference.vue:198 +#: src/views/preference/Preference.vue:205 msgid "Nginx" msgstr "" @@ -2115,7 +2174,7 @@ msgstr "" #: src/views/preference/CertSettings.vue:73 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97 #: src/views/site/ngx_conf/LocationEditor.vue:88 -#: src/views/site/site_list/SiteList.vue:161 +#: src/views/site/site_list/SiteList.vue:165 #: src/views/stream/StreamList.vue:225 msgid "No" msgstr "" @@ -2129,11 +2188,11 @@ msgstr "" msgid "No records selected" msgstr "" -#: src/views/preference/Preference.vue:168 +#: src/views/preference/Preference.vue:175 msgid "Node" msgstr "" -#: src/views/site/site_edit/RightSettings.vue:67 +#: src/views/site/site_edit/RightSettings.vue:66 #: src/views/site/site_list/columns.tsx:63 #: src/views/stream/components/RightSettings.vue:90 #: src/views/stream/StreamList.vue:30 @@ -2174,7 +2233,7 @@ msgstr "" msgid "Note" msgstr "" -#: src/views/site/site_edit/RightSettings.vue:96 +#: src/views/site/site_edit/RightSettings.vue:95 #: src/views/stream/components/RightSettings.vue:118 msgid "Note, if the configuration file include other configurations or certificates, please synchronize them to the remote nodes in advance." msgstr "" @@ -2188,6 +2247,10 @@ msgstr "" msgid "Notifications" msgstr "" +#: src/constants/errors/notification.ts:2 +msgid "Notifier not found" +msgstr "" + #: src/views/site/cert/components/ObtainCert.vue:182 msgid "Obtain certificate" msgstr "" @@ -2228,7 +2291,7 @@ msgstr "" #: src/views/site/ngx_conf/NgxServer.vue:79 #: src/views/site/ngx_conf/NgxUpstream.vue:33 #: src/views/site/site_edit/components/SiteStatusSegmented.vue:121 -#: src/views/site/site_list/SiteList.vue:162 +#: src/views/site/site_list/SiteList.vue:166 #: src/views/stream/components/RightSettings.vue:54 #: src/views/stream/StreamList.vue:226 #: src/views/system/Backup/BackupCreator.vue:149 @@ -2251,7 +2314,7 @@ msgstr "" msgid "Only zip files are allowed" msgstr "" -#: src/views/preference/Preference.vue:204 +#: src/views/preference/Preference.vue:211 msgid "OpenAI" msgstr "" @@ -2382,7 +2445,7 @@ msgstr "" msgid "Please first add credentials in Certification > DNS Credentials, and then select one of the credentialsbelow to request the API of the DNS provider." msgstr "" -#: src/components/Notification/notifications.ts:138 +#: src/components/Notification/notifications.ts:176 #: src/language/constants.ts:59 msgid "Please generate new recovery codes in the preferences immediately to prevent lockout." msgstr "" @@ -2466,7 +2529,7 @@ msgid "Pre-release" msgstr "" #: src/routes/modules/preference.ts:10 -#: src/views/preference/Preference.vue:151 +#: src/views/preference/Preference.vue:152 msgid "Preference" msgstr "" @@ -2594,19 +2657,19 @@ msgstr "" msgid "Reload Nginx" msgstr "" -#: src/components/Notification/notifications.ts:144 +#: src/components/Notification/notifications.ts:10 msgid "Reload Nginx on %{node} failed, response: %{resp}" msgstr "" -#: src/components/Notification/notifications.ts:148 +#: src/components/Notification/notifications.ts:14 msgid "Reload Nginx on %{node} successfully" msgstr "" -#: src/components/Notification/notifications.ts:143 +#: src/components/Notification/notifications.ts:9 msgid "Reload Remote Nginx Error" msgstr "" -#: src/components/Notification/notifications.ts:147 +#: src/components/Notification/notifications.ts:13 msgid "Reload Remote Nginx Success" msgstr "" @@ -2644,55 +2707,55 @@ msgstr "" msgid "Rename" msgstr "" -#: src/components/Notification/notifications.ts:28 +#: src/components/Notification/notifications.ts:66 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed" msgstr "" -#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:70 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully" msgstr "" -#: src/components/Notification/notifications.ts:27 +#: src/components/Notification/notifications.ts:65 #: src/language/constants.ts:42 msgid "Rename Remote Config Error" msgstr "" -#: src/components/Notification/notifications.ts:31 +#: src/components/Notification/notifications.ts:69 #: src/language/constants.ts:41 msgid "Rename Remote Config Success" msgstr "" -#: src/components/Notification/notifications.ts:77 +#: src/components/Notification/notifications.ts:115 #: src/language/constants.ts:56 msgid "Rename Remote Site Error" msgstr "" -#: src/components/Notification/notifications.ts:81 +#: src/components/Notification/notifications.ts:119 #: src/language/constants.ts:55 msgid "Rename Remote Site Success" msgstr "" -#: src/components/Notification/notifications.ts:119 +#: src/components/Notification/notifications.ts:157 msgid "Rename Remote Stream Error" msgstr "" -#: src/components/Notification/notifications.ts:123 +#: src/components/Notification/notifications.ts:161 msgid "Rename Remote Stream Success" msgstr "" -#: src/components/Notification/notifications.ts:78 +#: src/components/Notification/notifications.ts:116 msgid "Rename site %{name} to %{new_name} on %{node} failed" msgstr "" -#: src/components/Notification/notifications.ts:82 +#: src/components/Notification/notifications.ts:120 msgid "Rename site %{name} to %{new_name} on %{node} successfully" msgstr "" -#: src/components/Notification/notifications.ts:120 +#: src/components/Notification/notifications.ts:158 msgid "Rename stream %{name} to %{new_name} on %{node} failed" msgstr "" -#: src/components/Notification/notifications.ts:124 +#: src/components/Notification/notifications.ts:162 msgid "Rename stream %{name} to %{new_name} on %{node} successfully" msgstr "" @@ -2750,19 +2813,19 @@ msgstr "" msgid "Restart Nginx" msgstr "" -#: src/components/Notification/notifications.ts:152 +#: src/components/Notification/notifications.ts:18 msgid "Restart Nginx on %{node} failed, response: %{resp}" msgstr "" -#: src/components/Notification/notifications.ts:156 +#: src/components/Notification/notifications.ts:22 msgid "Restart Nginx on %{node} successfully" msgstr "" -#: src/components/Notification/notifications.ts:151 +#: src/components/Notification/notifications.ts:17 msgid "Restart Remote Nginx Error" msgstr "" -#: src/components/Notification/notifications.ts:155 +#: src/components/Notification/notifications.ts:21 msgid "Restart Remote Nginx Success" msgstr "" @@ -2824,7 +2887,7 @@ msgstr "" #: src/views/config/components/ConfigName.vue:59 #: src/views/config/ConfigEditor.vue:271 #: src/views/preference/components/Passkey.vue:130 -#: src/views/preference/Preference.vue:221 +#: src/views/preference/Preference.vue:228 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127 #: src/views/site/site_edit/components/ConfigName.vue:52 #: src/views/site/site_edit/SiteEdit.vue:292 @@ -2842,44 +2905,44 @@ msgstr "" msgid "Save error %{msg}" msgstr "" -#: src/components/Notification/notifications.ts:85 +#: src/components/Notification/notifications.ts:123 #: src/language/constants.ts:48 msgid "Save Remote Site Error" msgstr "" -#: src/components/Notification/notifications.ts:89 +#: src/components/Notification/notifications.ts:127 #: src/language/constants.ts:47 msgid "Save Remote Site Success" msgstr "" -#: src/components/Notification/notifications.ts:127 +#: src/components/Notification/notifications.ts:165 msgid "Save Remote Stream Error" msgstr "" -#: src/components/Notification/notifications.ts:131 +#: src/components/Notification/notifications.ts:169 msgid "Save Remote Stream Success" msgstr "" -#: src/components/Notification/notifications.ts:86 +#: src/components/Notification/notifications.ts:124 msgid "Save site %{name} to %{node} failed" msgstr "" -#: src/components/Notification/notifications.ts:90 +#: src/components/Notification/notifications.ts:128 msgid "Save site %{name} to %{node} successfully" msgstr "" -#: src/components/Notification/notifications.ts:128 +#: src/components/Notification/notifications.ts:166 msgid "Save stream %{name} to %{node} failed" msgstr "" -#: src/components/Notification/notifications.ts:132 +#: src/components/Notification/notifications.ts:170 msgid "Save stream %{name} to %{node} successfully" msgstr "" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97 #: src/views/certificate/CertificateEditor.vue:49 -#: src/views/preference/Preference.vue:123 +#: src/views/preference/Preference.vue:124 msgid "Save successfully" msgstr "" @@ -2930,7 +2993,7 @@ msgstr "" msgid "Send" msgstr "" -#: src/views/preference/Preference.vue:156 +#: src/views/preference/Preference.vue:157 msgid "Server" msgstr "" @@ -3094,7 +3157,7 @@ msgstr "" #: src/views/certificate/ACMEUser.vue:65 #: src/views/certificate/CertificateList/certColumns.tsx:65 #: src/views/environments/list/envColumns.tsx:44 -#: src/views/site/site_edit/RightSettings.vue:56 +#: src/views/site/site_edit/RightSettings.vue:55 #: src/views/site/site_list/columns.tsx:80 #: src/views/stream/StreamList.vue:47 msgid "Status" @@ -3164,38 +3227,38 @@ msgstr "" msgid "Sync Certificate" msgstr "" -#: src/components/Notification/notifications.ts:10 +#: src/components/Notification/notifications.ts:48 msgid "Sync Certificate %{cert_name} to %{env_name} failed" msgstr "" -#: src/components/Notification/notifications.ts:14 +#: src/components/Notification/notifications.ts:52 msgid "Sync Certificate %{cert_name} to %{env_name} successfully" msgstr "" -#: src/components/Notification/notifications.ts:9 +#: src/components/Notification/notifications.ts:47 #: src/language/constants.ts:39 msgid "Sync Certificate Error" msgstr "" -#: src/components/Notification/notifications.ts:13 +#: src/components/Notification/notifications.ts:51 #: src/language/constants.ts:38 msgid "Sync Certificate Success" msgstr "" -#: src/components/Notification/notifications.ts:20 +#: src/components/Notification/notifications.ts:58 msgid "Sync config %{config_name} to %{env_name} failed" msgstr "" -#: src/components/Notification/notifications.ts:24 +#: src/components/Notification/notifications.ts:62 msgid "Sync config %{config_name} to %{env_name} successfully" msgstr "" -#: src/components/Notification/notifications.ts:19 +#: src/components/Notification/notifications.ts:57 #: src/language/constants.ts:45 msgid "Sync Config Error" msgstr "" -#: src/components/Notification/notifications.ts:23 +#: src/components/Notification/notifications.ts:61 #: src/language/constants.ts:44 msgid "Sync Config Success" msgstr "" @@ -3205,8 +3268,8 @@ msgstr "" msgid "Sync Nodes" msgstr "" -#: src/views/site/site_edit/RightSettings.vue:102 -#: src/views/site/site_edit/RightSettings.vue:89 +#: src/views/site/site_edit/RightSettings.vue:101 +#: src/views/site/site_edit/RightSettings.vue:88 #: src/views/stream/components/RightSettings.vue:111 #: src/views/stream/components/RightSettings.vue:124 msgid "Sync strategy" @@ -3216,7 +3279,7 @@ msgstr "" msgid "Sync to" msgstr "" -#: src/views/site/site_edit/RightSettings.vue:86 +#: src/views/site/site_edit/RightSettings.vue:85 #: src/views/stream/components/RightSettings.vue:108 msgid "Synchronization" msgstr "" @@ -3246,8 +3309,12 @@ msgstr "" msgid "Task not found" msgstr "" +#: src/views/preference/components/ExternalNotify/telegram.ts:5 +msgid "Telegram" +msgstr "" + #: src/routes/modules/terminal.ts:10 -#: src/views/preference/Preference.vue:180 +#: src/views/preference/Preference.vue:187 #: src/views/terminal/Terminal.vue:129 msgid "Terminal" msgstr "" @@ -3442,6 +3509,7 @@ msgstr "" #: src/views/certificate/CertificateList/certColumns.tsx:25 #: src/views/nginx_log/NginxLogList.vue:21 #: src/views/notification/notificationColumns.tsx:9 +#: src/views/preference/components/ExternalNotify/columns.ts:17 msgid "Type" msgstr "" @@ -3459,7 +3527,7 @@ msgstr "" #: src/views/config/ConfigEditor.vue:325 #: src/views/environments/group/columns.ts:37 #: src/views/environments/list/envColumns.tsx:90 -#: src/views/site/site_edit/RightSettings.vue:76 +#: src/views/site/site_edit/RightSettings.vue:75 #: src/views/site/site_list/columns.tsx:110 #: src/views/stream/components/RightSettings.vue:99 #: src/views/stream/StreamList.vue:67 @@ -3608,7 +3676,7 @@ msgstr "" msgid "When Enabled, Nginx UI will automatically re-register users upon startup. Generally, do not enable this unless you are in a dev environment and using Pebble as CA." msgstr "" -#: src/views/site/site_edit/RightSettings.vue:92 +#: src/views/site/site_edit/RightSettings.vue:91 msgid "When you enable/disable, delete, or save this site, the nodes set in the Node Group and the nodes selected below will be synchronized." msgstr "" diff --git a/app/src/language/ru_RU/app.po b/app/src/language/ru_RU/app.po index 189b3fa2..c3a77a45 100644 --- a/app/src/language/ru_RU/app.po +++ b/app/src/language/ru_RU/app.po @@ -51,6 +51,7 @@ msgstr "Пользователь ACME" #: src/views/nginx_log/NginxLogList.vue:53 #: src/views/notification/notificationColumns.tsx:66 #: src/views/preference/AuthSettings.vue:30 +#: src/views/preference/components/ExternalNotify/columns.ts:46 #: src/views/site/site_list/columns.tsx:117 src/views/stream/StreamList.vue:74 #: src/views/user/userColumns.tsx:60 msgid "Action" @@ -115,7 +116,7 @@ msgstr "Затем, обновите эту страницу и снова на msgid "All" msgstr "Все" -#: src/components/Notification/notifications.ts:137 +#: src/components/Notification/notifications.ts:175 #: src/language/constants.ts:58 msgid "All Recovery Codes Have Been Used" msgstr "Все коды восстановления были использованы" @@ -140,7 +141,7 @@ msgstr "API токен" msgid "API Type" msgstr "Тип API" -#: src/views/preference/Preference.vue:162 +#: src/views/preference/Preference.vue:163 #, fuzzy msgid "App" msgstr "Применить" @@ -195,7 +196,7 @@ msgstr "Вы уверены, что хотите удалить этот эле msgid "Are you sure you want to delete this item?" msgstr "Вы уверены, что хотите удалить этот элемент?" -#: src/views/site/site_list/SiteList.vue:163 +#: src/views/site/site_list/SiteList.vue:167 #: src/views/stream/StreamList.vue:227 msgid "Are you sure you want to delete?" msgstr "Вы уверены, что хотите удалить?" @@ -242,7 +243,7 @@ msgstr "Попытка исправить" msgid "Attempts" msgstr "Попытки" -#: src/views/preference/Preference.vue:186 +#: src/views/preference/Preference.vue:193 msgid "Auth" msgstr "Авторизация" @@ -326,12 +327,16 @@ msgstr "Заблокированные IP-адреса" msgid "Banned Until" msgstr "Заблокирован до" +#: src/views/preference/components/ExternalNotify/bark.ts:5 +msgid "Bark" +msgstr "" + #: src/views/site/site_add/SiteAdd.vue:95 msgid "Base information" msgstr "Основная информация" #: src/views/config/ConfigEditor.vue:290 -#: src/views/site/site_edit/RightSettings.vue:53 +#: src/views/site/site_edit/RightSettings.vue:52 #: src/views/stream/components/RightSettings.vue:79 msgid "Basic" msgstr "Основные" @@ -402,7 +407,7 @@ msgstr "" msgid "Cannot remove initial user" msgstr "Невозможно удалить начального пользователя" -#: src/views/preference/Preference.vue:192 +#: src/views/preference/Preference.vue:199 #, fuzzy msgid "Cert" msgstr "Авто Сертификат" @@ -411,10 +416,42 @@ msgstr "Авто Сертификат" msgid "Cert path is not under the nginx conf dir" msgstr "" +#: src/components/Notification/notifications.ts:28 +#, fuzzy +msgid "Certificate %{name} has expired" +msgstr "Шаблоны конфигурации" + +#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:36 +#: src/components/Notification/notifications.ts:40 +msgid "Certificate %{name} will expire in %{days} days" +msgstr "" + +#: src/components/Notification/notifications.ts:44 +msgid "Certificate %{name} will expire in 1 day" +msgstr "" + #: src/constants/errors/cert.ts:4 msgid "Certificate decode error" msgstr "Ошибка декодирования сертификата" +#: src/components/Notification/notifications.ts:31 +#, fuzzy +msgid "Certificate Expiration Notice" +msgstr "Шаблоны конфигурации" + +#: src/components/Notification/notifications.ts:27 +#, fuzzy +msgid "Certificate Expired" +msgstr "Список сертификатов" + +#: src/components/Notification/notifications.ts:35 +#: src/components/Notification/notifications.ts:39 +#: src/components/Notification/notifications.ts:43 +#, fuzzy +msgid "Certificate Expiring Soon" +msgstr "Ошибка анализа сертификата" + #: src/constants/errors/cert.ts:5 msgid "Certificate parse error" msgstr "Ошибка анализа сертификата" @@ -667,6 +704,7 @@ msgstr "" #: src/views/environments/group/columns.ts:31 #: src/views/notification/notificationColumns.tsx:59 +#: src/views/preference/components/ExternalNotify/columns.ts:41 #: src/views/preference/components/Passkey.vue:95 #: src/views/user/userColumns.tsx:48 msgid "Created at" @@ -738,7 +776,7 @@ msgstr "Ошибка расшифровки" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519 #: src/views/site/ngx_conf/NgxServer.vue:110 #: src/views/site/ngx_conf/NgxUpstream.vue:128 -#: src/views/site/site_list/SiteList.vue:172 +#: src/views/site/site_list/SiteList.vue:176 #: src/views/stream/StreamList.vue:236 msgid "Delete" msgstr "Удалить" @@ -748,45 +786,45 @@ msgstr "Удалить" msgid "Delete Permanently" msgstr "Удалить навсегда" -#: src/components/Notification/notifications.ts:37 src/language/constants.ts:50 +#: src/components/Notification/notifications.ts:75 src/language/constants.ts:50 #, fuzzy msgid "Delete Remote Site Error" msgstr "Ошибка переименования удаленной конфигурации" -#: src/components/Notification/notifications.ts:41 src/language/constants.ts:49 +#: src/components/Notification/notifications.ts:79 src/language/constants.ts:49 #, fuzzy msgid "Delete Remote Site Success" msgstr "Переименование удаленной конфигурации прошло успешно" -#: src/components/Notification/notifications.ts:95 +#: src/components/Notification/notifications.ts:133 #, fuzzy msgid "Delete Remote Stream Error" msgstr "Ошибка переименования удаленной конфигурации" -#: src/components/Notification/notifications.ts:99 +#: src/components/Notification/notifications.ts:137 #, fuzzy msgid "Delete Remote Stream Success" msgstr "Переименование удаленной конфигурации прошло успешно" -#: src/components/Notification/notifications.ts:38 +#: src/components/Notification/notifications.ts:76 #, fuzzy msgid "Delete site %{name} from %{node} failed" msgstr "Не удалось развернуть %{conf_name} на %{node_name}" -#: src/components/Notification/notifications.ts:42 +#: src/components/Notification/notifications.ts:80 msgid "Delete site %{name} from %{node} successfully" msgstr "Сайт %{name} успешно удалён с %{node}" -#: src/views/site/site_list/SiteList.vue:94 +#: src/views/site/site_list/SiteList.vue:98 msgid "Delete site: %{site_name}" msgstr "Удалить сайт: %{site_name}" -#: src/components/Notification/notifications.ts:96 +#: src/components/Notification/notifications.ts:134 #, fuzzy msgid "Delete stream %{name} from %{node} failed" msgstr "Не удалось развернуть %{conf_name} на %{node_name}" -#: src/components/Notification/notifications.ts:100 +#: src/components/Notification/notifications.ts:138 msgid "Delete stream %{name} from %{node} successfully" msgstr "Поток %{name} успешно удалён с %{node}" @@ -823,6 +861,10 @@ msgstr "Детали" msgid "Development Mode" msgstr "Режим разработки" +#: src/views/preference/components/ExternalNotify/dingtalk.ts:5 +msgid "DingTalk" +msgstr "" + #: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89 msgid "Directive" msgstr "Директива" @@ -856,62 +898,62 @@ msgstr "Отключить" msgid "Disable auto-renewal failed for %{name}" msgstr "Не удалось отключить автоматическое продление для %{name}" -#: src/components/Notification/notifications.ts:45 src/language/constants.ts:52 +#: src/components/Notification/notifications.ts:83 src/language/constants.ts:52 #, fuzzy msgid "Disable Remote Site Error" msgstr "Ошибка переименования удаленной конфигурации" -#: src/components/Notification/notifications.ts:69 +#: src/components/Notification/notifications.ts:107 #, fuzzy msgid "Disable Remote Site Maintenance Error" msgstr "Ошибка переименования удаленной конфигурации" -#: src/components/Notification/notifications.ts:73 +#: src/components/Notification/notifications.ts:111 #, fuzzy msgid "Disable Remote Site Maintenance Success" msgstr "Переименование удаленной конфигурации прошло успешно" -#: src/components/Notification/notifications.ts:49 src/language/constants.ts:51 +#: src/components/Notification/notifications.ts:87 src/language/constants.ts:51 #, fuzzy msgid "Disable Remote Site Success" msgstr "Переименование удаленной конфигурации прошло успешно" -#: src/components/Notification/notifications.ts:103 +#: src/components/Notification/notifications.ts:141 #, fuzzy msgid "Disable Remote Stream Error" msgstr "Ошибка переименования удаленной конфигурации" -#: src/components/Notification/notifications.ts:107 +#: src/components/Notification/notifications.ts:145 #, fuzzy msgid "Disable Remote Stream Success" msgstr "Переименование удаленной конфигурации прошло успешно" -#: src/components/Notification/notifications.ts:46 +#: src/components/Notification/notifications.ts:84 #, fuzzy msgid "Disable site %{name} from %{node} failed" msgstr "Включение %{conf_name} in %{node_name} успешно" -#: src/components/Notification/notifications.ts:50 +#: src/components/Notification/notifications.ts:88 #, fuzzy msgid "Disable site %{name} from %{node} successfully" msgstr "Включение %{conf_name} in %{node_name} успешно" -#: src/components/Notification/notifications.ts:70 +#: src/components/Notification/notifications.ts:108 #, fuzzy msgid "Disable site %{name} maintenance on %{node} failed" msgstr "Включение %{conf_name} in %{node_name} успешно" -#: src/components/Notification/notifications.ts:74 +#: src/components/Notification/notifications.ts:112 #, fuzzy msgid "Disable site %{name} maintenance on %{node} successfully" msgstr "Включение %{conf_name} in %{node_name} успешно" -#: src/components/Notification/notifications.ts:104 +#: src/components/Notification/notifications.ts:142 #, fuzzy msgid "Disable stream %{name} from %{node} failed" msgstr "Включение %{conf_name} in %{node_name} нипалучилася" -#: src/components/Notification/notifications.ts:108 +#: src/components/Notification/notifications.ts:146 #, fuzzy msgid "Disable stream %{name} from %{node} successfully" msgstr "Включение %{conf_name} in %{node_name} успешно" @@ -1026,7 +1068,7 @@ msgstr "" "запускаются на localhost." #: src/views/site/site_list/SiteDuplicate.vue:72 -#: src/views/site/site_list/SiteList.vue:158 +#: src/views/site/site_list/SiteList.vue:162 #: src/views/stream/components/StreamDuplicate.vue:64 #: src/views/stream/StreamList.vue:222 msgid "Duplicate" @@ -1094,61 +1136,61 @@ msgstr "Не удалось включить" msgid "Enable HTTPS" msgstr "Включить TOTP" -#: src/components/Notification/notifications.ts:53 src/language/constants.ts:54 +#: src/components/Notification/notifications.ts:91 src/language/constants.ts:54 #, fuzzy msgid "Enable Remote Site Error" msgstr "Ошибка переименования удаленной конфигурации" -#: src/components/Notification/notifications.ts:61 +#: src/components/Notification/notifications.ts:99 #, fuzzy msgid "Enable Remote Site Maintenance Error" msgstr "Ошибка переименования удаленной конфигурации" -#: src/components/Notification/notifications.ts:65 +#: src/components/Notification/notifications.ts:103 #, fuzzy msgid "Enable Remote Site Maintenance Success" msgstr "Переименование удаленной конфигурации прошло успешно" -#: src/components/Notification/notifications.ts:57 src/language/constants.ts:53 +#: src/components/Notification/notifications.ts:95 src/language/constants.ts:53 #, fuzzy msgid "Enable Remote Site Success" msgstr "Переименование удаленной конфигурации прошло успешно" -#: src/components/Notification/notifications.ts:111 +#: src/components/Notification/notifications.ts:149 #, fuzzy msgid "Enable Remote Stream Error" msgstr "Ошибка переименования удаленной конфигурации" -#: src/components/Notification/notifications.ts:115 +#: src/components/Notification/notifications.ts:153 #, fuzzy msgid "Enable Remote Stream Success" msgstr "Переименование удаленной конфигурации прошло успешно" -#: src/components/Notification/notifications.ts:62 +#: src/components/Notification/notifications.ts:100 #, fuzzy msgid "Enable site %{name} maintenance on %{node} failed" msgstr "Включение %{conf_name} in %{node_name} нипалучилася" -#: src/components/Notification/notifications.ts:66 +#: src/components/Notification/notifications.ts:104 #, fuzzy msgid "Enable site %{name} maintenance on %{node} successfully" msgstr "Сайт %{name} успешно включён на %{node}" -#: src/components/Notification/notifications.ts:54 +#: src/components/Notification/notifications.ts:92 #, fuzzy msgid "Enable site %{name} on %{node} failed" msgstr "Включение %{conf_name} in %{node_name} нипалучилася" -#: src/components/Notification/notifications.ts:58 +#: src/components/Notification/notifications.ts:96 msgid "Enable site %{name} on %{node} successfully" msgstr "Сайт %{name} успешно включён на %{node}" -#: src/components/Notification/notifications.ts:112 +#: src/components/Notification/notifications.ts:150 #, fuzzy msgid "Enable stream %{name} on %{node} failed" msgstr "Включение %{conf_name} in %{node_name} нипалучилася" -#: src/components/Notification/notifications.ts:116 +#: src/components/Notification/notifications.ts:154 msgid "Enable stream %{name} on %{node} successfully" msgstr "Поток %{name} успешно включён на %{node}" @@ -1235,6 +1277,11 @@ msgstr "Истекает: %{date}" msgid "Export" msgstr "Экспорт" +#: src/views/preference/ExternalNotify.vue:10 +#: src/views/preference/Preference.vue:169 +msgid "External Notify" +msgstr "" + #: src/views/site/cert/components/ObtainCertLive.vue:94 msgid "Fail to obtain certificate" msgstr "Не удалось получить сертификат" @@ -1636,7 +1683,7 @@ msgstr "Главная" msgid "Host" msgstr "Хостинг HTTP" -#: src/views/preference/Preference.vue:174 +#: src/views/preference/Preference.vue:181 #, fuzzy msgid "HTTP" msgstr "HTTP01" @@ -1699,12 +1746,12 @@ msgid "Import Certificate" msgstr "Импортировать сертификат" #: src/views/nginx_log/NginxLogList.vue:137 -#: src/views/site/site_list/SiteList.vue:128 +#: src/views/site/site_list/SiteList.vue:132 msgid "Indexed" msgstr "" #: src/views/nginx_log/NginxLogList.vue:134 -#: src/views/site/site_list/SiteList.vue:125 +#: src/views/site/site_list/SiteList.vue:129 msgid "Indexing..." msgstr "" @@ -1786,6 +1833,11 @@ msgstr "Неверное имя файла" msgid "Invalid folder name" msgstr "Недопустимое имя папки" +#: src/constants/errors/notification.ts:3 +#, fuzzy +msgid "Invalid notifier config" +msgstr "Неверный код OTP" + #: src/constants/errors/user.ts:4 msgid "Invalid otp code" msgstr "Неверный код OTP" @@ -1846,6 +1898,19 @@ msgstr "" msgid "Key Type" msgstr "Тип ключа" +#: src/views/preference/components/ExternalNotify/columns.ts:29 +msgid "Language" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark.ts:5 +msgid "Lark" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark_custom.ts:5 +#, fuzzy +msgid "Lark Custom" +msgstr "Пользовательский" + #: src/views/system/Upgrade.vue:179 msgid "Last checked at" msgstr "Последняя проверка в" @@ -1944,7 +2009,7 @@ msgstr "Авторизация успешна" msgid "Logout successful" msgstr "Выход выполнен успешно" -#: src/views/preference/Preference.vue:210 +#: src/views/preference/Preference.vue:217 msgid "Logrotate" msgstr "Прокрутка" @@ -1992,7 +2057,7 @@ msgstr "" msgid "Manage Configs" msgstr "Конфигурации" -#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:121 +#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:125 msgid "Manage Sites" msgstr "Сайты" @@ -2068,7 +2133,7 @@ msgstr "Многострочная директива" #: src/views/nginx_log/NginxLogList.vue:37 #: src/views/preference/components/AddPasskey.vue:75 #: src/views/site/ngx_conf/NgxUpstream.vue:177 -#: src/views/site/site_edit/RightSettings.vue:64 +#: src/views/site/site_edit/RightSettings.vue:63 #: src/views/site/site_list/columns.tsx:17 #: src/views/site/site_list/SiteDuplicate.vue:79 #: src/views/stream/components/RightSettings.vue:87 @@ -2116,7 +2181,7 @@ msgstr "Вышла новая версия" msgid "Next" msgstr "Дальше" -#: src/views/preference/Preference.vue:198 +#: src/views/preference/Preference.vue:205 msgid "Nginx" msgstr "Nginx" @@ -2258,7 +2323,7 @@ msgstr "Ошибка разбора конфигурации Nginx" #: src/views/preference/CertSettings.vue:73 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97 #: src/views/site/ngx_conf/LocationEditor.vue:88 -#: src/views/site/site_list/SiteList.vue:161 +#: src/views/site/site_list/SiteList.vue:165 #: src/views/stream/StreamList.vue:225 msgid "No" msgstr "Нет" @@ -2273,12 +2338,12 @@ msgstr "Действие" msgid "No records selected" msgstr "" -#: src/views/preference/Preference.vue:168 +#: src/views/preference/Preference.vue:175 #, fuzzy msgid "Node" msgstr "Имя узла" -#: src/views/site/site_edit/RightSettings.vue:67 +#: src/views/site/site_edit/RightSettings.vue:66 #: src/views/site/site_list/columns.tsx:63 #: src/views/stream/components/RightSettings.vue:90 #: src/views/stream/StreamList.vue:30 @@ -2322,7 +2387,7 @@ msgstr "Недействительно до: %{date}" msgid "Note" msgstr "Заметка" -#: src/views/site/site_edit/RightSettings.vue:96 +#: src/views/site/site_edit/RightSettings.vue:95 #: src/views/stream/components/RightSettings.vue:118 msgid "" "Note, if the configuration file include other configurations or " @@ -2340,6 +2405,11 @@ msgstr "Уведомление" msgid "Notifications" msgstr "Уведомления" +#: src/constants/errors/notification.ts:2 +#, fuzzy +msgid "Notifier not found" +msgstr "Файл не найден" + #: src/views/site/cert/components/ObtainCert.vue:182 msgid "Obtain certificate" msgstr "Получить сертификат" @@ -2384,7 +2454,7 @@ msgstr "Ок" #: src/views/site/ngx_conf/NgxServer.vue:79 #: src/views/site/ngx_conf/NgxUpstream.vue:33 #: src/views/site/site_edit/components/SiteStatusSegmented.vue:121 -#: src/views/site/site_list/SiteList.vue:162 +#: src/views/site/site_list/SiteList.vue:166 #: src/views/stream/components/RightSettings.vue:54 #: src/views/stream/StreamList.vue:226 #: src/views/system/Backup/BackupCreator.vue:149 @@ -2407,7 +2477,7 @@ msgstr "Онлайн" msgid "Only zip files are allowed" msgstr "" -#: src/views/preference/Preference.vue:204 +#: src/views/preference/Preference.vue:211 msgid "OpenAI" msgstr "OpenAI" @@ -2553,7 +2623,7 @@ msgstr "" "Credentials, а затем выберите одну из учетных данных ниже, чтобы запросить " "API провайдера DNS." -#: src/components/Notification/notifications.ts:138 +#: src/components/Notification/notifications.ts:176 #: src/language/constants.ts:59 msgid "" "Please generate new recovery codes in the preferences immediately to prevent " @@ -2650,7 +2720,7 @@ msgstr "Действие" msgid "Pre-release" msgstr "Предварительный выпуск" -#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:151 +#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:152 msgid "Preference" msgstr "Настройки" @@ -2788,22 +2858,22 @@ msgstr "Перегрузить" msgid "Reload Nginx" msgstr "Перезагружается nginx" -#: src/components/Notification/notifications.ts:144 +#: src/components/Notification/notifications.ts:10 #, fuzzy msgid "Reload Nginx on %{node} failed, response: %{resp}" msgstr "Удалить сайт: %{site_name}" -#: src/components/Notification/notifications.ts:148 +#: src/components/Notification/notifications.ts:14 #, fuzzy msgid "Reload Nginx on %{node} successfully" msgstr "Интерфейс Nginx на %{node} успешно обновлен 🎉" -#: src/components/Notification/notifications.ts:143 +#: src/components/Notification/notifications.ts:9 #, fuzzy msgid "Reload Remote Nginx Error" msgstr "Ошибка переименования удаленной конфигурации" -#: src/components/Notification/notifications.ts:147 +#: src/components/Notification/notifications.ts:13 #, fuzzy msgid "Reload Remote Nginx Success" msgstr "Переименование удаленной конфигурации прошло успешно" @@ -2842,58 +2912,60 @@ msgstr "Успешно удалено" msgid "Rename" msgstr "Переименовать" -#: src/components/Notification/notifications.ts:28 +#: src/components/Notification/notifications.ts:66 #, fuzzy msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed" msgstr "Переименование %{orig_path} в %{new_path} на %{env_name} успешно" -#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:70 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully" msgstr "%{orig_path} успешно переименован в %{new_path} на %{env_name}" -#: src/components/Notification/notifications.ts:27 src/language/constants.ts:42 +#: src/components/Notification/notifications.ts:65 src/language/constants.ts:42 msgid "Rename Remote Config Error" msgstr "Ошибка переименования удаленной конфигурации" -#: src/components/Notification/notifications.ts:31 src/language/constants.ts:41 +#: src/components/Notification/notifications.ts:69 src/language/constants.ts:41 msgid "Rename Remote Config Success" msgstr "Переименование удаленной конфигурации прошло успешно" -#: src/components/Notification/notifications.ts:77 src/language/constants.ts:56 +#: src/components/Notification/notifications.ts:115 +#: src/language/constants.ts:56 #, fuzzy msgid "Rename Remote Site Error" msgstr "Ошибка переименования удаленной конфигурации" -#: src/components/Notification/notifications.ts:81 src/language/constants.ts:55 +#: src/components/Notification/notifications.ts:119 +#: src/language/constants.ts:55 #, fuzzy msgid "Rename Remote Site Success" msgstr "Переименование удаленной конфигурации прошло успешно" -#: src/components/Notification/notifications.ts:119 +#: src/components/Notification/notifications.ts:157 #, fuzzy msgid "Rename Remote Stream Error" msgstr "Ошибка переименования удаленной конфигурации" -#: src/components/Notification/notifications.ts:123 +#: src/components/Notification/notifications.ts:161 #, fuzzy msgid "Rename Remote Stream Success" msgstr "Переименование удаленной конфигурации прошло успешно" -#: src/components/Notification/notifications.ts:78 +#: src/components/Notification/notifications.ts:116 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} failed" msgstr "Переименование %{orig_path} в %{new_path} на %{env_name} успешно" -#: src/components/Notification/notifications.ts:82 +#: src/components/Notification/notifications.ts:120 msgid "Rename site %{name} to %{new_name} on %{node} successfully" msgstr "Сайт %{name} успешно переименован в %{new_name} на %{node}" -#: src/components/Notification/notifications.ts:120 +#: src/components/Notification/notifications.ts:158 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} failed" msgstr "Переименование %{orig_path} в %{new_path} на %{env_name} успешно" -#: src/components/Notification/notifications.ts:124 +#: src/components/Notification/notifications.ts:162 msgid "Rename stream %{name} to %{new_name} on %{node} successfully" msgstr "Поток %{name} успешно переименован в %{new_name} на %{node}" @@ -2953,22 +3025,22 @@ msgstr "Перезапуск" msgid "Restart Nginx" msgstr "Перезапускается" -#: src/components/Notification/notifications.ts:152 +#: src/components/Notification/notifications.ts:18 #, fuzzy msgid "Restart Nginx on %{node} failed, response: %{resp}" msgstr "Включение %{conf_name} in %{node_name} успешно" -#: src/components/Notification/notifications.ts:156 +#: src/components/Notification/notifications.ts:22 #, fuzzy msgid "Restart Nginx on %{node} successfully" msgstr "Интерфейс Nginx на %{node} успешно обновлен 🎉" -#: src/components/Notification/notifications.ts:151 +#: src/components/Notification/notifications.ts:17 #, fuzzy msgid "Restart Remote Nginx Error" msgstr "Ошибка переименования удаленной конфигурации" -#: src/components/Notification/notifications.ts:155 +#: src/components/Notification/notifications.ts:21 #, fuzzy msgid "Restart Remote Nginx Success" msgstr "Переименование удаленной конфигурации прошло успешно" @@ -3035,7 +3107,7 @@ msgstr "Выполняется" #: src/views/config/components/ConfigName.vue:59 #: src/views/config/ConfigEditor.vue:271 #: src/views/preference/components/Passkey.vue:130 -#: src/views/preference/Preference.vue:221 +#: src/views/preference/Preference.vue:228 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127 #: src/views/site/site_edit/components/ConfigName.vue:52 #: src/views/site/site_edit/SiteEdit.vue:292 @@ -3053,48 +3125,50 @@ msgstr "Сохранить директиву" msgid "Save error %{msg}" msgstr "Ошибка сохранения %{msg}" -#: src/components/Notification/notifications.ts:85 src/language/constants.ts:48 +#: src/components/Notification/notifications.ts:123 +#: src/language/constants.ts:48 #, fuzzy msgid "Save Remote Site Error" msgstr "Ошибка переименования удаленной конфигурации" -#: src/components/Notification/notifications.ts:89 src/language/constants.ts:47 +#: src/components/Notification/notifications.ts:127 +#: src/language/constants.ts:47 #, fuzzy msgid "Save Remote Site Success" msgstr "Переименование удаленной конфигурации прошло успешно" -#: src/components/Notification/notifications.ts:127 +#: src/components/Notification/notifications.ts:165 #, fuzzy msgid "Save Remote Stream Error" msgstr "Ошибка переименования удаленной конфигурации" -#: src/components/Notification/notifications.ts:131 +#: src/components/Notification/notifications.ts:169 #, fuzzy msgid "Save Remote Stream Success" msgstr "Переименование удаленной конфигурации прошло успешно" -#: src/components/Notification/notifications.ts:86 +#: src/components/Notification/notifications.ts:124 #, fuzzy msgid "Save site %{name} to %{node} failed" msgstr "Продублированно %{conf_name} в %{node_name}" -#: src/components/Notification/notifications.ts:90 +#: src/components/Notification/notifications.ts:128 msgid "Save site %{name} to %{node} successfully" msgstr "Сайт %{name} успешно сохранён на %{node}" -#: src/components/Notification/notifications.ts:128 +#: src/components/Notification/notifications.ts:166 #, fuzzy msgid "Save stream %{name} to %{node} failed" msgstr "Не удалось развернуть %{conf_name} на %{node_name}" -#: src/components/Notification/notifications.ts:132 +#: src/components/Notification/notifications.ts:170 msgid "Save stream %{name} to %{node} successfully" msgstr "Поток %{name} успешно сохранён на %{node}" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97 #: src/views/certificate/CertificateEditor.vue:49 -#: src/views/preference/Preference.vue:123 +#: src/views/preference/Preference.vue:124 msgid "Save successfully" msgstr "Сохранено успешно" @@ -3147,7 +3221,7 @@ msgstr "" msgid "Send" msgstr "Отправлено" -#: src/views/preference/Preference.vue:156 +#: src/views/preference/Preference.vue:157 #, fuzzy msgid "Server" msgstr "Информация о сервере" @@ -3329,7 +3403,7 @@ msgstr "" #: src/views/certificate/ACMEUser.vue:65 #: src/views/certificate/CertificateList/certColumns.tsx:65 #: src/views/environments/list/envColumns.tsx:44 -#: src/views/site/site_edit/RightSettings.vue:56 +#: src/views/site/site_edit/RightSettings.vue:55 #: src/views/site/site_list/columns.tsx:80 src/views/stream/StreamList.vue:47 msgid "Status" msgstr "Статус" @@ -3405,38 +3479,38 @@ msgstr "Синхронизация" msgid "Sync Certificate" msgstr "Синхронизировать сертификат" -#: src/components/Notification/notifications.ts:10 +#: src/components/Notification/notifications.ts:48 #, fuzzy msgid "Sync Certificate %{cert_name} to %{env_name} failed" msgstr "Сертификат %{cert_name} успешно синхронизирован с %{env_name}" -#: src/components/Notification/notifications.ts:14 +#: src/components/Notification/notifications.ts:52 msgid "Sync Certificate %{cert_name} to %{env_name} successfully" msgstr "Сертификат %{cert_name} успешно синхронизирован с %{env_name}" -#: src/components/Notification/notifications.ts:9 src/language/constants.ts:39 +#: src/components/Notification/notifications.ts:47 src/language/constants.ts:39 msgid "Sync Certificate Error" msgstr "Ошибка синхронизации сертификата" -#: src/components/Notification/notifications.ts:13 src/language/constants.ts:38 +#: src/components/Notification/notifications.ts:51 src/language/constants.ts:38 msgid "Sync Certificate Success" msgstr "Сертификат успешно синхронизирован" -#: src/components/Notification/notifications.ts:20 +#: src/components/Notification/notifications.ts:58 #, fuzzy msgid "Sync config %{config_name} to %{env_name} failed" msgstr "Конфигурация синхронизирована %{config_name} с %{env_name} успешно" -#: src/components/Notification/notifications.ts:24 +#: src/components/Notification/notifications.ts:62 #, fuzzy msgid "Sync config %{config_name} to %{env_name} successfully" msgstr "Конфигурация синхронизирована %{config_name} с %{env_name} успешно" -#: src/components/Notification/notifications.ts:19 src/language/constants.ts:45 +#: src/components/Notification/notifications.ts:57 src/language/constants.ts:45 msgid "Sync Config Error" msgstr "Ошибка синхронизации конфигурации" -#: src/components/Notification/notifications.ts:23 src/language/constants.ts:44 +#: src/components/Notification/notifications.ts:61 src/language/constants.ts:44 msgid "Sync Config Success" msgstr "Синхронизация конфигурации успешна" @@ -3446,8 +3520,8 @@ msgstr "Синхронизация конфигурации успешна" msgid "Sync Nodes" msgstr "Синхронизировать с" -#: src/views/site/site_edit/RightSettings.vue:102 -#: src/views/site/site_edit/RightSettings.vue:89 +#: src/views/site/site_edit/RightSettings.vue:101 +#: src/views/site/site_edit/RightSettings.vue:88 #: src/views/stream/components/RightSettings.vue:111 #: src/views/stream/components/RightSettings.vue:124 #, fuzzy @@ -3458,7 +3532,7 @@ msgstr "Синхронизировать сертификат" msgid "Sync to" msgstr "Синхронизировать с" -#: src/views/site/site_edit/RightSettings.vue:86 +#: src/views/site/site_edit/RightSettings.vue:85 #: src/views/stream/components/RightSettings.vue:108 msgid "Synchronization" msgstr "" @@ -3491,7 +3565,11 @@ msgstr "Nginx успешно перезапущен" msgid "Task not found" msgstr "Файл не найден" -#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:180 +#: src/views/preference/components/ExternalNotify/telegram.ts:5 +msgid "Telegram" +msgstr "" + +#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:187 #: src/views/terminal/Terminal.vue:129 msgid "Terminal" msgstr "Терминал" @@ -3764,6 +3842,7 @@ msgstr "Требуется двухфакторная аутентификаци #: src/views/certificate/CertificateList/certColumns.tsx:25 #: src/views/nginx_log/NginxLogList.vue:21 #: src/views/notification/notificationColumns.tsx:9 +#: src/views/preference/components/ExternalNotify/columns.ts:17 msgid "Type" msgstr "Тип" @@ -3781,7 +3860,7 @@ msgstr "Успешно обновлено" #: src/views/config/configColumns.tsx:36 src/views/config/ConfigEditor.vue:325 #: src/views/environments/group/columns.ts:37 #: src/views/environments/list/envColumns.tsx:90 -#: src/views/site/site_edit/RightSettings.vue:76 +#: src/views/site/site_edit/RightSettings.vue:75 #: src/views/site/site_list/columns.tsx:110 #: src/views/stream/components/RightSettings.vue:99 #: src/views/stream/StreamList.vue:67 src/views/user/userColumns.tsx:54 @@ -3944,7 +4023,7 @@ msgid "" "Pebble as CA." msgstr "" -#: src/views/site/site_edit/RightSettings.vue:92 +#: src/views/site/site_edit/RightSettings.vue:91 msgid "" "When you enable/disable, delete, or save this site, the nodes set in the " "Node Group and the nodes selected below will be synchronized." @@ -4036,6 +4115,18 @@ msgstr "Ваши старые коды больше не будут работа msgid "Your passkeys" msgstr "" +#, fuzzy +#~ msgid "Access Token" +#~ msgstr "Журналы доступа" + +#, fuzzy +#~ msgid "Bot Token" +#~ msgstr "API токен" + +#, fuzzy +#~ msgid "Server URL" +#~ msgstr "Информация о сервере" + #~ msgid "Do you want to disable this site?" #~ msgstr "Вы хотите отключить этот сайт?" diff --git a/app/src/language/tr_TR/app.po b/app/src/language/tr_TR/app.po index 77c200f2..892df74a 100644 --- a/app/src/language/tr_TR/app.po +++ b/app/src/language/tr_TR/app.po @@ -1,16 +1,18 @@ +# Ulaş , 2025. msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: \n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2025-04-08 18:26+0000\n" +"Last-Translator: Ulaş \n" +"Language-Team: Turkish \n" "Language: tr_TR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.5\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" #: src/views/user/userColumns.tsx:32 msgid "2FA" @@ -25,9 +27,8 @@ msgid "About" msgstr "Hakkında" #: src/views/nginx_log/NginxLogList.vue:30 -#, fuzzy msgid "Access Log" -msgstr "Erişim Günlükleri" +msgstr "Erişim Kayıtları" #: src/routes/modules/nginx_log.ts:17 src/views/site/ngx_conf/LogEntry.vue:91 msgid "Access Logs" @@ -47,6 +48,7 @@ msgstr "ACME Kullanıcısı" #: src/views/nginx_log/NginxLogList.vue:53 #: src/views/notification/notificationColumns.tsx:66 #: src/views/preference/AuthSettings.vue:30 +#: src/views/preference/components/ExternalNotify/columns.ts:46 #: src/views/site/site_list/columns.tsx:117 src/views/stream/StreamList.vue:74 #: src/views/user/userColumns.tsx:60 msgid "Action" @@ -110,12 +112,12 @@ msgstr "" #: src/components/EnvGroupTabs/EnvGroupTabs.vue:135 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419 msgid "All" -msgstr "" +msgstr "Hepsi" -#: src/components/Notification/notifications.ts:137 +#: src/components/Notification/notifications.ts:175 #: src/language/constants.ts:58 msgid "All Recovery Codes Have Been Used" -msgstr "" +msgstr "Tüm Kurtarma Kodları Kullanılmıştır" #: src/views/preference/OpenAISettings.vue:32 msgid "API Base Url" @@ -134,22 +136,20 @@ msgid "API Token" msgstr "API Token" #: src/views/preference/OpenAISettings.vue:67 -#, fuzzy msgid "API Type" -msgstr "API Token" +msgstr "API Türü" -#: src/views/preference/Preference.vue:162 +#: src/views/preference/Preference.vue:163 msgid "App" -msgstr "" +msgstr "Uygulama" #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:103 msgid "Apply" -msgstr "" +msgstr "Uygula" #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:67 -#, fuzzy msgid "Apply bulk action successfully" -msgstr "Başarıyla kopyalandı" +msgstr "Toplu işlem başarıyla uygulandı" #: src/views/system/Upgrade.vue:176 msgid "Arch" @@ -164,19 +164,16 @@ msgid "Are you sure to delete this passkey immediately?" msgstr "Bu geçiş anahtarını hemen silmek istediğinizden emin misiniz?" #: src/views/preference/components/RecoveryCodes.vue:154 -#, fuzzy msgid "Are you sure to generate new recovery codes?" -msgstr "Bu öğeyi kurtarmak istediğinizden emin misiniz?" +msgstr "Yeni kurtarma kodları oluşturulacaktır. Emin misiniz?" #: src/views/preference/components/TOTP.vue:85 -#, fuzzy msgid "Are you sure to reset 2FA?" -msgstr "Silmek istediğine emin misin?" +msgstr "İki aşamalı doğrulama sıfırlanacaktır. Emin misiniz?" #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:96 -#, fuzzy msgid "Are you sure you want to apply to all selected?" -msgstr "Silmek istediğine emin misin?" +msgstr "Tüm seçilenlere uygulamak istediğinizden emin misiniz?" #: src/components/Notification/Notification.vue:135 #: src/views/notification/Notification.vue:39 @@ -195,7 +192,7 @@ msgstr "Bu öğeyi kalıcı olarak silmek istediğinizden emin misiniz?" msgid "Are you sure you want to delete this item?" msgstr "Bu öğeyi silmek istediğinizden emin misiniz?" -#: src/views/site/site_list/SiteList.vue:163 +#: src/views/site/site_list/SiteList.vue:167 #: src/views/stream/StreamList.vue:227 msgid "Are you sure you want to delete?" msgstr "Silmek istediğine emin misin?" @@ -243,7 +240,7 @@ msgstr "Girişimler" msgid "Attempts" msgstr "Girişimler" -#: src/views/preference/Preference.vue:186 +#: src/views/preference/Preference.vue:193 msgid "Auth" msgstr "Kimlik Doğrulama" @@ -327,12 +324,16 @@ msgstr "Yasaklı IP'ler" msgid "Banned Until" msgstr "Şu Zamana Kadar Yasaklı" +#: src/views/preference/components/ExternalNotify/bark.ts:5 +msgid "Bark" +msgstr "" + #: src/views/site/site_add/SiteAdd.vue:95 msgid "Base information" msgstr "Temel bilgiler" #: src/views/config/ConfigEditor.vue:290 -#: src/views/site/site_edit/RightSettings.vue:53 +#: src/views/site/site_edit/RightSettings.vue:52 #: src/views/stream/components/RightSettings.vue:79 msgid "Basic" msgstr "Temel" @@ -405,7 +406,7 @@ msgstr "" msgid "Cannot remove initial user" msgstr "Sistem İlk Kullanıcısı" -#: src/views/preference/Preference.vue:192 +#: src/views/preference/Preference.vue:199 msgid "Cert" msgstr "" @@ -413,11 +414,43 @@ msgstr "" msgid "Cert path is not under the nginx conf dir" msgstr "" +#: src/components/Notification/notifications.ts:28 +#, fuzzy +msgid "Certificate %{name} has expired" +msgstr "Yapılandırma Şablonları" + +#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:36 +#: src/components/Notification/notifications.ts:40 +msgid "Certificate %{name} will expire in %{days} days" +msgstr "" + +#: src/components/Notification/notifications.ts:44 +msgid "Certificate %{name} will expire in 1 day" +msgstr "" + #: src/constants/errors/cert.ts:4 #, fuzzy msgid "Certificate decode error" msgstr "Senkronizasyon Sertifikası Hatası" +#: src/components/Notification/notifications.ts:31 +#, fuzzy +msgid "Certificate Expiration Notice" +msgstr "Yapılandırma Şablonları" + +#: src/components/Notification/notifications.ts:27 +#, fuzzy +msgid "Certificate Expired" +msgstr "Sertifika Listesi" + +#: src/components/Notification/notifications.ts:35 +#: src/components/Notification/notifications.ts:39 +#: src/components/Notification/notifications.ts:43 +#, fuzzy +msgid "Certificate Expiring Soon" +msgstr "Senkronizasyon Sertifikası Hatası" + #: src/constants/errors/cert.ts:5 #, fuzzy msgid "Certificate parse error" @@ -673,6 +706,7 @@ msgstr "" #: src/views/environments/group/columns.ts:31 #: src/views/notification/notificationColumns.tsx:59 +#: src/views/preference/components/ExternalNotify/columns.ts:41 #: src/views/preference/components/Passkey.vue:95 #: src/views/user/userColumns.tsx:48 msgid "Created at" @@ -745,7 +779,7 @@ msgstr "Açıklama" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519 #: src/views/site/ngx_conf/NgxServer.vue:110 #: src/views/site/ngx_conf/NgxUpstream.vue:128 -#: src/views/site/site_list/SiteList.vue:172 +#: src/views/site/site_list/SiteList.vue:176 #: src/views/stream/StreamList.vue:236 msgid "Delete" msgstr "Sil" @@ -755,48 +789,48 @@ msgstr "Sil" msgid "Delete Permanently" msgstr "Kalıcı Olarak Sil" -#: src/components/Notification/notifications.ts:37 src/language/constants.ts:50 +#: src/components/Notification/notifications.ts:75 src/language/constants.ts:50 #, fuzzy msgid "Delete Remote Site Error" msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası" -#: src/components/Notification/notifications.ts:41 src/language/constants.ts:49 +#: src/components/Notification/notifications.ts:79 src/language/constants.ts:49 #, fuzzy msgid "Delete Remote Site Success" msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı" -#: src/components/Notification/notifications.ts:95 +#: src/components/Notification/notifications.ts:133 #, fuzzy msgid "Delete Remote Stream Error" msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası" -#: src/components/Notification/notifications.ts:99 +#: src/components/Notification/notifications.ts:137 #, fuzzy msgid "Delete Remote Stream Success" msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı" -#: src/components/Notification/notifications.ts:38 +#: src/components/Notification/notifications.ts:76 #, fuzzy msgid "Delete site %{name} from %{node} failed" msgstr "" "%{conf_name} yapılandırmasını %{node_name} düğümüne dağıtma başarısız oldu" -#: src/components/Notification/notifications.ts:42 +#: src/components/Notification/notifications.ts:80 #, fuzzy msgid "Delete site %{name} from %{node} successfully" msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı" -#: src/views/site/site_list/SiteList.vue:94 +#: src/views/site/site_list/SiteList.vue:98 msgid "Delete site: %{site_name}" msgstr "Siteyi sil: %{site_name}" -#: src/components/Notification/notifications.ts:96 +#: src/components/Notification/notifications.ts:134 #, fuzzy msgid "Delete stream %{name} from %{node} failed" msgstr "" "%{conf_name} yapılandırmasını %{node_name} düğümüne dağıtma başarısız oldu" -#: src/components/Notification/notifications.ts:100 +#: src/components/Notification/notifications.ts:138 #, fuzzy msgid "Delete stream %{name} from %{node} successfully" msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı" @@ -834,6 +868,10 @@ msgstr "Detaylar" msgid "Development Mode" msgstr "Geliştirme modu" +#: src/views/preference/components/ExternalNotify/dingtalk.ts:5 +msgid "DingTalk" +msgstr "" + #: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89 msgid "Directive" msgstr "Talimat" @@ -867,72 +905,72 @@ msgstr "Devre Dışı" msgid "Disable auto-renewal failed for %{name}" msgstr "%{name} için otomatik yenilemeyi devre dışı bırakma başarısız oldu" -#: src/components/Notification/notifications.ts:45 src/language/constants.ts:52 +#: src/components/Notification/notifications.ts:83 src/language/constants.ts:52 #, fuzzy msgid "Disable Remote Site Error" msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası" -#: src/components/Notification/notifications.ts:69 +#: src/components/Notification/notifications.ts:107 #, fuzzy msgid "Disable Remote Site Maintenance Error" msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası" -#: src/components/Notification/notifications.ts:73 +#: src/components/Notification/notifications.ts:111 #, fuzzy msgid "Disable Remote Site Maintenance Success" msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı" -#: src/components/Notification/notifications.ts:49 src/language/constants.ts:51 +#: src/components/Notification/notifications.ts:87 src/language/constants.ts:51 #, fuzzy msgid "Disable Remote Site Success" msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı" -#: src/components/Notification/notifications.ts:103 +#: src/components/Notification/notifications.ts:141 #, fuzzy msgid "Disable Remote Stream Error" msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası" -#: src/components/Notification/notifications.ts:107 +#: src/components/Notification/notifications.ts:145 #, fuzzy msgid "Disable Remote Stream Success" msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı" -#: src/components/Notification/notifications.ts:46 +#: src/components/Notification/notifications.ts:84 #, fuzzy msgid "Disable site %{name} from %{node} failed" msgstr "" "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarılı " "oldu" -#: src/components/Notification/notifications.ts:50 +#: src/components/Notification/notifications.ts:88 #, fuzzy msgid "Disable site %{name} from %{node} successfully" msgstr "" "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarılı " "oldu" -#: src/components/Notification/notifications.ts:70 +#: src/components/Notification/notifications.ts:108 #, fuzzy msgid "Disable site %{name} maintenance on %{node} failed" msgstr "" "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarılı " "oldu" -#: src/components/Notification/notifications.ts:74 +#: src/components/Notification/notifications.ts:112 #, fuzzy msgid "Disable site %{name} maintenance on %{node} successfully" msgstr "" "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarılı " "oldu" -#: src/components/Notification/notifications.ts:104 +#: src/components/Notification/notifications.ts:142 #, fuzzy msgid "Disable stream %{name} from %{node} failed" msgstr "" "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarısız " "oldu" -#: src/components/Notification/notifications.ts:108 +#: src/components/Notification/notifications.ts:146 #, fuzzy msgid "Disable stream %{name} from %{node} successfully" msgstr "" @@ -1049,7 +1087,7 @@ msgstr "" "kullanamazsınız." #: src/views/site/site_list/SiteDuplicate.vue:72 -#: src/views/site/site_list/SiteList.vue:158 +#: src/views/site/site_list/SiteList.vue:162 #: src/views/stream/components/StreamDuplicate.vue:64 #: src/views/stream/StreamList.vue:222 msgid "Duplicate" @@ -1117,72 +1155,72 @@ msgstr "Etkinleştirme başarısız" msgid "Enable HTTPS" msgstr "TOTP'yi Etkinleştir" -#: src/components/Notification/notifications.ts:53 src/language/constants.ts:54 +#: src/components/Notification/notifications.ts:91 src/language/constants.ts:54 #, fuzzy msgid "Enable Remote Site Error" msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası" -#: src/components/Notification/notifications.ts:61 +#: src/components/Notification/notifications.ts:99 #, fuzzy msgid "Enable Remote Site Maintenance Error" msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası" -#: src/components/Notification/notifications.ts:65 +#: src/components/Notification/notifications.ts:103 #, fuzzy msgid "Enable Remote Site Maintenance Success" msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı" -#: src/components/Notification/notifications.ts:57 src/language/constants.ts:53 +#: src/components/Notification/notifications.ts:95 src/language/constants.ts:53 #, fuzzy msgid "Enable Remote Site Success" msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı" -#: src/components/Notification/notifications.ts:111 +#: src/components/Notification/notifications.ts:149 #, fuzzy msgid "Enable Remote Stream Error" msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası" -#: src/components/Notification/notifications.ts:115 +#: src/components/Notification/notifications.ts:153 #, fuzzy msgid "Enable Remote Stream Success" msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı" -#: src/components/Notification/notifications.ts:62 +#: src/components/Notification/notifications.ts:100 #, fuzzy msgid "Enable site %{name} maintenance on %{node} failed" msgstr "" "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarısız " "oldu" -#: src/components/Notification/notifications.ts:66 +#: src/components/Notification/notifications.ts:104 #, fuzzy msgid "Enable site %{name} maintenance on %{node} successfully" msgstr "" "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarılı " "oldu" -#: src/components/Notification/notifications.ts:54 +#: src/components/Notification/notifications.ts:92 #, fuzzy msgid "Enable site %{name} on %{node} failed" msgstr "" "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarısız " "oldu" -#: src/components/Notification/notifications.ts:58 +#: src/components/Notification/notifications.ts:96 #, fuzzy msgid "Enable site %{name} on %{node} successfully" msgstr "" "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarılı " "oldu" -#: src/components/Notification/notifications.ts:112 +#: src/components/Notification/notifications.ts:150 #, fuzzy msgid "Enable stream %{name} on %{node} failed" msgstr "" "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarısız " "oldu" -#: src/components/Notification/notifications.ts:116 +#: src/components/Notification/notifications.ts:154 #, fuzzy msgid "Enable stream %{name} on %{node} successfully" msgstr "" @@ -1272,6 +1310,11 @@ msgstr "Son kullanma tarihi: %{date}" msgid "Export" msgstr "Dışa Aktar" +#: src/views/preference/ExternalNotify.vue:10 +#: src/views/preference/Preference.vue:169 +msgid "External Notify" +msgstr "" + #: src/views/site/cert/components/ObtainCertLive.vue:94 msgid "Fail to obtain certificate" msgstr "Sertifika alınamadı" @@ -1673,7 +1716,7 @@ msgstr "Anasayfa" msgid "Host" msgstr "HTTP Sunucusu" -#: src/views/preference/Preference.vue:174 +#: src/views/preference/Preference.vue:181 #, fuzzy msgid "HTTP" msgstr "HTTP01" @@ -1737,12 +1780,12 @@ msgid "Import Certificate" msgstr "Sertifika İçe Aktar" #: src/views/nginx_log/NginxLogList.vue:137 -#: src/views/site/site_list/SiteList.vue:128 +#: src/views/site/site_list/SiteList.vue:132 msgid "Indexed" msgstr "" #: src/views/nginx_log/NginxLogList.vue:134 -#: src/views/site/site_list/SiteList.vue:125 +#: src/views/site/site_list/SiteList.vue:129 msgid "Indexing..." msgstr "" @@ -1824,6 +1867,11 @@ msgstr "Geçersiz dosya adı" msgid "Invalid folder name" msgstr "Geçersiz klasör adı" +#: src/constants/errors/notification.ts:3 +#, fuzzy +msgid "Invalid notifier config" +msgstr "Geçersiz 2FA veya kurtarma kodu" + #: src/constants/errors/user.ts:4 #, fuzzy msgid "Invalid otp code" @@ -1886,6 +1934,19 @@ msgstr "" msgid "Key Type" msgstr "Anahtar Türü" +#: src/views/preference/components/ExternalNotify/columns.ts:29 +msgid "Language" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark.ts:5 +msgid "Lark" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark_custom.ts:5 +#, fuzzy +msgid "Lark Custom" +msgstr "Özelleştirilmiş" + #: src/views/system/Upgrade.vue:179 msgid "Last checked at" msgstr "En son şu tarihte kontrol edildi" @@ -1983,7 +2044,7 @@ msgstr "Giriş Başarılı" msgid "Logout successful" msgstr "Çıkış başarılı" -#: src/views/preference/Preference.vue:210 +#: src/views/preference/Preference.vue:217 msgid "Logrotate" msgstr "Logrotate" @@ -2033,7 +2094,7 @@ msgstr "" msgid "Manage Configs" msgstr "Yapılandırmaları Yönet" -#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:121 +#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:125 #, fuzzy msgid "Manage Sites" msgstr "Siteleri Yönet" @@ -2123,7 +2184,7 @@ msgstr "Çok Hatlı Direktif" #: src/views/nginx_log/NginxLogList.vue:37 #: src/views/preference/components/AddPasskey.vue:75 #: src/views/site/ngx_conf/NgxUpstream.vue:177 -#: src/views/site/site_edit/RightSettings.vue:64 +#: src/views/site/site_edit/RightSettings.vue:63 #: src/views/site/site_list/columns.tsx:17 #: src/views/site/site_list/SiteDuplicate.vue:79 #: src/views/stream/components/RightSettings.vue:87 @@ -2180,7 +2241,7 @@ msgstr "Yeni sürüm yayınlandı" msgid "Next" msgstr "Sonraki" -#: src/views/preference/Preference.vue:198 +#: src/views/preference/Preference.vue:205 #, fuzzy msgid "Nginx" msgstr "Nginx" @@ -2331,7 +2392,7 @@ msgstr "Nginx Yapılandırma Ayrıştırma Hatası" #: src/views/preference/CertSettings.vue:73 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97 #: src/views/site/ngx_conf/LocationEditor.vue:88 -#: src/views/site/site_list/SiteList.vue:161 +#: src/views/site/site_list/SiteList.vue:165 #: src/views/stream/StreamList.vue:225 #, fuzzy msgid "No" @@ -2347,12 +2408,12 @@ msgstr "Eylem" msgid "No records selected" msgstr "" -#: src/views/preference/Preference.vue:168 +#: src/views/preference/Preference.vue:175 #, fuzzy msgid "Node" msgstr "Yeni Ad" -#: src/views/site/site_edit/RightSettings.vue:67 +#: src/views/site/site_edit/RightSettings.vue:66 #: src/views/site/site_list/columns.tsx:63 #: src/views/stream/components/RightSettings.vue:90 #: src/views/stream/StreamList.vue:30 @@ -2402,7 +2463,7 @@ msgstr "Önce Geçerli Değil: %{date}" msgid "Note" msgstr "Not" -#: src/views/site/site_edit/RightSettings.vue:96 +#: src/views/site/site_edit/RightSettings.vue:95 #: src/views/stream/components/RightSettings.vue:118 msgid "" "Note, if the configuration file include other configurations or " @@ -2420,6 +2481,11 @@ msgstr "Bildirim" msgid "Notifications" msgstr "Bildirimler" +#: src/constants/errors/notification.ts:2 +#, fuzzy +msgid "Notifier not found" +msgstr "Dosya bulunamadı" + #: src/views/site/cert/components/ObtainCert.vue:182 #, fuzzy msgid "Obtain certificate" @@ -2470,7 +2536,7 @@ msgstr "Tamam" #: src/views/site/ngx_conf/NgxServer.vue:79 #: src/views/site/ngx_conf/NgxUpstream.vue:33 #: src/views/site/site_edit/components/SiteStatusSegmented.vue:121 -#: src/views/site/site_list/SiteList.vue:162 +#: src/views/site/site_list/SiteList.vue:166 #: src/views/stream/components/RightSettings.vue:54 #: src/views/stream/StreamList.vue:226 #: src/views/system/Backup/BackupCreator.vue:149 @@ -2496,7 +2562,7 @@ msgstr "Çevrimiçi" msgid "Only zip files are allowed" msgstr "" -#: src/views/preference/Preference.vue:204 +#: src/views/preference/Preference.vue:211 #, fuzzy msgid "OpenAI" msgstr "OpenAI" @@ -2668,7 +2734,7 @@ msgstr "" "ekleyin ve ardından DNS sağlayıcısının API'sini istemek için aşağıdaki " "kimlik bilgilerinden birini seçin." -#: src/components/Notification/notifications.ts:138 +#: src/components/Notification/notifications.ts:176 #: src/language/constants.ts:59 msgid "" "Please generate new recovery codes in the preferences immediately to prevent " @@ -2773,7 +2839,7 @@ msgstr "Eylem" msgid "Pre-release" msgstr "Ön sürüm" -#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:151 +#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:152 #, fuzzy msgid "Preference" msgstr "Tercih" @@ -2934,22 +3000,22 @@ msgstr "Tekrar yükle" msgid "Reload Nginx" msgstr "Nginx'i yeniden yükleme" -#: src/components/Notification/notifications.ts:144 +#: src/components/Notification/notifications.ts:10 #, fuzzy msgid "Reload Nginx on %{node} failed, response: %{resp}" msgstr "Siteyi sil: %{site_name}" -#: src/components/Notification/notifications.ts:148 +#: src/components/Notification/notifications.ts:14 #, fuzzy msgid "Reload Nginx on %{node} successfully" msgstr "Nginx kullanıcı arayüzü %{node} üzerinde başarıyla yükseltildi 🎉" -#: src/components/Notification/notifications.ts:143 +#: src/components/Notification/notifications.ts:9 #, fuzzy msgid "Reload Remote Nginx Error" msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası" -#: src/components/Notification/notifications.ts:147 +#: src/components/Notification/notifications.ts:13 #, fuzzy msgid "Reload Remote Nginx Success" msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı" @@ -2994,67 +3060,69 @@ msgstr "Başarıyla kaldırıldı" msgid "Rename" msgstr "Yeniden Adlandır" -#: src/components/Notification/notifications.ts:28 +#: src/components/Notification/notifications.ts:66 #, fuzzy msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed" msgstr "" "2] üzerinde %{orig_path}'ı %{new_path} olarak başarıyla yeniden adlandırın" -#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:70 #, fuzzy msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully" msgstr "" "2] üzerinde %{orig_path}'ı %{new_path} olarak başarıyla yeniden adlandırın" -#: src/components/Notification/notifications.ts:27 src/language/constants.ts:42 +#: src/components/Notification/notifications.ts:65 src/language/constants.ts:42 #, fuzzy msgid "Rename Remote Config Error" msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası" -#: src/components/Notification/notifications.ts:31 src/language/constants.ts:41 +#: src/components/Notification/notifications.ts:69 src/language/constants.ts:41 #, fuzzy msgid "Rename Remote Config Success" msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı" -#: src/components/Notification/notifications.ts:77 src/language/constants.ts:56 +#: src/components/Notification/notifications.ts:115 +#: src/language/constants.ts:56 #, fuzzy msgid "Rename Remote Site Error" msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası" -#: src/components/Notification/notifications.ts:81 src/language/constants.ts:55 +#: src/components/Notification/notifications.ts:119 +#: src/language/constants.ts:55 #, fuzzy msgid "Rename Remote Site Success" msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı" -#: src/components/Notification/notifications.ts:119 +#: src/components/Notification/notifications.ts:157 #, fuzzy msgid "Rename Remote Stream Error" msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası" -#: src/components/Notification/notifications.ts:123 +#: src/components/Notification/notifications.ts:161 #, fuzzy msgid "Rename Remote Stream Success" msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı" -#: src/components/Notification/notifications.ts:78 +#: src/components/Notification/notifications.ts:116 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} failed" msgstr "" "2] üzerinde %{orig_path}'ı %{new_path} olarak başarıyla yeniden adlandırın" -#: src/components/Notification/notifications.ts:82 +#: src/components/Notification/notifications.ts:120 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} successfully" msgstr "" "2] üzerinde %{orig_path}'ı %{new_path} olarak başarıyla yeniden adlandırın" -#: src/components/Notification/notifications.ts:120 +#: src/components/Notification/notifications.ts:158 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} failed" msgstr "" "2] üzerinde %{orig_path}'ı %{new_path} olarak başarıyla yeniden adlandırın" -#: src/components/Notification/notifications.ts:124 +#: src/components/Notification/notifications.ts:162 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} successfully" msgstr "" @@ -3125,24 +3193,24 @@ msgstr "Yeniden başlat" msgid "Restart Nginx" msgstr "Yeniden Başlatma" -#: src/components/Notification/notifications.ts:152 +#: src/components/Notification/notifications.ts:18 #, fuzzy msgid "Restart Nginx on %{node} failed, response: %{resp}" msgstr "" "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarılı " "oldu" -#: src/components/Notification/notifications.ts:156 +#: src/components/Notification/notifications.ts:22 #, fuzzy msgid "Restart Nginx on %{node} successfully" msgstr "Nginx kullanıcı arayüzü %{node} üzerinde başarıyla yükseltildi 🎉" -#: src/components/Notification/notifications.ts:151 +#: src/components/Notification/notifications.ts:17 #, fuzzy msgid "Restart Remote Nginx Error" msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası" -#: src/components/Notification/notifications.ts:155 +#: src/components/Notification/notifications.ts:21 #, fuzzy msgid "Restart Remote Nginx Success" msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı" @@ -3212,7 +3280,7 @@ msgstr "Çalışıyor" #: src/views/config/components/ConfigName.vue:59 #: src/views/config/ConfigEditor.vue:271 #: src/views/preference/components/Passkey.vue:130 -#: src/views/preference/Preference.vue:221 +#: src/views/preference/Preference.vue:228 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127 #: src/views/site/site_edit/components/ConfigName.vue:52 #: src/views/site/site_edit/SiteEdit.vue:292 @@ -3233,43 +3301,45 @@ msgstr "Direktifi Kaydet" msgid "Save error %{msg}" msgstr "Hatayı kaydet %{msg}" -#: src/components/Notification/notifications.ts:85 src/language/constants.ts:48 +#: src/components/Notification/notifications.ts:123 +#: src/language/constants.ts:48 #, fuzzy msgid "Save Remote Site Error" msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası" -#: src/components/Notification/notifications.ts:89 src/language/constants.ts:47 +#: src/components/Notification/notifications.ts:127 +#: src/language/constants.ts:47 #, fuzzy msgid "Save Remote Site Success" msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı" -#: src/components/Notification/notifications.ts:127 +#: src/components/Notification/notifications.ts:165 #, fuzzy msgid "Save Remote Stream Error" msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası" -#: src/components/Notification/notifications.ts:131 +#: src/components/Notification/notifications.ts:169 #, fuzzy msgid "Save Remote Stream Success" msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı" -#: src/components/Notification/notifications.ts:86 +#: src/components/Notification/notifications.ts:124 #, fuzzy msgid "Save site %{name} to %{node} failed" msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı" -#: src/components/Notification/notifications.ts:90 +#: src/components/Notification/notifications.ts:128 #, fuzzy msgid "Save site %{name} to %{node} successfully" msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı" -#: src/components/Notification/notifications.ts:128 +#: src/components/Notification/notifications.ts:166 #, fuzzy msgid "Save stream %{name} to %{node} failed" msgstr "" "%{conf_name} yapılandırmasını %{node_name} düğümüne dağıtma başarısız oldu" -#: src/components/Notification/notifications.ts:132 +#: src/components/Notification/notifications.ts:170 #, fuzzy msgid "Save stream %{name} to %{node} successfully" msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı" @@ -3277,7 +3347,7 @@ msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97 #: src/views/certificate/CertificateEditor.vue:49 -#: src/views/preference/Preference.vue:123 +#: src/views/preference/Preference.vue:124 #, fuzzy msgid "Save successfully" msgstr "Başarıyla kaydedin" @@ -3335,7 +3405,7 @@ msgstr "" msgid "Send" msgstr "Gönder" -#: src/views/preference/Preference.vue:156 +#: src/views/preference/Preference.vue:157 #, fuzzy msgid "Server" msgstr "Sunucu Bilgisi" @@ -3535,7 +3605,7 @@ msgstr "" #: src/views/certificate/ACMEUser.vue:65 #: src/views/certificate/CertificateList/certColumns.tsx:65 #: src/views/environments/list/envColumns.tsx:44 -#: src/views/site/site_edit/RightSettings.vue:56 +#: src/views/site/site_edit/RightSettings.vue:55 #: src/views/site/site_list/columns.tsx:80 src/views/stream/StreamList.vue:47 #, fuzzy msgid "Status" @@ -3620,42 +3690,42 @@ msgstr "Eşitle" msgid "Sync Certificate" msgstr "Senkronizasyon Sertifikası" -#: src/components/Notification/notifications.ts:10 +#: src/components/Notification/notifications.ts:48 #, fuzzy msgid "Sync Certificate %{cert_name} to %{env_name} failed" msgstr "Sertifika %{cert_name}'ı %{env_name} ile başarıyla senkronize edin" -#: src/components/Notification/notifications.ts:14 +#: src/components/Notification/notifications.ts:52 #, fuzzy msgid "Sync Certificate %{cert_name} to %{env_name} successfully" msgstr "Sertifika %{cert_name}'ı %{env_name} ile başarıyla senkronize edin" -#: src/components/Notification/notifications.ts:9 src/language/constants.ts:39 +#: src/components/Notification/notifications.ts:47 src/language/constants.ts:39 #, fuzzy msgid "Sync Certificate Error" msgstr "Senkronizasyon Sertifikası Hatası" -#: src/components/Notification/notifications.ts:13 src/language/constants.ts:38 +#: src/components/Notification/notifications.ts:51 src/language/constants.ts:38 #, fuzzy msgid "Sync Certificate Success" msgstr "Senkronizasyon Sertifikası Başarısı" -#: src/components/Notification/notifications.ts:20 +#: src/components/Notification/notifications.ts:58 #, fuzzy msgid "Sync config %{config_name} to %{env_name} failed" msgstr "Config %{config_name} ile %{env_name}'i başarıyla senkronize edin" -#: src/components/Notification/notifications.ts:24 +#: src/components/Notification/notifications.ts:62 #, fuzzy msgid "Sync config %{config_name} to %{env_name} successfully" msgstr "Config %{config_name} ile %{env_name}'i başarıyla senkronize edin" -#: src/components/Notification/notifications.ts:19 src/language/constants.ts:45 +#: src/components/Notification/notifications.ts:57 src/language/constants.ts:45 #, fuzzy msgid "Sync Config Error" msgstr "Senkronizasyon Yapılandırma Hatası" -#: src/components/Notification/notifications.ts:23 src/language/constants.ts:44 +#: src/components/Notification/notifications.ts:61 src/language/constants.ts:44 #, fuzzy msgid "Sync Config Success" msgstr "Senkronizasyon Yapılandırması Başarılı" @@ -3666,8 +3736,8 @@ msgstr "Senkronizasyon Yapılandırması Başarılı" msgid "Sync Nodes" msgstr "Şununla senkronize et" -#: src/views/site/site_edit/RightSettings.vue:102 -#: src/views/site/site_edit/RightSettings.vue:89 +#: src/views/site/site_edit/RightSettings.vue:101 +#: src/views/site/site_edit/RightSettings.vue:88 #: src/views/stream/components/RightSettings.vue:111 #: src/views/stream/components/RightSettings.vue:124 #, fuzzy @@ -3679,7 +3749,7 @@ msgstr "Senkronizasyon Sertifikası" msgid "Sync to" msgstr "Şununla senkronize et" -#: src/views/site/site_edit/RightSettings.vue:86 +#: src/views/site/site_edit/RightSettings.vue:85 #: src/views/stream/components/RightSettings.vue:108 msgid "Synchronization" msgstr "" @@ -3714,7 +3784,11 @@ msgstr "Nginx başarıyla yeniden başlatıldı" msgid "Task not found" msgstr "Dosya bulunamadı" -#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:180 +#: src/views/preference/components/ExternalNotify/telegram.ts:5 +msgid "Telegram" +msgstr "" + +#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:187 #: src/views/terminal/Terminal.vue:129 #, fuzzy msgid "Terminal" @@ -4018,6 +4092,7 @@ msgstr "İki faktörlü kimlik doğrulama gerekiyor" #: src/views/certificate/CertificateList/certColumns.tsx:25 #: src/views/nginx_log/NginxLogList.vue:21 #: src/views/notification/notificationColumns.tsx:9 +#: src/views/preference/components/ExternalNotify/columns.ts:17 #, fuzzy msgid "Type" msgstr "Tip" @@ -4036,7 +4111,7 @@ msgstr "Güncellendi" #: src/views/config/configColumns.tsx:36 src/views/config/ConfigEditor.vue:325 #: src/views/environments/group/columns.ts:37 #: src/views/environments/list/envColumns.tsx:90 -#: src/views/site/site_edit/RightSettings.vue:76 +#: src/views/site/site_edit/RightSettings.vue:75 #: src/views/site/site_list/columns.tsx:110 #: src/views/stream/components/RightSettings.vue:99 #: src/views/stream/StreamList.vue:67 src/views/user/userColumns.tsx:54 @@ -4225,7 +4300,7 @@ msgstr "" "yeniden kaydeder. Genel olarak, bir geliştirme ortamında değilseniz ve CA " "olarak Pebble kullanmıyorsanız bunu etkinleştirmeyin." -#: src/views/site/site_edit/RightSettings.vue:92 +#: src/views/site/site_edit/RightSettings.vue:91 msgid "" "When you enable/disable, delete, or save this site, the nodes set in the " "Node Group and the nodes selected below will be synchronized." @@ -4327,6 +4402,18 @@ msgstr "" msgid "Your passkeys" msgstr "Geçiş anahtarlarınız" +#, fuzzy +#~ msgid "Access Token" +#~ msgstr "Erişim Günlükleri" + +#, fuzzy +#~ msgid "Bot Token" +#~ msgstr "API Token" + +#, fuzzy +#~ msgid "Server URL" +#~ msgstr "Sunucu Bilgisi" + #~ msgid "Do you want to disable this site?" #~ msgstr "Bu siteyi devre dışı bırakmak istiyor musunuz?" diff --git a/app/src/language/vi_VN/app.po b/app/src/language/vi_VN/app.po index 825a6a34..a4f1446d 100644 --- a/app/src/language/vi_VN/app.po +++ b/app/src/language/vi_VN/app.po @@ -45,6 +45,7 @@ msgstr "Người dùng" #: src/views/nginx_log/NginxLogList.vue:53 #: src/views/notification/notificationColumns.tsx:66 #: src/views/preference/AuthSettings.vue:30 +#: src/views/preference/components/ExternalNotify/columns.ts:46 #: src/views/site/site_list/columns.tsx:117 src/views/stream/StreamList.vue:74 #: src/views/user/userColumns.tsx:60 msgid "Action" @@ -113,7 +114,7 @@ msgstr "" msgid "All" msgstr "" -#: src/components/Notification/notifications.ts:137 +#: src/components/Notification/notifications.ts:175 #: src/language/constants.ts:58 msgid "All Recovery Codes Have Been Used" msgstr "" @@ -139,7 +140,7 @@ msgstr "" msgid "API Type" msgstr "Loại" -#: src/views/preference/Preference.vue:162 +#: src/views/preference/Preference.vue:163 msgid "App" msgstr "" @@ -202,7 +203,7 @@ msgstr "Bạn chắc chắn muốn xóa nó " msgid "Are you sure you want to delete this item?" msgstr "Bạn chắc chắn muốn xóa nó " -#: src/views/site/site_list/SiteList.vue:163 +#: src/views/site/site_list/SiteList.vue:167 #: src/views/stream/StreamList.vue:227 #, fuzzy msgid "Are you sure you want to delete?" @@ -253,7 +254,7 @@ msgstr "" msgid "Attempts" msgstr "" -#: src/views/preference/Preference.vue:186 +#: src/views/preference/Preference.vue:193 #, fuzzy msgid "Auth" msgstr "Tác giả" @@ -339,12 +340,16 @@ msgstr "" msgid "Banned Until" msgstr "" +#: src/views/preference/components/ExternalNotify/bark.ts:5 +msgid "Bark" +msgstr "" + #: src/views/site/site_add/SiteAdd.vue:95 msgid "Base information" msgstr "Thông tin" #: src/views/config/ConfigEditor.vue:290 -#: src/views/site/site_edit/RightSettings.vue:53 +#: src/views/site/site_edit/RightSettings.vue:52 #: src/views/stream/components/RightSettings.vue:79 #, fuzzy msgid "Basic" @@ -419,7 +424,7 @@ msgstr "" msgid "Cannot remove initial user" msgstr "" -#: src/views/preference/Preference.vue:192 +#: src/views/preference/Preference.vue:199 #, fuzzy msgid "Cert" msgstr "Tự động ký chứng chỉ SSL" @@ -428,11 +433,43 @@ msgstr "Tự động ký chứng chỉ SSL" msgid "Cert path is not under the nginx conf dir" msgstr "" +#: src/components/Notification/notifications.ts:28 +#, fuzzy +msgid "Certificate %{name} has expired" +msgstr "Mẫu Cấu hình" + +#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:36 +#: src/components/Notification/notifications.ts:40 +msgid "Certificate %{name} will expire in %{days} days" +msgstr "" + +#: src/components/Notification/notifications.ts:44 +msgid "Certificate %{name} will expire in 1 day" +msgstr "" + #: src/constants/errors/cert.ts:4 #, fuzzy msgid "Certificate decode error" msgstr "Gia hạn chứng chỉ SSL thất bại" +#: src/components/Notification/notifications.ts:31 +#, fuzzy +msgid "Certificate Expiration Notice" +msgstr "Mẫu Cấu hình" + +#: src/components/Notification/notifications.ts:27 +#, fuzzy +msgid "Certificate Expired" +msgstr "Danh sách chứng chỉ" + +#: src/components/Notification/notifications.ts:35 +#: src/components/Notification/notifications.ts:39 +#: src/components/Notification/notifications.ts:43 +#, fuzzy +msgid "Certificate Expiring Soon" +msgstr "Chứng chỉ đã hết hạn" + #: src/constants/errors/cert.ts:5 #, fuzzy msgid "Certificate parse error" @@ -699,6 +736,7 @@ msgstr "" #: src/views/environments/group/columns.ts:31 #: src/views/notification/notificationColumns.tsx:59 +#: src/views/preference/components/ExternalNotify/columns.ts:41 #: src/views/preference/components/Passkey.vue:95 #: src/views/user/userColumns.tsx:48 msgid "Created at" @@ -771,7 +809,7 @@ msgstr "Mô tả" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519 #: src/views/site/ngx_conf/NgxServer.vue:110 #: src/views/site/ngx_conf/NgxUpstream.vue:128 -#: src/views/site/site_list/SiteList.vue:172 +#: src/views/site/site_list/SiteList.vue:176 #: src/views/stream/StreamList.vue:236 msgid "Delete" msgstr "Xoá" @@ -781,46 +819,46 @@ msgstr "Xoá" msgid "Delete Permanently" msgstr "" -#: src/components/Notification/notifications.ts:37 src/language/constants.ts:50 +#: src/components/Notification/notifications.ts:75 src/language/constants.ts:50 #, fuzzy msgid "Delete Remote Site Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:41 src/language/constants.ts:49 +#: src/components/Notification/notifications.ts:79 src/language/constants.ts:49 #, fuzzy msgid "Delete Remote Site Success" msgstr "Gia hạn chứng chỉ SSL thành công" -#: src/components/Notification/notifications.ts:95 +#: src/components/Notification/notifications.ts:133 #, fuzzy msgid "Delete Remote Stream Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:99 +#: src/components/Notification/notifications.ts:137 #, fuzzy msgid "Delete Remote Stream Success" msgstr "Gia hạn chứng chỉ SSL thành công" -#: src/components/Notification/notifications.ts:38 +#: src/components/Notification/notifications.ts:76 #, fuzzy msgid "Delete site %{name} from %{node} failed" msgstr "Triển khai %{conf_name} tới %{node_name} thất bại" -#: src/components/Notification/notifications.ts:42 +#: src/components/Notification/notifications.ts:80 #, fuzzy msgid "Delete site %{name} from %{node} successfully" msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" -#: src/views/site/site_list/SiteList.vue:94 +#: src/views/site/site_list/SiteList.vue:98 msgid "Delete site: %{site_name}" msgstr "Xoá trang web: %{site_name}" -#: src/components/Notification/notifications.ts:96 +#: src/components/Notification/notifications.ts:134 #, fuzzy msgid "Delete stream %{name} from %{node} failed" msgstr "Triển khai %{conf_name} tới %{node_name} thất bại" -#: src/components/Notification/notifications.ts:100 +#: src/components/Notification/notifications.ts:138 #, fuzzy msgid "Delete stream %{name} from %{node} successfully" msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" @@ -860,6 +898,10 @@ msgstr "Chi tiết" msgid "Development Mode" msgstr "Chế độ phát triển" +#: src/views/preference/components/ExternalNotify/dingtalk.ts:5 +msgid "DingTalk" +msgstr "" + #: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89 msgid "Directive" msgstr "Directive" @@ -894,62 +936,62 @@ msgstr "Tắt" msgid "Disable auto-renewal failed for %{name}" msgstr "Tắt tự động gia hạn SSL cho %{name} thất bại" -#: src/components/Notification/notifications.ts:45 src/language/constants.ts:52 +#: src/components/Notification/notifications.ts:83 src/language/constants.ts:52 #, fuzzy msgid "Disable Remote Site Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:69 +#: src/components/Notification/notifications.ts:107 #, fuzzy msgid "Disable Remote Site Maintenance Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:73 +#: src/components/Notification/notifications.ts:111 #, fuzzy msgid "Disable Remote Site Maintenance Success" msgstr "Gia hạn chứng chỉ SSL thành công" -#: src/components/Notification/notifications.ts:49 src/language/constants.ts:51 +#: src/components/Notification/notifications.ts:87 src/language/constants.ts:51 #, fuzzy msgid "Disable Remote Site Success" msgstr "Gia hạn chứng chỉ SSL thành công" -#: src/components/Notification/notifications.ts:103 +#: src/components/Notification/notifications.ts:141 #, fuzzy msgid "Disable Remote Stream Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:107 +#: src/components/Notification/notifications.ts:145 #, fuzzy msgid "Disable Remote Stream Success" msgstr "Gia hạn chứng chỉ SSL thành công" -#: src/components/Notification/notifications.ts:46 +#: src/components/Notification/notifications.ts:84 #, fuzzy msgid "Disable site %{name} from %{node} failed" msgstr "Đã bật %{conf_name} trên %{node_name}" -#: src/components/Notification/notifications.ts:50 +#: src/components/Notification/notifications.ts:88 #, fuzzy msgid "Disable site %{name} from %{node} successfully" msgstr "Đã bật %{conf_name} trên %{node_name}" -#: src/components/Notification/notifications.ts:70 +#: src/components/Notification/notifications.ts:108 #, fuzzy msgid "Disable site %{name} maintenance on %{node} failed" msgstr "Đã bật %{conf_name} trên %{node_name}" -#: src/components/Notification/notifications.ts:74 +#: src/components/Notification/notifications.ts:112 #, fuzzy msgid "Disable site %{name} maintenance on %{node} successfully" msgstr "Đã bật %{conf_name} trên %{node_name}" -#: src/components/Notification/notifications.ts:104 +#: src/components/Notification/notifications.ts:142 #, fuzzy msgid "Disable stream %{name} from %{node} failed" msgstr "Không thể bật %{conf_name} trên %{node_name}" -#: src/components/Notification/notifications.ts:108 +#: src/components/Notification/notifications.ts:146 #, fuzzy msgid "Disable stream %{name} from %{node} successfully" msgstr "Đã bật %{conf_name} trên %{node_name}" @@ -1066,7 +1108,7 @@ msgid "" msgstr "" #: src/views/site/site_list/SiteDuplicate.vue:72 -#: src/views/site/site_list/SiteList.vue:158 +#: src/views/site/site_list/SiteList.vue:162 #: src/views/stream/components/StreamDuplicate.vue:64 #: src/views/stream/StreamList.vue:222 msgid "Duplicate" @@ -1139,62 +1181,62 @@ msgstr "Bật không thành công" msgid "Enable HTTPS" msgstr "Bật TLS" -#: src/components/Notification/notifications.ts:53 src/language/constants.ts:54 +#: src/components/Notification/notifications.ts:91 src/language/constants.ts:54 #, fuzzy msgid "Enable Remote Site Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:61 +#: src/components/Notification/notifications.ts:99 #, fuzzy msgid "Enable Remote Site Maintenance Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:65 +#: src/components/Notification/notifications.ts:103 #, fuzzy msgid "Enable Remote Site Maintenance Success" msgstr "Gia hạn chứng chỉ SSL thành công" -#: src/components/Notification/notifications.ts:57 src/language/constants.ts:53 +#: src/components/Notification/notifications.ts:95 src/language/constants.ts:53 #, fuzzy msgid "Enable Remote Site Success" msgstr "Gia hạn chứng chỉ SSL thành công" -#: src/components/Notification/notifications.ts:111 +#: src/components/Notification/notifications.ts:149 #, fuzzy msgid "Enable Remote Stream Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:115 +#: src/components/Notification/notifications.ts:153 #, fuzzy msgid "Enable Remote Stream Success" msgstr "Gia hạn chứng chỉ SSL thành công" -#: src/components/Notification/notifications.ts:62 +#: src/components/Notification/notifications.ts:100 #, fuzzy msgid "Enable site %{name} maintenance on %{node} failed" msgstr "Không thể bật %{conf_name} trên %{node_name}" -#: src/components/Notification/notifications.ts:66 +#: src/components/Notification/notifications.ts:104 #, fuzzy msgid "Enable site %{name} maintenance on %{node} successfully" msgstr "Đã bật %{conf_name} trên %{node_name}" -#: src/components/Notification/notifications.ts:54 +#: src/components/Notification/notifications.ts:92 #, fuzzy msgid "Enable site %{name} on %{node} failed" msgstr "Không thể bật %{conf_name} trên %{node_name}" -#: src/components/Notification/notifications.ts:58 +#: src/components/Notification/notifications.ts:96 #, fuzzy msgid "Enable site %{name} on %{node} successfully" msgstr "Đã bật %{conf_name} trên %{node_name}" -#: src/components/Notification/notifications.ts:112 +#: src/components/Notification/notifications.ts:150 #, fuzzy msgid "Enable stream %{name} on %{node} failed" msgstr "Không thể bật %{conf_name} trên %{node_name}" -#: src/components/Notification/notifications.ts:116 +#: src/components/Notification/notifications.ts:154 #, fuzzy msgid "Enable stream %{name} on %{node} successfully" msgstr "Đã bật %{conf_name} trên %{node_name}" @@ -1286,6 +1328,11 @@ msgstr "Ngày hết hạn: %{date}" msgid "Export" msgstr "Xuất" +#: src/views/preference/ExternalNotify.vue:10 +#: src/views/preference/Preference.vue:169 +msgid "External Notify" +msgstr "" + #: src/views/site/cert/components/ObtainCertLive.vue:94 #, fuzzy msgid "Fail to obtain certificate" @@ -1688,7 +1735,7 @@ msgstr "Trang chủ" msgid "Host" msgstr "" -#: src/views/preference/Preference.vue:174 +#: src/views/preference/Preference.vue:181 msgid "HTTP" msgstr "" @@ -1746,12 +1793,12 @@ msgid "Import Certificate" msgstr "Chứng chỉ" #: src/views/nginx_log/NginxLogList.vue:137 -#: src/views/site/site_list/SiteList.vue:128 +#: src/views/site/site_list/SiteList.vue:132 msgid "Indexed" msgstr "" #: src/views/nginx_log/NginxLogList.vue:134 -#: src/views/site/site_list/SiteList.vue:125 +#: src/views/site/site_list/SiteList.vue:129 msgid "Indexing..." msgstr "" @@ -1836,6 +1883,11 @@ msgstr "E-mail không chính xác!" msgid "Invalid folder name" msgstr "" +#: src/constants/errors/notification.ts:3 +#, fuzzy +msgid "Invalid notifier config" +msgstr "Hợp lệ" + #: src/constants/errors/user.ts:4 #, fuzzy msgid "Invalid otp code" @@ -1900,6 +1952,19 @@ msgstr "" msgid "Key Type" msgstr "Loại" +#: src/views/preference/components/ExternalNotify/columns.ts:29 +msgid "Language" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark.ts:5 +msgid "Lark" +msgstr "" + +#: src/views/preference/components/ExternalNotify/lark_custom.ts:5 +#, fuzzy +msgid "Lark Custom" +msgstr "Tuỳ chỉnh" + #: src/views/system/Upgrade.vue:179 msgid "Last checked at" msgstr "Kiểm tra lần cuối lúc" @@ -2004,7 +2069,7 @@ msgstr "Đăng nhập thành công" msgid "Logout successful" msgstr "Đã đăng xuất" -#: src/views/preference/Preference.vue:210 +#: src/views/preference/Preference.vue:217 msgid "Logrotate" msgstr "" @@ -2047,7 +2112,7 @@ msgstr "" msgid "Manage Configs" msgstr "Quản lý cấu hình" -#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:121 +#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:125 msgid "Manage Sites" msgstr "Quản lý Website" @@ -2129,7 +2194,7 @@ msgstr "Single Directive" #: src/views/nginx_log/NginxLogList.vue:37 #: src/views/preference/components/AddPasskey.vue:75 #: src/views/site/ngx_conf/NgxUpstream.vue:177 -#: src/views/site/site_edit/RightSettings.vue:64 +#: src/views/site/site_edit/RightSettings.vue:63 #: src/views/site/site_list/columns.tsx:17 #: src/views/site/site_list/SiteDuplicate.vue:79 #: src/views/stream/components/RightSettings.vue:87 @@ -2179,7 +2244,7 @@ msgstr "Đã có phiên bản mới" msgid "Next" msgstr "Tiếp theo" -#: src/views/preference/Preference.vue:198 +#: src/views/preference/Preference.vue:205 msgid "Nginx" msgstr "" @@ -2322,7 +2387,7 @@ msgstr "Lỗi phân tích cú pháp cấu hình Nginx" #: src/views/preference/CertSettings.vue:73 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97 #: src/views/site/ngx_conf/LocationEditor.vue:88 -#: src/views/site/site_list/SiteList.vue:161 +#: src/views/site/site_list/SiteList.vue:165 #: src/views/stream/StreamList.vue:225 msgid "No" msgstr "Không" @@ -2337,12 +2402,12 @@ msgstr "Hành động" msgid "No records selected" msgstr "" -#: src/views/preference/Preference.vue:168 +#: src/views/preference/Preference.vue:175 #, fuzzy msgid "Node" msgstr "Username" -#: src/views/site/site_edit/RightSettings.vue:67 +#: src/views/site/site_edit/RightSettings.vue:66 #: src/views/site/site_list/columns.tsx:63 #: src/views/stream/components/RightSettings.vue:90 #: src/views/stream/StreamList.vue:30 @@ -2387,7 +2452,7 @@ msgstr "Không hợp lệ trước: %{date}" msgid "Note" msgstr "Ghi chú" -#: src/views/site/site_edit/RightSettings.vue:96 +#: src/views/site/site_edit/RightSettings.vue:95 #: src/views/stream/components/RightSettings.vue:118 msgid "" "Note, if the configuration file include other configurations or " @@ -2405,6 +2470,11 @@ msgstr "Thông báo" msgid "Notifications" msgstr "Thông báo" +#: src/constants/errors/notification.ts:2 +#, fuzzy +msgid "Notifier not found" +msgstr "Không tìm thấy tệp tin" + #: src/views/site/cert/components/ObtainCert.vue:182 #, fuzzy msgid "Obtain certificate" @@ -2448,7 +2518,7 @@ msgstr "" #: src/views/site/ngx_conf/NgxServer.vue:79 #: src/views/site/ngx_conf/NgxUpstream.vue:33 #: src/views/site/site_edit/components/SiteStatusSegmented.vue:121 -#: src/views/site/site_list/SiteList.vue:162 +#: src/views/site/site_list/SiteList.vue:166 #: src/views/stream/components/RightSettings.vue:54 #: src/views/stream/StreamList.vue:226 #: src/views/system/Backup/BackupCreator.vue:149 @@ -2471,7 +2541,7 @@ msgstr "Trực tuyến" msgid "Only zip files are allowed" msgstr "" -#: src/views/preference/Preference.vue:204 +#: src/views/preference/Preference.vue:211 msgid "OpenAI" msgstr "" @@ -2614,7 +2684,7 @@ msgstr "" "Trước tiên, vui lòng thêm thông tin xác thực trong Chứng chỉ > Thông tin xác " "thực DNS, sau đó chọn nhà cung cấp DNS" -#: src/components/Notification/notifications.ts:138 +#: src/components/Notification/notifications.ts:176 #: src/language/constants.ts:59 msgid "" "Please generate new recovery codes in the preferences immediately to prevent " @@ -2707,7 +2777,7 @@ msgstr "Hành động" msgid "Pre-release" msgstr "" -#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:151 +#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:152 msgid "Preference" msgstr "Cài đặt" @@ -2849,22 +2919,22 @@ msgstr "Tải lại" msgid "Reload Nginx" msgstr "Tải lại nginx" -#: src/components/Notification/notifications.ts:144 +#: src/components/Notification/notifications.ts:10 #, fuzzy msgid "Reload Nginx on %{node} failed, response: %{resp}" msgstr "Xoá trang web: %{site_name}" -#: src/components/Notification/notifications.ts:148 +#: src/components/Notification/notifications.ts:14 #, fuzzy msgid "Reload Nginx on %{node} successfully" msgstr "Cập nhật thành công" -#: src/components/Notification/notifications.ts:143 +#: src/components/Notification/notifications.ts:9 #, fuzzy msgid "Reload Remote Nginx Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:147 +#: src/components/Notification/notifications.ts:13 #, fuzzy msgid "Reload Remote Nginx Success" msgstr "Gia hạn chứng chỉ SSL thành công" @@ -2906,62 +2976,64 @@ msgstr "Xoá thành công" msgid "Rename" msgstr "Username" -#: src/components/Notification/notifications.ts:28 +#: src/components/Notification/notifications.ts:66 #, fuzzy msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed" msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" -#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:70 #, fuzzy msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully" msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" -#: src/components/Notification/notifications.ts:27 src/language/constants.ts:42 +#: src/components/Notification/notifications.ts:65 src/language/constants.ts:42 #, fuzzy msgid "Rename Remote Config Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:31 src/language/constants.ts:41 +#: src/components/Notification/notifications.ts:69 src/language/constants.ts:41 #, fuzzy msgid "Rename Remote Config Success" msgstr "Gia hạn chứng chỉ SSL thành công" -#: src/components/Notification/notifications.ts:77 src/language/constants.ts:56 +#: src/components/Notification/notifications.ts:115 +#: src/language/constants.ts:56 #, fuzzy msgid "Rename Remote Site Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:81 src/language/constants.ts:55 +#: src/components/Notification/notifications.ts:119 +#: src/language/constants.ts:55 #, fuzzy msgid "Rename Remote Site Success" msgstr "Gia hạn chứng chỉ SSL thành công" -#: src/components/Notification/notifications.ts:119 +#: src/components/Notification/notifications.ts:157 #, fuzzy msgid "Rename Remote Stream Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:123 +#: src/components/Notification/notifications.ts:161 #, fuzzy msgid "Rename Remote Stream Success" msgstr "Gia hạn chứng chỉ SSL thành công" -#: src/components/Notification/notifications.ts:78 +#: src/components/Notification/notifications.ts:116 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} failed" msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" -#: src/components/Notification/notifications.ts:82 +#: src/components/Notification/notifications.ts:120 #, fuzzy msgid "Rename site %{name} to %{new_name} on %{node} successfully" msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" -#: src/components/Notification/notifications.ts:120 +#: src/components/Notification/notifications.ts:158 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} failed" msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" -#: src/components/Notification/notifications.ts:124 +#: src/components/Notification/notifications.ts:162 #, fuzzy msgid "Rename stream %{name} to %{new_name} on %{node} successfully" msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" @@ -3028,22 +3100,22 @@ msgstr "Khởi động lại" msgid "Restart Nginx" msgstr "Đang khởi động lại" -#: src/components/Notification/notifications.ts:152 +#: src/components/Notification/notifications.ts:18 #, fuzzy msgid "Restart Nginx on %{node} failed, response: %{resp}" msgstr "Đã bật %{conf_name} trên %{node_name}" -#: src/components/Notification/notifications.ts:156 +#: src/components/Notification/notifications.ts:22 #, fuzzy msgid "Restart Nginx on %{node} successfully" msgstr "Cập nhật thành công" -#: src/components/Notification/notifications.ts:151 +#: src/components/Notification/notifications.ts:17 #, fuzzy msgid "Restart Remote Nginx Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:155 +#: src/components/Notification/notifications.ts:21 #, fuzzy msgid "Restart Remote Nginx Success" msgstr "Gia hạn chứng chỉ SSL thành công" @@ -3111,7 +3183,7 @@ msgstr "Running" #: src/views/config/components/ConfigName.vue:59 #: src/views/config/ConfigEditor.vue:271 #: src/views/preference/components/Passkey.vue:130 -#: src/views/preference/Preference.vue:221 +#: src/views/preference/Preference.vue:228 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127 #: src/views/site/site_edit/components/ConfigName.vue:52 #: src/views/site/site_edit/SiteEdit.vue:292 @@ -3129,42 +3201,44 @@ msgstr "Lưu Directive" msgid "Save error %{msg}" msgstr "Đã xảy ra lỗi khi lưu %{msg}" -#: src/components/Notification/notifications.ts:85 src/language/constants.ts:48 +#: src/components/Notification/notifications.ts:123 +#: src/language/constants.ts:48 #, fuzzy msgid "Save Remote Site Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:89 src/language/constants.ts:47 +#: src/components/Notification/notifications.ts:127 +#: src/language/constants.ts:47 #, fuzzy msgid "Save Remote Site Success" msgstr "Gia hạn chứng chỉ SSL thành công" -#: src/components/Notification/notifications.ts:127 +#: src/components/Notification/notifications.ts:165 #, fuzzy msgid "Save Remote Stream Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:131 +#: src/components/Notification/notifications.ts:169 #, fuzzy msgid "Save Remote Stream Success" msgstr "Gia hạn chứng chỉ SSL thành công" -#: src/components/Notification/notifications.ts:86 +#: src/components/Notification/notifications.ts:124 #, fuzzy msgid "Save site %{name} to %{node} failed" msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" -#: src/components/Notification/notifications.ts:90 +#: src/components/Notification/notifications.ts:128 #, fuzzy msgid "Save site %{name} to %{node} successfully" msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" -#: src/components/Notification/notifications.ts:128 +#: src/components/Notification/notifications.ts:166 #, fuzzy msgid "Save stream %{name} to %{node} failed" msgstr "Triển khai %{conf_name} tới %{node_name} thất bại" -#: src/components/Notification/notifications.ts:132 +#: src/components/Notification/notifications.ts:170 #, fuzzy msgid "Save stream %{name} to %{node} successfully" msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" @@ -3172,7 +3246,7 @@ msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97 #: src/views/certificate/CertificateEditor.vue:49 -#: src/views/preference/Preference.vue:123 +#: src/views/preference/Preference.vue:124 #, fuzzy msgid "Save successfully" msgstr "Lưu thành công" @@ -3223,7 +3297,7 @@ msgstr "" msgid "Send" msgstr "Gửi" -#: src/views/preference/Preference.vue:156 +#: src/views/preference/Preference.vue:157 #, fuzzy msgid "Server" msgstr "Thông tin máy chủ" @@ -3407,7 +3481,7 @@ msgstr "" #: src/views/certificate/ACMEUser.vue:65 #: src/views/certificate/CertificateList/certColumns.tsx:65 #: src/views/environments/list/envColumns.tsx:44 -#: src/views/site/site_edit/RightSettings.vue:56 +#: src/views/site/site_edit/RightSettings.vue:55 #: src/views/site/site_list/columns.tsx:80 src/views/stream/StreamList.vue:47 msgid "Status" msgstr "Trạng thái" @@ -3484,42 +3558,42 @@ msgstr "" msgid "Sync Certificate" msgstr "Gia hạn chứng chỉ SSL" -#: src/components/Notification/notifications.ts:10 +#: src/components/Notification/notifications.ts:48 #, fuzzy msgid "Sync Certificate %{cert_name} to %{env_name} failed" msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" -#: src/components/Notification/notifications.ts:14 +#: src/components/Notification/notifications.ts:52 #, fuzzy msgid "Sync Certificate %{cert_name} to %{env_name} successfully" msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" -#: src/components/Notification/notifications.ts:9 src/language/constants.ts:39 +#: src/components/Notification/notifications.ts:47 src/language/constants.ts:39 #, fuzzy msgid "Sync Certificate Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:13 src/language/constants.ts:38 +#: src/components/Notification/notifications.ts:51 src/language/constants.ts:38 #, fuzzy msgid "Sync Certificate Success" msgstr "Gia hạn chứng chỉ SSL thành công" -#: src/components/Notification/notifications.ts:20 +#: src/components/Notification/notifications.ts:58 #, fuzzy msgid "Sync config %{config_name} to %{env_name} failed" msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" -#: src/components/Notification/notifications.ts:24 +#: src/components/Notification/notifications.ts:62 #, fuzzy msgid "Sync config %{config_name} to %{env_name} successfully" msgstr "Nhân bản %{conf_name} thành %{node_name} thành công" -#: src/components/Notification/notifications.ts:19 src/language/constants.ts:45 +#: src/components/Notification/notifications.ts:57 src/language/constants.ts:45 #, fuzzy msgid "Sync Config Error" msgstr "Gia hạn chứng chỉ SSL thất bại" -#: src/components/Notification/notifications.ts:23 src/language/constants.ts:44 +#: src/components/Notification/notifications.ts:61 src/language/constants.ts:44 #, fuzzy msgid "Sync Config Success" msgstr "Gia hạn chứng chỉ SSL thành công" @@ -3529,8 +3603,8 @@ msgstr "Gia hạn chứng chỉ SSL thành công" msgid "Sync Nodes" msgstr "" -#: src/views/site/site_edit/RightSettings.vue:102 -#: src/views/site/site_edit/RightSettings.vue:89 +#: src/views/site/site_edit/RightSettings.vue:101 +#: src/views/site/site_edit/RightSettings.vue:88 #: src/views/stream/components/RightSettings.vue:111 #: src/views/stream/components/RightSettings.vue:124 #, fuzzy @@ -3541,7 +3615,7 @@ msgstr "Gia hạn chứng chỉ SSL" msgid "Sync to" msgstr "" -#: src/views/site/site_edit/RightSettings.vue:86 +#: src/views/site/site_edit/RightSettings.vue:85 #: src/views/stream/components/RightSettings.vue:108 msgid "Synchronization" msgstr "" @@ -3574,7 +3648,11 @@ msgstr "Restart Nginx thành công" msgid "Task not found" msgstr "Không tìm thấy tệp tin" -#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:180 +#: src/views/preference/components/ExternalNotify/telegram.ts:5 +msgid "Telegram" +msgstr "" + +#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:187 #: src/views/terminal/Terminal.vue:129 msgid "Terminal" msgstr "Terminal" @@ -3823,6 +3901,7 @@ msgstr "" #: src/views/certificate/CertificateList/certColumns.tsx:25 #: src/views/nginx_log/NginxLogList.vue:21 #: src/views/notification/notificationColumns.tsx:9 +#: src/views/preference/components/ExternalNotify/columns.ts:17 msgid "Type" msgstr "Loại" @@ -3840,7 +3919,7 @@ msgstr "Cập nhật thành công" #: src/views/config/configColumns.tsx:36 src/views/config/ConfigEditor.vue:325 #: src/views/environments/group/columns.ts:37 #: src/views/environments/list/envColumns.tsx:90 -#: src/views/site/site_edit/RightSettings.vue:76 +#: src/views/site/site_edit/RightSettings.vue:75 #: src/views/site/site_list/columns.tsx:110 #: src/views/stream/components/RightSettings.vue:99 #: src/views/stream/StreamList.vue:67 src/views/user/userColumns.tsx:54 @@ -4009,7 +4088,7 @@ msgid "" "Pebble as CA." msgstr "" -#: src/views/site/site_edit/RightSettings.vue:92 +#: src/views/site/site_edit/RightSettings.vue:91 msgid "" "When you enable/disable, delete, or save this site, the nodes set in the " "Node Group and the nodes selected below will be synchronized." @@ -4101,6 +4180,14 @@ msgstr "" msgid "Your passkeys" msgstr "" +#, fuzzy +#~ msgid "Access Token" +#~ msgstr "Log truy cập" + +#, fuzzy +#~ msgid "Server URL" +#~ msgstr "Thông tin máy chủ" + #, fuzzy #~ msgid "Do you want to disable this site?" #~ msgstr "Bạn muốn tắt trang web này ?" diff --git a/app/src/language/zh_CN/app.po b/app/src/language/zh_CN/app.po index 6be599f9..bbb03f41 100644 --- a/app/src/language/zh_CN/app.po +++ b/app/src/language/zh_CN/app.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2025-04-08 10:49+0800\n" +"PO-Revision-Date: 2025-04-09 22:02+0800\n" "Last-Translator: 0xJacky \n" "Language-Team: Chinese (Simplified Han script) \n" @@ -49,6 +49,7 @@ msgstr "ACME 用户" #: src/views/nginx_log/NginxLogList.vue:53 #: src/views/notification/notificationColumns.tsx:66 #: src/views/preference/AuthSettings.vue:30 +#: src/views/preference/components/ExternalNotify/columns.ts:46 #: src/views/site/site_list/columns.tsx:117 src/views/stream/StreamList.vue:74 #: src/views/user/userColumns.tsx:60 msgid "Action" @@ -113,7 +114,7 @@ msgstr "然后,刷新此页面并再次点击添加 Passkey。" msgid "All" msgstr "全部" -#: src/components/Notification/notifications.ts:137 +#: src/components/Notification/notifications.ts:175 #: src/language/constants.ts:58 msgid "All Recovery Codes Have Been Used" msgstr "所有恢复码都已被使用" @@ -138,7 +139,7 @@ msgstr "API Token" msgid "API Type" msgstr "API 类型" -#: src/views/preference/Preference.vue:162 +#: src/views/preference/Preference.vue:163 msgid "App" msgstr "App" @@ -191,7 +192,7 @@ msgstr "您确定要永久删除此项目吗?" msgid "Are you sure you want to delete this item?" msgstr "你确定要删除这个项目吗?" -#: src/views/site/site_list/SiteList.vue:163 +#: src/views/site/site_list/SiteList.vue:167 #: src/views/stream/StreamList.vue:227 msgid "Are you sure you want to delete?" msgstr "您确定要删除吗?" @@ -236,7 +237,7 @@ msgstr "尝试修复" msgid "Attempts" msgstr "尝试次数" -#: src/views/preference/Preference.vue:186 +#: src/views/preference/Preference.vue:193 msgid "Auth" msgstr "认证" @@ -317,12 +318,16 @@ msgstr "禁止 IP 列表" msgid "Banned Until" msgstr "禁用至" +#: src/views/preference/components/ExternalNotify/bark.ts:5 +msgid "Bark" +msgstr "Bark" + #: src/views/site/site_add/SiteAdd.vue:95 msgid "Base information" msgstr "基本信息" #: src/views/config/ConfigEditor.vue:290 -#: src/views/site/site_edit/RightSettings.vue:53 +#: src/views/site/site_edit/RightSettings.vue:52 #: src/views/stream/components/RightSettings.vue:79 msgid "Basic" msgstr "基本" @@ -392,7 +397,7 @@ msgstr "无法比较:内容缺失" msgid "Cannot remove initial user" msgstr "不可删除初始用户" -#: src/views/preference/Preference.vue:192 +#: src/views/preference/Preference.vue:199 msgid "Cert" msgstr "证书" @@ -400,10 +405,38 @@ msgstr "证书" msgid "Cert path is not under the nginx conf dir" msgstr "证书路径不在 Nginx 配置目录下" +#: src/components/Notification/notifications.ts:28 +msgid "Certificate %{name} has expired" +msgstr "证书 %{name} 已过期" + +#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:36 +#: src/components/Notification/notifications.ts:40 +msgid "Certificate %{name} will expire in %{days} days" +msgstr "证书 %{name} 将在 %{days} 天后失效" + +#: src/components/Notification/notifications.ts:44 +msgid "Certificate %{name} will expire in 1 day" +msgstr "证书 %{name} 将在 1 天后过期" + #: src/constants/errors/cert.ts:4 msgid "Certificate decode error" msgstr "证书解码错误" +#: src/components/Notification/notifications.ts:31 +msgid "Certificate Expiration Notice" +msgstr "证书到期通知" + +#: src/components/Notification/notifications.ts:27 +msgid "Certificate Expired" +msgstr "证书过期" + +#: src/components/Notification/notifications.ts:35 +#: src/components/Notification/notifications.ts:39 +#: src/components/Notification/notifications.ts:43 +msgid "Certificate Expiring Soon" +msgstr "证书即将到期" + #: src/constants/errors/cert.ts:5 msgid "Certificate parse error" msgstr "证书解析错误" @@ -652,6 +685,7 @@ msgstr "" #: src/views/environments/group/columns.ts:31 #: src/views/notification/notificationColumns.tsx:59 +#: src/views/preference/components/ExternalNotify/columns.ts:41 #: src/views/preference/components/Passkey.vue:95 #: src/views/user/userColumns.tsx:48 msgid "Created at" @@ -721,7 +755,7 @@ msgstr "解密失败" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519 #: src/views/site/ngx_conf/NgxServer.vue:110 #: src/views/site/ngx_conf/NgxUpstream.vue:128 -#: src/views/site/site_list/SiteList.vue:172 +#: src/views/site/site_list/SiteList.vue:176 #: src/views/stream/StreamList.vue:236 msgid "Delete" msgstr "删除" @@ -731,39 +765,39 @@ msgstr "删除" msgid "Delete Permanently" msgstr "彻底删除" -#: src/components/Notification/notifications.ts:37 src/language/constants.ts:50 +#: src/components/Notification/notifications.ts:75 src/language/constants.ts:50 msgid "Delete Remote Site Error" msgstr "删除远程站点错误" -#: src/components/Notification/notifications.ts:41 src/language/constants.ts:49 +#: src/components/Notification/notifications.ts:79 src/language/constants.ts:49 msgid "Delete Remote Site Success" msgstr "删除远程站点成功" -#: src/components/Notification/notifications.ts:95 +#: src/components/Notification/notifications.ts:133 msgid "Delete Remote Stream Error" msgstr "删除远程 Stream 错误" -#: src/components/Notification/notifications.ts:99 +#: src/components/Notification/notifications.ts:137 msgid "Delete Remote Stream Success" msgstr "删除远程 Stream 成功" -#: src/components/Notification/notifications.ts:38 +#: src/components/Notification/notifications.ts:76 msgid "Delete site %{name} from %{node} failed" msgstr "部署 %{name} 到 %{node} 失败" -#: src/components/Notification/notifications.ts:42 +#: src/components/Notification/notifications.ts:80 msgid "Delete site %{name} from %{node} successfully" msgstr "成功从 %{node} 中删除站点 %{name}" -#: src/views/site/site_list/SiteList.vue:94 +#: src/views/site/site_list/SiteList.vue:98 msgid "Delete site: %{site_name}" msgstr "删除站点: %{site_name}" -#: src/components/Notification/notifications.ts:96 +#: src/components/Notification/notifications.ts:134 msgid "Delete stream %{name} from %{node} failed" msgstr "部署 %{name} 到 %{node} 失败" -#: src/components/Notification/notifications.ts:100 +#: src/components/Notification/notifications.ts:138 msgid "Delete stream %{name} from %{node} successfully" msgstr "成功从 %{node} 中删除站点 %{name}" @@ -800,6 +834,10 @@ msgstr "详情" msgid "Development Mode" msgstr "开发模式" +#: src/views/preference/components/ExternalNotify/dingtalk.ts:5 +msgid "DingTalk" +msgstr "钉钉" + #: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89 msgid "Directive" msgstr "指令" @@ -832,51 +870,51 @@ msgstr "禁用" msgid "Disable auto-renewal failed for %{name}" msgstr "关闭 %{name} 自动续签失败" -#: src/components/Notification/notifications.ts:45 src/language/constants.ts:52 +#: src/components/Notification/notifications.ts:83 src/language/constants.ts:52 msgid "Disable Remote Site Error" msgstr "禁用远程站点错误" -#: src/components/Notification/notifications.ts:69 +#: src/components/Notification/notifications.ts:107 msgid "Disable Remote Site Maintenance Error" msgstr "禁用远程站点维护错误" -#: src/components/Notification/notifications.ts:73 +#: src/components/Notification/notifications.ts:111 msgid "Disable Remote Site Maintenance Success" msgstr "禁用远程站点维护成功" -#: src/components/Notification/notifications.ts:49 src/language/constants.ts:51 +#: src/components/Notification/notifications.ts:87 src/language/constants.ts:51 msgid "Disable Remote Site Success" msgstr "禁用远程站点成功" -#: src/components/Notification/notifications.ts:103 +#: src/components/Notification/notifications.ts:141 msgid "Disable Remote Stream Error" msgstr "禁用远程 Stream 错误" -#: src/components/Notification/notifications.ts:107 +#: src/components/Notification/notifications.ts:145 msgid "Disable Remote Stream Success" msgstr "禁用远程 Stream成功" -#: src/components/Notification/notifications.ts:46 +#: src/components/Notification/notifications.ts:84 msgid "Disable site %{name} from %{node} failed" msgstr "在 %{node} 上禁用 %{name} 成功" -#: src/components/Notification/notifications.ts:50 +#: src/components/Notification/notifications.ts:88 msgid "Disable site %{name} from %{node} successfully" msgstr "在 %{node} 上禁用 %{name} 成功" -#: src/components/Notification/notifications.ts:70 +#: src/components/Notification/notifications.ts:108 msgid "Disable site %{name} maintenance on %{node} failed" msgstr "停用站点 %{name} 维护 %{node} 失败" -#: src/components/Notification/notifications.ts:74 +#: src/components/Notification/notifications.ts:112 msgid "Disable site %{name} maintenance on %{node} successfully" msgstr "成功停用站点 %{name} 上 %{node} 的维护功能" -#: src/components/Notification/notifications.ts:104 +#: src/components/Notification/notifications.ts:142 msgid "Disable stream %{name} from %{node} failed" msgstr "在 %{node} 中启用 %{name} 失败" -#: src/components/Notification/notifications.ts:108 +#: src/components/Notification/notifications.ts:146 msgid "Disable stream %{name} from %{node} successfully" msgstr "在 %{node} 上禁用 %{name} 成功" @@ -984,7 +1022,7 @@ msgstr "" "使用 Passkey。" #: src/views/site/site_list/SiteDuplicate.vue:72 -#: src/views/site/site_list/SiteList.vue:158 +#: src/views/site/site_list/SiteList.vue:162 #: src/views/stream/components/StreamDuplicate.vue:64 #: src/views/stream/StreamList.vue:222 msgid "Duplicate" @@ -1049,51 +1087,51 @@ msgstr "启用失败" msgid "Enable HTTPS" msgstr "启用 HTTPS" -#: src/components/Notification/notifications.ts:53 src/language/constants.ts:54 +#: src/components/Notification/notifications.ts:91 src/language/constants.ts:54 msgid "Enable Remote Site Error" msgstr "启用远程站点错误" -#: src/components/Notification/notifications.ts:61 +#: src/components/Notification/notifications.ts:99 msgid "Enable Remote Site Maintenance Error" msgstr "在 %{node} 上启用 %{site} 失败" -#: src/components/Notification/notifications.ts:65 +#: src/components/Notification/notifications.ts:103 msgid "Enable Remote Site Maintenance Success" msgstr "成功启用远程站点维护" -#: src/components/Notification/notifications.ts:57 src/language/constants.ts:53 +#: src/components/Notification/notifications.ts:95 src/language/constants.ts:53 msgid "Enable Remote Site Success" msgstr "启用远程站点成功" -#: src/components/Notification/notifications.ts:111 +#: src/components/Notification/notifications.ts:149 msgid "Enable Remote Stream Error" msgstr "启用远程 Steam 错误" -#: src/components/Notification/notifications.ts:115 +#: src/components/Notification/notifications.ts:153 msgid "Enable Remote Stream Success" msgstr "启用远程 Stream 成功" -#: src/components/Notification/notifications.ts:62 +#: src/components/Notification/notifications.ts:100 msgid "Enable site %{name} maintenance on %{node} failed" msgstr "在 %{node} 中为 %{name} 启用维护模式失败" -#: src/components/Notification/notifications.ts:66 +#: src/components/Notification/notifications.ts:104 msgid "Enable site %{name} maintenance on %{node} successfully" msgstr "在 %{node} 上成功启用站点 %{name} 维护模式" -#: src/components/Notification/notifications.ts:54 +#: src/components/Notification/notifications.ts:92 msgid "Enable site %{name} on %{node} failed" msgstr "在 %{node} 中启用 %{name} 失败" -#: src/components/Notification/notifications.ts:58 +#: src/components/Notification/notifications.ts:96 msgid "Enable site %{name} on %{node} successfully" msgstr "在 %{node} 上启用 %{name} 成功" -#: src/components/Notification/notifications.ts:112 +#: src/components/Notification/notifications.ts:150 msgid "Enable stream %{name} on %{node} failed" msgstr "在 %{node} 中启用 %{name} 失败" -#: src/components/Notification/notifications.ts:116 +#: src/components/Notification/notifications.ts:154 msgid "Enable stream %{name} on %{node} successfully" msgstr "在 %{node} 上启用 %{name} 成功" @@ -1179,6 +1217,11 @@ msgstr "过期时间: %{date}" msgid "Export" msgstr "导出" +#: src/views/preference/ExternalNotify.vue:10 +#: src/views/preference/Preference.vue:169 +msgid "External Notify" +msgstr "外部通知" + #: src/views/site/cert/components/ObtainCertLive.vue:94 msgid "Fail to obtain certificate" msgstr "获取证书失败" @@ -1539,7 +1582,7 @@ msgstr "首页" msgid "Host" msgstr "主机" -#: src/views/preference/Preference.vue:174 +#: src/views/preference/Preference.vue:181 msgid "HTTP" msgstr "HTTP" @@ -1598,12 +1641,12 @@ msgid "Import Certificate" msgstr "导入证书" #: src/views/nginx_log/NginxLogList.vue:137 -#: src/views/site/site_list/SiteList.vue:128 +#: src/views/site/site_list/SiteList.vue:132 msgid "Indexed" msgstr "已索引" #: src/views/nginx_log/NginxLogList.vue:134 -#: src/views/site/site_list/SiteList.vue:125 +#: src/views/site/site_list/SiteList.vue:129 msgid "Indexing..." msgstr "索引中..." @@ -1683,6 +1726,10 @@ msgstr "文件名无效" msgid "Invalid folder name" msgstr "无效文件夹名" +#: src/constants/errors/notification.ts:3 +msgid "Invalid notifier config" +msgstr "通知配置无效" + #: src/constants/errors/user.ts:4 msgid "Invalid otp code" msgstr "无效的 OTP 代码" @@ -1743,6 +1790,18 @@ msgstr "" msgid "Key Type" msgstr "密钥类型" +#: src/views/preference/components/ExternalNotify/columns.ts:29 +msgid "Language" +msgstr "语言" + +#: src/views/preference/components/ExternalNotify/lark.ts:5 +msgid "Lark" +msgstr "Lark" + +#: src/views/preference/components/ExternalNotify/lark_custom.ts:5 +msgid "Lark Custom" +msgstr "Lark 自定义" + #: src/views/system/Upgrade.vue:179 msgid "Last checked at" msgstr "最后检查时间" @@ -1838,7 +1897,7 @@ msgstr "登录成功" msgid "Logout successful" msgstr "登出成功" -#: src/views/preference/Preference.vue:210 +#: src/views/preference/Preference.vue:217 msgid "Logrotate" msgstr "Logrotate" @@ -1882,7 +1941,7 @@ msgstr "" msgid "Manage Configs" msgstr "配置管理" -#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:121 +#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:125 msgid "Manage Sites" msgstr "网站管理" @@ -1958,7 +2017,7 @@ msgstr "多行指令" #: src/views/nginx_log/NginxLogList.vue:37 #: src/views/preference/components/AddPasskey.vue:75 #: src/views/site/ngx_conf/NgxUpstream.vue:177 -#: src/views/site/site_edit/RightSettings.vue:64 +#: src/views/site/site_edit/RightSettings.vue:63 #: src/views/site/site_list/columns.tsx:17 #: src/views/site/site_list/SiteDuplicate.vue:79 #: src/views/stream/components/RightSettings.vue:87 @@ -2005,7 +2064,7 @@ msgstr "新版本发布" msgid "Next" msgstr "下一步" -#: src/views/preference/Preference.vue:198 +#: src/views/preference/Preference.vue:205 msgid "Nginx" msgstr "Nginx" @@ -2138,7 +2197,7 @@ msgstr "Nginx UI 配置已恢复,几秒钟后将自动重启。" #: src/views/preference/CertSettings.vue:73 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97 #: src/views/site/ngx_conf/LocationEditor.vue:88 -#: src/views/site/site_list/SiteList.vue:161 +#: src/views/site/site_list/SiteList.vue:165 #: src/views/stream/StreamList.vue:225 msgid "No" msgstr "取消" @@ -2152,11 +2211,11 @@ msgstr "无操作" msgid "No records selected" msgstr "未选择记录" -#: src/views/preference/Preference.vue:168 +#: src/views/preference/Preference.vue:175 msgid "Node" msgstr "节点" -#: src/views/site/site_edit/RightSettings.vue:67 +#: src/views/site/site_edit/RightSettings.vue:66 #: src/views/site/site_list/columns.tsx:63 #: src/views/stream/components/RightSettings.vue:90 #: src/views/stream/StreamList.vue:30 @@ -2197,7 +2256,7 @@ msgstr "此前无效: %{date}" msgid "Note" msgstr "注意" -#: src/views/site/site_edit/RightSettings.vue:96 +#: src/views/site/site_edit/RightSettings.vue:95 #: src/views/stream/components/RightSettings.vue:118 msgid "" "Note, if the configuration file include other configurations or " @@ -2213,6 +2272,10 @@ msgstr "通知" msgid "Notifications" msgstr "通知" +#: src/constants/errors/notification.ts:2 +msgid "Notifier not found" +msgstr "未找到通知程序" + #: src/views/site/cert/components/ObtainCert.vue:182 msgid "Obtain certificate" msgstr "获取证书" @@ -2255,7 +2318,7 @@ msgstr "确定" #: src/views/site/ngx_conf/NgxServer.vue:79 #: src/views/site/ngx_conf/NgxUpstream.vue:33 #: src/views/site/site_edit/components/SiteStatusSegmented.vue:121 -#: src/views/site/site_list/SiteList.vue:162 +#: src/views/site/site_list/SiteList.vue:166 #: src/views/stream/components/RightSettings.vue:54 #: src/views/stream/StreamList.vue:226 #: src/views/system/Backup/BackupCreator.vue:149 @@ -2278,7 +2341,7 @@ msgstr "在线" msgid "Only zip files are allowed" msgstr "只允许使用zip文件" -#: src/views/preference/Preference.vue:204 +#: src/views/preference/Preference.vue:211 msgid "OpenAI" msgstr "OpenAI" @@ -2419,7 +2482,7 @@ msgstr "" "请首先在 “证书”> “DNS 凭证” 中添加凭证,然后在下方选择一个凭证,请求 DNS 提供" "商的 API。" -#: src/components/Notification/notifications.ts:138 +#: src/components/Notification/notifications.ts:176 #: src/language/constants.ts:59 msgid "" "Please generate new recovery codes in the preferences immediately to prevent " @@ -2505,7 +2568,7 @@ msgstr "同步后操作" msgid "Pre-release" msgstr "预发布" -#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:151 +#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:152 msgid "Preference" msgstr "偏好设置" @@ -2639,19 +2702,19 @@ msgstr "重载" msgid "Reload Nginx" msgstr "重载 Nginx" -#: src/components/Notification/notifications.ts:144 +#: src/components/Notification/notifications.ts:10 msgid "Reload Nginx on %{node} failed, response: %{resp}" msgstr "在 %{node} 上重载 Nginx 失败,响应:%{resp}" -#: src/components/Notification/notifications.ts:148 +#: src/components/Notification/notifications.ts:14 msgid "Reload Nginx on %{node} successfully" msgstr "在 %{node} 上重载 Nginx 成功" -#: src/components/Notification/notifications.ts:143 +#: src/components/Notification/notifications.ts:9 msgid "Reload Remote Nginx Error" msgstr "重载远程 Nginx 错误" -#: src/components/Notification/notifications.ts:147 +#: src/components/Notification/notifications.ts:13 msgid "Reload Remote Nginx Success" msgstr "重载远程 Nginx 成功" @@ -2689,51 +2752,53 @@ msgstr "删除成功" msgid "Rename" msgstr "重命名" -#: src/components/Notification/notifications.ts:28 +#: src/components/Notification/notifications.ts:66 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed" msgstr "成功将 %{env_name} 上的 %{orig_path} 重命名为 %{new_path}" -#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:70 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully" msgstr "成功将 %{env_name} 上的 %{orig_path} 重命名为 %{new_path}" -#: src/components/Notification/notifications.ts:27 src/language/constants.ts:42 +#: src/components/Notification/notifications.ts:65 src/language/constants.ts:42 msgid "Rename Remote Config Error" msgstr "远程配置重命名错误" -#: src/components/Notification/notifications.ts:31 src/language/constants.ts:41 +#: src/components/Notification/notifications.ts:69 src/language/constants.ts:41 msgid "Rename Remote Config Success" msgstr "重命名远程配置成功" -#: src/components/Notification/notifications.ts:77 src/language/constants.ts:56 +#: src/components/Notification/notifications.ts:115 +#: src/language/constants.ts:56 msgid "Rename Remote Site Error" msgstr "重命名远程站点错误" -#: src/components/Notification/notifications.ts:81 src/language/constants.ts:55 +#: src/components/Notification/notifications.ts:119 +#: src/language/constants.ts:55 msgid "Rename Remote Site Success" msgstr "重命名远程站点成功" -#: src/components/Notification/notifications.ts:119 +#: src/components/Notification/notifications.ts:157 msgid "Rename Remote Stream Error" msgstr "重命名远程 Stream 错误" -#: src/components/Notification/notifications.ts:123 +#: src/components/Notification/notifications.ts:161 msgid "Rename Remote Stream Success" msgstr "重命名远程 Stream成功" -#: src/components/Notification/notifications.ts:78 +#: src/components/Notification/notifications.ts:116 msgid "Rename site %{name} to %{new_name} on %{node} failed" msgstr "在 %{node} 上将站点 %{name} 重命名为 %{new_name} 成功" -#: src/components/Notification/notifications.ts:82 +#: src/components/Notification/notifications.ts:120 msgid "Rename site %{name} to %{new_name} on %{node} successfully" msgstr "在 %{node} 上将站点 %{name} 重命名为 %{new_name} 成功" -#: src/components/Notification/notifications.ts:120 +#: src/components/Notification/notifications.ts:158 msgid "Rename stream %{name} to %{new_name} on %{node} failed" msgstr "在 %{node} 上将站点 %{name} 重命名为 %{new_name} 成功" -#: src/components/Notification/notifications.ts:124 +#: src/components/Notification/notifications.ts:162 msgid "Rename stream %{name} to %{new_name} on %{node} successfully" msgstr "在 %{node} 上将站点 %{name} 重命名为 %{new_name} 成功" @@ -2791,19 +2856,19 @@ msgstr "重启" msgid "Restart Nginx" msgstr "重启 Nginx" -#: src/components/Notification/notifications.ts:152 +#: src/components/Notification/notifications.ts:18 msgid "Restart Nginx on %{node} failed, response: %{resp}" msgstr "在 %{node} 上重启 Nginx 失败,响应:%{resp}" -#: src/components/Notification/notifications.ts:156 +#: src/components/Notification/notifications.ts:22 msgid "Restart Nginx on %{node} successfully" msgstr "在 %{node} 上重启 Nginx 成功" -#: src/components/Notification/notifications.ts:151 +#: src/components/Notification/notifications.ts:17 msgid "Restart Remote Nginx Error" msgstr "重启远程 Nginx 错误" -#: src/components/Notification/notifications.ts:155 +#: src/components/Notification/notifications.ts:21 msgid "Restart Remote Nginx Success" msgstr "重启远程 Nginx 成功" @@ -2865,7 +2930,7 @@ msgstr "运行中" #: src/views/config/components/ConfigName.vue:59 #: src/views/config/ConfigEditor.vue:271 #: src/views/preference/components/Passkey.vue:130 -#: src/views/preference/Preference.vue:221 +#: src/views/preference/Preference.vue:228 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127 #: src/views/site/site_edit/components/ConfigName.vue:52 #: src/views/site/site_edit/SiteEdit.vue:292 @@ -2883,42 +2948,44 @@ msgstr "保存指令" msgid "Save error %{msg}" msgstr "保存错误 %{msg}" -#: src/components/Notification/notifications.ts:85 src/language/constants.ts:48 +#: src/components/Notification/notifications.ts:123 +#: src/language/constants.ts:48 msgid "Save Remote Site Error" msgstr "保存远程站点错误" -#: src/components/Notification/notifications.ts:89 src/language/constants.ts:47 +#: src/components/Notification/notifications.ts:127 +#: src/language/constants.ts:47 msgid "Save Remote Site Success" msgstr "保存远程站点成功" -#: src/components/Notification/notifications.ts:127 +#: src/components/Notification/notifications.ts:165 msgid "Save Remote Stream Error" msgstr "保存远程 Stream 错误" -#: src/components/Notification/notifications.ts:131 +#: src/components/Notification/notifications.ts:169 msgid "Save Remote Stream Success" msgstr "保存远程 Stream 成功" -#: src/components/Notification/notifications.ts:86 +#: src/components/Notification/notifications.ts:124 msgid "Save site %{name} to %{node} failed" msgstr "成功将站点 %{name} 保存到 %{node} 中" -#: src/components/Notification/notifications.ts:90 +#: src/components/Notification/notifications.ts:128 msgid "Save site %{name} to %{node} successfully" msgstr "成功将站点 %{name} 保存到 %{node} 中" -#: src/components/Notification/notifications.ts:128 +#: src/components/Notification/notifications.ts:166 msgid "Save stream %{name} to %{node} failed" msgstr "部署 %{name} 到 %{node} 失败" -#: src/components/Notification/notifications.ts:132 +#: src/components/Notification/notifications.ts:170 msgid "Save stream %{name} to %{node} successfully" msgstr "成功将站点 %{name} 保存到 %{node} 中" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97 #: src/views/certificate/CertificateEditor.vue:49 -#: src/views/preference/Preference.vue:123 +#: src/views/preference/Preference.vue:124 msgid "Save successfully" msgstr "保存成功" @@ -2968,7 +3035,7 @@ msgstr "自我检查" msgid "Send" msgstr "上传" -#: src/views/preference/Preference.vue:156 +#: src/views/preference/Preference.vue:157 msgid "Server" msgstr "服务器" @@ -3141,7 +3208,7 @@ msgstr "开始还原" #: src/views/certificate/ACMEUser.vue:65 #: src/views/certificate/CertificateList/certColumns.tsx:65 #: src/views/environments/list/envColumns.tsx:44 -#: src/views/site/site_edit/RightSettings.vue:56 +#: src/views/site/site_edit/RightSettings.vue:55 #: src/views/site/site_list/columns.tsx:80 src/views/stream/StreamList.vue:47 msgid "Status" msgstr "状态" @@ -3215,35 +3282,35 @@ msgstr "同步" msgid "Sync Certificate" msgstr "同步证书" -#: src/components/Notification/notifications.ts:10 +#: src/components/Notification/notifications.ts:48 msgid "Sync Certificate %{cert_name} to %{env_name} failed" msgstr "证书 %{cert_name} 已成功同步到 %{env_name}" -#: src/components/Notification/notifications.ts:14 +#: src/components/Notification/notifications.ts:52 msgid "Sync Certificate %{cert_name} to %{env_name} successfully" msgstr "证书 %{cert_name} 已成功同步到 %{env_name}" -#: src/components/Notification/notifications.ts:9 src/language/constants.ts:39 +#: src/components/Notification/notifications.ts:47 src/language/constants.ts:39 msgid "Sync Certificate Error" msgstr "同步证书错误" -#: src/components/Notification/notifications.ts:13 src/language/constants.ts:38 +#: src/components/Notification/notifications.ts:51 src/language/constants.ts:38 msgid "Sync Certificate Success" msgstr "同步证书成功" -#: src/components/Notification/notifications.ts:20 +#: src/components/Notification/notifications.ts:58 msgid "Sync config %{config_name} to %{env_name} failed" msgstr "配置 %{config_name} 成功同步到 %{env_name}" -#: src/components/Notification/notifications.ts:24 +#: src/components/Notification/notifications.ts:62 msgid "Sync config %{config_name} to %{env_name} successfully" msgstr "配置 %{config_name} 成功同步到 %{env_name}" -#: src/components/Notification/notifications.ts:19 src/language/constants.ts:45 +#: src/components/Notification/notifications.ts:57 src/language/constants.ts:45 msgid "Sync Config Error" msgstr "同步配置错误" -#: src/components/Notification/notifications.ts:23 src/language/constants.ts:44 +#: src/components/Notification/notifications.ts:61 src/language/constants.ts:44 msgid "Sync Config Success" msgstr "同步配置成功" @@ -3252,8 +3319,8 @@ msgstr "同步配置成功" msgid "Sync Nodes" msgstr "同步节点" -#: src/views/site/site_edit/RightSettings.vue:102 -#: src/views/site/site_edit/RightSettings.vue:89 +#: src/views/site/site_edit/RightSettings.vue:101 +#: src/views/site/site_edit/RightSettings.vue:88 #: src/views/stream/components/RightSettings.vue:111 #: src/views/stream/components/RightSettings.vue:124 msgid "Sync strategy" @@ -3263,7 +3330,7 @@ msgstr "同步策略" msgid "Sync to" msgstr "同步到" -#: src/views/site/site_edit/RightSettings.vue:86 +#: src/views/site/site_edit/RightSettings.vue:85 #: src/views/stream/components/RightSettings.vue:108 msgid "Synchronization" msgstr "同步" @@ -3292,7 +3359,11 @@ msgstr "系统恢复成功。" msgid "Task not found" msgstr "未找到任务" -#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:180 +#: src/views/preference/components/ExternalNotify/telegram.ts:5 +msgid "Telegram" +msgstr "Telegram" + +#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:187 #: src/views/terminal/Terminal.vue:129 msgid "Terminal" msgstr "终端" @@ -3541,6 +3612,7 @@ msgstr "需要两步验证" #: src/views/certificate/CertificateList/certColumns.tsx:25 #: src/views/nginx_log/NginxLogList.vue:21 #: src/views/notification/notificationColumns.tsx:9 +#: src/views/preference/components/ExternalNotify/columns.ts:17 msgid "Type" msgstr "类型" @@ -3557,7 +3629,7 @@ msgstr "更新成功" #: src/views/config/configColumns.tsx:36 src/views/config/ConfigEditor.vue:325 #: src/views/environments/group/columns.ts:37 #: src/views/environments/list/envColumns.tsx:90 -#: src/views/site/site_edit/RightSettings.vue:76 +#: src/views/site/site_edit/RightSettings.vue:75 #: src/views/site/site_list/columns.tsx:110 #: src/views/stream/components/RightSettings.vue:99 #: src/views/stream/StreamList.vue:67 src/views/user/userColumns.tsx:54 @@ -3717,7 +3789,7 @@ msgstr "" "启用后,Nginx UI 将在启动时自动重新注册用户。一般情况下,除非在开发环境中使" "用 Pebble 作为 CA,否则不要启用此功能。" -#: src/views/site/site_edit/RightSettings.vue:92 +#: src/views/site/site_edit/RightSettings.vue:91 msgid "" "When you enable/disable, delete, or save this site, the nodes set in the " "Node Group and the nodes selected below will be synchronized." @@ -3814,6 +3886,24 @@ msgstr "您的旧代码将不再有效。" msgid "Your passkeys" msgstr "你的 Passkeys" +#~ msgid "Access Token" +#~ msgstr "Access Token" + +#~ msgid "Bot Token" +#~ msgstr "机器人令牌" + +#~ msgid "Chat ID" +#~ msgstr "聊天 ID" + +#~ msgid "Device Key" +#~ msgstr "设备密钥" + +#~ msgid "Secret (Optional)" +#~ msgstr "秘密(可选)" + +#~ msgid "Server URL" +#~ msgstr "服务器 URL" + #~ msgid "Do you want to disable this site?" #~ msgstr "你想停用这个网站吗?" @@ -4053,9 +4143,6 @@ msgstr "你的 Passkeys" #~ msgid "The Operation of Sites, Configs and Certification will redo on this" #~ msgstr "网站、配置和证书的操作同步到该环境" -#~ msgid "Token" -#~ msgstr "Token" - #~ msgid "Git" #~ msgstr "Git" diff --git a/app/src/language/zh_TW/app.po b/app/src/language/zh_TW/app.po index 7787c815..bae3787a 100644 --- a/app/src/language/zh_TW/app.po +++ b/app/src/language/zh_TW/app.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2025-03-13 15:28+0000\n" -"Last-Translator: \"Xaver Y.R. Chen\" \n" +"PO-Revision-Date: 2025-04-10 02:51+0000\n" +"Last-Translator: 0xJacky \n" "Language-Team: Chinese (Traditional Han script) \n" "Language: zh_TW\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.10.2\n" +"X-Generator: Weblate 5.10.4\n" "Generated-By: easygettext\n" #: src/views/user/userColumns.tsx:32 @@ -32,7 +32,6 @@ msgid "About" msgstr "關於" #: src/views/nginx_log/NginxLogList.vue:30 -#, fuzzy msgid "Access Log" msgstr "訪問日誌" @@ -54,6 +53,7 @@ msgstr "ACME 用戶" #: src/views/nginx_log/NginxLogList.vue:53 #: src/views/notification/notificationColumns.tsx:66 #: src/views/preference/AuthSettings.vue:30 +#: src/views/preference/components/ExternalNotify/columns.ts:46 #: src/views/site/site_list/columns.tsx:117 src/views/stream/StreamList.vue:74 #: src/views/user/userColumns.tsx:60 msgid "Action" @@ -118,7 +118,7 @@ msgstr "然後,重新整理此頁面並再次點選新增通行密鑰。" msgid "All" msgstr "全部" -#: src/components/Notification/notifications.ts:137 +#: src/components/Notification/notifications.ts:175 #: src/language/constants.ts:58 msgid "All Recovery Codes Have Been Used" msgstr "所有恢復碼都已使用完畢" @@ -143,10 +143,9 @@ msgstr "API Token" msgid "API Type" msgstr "API 類型" -#: src/views/preference/Preference.vue:162 -#, fuzzy +#: src/views/preference/Preference.vue:163 msgid "App" -msgstr "套用" +msgstr "應用程式" #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:103 msgid "Apply" @@ -197,7 +196,7 @@ msgstr "您確定要永久刪除此項目嗎?" msgid "Are you sure you want to delete this item?" msgstr "您確定要刪除此項目嗎?" -#: src/views/site/site_list/SiteList.vue:163 +#: src/views/site/site_list/SiteList.vue:167 #: src/views/stream/StreamList.vue:227 msgid "Are you sure you want to delete?" msgstr "您確定要刪除嗎?" @@ -207,9 +206,8 @@ msgid "Are you sure you want to recover this item?" msgstr "您確定要恢復此項目嗎?" #: src/components/EnvGroupTabs/EnvGroupTabs.vue:149 -#, fuzzy msgid "Are you sure you want to reload Nginx on the following sync nodes?" -msgstr "您確定要應用於所有選擇項目嗎?" +msgstr "您確定要在以下同步節點上重新載入Nginx嗎?" #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95 msgid "Are you sure you want to remove this directive?" @@ -224,9 +222,8 @@ msgid "Are you sure you want to remove this location?" msgstr "您確定要刪除此 Location 嗎?" #: src/components/EnvGroupTabs/EnvGroupTabs.vue:161 -#, fuzzy msgid "Are you sure you want to restart Nginx on the following sync nodes?" -msgstr "您確定要清除所有通知嗎?" +msgstr "您確定要在以下同步節點上重新啟動Nginx嗎?" #: src/components/ChatGPT/ChatGPT.vue:318 msgid "Ask ChatGPT for Help" @@ -244,7 +241,7 @@ msgstr "嘗試修復" msgid "Attempts" msgstr "嘗試次數" -#: src/views/preference/Preference.vue:186 +#: src/views/preference/Preference.vue:193 msgid "Auth" msgstr "身份驗證" @@ -275,11 +272,11 @@ msgstr "已啟用 %{name} 的自動續簽" #: src/components/SystemRestore/SystemRestoreContent.vue:332 msgid "Automatic Restart" -msgstr "" +msgstr "自動重新啟動" #: src/views/nginx_log/NginxLogList.vue:127 msgid "Automatically indexed from site and stream configurations." -msgstr "" +msgstr "自動從網站和串流配置中索引。" #: src/views/certificate/CertificateEditor.vue:255 #: src/views/config/ConfigEditor.vue:262 src/views/config/ConfigList.vue:112 @@ -298,23 +295,20 @@ msgid "Back to list" msgstr "返回列表" #: src/routes/modules/system.ts:26 -#, fuzzy msgid "Backup" -msgstr "返回" +msgstr "備份" #: src/components/SystemRestore/SystemRestoreContent.vue:155 msgid "Backup file integrity check failed, it may have been tampered with" -msgstr "" +msgstr "備份檔案完整性檢查失敗,可能已被篡改" #: src/constants/errors/backup.ts:41 -#, fuzzy msgid "Backup file not found: {0}" -msgstr "站點未找到" +msgstr "備份檔案未找到:{0}" #: src/views/system/Backup/BackupCreator.vue:42 -#, fuzzy msgid "Backup has been downloaded successfully" -msgstr "Nginx 重新載入成功" +msgstr "備份已成功下載" #: src/views/preference/AuthSettings.vue:129 msgid "Ban Threshold Minutes" @@ -328,12 +322,16 @@ msgstr "被禁止的 IP" msgid "Banned Until" msgstr "禁止至" +#: src/views/preference/components/ExternalNotify/bark.ts:5 +msgid "Bark" +msgstr "Bark" + #: src/views/site/site_add/SiteAdd.vue:95 msgid "Base information" msgstr "基本資訊" #: src/views/config/ConfigEditor.vue:290 -#: src/views/site/site_edit/RightSettings.vue:53 +#: src/views/site/site_edit/RightSettings.vue:52 #: src/views/stream/components/RightSettings.vue:79 msgid "Basic" msgstr "基本" @@ -397,13 +395,13 @@ msgstr "無法在示範模式下更改初始使用者密碼" #: src/components/ConfigHistory/DiffViewer.vue:57 #: src/components/ConfigHistory/DiffViewer.vue:74 msgid "Cannot compare: Missing content" -msgstr "" +msgstr "無法比較:缺少內容" #: src/constants/errors/user.ts:10 msgid "Cannot remove initial user" msgstr "無法移除初始使用者" -#: src/views/preference/Preference.vue:192 +#: src/views/preference/Preference.vue:199 msgid "Cert" msgstr "證書" @@ -411,18 +409,45 @@ msgstr "證書" msgid "Cert path is not under the nginx conf dir" msgstr "證書路徑不在 Nginx 設定檔資料夾下" +#: src/components/Notification/notifications.ts:28 +msgid "Certificate %{name} has expired" +msgstr "憑證 %{name} 已過期" + +#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:36 +#: src/components/Notification/notifications.ts:40 +msgid "Certificate %{name} will expire in %{days} days" +msgstr "證書 %{name} 將於 %{days} 天後過期" + +#: src/components/Notification/notifications.ts:44 +msgid "Certificate %{name} will expire in 1 day" +msgstr "證書 %{name} 將於 1 天後過期" + #: src/constants/errors/cert.ts:4 msgid "Certificate decode error" msgstr "證書解碼錯誤" +#: src/components/Notification/notifications.ts:31 +msgid "Certificate Expiration Notice" +msgstr "證書到期通知" + +#: src/components/Notification/notifications.ts:27 +msgid "Certificate Expired" +msgstr "憑證已過期" + +#: src/components/Notification/notifications.ts:35 +#: src/components/Notification/notifications.ts:39 +#: src/components/Notification/notifications.ts:43 +msgid "Certificate Expiring Soon" +msgstr "證書即將到期" + #: src/constants/errors/cert.ts:5 msgid "Certificate parse error" msgstr "證書解析錯誤" #: src/constants/errors/cert.ts:8 -#, fuzzy msgid "Certificate path is empty" -msgstr "明文為空" +msgstr "證書路徑為空" #: src/views/preference/CertSettings.vue:27 msgid "Certificate Renewal Interval" @@ -478,7 +503,8 @@ msgstr "再次檢查" msgid "" "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and " "prevents using Passkeys and clipboard features." -msgstr "" +msgstr "檢查是否啟用了 HTTPS。在本地主機之外使用 HTTP " +"是不安全的,並且會阻止使用通行證和剪貼簿功能。" #: src/views/system/SelfCheck/tasks/backend/index.ts:16 msgid "Check if the nginx.conf includes the sites-enabled directory." @@ -525,7 +551,7 @@ msgstr "清除成功" #: src/components/SystemRestore/SystemRestoreContent.vue:194 #: src/components/SystemRestore/SystemRestoreContent.vue:271 msgid "Click or drag backup file to this area to upload" -msgstr "" +msgstr "點擊或拖曳備份檔案至此區域上傳" #: src/views/preference/components/TOTP.vue:110 msgid "Click to copy" @@ -533,7 +559,7 @@ msgstr "點擊複製" #: src/components/ConfigHistory/ConfigHistory.vue:169 msgid "Close" -msgstr "" +msgstr "關閉" #: src/views/preference/LogrotateSettings.vue:22 msgid "Command" @@ -548,25 +574,23 @@ msgstr "備註" #: src/components/ConfigHistory/ConfigHistory.vue:127 msgid "Compare" -msgstr "" +msgstr "比較" #: src/components/ConfigHistory/DiffViewer.vue:378 -#, fuzzy msgid "Compare Configurations" -msgstr "設定" +msgstr "比較配置" #: src/components/ConfigHistory/ConfigHistory.vue:130 msgid "Compare Selected" -msgstr "" +msgstr "比較選定" #: src/components/ConfigHistory/ConfigHistory.vue:129 msgid "Compare with Current" -msgstr "" +msgstr "與當前比較" #: src/constants/errors/backup.ts:14 -#, fuzzy msgid "Config path is empty" -msgstr "明文為空" +msgstr "配置路徑為空" #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:84 msgid "Config Templates" @@ -577,9 +601,8 @@ msgid "Configuration file is test successful" msgstr "設定檔案測試成功" #: src/components/ConfigHistory/ConfigHistory.vue:138 -#, fuzzy msgid "Configuration History" -msgstr "設定" +msgstr "配置歷史" #: src/views/site/site_add/SiteAdd.vue:101 msgid "Configuration Name" @@ -614,9 +637,8 @@ msgid "Copied" msgstr "已複製" #: src/views/system/Backup/BackupCreator.vue:128 -#, fuzzy msgid "Copied!" -msgstr "已複製" +msgstr "已複製!" #: src/components/SensitiveString/SensitiveString.vue:37 #: src/views/system/Backup/BackupCreator.vue:128 @@ -648,9 +670,8 @@ msgid "Create Another" msgstr "再建立一個" #: src/views/system/Backup/BackupCreator.vue:86 -#, fuzzy msgid "Create Backup" -msgstr "建立時間" +msgstr "建立備份" #: src/views/config/ConfigList.vue:122 msgid "Create File" @@ -664,10 +685,11 @@ msgstr "創建資料夾" msgid "" "Create system backups including Nginx configuration and Nginx UI settings. " "Backup files will be automatically downloaded to your computer." -msgstr "" +msgstr "建立系統備份,包括 Nginx 配置與 Nginx UI 設定。備份檔案將自動下載至您的電腦。" #: src/views/environments/group/columns.ts:31 #: src/views/notification/notificationColumns.tsx:59 +#: src/views/preference/components/ExternalNotify/columns.ts:41 #: src/views/preference/components/Passkey.vue:95 #: src/views/user/userColumns.tsx:48 msgid "Created at" @@ -698,9 +720,8 @@ msgid "Current account is not enabled TOTP." msgstr "當前帳戶未啟用 TOTP。" #: src/components/ConfigHistory/DiffViewer.vue:62 -#, fuzzy msgid "Current Content" -msgstr "目前版本" +msgstr "當前內容" #: src/views/system/Upgrade.vue:165 msgid "Current Version" @@ -738,7 +759,7 @@ msgstr "解密失敗" #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519 #: src/views/site/ngx_conf/NgxServer.vue:110 #: src/views/site/ngx_conf/NgxUpstream.vue:128 -#: src/views/site/site_list/SiteList.vue:172 +#: src/views/site/site_list/SiteList.vue:176 #: src/views/stream/StreamList.vue:236 msgid "Delete" msgstr "刪除" @@ -748,39 +769,39 @@ msgstr "刪除" msgid "Delete Permanently" msgstr "永久刪除" -#: src/components/Notification/notifications.ts:37 src/language/constants.ts:50 +#: src/components/Notification/notifications.ts:75 src/language/constants.ts:50 msgid "Delete Remote Site Error" msgstr "刪除遠端網站錯誤" -#: src/components/Notification/notifications.ts:41 src/language/constants.ts:49 +#: src/components/Notification/notifications.ts:79 src/language/constants.ts:49 msgid "Delete Remote Site Success" msgstr "刪除遠端網站成功" -#: src/components/Notification/notifications.ts:95 +#: src/components/Notification/notifications.ts:133 msgid "Delete Remote Stream Error" msgstr "刪除遠端串流錯誤" -#: src/components/Notification/notifications.ts:99 +#: src/components/Notification/notifications.ts:137 msgid "Delete Remote Stream Success" msgstr "刪除遠端串流成功" -#: src/components/Notification/notifications.ts:38 +#: src/components/Notification/notifications.ts:76 msgid "Delete site %{name} from %{node} failed" msgstr "從 %{node} 刪除網站 %{name} 失敗" -#: src/components/Notification/notifications.ts:42 +#: src/components/Notification/notifications.ts:80 msgid "Delete site %{name} from %{node} successfully" msgstr "成功從 %{node} 移除站點 %{name}" -#: src/views/site/site_list/SiteList.vue:94 +#: src/views/site/site_list/SiteList.vue:98 msgid "Delete site: %{site_name}" msgstr "刪除網站:%{site_name}" -#: src/components/Notification/notifications.ts:96 +#: src/components/Notification/notifications.ts:134 msgid "Delete stream %{name} from %{node} failed" msgstr "部署 %{conf_name} 至 %{node} 失敗" -#: src/components/Notification/notifications.ts:100 +#: src/components/Notification/notifications.ts:138 msgid "Delete stream %{name} from %{node} successfully" msgstr "成功從 %{node} 移除站點 %{name}" @@ -794,7 +815,7 @@ msgstr "刪除成功" #: src/views/preference/NodeSettings.vue:28 msgid "Demo" -msgstr "" +msgstr "演示" #: src/views/config/ConfigEditor.vue:334 msgid "Deploy" @@ -817,6 +838,10 @@ msgstr "詳細資料" msgid "Development Mode" msgstr "開發模式" +#: src/views/preference/components/ExternalNotify/dingtalk.ts:5 +msgid "DingTalk" +msgstr "釘釘" + #: src/views/site/ngx_conf/directive/DirectiveAdd.vue:89 msgid "Directive" msgstr "指令" @@ -838,9 +863,8 @@ msgid "Directives" msgstr "指令" #: src/views/site/site_edit/components/SiteStatusSegmented.vue:113 -#, fuzzy msgid "disable" -msgstr "停用" +msgstr "禁用" #: src/views/stream/StreamList.vue:207 msgid "Disable" @@ -850,61 +874,53 @@ msgstr "停用" msgid "Disable auto-renewal failed for %{name}" msgstr "關閉 %{name} 自動續簽失敗" -#: src/components/Notification/notifications.ts:45 src/language/constants.ts:52 +#: src/components/Notification/notifications.ts:83 src/language/constants.ts:52 msgid "Disable Remote Site Error" msgstr "禁用遠端站点錯誤" -#: src/components/Notification/notifications.ts:69 -#, fuzzy +#: src/components/Notification/notifications.ts:107 msgid "Disable Remote Site Maintenance Error" -msgstr "禁用遠端站点錯誤" +msgstr "遠端網站維護錯誤已停用" -#: src/components/Notification/notifications.ts:73 -#, fuzzy +#: src/components/Notification/notifications.ts:111 msgid "Disable Remote Site Maintenance Success" -msgstr "禁用遠端站点成功" +msgstr "遠端網站維護已成功停用" -#: src/components/Notification/notifications.ts:49 src/language/constants.ts:51 +#: src/components/Notification/notifications.ts:87 src/language/constants.ts:51 msgid "Disable Remote Site Success" msgstr "禁用遠端站点成功" -#: src/components/Notification/notifications.ts:103 +#: src/components/Notification/notifications.ts:141 msgid "Disable Remote Stream Error" msgstr "禁用遠端串流錯誤" -#: src/components/Notification/notifications.ts:107 +#: src/components/Notification/notifications.ts:145 msgid "Disable Remote Stream Success" msgstr "禁用遠端串流成功" -#: src/components/Notification/notifications.ts:46 -#, fuzzy +#: src/components/Notification/notifications.ts:84 msgid "Disable site %{name} from %{node} failed" -msgstr "成功禁用 %{node} 中的站点 %{site}" +msgstr "停用 %{node} 上的網站 %{name} 失敗" -#: src/components/Notification/notifications.ts:50 -#, fuzzy +#: src/components/Notification/notifications.ts:88 msgid "Disable site %{name} from %{node} successfully" -msgstr "成功禁用 %{node} 中的站点 %{site}" - -#: src/components/Notification/notifications.ts:70 -#, fuzzy -msgid "Disable site %{name} maintenance on %{node} failed" -msgstr "成功禁用 %{node} 中的站点 %{site}" - -#: src/components/Notification/notifications.ts:74 -#, fuzzy -msgid "Disable site %{name} maintenance on %{node} successfully" -msgstr "成功禁用 %{node} 中的站点 %{site}" - -#: src/components/Notification/notifications.ts:104 -#, fuzzy -msgid "Disable stream %{name} from %{node} failed" -msgstr "在 %{node_name} 啟用 %{conf_name} 失敗" +msgstr "已成功從%{node}停用網站%{name}" #: src/components/Notification/notifications.ts:108 -#, fuzzy +msgid "Disable site %{name} maintenance on %{node} failed" +msgstr "在%{node}上停用網站%{name}的維護模式失敗" + +#: src/components/Notification/notifications.ts:112 +msgid "Disable site %{name} maintenance on %{node} successfully" +msgstr "網站 %{name} 在 %{node} 上的維護已成功停用" + +#: src/components/Notification/notifications.ts:142 +msgid "Disable stream %{name} from %{node} failed" +msgstr "停用來自 %{node} 的串流 %{name} 失敗" + +#: src/components/Notification/notifications.ts:146 msgid "Disable stream %{name} from %{node} successfully" -msgstr "成功禁用 %{node} 中的站点 %{site}" +msgstr "已成功從 %{node} 停用串流 %{name}" #: src/views/environments/list/envColumns.tsx:61 #: src/views/environments/list/envColumns.tsx:79 @@ -947,9 +963,8 @@ msgid "Do not enable this option unless you are sure that you need it." msgstr "除非您確定需要,否則不要啟用此選項。" #: src/views/site/site_edit/components/SiteStatusSegmented.vue:118 -#, fuzzy msgid "Do you want to %{action} this site?" -msgstr "您要啟用此網站嗎?" +msgstr "您想要%{action}這個網站嗎?" #: src/views/site/cert/components/ObtainCert.vue:136 msgid "Do you want to disable auto-cert renewal?" @@ -1011,7 +1026,7 @@ msgstr "" "通行密鑰。" #: src/views/site/site_list/SiteDuplicate.vue:72 -#: src/views/site/site_list/SiteList.vue:158 +#: src/views/site/site_list/SiteList.vue:162 #: src/views/stream/components/StreamDuplicate.vue:64 #: src/views/stream/StreamList.vue:222 msgid "Duplicate" @@ -1053,7 +1068,6 @@ msgid "Email (*)" msgstr "電子郵件 (*)" #: src/views/site/site_edit/components/SiteStatusSegmented.vue:112 -#, fuzzy msgid "enable" msgstr "啟用" @@ -1074,67 +1088,56 @@ msgid "Enable failed" msgstr "啟用失敗" #: src/views/preference/ServerSettings.vue:29 -#, fuzzy msgid "Enable HTTPS" -msgstr "啟用 TOTP" +msgstr "啟用 HTTPS" -#: src/components/Notification/notifications.ts:53 src/language/constants.ts:54 +#: src/components/Notification/notifications.ts:91 src/language/constants.ts:54 msgid "Enable Remote Site Error" msgstr "啟用遠端站點錯誤" -#: src/components/Notification/notifications.ts:61 -#, fuzzy +#: src/components/Notification/notifications.ts:99 msgid "Enable Remote Site Maintenance Error" -msgstr "啟用遠端站點錯誤" +msgstr "啟用遠端網站維護錯誤" -#: src/components/Notification/notifications.ts:65 -#, fuzzy +#: src/components/Notification/notifications.ts:103 msgid "Enable Remote Site Maintenance Success" -msgstr "啟用遠端站點成功" +msgstr "啟用遠端網站維護成功" -#: src/components/Notification/notifications.ts:57 src/language/constants.ts:53 +#: src/components/Notification/notifications.ts:95 src/language/constants.ts:53 msgid "Enable Remote Site Success" msgstr "啟用遠端站點成功" -#: src/components/Notification/notifications.ts:111 -#, fuzzy +#: src/components/Notification/notifications.ts:149 msgid "Enable Remote Stream Error" -msgstr "啟用遠端站點錯誤" +msgstr "啟用遠端串流錯誤" -#: src/components/Notification/notifications.ts:115 -#, fuzzy +#: src/components/Notification/notifications.ts:153 msgid "Enable Remote Stream Success" -msgstr "啟用遠端站點成功" +msgstr "啟用遠端串流成功" -#: src/components/Notification/notifications.ts:62 -#, fuzzy +#: src/components/Notification/notifications.ts:100 msgid "Enable site %{name} maintenance on %{node} failed" -msgstr "在 %{node_name} 啟用 %{conf_name} 失敗" +msgstr "啟用網站 %{name} 在 %{node} 上的維護模式失敗" -#: src/components/Notification/notifications.ts:66 -#, fuzzy +#: src/components/Notification/notifications.ts:104 msgid "Enable site %{name} maintenance on %{node} successfully" -msgstr "成功啟用站點 %{site} 在 %{node}" +msgstr "成功在%{node}上啟用網站%{name}的維護模式" -#: src/components/Notification/notifications.ts:54 -#, fuzzy +#: src/components/Notification/notifications.ts:92 msgid "Enable site %{name} on %{node} failed" -msgstr "在 %{node_name} 啟用 %{conf_name} 失敗" +msgstr "在%{node}上啟用網站%{name}失敗" -#: src/components/Notification/notifications.ts:58 -#, fuzzy +#: src/components/Notification/notifications.ts:96 msgid "Enable site %{name} on %{node} successfully" -msgstr "成功啟用站點 %{site} 在 %{node}" +msgstr "成功在%{node}上啟用網站%{name}" -#: src/components/Notification/notifications.ts:112 -#, fuzzy +#: src/components/Notification/notifications.ts:150 msgid "Enable stream %{name} on %{node} failed" -msgstr "在 %{node_name} 啟用 %{conf_name} 失敗" +msgstr "在 %{node} 上啟用串流 %{name} 失敗" -#: src/components/Notification/notifications.ts:116 -#, fuzzy +#: src/components/Notification/notifications.ts:154 msgid "Enable stream %{name} on %{node} successfully" -msgstr "成功啟用站點 %{site} 在 %{node}" +msgstr "在 %{node} 上成功啟用串流 %{name}" #: src/views/site/ngx_conf/NgxConfigEditor.vue:183 msgid "Enable TLS" @@ -1187,10 +1190,9 @@ msgstr "錯誤" #: src/components/ConfigHistory/DiffViewer.vue:135 msgid "Error initializing diff viewer" -msgstr "" +msgstr "初始化差異檢視器時發生錯誤" #: src/views/nginx_log/NginxLogList.vue:31 -#, fuzzy msgid "Error Log" msgstr "錯誤日誌" @@ -1200,7 +1202,7 @@ msgstr "錯誤日誌" #: src/components/ConfigHistory/DiffViewer.vue:87 msgid "Error processing content" -msgstr "" +msgstr "內容處理錯誤" #: src/views/system/Upgrade.vue:177 msgid "Executable Path" @@ -1219,143 +1221,130 @@ msgstr "過期時間:%{date}" msgid "Export" msgstr "匯出" +#: src/views/preference/ExternalNotify.vue:10 +#: src/views/preference/Preference.vue:169 +msgid "External Notify" +msgstr "外部通知" + #: src/views/site/cert/components/ObtainCertLive.vue:94 msgid "Fail to obtain certificate" msgstr "獲取憑證失敗" #: src/constants/errors/backup.ts:5 -#, fuzzy msgid "Failed to backup Nginx config files: {0}" -msgstr "讀取 nginx.conf 失敗" +msgstr "備份Nginx設定檔案失敗:{0}" #: src/constants/errors/backup.ts:4 msgid "Failed to backup Nginx UI files: {0}" -msgstr "" +msgstr "備份Nginx UI檔案失敗:{0}" #: src/constants/errors/backup.ts:18 -#, fuzzy msgid "Failed to calculate hash: {0}" -msgstr "創建備份失敗" +msgstr "無法計算哈希值:{0}" #: src/constants/errors/backup.ts:58 msgid "Failed to calculate Nginx hash: {0}" -msgstr "" +msgstr "計算Nginx雜湊失敗:{0}" #: src/constants/errors/backup.ts:57 msgid "Failed to calculate Nginx UI hash: {0}" -msgstr "" +msgstr "計算Nginx UI哈希失敗:{0}" #: src/constants/errors/backup.ts:13 -#, fuzzy msgid "Failed to cleanup temporary directory: {0}" -msgstr "創建備份失敗" +msgstr "無法清理臨時目錄:{0}" #: src/constants/errors/backup.ts:15 msgid "Failed to copy config file: {0}" -msgstr "" +msgstr "複製設定檔案失敗:{0}" #: src/constants/errors/backup.ts:16 msgid "Failed to copy database directory: {0}" -msgstr "" +msgstr "複製數據庫目錄失敗:{0}" #: src/constants/errors/backup.ts:17 -#, fuzzy msgid "Failed to copy database file: {0}" -msgstr "停用 %{msg} 失敗" +msgstr "無法複製數據庫文件:{0}" #: src/constants/errors/backup.ts:32 msgid "Failed to copy file content: {0}" -msgstr "" +msgstr "複製檔案內容失敗:{0}" #: src/constants/errors/backup.ts:20 msgid "Failed to copy Nginx config directory: {0}" -msgstr "" +msgstr "複製Nginx設定目錄失敗:{0}" #: src/constants/errors/self_check.ts:9 msgid "Failed to create backup" msgstr "創建備份失敗" #: src/constants/errors/backup.ts:12 -#, fuzzy msgid "Failed to create backup file: {0}" -msgstr "創建備份失敗" +msgstr "無法建立備份檔案:{0}" #: src/constants/errors/backup.ts:46 -#, fuzzy msgid "Failed to create directory: {0}" -msgstr "創建備份失敗" +msgstr "無法建立目錄:{0}" #: src/constants/errors/backup.ts:48 -#, fuzzy msgid "Failed to create file: {0}" -msgstr "創建備份失敗" +msgstr "無法建立檔案:{0}" #: src/constants/errors/backup.ts:6 -#, fuzzy msgid "Failed to create hash info file: {0}" -msgstr "創建備份失敗" +msgstr "無法建立雜湊資訊檔案:{0}" #: src/constants/errors/backup.ts:47 -#, fuzzy msgid "Failed to create parent directory: {0}" -msgstr "創建備份失敗" +msgstr "無法建立父目錄:{0}" #: src/constants/errors/backup.ts:34 msgid "Failed to create restore directory: {0}" -msgstr "" +msgstr "無法建立還原目錄:{0}" #: src/constants/errors/backup.ts:50 -#, fuzzy msgid "Failed to create symbolic link: {0}" -msgstr "創建備份失敗" +msgstr "創建符號連結失敗:{0}" #: src/constants/errors/backup.ts:2 -#, fuzzy msgid "Failed to create temporary directory" -msgstr "創建備份失敗" +msgstr "無法建立臨時目錄" #: src/constants/errors/backup.ts:3 -#, fuzzy msgid "Failed to create temporary subdirectory" -msgstr "創建備份失敗" +msgstr "無法建立臨時子目錄" #: src/constants/errors/backup.ts:9 -#, fuzzy msgid "Failed to create zip archive: {0}" -msgstr "創建備份失敗" +msgstr "無法建立壓縮檔案:{0}" #: src/constants/errors/backup.ts:29 -#, fuzzy msgid "Failed to create zip entry: {0}" -msgstr "創建備份失敗" +msgstr "無法建立壓縮項目:{0}" #: src/constants/errors/backup.ts:28 -#, fuzzy msgid "Failed to create zip file: {0}" -msgstr "創建備份失敗" +msgstr "無法建立壓縮檔案:{0}" #: src/constants/errors/backup.ts:31 -#, fuzzy msgid "Failed to create zip header: {0}" -msgstr "創建備份失敗" +msgstr "創建壓縮檔標頭失敗:{0}" #: src/constants/errors/backup.ts:26 -#, fuzzy msgid "Failed to decrypt data: {0}" -msgstr "創建備份失敗" +msgstr "解密數據失敗:{0}" #: src/constants/errors/backup.ts:54 -#, fuzzy msgid "Failed to decrypt file: {0}" -msgstr "停用 %{msg} 失敗" +msgstr "解密文件失敗:{0}" #: src/constants/errors/backup.ts:37 msgid "Failed to decrypt Nginx directory: {0}" -msgstr "" +msgstr "解密Nginx目錄失敗:{0}" #: src/constants/errors/backup.ts:36 msgid "Failed to decrypt Nginx UI directory: {0}" -msgstr "" +msgstr "解密Nginx UI目錄失敗:{0}" #: src/views/site/site_edit/components/SiteStatusSegmented.vue:63 #: src/views/stream/components/RightSettings.vue:45 @@ -1364,9 +1353,8 @@ msgid "Failed to disable %{msg}" msgstr "停用 %{msg} 失敗" #: src/views/site/site_edit/components/SiteStatusSegmented.vue:95 -#, fuzzy msgid "Failed to disable maintenance mode %{msg}" -msgstr "停用 %{msg} 失敗" +msgstr "無法停用維護模式 %{msg}" #: src/views/site/site_edit/components/SiteStatusSegmented.vue:47 #: src/views/stream/components/RightSettings.vue:36 @@ -1375,109 +1363,92 @@ msgid "Failed to enable %{msg}" msgstr "啟用 %{msg} 失敗" #: src/views/site/site_edit/components/SiteStatusSegmented.vue:79 -#, fuzzy msgid "Failed to enable maintenance mode %{msg}" -msgstr "啟用 %{msg} 失敗" +msgstr "無法啟用維護模式 %{msg}" #: src/constants/errors/backup.ts:25 -#, fuzzy msgid "Failed to encrypt data: {0}" -msgstr "啟用 %{msg} 失敗" +msgstr "加密數據失敗:{0}" #: src/constants/errors/backup.ts:23 -#, fuzzy msgid "Failed to encrypt file: {0}" -msgstr "啟用 %{msg} 失敗" +msgstr "加密文件失敗:{0}" #: src/constants/errors/backup.ts:8 msgid "Failed to encrypt Nginx directory: {0}" -msgstr "" +msgstr "加密Nginx目錄失敗:{0}" #: src/constants/errors/backup.ts:7 msgid "Failed to encrypt Nginx UI directory: {0}" -msgstr "" +msgstr "加密Nginx UI目錄失敗:{0}" #: src/constants/errors/backup.ts:52 -#, fuzzy msgid "Failed to evaluate symbolic links: {0}" -msgstr "創建備份失敗" +msgstr "無法評估符號鏈接:{0}" #: src/constants/errors/backup.ts:35 -#, fuzzy msgid "Failed to extract archive: {0}" -msgstr "啟用 %{msg} 失敗" +msgstr "無法提取存檔:{0}" #: src/constants/errors/backup.ts:10 -#, fuzzy msgid "Failed to generate AES key: {0}" -msgstr "啟用 %{msg} 失敗" +msgstr "生成AES金鑰失敗:{0}" #: src/constants/errors/backup.ts:11 -#, fuzzy msgid "Failed to generate initialization vector: {0}" -msgstr "取得憑證資訊失敗" +msgstr "無法生成初始化向量:{0}" #: src/language/constants.ts:5 msgid "Failed to get certificate information" msgstr "取得憑證資訊失敗" #: src/components/ConfigHistory/ConfigHistory.vue:77 -#, fuzzy msgid "Failed to load history records" -msgstr "創建備份失敗" +msgstr "無法載入歷史記錄" #: src/constants/errors/backup.ts:30 -#, fuzzy msgid "Failed to open source file: {0}" -msgstr "啟用 %{msg} 失敗" +msgstr "無法開啟來源檔案:{0}" #: src/constants/errors/backup.ts:49 -#, fuzzy msgid "Failed to open zip entry: {0}" -msgstr "啟用 %{msg} 失敗" +msgstr "無法開啟壓縮檔項目:{0}" #: src/constants/errors/backup.ts:45 -#, fuzzy msgid "Failed to open zip file: {0}" -msgstr "啟用 %{msg} 失敗" +msgstr "無法開啟壓縮檔:{0}" #: src/constants/errors/self_check.ts:4 msgid "Failed to parse nginx.conf" msgstr "解析 nginx.conf 失敗" #: src/constants/errors/backup.ts:53 -#, fuzzy msgid "Failed to read encrypted file: {0}" -msgstr "讀取 nginx.conf 失敗" +msgstr "無法讀取加密檔案:{0}" #: src/constants/errors/backup.ts:22 -#, fuzzy msgid "Failed to read file: {0}" -msgstr "啟用 %{msg} 失敗" +msgstr "讀取檔案失敗:{0}" #: src/constants/errors/backup.ts:56 -#, fuzzy msgid "Failed to read hash info file: {0}" -msgstr "讀取 nginx.conf 失敗" +msgstr "無法讀取哈希信息文件:{0}" #: src/constants/errors/self_check.ts:3 msgid "Failed to read nginx.conf" msgstr "讀取 nginx.conf 失敗" #: src/constants/errors/backup.ts:21 -#, fuzzy msgid "Failed to read symlink: {0}" -msgstr "啟用 %{msg} 失敗" +msgstr "讀取符號連結失敗:{0}" #: src/constants/errors/backup.ts:39 -#, fuzzy msgid "Failed to restore Nginx configs: {0}" -msgstr "解析 nginx.conf 失敗" +msgstr "恢復Nginx配置失敗:{0}" #: src/constants/errors/backup.ts:40 -#, fuzzy msgid "Failed to restore Nginx UI files: {0}" -msgstr "解析 nginx.conf 失敗" +msgstr "無法恢復Nginx UI文件:{0}" #: src/views/site/site_edit/SiteEdit.vue:139 #: src/views/stream/StreamEdit.vue:122 @@ -1485,21 +1456,20 @@ msgid "Failed to save, syntax error(s) was detected in the configuration." msgstr "儲存失敗,在設定中檢測到語法錯誤。" #: src/constants/errors/backup.ts:38 -#, fuzzy msgid "Failed to verify hashes: {0}" -msgstr "啟用 %{msg} 失敗" +msgstr "無法驗證雜湊值:{0}" #: src/constants/errors/backup.ts:55 msgid "Failed to write decrypted file: {0}" -msgstr "" +msgstr "寫入解密檔案失敗:{0}" #: src/constants/errors/backup.ts:24 msgid "Failed to write encrypted file: {0}" -msgstr "" +msgstr "寫入加密檔案失敗:{0}" #: src/constants/errors/backup.ts:33 msgid "Failed to write to zip buffer: {0}" -msgstr "" +msgstr "寫入壓縮緩衝區失敗:{0}" #: src/language/constants.ts:32 msgid "File exists" @@ -1541,9 +1511,8 @@ msgid "For Chinese user: https://mirror.ghproxy.com/" msgstr "中國使用者:https://mirror.ghproxy.com/" #: src/constants/errors/middleware.ts:4 -#, fuzzy msgid "Form parse failed" -msgstr "複製失敗" +msgstr "表單解析失敗" #: src/views/config/ConfigEditor.vue:265 msgid "Format Code" @@ -1597,7 +1566,7 @@ msgstr "Github 代理" #: src/constants/errors/backup.ts:59 msgid "Hash verification failed: file integrity compromised" -msgstr "" +msgstr "哈希驗證失敗:檔案完整性受損" #: src/components/SensitiveString/SensitiveString.vue:40 msgid "Hide" @@ -1606,23 +1575,20 @@ msgstr "隱藏" #: src/views/config/ConfigEditor.vue:251 #: src/views/site/site_edit/SiteEdit.vue:212 #: src/views/stream/StreamEdit.vue:195 -#, fuzzy msgid "History" -msgstr "目錄" +msgstr "歷史" #: src/routes/index.ts:47 msgid "Home" msgstr "首頁" #: src/views/preference/ServerSettings.vue:18 -#, fuzzy msgid "Host" -msgstr "HTTP 監聽主機" +msgstr "主機" -#: src/views/preference/Preference.vue:174 -#, fuzzy +#: src/views/preference/Preference.vue:181 msgid "HTTP" -msgstr "HTTP01" +msgstr "HTTP" #: src/views/preference/CertSettings.vue:15 msgid "HTTP Challenge Port" @@ -1634,7 +1600,7 @@ msgstr "HTTP01" #: src/views/system/SelfCheck/tasks/frontend/https-check.ts:10 msgid "HTTPS Protocol" -msgstr "" +msgstr "HTTPS 協議" #: src/views/preference/NodeSettings.vue:34 msgid "ICP Number" @@ -1648,7 +1614,7 @@ msgstr "如果留空,將使用默認的 CA Dir。" msgid "" "If logs are not indexed, please check if the log file is under the directory " "in Nginx.LogDirWhiteList." -msgstr "" +msgstr "如果日誌未被索引,請檢查日誌文件是否位於Nginx的LogDirWhiteList目錄下。" #: src/views/preference/AuthSettings.vue:145 msgid "" @@ -1678,15 +1644,14 @@ msgid "Import Certificate" msgstr "導入憑證" #: src/views/nginx_log/NginxLogList.vue:137 -#: src/views/site/site_list/SiteList.vue:128 -#, fuzzy +#: src/views/site/site_list/SiteList.vue:132 msgid "Indexed" -msgstr "網站首頁 (index)" +msgstr "已索引" #: src/views/nginx_log/NginxLogList.vue:134 -#: src/views/site/site_list/SiteList.vue:125 +#: src/views/site/site_list/SiteList.vue:129 msgid "Indexing..." -msgstr "" +msgstr "索引中..." #: src/components/StdDesign/StdDetail/StdDetail.vue:81 #: src/constants/index.ts:24 src/views/notification/notificationColumns.tsx:29 @@ -1711,7 +1676,7 @@ msgstr "輸入恢復碼:" #: src/views/preference/HTTPSettings.vue:22 msgid "Insecure Skip Verify" -msgstr "" +msgstr "不安全跳過驗證" #: src/routes/modules/auth.ts:8 src/views/other/Install.vue:185 msgid "Install" @@ -1723,13 +1688,13 @@ msgstr "安裝成功" #: src/constants/errors/system.ts:3 msgid "Installation is not allowed after 10 minutes of system startup" -msgstr "" +msgstr "系統啟動後10分鐘後不允許安裝" #: src/views/other/Install.vue:127 msgid "" "Installation is not allowed after 10 minutes of system startup, please " "restart the Nginx UI." -msgstr "" +msgstr "系統啟動10分鐘後不允許安裝,請重新啟動 Nginx UI。" #: src/views/preference/LogrotateSettings.vue:25 msgid "Interval" @@ -1740,24 +1705,20 @@ msgid "Invalid" msgstr "無效" #: src/constants/errors/backup.ts:44 -#, fuzzy msgid "Invalid AES IV format: {0}" -msgstr "無效的請求格式" +msgstr "無效的AES IV格式:{0}" #: src/constants/errors/backup.ts:43 -#, fuzzy msgid "Invalid AES key format: {0}" -msgstr "無效的請求格式" +msgstr "無效的AES金鑰格式:{0}" #: src/components/SystemRestore/SystemRestoreContent.vue:121 -#, fuzzy msgid "Invalid file object" -msgstr "無效的檔案名" +msgstr "無效的文件對象" #: src/constants/errors/backup.ts:51 -#, fuzzy msgid "Invalid file path: {0}" -msgstr "無效的請求格式" +msgstr "無效的文件路徑:{0}" #: src/views/config/components/Rename.vue:66 #: src/views/config/ConfigEditor.vue:299 @@ -1768,13 +1729,17 @@ msgstr "無效的檔案名" msgid "Invalid folder name" msgstr "無效的資料夾名稱" +#: src/constants/errors/notification.ts:3 +msgid "Invalid notifier config" +msgstr "無效的通知器配置" + #: src/constants/errors/user.ts:4 msgid "Invalid otp code" msgstr "無效的 OTP 代碼" #: src/constants/errors/backup.ts:27 msgid "Invalid padding in decrypted data" -msgstr "" +msgstr "解密數據中的填充無效" #: src/components/TwoFA/use2FAModal.ts:61 msgid "Invalid passcode or recovery code" @@ -1789,9 +1754,8 @@ msgid "Invalid request format" msgstr "無效的請求格式" #: src/constants/errors/backup.ts:42 -#, fuzzy msgid "Invalid security token format" -msgstr "無效的請求格式" +msgstr "無效的安全令牌格式" #: src/views/preference/AuthSettings.vue:18 msgid "IP" @@ -1829,6 +1793,18 @@ msgstr "" msgid "Key Type" msgstr "密鑰類型" +#: src/views/preference/components/ExternalNotify/columns.ts:29 +msgid "Language" +msgstr "語言" + +#: src/views/preference/components/ExternalNotify/lark.ts:5 +msgid "Lark" +msgstr "Lark" + +#: src/views/preference/components/ExternalNotify/lark_custom.ts:5 +msgid "Lark Custom" +msgstr "Lark 自定義" + #: src/views/system/Upgrade.vue:179 msgid "Last checked at" msgstr "上次檢查時間" @@ -1860,7 +1836,7 @@ msgstr "留空將不會改變任何內容" #: src/constants/errors/user.ts:6 msgid "Legacy recovery code not allowed since totp is not enabled" -msgstr "" +msgstr "不允許使用舊版恢復代碼,因為未啟用TOTP功能" #: src/views/site/cert/components/AutoCertStepOne.vue:105 msgid "Lego disable CNAME Support" @@ -1909,9 +1885,8 @@ msgid "Log" msgstr "日誌" #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:115 -#, fuzzy msgid "Log List" -msgstr "列表" +msgstr "日誌列表" #: src/routes/modules/auth.ts:14 src/views/other/Login.vue:222 msgid "Login" @@ -1925,7 +1900,7 @@ msgstr "登入成功" msgid "Logout successful" msgstr "登出成功" -#: src/views/preference/Preference.vue:210 +#: src/views/preference/Preference.vue:217 msgid "Logrotate" msgstr "Logrotate" @@ -1946,17 +1921,15 @@ msgstr "" #: src/views/site/site_edit/components/SiteStatusSegmented.vue:163 #: src/views/site/site_list/columns.tsx:103 msgid "Maintenance" -msgstr "" +msgstr "維護" #: src/views/site/site_edit/components/SiteStatusSegmented.vue:88 -#, fuzzy msgid "Maintenance mode disabled successfully" -msgstr "成功停用" +msgstr "維護模式已成功停用" #: src/views/site/site_edit/components/SiteStatusSegmented.vue:72 -#, fuzzy msgid "Maintenance mode enabled successfully" -msgstr "成功啟用" +msgstr "維護模式已成功啟用" #: src/views/site/cert/components/AutoCertStepOne.vue:53 msgid "" @@ -1970,7 +1943,7 @@ msgstr "" msgid "Manage Configs" msgstr "管理設定" -#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:121 +#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:125 msgid "Manage Sites" msgstr "管理網站" @@ -2009,7 +1982,7 @@ msgstr "模型" #: src/components/ConfigHistory/ConfigHistory.vue:55 msgid "Modified At" -msgstr "" +msgstr "修改於" #: src/components/ChatGPT/ChatGPT.vue:352 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:151 @@ -2046,7 +2019,7 @@ msgstr "多行指令" #: src/views/nginx_log/NginxLogList.vue:37 #: src/views/preference/components/AddPasskey.vue:75 #: src/views/site/ngx_conf/NgxUpstream.vue:177 -#: src/views/site/site_edit/RightSettings.vue:64 +#: src/views/site/site_edit/RightSettings.vue:63 #: src/views/site/site_list/columns.tsx:17 #: src/views/site/site_list/SiteDuplicate.vue:79 #: src/views/stream/components/RightSettings.vue:87 @@ -2072,9 +2045,8 @@ msgid "Network Total Send" msgstr "上傳流量" #: src/views/other/Install.vue:133 -#, fuzzy msgid "New Installation" -msgstr "安裝" +msgstr "新安裝" #: src/views/config/components/Rename.vue:74 msgid "New name" @@ -2094,7 +2066,7 @@ msgstr "新版本發布" msgid "Next" msgstr "下一步" -#: src/views/preference/Preference.vue:198 +#: src/views/preference/Preference.vue:205 msgid "Nginx" msgstr "Nginx" @@ -2127,14 +2099,12 @@ msgid "Nginx conf not include stream-enabled" msgstr "Nginx 配置檔未包含 stream-enabled" #: src/constants/errors/backup.ts:19 -#, fuzzy msgid "Nginx config directory is not set" -msgstr "Nginx 日誌目錄白名單" +msgstr "Nginx配置目錄未設置" #: src/components/SystemRestore/SystemRestoreContent.vue:138 -#, fuzzy msgid "Nginx configuration has been restored" -msgstr "Nginx 設定解析錯誤" +msgstr "Nginx 配置已恢復" #: src/views/site/site_edit/SiteEdit.vue:244 #: src/views/stream/StreamEdit.vue:226 @@ -2142,9 +2112,8 @@ msgid "Nginx Configuration Parse Error" msgstr "Nginx 設定解析錯誤" #: src/views/preference/NginxSettings.vue:18 -#, fuzzy msgid "Nginx Configuration Path" -msgstr "Nginx 設定解析錯誤" +msgstr "Nginx 配置路徑" #: src/views/preference/NginxSettings.vue:15 msgid "Nginx Configurations Directory" @@ -2180,7 +2149,7 @@ msgstr "Nginx 重新載入指令" #: src/views/environments/list/Environment.vue:41 msgid "Nginx reload operations have been dispatched to remote nodes" -msgstr "" +msgstr "Nginx 重新載入操作已分發至遠端節點" #: src/components/NginxControl/NginxControl.vue:26 msgid "Nginx reloaded successfully" @@ -2192,33 +2161,29 @@ msgstr "Nginx 重啟指令" #: src/views/environments/list/Environment.vue:55 msgid "Nginx restart operations have been dispatched to remote nodes" -msgstr "" +msgstr "Nginx 重啟操作已分發至遠端節點" #: src/components/NginxControl/NginxControl.vue:40 msgid "Nginx restarted successfully" msgstr "Nginx 重啟成功" #: src/views/preference/NginxSettings.vue:33 -#, fuzzy msgid "Nginx Test Config Command" -msgstr "Nginx 重啟指令" +msgstr "Nginx 測試配置指令" #: src/constants/errors/system.ts:2 -#, fuzzy msgid "Nginx UI already installed" -msgstr "此值已被使用" +msgstr "Nginx UI 已安裝" #: src/components/SystemRestore/SystemRestoreContent.vue:142 -#, fuzzy msgid "Nginx UI configuration has been restored" -msgstr "Nginx 設定解析錯誤" +msgstr "Nginx UI 配置已恢復" #: src/components/SystemRestore/SystemRestoreContent.vue:336 -#, fuzzy msgid "" "Nginx UI configuration has been restored and will restart automatically in a " "few seconds." -msgstr "Nginx 設定解析錯誤" +msgstr "Nginx UI 設定已恢復,將在幾秒後自動重新啟動。" #: src/components/ChatGPT/ChatGPT.vue:374 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:151 @@ -2234,39 +2199,35 @@ msgstr "Nginx 設定解析錯誤" #: src/views/preference/CertSettings.vue:73 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97 #: src/views/site/ngx_conf/LocationEditor.vue:88 -#: src/views/site/site_list/SiteList.vue:161 +#: src/views/site/site_list/SiteList.vue:165 #: src/views/stream/StreamList.vue:225 msgid "No" msgstr "取消" #: src/views/environments/group/columns.ts:21 #: src/views/environments/group/EnvGroup.vue:34 -#, fuzzy msgid "No Action" -msgstr "操作" +msgstr "無行動" #: src/components/ConfigHistory/DiffViewer.vue:44 msgid "No records selected" -msgstr "" +msgstr "未選取任何記錄" -#: src/views/preference/Preference.vue:168 -#, fuzzy +#: src/views/preference/Preference.vue:175 msgid "Node" -msgstr "節點名稱" +msgstr "節點" -#: src/views/site/site_edit/RightSettings.vue:67 +#: src/views/site/site_edit/RightSettings.vue:66 #: src/views/site/site_list/columns.tsx:63 #: src/views/stream/components/RightSettings.vue:90 #: src/views/stream/StreamList.vue:30 -#, fuzzy msgid "Node Group" -msgstr "環境" +msgstr "節點群組" #: src/routes/modules/environments.ts:33 #: src/views/environments/group/EnvGroup.vue:10 -#, fuzzy msgid "Node Groups" -msgstr "環境" +msgstr "節點群組" #: src/views/preference/NodeSettings.vue:15 msgid "Node name" @@ -2277,9 +2238,8 @@ msgid "Node Secret" msgstr "節點密鑰" #: src/routes/modules/environments.ts:25 -#, fuzzy msgid "Nodes" -msgstr "節點名稱" +msgstr "節點" #: src/views/certificate/CertificateList/certColumns.tsx:88 msgid "Not After" @@ -2298,7 +2258,7 @@ msgstr "此前無效: %{date}" msgid "Note" msgstr "備註" -#: src/views/site/site_edit/RightSettings.vue:96 +#: src/views/site/site_edit/RightSettings.vue:95 #: src/views/stream/components/RightSettings.vue:118 msgid "" "Note, if the configuration file include other configurations or " @@ -2314,6 +2274,10 @@ msgstr "通知" msgid "Notifications" msgstr "通知" +#: src/constants/errors/notification.ts:2 +msgid "Notifier not found" +msgstr "通知器未找到" + #: src/views/site/cert/components/ObtainCert.vue:182 msgid "Obtain certificate" msgstr "取得憑證" @@ -2356,7 +2320,7 @@ msgstr "確定" #: src/views/site/ngx_conf/NgxServer.vue:79 #: src/views/site/ngx_conf/NgxUpstream.vue:33 #: src/views/site/site_edit/components/SiteStatusSegmented.vue:121 -#: src/views/site/site_list/SiteList.vue:162 +#: src/views/site/site_list/SiteList.vue:166 #: src/views/stream/components/RightSettings.vue:54 #: src/views/stream/StreamList.vue:226 #: src/views/system/Backup/BackupCreator.vue:149 @@ -2377,9 +2341,9 @@ msgstr "線上" #: src/components/SystemRestore/SystemRestoreContent.vue:78 msgid "Only zip files are allowed" -msgstr "" +msgstr "只允許壓縮檔" -#: src/views/preference/Preference.vue:204 +#: src/views/preference/Preference.vue:211 msgid "OpenAI" msgstr "OpenAI" @@ -2416,9 +2380,8 @@ msgid "Overwrite exist file" msgstr "覆蓋現有檔案" #: src/views/preference/AppSettings.vue:13 -#, fuzzy msgid "Page Size" -msgstr "管理網站" +msgstr "頁面大小" #: src/views/site/ngx_conf/directive/DirectiveAdd.vue:94 msgid "Params" @@ -2495,14 +2458,13 @@ msgid "Please enter the OTP code:" msgstr "請輸入 OTP 代碼:" #: src/components/SystemRestore/SystemRestoreContent.vue:112 -#, fuzzy msgid "Please enter the security token" -msgstr "請輸入 OTP 代碼:" +msgstr "請輸入安全令牌" #: src/components/SystemRestore/SystemRestoreContent.vue:210 #: src/components/SystemRestore/SystemRestoreContent.vue:287 msgid "Please enter the security token received during backup" -msgstr "" +msgstr "請輸入備份時收到的安全令牌" #: src/views/certificate/DNSCredential.vue:53 msgid "" @@ -2522,7 +2484,7 @@ msgstr "" "請先在「憑證」 > 「DNS 認證」中新增認證,然後選擇以下認證之一以請求 DNS 供應" "商的 API。" -#: src/components/Notification/notifications.ts:138 +#: src/components/Notification/notifications.ts:176 #: src/language/constants.ts:59 msgid "" "Please generate new recovery codes in the preferences immediately to prevent " @@ -2564,7 +2526,7 @@ msgstr "請輸入您的使用者名稱!" #: src/views/other/Install.vue:110 src/views/system/Backup/SystemRestore.vue:10 msgid "Please log in." -msgstr "" +msgstr "請登入。" #: src/views/certificate/DNSCredential.vue:62 msgid "" @@ -2573,39 +2535,34 @@ msgstr "請注意,以下時間配置單位均為秒。" #: src/views/system/Backup/BackupCreator.vue:107 msgid "Please save this security token, you will need it for restoration:" -msgstr "" +msgstr "請保存此安全令牌,您將需要它進行恢復:" #: src/components/SystemRestore/SystemRestoreContent.vue:107 -#, fuzzy msgid "Please select a backup file" -msgstr "請至少選擇一個節點!" +msgstr "請選擇備份檔案" #: src/views/environments/list/Environment.vue:112 #: src/views/environments/list/Environment.vue:35 -#, fuzzy msgid "Please select at least one node to reload Nginx" -msgstr "請至少選擇一個節點進行升級" +msgstr "請至少選擇一個節點以重新載入Nginx" #: src/views/environments/list/Environment.vue:133 #: src/views/environments/list/Environment.vue:49 -#, fuzzy msgid "Please select at least one node to restart Nginx" -msgstr "請至少選擇一個節點進行升級" +msgstr "請至少選擇一個節點以重啟Nginx" #: src/views/environments/list/Environment.vue:91 msgid "Please select at least one node to upgrade" msgstr "請至少選擇一個節點進行升級" #: src/views/preference/ServerSettings.vue:21 -#, fuzzy msgid "Port" -msgstr "HTTP 監聽埠" +msgstr "監聽埠" #: src/views/environments/group/columns.ts:17 #: src/views/environments/group/EnvGroup.vue:26 -#, fuzzy msgid "Post-sync Action" -msgstr "批次操作" +msgstr "同步後動作" #: src/views/environments/list/BatchUpgrader.vue:167 #: src/views/environments/list/BatchUpgrader.vue:220 @@ -2613,7 +2570,7 @@ msgstr "批次操作" msgid "Pre-release" msgstr "預先發布" -#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:151 +#: src/routes/modules/preference.ts:10 src/views/preference/Preference.vue:152 msgid "Preference" msgstr "偏好設定" @@ -2743,33 +2700,28 @@ msgstr "重新載入" #: src/views/environments/group/EnvGroup.vue:37 #: src/views/environments/list/Environment.vue:120 #: src/views/environments/list/Environment.vue:128 -#, fuzzy msgid "Reload Nginx" -msgstr "正在重新載入 Nginx" +msgstr "重載 Nginx" -#: src/components/Notification/notifications.ts:144 -#, fuzzy +#: src/components/Notification/notifications.ts:10 msgid "Reload Nginx on %{node} failed, response: %{resp}" -msgstr "從 %{node} 移除站點 %{site} 時發生錯誤,回應:%{resp}" +msgstr "在節點 %{node} 上重新載入 Nginx 失敗,回應:%{resp}" -#: src/components/Notification/notifications.ts:148 -#, fuzzy +#: src/components/Notification/notifications.ts:14 msgid "Reload Nginx on %{node} successfully" -msgstr "成功升級 %{node} 上的 Nginx UI 🎉" +msgstr "在 %{node} 上成功重新載入 Nginx" -#: src/components/Notification/notifications.ts:143 -#, fuzzy +#: src/components/Notification/notifications.ts:9 msgid "Reload Remote Nginx Error" -msgstr "重命名遠端遠端站點時發生錯誤" +msgstr "重新載入遠端Nginx錯誤" -#: src/components/Notification/notifications.ts:147 -#, fuzzy +#: src/components/Notification/notifications.ts:13 msgid "Reload Remote Nginx Success" -msgstr "重新命名遠端站點成功" +msgstr "遠端Nginx重載成功" #: src/components/EnvGroupTabs/EnvGroupTabs.vue:104 msgid "Reload request failed, please check your network connection" -msgstr "" +msgstr "重新載入請求失敗,請檢查您的網路連線" #: src/components/NginxControl/NginxControl.vue:73 msgid "Reloading" @@ -2801,60 +2753,55 @@ msgstr "移除成功" msgid "Rename" msgstr "重命名" -#: src/components/Notification/notifications.ts:28 -#, fuzzy +#: src/components/Notification/notifications.ts:66 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed" -msgstr "成功將 %{env_name} 上的 %{orig_path} 重命名為 %{new_path}" +msgstr "將 %{orig_path} 重新命名為 %{new_path} 在 %{env_name} 上失敗" -#: src/components/Notification/notifications.ts:32 +#: src/components/Notification/notifications.ts:70 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully" msgstr "成功將 %{env_name} 上的 %{orig_path} 重命名為 %{new_path}" -#: src/components/Notification/notifications.ts:27 src/language/constants.ts:42 +#: src/components/Notification/notifications.ts:65 src/language/constants.ts:42 msgid "Rename Remote Config Error" msgstr "重命名遠端配置錯誤" -#: src/components/Notification/notifications.ts:31 src/language/constants.ts:41 +#: src/components/Notification/notifications.ts:69 src/language/constants.ts:41 msgid "Rename Remote Config Success" msgstr "重新命名遠端配置成功" -#: src/components/Notification/notifications.ts:77 src/language/constants.ts:56 +#: src/components/Notification/notifications.ts:115 +#: src/language/constants.ts:56 msgid "Rename Remote Site Error" msgstr "重命名遠端遠端站點時發生錯誤" -#: src/components/Notification/notifications.ts:81 src/language/constants.ts:55 +#: src/components/Notification/notifications.ts:119 +#: src/language/constants.ts:55 msgid "Rename Remote Site Success" msgstr "重新命名遠端站點成功" -#: src/components/Notification/notifications.ts:119 -#, fuzzy +#: src/components/Notification/notifications.ts:157 msgid "Rename Remote Stream Error" -msgstr "重命名遠端遠端站點時發生錯誤" +msgstr "遠端串流重新命名錯誤" -#: src/components/Notification/notifications.ts:123 -#, fuzzy +#: src/components/Notification/notifications.ts:161 msgid "Rename Remote Stream Success" -msgstr "重新命名遠端站點成功" +msgstr "遠端串流重新命名成功" -#: src/components/Notification/notifications.ts:78 -#, fuzzy +#: src/components/Notification/notifications.ts:116 msgid "Rename site %{name} to %{new_name} on %{node} failed" -msgstr "成功將站點 %{site} 重新命名為 %{new_site} 於 %{node}" - -#: src/components/Notification/notifications.ts:82 -#, fuzzy -msgid "Rename site %{name} to %{new_name} on %{node} successfully" -msgstr "成功將站點 %{site} 重新命名為 %{new_site} 於 %{node}" +msgstr "將網站 %{name} 在 %{node} 上重新命名為 %{new_name} 失敗" #: src/components/Notification/notifications.ts:120 -#, fuzzy -msgid "Rename stream %{name} to %{new_name} on %{node} failed" -msgstr "成功將站點 %{site} 重新命名為 %{new_site} 於 %{node}" +msgid "Rename site %{name} to %{new_name} on %{node} successfully" +msgstr "將網站 %{name} 在 %{node} 上成功更名為 %{new_name}" -#: src/components/Notification/notifications.ts:124 -#, fuzzy +#: src/components/Notification/notifications.ts:158 +msgid "Rename stream %{name} to %{new_name} on %{node} failed" +msgstr "將節點 %{node} 上的串流 %{name} 重新命名為 %{new_name} 失敗" + +#: src/components/Notification/notifications.ts:162 msgid "Rename stream %{name} to %{new_name} on %{node} successfully" -msgstr "成功將站點 %{site} 重新命名為 %{new_site} 於 %{node}" +msgstr "將節點 %{node} 上的串流 %{name} 重新命名為 %{new_name} 成功" #: src/views/config/components/Rename.vue:43 msgid "Rename successfully" @@ -2907,64 +2854,55 @@ msgstr "重新啟動" #: src/components/EnvGroupTabs/EnvGroupTabs.vue:168 #: src/views/environments/list/Environment.vue:141 #: src/views/environments/list/Environment.vue:149 -#, fuzzy msgid "Restart Nginx" -msgstr "正在重新啟動" +msgstr "重新啟動 Nginx" -#: src/components/Notification/notifications.ts:152 -#, fuzzy +#: src/components/Notification/notifications.ts:18 msgid "Restart Nginx on %{node} failed, response: %{resp}" -msgstr "啟用站點 %{site} 在 %{node} 時發生錯誤,回應:%{resp}" +msgstr "在節點 %{node} 上重啟 Nginx 失敗,回應:%{resp}" -#: src/components/Notification/notifications.ts:156 -#, fuzzy +#: src/components/Notification/notifications.ts:22 msgid "Restart Nginx on %{node} successfully" -msgstr "成功升級 %{node} 上的 Nginx UI 🎉" +msgstr "在%{node}上成功重啟Nginx" -#: src/components/Notification/notifications.ts:151 -#, fuzzy +#: src/components/Notification/notifications.ts:17 msgid "Restart Remote Nginx Error" -msgstr "重命名遠端遠端站點時發生錯誤" +msgstr "遠端Nginx重啟錯誤" -#: src/components/Notification/notifications.ts:155 -#, fuzzy +#: src/components/Notification/notifications.ts:21 msgid "Restart Remote Nginx Success" -msgstr "重新命名遠端站點成功" +msgstr "遠端Nginx重啟成功" #: src/components/EnvGroupTabs/EnvGroupTabs.vue:124 msgid "Restart request failed, please check your network connection" -msgstr "" +msgstr "重新啟動請求失敗,請檢查您的網路連線" #: src/components/NginxControl/NginxControl.vue:78 msgid "Restarting" msgstr "正在重新啟動" #: src/components/SystemRestore/SystemRestoreContent.vue:135 -#, fuzzy msgid "Restore completed successfully" -msgstr "刪除成功" +msgstr "恢復已完成" #: src/views/other/Install.vue:190 -#, fuzzy msgid "Restore from Backup" -msgstr "系統" +msgstr "從備份中恢復" #: src/components/SystemRestore/SystemRestoreContent.vue:223 #: src/components/SystemRestore/SystemRestoreContent.vue:300 -#, fuzzy msgid "Restore Nginx Configuration" -msgstr "Nginx 配置目錄" +msgstr "恢復Nginx設定" #: src/components/SystemRestore/SystemRestoreContent.vue:234 #: src/components/SystemRestore/SystemRestoreContent.vue:311 -#, fuzzy msgid "Restore Nginx UI Configuration" -msgstr "Nginx 配置目錄" +msgstr "恢復Nginx UI配置" #: src/components/ConfigHistory/DiffViewer.vue:402 #: src/components/ConfigHistory/DiffViewer.vue:415 msgid "Restore this version" -msgstr "" +msgstr "恢復此版本" #: src/views/preference/AuthSettings.vue:107 msgid "RP Display Name" @@ -2993,7 +2931,7 @@ msgstr "執行中" #: src/views/config/components/ConfigName.vue:59 #: src/views/config/ConfigEditor.vue:271 #: src/views/preference/components/Passkey.vue:130 -#: src/views/preference/Preference.vue:221 +#: src/views/preference/Preference.vue:228 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:127 #: src/views/site/site_edit/components/ConfigName.vue:52 #: src/views/site/site_edit/SiteEdit.vue:292 @@ -3011,48 +2949,44 @@ msgstr "儲存指令" msgid "Save error %{msg}" msgstr "儲存錯誤 %{msg}" -#: src/components/Notification/notifications.ts:85 src/language/constants.ts:48 +#: src/components/Notification/notifications.ts:123 +#: src/language/constants.ts:48 msgid "Save Remote Site Error" msgstr "儲存遠端站點時發生錯誤" -#: src/components/Notification/notifications.ts:89 src/language/constants.ts:47 +#: src/components/Notification/notifications.ts:127 +#: src/language/constants.ts:47 msgid "Save Remote Site Success" msgstr "儲存遠端站點成功" -#: src/components/Notification/notifications.ts:127 -#, fuzzy +#: src/components/Notification/notifications.ts:165 msgid "Save Remote Stream Error" -msgstr "儲存遠端站點時發生錯誤" +msgstr "保存遠端串流錯誤" -#: src/components/Notification/notifications.ts:131 -#, fuzzy +#: src/components/Notification/notifications.ts:169 msgid "Save Remote Stream Success" -msgstr "儲存遠端站點成功" +msgstr "遠端串流儲存成功" -#: src/components/Notification/notifications.ts:86 -#, fuzzy +#: src/components/Notification/notifications.ts:124 msgid "Save site %{name} to %{node} failed" -msgstr "成功將站點 %{site} 儲存至 %{node}" - -#: src/components/Notification/notifications.ts:90 -#, fuzzy -msgid "Save site %{name} to %{node} successfully" -msgstr "成功將站點 %{site} 儲存至 %{node}" +msgstr "將網站 %{name} 儲存至 %{node} 失敗" #: src/components/Notification/notifications.ts:128 -#, fuzzy -msgid "Save stream %{name} to %{node} failed" -msgstr "部署 %{conf_name} 至 %{node_name} 失敗" +msgid "Save site %{name} to %{node} successfully" +msgstr "網站 %{name} 成功儲存至 %{node}" -#: src/components/Notification/notifications.ts:132 -#, fuzzy +#: src/components/Notification/notifications.ts:166 +msgid "Save stream %{name} to %{node} failed" +msgstr "儲存串流 %{name} 至 %{node} 失敗" + +#: src/components/Notification/notifications.ts:170 msgid "Save stream %{name} to %{node} successfully" -msgstr "成功將站點 %{site} 儲存至 %{node}" +msgstr "串流 %{name} 成功儲存至 %{node}" #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:47 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:97 #: src/views/certificate/CertificateEditor.vue:49 -#: src/views/preference/Preference.vue:123 +#: src/views/preference/Preference.vue:124 msgid "Save successfully" msgstr "儲存成功" @@ -3079,16 +3013,15 @@ msgstr "密鑰已複製" #: src/components/SystemRestore/SystemRestoreContent.vue:207 #: src/components/SystemRestore/SystemRestoreContent.vue:284 msgid "Security Token" -msgstr "" +msgstr "安全代碼" #: src/views/system/Backup/BackupCreator.vue:94 -#, fuzzy msgid "Security Token Information" -msgstr "無效的請求格式" +msgstr "安全代碼信息" #: src/views/environments/group/EnvGroup.vue:29 msgid "Select an action after sync" -msgstr "" +msgstr "同步後選擇操作" #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:189 msgid "Selector" @@ -3103,10 +3036,9 @@ msgstr "自我檢測" msgid "Send" msgstr "傳送" -#: src/views/preference/Preference.vue:156 -#, fuzzy +#: src/views/preference/Preference.vue:157 msgid "Server" -msgstr "伺服器資訊" +msgstr "伺服器" #: src/views/dashboard/ServerAnalytic.vue:175 msgid "Server Info" @@ -3131,9 +3063,8 @@ msgid "" msgstr "設置遞迴名稱伺服器以覆蓋系統名稱伺服器以進行 DNS 驗證步驟。" #: src/views/site/site_edit/components/SiteStatusSegmented.vue:114 -#, fuzzy msgid "set to maintenance mode" -msgstr "禁用遠端站点錯誤" +msgstr "設定為維護模式" #: src/language/constants.ts:11 msgid "Setting DNS01 challenge provider" @@ -3176,18 +3107,16 @@ msgid "Single Directive" msgstr "單一指令" #: src/views/site/site_add/SiteAdd.vue:147 -#, fuzzy msgid "Site Config Created Successfully" -msgstr "網域設定檔成功建立" +msgstr "網站配置創建成功" #: src/constants/errors/site.ts:4 msgid "Site is enabled" msgstr "站點已啓用" #: src/constants/errors/site.ts:5 -#, fuzzy msgid "Site is in maintenance mode" -msgstr "站點已啓用" +msgstr "網站處於維護模式" #: src/routes/modules/nginx_log.ts:31 msgid "Site Logs" @@ -3214,9 +3143,8 @@ msgid "Sites-enabled directory not exist" msgstr "sites-enabled 資料夾不存在" #: src/views/preference/NodeSettings.vue:23 -#, fuzzy msgid "Skip Installation" -msgstr "安裝" +msgstr "跳過安裝" #: src/views/certificate/CertificateEditor.vue:211 msgid "SSL Certificate Content" @@ -3224,12 +3152,11 @@ msgstr "SSL 憑證內容" #: src/constants/errors/system.ts:8 msgid "SSL certificate file must be under Nginx configuration directory: {0}" -msgstr "" +msgstr "SSL憑證文件必須位於Nginx配置目錄下:{0}" #: src/constants/errors/system.ts:6 -#, fuzzy msgid "SSL certificate file not found" -msgstr "SSL 憑證金鑰內容" +msgstr "SSL憑證檔案未找到" #: src/views/certificate/CertificateEditor.vue:224 msgid "SSL Certificate Key Content" @@ -3246,25 +3173,23 @@ msgstr "SSL 憑證路徑" #: src/constants/errors/system.ts:4 msgid "SSL certificate path is required when HTTPS is enabled" -msgstr "" +msgstr "啟用HTTPS時需提供SSL憑證路徑" #: src/constants/errors/system.ts:9 msgid "SSL key file must be under Nginx configuration directory: {0}" -msgstr "" +msgstr "SSL密鑰文件必須位於Nginx配置目錄下:{0}" #: src/constants/errors/system.ts:7 -#, fuzzy msgid "SSL key file not found" -msgstr "站點未找到" +msgstr "SSL 金鑰檔案未找到" #: src/views/preference/ServerSettings.vue:40 -#, fuzzy msgid "SSL Key Path" -msgstr "SSL 憑證金鑰路徑" +msgstr "SSL 金鑰路徑" #: src/constants/errors/system.ts:5 msgid "SSL key path is required when HTTPS is enabled" -msgstr "" +msgstr "啟用 HTTPS 時必須提供 SSL 金鑰路徑" #: src/views/other/Login.vue:197 msgid "SSO Login" @@ -3279,12 +3204,12 @@ msgstr "穩定" #: src/components/SystemRestore/SystemRestoreContent.vue:246 #: src/components/SystemRestore/SystemRestoreContent.vue:323 msgid "Start Restore" -msgstr "" +msgstr "開始恢復" #: src/views/certificate/ACMEUser.vue:65 #: src/views/certificate/CertificateList/certColumns.tsx:65 #: src/views/environments/list/envColumns.tsx:44 -#: src/views/site/site_edit/RightSettings.vue:56 +#: src/views/site/site_edit/RightSettings.vue:55 #: src/views/site/site_list/columns.tsx:80 src/views/stream/StreamList.vue:47 msgid "Status" msgstr "狀態" @@ -3299,14 +3224,12 @@ msgid "Storage" msgstr "儲存空間" #: src/constants/errors/stream.ts:4 -#, fuzzy msgid "Stream is enabled" -msgstr "站點已啓用" +msgstr "串流已啟用" #: src/constants/errors/stream.ts:2 -#, fuzzy msgid "Stream not found" -msgstr "站點未找到" +msgstr "串流未找到" #: src/views/system/SelfCheck/tasks/backend/index.ts:10 msgid "Streams Directory" @@ -3338,7 +3261,7 @@ msgstr "" #: src/components/SystemRestore/SystemRestoreContent.vue:197 #: src/components/SystemRestore/SystemRestoreContent.vue:274 msgid "Supported file type: .zip" -msgstr "" +msgstr "支援的檔案類型:.zip" #: src/views/dashboard/ServerAnalytic.vue:236 #: src/views/dashboard/ServerAnalytic.vue:237 @@ -3361,38 +3284,35 @@ msgstr "同步" msgid "Sync Certificate" msgstr "同步憑證" -#: src/components/Notification/notifications.ts:10 -#, fuzzy +#: src/components/Notification/notifications.ts:48 msgid "Sync Certificate %{cert_name} to %{env_name} failed" -msgstr "同步憑證 %{cert_name} 到 %{env_name} 成功" +msgstr "同步憑證 %{cert_name} 至 %{env_name} 失敗" -#: src/components/Notification/notifications.ts:14 +#: src/components/Notification/notifications.ts:52 msgid "Sync Certificate %{cert_name} to %{env_name} successfully" msgstr "同步憑證 %{cert_name} 到 %{env_name} 成功" -#: src/components/Notification/notifications.ts:9 src/language/constants.ts:39 +#: src/components/Notification/notifications.ts:47 src/language/constants.ts:39 msgid "Sync Certificate Error" msgstr "同步憑證錯誤" -#: src/components/Notification/notifications.ts:13 src/language/constants.ts:38 +#: src/components/Notification/notifications.ts:51 src/language/constants.ts:38 msgid "Sync Certificate Success" msgstr "同步憑證成功" -#: src/components/Notification/notifications.ts:20 -#, fuzzy +#: src/components/Notification/notifications.ts:58 msgid "Sync config %{config_name} to %{env_name} failed" -msgstr "同步配置 %{config_name} 到 %{env_name} 成功" +msgstr "同步配置 %{config_name} 至 %{env_name} 失敗" -#: src/components/Notification/notifications.ts:24 -#, fuzzy +#: src/components/Notification/notifications.ts:62 msgid "Sync config %{config_name} to %{env_name} successfully" msgstr "同步配置 %{config_name} 到 %{env_name} 成功" -#: src/components/Notification/notifications.ts:19 src/language/constants.ts:45 +#: src/components/Notification/notifications.ts:57 src/language/constants.ts:45 msgid "Sync Config Error" msgstr "同步配置錯誤" -#: src/components/Notification/notifications.ts:23 src/language/constants.ts:44 +#: src/components/Notification/notifications.ts:61 src/language/constants.ts:44 msgid "Sync Config Success" msgstr "同步配置成功" @@ -3401,8 +3321,8 @@ msgstr "同步配置成功" msgid "Sync Nodes" msgstr "同步節點" -#: src/views/site/site_edit/RightSettings.vue:102 -#: src/views/site/site_edit/RightSettings.vue:89 +#: src/views/site/site_edit/RightSettings.vue:101 +#: src/views/site/site_edit/RightSettings.vue:88 #: src/views/stream/components/RightSettings.vue:111 #: src/views/stream/components/RightSettings.vue:124 msgid "Sync strategy" @@ -3412,7 +3332,7 @@ msgstr "同步策略" msgid "Sync to" msgstr "同步到" -#: src/views/site/site_edit/RightSettings.vue:86 +#: src/views/site/site_edit/RightSettings.vue:85 #: src/views/stream/components/RightSettings.vue:108 msgid "Synchronization" msgstr "同步" @@ -3422,29 +3342,30 @@ msgid "System" msgstr "系統" #: src/views/system/Backup/BackupCreator.vue:71 -#, fuzzy msgid "System Backup" -msgstr "系統" +msgstr "系統備份" #: src/views/certificate/ACMEUserSelector.vue:88 msgid "System Initial User" msgstr "系統初始使用者" #: src/components/SystemRestore/SystemRestoreContent.vue:174 -#, fuzzy msgid "System Restore" -msgstr "系統" +msgstr "系統恢復" #: src/views/other/Install.vue:106 src/views/system/Backup/SystemRestore.vue:6 -#, fuzzy msgid "System restored successfully." -msgstr "Nginx 重啟成功" +msgstr "系統已成功恢復。" #: src/constants/errors/self_check.ts:2 msgid "Task not found" msgstr "找不到任務" -#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:180 +#: src/views/preference/components/ExternalNotify/telegram.ts:5 +msgid "Telegram" +msgstr "Telegram" + +#: src/routes/modules/terminal.ts:10 src/views/preference/Preference.vue:187 #: src/views/terminal/Terminal.vue:129 msgid "Terminal" msgstr "終端機" @@ -3498,7 +3419,6 @@ msgid "" msgstr "節點名稱僅能包含字母、Unicode 字元、數字、連字號、破折號、冒號和句點。" #: src/views/site/site_add/SiteAdd.vue:120 -#, fuzzy msgid "The parameter of server_name is required" msgstr "必須提供 server_name 參數" @@ -3590,7 +3510,7 @@ msgstr "此欄位僅能包含字母、Unicode字元、數字、連字號、破 msgid "" "This token will only be shown once and cannot be retrieved later. Please " "make sure to save it in a secure location." -msgstr "" +msgstr "此令牌僅顯示一次且無法後續找回,請務必將其保存在安全的地方。" #: src/constants/form_errors.ts:4 msgid "This value is already taken" @@ -3601,14 +3521,14 @@ msgstr "此值已被使用" msgid "" "This will restore all Nginx configuration files. Nginx will restart after " "the restoration is complete." -msgstr "" +msgstr "這將還原所有Nginx設定檔。還原完成後,Nginx將會重新啟動。" #: src/components/SystemRestore/SystemRestoreContent.vue:238 #: src/components/SystemRestore/SystemRestoreContent.vue:315 msgid "" "This will restore configuration files and database. Nginx UI will restart " "after the restoration is complete." -msgstr "" +msgstr "這將恢復配置文件和數據庫。恢復完成後,Nginx UI 將重新啟動。" #: src/views/environments/list/BatchUpgrader.vue:182 msgid "" @@ -3694,12 +3614,13 @@ msgstr "需要多重因素驗證" #: src/views/certificate/CertificateList/certColumns.tsx:25 #: src/views/nginx_log/NginxLogList.vue:21 #: src/views/notification/notificationColumns.tsx:9 +#: src/views/preference/components/ExternalNotify/columns.ts:17 msgid "Type" msgstr "類型" #: src/views/system/SelfCheck/SelfCheck.vue:63 msgid "Unknown issue" -msgstr "" +msgstr "未知問題" #: src/views/preference/components/Passkey.vue:39 msgid "Update successfully" @@ -3710,7 +3631,7 @@ msgstr "更新成功" #: src/views/config/configColumns.tsx:36 src/views/config/ConfigEditor.vue:325 #: src/views/environments/group/columns.ts:37 #: src/views/environments/list/envColumns.tsx:90 -#: src/views/site/site_edit/RightSettings.vue:76 +#: src/views/site/site_edit/RightSettings.vue:75 #: src/views/site/site_list/columns.tsx:110 #: src/views/stream/components/RightSettings.vue:99 #: src/views/stream/StreamList.vue:67 src/views/user/userColumns.tsx:54 @@ -3790,7 +3711,7 @@ msgstr "有效" #: src/components/SystemRestore/SystemRestoreContent.vue:216 #: src/components/SystemRestore/SystemRestoreContent.vue:293 msgid "Verify Backup File Integrity" -msgstr "" +msgstr "驗證備份檔案完整性" #: src/views/environments/list/envColumns.tsx:31 msgid "Version" @@ -3836,7 +3757,8 @@ msgid "" "Warning: Restore operation will overwrite current configurations. Make sure " "you have a valid backup file and security token, and carefully select what " "to restore." -msgstr "" +msgstr "警告:恢復操作將覆蓋當前配置。請確保您擁有有效的備份檔案和安全令牌,並謹慎選" +"擇要恢復的內容。" #: src/views/certificate/DNSCredential.vue:56 msgid "" @@ -3869,23 +3791,19 @@ msgstr "" "啟用後,Nginx UI 將在啟動時自動重新註冊使用者。通常,除非您處於開發環境並使" "用 Pebble 作為 CA,否則不建議啟用此功能。" -#: src/views/site/site_edit/RightSettings.vue:92 -#, fuzzy +#: src/views/site/site_edit/RightSettings.vue:91 msgid "" "When you enable/disable, delete, or save this site, the nodes set in the " "Node Group and the nodes selected below will be synchronized." -msgstr "" -"當您啟用/禁用、刪除或儲存此網站時,網站類別中設定的節點以及下方選擇的節點將會" -"同步。" +msgstr "當您啟用/停用、刪除或保存此網站時,在節點群組中設定的節點及下方選取的節點將同" +"步更新。" #: src/views/stream/components/RightSettings.vue:114 -#, fuzzy msgid "" "When you enable/disable, delete, or save this stream, the nodes set in the " "Node Group and the nodes selected below will be synchronized." -msgstr "" -"當您啟用/禁用、刪除或儲存此網站時,網站類別中設定的節點以及下方選擇的節點將會" -"同步。" +msgstr "當您啟用/停用、刪除或儲存此串流時,在節點群組中設定的節點以及下方選取的節點將" +"會同步更新。" #: src/views/preference/components/RecoveryCodes.vue:140 msgid "" @@ -3919,7 +3837,7 @@ msgstr "是的" msgid "" "You are accessing this terminal over an insecure HTTP connection on a non-" "localhost domain. This may expose sensitive information." -msgstr "" +msgstr "您正在通過非本地網域的不安全HTTP連接訪問此終端,這可能會洩露敏感資訊。" #: src/views/system/Upgrade.vue:202 msgid "You are using the latest version" @@ -3931,11 +3849,11 @@ msgstr "您可以在此頁面檢查 Nginx UI 的升級。" #: src/components/SystemRestore/SystemRestoreContent.vue:339 msgid "You can close this dialog in %{countdown} seconds" -msgstr "" +msgstr "您可以在 %{countdown} 秒後關閉此對話框" #: src/components/SystemRestore/SystemRestoreContent.vue:342 msgid "You can close this dialog now" -msgstr "" +msgstr "你可以關閉這個對話框了" #: src/views/preference/components/AddPasskey.vue:87 msgid "" @@ -3967,6 +3885,18 @@ msgstr "您的舊代碼將不再有效。" msgid "Your passkeys" msgstr "您的通行密鑰" +#, fuzzy +#~ msgid "Access Token" +#~ msgstr "訪問日誌" + +#, fuzzy +#~ msgid "Bot Token" +#~ msgstr "Token" + +#, fuzzy +#~ msgid "Server URL" +#~ msgstr "伺服器資訊" + #~ msgid "Do you want to disable this site?" #~ msgstr "您想停用這個網站嗎?" @@ -4160,9 +4090,6 @@ msgstr "您的通行密鑰" #~ msgid "Theme" #~ msgstr "主題" -#~ msgid "Token" -#~ msgstr "Token" - #~ msgid "Git" #~ msgstr "Git" diff --git a/app/src/views/preference/ExternalNotify.vue b/app/src/views/preference/ExternalNotify.vue new file mode 100644 index 00000000..43c90332 --- /dev/null +++ b/app/src/views/preference/ExternalNotify.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/app/src/views/preference/Preference.vue b/app/src/views/preference/Preference.vue index ecda4570..ca8a51d2 100644 --- a/app/src/views/preference/Preference.vue +++ b/app/src/views/preference/Preference.vue @@ -7,6 +7,7 @@ import { useSettingsStore } from '@/pinia' import AppSettings from '@/views/preference/AppSettings.vue' import AuthSettings from '@/views/preference/AuthSettings.vue' import CertSettings from '@/views/preference/CertSettings.vue' +import ExternalNotify from '@/views/preference/ExternalNotify.vue' import HTTPSettings from '@/views/preference/HTTPSettings.vue' import LogrotateSettings from '@/views/preference/LogrotateSettings.vue' import NginxSettings from '@/views/preference/NginxSettings.vue' @@ -163,6 +164,12 @@ onMounted(() => { > + + + { - + { diff --git a/app/src/views/preference/components/ExternalNotify/bark.ts b/app/src/views/preference/components/ExternalNotify/bark.ts new file mode 100644 index 00000000..2e22be4b --- /dev/null +++ b/app/src/views/preference/components/ExternalNotify/bark.ts @@ -0,0 +1,18 @@ +// This file is auto-generated by notification generator. DO NOT EDIT. +import type { ExternalNotifyConfig } from './types' + +const BarkConfig: ExternalNotifyConfig = { + name: () => $gettext('Bark'), + config: [ + { + key: 'device_key', + label: 'Device Key', + }, + { + key: 'server_url', + label: 'Server URL', + }, + ], +} + +export default BarkConfig diff --git a/app/src/views/preference/components/ExternalNotify/columns.ts b/app/src/views/preference/components/ExternalNotify/columns.ts new file mode 100644 index 00000000..73270008 --- /dev/null +++ b/app/src/views/preference/components/ExternalNotify/columns.ts @@ -0,0 +1,50 @@ +import type { Column } from '@/components/StdDesign/types' +import { datetime, mask } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer' +import { select } from '@/components/StdDesign/StdDataEntry' +import gettext from '@/gettext' +import configMap from './index' + +const languageAvailable = gettext.available + +const configTypeMask = Object.keys(configMap).reduce((acc, key) => { + acc[key] = configMap[key].name() + return acc +}, {}) + +const columns: Column[] = [ + { + dataIndex: 'type', + title: () => $gettext('Type'), + customRender: mask(configTypeMask), + edit: { + type: select, + mask: configTypeMask, + config: { + required: true, + }, + }, + }, + { + dataIndex: 'language', + title: () => $gettext('Language'), + customRender: mask(languageAvailable), + edit: { + type: select, + mask: languageAvailable, + config: { + required: true, + }, + }, + }, + { + dataIndex: 'created_at', + title: () => $gettext('Created at'), + customRender: datetime, + }, + { + dataIndex: 'action', + title: () => $gettext('Action'), + }, +] + +export default columns diff --git a/app/src/views/preference/components/ExternalNotify/dingtalk.ts b/app/src/views/preference/components/ExternalNotify/dingtalk.ts new file mode 100644 index 00000000..86cc6cbd --- /dev/null +++ b/app/src/views/preference/components/ExternalNotify/dingtalk.ts @@ -0,0 +1,18 @@ +// This file is auto-generated by notification generator. DO NOT EDIT. +import type { ExternalNotifyConfig } from './types' + +const DingTalkConfig: ExternalNotifyConfig = { + name: () => $gettext('DingTalk'), + config: [ + { + key: 'access_token', + label: 'Access Token', + }, + { + key: 'secret', + label: 'Secret (Optional)', + }, + ], +} + +export default DingTalkConfig diff --git a/app/src/views/preference/components/ExternalNotify/index.ts b/app/src/views/preference/components/ExternalNotify/index.ts new file mode 100644 index 00000000..6f99a4a2 --- /dev/null +++ b/app/src/views/preference/components/ExternalNotify/index.ts @@ -0,0 +1,16 @@ +// This file is auto-generated by notification generator. DO NOT EDIT. +import BarkConfig from './bark' +import DingTalkConfig from './dingtalk' +import LarkConfig from './lark' +import LarkCustomConfig from './lark_custom' +import TelegramConfig from './telegram' + +const configMap = { + bark: BarkConfig, + dingtalk: DingTalkConfig, + lark: LarkConfig, + lark_custom: LarkCustomConfig, + telegram: TelegramConfig, +} + +export default configMap diff --git a/app/src/views/preference/components/ExternalNotify/lark.ts b/app/src/views/preference/components/ExternalNotify/lark.ts new file mode 100644 index 00000000..85b80337 --- /dev/null +++ b/app/src/views/preference/components/ExternalNotify/lark.ts @@ -0,0 +1,14 @@ +// This file is auto-generated by notification generator. DO NOT EDIT. +import type { ExternalNotifyConfig } from './types' + +const LarkConfig: ExternalNotifyConfig = { + name: () => $gettext('Lark'), + config: [ + { + key: 'webhook_url', + label: 'Webhook URL', + }, + ], +} + +export default LarkConfig diff --git a/app/src/views/preference/components/ExternalNotify/lark_custom.ts b/app/src/views/preference/components/ExternalNotify/lark_custom.ts new file mode 100644 index 00000000..c5df6fed --- /dev/null +++ b/app/src/views/preference/components/ExternalNotify/lark_custom.ts @@ -0,0 +1,38 @@ +// This file is auto-generated by notification generator. DO NOT EDIT. +import type { ExternalNotifyConfig } from './types' + +const LarkCustomConfig: ExternalNotifyConfig = { + name: () => $gettext('Lark Custom'), + config: [ + { + key: 'app_id', + label: 'App ID', + }, + { + key: 'app_secret', + label: 'App Secret', + }, + { + key: 'open_id', + label: 'Open ID', + }, + { + key: 'user_id', + label: 'User ID', + }, + { + key: 'union_id', + label: 'Union ID', + }, + { + key: 'email', + label: 'Email', + }, + { + key: 'chat_id', + label: 'Chat ID', + }, + ], +} + +export default LarkCustomConfig diff --git a/app/src/views/preference/components/ExternalNotify/telegram.ts b/app/src/views/preference/components/ExternalNotify/telegram.ts new file mode 100644 index 00000000..799d116a --- /dev/null +++ b/app/src/views/preference/components/ExternalNotify/telegram.ts @@ -0,0 +1,18 @@ +// This file is auto-generated by notification generator. DO NOT EDIT. +import type { ExternalNotifyConfig } from './types' + +const TelegramConfig: ExternalNotifyConfig = { + name: () => $gettext('Telegram'), + config: [ + { + key: 'bot_token', + label: 'Bot Token', + }, + { + key: 'chat_id', + label: 'Chat ID', + }, + ], +} + +export default TelegramConfig diff --git a/app/src/views/preference/components/ExternalNotify/types.d.ts b/app/src/views/preference/components/ExternalNotify/types.d.ts new file mode 100644 index 00000000..17bc8371 --- /dev/null +++ b/app/src/views/preference/components/ExternalNotify/types.d.ts @@ -0,0 +1,9 @@ +export interface ExternalNotifyConfigItem { + key: string + label: string +} + +export interface ExternalNotifyConfig { + name: () => string + config: ExternalNotifyConfigItem[] +} diff --git a/app/src/views/site/site_edit/components/SiteStatusSegmented.vue b/app/src/views/site/site_edit/components/SiteStatusSegmented.vue index 66fcb940..547a6b27 100644 --- a/app/src/views/site/site_edit/components/SiteStatusSegmented.vue +++ b/app/src/views/site/site_edit/components/SiteStatusSegmented.vue @@ -192,7 +192,5 @@ function onChangeStatus(value: string | number) { :deep(.ant-segmented-item-selected) { border-radius: 6px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); - transition: all 0.3s ease; } diff --git a/app/src/views/site/site_list/columns.tsx b/app/src/views/site/site_list/columns.tsx index bb107bf4..e3f370a2 100644 --- a/app/src/views/site/site_list/columns.tsx +++ b/app/src/views/site/site_list/columns.tsx @@ -22,7 +22,7 @@ const columns: Column[] = [{ type: input, }, search: true, - width: 170, + width: 150, customRender: ({ text, record }) => { const template: JSXElements = [] @@ -39,16 +39,18 @@ const columns: Column[] = [{ record.urls.forEach((url: string) => { const displayUrl = url.replace(/^https?:\/\//, '') urlsContainer.push( - - {displayUrl} - , + + + {displayUrl} + + , ) }) } else { record.urls.forEach((url: string) => { const displayUrl = url.replace(/^https?:\/\//, '') - urlsContainer.push({displayUrl}) + urlsContainer.push({displayUrl}) }) } @@ -75,7 +77,14 @@ const columns: Column[] = [{ sorter: true, pithy: true, batch: true, - width: 120, + width: 100, +}, { + title: () => $gettext('Updated at'), + dataIndex: 'modified_at', + customRender: datetime, + sorter: true, + pithy: true, + width: 150, }, { title: () => $gettext('Status'), dataIndex: 'status', @@ -105,14 +114,8 @@ const columns: Column[] = [{ }, sorter: true, pithy: true, - width: 150, -}, { - title: () => $gettext('Updated at'), - dataIndex: 'modified_at', - customRender: datetime, - sorter: true, - pithy: true, - width: 150, + width: 110, + fixed: 'right', }, { title: () => $gettext('Action'), dataIndex: 'action', diff --git a/cmd/external_notifier/app/src/views/preference/components/ExternalNotify/index.ts b/cmd/external_notifier/app/src/views/preference/components/ExternalNotify/index.ts new file mode 100644 index 00000000..944ab082 --- /dev/null +++ b/cmd/external_notifier/app/src/views/preference/components/ExternalNotify/index.ts @@ -0,0 +1,6 @@ +// This file is auto-generated by notification generator. DO NOT EDIT. + +const configMap = { +} + +export default configMap diff --git a/cmd/external_notifier/generate.go b/cmd/external_notifier/generate.go new file mode 100644 index 00000000..4c42f429 --- /dev/null +++ b/cmd/external_notifier/generate.go @@ -0,0 +1,277 @@ +package main + +import ( + "fmt" + "go/ast" + "go/parser" + "go/token" + "os" + "path/filepath" + "regexp" + "sort" + "strings" + "text/template" +) + +// Structure to hold extracted notifier information +type NotifierInfo struct { + Name string + Fields []FieldInfo + FileName string + ConfigKey string +} + +// Structure to hold field information for notifier +type FieldInfo struct { + Name string + Key string + Title string +} + +// Template for the TypeScript config file +const tsConfigTemplate = `// This file is auto-generated by notification generator. DO NOT EDIT. +import type { ExternalNotifyConfig } from './types' + +const {{.Name | replaceSpaces}}Config: ExternalNotifyConfig = { + name: () => $gettext('{{.Name}}'), + config: [ + {{- range .Fields}} + { + key: '{{.Key}}', + label: '{{.Title}}', + }, + {{- end}} + ], +} + +export default {{.Name | replaceSpaces}}Config +` + +// Regular expression to extract @external_notifier annotation +var externalNotifierRegex = regexp.MustCompile(`@external_notifier\(([a-zA-Z0-9 _]+)\)`) + +func main() { + if err := GenerateExternalNotifiers(); err != nil { + fmt.Printf("error generating external notifier configs: %v\n", err) + } +} + +// GenerateExternalNotifiers generates TypeScript config files for external notifiers +func GenerateExternalNotifiers() error { + fmt.Println("Generating external notifier configs...") + + // Notification package path + notificationPkgPath := "internal/notification" + outputDir := "app/src/views/preference/components/ExternalNotify" + + // Create output directory if it doesn't exist + if err := os.MkdirAll(outputDir, 0755); err != nil { + return fmt.Errorf("error creating output directory: %w", err) + } + + // Get all Go files in the notification package + files, err := filepath.Glob(filepath.Join(notificationPkgPath, "*.go")) + if err != nil { + return fmt.Errorf("error scanning notification package: %w", err) + } + + // Collect all notifier info + notifiers := []NotifierInfo{} + + for _, file := range files { + notifier, found := extractNotifierInfo(file) + if found { + notifiers = append(notifiers, notifier) + fmt.Printf("Found notifier: %s in %s\n", notifier.Name, file) + } + } + + // Generate TypeScript config files + for _, notifier := range notifiers { + if err := generateTSConfig(notifier, outputDir); err != nil { + return fmt.Errorf("error generating config for %s: %w", notifier.Name, err) + } + } + + // Update index.ts + if err := updateIndexFile(notifiers, outputDir); err != nil { + return fmt.Errorf("error updating index.ts: %w", err) + } + + fmt.Println("Generation completed successfully!") + return nil +} + +// Extract notifier information from a Go file +func extractNotifierInfo(filePath string) (NotifierInfo, bool) { + // Create the FileSet + fset := token.NewFileSet() + + // Parse the file + file, err := parser.ParseFile(fset, filePath, nil, parser.ParseComments) + if err != nil { + fmt.Printf("Error parsing file %s: %v\n", filePath, err) + return NotifierInfo{}, false + } + + var notifierInfo NotifierInfo + found := false + + // Look for the type declaration with the @external_notifier annotation + for _, decl := range file.Decls { + genDecl, ok := decl.(*ast.GenDecl) + if !ok || genDecl.Tok != token.TYPE { + continue + } + + for _, spec := range genDecl.Specs { + typeSpec, ok := spec.(*ast.TypeSpec) + if !ok { + continue + } + + structType, ok := typeSpec.Type.(*ast.StructType) + if !ok { + continue + } + + // Check if we have a comment with @external_notifier + if genDecl.Doc != nil { + for _, comment := range genDecl.Doc.List { + matches := externalNotifierRegex.FindStringSubmatch(comment.Text) + if len(matches) > 1 { + notifierInfo.Name = matches[1] + notifierInfo.ConfigKey = strings.ToLower(typeSpec.Name.Name) + notifierInfo.FileName = strings.ToLower(strings.ReplaceAll(matches[1], " ", "_")) + found = true + + // Extract fields + for _, field := range structType.Fields.List { + if len(field.Names) > 0 { + fieldName := field.Names[0].Name + + // Get json tag and title from field tags + var jsonKey, title string + if field.Tag != nil { + tagValue := strings.Trim(field.Tag.Value, "`") + + // Extract json key + jsonRegex := regexp.MustCompile(`json:"([^"]+)"`) + jsonMatches := jsonRegex.FindStringSubmatch(tagValue) + if len(jsonMatches) > 1 { + jsonKey = jsonMatches[1] + } + + // Extract title + titleRegex := regexp.MustCompile(`title:"([^"]+)"`) + titleMatches := titleRegex.FindStringSubmatch(tagValue) + if len(titleMatches) > 1 { + title = titleMatches[1] + } + } + + if jsonKey == "" { + jsonKey = strings.ToLower(fieldName) + } + + if title == "" { + title = fieldName + } + + notifierInfo.Fields = append(notifierInfo.Fields, FieldInfo{ + Name: fieldName, + Key: jsonKey, + Title: title, + }) + } + } + break + } + } + } + + if found { + break + } + } + + if found { + break + } + } + + return notifierInfo, found +} + +// Generate TypeScript config file for a notifier +func generateTSConfig(notifier NotifierInfo, outputDir string) error { + // Create function map for template + funcMap := template.FuncMap{ + "replaceSpaces": func(s string) string { + return strings.ReplaceAll(s, " ", "") + }, + } + + // Create template with function map + tmpl, err := template.New("tsConfig").Funcs(funcMap).Parse(tsConfigTemplate) + if err != nil { + return fmt.Errorf("error creating template: %w", err) + } + + // Create output file + outputFile := filepath.Join(outputDir, notifier.FileName+".ts") + file, err := os.Create(outputFile) + if err != nil { + return fmt.Errorf("error creating output file %s: %w", outputFile, err) + } + defer file.Close() + + // Execute template + err = tmpl.Execute(file, notifier) + if err != nil { + return fmt.Errorf("error executing template: %w", err) + } + + fmt.Printf("Generated TypeScript config for %s at %s\n", notifier.Name, outputFile) + return nil +} + +// Update index.ts file +func updateIndexFile(notifiers []NotifierInfo, outputDir string) error { + // Create content for index.ts + var imports strings.Builder + var configMap strings.Builder + + // Sort notifiers alphabetically by name for stable output + sort.Slice(notifiers, func(i, j int) bool { + return notifiers[i].Name < notifiers[j].Name + }) + + for _, notifier := range notifiers { + fileName := notifier.FileName + configName := strings.ReplaceAll(notifier.Name, " ", "") + "Config" + + imports.WriteString(fmt.Sprintf("import %s from './%s'\n", configName, fileName)) + } + + // Generate the map + configMap.WriteString("const configMap = {\n") + for _, notifier := range notifiers { + configKey := strings.ToLower(strings.ReplaceAll(notifier.Name, " ", "_")) + configMap.WriteString(fmt.Sprintf(" %s: %sConfig", configKey, strings.ReplaceAll(notifier.Name, " ", ""))) + configMap.WriteString(",\n") + } + configMap.WriteString("}\n") + + content := fmt.Sprintf("// This file is auto-generated by notification generator. DO NOT EDIT.\n%s\n%s\nexport default configMap\n", imports.String(), configMap.String()) + + // Write to index.ts + indexPath := filepath.Join(outputDir, "index.ts") + err := os.WriteFile(indexPath, []byte(content), 0644) + if err != nil { + return fmt.Errorf("error writing index.ts: %w", err) + } + + fmt.Printf("Updated index.ts at %s\n", indexPath) + return nil +} diff --git a/docs/package.json b/docs/package.json index 36dcb135..5c2c2f35 100644 --- a/docs/package.json +++ b/docs/package.json @@ -12,8 +12,8 @@ }, "devDependencies": { "@types/node": "^22.14.0", - "less": "^4.2.2" + "less": "^4.3.0" }, "license": "AGPL-3.0", - "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808" + "packageManager": "pnpm@10.8.0+sha512.0e82714d1b5b43c74610193cb20734897c1d00de89d0e18420aebc5977fa13d780a9cb05734624e81ebd81cc876cd464794850641c48b9544326b5622ca29971" } diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index e22a373a..6cbeb133 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: vitepress: specifier: ^1.6.3 - version: 1.6.3(@algolia/client-search@5.15.0)(@types/node@22.14.0)(less@4.2.2)(postcss@8.4.49)(search-insights@2.13.0) + version: 1.6.3(@algolia/client-search@5.15.0)(@types/node@22.14.0)(less@4.3.0)(postcss@8.4.49)(search-insights@2.13.0) vue: specifier: ^3.5.13 version: 3.5.13 @@ -19,8 +19,8 @@ importers: specifier: ^22.14.0 version: 22.14.0 less: - specifier: ^4.2.2 - version: 4.2.2 + specifier: ^4.3.0 + version: 4.3.0 packages: @@ -616,9 +616,9 @@ packages: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} - less@4.2.2: - resolution: {integrity: sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==} - engines: {node: '>=6'} + less@4.3.0: + resolution: {integrity: sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==} + engines: {node: '>=14'} hasBin: true magic-string@0.30.13: @@ -1186,9 +1186,9 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-vue@5.2.1(vite@5.4.14(@types/node@22.14.0)(less@4.2.2))(vue@3.5.13)': + '@vitejs/plugin-vue@5.2.1(vite@5.4.14(@types/node@22.14.0)(less@4.3.0))(vue@3.5.13)': dependencies: - vite: 5.4.14(@types/node@22.14.0)(less@4.2.2) + vite: 5.4.14(@types/node@22.14.0)(less@4.3.0) vue: 3.5.13 '@vue/compiler-core@3.5.13': @@ -1413,7 +1413,7 @@ snapshots: is-what@4.1.16: {} - less@4.2.2: + less@4.3.0: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 @@ -1629,7 +1629,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@5.4.14(@types/node@22.14.0)(less@4.2.2): + vite@5.4.14(@types/node@22.14.0)(less@4.3.0): dependencies: esbuild: 0.21.5 postcss: 8.4.49 @@ -1637,9 +1637,9 @@ snapshots: optionalDependencies: '@types/node': 22.14.0 fsevents: 2.3.3 - less: 4.2.2 + less: 4.3.0 - vitepress@1.6.3(@algolia/client-search@5.15.0)(@types/node@22.14.0)(less@4.2.2)(postcss@8.4.49)(search-insights@2.13.0): + vitepress@1.6.3(@algolia/client-search@5.15.0)(@types/node@22.14.0)(less@4.3.0)(postcss@8.4.49)(search-insights@2.13.0): dependencies: '@docsearch/css': 3.8.2 '@docsearch/js': 3.8.2(@algolia/client-search@5.15.0)(search-insights@2.13.0) @@ -1648,7 +1648,7 @@ snapshots: '@shikijs/transformers': 2.1.0 '@shikijs/types': 2.1.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.1(vite@5.4.14(@types/node@22.14.0)(less@4.2.2))(vue@3.5.13) + '@vitejs/plugin-vue': 5.2.1(vite@5.4.14(@types/node@22.14.0)(less@4.3.0))(vue@3.5.13) '@vue/devtools-api': 7.7.0 '@vue/shared': 3.5.13 '@vueuse/core': 12.5.0 @@ -1657,7 +1657,7 @@ snapshots: mark.js: 8.11.1 minisearch: 7.1.1 shiki: 2.1.0 - vite: 5.4.14(@types/node@22.14.0)(less@4.2.2) + vite: 5.4.14(@types/node@22.14.0)(less@4.3.0) vue: 3.5.13 optionalDependencies: postcss: 8.4.49 diff --git a/gen.sh b/gen.sh index e866eca1..7e214c1b 100755 --- a/gen.sh +++ b/gen.sh @@ -9,3 +9,6 @@ go run cmd/ngx_dir_index/ngx_dir_index.go ./internal/nginx/nginx_directives.json # generate notification texts go run cmd/notification/generate.go + +# generate external notifier configs +go run cmd/external_notifier/generate.go diff --git a/go.mod b/go.mod index b7625f9c..7e7a41d1 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/0xJacky/Nginx-UI go 1.24.2 require ( - github.com/0xJacky/pofile v0.2.1 + github.com/0xJacky/pofile v1.0.0 github.com/BurntSushi/toml v1.5.0 github.com/caarlos0/env/v11 v11.3.1 github.com/casdoor/casdoor-go-sdk v1.5.0 @@ -27,6 +27,7 @@ require ( github.com/jpillora/overseer v1.1.6 github.com/lib/pq v1.10.9 github.com/minio/selfupdate v0.6.0 + github.com/nikoksr/notify v1.3.0 github.com/nxadm/tail v1.4.11 github.com/pkg/errors v0.9.1 github.com/pquerna/otp v1.4.0 @@ -58,7 +59,7 @@ require ( github.com/AdamSLevy/jsonrpc2/v14 v14.1.0 // indirect github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns v1.3.0 // indirect @@ -93,6 +94,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/sts v1.33.18 // indirect github.com/aws/smithy-go v1.22.3 // indirect github.com/benbjohnson/clock v1.3.5 // indirect + github.com/blinkbean/dingtalk v1.1.3 // indirect github.com/boombuler/barcode v1.0.2 // indirect github.com/bsm/redislock v0.9.4 // indirect github.com/bytedance/sonic v1.13.2 // indirect @@ -117,12 +119,14 @@ require ( 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 + github.com/go-lark/lark v1.15.1 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-sql-driver/mysql v1.9.2 // indirect + github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible // indirect github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/go-webauthn/x v0.1.20 // indirect github.com/goccy/go-json v0.10.5 // indirect @@ -193,7 +197,7 @@ require ( github.com/nrdcg/porkbun v0.4.0 // indirect github.com/nzdjb/go-metaname v1.0.0 // indirect github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect - github.com/oracle/oci-go-sdk/v65 v65.88.1 // indirect + github.com/oracle/oci-go-sdk/v65 v65.89.0 // indirect github.com/ovh/go-ovh v1.7.0 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect @@ -225,6 +229,7 @@ require ( github.com/spf13/viper v1.20.1 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect + github.com/technoweenie/multipartstreamer v1.0.1 // indirect github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1140 // indirect github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1136 // indirect github.com/tjfoc/gmsm v1.4.1 // indirect @@ -238,7 +243,7 @@ require ( github.com/uozi-tech/cosy-driver-postgres v0.2.1 // indirect github.com/vinyldns/go-vinyldns v0.9.16 // indirect github.com/volcengine/volc-sdk-golang v1.0.202 // indirect - github.com/vultr/govultr/v3 v3.18.0 // indirect + github.com/vultr/govultr/v3 v3.19.1 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/yandex-cloud/go-genproto v0.0.0-20250325081613-cd85d9003939 // indirect github.com/yandex-cloud/go-sdk v0.0.0-20250325134853-dcb34ef70818 // indirect @@ -270,7 +275,7 @@ require ( google.golang.org/protobuf v1.36.6 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect - gopkg.in/ns1/ns1-go.v2 v2.14.1 // indirect + gopkg.in/ns1/ns1-go.v2 v2.14.2 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 5e568491..18e893bc 100644 --- a/go.sum +++ b/go.sum @@ -39,8 +39,6 @@ cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRY cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.120.0 h1:wc6bgG9DHyKqF5/vQvX1CiZrtHnxJjBlKUyF9nP6meA= -cloud.google.com/go v0.120.0/go.mod h1:/beW32s8/pGRuj4IILWQNd4uuebeT4dkOhKmkfit64Q= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= @@ -180,8 +178,6 @@ cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvj cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.36.0 h1:QzLrJRxytIGE8OJWzmMweIdiu2pIlRVq9kSi7+xnDkU= -cloud.google.com/go/compute v1.36.0/go.mod h1:+GZuz5prSWFLquViP55zcjRrOm7vRpIllx2MaYpzuiI= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= @@ -610,24 +606,18 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= -github.com/0xJacky/pofile v0.2.1 h1:ceNyprJOpo7wPPR0rCOuR1gfjYiS8t9YBc73tSLnlDc= -github.com/0xJacky/pofile v0.2.1/go.mod h1:hOZmte1hWostNs9KCwFRhKM7hf0d19zfWosopngij74= +github.com/0xJacky/pofile v1.0.0 h1:ZjfpvLlouhnzOsSGhJ/dmqp5DkKg7XGjuulAAXVnhkE= +github.com/0xJacky/pofile v1.0.0/go.mod h1:qq7YtcX4V35EBfOypsYLuLO7hCBExAH9q7xOxTqv2lQ= github.com/AdamSLevy/jsonrpc2/v14 v14.1.0 h1:Dy3M9aegiI7d7PF1LUdjbVigJReo+QOceYsMyFh9qoE= github.com/AdamSLevy/jsonrpc2/v14 v14.1.0/go.mod h1:ZakZtbCXxCz82NJvq7MoREtiQesnDfrtF6RFUGzQfLo= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1 h1:DSDNVxqkoXJiko6x8a90zidoYqnYYa6c1MTzDKzKkTo= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1/go.mod h1:zGqV2R4Cr/k8Uye5w+dgQ06WJtEcbQG/8J7BB6hnCr4= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 h1:F0gBpfdPLGsw+nsgk6aqqkZS1jiixa5WwFe3fk/T3Ys= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2/go.mod h1:SqINnQ9lVVdRlyC8cd1lCI0SdX4n2paeABd2K8ggfnE= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 h1:OVoM452qUFBrX+URdH3VpR299ma4kfom0yB0URYky9g= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0/go.mod h1:kUjrAo8bgEwLeZ/CmHqNl3Z/kPm7y6FKfxxK0izYUg4= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.0 h1:Bg8m3nq/X1DeePkAbCfb6ml6F3F0IunEhE8TMh+lY48= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.0/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0 h1:lpOxwrQ919lCZoNCd69rVt8u1eLZuMORrGXqy8sNf3c= @@ -706,8 +696,6 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/aliyun/alibaba-cloud-sdk-go v1.63.103 h1:kZsvZo6waUg5313S6VkoPx8QyyeoUfMgF/KgxpiEfCw= -github.com/aliyun/alibaba-cloud-sdk-go v1.63.103/go.mod h1:SOSDHfe1kX91v3W5QiBsWSLqeLxImobbMX1mxrFHsVQ= github.com/aliyun/alibaba-cloud-sdk-go v1.63.104 h1:/6jF6rhmKZzvZZhzFXWqATazSKL5OSv7p+8PfoT6MG0= github.com/aliyun/alibaba-cloud-sdk-go v1.63.104/go.mod h1:SOSDHfe1kX91v3W5QiBsWSLqeLxImobbMX1mxrFHsVQ= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= @@ -726,12 +714,8 @@ github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM= github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= -github.com/aws/aws-sdk-go-v2/config v1.29.12 h1:Y/2a+jLPrPbHpFkpAAYkVEtJmxORlXoo5k2g1fa2sUo= -github.com/aws/aws-sdk-go-v2/config v1.29.12/go.mod h1:xse1YTjmORlb/6fhkWi8qJh3cvZi4JoVNhc+NbJt4kI= github.com/aws/aws-sdk-go-v2/config v1.29.13 h1:RgdPqWoE8nPpIekpVpDJsBckbqT4Liiaq9f35pbTh1Y= github.com/aws/aws-sdk-go-v2/config v1.29.13/go.mod h1:NI28qs/IOUIRhsR7GQ/JdexoqRN9tDxkIrYZq0SOF44= -github.com/aws/aws-sdk-go-v2/credentials v1.17.65 h1:q+nV2yYegofO/SUXruT+pn4KxkxmaQ++1B/QedcKBFM= -github.com/aws/aws-sdk-go-v2/credentials v1.17.65/go.mod h1:4zyjAuGOdikpNYiSGpsGz8hLGmUzlY8pc8r9QQ/RXYQ= github.com/aws/aws-sdk-go-v2/credentials v1.17.66 h1:aKpEKaTy6n4CEJeYI1MNj97oSDLi4xro3UzQfwf5RWE= github.com/aws/aws-sdk-go-v2/credentials v1.17.66/go.mod h1:xQ5SusDmHb/fy55wU0QqTy0yNfLqxzec59YcsRZB+rI= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw= @@ -747,24 +731,14 @@ github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY= -github.com/aws/aws-sdk-go-v2/service/lightsail v1.43.1 h1:0j58UseBtLuBcP6nY2z4SM1qZEvLF0ylyH6+ggnphLg= -github.com/aws/aws-sdk-go-v2/service/lightsail v1.43.1/go.mod h1:Qy22QnQSdHbZwMZrarsWZBIuK51isPlkD+Z4sztxX0o= github.com/aws/aws-sdk-go-v2/service/lightsail v1.43.2 h1:Bz0MltpmIFP2EBYADc17VHdXYxZw9JPQl8Ksq+w6aEE= github.com/aws/aws-sdk-go-v2/service/lightsail v1.43.2/go.mod h1:Qy22QnQSdHbZwMZrarsWZBIuK51isPlkD+Z4sztxX0o= -github.com/aws/aws-sdk-go-v2/service/route53 v1.50.0 h1:/nkJHXtJXJeelXHqG0898+fWKgvfaXBhGzbCsSmn9j8= -github.com/aws/aws-sdk-go-v2/service/route53 v1.50.0/go.mod h1:kGYOjvTa0Vw0qxrqrOLut1vMnui6qLxqv/SX3vYeM8Y= github.com/aws/aws-sdk-go-v2/service/route53 v1.51.0 h1:pK3YJIgOzYqctprqQ67kGSjeL+77r9Ue/4/gBonsGNc= github.com/aws/aws-sdk-go-v2/service/route53 v1.51.0/go.mod h1:kGYOjvTa0Vw0qxrqrOLut1vMnui6qLxqv/SX3vYeM8Y= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.2 h1:pdgODsAhGo4dvzC3JAG5Ce0PX8kWXrTZGx+jxADD+5E= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.2/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI= github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 h1:1Gw+9ajCV1jogloEv1RRnvfRFia2cL6c9cuKV2Ps+G8= github.com/aws/aws-sdk-go-v2/service/sso v1.25.3/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0 h1:90uX0veLKcdHVfvxhkWUQSCi5VabtwMLFutYiRke4oo= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 h1:hXmVKytPfTy5axZ+fYbR5d0cFmC3JvwLm5kM83luako= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 h1:PZV5W8yk4OtH1JAuhV2PXwwO9v5G5Aoj+eMCn4T+1Kc= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.17/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= github.com/aws/aws-sdk-go-v2/service/sts v1.33.18 h1:xz7WvTMfSStb9Y8NpCT82FXLNC3QasqBfuAFHY4Pk5g= github.com/aws/aws-sdk-go-v2/service/sts v1.33.18/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= @@ -778,6 +752,8 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/blinkbean/dingtalk v1.1.3 h1:MbidFZYom7DTFHD/YIs+eaI7kRy52kmWE/sy0xjo6E4= +github.com/blinkbean/dingtalk v1.1.3/go.mod h1:9BaLuGSBqY3vT5hstValh48DbsKO7vaHaJnG9pXwbto= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= @@ -808,7 +784,6 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -861,14 +836,11 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/ristretto/v2 v2.1.0 h1:59LjpOJLNDULHh8MC4UaegN52lC4JnO2dITsie/Pa8I= -github.com/dgraph-io/ristretto/v2 v2.1.0/go.mod h1:uejeqfYXpUomfse0+lO+13ATz4TypQYLJZzBSAemuB4= github.com/dgraph-io/ristretto/v2 v2.2.0 h1:bkY3XzJcXoMuELV8F+vS8kzNgicwQFAaGINAEJdWGOM= github.com/dgraph-io/ristretto/v2 v2.2.0/go.mod h1:RZrm63UmcBAaYWC1DotLYBmTvgkrs0+XhBd7Npn7/zI= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= @@ -929,8 +901,6 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= -github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= @@ -939,16 +909,10 @@ github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3G github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/pprof v1.5.2 h1:Kcq5W2bA2PBcVtF0MqkQjpvCpwJr+pd7zxcQh2csg7E= -github.com/gin-contrib/pprof v1.5.2/go.mod h1:a1W4CDXwAPm2zql2AKdnT7OVCJdV/oFPhJXVOrDs5Ns= 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.0.0 h1:y3bT1mUWUxDpW4JLQg/HnTqV4rozuW4tC9eFKTxYI9E= -github.com/gin-contrib/sse v1.0.0/go.mod h1:zNuFdwarAygJBht0NTKiSi3jRf6RbqeILZ9Sp6Slhe0= github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= -github.com/gin-contrib/static v1.1.3 h1:WLOpkBtMDJ3gATFZgNJyVibFMio/UHonnueqJsQ0w4U= -github.com/gin-contrib/static v1.1.3/go.mod h1:zejpJ/YWp8cZj/6EpiL5f/+skv5daQTNwRx1E8Pci30= github.com/gin-contrib/static v1.1.5 h1:bAPqT4KTZN+4uDY1b90eSrD1t8iNzod7Jj8njwmnzz4= github.com/gin-contrib/static v1.1.5/go.mod h1:8JSEXwZHcQ0uCrLPcsvnAJ4g+ODxeupP8Zetl9fd8wM= github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= @@ -971,8 +935,6 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gormigrate/gormigrate/v2 v2.1.4 h1:KOPEt27qy1cNzHfMZbp9YTmEuzkY4F4wrdsJW9WFk1U= github.com/go-gormigrate/gormigrate/v2 v2.1.4/go.mod h1:y/6gPAH6QGAgP1UfHMiXcqGeJ88/GRQbfCReE1JJD5Y= -github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= -github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= github.com/go-jose/go-jose/v4 v4.1.0 h1:cYSYxd3pw5zd2FSXk2vGdn9igQU2PS8MuxrCOCl0FdY= github.com/go-jose/go-jose/v4 v4.1.0/go.mod h1:GG/vqmYm3Von2nYiB2vGTXzdoNKE5tix5tuc6iAd+sw= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -980,6 +942,8 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-lark/lark v1.15.1 h1:fo6PQKBJht/71N9Zn3/xjknOYx0TmdVuP+VP8NrUCsI= +github.com/go-lark/lark v1.15.1/go.mod h1:6ltbSztPZRT6IaO9ZIQyVaY5pVp/KeMizDYtfZkU+vM= github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -1009,8 +973,6 @@ github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAu github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM= github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI= -github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= github.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU= github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -1018,6 +980,8 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78 github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible h1:2cauKuaELYAEARXRkq2LrJ0yDDv1rW7+wrTEdVL3uaU= +github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible/go.mod h1:qf9acutJ8cwBUhm1bqgz6Bei9/C/c93FPDljKWwsOgM= github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-webauthn/webauthn v0.12.3 h1:hHQl1xkUuabUU9uS+ISNCMLs9z50p9mDUZI/FmkayNE= @@ -1257,8 +1221,6 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.142 h1:9iOJ8tfNLw8uSiR5yx7VcHEYSOajJq5hb9SXF0BCUdA= -github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.142/go.mod h1:Y/+YLCFCJtS29i2MbYPTUlNNfwXvkzEsZKR0imY/2aY= github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.143 h1:V+82d6sqyEnG/XtIhC21zqVAMc1hiah3LQgTKZRfMtg= github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.143/go.mod h1:Y/+YLCFCJtS29i2MbYPTUlNNfwXvkzEsZKR0imY/2aY= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= @@ -1346,11 +1308,14 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I= github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60= +github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible h1:jdpOPRN1zP63Td1hDQbZW73xKmzDvZHzVdNYxhnTMDA= +github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible/go.mod h1:1c7szIrayyPPB/987hsnvNzLushdWf4o/79s3P08L8A= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jpillora/overseer v1.1.6 h1:3ygYfNcR3FfOr22miu3vR1iQcXKMHbmULBh98rbkIyo= github.com/jpillora/overseer v1.1.6/go.mod h1:aPXQtxuVb9PVWRWTXpo+LdnC/YXQ0IBLNXqKMJmgk88= @@ -1373,8 +1338,8 @@ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 h1:qGQQKEcAR99REcMpsXCp3lJ03zYT1PkRd3kQGPn9GVg= github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs= -github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw= +github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU= +github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -1418,8 +1383,6 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linode/linodego v1.48.1 h1:Ojw1S+K5jJr1dggO8/H6r4FINxXnJbOU5GkbpaTfmhU= -github.com/linode/linodego v1.48.1/go.mod h1:fc3t60If8X+yZTFAebhCnNDFrhwQhq9HDU92WnBousQ= github.com/linode/linodego v1.49.0 h1:MNd3qwvQzbXB5mCpvdCqlUIu1RPA9oC+50LyB9kK+GQ= github.com/linode/linodego v1.49.0/go.mod h1:B+HAM3//4w1wOS0BwdaQBKwBxlfe6kYJ7bSC6jJ/xtc= github.com/liquidweb/go-lwApi v0.0.0-20190605172801-52a4864d2738/go.mod h1:0sYF9rMXb0vlG+4SzdiGMXHheCZxjguMq+Zb4S2BfBs= @@ -1463,8 +1426,6 @@ github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= -github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-sqlite3 v1.14.27 h1:drZCnuvf37yPfs95E5jd9s3XhdVWLal+6BOK6qrv6IU= github.com/mattn/go-sqlite3 v1.14.27/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-tty v0.0.3/go.mod h1:ihxohKRERHTVzN+aSVRwACLCeqIoZAWpoICkkvrWyR0= @@ -1478,8 +1439,6 @@ github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/miekg/dns v1.1.47/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= -github.com/miekg/dns v1.1.64 h1:wuZgD9wwCE6XMT05UU/mlSko71eRSXEAm2EbjQXLKnQ= -github.com/miekg/dns v1.1.64/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck= github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc= github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck= github.com/mimuret/golang-iij-dpf v0.9.1 h1:Gj6EhHJkOhr+q2RnvRPJsPMcjuVnWPSccEHyoEehU34= @@ -1529,6 +1488,8 @@ github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nikoksr/notify v1.3.0 h1:UxzfxzAYGQD9a5JYLBTVx0lFMxeHCke3rPCkfWdPgLs= +github.com/nikoksr/notify v1.3.0/go.mod h1:Xor2hMmkvrCfkCKvXGbcrESez4brac2zQjhd6U2BbeM= github.com/nrdcg/auroradns v1.1.0 h1:KekGh8kmf2MNwqZVVYo/fw/ZONt8QMEmbMFOeljteWo= github.com/nrdcg/auroradns v1.1.0/go.mod h1:O7tViUZbAcnykVnrGkXzIJTHoQCHcgalgAe6X1mzHfk= github.com/nrdcg/bunny-go v0.0.0-20250327222614-988a091fc7ea h1:OSgRS4kqOs/WuxuFOObP2gwrenL4/qiKXQbQugr/Two= @@ -1581,10 +1542,8 @@ github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYr github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= -github.com/oracle/oci-go-sdk/v65 v65.88.0 h1:SbsGKsoRRxJxVTbwUyIPCPwPsHWb8aPgEEpo6qfRJnI= -github.com/oracle/oci-go-sdk/v65 v65.88.0/go.mod h1:IBEV9l1qBzUpo7zgGaRUhbB05BVfcDGYRFBCPlTcPp0= -github.com/oracle/oci-go-sdk/v65 v65.88.1 h1:Y9Y5jlQX8oVDe3UN+O4IcQnLN/aQmi4jR1/2RsXMN3M= -github.com/oracle/oci-go-sdk/v65 v65.88.1/go.mod h1:u6XRPsw9tPziBh76K7GrrRXPa8P8W3BQeqJ6ZZt9VLA= +github.com/oracle/oci-go-sdk/v65 v65.89.0 h1:Y2NRdvllV++3ebqc8v1bg7w9W1ktiMONKvW9k/bqk0M= +github.com/oracle/oci-go-sdk/v65 v65.89.0/go.mod h1:u6XRPsw9tPziBh76K7GrrRXPa8P8W3BQeqJ6ZZt9VLA= github.com/ovh/go-ovh v1.7.0 h1:V14nF7FwDjQrZt9g7jzcvAAQ3HN6DNShRFRMC3jLoPw= github.com/ovh/go-ovh v1.7.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -1594,8 +1553,6 @@ github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTK github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= -github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= -github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= @@ -1799,15 +1756,11 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69 github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1134 h1:NDCzSm7r8OZeWQje1FJNHM73Ku4QRrCP1GymfgZYLSM= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1134/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM= +github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1136/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1138 h1:eMVp9kzjBptP3K0xaUUS68dF5nNTFLbom3uQREaqftM= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1138/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1140 h1:F/vuesfLQmJhBZTHYOktz8IVWTs1nHwZYh74/H64uEs= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1140/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1134 h1:Iel1hDW0eQt6p8YDRH2EbjiK5mqC4KEzabSKV0ZQ6FY= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1134/go.mod h1:8R/Xhu0hKGRFT30uwoN44bisb3cOoNjV8iwH65DjqUc= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1136 h1:kMIdSU5IvpOROh27ToVQ3hlm6ym3lCRs9tnGCOBoZqk= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1136/go.mod h1:FpyIz3mymKaExVs6Fz27kxDBS42jqZn7vbACtxdeEH4= github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho= @@ -1832,10 +1785,6 @@ 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/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.18.0 h1:L0o1yQ6hTRdzUjWwcT/cJX0AcNaDaaL30gF8pJHUEzM= -github.com/uozi-tech/cosy v1.18.0/go.mod h1:8s8oQENTTGcmOGas/hkLvE+pZPyNG6AIblRbFgPRCwg= -github.com/uozi-tech/cosy v1.19.0 h1:ZKfWfIicEIa4mP+4Fd6fF5oNr+pVOVkUssrIZuzIw44= -github.com/uozi-tech/cosy v1.19.0/go.mod h1:WanqOcNiVoJGY6mPZScxua8yNLliJqcyPrsNTenz8dI= github.com/uozi-tech/cosy v1.19.1 h1:5CY2fd7UhM5TK4Fhu2qTLLFcMFRPRZuA3QUXGWTbXxk= github.com/uozi-tech/cosy v1.19.1/go.mod h1:WanqOcNiVoJGY6mPZScxua8yNLliJqcyPrsNTenz8dI= github.com/uozi-tech/cosy-driver-mysql v0.2.2 h1:22S/XNIvuaKGqxQPsYPXN8TZ8hHjCQdcJKVQ83Vzxoo= @@ -1849,12 +1798,10 @@ github.com/urfave/cli/v3 v3.1.1 h1:bNnl8pFI5dxPOjeONvFCDFoECLQsceDG4ejahs4Jtxk= github.com/urfave/cli/v3 v3.1.1/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo= github.com/vinyldns/go-vinyldns v0.9.16 h1:GZJStDkcCk1F1AcRc64LuuMh+ENL8pHA0CVd4ulRMcQ= github.com/vinyldns/go-vinyldns v0.9.16/go.mod h1:5qIJOdmzAnatKjurI+Tl4uTus7GJKJxb+zitufjHs3Q= -github.com/volcengine/volc-sdk-golang v1.0.201 h1:AnKtLpuEGCLuH9Yd2TvhG0SeTa+u4+MpLotIMZCdBgU= -github.com/volcengine/volc-sdk-golang v1.0.201/go.mod h1:stZX+EPgv1vF4nZwOlEe8iGcriUPRBKX8zA19gXycOQ= github.com/volcengine/volc-sdk-golang v1.0.202 h1:8H4Rq7jWfrKdW9p3j+ZyvGvVe796AeVCpqEHb9zdBLo= github.com/volcengine/volc-sdk-golang v1.0.202/go.mod h1:stZX+EPgv1vF4nZwOlEe8iGcriUPRBKX8zA19gXycOQ= -github.com/vultr/govultr/v3 v3.18.0 h1:nTfxZW7/BRUDdZyEDSWzqrtyQgNolFPXBlwwJuM7EF8= -github.com/vultr/govultr/v3 v3.18.0/go.mod h1:q34Wd76upKmf+vxFMgaNMH3A8BbsPBmSYZUGC8oZa5w= +github.com/vultr/govultr/v3 v3.19.1 h1:31rOP5Tz40AOc8h6Ws4ryzqAniUBffgRhy9uMG/EFvs= +github.com/vultr/govultr/v3 v3.19.1/go.mod h1:q34Wd76upKmf+vxFMgaNMH3A8BbsPBmSYZUGC8oZa5w= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= @@ -1955,8 +1902,6 @@ go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= 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.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= -golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= golang.org/x/arch v0.16.0 h1:foMtLTdyOmIniqWCHjY6+JxuC54XP1fDwx4N0ASyW+U= golang.org/x/arch v0.16.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1996,8 +1941,6 @@ golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2138,8 +2081,6 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= -golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2171,8 +2112,6 @@ golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= -golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98= golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2191,8 +2130,6 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2317,8 +2254,6 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -2337,9 +2272,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= +golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2359,8 +2293,6 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2447,8 +2379,6 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU= -golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ= golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2669,22 +2599,10 @@ google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20250324211829-b45e905df463 h1:qEFnJI6AnfZk0NNe8YTyXQh5i//Zxi4gBHwRgp76qpw= -google.golang.org/genproto v0.0.0-20250324211829-b45e905df463/go.mod h1:SqIx1NV9hcvqdLHo7uNZDS5lrUJybQ3evo3+z/WBfA0= -google.golang.org/genproto v0.0.0-20250404141209-ee84b53bf3d0 h1:wX+y2uwLyC73sX9zfiJW7E7m68+oxAQGzgCmoM0e/zs= -google.golang.org/genproto v0.0.0-20250404141209-ee84b53bf3d0/go.mod h1:jwIveCnYVWLDIe0ZXnIrfMKNoy/rQRSRrepUPEruz0U= google.golang.org/genproto v0.0.0-20250407143221-ac9807e6c755 h1:bldQzRMfyYSvYsP0oCgOIsBryyDN2Ci7HxB+rx3L7Qw= google.golang.org/genproto v0.0.0-20250407143221-ac9807e6c755/go.mod h1:qD4k1RhYfNmRjqaHJxKLG/HRtqbXVclhjop2mPlxGwA= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 h1:hE3bRWtU6uceqlh4fhrSnUyjKHMKB9KrTLLG+bc0ddM= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8= -google.golang.org/genproto/googleapis/api v0.0.0-20250404141209-ee84b53bf3d0 h1:Qbb5RVn5xzI4naMJSpJ7lhvmos6UwZkbekd5Uz7rt9E= -google.golang.org/genproto/googleapis/api v0.0.0-20250404141209-ee84b53bf3d0/go.mod h1:6T35kB3IPpdw7Wul09by0G/JuOuIFkXV6OOvt8IZeT8= google.golang.org/genproto/googleapis/api v0.0.0-20250407143221-ac9807e6c755 h1:AMLTAunltONNuzWgVPZXrjLWtXpsG6A3yLLPEoJ/IjU= google.golang.org/genproto/googleapis/api v0.0.0-20250407143221-ac9807e6c755/go.mod h1:2R6XrVC8Oc08GlNh8ujEpc7HkLiEZ16QeY7FxIs20ac= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 h1:e0AIkUUhxyBKh6ssZNrAMeqhA7RKUj42346d1y02i2g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250404141209-ee84b53bf3d0 h1:0K7wTWyzxZ7J+L47+LbFogJW1nn/gnnMCN0vGXNYtTI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250404141209-ee84b53bf3d0/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/genproto/googleapis/rpc v0.0.0-20250407143221-ac9807e6c755 h1:TwXJCGVREgQ/cl18iY0Z4wJCTL/GmW+Um2oSwZiZPnc= google.golang.org/genproto/googleapis/rpc v0.0.0-20250407143221-ac9807e6c755/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -2729,8 +2647,6 @@ google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= -google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= google.golang.org/grpc v1.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI= google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= @@ -2776,10 +2692,8 @@ gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/ns1/ns1-go.v2 v2.13.0 h1:I5NNqI9Bi1SGK92TVkOvLTwux5LNrix/99H2datVh48= -gopkg.in/ns1/ns1-go.v2 v2.13.0/go.mod h1:pfaU0vECVP7DIOr453z03HXS6dFJpXdNRwOyRzwmPSc= -gopkg.in/ns1/ns1-go.v2 v2.14.1 h1:wruE2g1uB90kMW+jHW8BtWa1HvNkqDfyf7SacTKWtBY= -gopkg.in/ns1/ns1-go.v2 v2.14.1/go.mod h1:pfaU0vECVP7DIOr453z03HXS6dFJpXdNRwOyRzwmPSc= +gopkg.in/ns1/ns1-go.v2 v2.14.2 h1:wz/toj9U20wBrmYxW4vTz7sZWED+JJVRjUBBJ7CKrzI= +gopkg.in/ns1/ns1-go.v2 v2.14.2/go.mod h1:pfaU0vECVP7DIOr453z03HXS6dFJpXdNRwOyRzwmPSc= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= diff --git a/internal/cert/check_expired.go b/internal/cert/check_expired.go new file mode 100644 index 00000000..8e9c69be --- /dev/null +++ b/internal/cert/check_expired.go @@ -0,0 +1,67 @@ +package cert + +import ( + "time" + + "github.com/0xJacky/Nginx-UI/internal/notification" + "github.com/0xJacky/Nginx-UI/query" + "github.com/uozi-tech/cosy/logger" +) + +func CertExpiredNotify() { + c := query.Cert + + certs, err := c.Find() + if err != nil { + logger.Errorf("CertExpiredNotify: Err: %v\n", err) + return + } + + for _, certModel := range certs { + if certModel.SSLCertificatePath == "" { + continue + } + + certInfo, err := GetCertInfo(certModel.SSLCertificatePath) + if err != nil { + continue + } + + now := time.Now() + + // Calculate days until expiration + daysUntilExpiration := int(certInfo.NotAfter.Sub(now).Hours() / 24) + + // ignore expired certificate + if daysUntilExpiration < -1 { + continue + } + + mask := map[string]any{ + "name": certModel.Name, + "days": daysUntilExpiration, + } + + // Check if certificate is already expired + if now.After(certInfo.NotAfter) { + notification.Error("Certificate Expired", "Certificate %{name} has expired", mask) + continue + } + + // Send notifications based on remaining days + switch { + case daysUntilExpiration <= 14: + notification.Info("Certificate Expiration Notice", + "Certificate %{name} will expire in %{days} days", mask) + case daysUntilExpiration <= 7: + notification.Warning("Certificate Expiring Soon", + "Certificate %{name} will expire in %{days} days", mask) + case daysUntilExpiration <= 3: + notification.Warning("Certificate Expiring Soon", + "Certificate %{name} will expire in %{days} days", mask) + case daysUntilExpiration <= 1: + notification.Error("Certificate Expiring Soon", + "Certificate %{name} will expire in 1 day", mask) + } + } +} diff --git a/internal/cron/auto_cert.go b/internal/cron/auto_cert.go new file mode 100644 index 00000000..ac0bf812 --- /dev/null +++ b/internal/cron/auto_cert.go @@ -0,0 +1,35 @@ +package cron + +import ( + "time" + + "github.com/0xJacky/Nginx-UI/internal/cert" + "github.com/go-co-op/gocron/v2" + "github.com/uozi-tech/cosy/logger" +) + +// setupAutoCertJob initializes the automatic certificate renewal job +func setupAutoCertJob(scheduler gocron.Scheduler) (gocron.Job, error) { + job, err := scheduler.NewJob(gocron.DurationJob(30*time.Minute), + gocron.NewTask(cert.AutoCert), + gocron.WithSingletonMode(gocron.LimitModeWait), + gocron.JobOption(gocron.WithStartImmediately())) + if err != nil { + logger.Errorf("AutoCert Job: Err: %v\n", err) + return nil, err + } + return job, nil +} + +// setupCertExpiredJob initializes the certificate expiration check job +func setupCertExpiredJob(scheduler gocron.Scheduler) (gocron.Job, error) { + job, err := scheduler.NewJob(gocron.DurationJob(6*time.Hour), + gocron.NewTask(cert.CertExpiredNotify), + gocron.WithSingletonMode(gocron.LimitModeWait), + gocron.JobOption(gocron.WithStartImmediately())) + if err != nil { + logger.Errorf("CertExpired Job: Err: %v\n", err) + return nil, err + } + return job, nil +} diff --git a/internal/cron/clear_token.go b/internal/cron/clear_token.go new file mode 100644 index 00000000..18a29855 --- /dev/null +++ b/internal/cron/clear_token.go @@ -0,0 +1,29 @@ +package cron + +import ( + "time" + + "github.com/0xJacky/Nginx-UI/query" + "github.com/go-co-op/gocron/v2" + "github.com/uozi-tech/cosy/logger" +) + +// setupAuthTokenCleanupJob initializes the job to clean expired auth tokens +func setupAuthTokenCleanupJob(scheduler gocron.Scheduler) (gocron.Job, error) { + job, err := scheduler.NewJob( + gocron.DurationJob(5*time.Minute), + gocron.NewTask(func() { + logger.Debug("clean expired auth tokens") + q := query.AuthToken + _, _ = q.Where(q.ExpiredAt.Lt(time.Now().Unix())).Delete() + }), + gocron.WithSingletonMode(gocron.LimitModeWait), + gocron.JobOption(gocron.WithStartImmediately())) + + if err != nil { + logger.Errorf("CleanExpiredAuthToken Err: %v\n", err) + return nil, err + } + + return job, nil +} diff --git a/internal/cron/cron.go b/internal/cron/cron.go index 630bc0ae..73db18c0 100644 --- a/internal/cron/cron.go +++ b/internal/cron/cron.go @@ -1,16 +1,11 @@ package cron import ( - "time" - - "github.com/0xJacky/Nginx-UI/internal/cert" - "github.com/0xJacky/Nginx-UI/internal/logrotate" - "github.com/0xJacky/Nginx-UI/query" - "github.com/0xJacky/Nginx-UI/settings" "github.com/go-co-op/gocron/v2" "github.com/uozi-tech/cosy/logger" ) +// Global scheduler instance var s gocron.Scheduler func init() { @@ -21,58 +16,34 @@ func init() { } } -var logrotateJob gocron.Job - +// InitCronJobs initializes and starts all cron jobs func InitCronJobs() { - _, err := s.NewJob(gocron.DurationJob(30*time.Minute), - gocron.NewTask(cert.AutoCert), - gocron.WithSingletonMode(gocron.LimitModeWait), - gocron.JobOption(gocron.WithStartImmediately())) + // Initialize auto cert job + _, err := setupAutoCertJob(s) if err != nil { logger.Fatalf("AutoCert Err: %v\n", err) } - startLogrotate() - cleanExpiredAuthToken() - - s.Start() -} - -func RestartLogrotate() { - logger.Debug("Restart Logrotate") - if logrotateJob != nil { - err := s.RemoveJob(logrotateJob.ID()) - if err != nil { - logger.Error(err) - return - } - } - - startLogrotate() -} - -func startLogrotate() { - if !settings.LogrotateSettings.Enabled { - return - } - var err error - logrotateJob, err = s.NewJob( - gocron.DurationJob(time.Duration(settings.LogrotateSettings.Interval)*time.Minute), - gocron.NewTask(logrotate.Exec), - gocron.WithSingletonMode(gocron.LimitModeWait)) + // Initialize certificate expiration check job + _, err = setupCertExpiredJob(s) if err != nil { - logger.Fatalf("LogRotate Job: Err: %v\n", err) + logger.Fatalf("CertExpired Err: %v\n", err) } -} -func cleanExpiredAuthToken() { - _, err := s.NewJob(gocron.DurationJob(5*time.Minute), gocron.NewTask(func() { - logger.Debug("clean expired auth tokens") - q := query.AuthToken - _, _ = q.Where(q.ExpiredAt.Lt(time.Now().Unix())).Delete() - }), gocron.WithSingletonMode(gocron.LimitModeWait), gocron.JobOption(gocron.WithStartImmediately())) + // Start logrotate job + setupLogrotateJob(s) + // Initialize auth token cleanup job + _, err = setupAuthTokenCleanupJob(s) if err != nil { logger.Fatalf("CleanExpiredAuthToken Err: %v\n", err) } + + // Start the scheduler + s.Start() +} + +// RestartLogrotate is a public API to restart the logrotate job +func RestartLogrotate() { + restartLogrotateJob(s) } diff --git a/internal/cron/logrotate.go b/internal/cron/logrotate.go new file mode 100644 index 00000000..6e9158f0 --- /dev/null +++ b/internal/cron/logrotate.go @@ -0,0 +1,42 @@ +package cron + +import ( + "time" + + "github.com/0xJacky/Nginx-UI/internal/logrotate" + "github.com/0xJacky/Nginx-UI/settings" + "github.com/go-co-op/gocron/v2" + "github.com/uozi-tech/cosy/logger" +) + +// logrotate job instance +var logrotateJobInstance gocron.Job + +// setupLogrotateJob initializes and starts the logrotate job +func setupLogrotateJob(scheduler gocron.Scheduler) { + if !settings.LogrotateSettings.Enabled { + return + } + var err error + logrotateJobInstance, err = scheduler.NewJob( + gocron.DurationJob(time.Duration(settings.LogrotateSettings.Interval)*time.Minute), + gocron.NewTask(logrotate.Exec), + gocron.WithSingletonMode(gocron.LimitModeWait)) + if err != nil { + logger.Fatalf("LogRotate Job: Err: %v\n", err) + } +} + +// restartLogrotateJob stops and restarts the logrotate job +func restartLogrotateJob(scheduler gocron.Scheduler) { + logger.Debug("Restart Logrotate") + if logrotateJobInstance != nil { + err := scheduler.RemoveJob(logrotateJobInstance.ID()) + if err != nil { + logger.Error(err) + return + } + } + + setupLogrotateJob(scheduler) +} diff --git a/internal/notification/bark.go b/internal/notification/bark.go new file mode 100644 index 00000000..046c3947 --- /dev/null +++ b/internal/notification/bark.go @@ -0,0 +1,30 @@ +package notification + +import ( + "context" + + "github.com/0xJacky/Nginx-UI/model" + "github.com/nikoksr/notify/service/bark" + "github.com/uozi-tech/cosy/map2struct" +) + +// @external_notifier(Bark) +type Bark struct { + DeviceKey string `json:"device_key" title:"Device Key"` + ServerURL string `json:"server_url" title:"Server URL"` +} + +func init() { + RegisterExternalNotifier("bark", func(ctx context.Context, n *model.ExternalNotify, msg *ExternalMessage) error { + barkConfig := &Bark{} + err := map2struct.WeakDecode(n.Config, barkConfig) + if err != nil { + return err + } + if barkConfig.DeviceKey == "" && barkConfig.ServerURL == "" { + return ErrInvalidNotifierConfig + } + barkService := bark.NewWithServers(barkConfig.DeviceKey, barkConfig.ServerURL) + return barkService.Send(ctx, msg.GetTitle(n.Language), msg.GetContent(n.Language)) + }) +} diff --git a/internal/notification/dingding.go b/internal/notification/dingding.go new file mode 100644 index 00000000..ba2361fc --- /dev/null +++ b/internal/notification/dingding.go @@ -0,0 +1,35 @@ +package notification + +import ( + "context" + + "github.com/0xJacky/Nginx-UI/model" + "github.com/nikoksr/notify/service/dingding" + "github.com/uozi-tech/cosy/map2struct" +) + +// @external_notifier(DingTalk) +type DingTalk struct { + AccessToken string `json:"access_token" title:"Access Token"` + Secret string `json:"secret" title:"Secret (Optional)"` +} + +func init() { + RegisterExternalNotifier("dingding", func(ctx context.Context, n *model.ExternalNotify, msg *ExternalMessage) error { + dingTalkConfig := &DingTalk{} + err := map2struct.WeakDecode(n.Config, dingTalkConfig) + if err != nil { + return err + } + if dingTalkConfig.AccessToken == "" { + return ErrInvalidNotifierConfig + } + + // Initialize DingTalk service + dingTalkService := dingding.New(&dingding.Config{ + Token: dingTalkConfig.AccessToken, + Secret: dingTalkConfig.Secret, + }) + return dingTalkService.Send(ctx, msg.GetTitle(n.Language), msg.GetContent(n.Language)) + }) +} diff --git a/internal/notification/errors.go b/internal/notification/errors.go new file mode 100644 index 00000000..0ca706a0 --- /dev/null +++ b/internal/notification/errors.go @@ -0,0 +1,9 @@ +package notification + +import "github.com/uozi-tech/cosy" + +var ( + e = cosy.NewErrorScope("notification") + ErrNotifierNotFound = e.New(404001, "notifier not found") + ErrInvalidNotifierConfig = e.New(400001, "invalid notifier config") +) diff --git a/internal/notification/external.go b/internal/notification/external.go new file mode 100644 index 00000000..e96e8dc0 --- /dev/null +++ b/internal/notification/external.go @@ -0,0 +1,100 @@ +package notification + +import ( + "context" + "sync" + + "github.com/0xJacky/Nginx-UI/internal/translation" + "github.com/0xJacky/Nginx-UI/model" + "github.com/0xJacky/Nginx-UI/query" + "github.com/uozi-tech/cosy/logger" +) + +var ( + externalNotifierRegistry = make(map[string]ExternalNotifierHandlerFunc) + externalNotifierRegistryMutex = &sync.RWMutex{} +) + +type ExternalNotifierHandlerFunc func(ctx context.Context, n *model.ExternalNotify, msg *ExternalMessage) error + +func externalNotifierHandler(n *model.ExternalNotify, msg *model.Notification) (ExternalNotifierHandlerFunc, error) { + externalNotifierRegistryMutex.RLock() + defer externalNotifierRegistryMutex.RUnlock() + notifier, ok := externalNotifierRegistry[n.Type] + if !ok { + return nil, ErrNotifierNotFound + } + return notifier, nil +} + +func RegisterExternalNotifier(name string, handler ExternalNotifierHandlerFunc) { + externalNotifierRegistryMutex.Lock() + defer externalNotifierRegistryMutex.Unlock() + externalNotifierRegistry[name] = handler +} + +type ExternalMessage struct { + Notification *model.Notification +} + +func (n *ExternalMessage) Send() { + en := query.ExternalNotify + externalNotifies, err := en.Find() + if err != nil { + logger.Error(err) + return + } + ctx := context.Background() + for _, externalNotify := range externalNotifies { + go func(externalNotify *model.ExternalNotify) { + notifier, err := externalNotifierHandler(externalNotify, n.Notification) + if err != nil { + logger.Error(err) + return + } + notifier(ctx, externalNotify, n) + }(externalNotify) + } +} + +func (n *ExternalMessage) GetTitle(lang string) string { + if n.Notification == nil { + return "" + } + + dict, ok := translation.Dict[lang] + if !ok { + dict = translation.Dict["en"] + } + + title, err := dict.Translate(n.Notification.Title) + if err != nil { + logger.Error(err) + return n.Notification.Title + } + + return title +} + +func (n *ExternalMessage) GetContent(lang string) string { + if n.Notification == nil { + return "" + } + + if n.Notification.Details == nil { + return n.Notification.Content + } + + dict, ok := translation.Dict[lang] + if !ok { + dict = translation.Dict["en"] + } + + content, err := dict.Translate(n.Notification.Content, n.Notification.Details) + if err != nil { + logger.Error(err) + return n.Notification.Content + } + + return content +} diff --git a/internal/notification/lark.go b/internal/notification/lark.go new file mode 100644 index 00000000..dd0c738e --- /dev/null +++ b/internal/notification/lark.go @@ -0,0 +1,30 @@ +package notification + +import ( + "context" + + "github.com/0xJacky/Nginx-UI/model" + "github.com/nikoksr/notify/service/lark" + "github.com/uozi-tech/cosy/map2struct" +) + +// @external_notifier(Lark) +type Lark struct { + WebhookURL string `json:"webhook_url" title:"Webhook URL"` +} + +func init() { + RegisterExternalNotifier("lark", func(ctx context.Context, n *model.ExternalNotify, msg *ExternalMessage) error { + larkConfig := &Lark{} + err := map2struct.WeakDecode(n.Config, larkConfig) + if err != nil { + return err + } + if larkConfig.WebhookURL == "" { + return ErrInvalidNotifierConfig + } + + larkService := lark.NewWebhookService(larkConfig.WebhookURL) + return larkService.Send(ctx, msg.GetTitle(n.Language), msg.GetContent(n.Language)) + }) +} diff --git a/internal/notification/lark_custom.go b/internal/notification/lark_custom.go new file mode 100644 index 00000000..c54a4225 --- /dev/null +++ b/internal/notification/lark_custom.go @@ -0,0 +1,43 @@ +package notification + +import ( + "context" + + "github.com/0xJacky/Nginx-UI/model" + "github.com/nikoksr/notify/service/lark" + "github.com/uozi-tech/cosy/map2struct" +) + +// @external_notifier(Lark Custom) +type LarkCustom struct { + AppID string `json:"app_id" title:"App ID"` + AppSecret string `json:"app_secret" title:"App Secret"` + OpenID string `json:"open_id" title:"Open ID"` + UserID string `json:"user_id" title:"User ID"` + UnionID string `json:"union_id" title:"Union ID"` + Email string `json:"email" title:"Email"` + ChatID string `json:"chat_id" title:"Chat ID"` +} + +func init() { + RegisterExternalNotifier("lark_custom", func(ctx context.Context, n *model.ExternalNotify, msg *ExternalMessage) error { + larkCustomConfig := &LarkCustom{} + err := map2struct.WeakDecode(n.Config, larkCustomConfig) + if err != nil { + return err + } + if larkCustomConfig.AppID == "" || larkCustomConfig.AppSecret == "" { + return ErrInvalidNotifierConfig + } + + larkCustomAppService := lark.NewCustomAppService(larkCustomConfig.AppID, larkCustomConfig.AppSecret) + larkCustomAppService.AddReceivers( + lark.OpenID(larkCustomConfig.OpenID), + lark.UserID(larkCustomConfig.UserID), + lark.UnionID(larkCustomConfig.UnionID), + lark.Email(larkCustomConfig.Email), + lark.ChatID(larkCustomConfig.ChatID), + ) + return larkCustomAppService.Send(ctx, msg.GetTitle(n.Language), msg.GetContent(n.Language)) + }) +} diff --git a/internal/notification/push.go b/internal/notification/push.go new file mode 100644 index 00000000..b02e8061 --- /dev/null +++ b/internal/notification/push.go @@ -0,0 +1,28 @@ +package notification + +import ( + "github.com/0xJacky/Nginx-UI/model" + "github.com/0xJacky/Nginx-UI/query" + "github.com/uozi-tech/cosy/logger" +) + +func push(nType model.NotificationType, title string, content string, details any) { + n := query.Notification + + data := &model.Notification{ + Type: nType, + Title: title, + Content: content, + Details: details, + } + + err := n.Create(data) + if err != nil { + logger.Error(err) + return + } + broadcast(data) + + extNotify := &ExternalMessage{data} + extNotify.Send() +} diff --git a/internal/notification/subscribe.go b/internal/notification/subscribe.go index 0f251aa2..6bfbc50b 100644 --- a/internal/notification/subscribe.go +++ b/internal/notification/subscribe.go @@ -4,9 +4,7 @@ import ( "sync" "github.com/0xJacky/Nginx-UI/model" - "github.com/0xJacky/Nginx-UI/query" "github.com/gin-gonic/gin" - "github.com/uozi-tech/cosy/logger" ) var ( @@ -34,21 +32,3 @@ func broadcast(data *model.Notification) { evtChan <- data } } - -func push(nType model.NotificationType, title string, content string, details any) { - n := query.Notification - - data := &model.Notification{ - Type: nType, - Title: title, - Content: content, - Details: details, - } - - err := n.Create(data) - if err != nil { - logger.Error(err) - return - } - broadcast(data) -} diff --git a/internal/notification/telegram.go b/internal/notification/telegram.go new file mode 100644 index 00000000..657ea645 --- /dev/null +++ b/internal/notification/telegram.go @@ -0,0 +1,51 @@ +package notification + +import ( + "context" + "errors" + "fmt" + "strconv" + + "github.com/0xJacky/Nginx-UI/model" + "github.com/nikoksr/notify/service/telegram" + "github.com/uozi-tech/cosy/map2struct" +) + +// @external_notifier(Telegram) +type Telegram struct { + BotToken string `json:"bot_token" title:"Bot Token"` + ChatID string `json:"chat_id" title:"Chat ID"` +} + +func init() { + RegisterExternalNotifier("telegram", func(ctx context.Context, n *model.ExternalNotify, msg *ExternalMessage) error { + telegramConfig := &Telegram{} + err := map2struct.WeakDecode(n.Config, telegramConfig) + if err != nil { + return err + } + if telegramConfig.BotToken == "" || telegramConfig.ChatID == "" { + return ErrInvalidNotifierConfig + } + + telegramService, err := telegram.New(telegramConfig.BotToken) + if err != nil { + return err + } + + // ChatID must be an integer for telegram service + chatIDInt, err := strconv.ParseInt(telegramConfig.ChatID, 10, 64) + if err != nil { + return fmt.Errorf("invalid Telegram Chat ID '%s': %w", telegramConfig.ChatID, err) + } + + // Check if chatIDInt is 0, which might indicate an empty or invalid input was parsed + if chatIDInt == 0 { + return errors.New("invalid Telegram Chat ID: cannot be zero") + } + + telegramService.AddReceivers(chatIDInt) + + return telegramService.Send(ctx, msg.GetTitle(n.Language), msg.GetContent(n.Language)) + }) +} diff --git a/internal/translation/translation.go b/internal/translation/translation.go index fd751411..3cecc7fd 100644 --- a/internal/translation/translation.go +++ b/internal/translation/translation.go @@ -4,7 +4,7 @@ import ( "encoding/json" "fmt" "github.com/0xJacky/Nginx-UI/app" - "github.com/0xJacky/pofile/pofile" + "github.com/0xJacky/pofile" "github.com/samber/lo" "io" "log" diff --git a/model/cert.go b/model/cert.go index 6465652f..2ea335ae 100644 --- a/model/cert.go +++ b/model/cert.go @@ -1,13 +1,14 @@ package model import ( + "os" + "github.com/0xJacky/Nginx-UI/internal/helper" "github.com/0xJacky/Nginx-UI/internal/nginx" "github.com/go-acme/lego/v4/certcrypto" "github.com/go-acme/lego/v4/certificate" "github.com/lib/pq" "gorm.io/gorm/clause" - "os" ) const ( @@ -128,3 +129,12 @@ func (c *CertificateResource) GetResource() certificate.Resource { CSR: c.CSR, } } + +// GetCertList returns all certificates +func GetCertList() (c []*Cert) { + if db == nil { + return + } + db.Find(&c) + return +} diff --git a/model/external_notify.go b/model/external_notify.go new file mode 100644 index 00000000..69860eb9 --- /dev/null +++ b/model/external_notify.go @@ -0,0 +1,8 @@ +package model + +type ExternalNotify struct { + Model + Type string `json:"type" cosy:"add:required;update:omitempty" gorm:"index"` + Language string `json:"language" cosy:"add:required;update:omitempty" gorm:"index"` + Config map[string]string `json:"config" cosy:"add:required;update:omitempty" gorm:"serializer:json[aes]"` +} diff --git a/model/model.go b/model/model.go index 57e42a97..e06b2388 100644 --- a/model/model.go +++ b/model/model.go @@ -33,6 +33,7 @@ func GenerateAllModel() []any { Config{}, Passkey{}, EnvGroup{}, + ExternalNotify{}, } } diff --git a/query/external_notifies.gen.go b/query/external_notifies.gen.go new file mode 100644 index 00000000..5b153d54 --- /dev/null +++ b/query/external_notifies.gen.go @@ -0,0 +1,374 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package query + +import ( + "context" + "strings" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "github.com/0xJacky/Nginx-UI/model" +) + +func newExternalNotify(db *gorm.DB, opts ...gen.DOOption) externalNotify { + _externalNotify := externalNotify{} + + _externalNotify.externalNotifyDo.UseDB(db, opts...) + _externalNotify.externalNotifyDo.UseModel(&model.ExternalNotify{}) + + tableName := _externalNotify.externalNotifyDo.TableName() + _externalNotify.ALL = field.NewAsterisk(tableName) + _externalNotify.ID = field.NewUint64(tableName, "id") + _externalNotify.CreatedAt = field.NewTime(tableName, "created_at") + _externalNotify.UpdatedAt = field.NewTime(tableName, "updated_at") + _externalNotify.DeletedAt = field.NewField(tableName, "deleted_at") + _externalNotify.Type = field.NewString(tableName, "type") + _externalNotify.Language = field.NewString(tableName, "language") + _externalNotify.Config = field.NewField(tableName, "config") + + _externalNotify.fillFieldMap() + + return _externalNotify +} + +type externalNotify struct { + externalNotifyDo + + ALL field.Asterisk + ID field.Uint64 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + Type field.String + Language field.String + Config field.Field + + fieldMap map[string]field.Expr +} + +func (e externalNotify) Table(newTableName string) *externalNotify { + e.externalNotifyDo.UseTable(newTableName) + return e.updateTableName(newTableName) +} + +func (e externalNotify) As(alias string) *externalNotify { + e.externalNotifyDo.DO = *(e.externalNotifyDo.As(alias).(*gen.DO)) + return e.updateTableName(alias) +} + +func (e *externalNotify) updateTableName(table string) *externalNotify { + e.ALL = field.NewAsterisk(table) + e.ID = field.NewUint64(table, "id") + e.CreatedAt = field.NewTime(table, "created_at") + e.UpdatedAt = field.NewTime(table, "updated_at") + e.DeletedAt = field.NewField(table, "deleted_at") + e.Type = field.NewString(table, "type") + e.Language = field.NewString(table, "language") + e.Config = field.NewField(table, "config") + + e.fillFieldMap() + + return e +} + +func (e *externalNotify) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := e.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (e *externalNotify) fillFieldMap() { + e.fieldMap = make(map[string]field.Expr, 7) + e.fieldMap["id"] = e.ID + e.fieldMap["created_at"] = e.CreatedAt + e.fieldMap["updated_at"] = e.UpdatedAt + e.fieldMap["deleted_at"] = e.DeletedAt + e.fieldMap["type"] = e.Type + e.fieldMap["language"] = e.Language + e.fieldMap["config"] = e.Config +} + +func (e externalNotify) clone(db *gorm.DB) externalNotify { + e.externalNotifyDo.ReplaceConnPool(db.Statement.ConnPool) + return e +} + +func (e externalNotify) replaceDB(db *gorm.DB) externalNotify { + e.externalNotifyDo.ReplaceDB(db) + return e +} + +type externalNotifyDo struct{ gen.DO } + +// FirstByID Where("id=@id") +func (e externalNotifyDo) FirstByID(id uint64) (result *model.ExternalNotify, err error) { + var params []interface{} + + var generateSQL strings.Builder + params = append(params, id) + generateSQL.WriteString("id=? ") + + var executeSQL *gorm.DB + executeSQL = e.UnderlyingDB().Where(generateSQL.String(), params...).Take(&result) // ignore_security_alert + err = executeSQL.Error + + return +} + +// DeleteByID update @@table set deleted_at=strftime('%Y-%m-%d %H:%M:%S','now') where id=@id +func (e externalNotifyDo) DeleteByID(id uint64) (err error) { + var params []interface{} + + var generateSQL strings.Builder + params = append(params, id) + generateSQL.WriteString("update external_notifies set deleted_at=strftime('%Y-%m-%d %H:%M:%S','now') where id=? ") + + var executeSQL *gorm.DB + executeSQL = e.UnderlyingDB().Exec(generateSQL.String(), params...) // ignore_security_alert + err = executeSQL.Error + + return +} + +func (e externalNotifyDo) Debug() *externalNotifyDo { + return e.withDO(e.DO.Debug()) +} + +func (e externalNotifyDo) WithContext(ctx context.Context) *externalNotifyDo { + return e.withDO(e.DO.WithContext(ctx)) +} + +func (e externalNotifyDo) ReadDB() *externalNotifyDo { + return e.Clauses(dbresolver.Read) +} + +func (e externalNotifyDo) WriteDB() *externalNotifyDo { + return e.Clauses(dbresolver.Write) +} + +func (e externalNotifyDo) Session(config *gorm.Session) *externalNotifyDo { + return e.withDO(e.DO.Session(config)) +} + +func (e externalNotifyDo) Clauses(conds ...clause.Expression) *externalNotifyDo { + return e.withDO(e.DO.Clauses(conds...)) +} + +func (e externalNotifyDo) Returning(value interface{}, columns ...string) *externalNotifyDo { + return e.withDO(e.DO.Returning(value, columns...)) +} + +func (e externalNotifyDo) Not(conds ...gen.Condition) *externalNotifyDo { + return e.withDO(e.DO.Not(conds...)) +} + +func (e externalNotifyDo) Or(conds ...gen.Condition) *externalNotifyDo { + return e.withDO(e.DO.Or(conds...)) +} + +func (e externalNotifyDo) Select(conds ...field.Expr) *externalNotifyDo { + return e.withDO(e.DO.Select(conds...)) +} + +func (e externalNotifyDo) Where(conds ...gen.Condition) *externalNotifyDo { + return e.withDO(e.DO.Where(conds...)) +} + +func (e externalNotifyDo) Order(conds ...field.Expr) *externalNotifyDo { + return e.withDO(e.DO.Order(conds...)) +} + +func (e externalNotifyDo) Distinct(cols ...field.Expr) *externalNotifyDo { + return e.withDO(e.DO.Distinct(cols...)) +} + +func (e externalNotifyDo) Omit(cols ...field.Expr) *externalNotifyDo { + return e.withDO(e.DO.Omit(cols...)) +} + +func (e externalNotifyDo) Join(table schema.Tabler, on ...field.Expr) *externalNotifyDo { + return e.withDO(e.DO.Join(table, on...)) +} + +func (e externalNotifyDo) LeftJoin(table schema.Tabler, on ...field.Expr) *externalNotifyDo { + return e.withDO(e.DO.LeftJoin(table, on...)) +} + +func (e externalNotifyDo) RightJoin(table schema.Tabler, on ...field.Expr) *externalNotifyDo { + return e.withDO(e.DO.RightJoin(table, on...)) +} + +func (e externalNotifyDo) Group(cols ...field.Expr) *externalNotifyDo { + return e.withDO(e.DO.Group(cols...)) +} + +func (e externalNotifyDo) Having(conds ...gen.Condition) *externalNotifyDo { + return e.withDO(e.DO.Having(conds...)) +} + +func (e externalNotifyDo) Limit(limit int) *externalNotifyDo { + return e.withDO(e.DO.Limit(limit)) +} + +func (e externalNotifyDo) Offset(offset int) *externalNotifyDo { + return e.withDO(e.DO.Offset(offset)) +} + +func (e externalNotifyDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *externalNotifyDo { + return e.withDO(e.DO.Scopes(funcs...)) +} + +func (e externalNotifyDo) Unscoped() *externalNotifyDo { + return e.withDO(e.DO.Unscoped()) +} + +func (e externalNotifyDo) Create(values ...*model.ExternalNotify) error { + if len(values) == 0 { + return nil + } + return e.DO.Create(values) +} + +func (e externalNotifyDo) CreateInBatches(values []*model.ExternalNotify, batchSize int) error { + return e.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (e externalNotifyDo) Save(values ...*model.ExternalNotify) error { + if len(values) == 0 { + return nil + } + return e.DO.Save(values) +} + +func (e externalNotifyDo) First() (*model.ExternalNotify, error) { + if result, err := e.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.ExternalNotify), nil + } +} + +func (e externalNotifyDo) Take() (*model.ExternalNotify, error) { + if result, err := e.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.ExternalNotify), nil + } +} + +func (e externalNotifyDo) Last() (*model.ExternalNotify, error) { + if result, err := e.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.ExternalNotify), nil + } +} + +func (e externalNotifyDo) Find() ([]*model.ExternalNotify, error) { + result, err := e.DO.Find() + return result.([]*model.ExternalNotify), err +} + +func (e externalNotifyDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.ExternalNotify, err error) { + buf := make([]*model.ExternalNotify, 0, batchSize) + err = e.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (e externalNotifyDo) FindInBatches(result *[]*model.ExternalNotify, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return e.DO.FindInBatches(result, batchSize, fc) +} + +func (e externalNotifyDo) Attrs(attrs ...field.AssignExpr) *externalNotifyDo { + return e.withDO(e.DO.Attrs(attrs...)) +} + +func (e externalNotifyDo) Assign(attrs ...field.AssignExpr) *externalNotifyDo { + return e.withDO(e.DO.Assign(attrs...)) +} + +func (e externalNotifyDo) Joins(fields ...field.RelationField) *externalNotifyDo { + for _, _f := range fields { + e = *e.withDO(e.DO.Joins(_f)) + } + return &e +} + +func (e externalNotifyDo) Preload(fields ...field.RelationField) *externalNotifyDo { + for _, _f := range fields { + e = *e.withDO(e.DO.Preload(_f)) + } + return &e +} + +func (e externalNotifyDo) FirstOrInit() (*model.ExternalNotify, error) { + if result, err := e.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.ExternalNotify), nil + } +} + +func (e externalNotifyDo) FirstOrCreate() (*model.ExternalNotify, error) { + if result, err := e.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.ExternalNotify), nil + } +} + +func (e externalNotifyDo) FindByPage(offset int, limit int) (result []*model.ExternalNotify, count int64, err error) { + result, err = e.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = e.Offset(-1).Limit(-1).Count() + return +} + +func (e externalNotifyDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = e.Count() + if err != nil { + return + } + + err = e.Offset(offset).Limit(limit).Scan(result) + return +} + +func (e externalNotifyDo) Scan(result interface{}) (err error) { + return e.DO.Scan(result) +} + +func (e externalNotifyDo) Delete(models ...*model.ExternalNotify) (result gen.ResultInfo, err error) { + return e.DO.Delete(models) +} + +func (e *externalNotifyDo) withDO(do gen.Dao) *externalNotifyDo { + e.DO = *do.(*gen.DO) + return e +} diff --git a/query/gen.go b/query/gen.go index 7fb902d0..cee8a7b0 100644 --- a/query/gen.go +++ b/query/gen.go @@ -16,22 +16,23 @@ import ( ) var ( - Q = new(Query) - AcmeUser *acmeUser - AuthToken *authToken - BanIP *banIP - Cert *cert - ChatGPTLog *chatGPTLog - Config *config - ConfigBackup *configBackup - DnsCredential *dnsCredential - EnvGroup *envGroup - Environment *environment - Notification *notification - Passkey *passkey - Site *site - Stream *stream - User *user + Q = new(Query) + AcmeUser *acmeUser + AuthToken *authToken + BanIP *banIP + Cert *cert + ChatGPTLog *chatGPTLog + Config *config + ConfigBackup *configBackup + DnsCredential *dnsCredential + EnvGroup *envGroup + Environment *environment + ExternalNotify *externalNotify + Notification *notification + Passkey *passkey + Site *site + Stream *stream + User *user ) func SetDefault(db *gorm.DB, opts ...gen.DOOption) { @@ -46,6 +47,7 @@ func SetDefault(db *gorm.DB, opts ...gen.DOOption) { DnsCredential = &Q.DnsCredential EnvGroup = &Q.EnvGroup Environment = &Q.Environment + ExternalNotify = &Q.ExternalNotify Notification = &Q.Notification Passkey = &Q.Passkey Site = &Q.Site @@ -55,65 +57,68 @@ func SetDefault(db *gorm.DB, opts ...gen.DOOption) { func Use(db *gorm.DB, opts ...gen.DOOption) *Query { return &Query{ - db: db, - AcmeUser: newAcmeUser(db, opts...), - AuthToken: newAuthToken(db, opts...), - BanIP: newBanIP(db, opts...), - Cert: newCert(db, opts...), - ChatGPTLog: newChatGPTLog(db, opts...), - Config: newConfig(db, opts...), - ConfigBackup: newConfigBackup(db, opts...), - DnsCredential: newDnsCredential(db, opts...), - EnvGroup: newEnvGroup(db, opts...), - Environment: newEnvironment(db, opts...), - Notification: newNotification(db, opts...), - Passkey: newPasskey(db, opts...), - Site: newSite(db, opts...), - Stream: newStream(db, opts...), - User: newUser(db, opts...), + db: db, + AcmeUser: newAcmeUser(db, opts...), + AuthToken: newAuthToken(db, opts...), + BanIP: newBanIP(db, opts...), + Cert: newCert(db, opts...), + ChatGPTLog: newChatGPTLog(db, opts...), + Config: newConfig(db, opts...), + ConfigBackup: newConfigBackup(db, opts...), + DnsCredential: newDnsCredential(db, opts...), + EnvGroup: newEnvGroup(db, opts...), + Environment: newEnvironment(db, opts...), + ExternalNotify: newExternalNotify(db, opts...), + Notification: newNotification(db, opts...), + Passkey: newPasskey(db, opts...), + Site: newSite(db, opts...), + Stream: newStream(db, opts...), + User: newUser(db, opts...), } } type Query struct { db *gorm.DB - AcmeUser acmeUser - AuthToken authToken - BanIP banIP - Cert cert - ChatGPTLog chatGPTLog - Config config - ConfigBackup configBackup - DnsCredential dnsCredential - EnvGroup envGroup - Environment environment - Notification notification - Passkey passkey - Site site - Stream stream - User user + AcmeUser acmeUser + AuthToken authToken + BanIP banIP + Cert cert + ChatGPTLog chatGPTLog + Config config + ConfigBackup configBackup + DnsCredential dnsCredential + EnvGroup envGroup + Environment environment + ExternalNotify externalNotify + Notification notification + Passkey passkey + Site site + Stream stream + User user } func (q *Query) Available() bool { return q.db != nil } func (q *Query) clone(db *gorm.DB) *Query { return &Query{ - db: db, - AcmeUser: q.AcmeUser.clone(db), - AuthToken: q.AuthToken.clone(db), - BanIP: q.BanIP.clone(db), - Cert: q.Cert.clone(db), - ChatGPTLog: q.ChatGPTLog.clone(db), - Config: q.Config.clone(db), - ConfigBackup: q.ConfigBackup.clone(db), - DnsCredential: q.DnsCredential.clone(db), - EnvGroup: q.EnvGroup.clone(db), - Environment: q.Environment.clone(db), - Notification: q.Notification.clone(db), - Passkey: q.Passkey.clone(db), - Site: q.Site.clone(db), - Stream: q.Stream.clone(db), - User: q.User.clone(db), + db: db, + AcmeUser: q.AcmeUser.clone(db), + AuthToken: q.AuthToken.clone(db), + BanIP: q.BanIP.clone(db), + Cert: q.Cert.clone(db), + ChatGPTLog: q.ChatGPTLog.clone(db), + Config: q.Config.clone(db), + ConfigBackup: q.ConfigBackup.clone(db), + DnsCredential: q.DnsCredential.clone(db), + EnvGroup: q.EnvGroup.clone(db), + Environment: q.Environment.clone(db), + ExternalNotify: q.ExternalNotify.clone(db), + Notification: q.Notification.clone(db), + Passkey: q.Passkey.clone(db), + Site: q.Site.clone(db), + Stream: q.Stream.clone(db), + User: q.User.clone(db), } } @@ -127,60 +132,63 @@ func (q *Query) WriteDB() *Query { func (q *Query) ReplaceDB(db *gorm.DB) *Query { return &Query{ - db: db, - AcmeUser: q.AcmeUser.replaceDB(db), - AuthToken: q.AuthToken.replaceDB(db), - BanIP: q.BanIP.replaceDB(db), - Cert: q.Cert.replaceDB(db), - ChatGPTLog: q.ChatGPTLog.replaceDB(db), - Config: q.Config.replaceDB(db), - ConfigBackup: q.ConfigBackup.replaceDB(db), - DnsCredential: q.DnsCredential.replaceDB(db), - EnvGroup: q.EnvGroup.replaceDB(db), - Environment: q.Environment.replaceDB(db), - Notification: q.Notification.replaceDB(db), - Passkey: q.Passkey.replaceDB(db), - Site: q.Site.replaceDB(db), - Stream: q.Stream.replaceDB(db), - User: q.User.replaceDB(db), + db: db, + AcmeUser: q.AcmeUser.replaceDB(db), + AuthToken: q.AuthToken.replaceDB(db), + BanIP: q.BanIP.replaceDB(db), + Cert: q.Cert.replaceDB(db), + ChatGPTLog: q.ChatGPTLog.replaceDB(db), + Config: q.Config.replaceDB(db), + ConfigBackup: q.ConfigBackup.replaceDB(db), + DnsCredential: q.DnsCredential.replaceDB(db), + EnvGroup: q.EnvGroup.replaceDB(db), + Environment: q.Environment.replaceDB(db), + ExternalNotify: q.ExternalNotify.replaceDB(db), + Notification: q.Notification.replaceDB(db), + Passkey: q.Passkey.replaceDB(db), + Site: q.Site.replaceDB(db), + Stream: q.Stream.replaceDB(db), + User: q.User.replaceDB(db), } } type queryCtx struct { - AcmeUser *acmeUserDo - AuthToken *authTokenDo - BanIP *banIPDo - Cert *certDo - ChatGPTLog *chatGPTLogDo - Config *configDo - ConfigBackup *configBackupDo - DnsCredential *dnsCredentialDo - EnvGroup *envGroupDo - Environment *environmentDo - Notification *notificationDo - Passkey *passkeyDo - Site *siteDo - Stream *streamDo - User *userDo + AcmeUser *acmeUserDo + AuthToken *authTokenDo + BanIP *banIPDo + Cert *certDo + ChatGPTLog *chatGPTLogDo + Config *configDo + ConfigBackup *configBackupDo + DnsCredential *dnsCredentialDo + EnvGroup *envGroupDo + Environment *environmentDo + ExternalNotify *externalNotifyDo + Notification *notificationDo + Passkey *passkeyDo + Site *siteDo + Stream *streamDo + User *userDo } func (q *Query) WithContext(ctx context.Context) *queryCtx { return &queryCtx{ - AcmeUser: q.AcmeUser.WithContext(ctx), - AuthToken: q.AuthToken.WithContext(ctx), - BanIP: q.BanIP.WithContext(ctx), - Cert: q.Cert.WithContext(ctx), - ChatGPTLog: q.ChatGPTLog.WithContext(ctx), - Config: q.Config.WithContext(ctx), - ConfigBackup: q.ConfigBackup.WithContext(ctx), - DnsCredential: q.DnsCredential.WithContext(ctx), - EnvGroup: q.EnvGroup.WithContext(ctx), - Environment: q.Environment.WithContext(ctx), - Notification: q.Notification.WithContext(ctx), - Passkey: q.Passkey.WithContext(ctx), - Site: q.Site.WithContext(ctx), - Stream: q.Stream.WithContext(ctx), - User: q.User.WithContext(ctx), + AcmeUser: q.AcmeUser.WithContext(ctx), + AuthToken: q.AuthToken.WithContext(ctx), + BanIP: q.BanIP.WithContext(ctx), + Cert: q.Cert.WithContext(ctx), + ChatGPTLog: q.ChatGPTLog.WithContext(ctx), + Config: q.Config.WithContext(ctx), + ConfigBackup: q.ConfigBackup.WithContext(ctx), + DnsCredential: q.DnsCredential.WithContext(ctx), + EnvGroup: q.EnvGroup.WithContext(ctx), + Environment: q.Environment.WithContext(ctx), + ExternalNotify: q.ExternalNotify.WithContext(ctx), + Notification: q.Notification.WithContext(ctx), + Passkey: q.Passkey.WithContext(ctx), + Site: q.Site.WithContext(ctx), + Stream: q.Stream.WithContext(ctx), + User: q.User.WithContext(ctx), } } diff --git a/router/routers.go b/router/routers.go index 1dd52ed9..cbaa9f06 100644 --- a/router/routers.go +++ b/router/routers.go @@ -10,6 +10,7 @@ import ( "github.com/0xJacky/Nginx-UI/api/cluster" "github.com/0xJacky/Nginx-UI/api/config" "github.com/0xJacky/Nginx-UI/api/crypto" + "github.com/0xJacky/Nginx-UI/api/external_notify" "github.com/0xJacky/Nginx-UI/api/index" "github.com/0xJacky/Nginx-UI/api/nginx" nginxLog "github.com/0xJacky/Nginx-UI/api/nginx_log" @@ -74,6 +75,7 @@ func InitRouter() { openai.InitRouter(g) cluster.InitRouter(g) notification.InitRouter(g) + external_notify.InitRouter(g) } // Authorization required and websocket request