# 国际化完整指南
## 📦 已完成的功能
✅ vue-i18n 集成
✅ 模块化语言包管理
✅ 中英文双语支持
✅ 语言切换功能
✅ 持久化存储
✅ Pinia 状态管理
✅ 可复用组件
✅ 完整文档
## 📁 项目结构
```
intelligent-etmf-system-applet/
├── i18n/ # i18n 配置
│ ├── index.js # i18n 初始化
│ └── README.md # 使用文档
├── locales/ # 语言包(按模块分组)
│ ├── common/ # 通用模块
│ │ ├── zh_CN.js # 中文翻译
│ │ └── en_US.js # 英文翻译
│ ├── pages/ # 页面模块
│ │ └── home/ # 首页
│ │ ├── zh_CN.js # 中文翻译
│ │ └── en_US.js # 英文翻译
│ ├── components/ # 组件模块
│ │ └── languageSwitcher/ # 语言切换组件
│ │ ├── zh_CN.js # 中文翻译
│ │ └── en_US.js # 英文翻译
│ ├── index.js # 语言包总导出
│ ├── README.md # 语言包管理文档
│ ├── STRUCTURE.md # 目录结构说明
│ └── COMPONENT_I18N.md # 组件国际化指南
├── store/ # 状态管理
│ └── locale.js # 语言切换 store
├── utils/ # 工具函数
│ └── i18n.js # i18n 工具函数
├── components/ # 组件
│ └── LanguageSwitcher/ # 语言切换组件
│ └── index.vue
└── main.js # 已集成 i18n
```
## 🚀 快速开始
### 1. 在页面中使用国际化
```vue
{{ t('home.title') }}
{{ t('common.button.submit') }}
{{ t('common.greeting', { name: userName }) }}
```
### 2. 在组件中使用国际化
```vue
{{ t('components.userCard.title') }}
{{ t(`components.userCard.status.${user.status}`) }}
```
### 3. 使用语言切换组件
```vue
```
### 4. 在 JS 中使用(非组件环境)
```javascript
import { t } from '@/utils/i18n'
// 在 API 请求中使用
const showError = () => {
uni.showToast({
title: t('common.message.error'),
icon: 'none'
})
}
// 在工具函数中使用
const formatStatus = (status) => {
return t(`order.status.${status}`)
}
```
## 🎨 为组件添加国际化
### 为什么要为组件创建专门的翻译?
- 组件有特定的业务术语
- 组件需要在多处复用
- 便于独立维护和版本管理
### 快速示例
创建 UserCard 组件的翻译:
1. 创建翻译文件:`locales/components/userCard/zh_CN.js` 和 `en_US.js`
2. 在 `locales/index.js` 中注册到 `components` 下
3. 在组件中使用:`t('components.userCard.title')`
**详细指南**:请查看 [组件国际化指南](./locales/COMPONENT_I18N.md)
## 📝 添加新的翻译模块
### 页面模块示例
在对应目录下创建语言文件。例如创建产品管理页面模块:
创建 `locales/pages/product/zh_CN.js`:
```javascript
export default {
title: '产品管理',
list: {
title: '产品列表',
empty: '暂无产品'
},
detail: {
name: '产品名称',
price: '价格',
stock: '库存'
},
action: {
add: '添加产品',
edit: '编辑',
delete: '删除'
}
}
```
创建 `locales/pages/product/en_US.js`:
```javascript
export default {
title: 'Product Management',
list: {
title: 'Product List',
empty: 'No products'
},
detail: {
name: 'Product Name',
price: 'Price',
stock: 'Stock'
},
action: {
add: 'Add Product',
edit: 'Edit',
delete: 'Delete'
}
}
```
### 步骤 2:注册模块
在 `locales/index.js` 中导入新模块:
```javascript
// 导入通用模块
import commonZhCN from './common/zh_CN'
import commonEnUS from './common/en_US'
// 导入页面模块
import homeZhCN from './pages/home/zh_CN'
import homeEnUS from './pages/home/en_US'
import productZhCN from './pages/product/zh_CN' // 新增
import productEnUS from './pages/product/en_US' // 新增
// 导入组件模块
import languageSwitcherZhCN from './components/languageSwitcher/zh_CN'
import languageSwitcherEnUS from './components/languageSwitcher/en_US'
export const messages = {
'zh-CN': {
common: commonZhCN,
home: homeZhCN,
product: productZhCN, // 新增
components: {
languageSwitcher: languageSwitcherZhCN
}
},
'en-US': {
common: commonEnUS,
home: homeEnUS,
product: productEnUS, // 新增
components: {
languageSwitcher: languageSwitcherEnUS
}
}
}
```
**注意**:
- 页面模块直接注册在第一层
- 组件模块注册在 `components` 对象下
### 步骤 3:使用新模块
```vue
{{ t('product.title') }}
{{ t('product.detail.name') }}
```
## 🌍 添加新语言
### 步骤 1:创建语言文件
为每个现有模块创建新语言的翻译文件:
```
locales/
├── common/
│ ├── zh_CN.js
│ ├── en_US.js
│ └── ja_JP.js # 新增日文
└── pages/
└── home/
├── zh_CN.js
├── en_US.js
└── ja_JP.js # 新增日文
```
### 步骤 2:更新配置
在 `locales/index.js` 中:
```javascript
import commonZhCN from './common/zh_CN'
import commonEnUS from './common/en_US'
import commonJaJP from './common/ja_JP' // 新增
import homeZhCN from './pages/home/zh_CN'
import homeEnUS from './pages/home/en_US'
import homeJaJP from './pages/home/ja_JP' // 新增
export const messages = {
'zh-CN': {
common: commonZhCN,
home: homeZhCN
},
'en-US': {
common: commonEnUS,
home: homeEnUS
},
'ja-JP': { // 新增
common: commonJaJP,
home: homeJaJP
}
}
export const localeList = [
{ label: '简体中文', value: 'zh-CN' },
{ label: 'English', value: 'en-US' },
{ label: '日本語', value: 'ja-JP' } // 新增
]
```
## 💡 最佳实践
### 1. 模块划分原则
- **common/**:通用文本(按钮、消息、错误提示等),所有语言文件都在 `locales/common/` 下
- **pages/**:页面模块,每个页面一个子目录(如 `pages/home/`、`pages/user/`),每个子目录下包含各语言版本
- **其他业务模块**:可根据需要创建其他模块目录(如 `api/`、`components/` 等)
**优势**:
- 同一功能的不同语言翻译在同一目录下,便于对比和维护
- 添加新语言只需在每个模块目录下添加新的语言文件
- 模块划分清晰,职责明确
### 2. 命名规范
```javascript
// ✅ 推荐:清晰的层级结构
{
user: {
profile: {
title: '个人资料',
field: {
name: '姓名',
email: '邮箱'
}
}
}
}
// ❌ 不推荐:扁平结构
{
userProfileTitle: '个人资料',
userProfileFieldName: '姓名'
}
```
### 3. 参数化文本
```javascript
// 定义
{
welcome: '欢迎,{name}!',
itemCount: '共 {count} 项'
}
// 使用
t('common.welcome', { name: '张三' })
t('common.itemCount', { count: 10 })
```
### 4. 保持同步
确保同一模块下所有语言文件的翻译键完全一致:
```javascript
// ✅ 正确:locales/pages/user/zh_CN.js 和 locales/pages/user/en_US.js 键名相同
// zh_CN.js
{ user: { name: '姓名' } }
// en_US.js
{ user: { name: 'Name' } }
// ❌ 错误:键名不一致
// zh_CN.js
{ user: { name: '姓名' } }
// en_US.js
{ user: { userName: 'Name' } } // 键名不同!
```
**提示**:建议同时打开同一模块的不同语言文件进行对比编辑
## 🔧 API 参考
### useLocaleStore
```javascript
const localeStore = useLocaleStore()
// 状态
localeStore.currentLocale // 当前语言:'zh-CN' | 'en-US'
localeStore.availableLocales // 可用语言列表
// 方法
localeStore.setLocale('en-US') // 切换到指定语言
localeStore.toggleLocale() // 切换到下一个语言
localeStore.getCurrentLocaleName() // 获取当前语言显示名称
```
### useI18n
```javascript
const { t, locale, te } = useI18n()
t('home.title') // 翻译文本
t('common.greeting', { name: 'John' }) // 带参数翻译
locale.value // 当前语言
te('home.title') // 检查键是否存在
```
### 工具函数
```javascript
import { t, getLocale, setLocale, hasKey } from '@/utils/i18n'
t('home.title') // 翻译文本
getLocale() // 获取当前语言
setLocale('en-US') // 设置语言
hasKey('home.title') // 检查键是否存在
```
## 🐛 常见问题
### 问题 1:翻译不生效
**原因**:翻译键不存在或拼写错误
**解决**:
1. 检查翻译键是否正确
2. 确认模块是否正确导入
3. 使用浏览器开发工具查看警告信息
### 问题 2:语言切换后页面未更新
**原因**:使用了非响应式的方式获取翻译
**解决**:
```javascript
// ❌ 错误:在 setup 外部获取
const title = t('home.title')
// ✅ 正确:在模板中使用或使用 computed
{{ t('home.title') }}
// 或
const title = computed(() => t('home.title'))
```
### 问题 3:小程序环境报错
**原因**:i18n 配置不兼容
**解决**:确保使用以下配置
```javascript
createI18n({
legacy: false, // 必须:使用 Composition API
globalInjection: true, // 必须:全局注入
// ...
})
```
## 📚 相关文档
- [i18n 使用指南](./i18n/README.md)
- [语言包管理](./locales/README.md)
- [目录结构说明](./locales/STRUCTURE.md)
- [组件国际化指南](./locales/COMPONENT_I18N.md)
- [Vue I18n 官方文档](https://vue-i18n.intlify.dev/)
## 🎯 TODO
- [ ] 添加更多语言支持(日语、韩语等)
- [ ] 实现语言包懒加载优化
- [ ] 添加翻译缺失检测工具
- [ ] 集成在线翻译服务
## 📞 联系方式
如有问题或建议,请联系项目维护者。