# 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:在 `