From 960657a251b1f19fa81447b9140257eb9a8506be Mon Sep 17 00:00:00 2001 From: root Date: Fri, 24 Jul 2026 08:59:52 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20i18n=20=E8=83=BD?= =?UTF-8?q?=E5=8A=9B=EF=BC=88=E7=8B=AC=E7=AB=8B=20vue-i18n=20=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B=20+=20useLocale=20+=20=E4=B8=AD=E8=8B=B1=20locale?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 src/i18n/(独立实例,中文同步、英文懒加载)+ src/composables/useLocale.js - 抽取所有硬编码中文为 locale 文案(zh-CN/en) - 组件改用 useLocale 直读自身 i18n 实例(嵌入时不走 useI18n 注入) - App.vue 接 :locale prop,watch 同步父项目语言(嵌入 mainPage 时桥接) - 42 项测试全通过,构建正常 --- package-lock.json | 68 ++++++++++++++++++++++++++- package.json | 3 +- src/App.vue | 25 ++++++++-- src/components/DropZone.vue | 12 +++-- src/components/EventDetail.vue | 50 ++++++++++---------- src/components/EventList.vue | 10 ++-- src/components/HeaderBar.vue | 12 +++-- src/components/MonthPreview.vue | 18 +++---- src/components/OccurrenceGrid.vue | 4 +- src/components/WeekPreview.vue | 20 ++++---- src/composables/useLocale.js | 14 ++++++ src/i18n/index.js | 46 ++++++++++++++++++ src/i18n/locales/en.js | 78 +++++++++++++++++++++++++++++++ src/i18n/locales/zh-CN.js | 78 +++++++++++++++++++++++++++++++ src/main.js | 3 +- 15 files changed, 378 insertions(+), 63 deletions(-) create mode 100644 src/composables/useLocale.js create mode 100644 src/i18n/index.js create mode 100644 src/i18n/locales/en.js create mode 100644 src/i18n/locales/zh-CN.js diff --git a/package-lock.json b/package-lock.json index 20ac029..64582a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "version": "0.1.0", "dependencies": { "ical.js": "^2.1.0", - "vue": "^3.5.0" + "vue": "^3.5.0", + "vue-i18n": "^9.13.1" }, "devDependencies": { "@vitejs/plugin-vue": "^5.2.0", @@ -505,6 +506,47 @@ "node": ">=18" } }, + "node_modules/@intlify/core-base": { + "version": "9.14.4", + "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.14.4.tgz", + "integrity": "sha512-vtZCt7NqWhKEtHa3SD/322DlgP5uR9MqWxnE0y8Q0tjDs9H5Lxhss+b5wv8rmuXRoHKLESNgw9d+EN9ybBbj9g==", + "dependencies": { + "@intlify/message-compiler": "9.14.4", + "@intlify/shared": "9.14.4" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.14.4", + "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.14.4.tgz", + "integrity": "sha512-vcyCLiVRN628U38c3PbahrhbbXrckrM9zpy0KZVlDk2Z0OnGwv8uQNNXP3twwGtfLsCf4gu3ci6FMIZnPaqZsw==", + "dependencies": { + "@intlify/shared": "9.14.4", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "9.14.4", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.14.4.tgz", + "integrity": "sha512-P9zv6i1WvMc9qDBWvIgKkymjY2ptIiQ065PjDv7z7fDqH3J/HBRBN5IoiR46r/ujRcU7hCuSIZWvCAFCyuOYZA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -1018,6 +1060,11 @@ "@vue/shared": "3.5.39" } }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" + }, "node_modules/@vue/reactivity": { "version": "3.5.39", "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.39.tgz", @@ -2708,6 +2755,25 @@ } } }, + "node_modules/vue-i18n": { + "version": "9.14.4", + "resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.14.4.tgz", + "integrity": "sha512-B934C8yUyWLT0EMud3DySrwSUJI7ZNiWYsEEz2gknTthqKiG4dzWE/WSa8AzCuSQzwBEv4HtG1jZDhgzPfWSKQ==", + "dependencies": { + "@intlify/core-base": "9.14.4", + "@intlify/shared": "9.14.4", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/why-is-node-running": { "version": "2.3.0", "resolved": "https://registry.npmmirror.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz", diff --git a/package.json b/package.json index a4fd11c..fb56508 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ }, "dependencies": { "ical.js": "^2.1.0", - "vue": "^3.5.0" + "vue": "^3.5.0", + "vue-i18n": "^9.13.1" }, "devDependencies": { "@vitejs/plugin-vue": "^5.2.0", diff --git a/src/App.vue b/src/App.vue index e9f7e04..c1bdd32 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,8 @@