我"official" way to facilitate I18N in Angular看起来很复杂:
i18n模板翻译流程分为四个阶段:
在组件模板中标记静态文本消息以进行翻译。
有角度的i18n工具将标记的消息提取到行业标准翻译源文件中。
翻译人员编辑该文件,将提取的短信翻译成目标语言,并将文件返回给您。
- 醇>
Angular编译器导入已完成的翻译文件,用翻译的文本替换原始消息,并生成一个 目标语言中应用程序的新版本。
您需要为其构建和部署单独版本的应用程序 每种支持的语言。
提到了一些怪癖:
A)
翻译复数和选择信息有点棘手。
对于复数和选择翻译单元,标签为空 这使得它们很难与原始模板相关联。该 XLIFF格式尚不支持ICU规则;很快就会。
b)中
翻译文件维护和ID更改
随着应用程序的发展,您将更改i18n标记并重新运行 ng-xi18n提取工具多次。您添加的新标记 不是问题;但对现有标记触发的大多数更改 为受影响的翻译单位生成新的ID。
ID更改后,翻译文件不再同步。所有 应用程序的翻译版本将在失败期间失败 重新编译。错误消息标识no的旧ID 更长的有效但他们不会告诉你新的ID应该是什么。
将所有翻译消息文件提交给源代码控制,尤其是 英文源message.xlf。旧与的区别 新的messages.xlf文件可帮助您查找和更新您的ID更改 翻译文件。
人工翻译可能需要一些上下文信息才能翻译文本。因此,如果要提供含义和说明,可以在模板中使用以下语法。这些工具会将它传播到提供给翻译者的文件中。
<img [src]="logo" i18n-title="<meaning>|<description>" title="Angular 2 logo" />
我认为这种语法会使标记膨胀很多。
所以,考虑到它的复杂性和怪癖,我想知道为什么你会选择这种方法?为什么不简单地为每种语言设置一个JSON文件,将(通常是稳定的)键映射到文本,将其作为JavaScript对象加载并绑定到模板中的键?可以在附加文件中轻松提供这些键的含义和描述。顺便说一句,按语言特定的文本文件中的键访问文本是how it is done in Java。