2017-08-16 44 views
11

我使用的国际化支持Angular2(4.0.3)记录here。我已经生成了xlf文件,并且一切都很顺利。如何在Angular中重用i18n翻译密钥?

但是,让我们说,我有一个菜单按钮链接到我的主页。我使用属性i18n="@@homeTitle"创建DOM节点。现在,在我的主页组件,我想用相同的转换ID在我<h1>标签,让我得到相同的转换,而不必维持与xlf文件中的内容相同的多个条目。

我希望做这样的事情的下方,有它的自动填充我<a>节点与适当的翻译。

// home.component.html 
<h1 i18n="@@homeTitle">Home</h1> 

// menu.component.html 
<a routerLink="/" i18n="@@homeTitle"></a> 

但是,这是行不通的。节点<a>显示为空文本,而不是翻译目标。 (此外,默认情况下,在自动生成的messages.xlf文件中没有翻译目标。)

该文档实际上为call out this situation,但未提供解决方案。这个问题也被称为了由普通字符串用户on GitHub周一取消,但这个问题的主题不覆盖解决这个特殊的问题。

如何在多个节点上重复使用在我的xlf文件中定义的i18n翻译?

编辑:这是通过使用ng-xi18n --i18nFormat=xlf产生的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> 

如果两个@@homeTitle节点的解析顺序进行切换,<source>变化。

+0

你能否展示关联的xlf? 还有什么你用来提取翻译键和生成xlf? – Romain

+0

@Romain我已经添加了'xlf',但我不确定它会有多大用处。 – Eric

回答

2

TLDR;不要担心自定义ID并正确编写字符串。 ng xi18n工具将负责在单个<trans-unit>下匹配相同的字符串。然后,您的翻译将被应用到整个单位。

的时间越长说明:本xi18n工具通过字符串匹配的平等在您的应用程序的字符串。每当它找到一个新的字符串,它将它与已经找到的字符串进行比较。如果有完全匹配,它将在现有的<trans-unit>中包含新字符串。如果没有,则会创建一个新的并生成一个新的ID。

这种行为,但是,可以通过使用自定义的ID和翻译提示改变。如果找到一个新字符串并包含一个自定义ID,则会检查当前消息中是否存在此特定ID,并将其分配给现有<trans-group>(如果找到)。请注意,这个过程忽略了字符串本身,所以任何非空值将被合并到找到的具有自定义ID的<trans-group>中。空字符串被省略。

正如文档中提到的,只有第一个具有自定义ID的元素将被检查字符串。当第二个元素具有相同的ID时,它的字符串值将不会被解析。这意味着您可以改变您的解决方案,让所有其他使用您的自定义ID的节点包含一个占位符字符串。然后本地化将按照您的预期工作。

// home.component.html 
<h1 i18n="@@homeTitle">Home</h1> 
// menu.component.html 
<a routerLink="/" i18n="@@homeTitle">ANY PLACEHOLDER STRING YOU WANT</a> 

正如你所看到的,这看起来并不特别花哨。此外,您必须记住自定义ID以供进一步重复使用。我建议不要这样做,除非绝对必要。在我看来,只写这个字符串(在你的案例中为"Home")比较容易,将i18n属性打到元素上,不用担心重复使用,因为它会自动完成。我会使用自定义ID主要是为了您需要有一个字符串的多个不同(上下文)翻译。

+0

感谢您的建议。我只关注使用独立的'i18n'属性:比方说,我在十个地方使用了一些字符串(可能是术语*取消*)。然后我决定要在所有位置更改该单词(例如,所有*取消*到*否*)。我现在必须找到所有十个字符串并全部替换它们。如果他们都是一个ID,我只需要做一个改变。至于你的ID匹配的想法,我明确提到这是行不通的。使用默认语言环境时,会出现“任何PLACEHOLDER STRING YOU WANT”。 – Eric

+0

好吧,是的。那么最好的做法是让默认字符串不是本地语言环境,而是所有语言环境的模板。即使你的默认语言是英文,你仍然会生成'messages.xlf',但是然后创建'messages.en.xlf'(提供翻译 - 其中大部分是相同的字符串)。查看[本教程](https://github.com/martinroob/ngx-i18nsupport/wiki/Tutorial-for-using-xliffmerge-with-angular-cli),了解如何轻松实现它。 – Heehaaw

+0

我想我很失望这是最好的解决方案。当需要内置这种功能时,必须维护默认语言的翻译文件似乎有点愚蠢。嗯,也许它将在未来版本的Angular中得到解决。 – Eric