【问题标题】:Autoloading of Namespaces i18next命名空间的自动加载 i18next
【发布时间】:2012-10-24 00:59:56
【问题描述】:

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

  1. 已加载默认命名空间“Core”。它包含我想要的大多数键,但不是全部。
  2. 没有固定的命名空间列表:因此我不能只告诉i18n.init 我想要的ns.namespaces。
  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”,或者我可以强制手动加载。)

【问题讨论】:

    标签: javascript internationalization i18next


    【解决方案1】:

    i18next 现在带有一个在初始化后加载额外命名空间的函数:http://i18next.com/pages/doc_init.html#loadAdditionalNS

    【讨论】:

      【解决方案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);
          });
      

      呼。

      【讨论】:

      • 由于默认情况下加载资源有效,因此异步自动加载实现起来并不那么简单。但是您可以将新的命名空间添加到您的配置中,您可以使用它来初始化 i18next 并重新初始化它。可能不是最好的解决方案...只需在 github 上添加一个请求以获取此类功能...将为下一个版本添加此类功能。
      猜你喜欢
      • 2011-11-19
      • 2013-11-25
      • 2014-04-13
      • 1970-01-01
      • 2019-08-16
      • 2016-12-08
      • 2011-08-06
      相关资源
      最近更新 更多