現在、クロージャー アプリケーションでプレーン テキストのみを使用しています。これらのテキストにローカライズを追加したいと考えています。この種のローカリゼーションを行うために使用される goog.getMsg 関数に関する記事をいくつか見つけました。私が理解している限り、それはコンパイル時に行われます。ユーザーがボタンをクリックしたときに実行時に言語を変更するにはどうすればよいですか? Closureを使用してこれを行う最も簡単な方法は何ですか?
2 に答える
私は実際にランタイムi18nを達成しました。タグ付きの.soy テンプレートを使用{msg}
しています。.soy を .js にコンパイルすると、これらの呼び出しは goog.getMsg 呼び出しにコンパイルされます。私がしなければならなかったのは:
- それらに含まれていたすべての
.js
ファイルを見つけるgoog.getMsg(
- プリペンド
goog.require("myApp.i18n");\n
- すべての
goog.getMsg(
呼び出しをmyApp.i18n.translate(
- すべての
MSG_*
プロパティ名をmyprefix_MSG_*
理由: goog.getMsg はコンパイラ プリミティブと見なされ、操作が一切許可されないため、直接オーバーライドすることはできません。同じことがプロパティにも当てはまりMSG_*
ます。
myApp.i18n.translate
文字列を受け取り、(実行時に渡される) ロケール マップで検索を試みgoog.getMsg
、ローカライズされた文字列を使用して結果を返す (goog.getMsg
いくつかの便利なプレースホルダー置換を行う) 関数です。
これはあまりきれいな解決策ではありませんが、機能し、すべての言語に対して 1 つのコンパイル済みファイルのみを使用して、実行時に言語を変更することができます。
実際のコードには、生成された記述を使用し、奇妙に見えるクロージャー ファイル形式の代わりに JSON ファイルを使用できるようにするいくつかのハックが含まれていますが、要点は同じです。
でも!
実際にすべきことは、アプリからいくつかのファイルをコンパイルし、言語ごとに異なる .js ファイルをロードすることです。
何百もの異なる構成といくつかの言語をサポートする必要があるため、このソリューションを使用する必要がありました.1回のコンパイルに30秒以上かかる場合、何千もの.jsファイルをコンパイルするのは非常識です.