命名空间的自动加载i18next

时间:2012-11-03 16:12:46

标签: javascript internationalization i18next

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

  1. 加载默认命名空间“Core”。它包含我想要的大多数键,但不是全部。
  2. 没有固定的命名空间列表:因此我不能只告诉i18n.init我想要的ns.namespace
  3. 在页面加载期间,可选地将一些“模块”加载到应用程序中,并且还需要翻译它们。他们应该在某处报告他们的i18n命名空间名称,然后i18n shuold使该命名空间的密钥可用。
  4. 基本上,有没有办法让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”自动加载或我可以强制手动加载。)

2 个答案:

答案 0 :(得分:3)

i18next现在提供了一个在初始化后加载其他命名空间的函数:http://i18next.com/pages/doc_init.html#loadAdditionalNS

答案 1 :(得分: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);
    });

呼。