14

私が取り組んでいるアプリの多言語サポートを構築しています。SO(国際化のベストプラクティス)をいくつか調査して読んだ後、それを「フレームワークにやさしい」方法で統合しようとしています。私が現時点で行ったことは次のとおりです。

次のようにフォーマットされた .resource モジュールを作成しました。

resources.en-US.js

define(function () {
   return {
       helloWorlLabelText: "Hello world!"
   }
});

app.start で、requirejs を使用してリソース モジュールを取得し、すべてのデータを app.resources に割り当てます。各モジュールの内部では、特定のリソースがオブザーバブルに割り当てられ、ラベルやその他のテキスト関連のものにテキストバインディングで結合されます。そのようです:

define(function (require) {
   var app = require('durandal/app'),
       router = require('durandal/plugins/router')
   };
   return{
       helloWorldLabelText: ko.observable(app.resources.helloWorldLabelText),

       canDeactivate: function () { 
      }
   }
});

On the view:

<label for="hello-world" data-bind="text: helloWorldLabelText"></label>

app.resources に新しいモジュールを割り当てるだけで、リソースがスワップされます。

問題は、言語が変更され、一部のビューが既にレンダリングされている場合に、以前の言語の値がまだ残っていることです。そのため、アクティブ化メソッド内でオブザーバブルを再割り当てすることになりました。また、 app.resources をオブザーバブルにラップしようとしましたが、それもうまくいきませんでした。

私が最終的に最もクリーンな方法にたどり着いたとは思いませんし、他の誰かが共有できる別の方法を持っていたのかもしれません。ありがとう。

4

4 に答える 4

4

このトピックに関するSOの回答に非常に触発されたので、i18nモジュール+ノックアウト/デュランダルのバインディングの独自の実装を思いつきました。

私のgithubリポジトリを見てください

さらに別の i18n モジュールの選択は、ファイルではなくデータベース (プロジェクトごとに必要なタイプ) に翻訳を保存することを好むというものでした。その実装では、キーと値の方法ですべての翻訳を含む JSON オブジェクトで応答する必要があるバックエンドが必要になります。

@RainerAtSpiritシングルトンクラスの良いヒントは、モジュールにとって非常に役立ちました

于 2013-09-08T11:57:57.640 に答える
3

i18n必要なオブザーバブルをすべて含むシングルトンを返すモジュールを 1 つ用意することを検討してください。さらに、i18n オブジェクトを使用してそれらを初期化/更新する init 関数。

define(function (require) {
   var app = require('durandal/app'),
       i18n = require('i18n'),
       router = require('durandal/plugins/router')
   };
   return{

       canDeactivate: function () { 
      }
   }
});

On the view:

<label for="hello-world" data-bind="text: i18n.helloWorldLabelText"></label>
于 2013-06-03T08:26:25.560 に答える