# 任务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}" } } ```