5

我使用 I18Next 作为基于 Javascript 的翻译解决方案,这就是需要发生的事情:

  1. 加载默认命名空间“Core”。它包含我想要的大多数键,但不是全部。
  2. 没有固定的命名空间列表:因此我不能只告诉我想要i18n.init的s。ns.namespace
  3. 在页面加载期间,可选的一些“模块”被加载到应用程序中,它们也需要被翻译。他们应该在某处报告他们的 i18n 命名空间名称,然后 i18n shuold 使该命名空间的键可用。

基本上,i18next 有没有办法在调用命名空间时自动加载它们?保证被调用的命名空间t("[SomeNamespace]Key.Key2");是有效的并且肯定存在。问题很简单,i18next 不能“自动加载”,我无法找到一种方法让 i18n在调用 i18n.init后“手动”加载资源文件。

这是我当前的代码。

    $.i18n.init(
        {
            lng: "en",
            fallbackLng: "en",
            useCookie: false,
            resGetPath: "System/i18n/__ns__/__lng__.json",
            ns: "Core"
        },
        function(t) {
            System.I18N = t;

            alert(System.I18N("LoginUI:Messages.Name"));
        }
    );

正如预期的那样,它只是显示我LoginUI:Messages.Name而不是翻译System/i18n/LoginUI/en.json

{
    "Messages": {
        "Name": "Logon Interface"
    }
}

(在这种情况下,Core/en.json 无关紧要。我目前需要的是自动加载“LoginUI/en.json”,或者我可以强制手动加载。)

4

2 回答 2

3

i18next 现在带有一个在初始化后加载其他命名空间的功能:https ://www.i18next.com/principles/namespaces#sample

于 2012-12-04T10:48:16.800 回答
2

在深入研究了源代码之后,我创建了一个可行的解决方案,但从长远来看肯定需要改进。

i18n.addjQueryFunct()的定义中,添加这个以访问 resStore(翻译存储变量):

$.i18n._getResStore = _getResStore;
$.i18n._writeResStore = _writeResStore;

function _getResStore() {
    return resStore;
}

function _writeResStore(r) {
    resStore = r;
}

当您想加载额外的命名空间时,只需执行以下操作:

// define options, run $.i18n.init, etc...
// suppose ns = "namespace_foobar_new"
options.ns.namespaces.push(ns);
$.i18n.sync._fetchOne(lang, ns, $.extend({}, $.i18n.options, options),
    function(err, data) {
    store = {};
        store[lang] = {}; store[lang][ns] = data;

            newResStore = $.extend(true, {}, $.i18n._getResStore(), store);
            $.i18n._writeResStore(newResStore);
    });

呸。

于 2012-11-04T01:46:47.293 回答