Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

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に渡してあげるのではないかと思います。