菜单

本地化与国际化

相关源文件

本文档描述了 Tabby 如何通过其本地化和国际化 (i18n) 系统管理多语言支持。它涵盖了用户界面的翻译过程以及应用程序如何适应不同的语言和区域偏好。

概述

Tabby 在设计之初就考虑了国际化,提供了一个全面的系统,用于将应用程序的用户界面翻译和适应不同的语言和地区。该项目目前支持多种语言,并且有一个活跃的社区致力于扩展和维护这些翻译。

本地化系统基于 Angular 的国际化能力,并结合 NGX-translate 库和 MessageFormat 来处理复杂的翻译模式。翻译存储在 PO 文件(Gettext 格式)中,并通过专门的翻译平台进行管理。

来源:README.md4-6 tabby-core/src/services/locale.service.ts1-5

翻译架构

Tabby 的本地化系统以 LocaleService 为核心,它负责配置和管理整个应用程序的翻译。此服务与 Angular 的内置 locale 系统和 NGX-translate 库协同工作,为组件提供翻译。

来源:tabby-core/src/services/locale.service.ts1-6

关键组件

  1. LocaleService:初始化、配置和管理应用程序范围本地化的核心服务。
  2. TranslateService:由 NGX-translate 提供,负责实际的翻译查找。
  3. MessageFormatCompiler:支持包括复数形式在内的复杂翻译模式。
  4. PO Files:存储每种受支持语言的实际翻译字符串。
  5. Translate Pipe/Directive:在模板中用于标记需要翻译的文本。

来源:tabby-core/src/services/locale.service.ts1-6 locale/zh-CN.po1-14 locale/fr-FR.po1-14

语言加载过程

应用程序启动时,本地化系统遵循以下顺序

  1. 应用程序启动时初始化 LocaleService
  2. 所有支持的语言环境都注册到 Angular
  3. 使用编译器选项配置 TranslateService
  4. 检测用户的首选语言(来自浏览器或之前的设置)
  5. 设置默认语言
  6. 翻译文件按需加载

来源:tabby-core/src/services/locale.service.ts

支持的语言

Tabby 目前支持以下语言

语言代码语言名称
en-US英语 (美国)
en-GB英语(英国)
zh-CN中文(简体)
fr-FR法语
zh-TW中文(繁体)
de-DE德语
ja-JP日语
it-IT意大利语
pl-PL波兰语
hr-HR克罗地亚语
es-ES西班牙语
ru-RU俄语
bg-BG保加利亚语

随着社区成员贡献新的翻译,支持的语言列表持续增长。

来源:locale/zh-CN.po locale/fr-FR.po locale/zh-TW.po locale/de-DE.po locale/ja-JP.po locale/it-IT.po locale/pl-PL.po locale/hr-HR.po locale/es-ES.po locale/ru-RU.po locale/bg-BG.po

翻译管理

Tabby 使用协作翻译平台 (translate.tabby.sh) 来管理翻译。工作流程如下:

  1. 开发人员在源代码中标记需要翻译的字符串
  2. 生成翻译模板(POT 文件)
  3. 模板上传到翻译平台
  4. 翻译人员通过平台提供翻译
  5. 完成的翻译生成为 PO 文件
  6. PO 文件包含在仓库中
  7. 应用程序在运行时加载这些翻译

来源:README.md5

UI 组件中的实现

在 Tabby 代码库中,需要翻译的字符串通过以下方法进行标记

  1. Translate Pipe:用于模板中的文本

  2. Translate Directive:用于元素属性

  3. Programmatic Translation:用于组件中的动态字符串

这确保了所有面向用户的文本都可以本地化为不同的语言。

文档本地化

除了应用程序用户界面,Tabby 还对其文档进行本地化。主 README 文件有多种语言版本:

  • 英语 (README.md)
  • 西班牙语 (README.es-ES.md)
  • 俄语 (README.ru-RU.md)
  • 韩语 (README.ko-KR.md)
  • 中文 (README.zh-CN.md)
  • 意大利语 (README.it-IT.md)
  • 德语 (README.de-DE.md)
  • 日语 (README.ja-JP.md)
  • 印度尼西亚语 (README.id-ID.md)
  • 葡萄牙语 (README.pt-BR.md)
  • 波兰语 (README.pl-PL.md)

这种方法确保了用户可以使用他们首选的语言访问文档。

来源:README.md28-30 .all-contributorsrc1-13

翻译文件格式

Tabby 使用 Gettext PO 格式存储翻译。每种语言在 locale 目录中都有其自己的 PO 文件。以下是这些文件结构的一个示例:

msgid "Original text"
msgstr "Translated text"

例如,来自中文翻译文件:

msgid "{name} copy"
msgstr "{name} 副本"

msgid "A second font family used to display characters missing in the main font"
msgstr "首选字体缺失时使用备选字体显示字符"

这种格式在本地化中广泛使用,并有良好的工具支持。

来源:locale/zh-CN.po20-26

贡献翻译

社区成员可以通过项目翻译平台 translate.tabby.sh 贡献 Tabby 的翻译。流程如下:

  1. 在翻译平台上注册
  2. 选择要处理的语言
  3. 翻译尚未翻译或需要改进的字符串
  4. 提交翻译以供审核
  5. 一旦获得批准,翻译将纳入下一个版本中

这种协作方法使 Tabby 能够通过社区贡献支持多种语言。

来源:README.md5

与 Angular 的技术集成

与 Angular 本地化系统的技术集成包括:

  1. 使用 Angular 的 registerLocaleData() 为每种受支持语言注册 locale 数据
  2. 使用 MessageFormat 编译器配置 TranslateModule 以支持复数形式
  3. 在应用程序级别提供 LocaleService
  4. 在组件中使用翻译管道和指令

这种方法利用了 Angular 的内置国际化能力,并通过 NGX-translate 库对其进行了扩展,以提供更大的灵活性。

来源:tabby-core/src/services/locale.service.ts1-6

开发人员的最佳实践

为 Tabby 开发新功能时,请遵循以下最佳实践以确保正确的本地化

  1. 始终对面向用户的字符串使用翻译键
  2. 避免字符串拼接,以便适应其他语言的不同词序
  3. 使用 MessageFormat 处理复数形式和复杂格式
  4. 必要时为翻译人员提供上下文注释
  5. 在不同语言中测试您的 UI,以确保布局良好
  6. 请记住,文本长度在不同语言之间会有所不同

遵循这些实践将有助于确保为所有用户提供一致且高质量的本地化体验。