我是Aurelia的新手,但到目前为止真的很享受.但是,文档仍然缺乏某些方面,比如使用i18n插件进行本地化.
我设置了语言文件(translation.json)并将语言文本标签插入到HTML模板中,但我看到了两种不同的格式.我已经成功地工作但我不知道每个的优点和缺点所以我犹豫是否要承诺更新我的所有模板,除非我知道哪个是最好的和为什么.
区域设置/ EN/translation.json
{
"hello": "Hello, World!",
"lang_msg": "This message is in English."
}
Run Code Online (Sandbox Code Playgroud)
区域设置/ ES/translation.json
{
"hello": "¡Hola, Mundo!",
"lang_msg": "Este mensaje está en español."
}
Run Code Online (Sandbox Code Playgroud)
模板格式1:
<template>
<h1>${ 'hello' | t }</h1>
<h2>${ 'lang_msg' | t }</h2>
</template>
Run Code Online (Sandbox Code Playgroud)
模板格式2:
<template>
<h1><span t="hello"></span></h1>
<h2><span t="lang_msg"></span></h2>
</template>
Run Code Online (Sandbox Code Playgroud)
我应该使用模板格式1还是2?为什么?
它归结为对您现有标记的扩展感觉最"自然",从长远来看,最具侵入性/最可维护的是什么.这取决于您的应用程序结构.
功能上存在一些差异,这些差异对您来说可能重要,也可能不重要,但除此之外,它主要是主观的.
这种方法更具语义性,使国际化成为标记中的一等公民.如果您需要的不仅仅是简单的单变量转换,那么与您必须组合ViewModel中的代码并将这些变量传递给绑定管道相比,这可能会产生更易读/可维护的代码.
来自文档:
嵌套和组合翻译:
<span t="$t(title) $t(subtitle)">Title subtitle</span>
<span t="nested_referencing">Nested text</span>
参数化属性:
<span t="[html]paramstest" t-params.bind="params"></span>
对于以内容为中心的应用程序(如CMS)或可能使用这些内容的那些应用程序(如促销网站)的输出,这可能是首选方法.
虽然主观,但我认为这${ variable | t }是更具声明性/更少侵入性的方法.你说"我有这个现有的标记,我正在添加国际化".
TValueConverter方法只会导致更少的代码,这是可维护性的一个参数.
唯一的缺点是,例如,当语言环境发生变化时,它不会自动更新.
使用TBindingBehavior方法可以克服哪些问题:
用法与TValueConverter的用法相同,您只需要更改| t为& t.这将在外部发生更改时自动更新,您可以选择使用以下命令手动更新绑定BindingSignaler
与ValueConverters相比,BindingBehaviors本质上更灵活(但实现起来也更复杂).我真的不明白了一个道理用| t在& t从消费者的角度来看,由于代码量写的是相同的,但所提供的功能更加丰富.
我希望这回答了你的问题.
弗雷德完美地总结了这三种方式。因此,作为原始问题 ValueConverter | 的补充。( VC ) vs BindingBehavior & ( BB ) 在性能上有一个小的差异。BB 实质上是设置额外的侦听器以支持自动更新。因此,它可能会对大量绑定产生影响。
在某些用例中,您要做的只是翻译一次,更改再也不会发生。在过去,这曾经是非常标准的,您将本地化版本作为 URL 的一部分,因此切换到另一个语言会引入完整的页面重新加载。因此,VC 非常适合这些场景,并且与其他两种方法相比,速度也更快。
作为底线,Aurelia 及其所有插件都不会尝试对您的业务/用例进行二次猜测。我们可以公开许多各种细微的差异,我们可以公开约定,因此您可以节省时间并且不必编写样板,但您总会找到解决方法和至少另一种选择。这就是为什么 I18N 没有一种而是三种不同的方式来做您想做的事,因此您可以自由选择最适合您的故事的方式。