Flex3のローカライズを使用する
http://livedocs.adobe.com/flex/3_jp/html/l10n_3.html#727650
に書いてあるけど、一応メモ。
まず、
copylocale en_US ja_JP
で日本用のロケールを作成します。これは、frameworks/locale/locale_nameにフレームワークのロケールを作成します。
一度はこのコマンドを実行しておかないと、コンパイル時にそんなディレクトリないよと怒られてしまうので、はまらないようにしましょう。
次にconfigを設定します。
<flex-config> <compiler> <locale> <locale-element>en_US</locale-element> <locale-element>ja_JP</locale-element> </locale> <source-path> <path-element>../locale/{locale}</path-element> </source-path> </compiler> </flex-config>
要するに、使用するロケールの定義をすることと、ロケールのディレクトリがソースパス入るように設定します。
ちなみに{locale}というのがそれぞれ、en_USとか、ja_JPとなるみたい。ないと怒られるのでmkdirしておきましょう。
次にすることは../locale/ja_JP/Fuga.propertiesを作成すること。もちろんen_USにも。
hoge=ほげ
あとは、ソースコードにリソースバンドルを使用するように記述してあげるだけ。
<mx:Label text="@Resource(key='hoge', bundle='Fuga')"/>
動的に言語を選択させるには
ResourceManagerを使用します。ResourceManagerのlocaleChainに使用するロケールを設定する事で、動的に表示言語を変更する事ができます。
ちなみにresourceManagerプロパティでResourceManagerのインスタンスにアクセスできます。つまり、
resourceManager.localeChain = ["en_US"];
とか
resourceManager.localeChain = ["js_JP"];
とかすれば良い訳です。なんですが、ここではまりました。@Resource(key=....という書き方だとBindしてくれていないみたいで一向に値が変わりませんでした。
なので、次のようにmxmlに記述します
<mx:Label text="{resourceManager.getString('Fuga', 'hoge')}"/>
これでやっと切り替える事ができるようになります。
ちなみに、なんで配列になっているのかというと、優先順位を決められるのだそうです。インデックスの頭の方から優先的に使用するキーを探しにいき、
一つでもキーが見つからない場合は、次のインデックスの言語をためします。
最後までいっても見つからない場合は、ロケールが見つからなかったと判断し、getStringしてもnullしか帰ってきません。
だから、文字列が軒並み空白になっているときは、localeChainか、キーが設定されていないのではないかと疑いましょう。
初期表示はユーザの言語に合わせたい
Accept-Language HTTP ヘッダーや Capabilities.languageを利用してユーザの言語を初期化時に設定します。
Capabilities.languageにはFlash PlayerやAirの環境の言語コードが入っています。
言語コードだけで、国情報は入っていないので、このままlocaleChainに突っ込んでも、ロケールは見つからず、全ての欄がnull(空文字)になってしまうので注意。
国情報を付加してlocaleChainを設定します。
if (Capabilities.language == 'ja') resourceManager.localeChain = ['ja_JP'];
Accept-Languageはどうやって取得するのかわからないのですが、JavaScriptでAccept-Languageを取得して、それをflashVarsに渡してあげるのではないかと思います。