5

私は Javascript ベースの翻訳ソリューションとして I18Next を使用しています。

  1. デフォルトの名前空間「Core」がロードされます。必要なほとんどのキーが含まれていますが、すべてではありません。
  2. 名前空間の固定リストはありません。したがって、必要な s だけを伝えることはできませi18n.initns.namespace
  3. ページロード中に、オプションでいくつかの「モジュール」がアプリケーションにロードされ、それらも翻訳する必要があります。i18n 名前空間の名前をどこかに報告する必要があり、i18n shuold はその名前空間のキーを利用できるようにします。

基本的に、名前空間が呼び出されたときに i18next が名前空間を自動ロードする方法はありますか? 呼び出される名前空間t("[SomeNamespace]Key.Key2");が有効であり、確実に存在することが保証されます。問題は、i18next が「自動ロード」できず、 i18n.init が呼び出された後にi18n がリソース ファイルを「手動で」ロードする方法を見つけることができないことです。

これが私の現在のコードです。

    $.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 に答える