installerbuilder/tasks/task24-国际化支持.md

255 lines
7.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 任务24国际化支持
## 任务描述
实现国际化支持,用于支持多语言界面和消息,使工具能够适应不同语言环境的用户。国际化支持将包括消息翻译、日期和时间格式化、数字格式化等功能,以及支持动态切换语言。
## 实现步骤
1. 定义国际化接口:
- 在`internal/i18n`包中创建`localizer.go`文件
- 定义Localizer接口
```go
type Localizer interface {
// Localize 本地化消息
Localize(key string, args map[string]interface{}) string
// SetLocale 设置当前语言环境
SetLocale(locale string) error
// GetLocale 获取当前语言环境
GetLocale() string
// GetAvailableLocales 获取可用的语言环境
GetAvailableLocales() []string
// FormatDate 格式化日期
FormatDate(date time.Time, format string) string
// FormatNumber 格式化数字
FormatNumber(number float64, format string) string
// FormatCurrency 格式化货币
FormatCurrency(amount float64, currency string) string
}
```
- 定义LocaleInfo结构体
```go
type LocaleInfo struct {
Code string // 语言代码 (如 "en-US", "zh-CN")
Name string // 语言名称 (如 "English (US)", "简体中文")
Direction string // 文本方向 (如 "ltr", "rtl")
Percentage int // 翻译完成百分比
}
```
2. 创建默认本地化器:
- 创建`default_localizer.go`文件
- 定义DefaultLocalizer结构体实现Localizer接口
```go
type DefaultLocalizer struct {
currentLocale string
messages map[string]map[string]string
fallbackLocale string
dateFormats map[string]map[string]string
numberFormats map[string]map[string]string
logger log.Logger
resourceMgr resource.ResourceManager
}
```
- 实现构造函数:
```go
func NewDefaultLocalizer(fallbackLocale string, logger log.Logger, resourceMgr resource.ResourceManager) (*DefaultLocalizer, error) {
localizer := &DefaultLocalizer{
currentLocale: fallbackLocale,
messages: make(map[string]map[string]string),
fallbackLocale: fallbackLocale,
dateFormats: make(map[string]map[string]string),
numberFormats: make(map[string]map[string]string),
logger: logger,
resourceMgr: resourceMgr,
}
// 加载内置翻译
if err := localizer.loadBuiltinTranslations(); err != nil {
return nil, err
}
return localizer, nil
}
```
3. 实现翻译加载:
- 创建loadBuiltinTranslations方法加载内置翻译
- 创建loadTranslationFile方法加载翻译文件
- 支持YAML和JSON格式的翻译文件
- 支持动态加载翻译
4. 实现消息本地化:
- 实现Localize方法本地化消息
- 支持变量替换
- 支持复数形式
- 支持回退到默认语言
5. 实现日期和时间格式化:
- 实现FormatDate方法格式化日期
- 支持不同的日期格式
- 支持本地化的月份和星期名称
- 支持不同的时区
6. 实现数字和货币格式化:
- 实现FormatNumber方法格式化数字
- 实现FormatCurrency方法格式化货币
- 支持不同的数字格式
- 支持不同的货币符号和位置
7. 实现语言环境管理:
- 实现SetLocale方法设置当前语言环境
- 实现GetLocale方法获取当前语言环境
- 实现GetAvailableLocales方法获取可用的语言环境
- 支持语言环境检测
8. 实现翻译工具:
- 创建翻译提取工具,从代码中提取需要翻译的字符串
- 创建翻译文件生成工具,生成翻译文件模板
- 创建翻译文件合并工具,合并新旧翻译文件
- 创建翻译完成度检查工具,检查翻译完成度
## 单元测试要求
1. 测试本地化器初始化:
- 验证构造函数
- 测试内置翻译加载
- 测试默认语言设置
- 测试错误处理
2. 测试翻译加载:
- 验证loadBuiltinTranslations方法
- 测试loadTranslationFile方法
- 测试不同格式的翻译文件
- 测试动态加载翻译
3. 测试消息本地化:
- 验证Localize方法
- 测试变量替换
- 测试复数形式
- 测试回退机制
4. 测试日期和时间格式化:
- 验证FormatDate方法
- 测试不同的日期格式
- 测试本地化的月份和星期名称
- 测试不同的时区
5. 测试数字和货币格式化:
- 验证FormatNumber方法
- 测试FormatCurrency方法
- 测试不同的数字格式
- 测试不同的货币符号和位置
6. 测试语言环境管理:
- 验证SetLocale方法
- 测试GetLocale方法
- 测试GetAvailableLocales方法
- 测试语言环境检测
7. 测试翻译工具:
- 验证翻译提取工具
- 测试翻译文件生成工具
- 测试翻译文件合并工具
- 测试翻译完成度检查工具
## 依赖关系
- 依赖任务01项目初始化
- 依赖任务02日志系统实现
- 依赖任务03错误处理框架
- 依赖任务04资源管理器实现
- 被任务20命令行界面依赖
## 完成标准
1. Localizer接口已定义并文档完善
2. DefaultLocalizer实现了所有接口方法
3. 翻译加载功能正常工作
4. 消息本地化功能正常工作
5. 日期和时间格式化功能正常工作
6. 数字和货币格式化功能正常工作
7. 语言环境管理功能正常工作
8. 翻译工具功能正常工作
9. 所有单元测试通过
10. 代码符合项目的Go语言开发规范
11. 支持至少以下语言:英语、简体中文、日语、德语、西班牙语
12. 支持所有需求文档中的国际化相关功能
## 支持的语言
1. 英语 (en-US) - 默认语言
2. 简体中文 (zh-CN)
3. 日语 (ja-JP)
4. 德语 (de-DE)
5. 西班牙语 (es-ES)
## 翻译文件示例
### YAML格式
```yaml
# en-US.yaml
locale:
code: en-US
name: English (US)
direction: ltr
messages:
welcome: Welcome to InstallerBuilder
build_success: Build completed successfully in {duration}
build_failed: Build failed: {error}
file_not_found: File not found: {path}
# 复数形式
files_processed:
one: "{count} file processed"
other: "{count} files processed"
date_formats:
short: "MM/DD/YYYY"
medium: "MMM D, YYYY"
long: "MMMM D, YYYY"
number_formats:
decimal: "{number, number, #,##0.##}"
percent: "{number, number, #,##0.##}%"
currency: "${number, number, #,##0.00}"
```
### JSON格式
```json
{
"locale": {
"code": "zh-CN",
"name": "简体中文",
"direction": "ltr"
},
"messages": {
"welcome": "欢迎使用安装包构建工具",
"build_success": "构建成功完成,耗时 {duration}",
"build_failed": "构建失败:{error}",
"file_not_found": "找不到文件:{path}",
"files_processed": {
"one": "处理了 {count} 个文件",
"other": "处理了 {count} 个文件"
}
},
"date_formats": {
"short": "YYYY/MM/DD",
"medium": "YYYY年M月D日",
"long": "YYYY年M月D日 dddd"
},
"number_formats": {
"decimal": "{number, number, #,##0.##}",
"percent": "{number, number, #,##0.##}%",
"currency": "¥{number, number, #,##0.00}"
}
}
```