Flexアプリケーションのなんちゃってローカライゼーション
インドの公用語はヒンドゥー語、補助的な公用語が英語とされているが、実はヒンドゥー語は日本における日本語のように全国的に通用するわけではなく、インドの各地域には20を超える言語が存在する。それらは日本でいうところの方言といったレベルと違い、それぞれ別の言語である。
特に南部ではヒンドゥー語の話者がほとんどおらず、公用語をヒンドゥー語と定める政府の方針には反対意見が根深いという。
そうなってくるとインド全国で通じる言葉といえば英語になるわけだが、皆が英語を話せるかというとそうでもなく、教育を受けた高いカーストの人か、観光客相手の仕事をしている人などに限られてくる。インドは難しい。
以上、全て無駄話である。
Flexアプリケーションの UIは XML(MXML) で記述されるため、日本語で記述したものを英語へ翻訳するにはXMLファイルを訳者へ渡して語の置き換えをしてもらうという単純なやりかたである程度事が済むのだが、「完成した」アプリケーションの翻訳ならそれでも良いかもしれないものの、いかんせんソフトウェアとは常に進化する(させられる)ものであり、毎日のように変化する翻訳元に翻訳先を追従させるのは難しい。というか無理。

Flexでは Javaのようにリソースバンドル(propertiesファイル)を使えるので、L10NやらM17Nにはそれを使うことになっている。
たとえば日本語用のリソースバンドル locale/ja_JP/resource.properties には
英語用のリソースバンドル locale/en_US/resource.properties には
<mx:Label text="@Resource(key='messageToSend', bundle='resource')"/>
のように UIコンポーネントを記述すると、アプリケーションがコンパイルされた時のロケール指定に応じて自動的にラベルのテキストが "送信するメッセージ" "Message to send" に切り替わる。
(Flex Builderではコンパイラ設定の「追加コンパイラ引数」欄でロケールを指定できる)
ただし、これはやたらめんどくさい。ソース中に出現するあらゆるメッセージをキー文字列で表現しておいて言語環境ごとに適切な語へ置換するというのはわかるが、はっきり言ってキーで書いてあるとわかりにくい。だって、
<mx:Label text="送信するメッセージ"/>
が
<mx:Label text="@Resource(key='messageToSend', bundle='resource')"/>
になったら本当に何がなんだかわからんよ。
そんなわけで手抜きの「なんちゃってローカライゼーション」が発動する。


まずは Flexのプロジェクト設定でビルドパスに locale/{locale}を追加する。これにより、locale/ja_JP/ や locale/en_US/ 内にある propertiesファイルを読み込めるようになる。
次はMXMLの中に
<mx:Metadata>
[ResourceBundle("resource")]
</mx:Metadata>
を追加し、resource.propertiesを読み込ませる。もちろん resource.propertiesは ja_JP用と en_US用の2個を作るが、ja_JP用のほうは空の内容で良い。

en_US用の resource.propertiesには必要なだけ
の記述をする。日本語表現をキーにしてしまうのがコツ。
(なおJavaと違って Flexの propertiesファイルには UTF-8を使うことが出来るので、native2asciiのようなうざったいツールを使う必要はない)
そしてmx:Scriptブロックの中にこんな関数を書き入れた。
私の UIコンポーネントはこんな風に記述される。
LS(Localized Stringのつもり) 関数を通すと、propertiesファイルに訳語が収録されていればそれに置換され、無ければそのままの文字列が返ってくる。このようにしておけば、翻訳者は propertiesファイルにひたすら「日本語表現=英語表現」の辞書を作っていくだけで英語版のメンテナンスが出来るわけだ。
日本語でコンパイル(ロケール ja_JP)

英語でコンパイル(ロケール en_US)

実際には、日本語表現と英語表現で語順が変わったりするため propertiesファイル内では {0}{1}といったプレースホルダが使えるようになっているのだが、上のLS()関数はそれに対応していない。後は自身で工夫するべし。
特に南部ではヒンドゥー語の話者がほとんどおらず、公用語をヒンドゥー語と定める政府の方針には反対意見が根深いという。
そうなってくるとインド全国で通じる言葉といえば英語になるわけだが、皆が英語を話せるかというとそうでもなく、教育を受けた高いカーストの人か、観光客相手の仕事をしている人などに限られてくる。インドは難しい。
以上、全て無駄話である。
Flexアプリケーションの UIは XML(MXML) で記述されるため、日本語で記述したものを英語へ翻訳するにはXMLファイルを訳者へ渡して語の置き換えをしてもらうという単純なやりかたである程度事が済むのだが、「完成した」アプリケーションの翻訳ならそれでも良いかもしれないものの、いかんせんソフトウェアとは常に進化する(させられる)ものであり、毎日のように変化する翻訳元に翻訳先を追従させるのは難しい。というか無理。

Flexでは Javaのようにリソースバンドル(propertiesファイル)を使えるので、L10NやらM17Nにはそれを使うことになっている。
たとえば日本語用のリソースバンドル locale/ja_JP/resource.properties には
messageToSend=送信するメッセージ
英語用のリソースバンドル locale/en_US/resource.properties には
messageToSend=Message to sendと書いたうえで、
<mx:Label text="@Resource(key='messageToSend', bundle='resource')"/>
のように UIコンポーネントを記述すると、アプリケーションがコンパイルされた時のロケール指定に応じて自動的にラベルのテキストが "送信するメッセージ" "Message to send" に切り替わる。
(Flex Builderではコンパイラ設定の「追加コンパイラ引数」欄でロケールを指定できる)
ただし、これはやたらめんどくさい。ソース中に出現するあらゆるメッセージをキー文字列で表現しておいて言語環境ごとに適切な語へ置換するというのはわかるが、はっきり言ってキーで書いてあるとわかりにくい。だって、
<mx:Label text="送信するメッセージ"/>
が
<mx:Label text="@Resource(key='messageToSend', bundle='resource')"/>
になったら本当に何がなんだかわからんよ。
そんなわけで手抜きの「なんちゃってローカライゼーション」が発動する。


まずは Flexのプロジェクト設定でビルドパスに locale/{locale}を追加する。これにより、locale/ja_JP/ や locale/en_US/ 内にある propertiesファイルを読み込めるようになる。
次はMXMLの中に
<mx:Metadata>
[ResourceBundle("resource")]
</mx:Metadata>
を追加し、resource.propertiesを読み込ませる。もちろん resource.propertiesは ja_JP用と en_US用の2個を作るが、ja_JP用のほうは空の内容で良い。

en_US用の resource.propertiesには必要なだけ
日本語表現=英語表現
の記述をする。日本語表現をキーにしてしまうのがコツ。
(なおJavaと違って Flexの propertiesファイルには UTF-8を使うことが出来るので、native2asciiのようなうざったいツールを使う必要はない)
そしてmx:Scriptブロックの中にこんな関数を書き入れた。
private function LS(str:String):String
{
if (str == null) return null;
var ls:String = resourceManager.getString("resource", str);
return (ls == null) ? str : ls;
}
私の UIコンポーネントはこんな風に記述される。
<mx:Label text="{LS('送信するメッセージ')}"/>
<mx:TextInput id="message"/>
<mx:Button label="{LS('送信')}"/>
LS(Localized Stringのつもり) 関数を通すと、propertiesファイルに訳語が収録されていればそれに置換され、無ければそのままの文字列が返ってくる。このようにしておけば、翻訳者は propertiesファイルにひたすら「日本語表現=英語表現」の辞書を作っていくだけで英語版のメンテナンスが出来るわけだ。
日本語でコンパイル(ロケール ja_JP)

英語でコンパイル(ロケール en_US)

実際には、日本語表現と英語表現で語順が変わったりするため propertiesファイル内では {0}{1}といったプレースホルダが使えるようになっているのだが、上のLS()関数はそれに対応していない。後は自身で工夫するべし。
ラベル: Flex

0 件のコメント:
コメントを投稿
<< ホーム