Eri*_*ric 11 internationalization angular
我正在使用这里记录的对Angular2(4.0.3)的i18n支持.我已经生成了xlf文件,一切都很愉快.
但是,假设我有一个链接到我的主页的菜单按钮.我使用属性创建DOM节点i18n="@@homeTitle".现在,在我的主页组件中,我想在我的标签中使用相同的翻译ID<h1>,这样我就可以获得相同的翻译,而无需在文件中维护具有相同内容的多个条目xlf.
我曾希望做类似下面的事情,并让它自动填充我的<a>节点与适当的翻译.
// home.component.html
<h1 i18n="@@homeTitle">Home</h1>
// menu.component.html
<a routerLink="/" i18n="@@homeTitle"></a>
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.该<a>节点显示了空的文本,而不是翻译的目标.(此外,默认情况下,自动生成的messages.xlf文件中没有转换目标.)
文档实际上提到了这种情况,但没有提供解决方案.这个问题也被GitHub上的用户称为星期一和取消等常见字符串,但该问题线程并未涵盖此特定问题的解决方案.
如何xlf跨多个节点重用我的文件中定义的i18n翻译?
编辑:这是xlf通过使用生成ng-xi18n --i18nFormat=xlf:
<?xml version="1.0" encoding="UTF-8" ?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="ng2.template">
<body>
<trans-unit id="homeTitle" datatype="html">
<source>Home</source>
<target/>
</trans-unit>
</body>
</file>
</xliff>
Run Code Online (Sandbox Code Playgroud)
如果@@homeTitle切换两个节点的解析顺序,则<source>分别改变.
TLDR ; 只需不要担心自定义 ID 并正确编写您的字符串。该ng xi18n工具将负责匹配单个<trans-unit>. 然后您的翻译将应用于整个单元。
更长的解释:该xi18n工具通过字符串相等来匹配应用程序中的字符串。每当它找到一个新字符串时,它就会将它与已经找到的字符串进行比较。如果存在完全匹配,则它将新字符串包含在现有<trans-unit>. 如果没有,它会创建一个新 ID 并生成一个新 ID。
但是,可以通过使用自定义 ID 和翻译提示来更改此行为。如果找到新字符串并包含自定义 ID,则将针对此特定 ID 检查当前消息并分配给现有消息<trans-group>(如果找到)。请注意,此过程不考虑字符串本身,因此任何非空值都将合并到<trans-group>具有自定义 ID的 found 中。省略空字符串。
正如文档中提到的,只有具有自定义 ID 的第一个元素才会被检查源字符串。当有第二个具有相同 ID 的元素时,它的字符串值将不会被解析。这意味着您可以更改您的解决方案,让所有其他具有您的自定义 ID 的节点都包含一个占位符字符串。本地化将按您的预期工作。
// home.component.html
<h1 i18n="@@homeTitle">Home</h1>
// menu.component.html
<a routerLink="/" i18n="@@homeTitle">ANY PLACEHOLDER STRING YOU WANT</a>
Run Code Online (Sandbox Code Playgroud)
如您所见,这看起来并不特别。此外,您必须记住自定义 ID 以便进一步重用。我建议不要这样做,除非绝对必要。在我看来,只写字符串(在您的情况下"Home")更容易,将i18n属性贴在元素上并且不用担心重用,因为它会自动完成。我会使用自定义 ID,主要是在您需要对一个字符串进行多个不同(上下文)翻译的情况下。
| 归档时间: |
|
| 查看次数: |
2188 次 |
| 最近记录: |