如何在i18next中使用Knockout observable?

Rem*_*ure 4 javascript jquery html5 knockout.js i18next

我试图以某种方式动态地使用i18next翻译和Knockout.js,但我无法弄清楚如何.

自定义Knockout绑定或i18next jQuery插件似乎都不适用于可观察值.

我可以在这里找到我想要实现的演示:http://jsfiddle.net/rdfx2/1/

解决方法是这样的,但如果可能的话,我宁愿避免这种情况:

<div data-bind="text: translate('key', observable)"></div>

self.translate = function (key, value) {
   return i18next.t(key, {
      "var": value
   });
};
Run Code Online (Sandbox Code Playgroud)

谢谢,

Rob*_*und 7

我对i18next不是很熟悉,所以我可能错误地使用了i18next,但你可以通过创建一个bindingHandler轻松实现这一点.这种bindingHandler的一个非常简单的版本,支持传递可选选项,可能如下所示:

ko.bindingHandlers['translatedText'] = {
    update: function(element, valueAccessor, allBindings){
        var key = ko.unwrap(valueAccessor());
        var options = ko.toJS(allBindings.get('translationOptions') || {});
        var translation = i18n.t(key, options);
        element.innerText = translation;
    }
};
Run Code Online (Sandbox Code Playgroud)

给出以下i18next初始化代码:

i18n.init({
    lng: "en",
    debug: true,
    resStore: {
        en: {
            translation: {
                'myTextKey': 'My translated value is "__value__"',
                'otherTextKey': 'This is just a text which does not use options'
            }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

您可以将它与以下HTML一起使用:

<input type="text" data-bind="value: input, valueUpdate: 'afterkeydown'"/>
<div data-bind="translatedText: 'myTextKey', translationOptions: { value: input }"></div>
<div data-bind="translatedText: 'otherTextKey'"></div>
Run Code Online (Sandbox Code Playgroud)

以下视图模型:

function ViewModel(){
    this.input = ko.observable();
}

ko.applyBindings(new ViewModel);
Run Code Online (Sandbox Code Playgroud)

我已将上述代码保存到jsfiddle,您可以在http://jsfiddle.net/md2Hr/找到