2012-11-03 59 views
4

我使用I18Next作为一个基于JavaScript的转换解决方案,这里是需要采取什么措施:自动加载i18next

  1. 默认命名空间“核心”被加载。它包含我想要的大多数键,但不是全部。
  2. 没有命名空间,没有固定的名单:所以我不能只告诉i18n.initns.namespace正是我想要。
  3. 在页面加载过程中,可选地,一些“模块”被加载到应用程序中,并且它们也需要被翻译。他们应该在某处报告他们的i18n名称空间名称,然后国际化使该名称空间的键可用。

基本上是有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" 
    } 
} 

(核心/ en.json在这种情况下不相关的所有我现在需要的是“LoginUI/EN以.json”被自动加载或者我可以强制进行手动装载。)

回答

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); 
    }); 

Phew。

+1

作为加载资源工作在默认情况下异步自动加载不是简单地实现。但是您可以将新的命名空间添加到您的配置中,您可以使用它来初始化i18next并仅重新启动它。可能不是最好的解决方案...只要在github上添加一个这样的功能请求...将为下一个版本添加这样的功能。 – jamuhl

+0

打开功能请求:https://github.com/jamuhl/i18next/issues/109 – dna