刷新Aurelia中的i18n转换字符串插值

Refreshing i18n translated string interpolated values in Aurelia

本文关键字:字符串 插值 转换 i18n Aurelia 中的 刷新      更新时间:2023-09-26

如果我在我的标题中使用一个选择下拉输入字段(更准确地说,在我的站点导航栏中,它是自定义元素),并在共享状态对象中全局设置该值。如果I-在languageChanged(value)(导航栏自定义元素内)上也更改this.i18n.setLocale('de-DE')

然后,我如何刷新模板中的i18n转换字符串插值(例如${'status_deceased' | t}),而不必像现在这样导航到新的路由并返回?

我在github上发现了这个问题https://github.com/aurelia/i18n/issues/6但由于我需要这样做,我希望存在一些巧妙的解决方法,除了必须使用window.location来重新加载页面:/

编辑

如果我理解正确的话,这似乎只是我的幸运日,这样的功能在8天前刚刚添加,尽管仍然没有记录:https://github.com/aurelia/templating-resources/pull/126-有人能想出并告诉我如何实现这一点吗,也许可以使用这个新功能?如果我自己解决了这个问题,我会用解决方案更新这个线程:-)

当下一个版本发布时,您将能够使用signal绑定行为为绑定分配一个"信号名称",如下所示:

<h1>${'title_key' | t & signal:'i18n'}</h1>
<p>${'content_key' | t & signal:'i18n'}</p>

&符号表示"绑定行为"(与值转换器的|相反)。绑定行为是将"行为"添加到绑定中的资源。他们可以完全访问绑定实例,并在绑定的bindunbind生命周期事件之前得到通知。

Aurelia将提供几个内置的绑定行为:"节流"、"防反弹"、"一次性"、"信号"等。您还可以选择创建自己的绑定行为。

在上面的示例中,我们为titlecontent插值绑定提供了一个"信号"名称"i18n"。名称是任意的,我们只需要知道它是什么,这样我们就可以使用BindingSignaler"发出信号"来刷新绑定,如下所示:

import {BindingSignaler} from 'aurelia-templating-resources';
import {inject} from 'aurelia-framework';
@inject(BindingSignaler)
export class App {
  constructor(signaler) {
    this.signaler = signaler;
  }
  // invoking this method will refresh all bindings in the application
  // with the "signal name" of "i18n"
  refreshBindings() {
    this.signaler.signal('i18n');
  }
}

我想,一旦绑定行为功能消失,i18n插件中就会有额外的工作,将t值转换器与signal绑定行为的某个版本结合起来,以启用简洁的绑定表达式,在语言更改时负责翻译和刷新绑定,因此您可能暂时不必担心。

编辑如果您今天需要一些东西,您可以利用现有的Aurelia功能:当转换器参数更改时,将重新评估绑定

  1. 创建一个新类:
export class LanguageChangedNotifier {
  signal = 0;
  notify() {
    this.signal++;
  }
}
  1. 将此类注入到所有视图模型中,并将实例作为属性添加:
@inject(LanguageChangedNotifier)
export class App {
  constructor(notifier) {
    this.notifier = notifier;
  }
}
  1. t绑定中使用通知程序(它不会影响t值转换器的行为):
${'status_deceased' | t:notifier.signal}
  1. 更改区域设置时,请使用通知程序刷新绑定:
this.notifier.notify();