如何使用有角度的i18n自定义ID

时间:2017-08-04 08:00:54

标签: angular internationalization

在angular i18n文档中,recommended设置唯一的自定义ID。但我无法理解如何使用它们。

我知道在更新源语言时,ID可用于防止翻译更改。这些ID应该是唯一的。当提取器找到重复的ID时,它只保留第一个 但我的应用程序中有很多重复。我应该对所有重复的句子使用相同的ID吗?我不应该使用ID作为论文吗?我应该为所有人使用不同的ID,并分别翻译每个事件吗?

我想更好的解决方案是不对重复内容使用ID,并保留生成的ID。但是如果我有一个独特的句子,并且我的应用程序发生了变化,那么这句话就不再是唯一的,我将不得不删除这个ID并再次翻译它,对吧?我必须要小心什么是独特的,什么不是。看起来好吗?

2 个答案:

答案 0 :(得分:3)

好吧,我只使用自定义ID,以防你需要有一个字符串的更多(不同)翻译。文档建议使用它们,以防您需要更多的人文易读性和一些翻译环境。如果您使用工具管理翻译,我不会过于担心维护(例如xliffmerge)。

xi18n工具已经进行了字符串相等匹配,因此如果它找到更多相等的字符串,则会将它们填充到单个<trans-unit>下。您可以为此单元提供(目标)翻译的字符串,它将用于代替所有源字符串。在本地化工具的多次运行之间,ID不应该更改,因为它们基于字符串本身的内容。

所以我的建议是不要担心ID并重复使用太多。如果您只编写字符串,它们将匹配在一起,并且所有字符串的翻译将保持相同。如果您使用自定义ID,则必须记住使用它们并手动维护其翻译。

源字符串发生变化的情况(当然)是您必须要处理的事情。

为了完整起见,让我们进行一个简单的案例研究: 我们假设您的应用中有两个相同的字符串,必须具有相同的翻译。您运行xi18n,生成messages.xlf,将其合并到已翻译的文件中(例如messages.cs.xlf),翻译<trans-unit>并构建和部署您的应用。 现在,有人来,并希望你改变其中一个字符串。这里可能发生两种情况 - 源字符串必须更改(并重新翻译),或者只需要更改翻译(源字符串保持不变)。 在第一种情况下,您转到代码,更新源字符串并再次运行本地化过程。将创建一个新的<trans-unit> - 您提供新的翻译,构建应用程序,您就完成了。 在第二种情况下,您转到代码并将自定义ID(也建议使用描述和含义)打到必须具有新转换的字符串上。您运行本地化过程 - 将生成一个新的<trans-unit>(带有自定义ID)。您可以在习惯,构建和部署时进行翻译。

答案 1 :(得分:1)

提取工具将同一字符串的两个实例映射到单个资源项中。这具有优点和缺点。它使您可以将重复的字符串保留为最少,但同时在两个或多个上下文中使用相同的字符串也可能很危险。这就是为什么使用自定义ID可以更好地控制提取的原因。不幸的是,自定义ID必须唯一,才能正常工作。如果两次使用相同的自定义ID,即使字符串值不同,也会忽略第二个字符串。

由于这些问题,我们采取了不同的方法。我们为每个i18n属性添加一个含义值。然后,我们告诉我们的本地化工具将位置上下文(也提取到具有含义和ID值的XLIFF中)与含义值相结合以获得唯一的上下文。即使我们修复字符串中的错字,上下文也不会改变。同样,含义值仅需要在文件中唯一,而在应用程序的所有其他ID /含义中则应唯一。

这是一个样本

<h1 i18n="header|">Plural Sample</h1>

提取后得到

<unit id="1835493080467832141">
  <notes>
    <note category="meaning">header</note>
    <note category="location">app/app.component.ts:2</note>
  </notes>
  <segment>
    <source>Plural Sample</source>
  </segment>
</unit>

它具有含义和位置属性。我们使用的Soluling本地化工具将这两者结合起来以获得上下文:

messages.xlf.app\app.component.ts.header

这是固定的,只要我们不重命名源代码文件或更改含义值即可。我们可以自由地修改字符串值。此外,上下文值比生成的ID更具描述性:

1835493080467832141

这是示例在本地化工具中的外观。

enter image description here