我是Aurelia的新手但到目前为止真的很享受。但是,文档仍然缺乏某些方面,例如使用i18n插件进行本地化。
我设置了语言文件(translation.json),并将语言文本标签插入到HTML模板中,但我看到了两种不同的格式。我已经成功地工作了但是我不知道每个人的优点和缺点所以我不愿意更新所有模板,除非我知道哪个是最好的以及为什么。
区域设置/ EN / translation.json
{
"hello": "¡Hola, Mundo!",
"lang_msg": "Este mensaje está en español."
}
区域设置/ ES / translation.json
<template>
<h1>${ 'hello' | t }</h1>
<h2>${ 'lang_msg' | t }</h2>
</template>
模板格式1:
<template>
<h1><span t="hello"></span></h1>
<h2><span t="lang_msg"></span></h2>
</template>
模板格式2:
require 'prime'
def divisors(n)
arr = Prime.prime_division(n).map { |v,exp| (0..exp).map { |i| v**i } }
arr.first.product(*arr[1..-1]).map { |a| a.reduce(:*) }.map { |m| [m,n/m] }
end
我应该使用模板格式1还是2?为什么呢?
答案 0 :(得分:5)
它归结为最“自然”的东西,作为现有标记的扩展,从长远来看,最具侵入性/最可维护的是什么。这取决于您的应用程序结构。
功能上存在一些差异,这些差异对您来说可能重要,也可能不重要,但除此之外,它主要是主观的。
这种方法更具语义性,使国际化成为您标记中的一流公民。如果您需要的不仅仅是简单的单变量转换,那么与您必须组合ViewModel中的代码并将这些变量传递给绑定管道相比,这可能会产生更易读/可维护的代码。
来自文档:
嵌套和组合翻译:
cvxpy
<span t="$t(title) $t(subtitle)">Title subtitle</span>
参数化属性:
<span t="nested_referencing">Nested text</span>
对于以内容为中心的应用程序(如CMS)或可能使用这些内容的那些应用程序(如促销网站)的输出,这可能是首选方法。
虽然主观,但我认为<span t="[html]paramstest" t-params.bind="params"></span>
是更具声明性/更少侵入性的方法。你说的是“我有这个现有的标记,我正在添加国际化”。
TValueConverter方法只会减少代码,这是可维护性的一个论据。
唯一的缺点是,例如,当语言环境发生变化时,它不会自动更新。
使用TBindingBehavior方法可以克服这个问题:
该用法与TValueConverter的用法相同,您只需将${ variable | t }
更改为| t
即可。这将在外部发生更改时自动更新,您可以选择使用& t
与ValueConverters相比,BindingBehaviors本质上更灵活(但实现起来也更复杂)。从消费者的角度来看,我真的没有理由使用BindingSignaler
而不是| t
,因为要编写的代码量相同但提供的功能更丰富。
我希望这能回答你的问题。
答案 1 :(得分:4)
有些用例你要做的就是翻译一次,改变再也不会发生。在过去,您已将本地化版本作为URL的一部分,因此过去非常标准,因此切换到另一个lang会引入完整的页面重新加载。因为这样的VC非常适合这些场景,并且与其他两种方法相比也更快。
作为一个底线,Aurelia及其所有插件都不会试图猜测您的业务/用例。我们可以公开各种各样的细微差别,因此您可以节省时间而不必编写样板文件,但您总能找到解决方法和至少一个其他选项。这就是为什么I18N只有三种不同的方式来做你想做的事情,所以你可以自由选择最适合你故事的方式。