2

Angular 的国际化解决方案似乎仍在开发中。同时,它现在正式列在文档中,因此我认为它现在可以在生产应用程序中使用了。

但我无法弄清楚的是,在商业环境中,这个解决方案可以使用什么样的工作流程和工具。

工作流程对我来说很有意义。开发人员将开发应用程序,生成用于翻译的源字符串,并生成一个文件,翻译人员可以将其加载到程序中,以最少的技术专业知识翻译字符串。要生成文件,使用提取器 (xi18n) 获取未翻译的模板 XLIFF,为每种语言复制此文件,然后翻译器使用 XLIFF 编辑器更新模板中的每种语言,因为后来的提取和源字符串的变化。这将类似于 Gettext 方法。这是否也是 Angular 的合适策略,或者翻译文件是否从模板 XLIFF 以其他方式与 Angular 一起更新?

不过对我来说更大的问题是 Angular 如何将 XLIFF 文件拼凑在一起。不幸的是,Angular 将 XLIFF 1.2 和 ICU 结合在一起的方式看起来相当复杂,我还没有找到可以正确处理这个问题的工具。Angular 似乎在翻译单元中使用了 XLIFF 占位符,仅使用文本“ICU”作为 ID,并在 equiv-text 中使用类似 ICU 的模式。然后以某种方式将其与另一个包含随机 ID 和完整 ICU 表达式的翻译单元匹配。还使用 ID 为“INTERPOLATION”的占位符和等效文本中的变量来处理插值。

不仅很难准确地弄清楚 Angular 在内部做了什么来匹配 ICU 表达式,而且在 XLIFF 编辑器中所有这些的结果即使是我这个开发人员也很难理解,更不用说翻译了。在屏幕截图中,可以看到使用 Virtaal XLIFF 编辑器的 ICU 和插值示例。这是从下面的翻译源字符串中产生的,提取到它下面的 XLIFF。你真的不能用占位符做很多事情,你看不到 VAR_PLURAL ICU 翻译和使用它的翻译之间的联系。我看过其他编辑,他们似乎也有类似的问题。

虚拟

角模板:

<ng-container i18n>Example with ICU {randomNumber, plural, =1 {expression} other {expressions}}: {{randomDecimal}}</ng-container>

XLIFF:

  <trans-unit id="698dc3ea0590e8f5f533d296e91d012993eb9b36" datatype="html">
    <source>Example with ICU <x id="ICU" equiv-text="{randomNumber, plural, =1 {...} other {...}}"/>: <x id="INTERPOLATION" equiv-text="{{randomDecimal}}"/></source>
    <context-group purpose="location">
      <context context-type="sourcefile">OMITTED</context>
      <context context-type="linenumber">1</context>
    </context-group>
  </trans-unit>
  <trans-unit id="e3f60ad6a9d907d30e2c51244085d3084d326cbe" datatype="html">
    <source>{VAR_PLURAL, plural, =1 {expression} other {expressions} }</source>
    <context-group purpose="location">
      <context context-type="sourcefile">OMITTED</context>
      <context context-type="linenumber">1</context>
    </context-group>
  </trans-unit>

人们通常使用哪些工具与用于生产用途的 Angular 应用程序一起解决这些问题,以便翻译文件对翻译人员真正有意义?我读过很多人手动编辑文件,但我认为这根本不适合翻译。

4

0 回答 0