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

7.4 KiB
Raw Permalink Blame History

任务24国际化支持

任务描述

实现国际化支持,用于支持多语言界面和消息,使工具能够适应不同语言环境的用户。国际化支持将包括消息翻译、日期和时间格式化、数字格式化等功能,以及支持动态切换语言。

实现步骤

  1. 定义国际化接口:

    • internal/i18n包中创建localizer.go文件
    • 定义Localizer接口
      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结构体
      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接口
      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
      }
      
    • 实现构造函数:
      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格式

# 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格式

{
  "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}"
  }
}