---
name: i18n-guide
description: Guide for internationalization development in Mobazha including translation key naming, adding new languages, parameter interpolation, and locale-specific formatting. Use when adding translations, creating i18n keys, or working with multi-language features, "国际化", "多语言", "翻译", "i18n", "本地化", "添加翻译".
---
# 国际化开发指南
Mobazha 项目的多语言开发规范,支持 9 种语言。
## 技术架构
```
packages/core/i18n/
├── i18n.ts # 核心实现:getTranslation(), setLocale(), formatDate()
├── types.ts # TranslationKey, TranslationParams 类型
├── index.ts # 统一导出
└── locales/
├── en.ts # 英语(主语言,所有 key 必须先在此定义)
├── zh.ts # 中文
├── ja.ts # 日语
├── ko.ts # 韩语
├── es.ts # 西班牙语
├── fr.ts # 法语
├── de.ts # 德语
├── ru.ts # 俄语
├── pt.ts # 葡萄牙语
└── index.ts # 统一导出
```
## 使用方式
### useI18n Hook
```typescript
import { useI18n } from '@mobazha/core';
function MyComponent() {
const { t, locale, setLocale, formatDate, formatNumber } = useI18n();
return (
{t('order.title')}
{t('order.itemCount', { count: 5 })}
{formatDate(new Date())}
{formatNumber(1234.56)}
);
}
```
### 参数插值
使用 `{{参数名}}` 语法:
```typescript
// en.ts
order: {
itemCount: '{{count}} items in your order',
greeting: 'Hello, {{name}}!',
}
// 使用
t('order.itemCount', { count: 3 }) // "3 items in your order"
t('order.greeting', { name: 'Alice' }) // "Hello, Alice!"
```
## 翻译 Key 命名规范
### 层级结构
```
模块.功能.描述
```
### 命名规则
| 规则 | 示例 | 说明 |
| -------- | ------------------------------------------------- | ------------------ |
| 模块名 | `order`, `wallet`, `settings`, `chat` | 对应功能模块 |
| 通用词汇 | `common.loading`, `common.error`, `common.cancel` | `common` 前缀 |
| 导航 | `nav.home`, `nav.orders`, `nav.wallet` | `nav` 前缀 |
| 按钮 | `order.submit`, `cart.checkout` | 动词形式 |
| 标题 | `settings.general.title` | `title` 后缀 |
| 占位符 | `search.placeholder` | `placeholder` 后缀 |
| 错误消息 | `order.error.notFound` | `error` 层级 |
| 状态 | `order.status.completed` | `status` 层级 |
### 示例对照
```typescript
// ✅ 好的命名
'common.loading'; // 通用加载
'common.noItems'; // 通用空状态
'order.status.completed'; // 订单状态
'wallet.send.confirm'; // 钱包发送确认
'settings.general.language'; // 设置-通用-语言
'product.price.from'; // 商品价格起始
// ❌ 差的命名
'loading'; // 缺少模块前缀
'orderCompleted'; // 没有用点分隔
'settings_language'; // 用了下划线而不是点
'btn_submit'; // 不要用缩写前缀
```
## 添加新翻译的流程
### 第一步:在 en.ts 中添加
```typescript
// packages/core/i18n/locales/en.ts
export const en = {
// ... 已有内容
shipping: {
// ... 已有内容
newFeature: {
title: 'New Feature Title',
description: 'Description of the new feature',
},
},
};
```
### 第二步:更新类型(自动推断)
如果 `TranslationKey` 是从 `en.ts` 自动推断的,无需手动更新类型。
否则需要在 `types.ts` 中添加新 key。
### 第三步:添加其他语言
```typescript
// packages/core/i18n/locales/zh.ts
shipping: {
newFeature: {
title: '新功能标题',
description: '新功能描述',
},
},
```
**优先级**:先完成 `en.ts` 和 `zh.ts`,其他语言可后续补充。
## 特殊场景处理
### 日期格式化
```typescript
const { formatDate } = useI18n();
// 使用 locale-aware 格式化
formatDate(new Date('2024-01-15'));
// en: "January 15, 2024"
// zh: "2024年1月15日"
```
### 数字格式化
```typescript
const { formatNumber } = useI18n();
formatNumber(1234567.89);
// en: "1,234,567.89"
// de: "1.234.567,89"
```
### 货币金额
**不要**用 i18n 处理货币,使用 `useCurrency()` hook:
```typescript
import { useCurrency } from '@mobazha/core';
const { formatPrice, renderPairedPrice } = useCurrency();
formatPrice(amount, 'BTC'); // 正确的货币格式化
```
### 条件文本
```typescript
// ❌ 禁止用语言判断
{
lang === 'zh' ? '中文文本' : 'English text';
}
// ✅ 用同一个 key,不同 locale 文件提供不同翻译
{
t('feature.description');
}
```
## 快速检查清单
- [ ] 新增的用户可见文本是否都使用了 `t()` ?
- [ ] 翻译 key 是否遵循 `模块.功能.描述` 格式?
- [ ] 是否在 `en.ts` 中先添加了新 key?
- [ ] 动态内容是否使用 `{{参数}}` 插值?
- [ ] 货币金额是否使用 `useCurrency()` 而非 `t()`?
- [ ] 日期是否使用 `formatDate()` 而非硬编码格式?
## 相关功能文档
- **[国际化系统](../../docs/features/i18n.md)** — useI18n 完整 API、9 种语言列表、翻译键结构、新语言添加流程