# UniApp 主应用国际化(i18n)实现计划 > **面向 AI 代理的工作者:** 必需子技能:使用 superpowers:subagent-driven-development(推荐)或 superpowers:executing-plans 逐任务实现此计划。步骤使用复选框(`- [ ]`)语法来跟踪进度。 **目标:** 为 UniApp 主应用引入 vue-i18n 国际化体系,支持 9 种语言,将所有硬编码中文 UI 文本替换为 `$t()` / `t()` 调用。 **架构:** 集中式翻译文件方案,所有翻译键值对按语言分文件存放于 `src/locales/`,通过 vue-i18n 实例注入 Vue 应用。领域术语保留中文原词不纳入翻译体系。 **技术栈:** vue-i18n@9, Vue 3 Composition API, UniApp, Vitest **设计规格:** `docs/superpowers/specs/2026-04-28-uniapp-i18n-design.md` --- ## 整体架构流程 ```mermaid graph TD A[用户启动 App] --> B{localStorage 有 preferred-locale?} B -->|是| C[读取存储的 locale] B -->|否| D{读取系统语言} D -->|匹配支持语言| E[使用系统语言] D -->|不匹配| F[回退 zh-CN] C --> G[应用 vue-i18n locale] E --> G F --> G G --> H[渲染页面 - $t 替换硬编码文本] H --> I{用户切换系统语言?} I -->|是| J[重启 App 重新检测] I -->|否| H ``` ## 组件改造流程 ```mermaid graph LR subgraph 改造前 A1[模板硬编码中文] --> B1[Script 硬编码中文] B1 --> C1[pages.json 硬编码中文] end subgraph 改造后 A2["模板: {{ $t('key') }}"] --> B2["Script: const { t } = useI18n(); t('key')"] B2 --> C2["onShow: uni.setNavigationBarTitle"] end A1 -.->|替换| A2 B1 -.->|替换| B2 C1 -.->|运行时覆盖| C2 ``` ## Phase 依赖关系 ```mermaid graph TD P1["Phase 1: 基础设施
安装 vue-i18n + 创建核心模块"] --> P2["Phase 2: 翻译文件
创建 9 种语言翻译"] P2 --> P3["Phase 3: 页面改造
3 个页面 + pages.json"] P2 --> P4["Phase 4: 组件改造
10 个组件"] P3 --> P5["Phase 5: 测试与验证
完整性 + 组件 + E2E"] P4 --> P5 ``` --- ## 文件结构 ### 新建文件 | 文件路径 | 职责 | |---------|------| | `src/locales/index.ts` | vue-i18n 实例创建、语言检测/切换/持久化 | | `src/locales/zh-CN.ts` | 简体中文翻译(主翻译源) | | `src/locales/zh-TW.ts` | 繁體中文翻译 | | `src/locales/en.ts` | English 翻译 | | `src/locales/ja.ts` | 日本語翻译 | | `src/locales/ko.ts` | 한국어 翻译 | | `src/locales/de.ts` | Deutsch 翻译 | | `src/locales/fr.ts` | Français 翻译 | | `src/locales/es.ts` | Español 翻译 | | `src/locales/pt.ts` | Português 翻译 | | `src/locales/__tests__/completeness.test.ts` | 翻译完整性校验测试 | | `src/locales/__tests__/interpolation.test.ts` | 插值格式校验测试 | ### 修改文件 | 文件路径 | 改动说明 | |---------|---------| | `package.json` | 添加 vue-i18n 依赖 | | `src/main.ts` | 挂载 i18n 实例 | | `src/pages/almanac-search/index.vue` | 替换硬编码中文为 `$t()` / `t()` | | `src/pages/ziwei/index.vue` | 替换硬编码中文为 `$t()` / `t()` | | `src/pages/fortune/index.vue` | 替换硬编码中文为 `$t()` / `t()` | | `src/components/BottomNavigation/BottomNavigation.vue` | 替换硬编码中文 | | `src/components/EmptyState/index.vue` | 移除中文默认值 | | `src/components/SearchConditionPanel/index.vue` | 替换硬编码中文 | | `src/components/SearchConditionItem/index.vue` | 替换硬编码中文(领域术语保留) | | `src/components/SearchResultList/index.vue` | 替换硬编码中文 | | `src/components/SearchResultCard/index.vue` | 替换硬编码中文 | | `src/components/SortSwitcher/index.vue` | 替换硬编码中文 | | `src/components/ExportPanel/index.vue` | 替换硬编码中文 | | `src/components/SearchHistoryPanel/index.vue` | 替换硬编码中文 | | `src/components/TemplatePanel/index.vue` | 替换硬编码中文 | --- ## Phase 1:基础设施 — 安装 vue-i18n + 创建核心模块 **文件:** - 修改:`package.json` - 创建:`src/locales/index.ts` - 创建:`src/locales/zh-CN.ts` - 修改:`src/main.ts` ### 任务 1.1:安装 vue-i18n 依赖 - [ ] **步骤 1:安装 vue-i18n** 运行:`cd everything-is-suitable-uniapp && npm install vue-i18n@9` 预期:`package.json` 中出现 `"vue-i18n": "^9.x.x"` 依赖 - [ ] **步骤 2:验证安装** 运行:`cd everything-is-suitable-uniapp && node -e "const v = require('vue-i18n/package.json'); console.log(v.version)"` 预期:输出 `9.x.x` 版本号 - [ ] **步骤 3:Commit** `cd everything-is-suitable-uniapp && git add package.json package-lock.json && git commit -m "chore: 安装 vue-i18n@9 依赖"` ### 任务 1.2:创建 zh-CN 主翻译源文件 - [ ] **步骤 1:创建 `src/locales/zh-CN.ts`** — 包含 common/nav/almanac/ziwei/fortune/search/template/export/history 共 9 个命名空间,约 80 个翻译键 - [ ] **步骤 2:Commit** `cd everything-is-suitable-uniapp && git add src/locales/zh-CN.ts && git commit -m "feat(i18n): 创建简体中文主翻译源 zh-CN.ts"` ### 任务 1.3:创建 locales/index.ts 核心模块 - [ ] **步骤 1:创建 `src/locales/index.ts`** — 包含 createI18n 实例、detectLocale 语言检测、setLocale 切换持久化、getLocale 获取当前语言、SUPPORTED_LOCALES 常量、localeNames 映射 - [ ] **步骤 2:Commit** `cd everything-is-suitable-uniapp && git add src/locales/index.ts && git commit -m "feat(i18n): 创建 vue-i18n 实例与语言检测/切换核心模块"` ### 任务 1.4:改造 main.ts 挂载 i18n - [ ] **步骤 1:修改 `src/main.ts`** — 添加 `import { i18n } from './locales'` 和 `app.use(i18n)` - [ ] **步骤 2:验证构建无报错** 运行:`cd everything-is-suitable-uniapp && npx vite build --mode development 2>&1 | head -20` 预期:构建成功,无模块解析错误 - [ ] **步骤 3:Commit** `cd everything-is-suitable-uniapp && git add src/main.ts && git commit -m "feat(i18n): 在 main.ts 中挂载 vue-i18n 实例"` --- ## Phase 2:翻译文件 — 创建 8 种非中文翻译 **依赖:** Phase 1 每个任务结构相同:创建翻译文件 → Commit。翻译键结构必须与 zh-CN.ts 完全一致。 ### 任务 2.1:创建繁體中文翻译 zh-TW.ts - [ ] **步骤 1:创建 `src/locales/zh-TW.ts`** — 简转繁,保持相同键结构 - [ ] **步骤 2:Commit** ### 任务 2.2:创建英文翻译 en.ts - [ ] **步骤 1:创建 `src/locales/en.ts`** — 领域术语保留拼音(如 Zi Wei Dou Shu) - [ ] **步骤 2:Commit** ### 任务 2.3:创建日文翻译 ja.ts - [ ] **步骤 1:创建 `src/locales/ja.ts`** — 命理术语保留汉字(如 紫微斗数、三方四正) - [ ] **步骤 2:Commit** ### 任务 2.4:创建韩文翻译 ko.ts - [ ] **步骤 1:创建 `src/locales/ko.ts`** — 命理术语保留汉字(如 자미두수) - [ ] **步骤 2:Commit** ### 任务 2.5:创建德文翻译 de.ts - [ ] **步骤 1:创建 `src/locales/de.ts`** — 领域术语保留拼音 - [ ] **步骤 2:Commit** ### 任务 2.6:创建法文翻译 fr.ts - [ ] **步骤 1:创建 `src/locales/fr.ts`** — 领域术语保留拼音 - [ ] **步骤 2:Commit** ### 任务 2.7:创建西班牙文翻译 es.ts - [ ] **步骤 1:创建 `src/locales/es.ts`** — 领域术语保留拼音 - [ ] **步骤 2:Commit** ### 任务 2.8:创建葡萄牙文翻译 pt.ts - [ ] **步骤 1:创建 `src/locales/pt.ts`** — 领域术语保留拼音 - [ ] **步骤 2:Commit** --- ## Phase 3:页面改造 — 3 个页面 + pages.json **依赖:** Phase 1, Phase 2 ```mermaid graph TD P3A["任务 3.1: almanac-search"] --> P3D["任务 3.4: pages.json 确认"] P3B["任务 3.2: ziwei"] --> P3D P3C["任务 3.3: fortune"] --> P3D ``` ### 任务 3.1:改造黄历搜索页 almanac-search/index.vue **文件:** 修改 `src/pages/almanac-search/index.vue` - [ ] **步骤 1:在 `