在angular i18n文档中,recommended设置唯一的自定义ID。但我无法理解如何使用它们。
我知道在更新源语言时,ID可用于防止翻译更改。这些ID应该是唯一的。当提取器找到重复的ID时,它只保留第一个 但我的应用程序中有很多重复。我应该对所有重复的句子使用相同的ID吗?我不应该使用ID作为论文吗?我应该为所有人使用不同的ID,并分别翻译每个事件吗?
我想更好的解决方案是不对重复内容使用ID,并保留生成的ID。但是如果我有一个独特的句子,并且我的应用程序发生了变化,那么这句话就不再是唯一的,我将不得不删除这个ID并再次翻译它,对吧?我必须要小心什么是独特的,什么不是。看起来好吗?
答案 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
这是示例在本地化工具中的外观。