首选的 Aurelia i18n 本地化模板用法是什么?

What is the preferred Aurelia i18n localization template usage?

我是 Aurelia 的新手,但到目前为止我真的很喜欢它。但是,在某些方面仍然缺少文档,例如使用 i18n 插件进行本地化。

我设置了语言文件 (translation.json) 并将语言文本标签插入到 HTML 模板中,但我看到了两种不同的格式。我已经成功地完成了这两项工作,但我不知道每一项的优点和缺点,所以我犹豫要不要承诺更新我的所有模板,除非我知道哪个是最好的以及为什么。

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 属性)

这种方法更语义化,使国际化成为您标记中的第一个 class 公民。如果您需要的不仅仅是简单的单变量转换,那么这可能会产生比必须合并来自 ViewModel 的代码并将这些变量传递给绑定管道时更多的 readable/maintainable 代码。

来自文档:

嵌套和组合翻译:

<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

手动更新绑定

BindingBehaviors 本质上比 ValueConverter 更灵活(但实现起来也更复杂)。从消费者的角度来看,我真的没有看到使用 | t 而不是 & t 的理由,因为要编写的代码量相同,但提供的功能更丰富。

我希望这能回答你的问题。

Fred 完美地总结了这三种方式。所以作为原始问题的附录 ValueConverter | (VC) vs BindingBehavior & (BB) 在性能上存在一个小差异。 BB 本质上是设置额外的侦听器以支持自动更新。因此,它 可以 在大量绑定中发挥作用。

在某些用例中,您只想翻译一次,再也不会发生更改。这在过去曾经是非常标准的,在那里你将本地化版本作为 URL 的一部分,因此切换到另一种语言会引入完整的页面重新加载。因此 VCs 非常适合这些场景,并且与其他两种方法相比速度更快。

作为底线,Aurelia 及其所有插件不会试图事后猜测您的业务/用例。有太多不同的、细微的差异,我们可以公开约定,这样您就可以节省时间并且不必编写样板文件,但您总能找到解决方法和至少一种其他选择。这就是为什么 I18N 没有一种而是三种不同的方式来做你想做的事,所以你可以自由选择最适合你故事的方式。