From 66d359c6d476fe7aa0d3b64d36ba10d57d5050ea Mon Sep 17 00:00:00 2001 From: Malekith <40722617+420978011@users.noreply.github.com> Date: Fri, 17 Jul 2026 12:19:55 +0800 Subject: [PATCH] feat: add bilingual interface --- frontend/index.html | 4 +- frontend/package.json | 3 +- frontend/pnpm-lock.yaml | 70 +++++- frontend/src/App.vue | 235 +++++++++++------- .../components/ui/dialog/DialogContent.vue | 4 +- .../ui/dialog/DialogScrollContent.vue | 4 +- frontend/src/i18n/i18n.test.ts | 13 + frontend/src/i18n/index.ts | 15 ++ frontend/src/i18n/locales/en-US.ts | 120 +++++++++ frontend/src/i18n/locales/zh-CN.ts | 120 +++++++++ frontend/src/main.ts | 2 + frontend/src/store/settingsStore.test.ts | 57 +++++ frontend/src/store/settingsStore.ts | 34 +++ 13 files changed, 571 insertions(+), 110 deletions(-) create mode 100644 frontend/src/i18n/i18n.test.ts create mode 100644 frontend/src/i18n/index.ts create mode 100644 frontend/src/i18n/locales/en-US.ts create mode 100644 frontend/src/i18n/locales/zh-CN.ts create mode 100644 frontend/src/store/settingsStore.test.ts create mode 100644 frontend/src/store/settingsStore.ts diff --git a/frontend/index.html b/frontend/index.html index 096d706..c9ffe9f 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -1,10 +1,10 @@ - + - frontend + Modlab
diff --git a/frontend/package.json b/frontend/package.json index 1ce509b..bf829d2 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -23,7 +23,8 @@ "tailwind-merge": "^3.6.0", "tailwindcss": "^4.3.2", "tw-animate-css": "^1.4.0", - "vue": "^3.5.39" + "vue": "^3.5.39", + "vue-i18n": "^11.4.6" }, "devDependencies": { "@types/node": "^24.13.2", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index a8c5640..feff9c4 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -50,6 +50,9 @@ importers: vue: specifier: ^3.5.39 version: 3.5.39(typescript@6.0.3) + vue-i18n: + specifier: ^11.4.6 + version: 11.4.6(vue@3.5.39(typescript@6.0.3)) devDependencies: '@types/node': specifier: ^24.13.2 @@ -299,6 +302,22 @@ packages: '@internationalized/number@3.6.7': resolution: {integrity: sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==} + '@intlify/core-base@11.4.6': + resolution: {integrity: sha512-EOeHO95XESK9IFHgHeZXunsM/WBAoCA0DlaWODvx14vKmetAuS97t+l6Xe9hTUqntPpF93vtVSjjUDafw3wXMw==} + engines: {node: '>= 22'} + + '@intlify/devtools-types@11.4.6': + resolution: {integrity: sha512-wowQPpNem56b2d43IJmqbrzG2FeBKe5f/kUGlpNuBmXs6OSqncF8m1+1lxHuW8ISZJF0ma2RkW3iLkw0g0G4VA==} + engines: {node: '>= 22'} + + '@intlify/message-compiler@11.4.6': + resolution: {integrity: sha512-5nj3jULqeTAC1WovwMs1LQWgatTa2pM/rXN9T3XW8rdOtXW9ZF6/GLSNFTKDQmPLwclhPdgUWLJ/4w3fMeeC/Q==} + engines: {node: '>= 22'} + + '@intlify/shared@11.4.6': + resolution: {integrity: sha512-m1p1HHAMLhqSpTRH7VnXdrN0CQ4y+9vunFkpLkbD8soIuBsnQdawZXqMCgvwI2UVF9Ww7sVaw7g9tV2VO7shoA==} + engines: {node: '>= 22'} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -676,6 +695,9 @@ packages: '@vue/compiler-ssr@3.5.39': resolution: {integrity: sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==} + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + '@vue/devtools-api@7.7.10': resolution: {integrity: sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==} @@ -2221,10 +2243,6 @@ packages: resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==} engines: {node: '>=18'} - string-width@4.2.0: - resolution: {integrity: sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==} - engines: {node: '>=8'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -2488,6 +2506,12 @@ packages: peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + vue-i18n@11.4.6: + resolution: {integrity: sha512-l0gE7Rfy0phCa5ChKYkOq543Wgd39BCK6hkktfr1Ed4D99oRkgPK9ffShASZdeC8OJxGfdWmpYoAaAH6iLEuIg==} + engines: {node: '>= 22'} + peerDependencies: + vue: ^3.0.0 + vue-metamorph@3.3.4: resolution: {integrity: sha512-WZ1xzHrmYh9UiZ7OC9eG1ASzgSybEB10jhop+k5KzMY9I1JmRKdreqUYzbV3hOnOMvLhyDn7y6f62mLE2jHFSg==} hasBin: true @@ -2867,10 +2891,28 @@ snapshots: dependencies: '@swc/helpers': 0.5.23 + '@intlify/core-base@11.4.6': + dependencies: + '@intlify/devtools-types': 11.4.6 + '@intlify/message-compiler': 11.4.6 + '@intlify/shared': 11.4.6 + + '@intlify/devtools-types@11.4.6': + dependencies: + '@intlify/core-base': 11.4.6 + '@intlify/shared': 11.4.6 + + '@intlify/message-compiler@11.4.6': + dependencies: + '@intlify/shared': 11.4.6 + source-map-js: 1.2.1 + + '@intlify/shared@11.4.6': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: string-width@4.2.0 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.2.0 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 @@ -3226,6 +3268,8 @@ snapshots: '@vue/compiler-dom': 3.5.39 '@vue/shared': 3.5.39 + '@vue/devtools-api@6.6.4': {} + '@vue/devtools-api@7.7.10': dependencies: '@vue/devtools-kit': 7.7.10 @@ -4725,12 +4769,6 @@ snapshots: stdin-discarder@0.3.2: {} - string-width@4.2.0: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -4934,6 +4972,14 @@ snapshots: transitivePeerDependencies: - supports-color + vue-i18n@11.4.6(vue@3.5.39(typescript@6.0.3)): + dependencies: + '@intlify/core-base': 11.4.6 + '@intlify/devtools-types': 11.4.6 + '@intlify/shared': 11.4.6 + '@vue/devtools-api': 6.6.4 + vue: 3.5.39(typescript@6.0.3) + vue-metamorph@3.3.4(eslint@10.6.0(jiti@2.7.0)): dependencies: '@babel/parser': 8.0.0-alpha.12 @@ -4996,7 +5042,7 @@ snapshots: wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 - string-width: 4.2.0 + string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi@8.1.0: diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 6a298ae..71328ab 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,6 +1,7 @@