我是 Aurelia 的新手,但到目前为止我真的很喜欢它。但是,在某些方面仍然缺乏文档,例如使用 i18n 插件进行本地化。
我设置了语言文件 (translation.json) 并将语言文本标签插入到 HTML 模板中,但我看到了两种不同的格式。我已经成功地完成了这两项工作,但我不知道每一项的优点和缺点,所以我犹豫是否要 promise 更新我的所有模板,除非我知道哪个是最好的以及为什么。
locales/en/translation.json
{
"hello": "Hello, World!",
"lang_msg": "This message is in English."
}
locales/es/translation.json
{
"hello": "¡Hola, Mundo!",
"lang_msg": "Este mensaje está en español."
}
模板格式 1:
<template>
<h1>${ 'hello' | t }</h1>
<h2>${ 'lang_msg' | t }</h2>
</template>
模板格式 2:
<template>
<h1><span t="hello"></span></h1>
<h2><span t="lang_msg"></span></h2>
</template>
我应该使用模板格式 1 还是 2?为什么?
最佳答案
它归结为对现有标记的扩展感觉最“自然”,从长远来看侵入性最小/最易于维护。这取决于您的应用程序结构。
在功能上存在一些差异,这些差异对您来说可能重要也可能不重要,但除此之外主要是主观的。
格式2(html属性)
这种方法更加语义化,使国际化成为您标记中的一等公民。如果您需要的不仅仅是简单的单变量转换,那么与必须组合 ViewModel 的代码并将这些变量传递给绑定(bind)管道相比,这可能会产生更易读/可维护的代码。
来自文档:
嵌套和组合翻译:
<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)或您可能会使用这些内容的应用程序(如促销网站)的输出,这可能是首选方法。
格式 1 (TValueConverter)
虽然主观,但我认为 ${ variable | t }
是更具声明性/更少侵入性的方法。你是说“我有这个现有的标记,我要在上面添加国际化”。
TValueConverter 方法只会导致更少的代码,这是可维护性的论据。
唯一的缺点是,例如,当区域设置更改时,它不会自动更新。
可以通过 TBindingBehavior 方法克服:
格式“3”(TBindingBehavior)
用法和TValueConverter完全一样,只需要改成| t
即可至 & t
.这将在外部发生更改时自动更新,您可以选择使用 BindingSignaler
手动更新绑定(bind)。
BindingBehaviors 本质上比 ValueConverter 更灵活(但实现起来也更复杂)。我真的没有理由使用 | t
在 & t
从消费者的角度来看,编写的代码量相同,但提供的功能更丰富。
我希望这能回答您的问题。
关于aurelia - 首选的 Aurelia i18n 本地化模板用法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39989482/