如果我,例如。在我的标题中使用选择下拉输入字段(更准确地说,在我的站点范围导航栏中是自定义元素),并在共享状态对象中全局设置该值。如果我 - languageChanged(value)
(在导航栏自定义元素内)也更改了this.i18n.setLocale('de-DE')
如何在我的模板中刷新i18n翻译的字符串插值(例如${'status_deceased' | t}
),而不必像我现在那样导航到新路线并返回?
我在github上发现了关于问题https://github.com/aurelia/i18n/issues/6的问题,但由于我需要这个工作,我希望存在一些聪明的解决方法,除了必须使用window.location重新加载页面:/ < / p>
修改
如果我正确地理解这一点似乎可能只是我的幸运日,并且这样的功能刚刚在8天前添加,虽然仍然没有记录:https://github.com/aurelia/templating-resources/pull/126 - 任何人都可以找出并告诉我如何实现这个,或许使用这个新功能?如果我自己解决这个问题,我会用解决方案更新这个帖子: - )
答案 0 :(得分:3)
当下一个版本发布时,您将能够使用signal
绑定行为为绑定分配“信号名称”,如下所示:
<h1>${'title_key' | t & signal:'i18n'}</h1>
<p>${'content_key' | t & signal:'i18n'}</p>
&
符号表示“绑定行为”(与值转换器的|
相对)。绑定行为是为绑定添加“行为”的资源。他们拥有对绑定实例的完全访问权限,并在绑定的bind
和unbind
生命周期事件之前得到通知。
Aurelia将提供多种内置绑定行为:“油门”,“去抖动”,“一次性”,“信号”等。您还可以选择创建自己的绑定行为。
在上面的示例中,我们为title
和content
插值绑定提供了“信号”名称“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功能:当转换器参数发生变化时,绑定将被重新评估。
export class LanguageChangedNotifier {
signal = 0;
notify() {
this.signal++;
}
}
@inject(LanguageChangedNotifier)
export class App {
constructor(notifier) {
this.notifier = notifier;
}
}
t
绑定中使用通知程序(它不会影响t
值转换器的行为):${'status_deceased' | t:notifier.signal}
this.notifier.notify();