Flex 2では、コンパイル時にlocaleを一つだけ指定してswfファイルを生成します。
コンパイル後のlocaleは読み出し専用になっていました。
その為ResourceBundleなどで文字列を外部化しても多言語対応をするには、複数のswfを作成する必要があります。
文字列を動的に切り替えるのは昔のエントリーで紹介した例やFlex User GroupのOrigamiProjectなどでありましたが、Flex 3になってRuntime Localizationがサポートされるようになっていました。
(クリックでサンプル表示)
※これはFlex Beta1で試したものです。
ボタンをクリックすることでlocaleChainの値が切り替わりメッセージやコンポーネントで使用しているresourceが切り替わりました\(^o^)/。
サンプルを作成するにあたりコンパイルオプションでは、以下のものを指定しています。
-locale=ja_JP,en_US -source-path=../locale/{locale}
ランタイムで動的にlocaleを切り替えて文字列を変更するにはresourceManager.localeChainを変更することで対応できます。
localeChainは文字列で指定するのではなく配列で指定することになっているとの事。
resourceManager.localeChain = [ "ja_JP" ];
@Resourceでの指定では、localeの値が優先されるようです。
サンプルの最初の文字列は以下のように指定して表示しています。
@Resource(bundle='myResources', key='GREETING')
resourceChainを変更しても文字列に変化なしでした。
しかしながらresourceManager経由で指定するとlocaleChainの値が即座に反映されました。
{resourceManager.getString('myResources','GREETING')}
サンプルの2つ目の文字列はlocaleChainを利用して表示しているのでlocaleにあったものに変更されます。
またlocaleChainを変更するとFlex Frameworkのコンポーネントも変わるようです。
上記の例ではカレンダーやDateChooserが切り替わることがわかります。
RuntimeLocalizationができるようになった事で、アプリケーションのコンポーネントとして保持しているメッセージはResourceBundleで、アプリケーションが表示するメッセージはサーバ側の実装と共用のものを使うといった形になると開発後のメンテナンスがしやすくなるのでは?と考えています。
#利用の仕方がこれをみればわかります。
Flex 3:Feature Introductions: Runtime Localization - Adobe Labs
http://labs.adobe.com/wiki/index.php/Flex_3:Feature_Introductions:_Runtime_Localization
#作成したサンプルはこちら
http://www.noridon.net/weblogs/archives/images/flex3/runtime/RuntimeLocalization.html
#Localizationに関する昔のエントリー。
#その他、エントリーにはありませんが2006MaxでFlex User Groupが紹介したアプリケーションでも別の方法で実現しています。
Flex2アプリケーションでLocaleを実行時に変更する(2):nod::ぶろぐ::RIA::Flash/Flex/Ajax
http://www.noridon.net/weblogs/archives/2006/08/flex2_4.html
※2007/10/03追記
#去年もlocaleについてはエントリー書いていました。^^
Flex2ではLocaleを実行時に変更できない。のか?:nod::ぶろぐ::RIA::Flash/Flex/Ajax
http://www.noridon.net/weblogs/archives/2006/07/flex2locale.html
この記事に対するコメント