ついにベールを脱いだJavaFX

第12回 国際化

この記事を読むのに必要な時間:およそ 5.5 分

では,実行してみましょう。実行結果を図3に示します。

図3 Cityを変更した結果

図3 Cityを変更した結果

図1では「City:」と表示されていた箇所が「都市:」と表示されるようになりました。

他の文字列に関しても日本語のリソースを記述してみましょう。スクリプトで##を付加する文字列として,都市の名前とStageのtitleアトリビュートがあります。これらの部分も次のようにスクリプトを変更します。

リスト4

// 都市名
var cities = [##"New York", ##"Paris", ##"Tokyo"];

        ...
         
         
Stage {
    title: ##"World Clock"

        ...

これに対応して,リソースファイルworldClock_ja.fxpropertiesは次のようにしました。

リスト5 worldClock_ja.fxproperties

@charset "Shift_JIS";
 
"City:" = "都市:"
"World Clock" = "世界時計"
 
"New York" = "ニューヨーク"
"Paris" = "パリ"
"Tokyo" = "東京"

これだけで日本語に対応することができました。さっそく実行してみましょう。

図4 日本語に対応した結果

図4 日本語に対応した結果

ここでは通常の文字列しか扱いませんでしたが,\n,\t,\r,\f,\",\\などの文字もリソースファイルで扱うことができます。

このように簡単に各国語に対応できることはわかりました。しかし,ここで気になるのがデフォルトの文字列が同じだった場合です。たとえば,メニューでよく使用されるFileなどは,名詞と動詞の両方で使用されます。同じ訳語を当てるのであれば問題ありませんが,異なる訳語を当てる場合,何らかの方法で区別することが必要です。

また,デフォルトの文字列が長い場合はどうでしょう。何行にも渡るような文字列をリソースファイルに書くのはちょっと面倒です。

このような場合,デフォルトの文字列とは別にキーとなる文字列だけ別に記述することも可能です。キーを別に記述する場合,##の後に[ ]を記述し,その中にキーとなる文字列を記述します。

ここでは,都市名をキーを別にして書き直してみます。

リスト6

// 都市名
var cities = [
    ##[NY]"New York",
    ##[PR]"Paris",
    ##[TK]"Tokyo"
];

"New York"の文字列に対応するキーは"NY"とし,同じように"Paris"は"PR","Tokyo"は"TK"としました。

リソースファイルはリスト7のようになります。

リスト7

@charset "Shift_JIS";

"City:" = "都市:"
"World Clock" = "世界時計"

"NY" = "ニューヨーク"
"PR" = "パリ"
"TK" = "東京"

実行結果は図4と同じなので示しませんが,このようにキーとデフォルト文字列を別々に扱うことも可能なのです。

スクリプトとリソースファイルの結びつけ

デフォルトでは1つのスクリプトファイルにつき,1つのリソースファイルが必要ですが,スクリプトファイルが多くなってくるとリソースの扱いが煩雑になりがちです。また,スクリプトファイルと同じディレクトリに配置しなくてはならないことも,ちょっと気になります。

そこで,javafx.util.StringLocalizerクラスを使用して,スクリプトとリソースファイルの結びつきを変更してみましょう。

StringLocalizerクラスにはassociate関数とdissociate関数が定義されています。associate関数がスクリプトとリソースファイルの結びつけ,dissociate関数が切り離しを行います。

associate関数はオーバロードされており,パッケージ単位ごとにリソースファイルを割り当てることと,1つのスクリプトファイルごとにリソースファイルを割り当てることの両方ができます。前者が引数が2つ,後者が引数が3つとなります。

ここでは,後者の引数が3つのものを使用して,図5のようにリソースファイルをデフォルトの位置とは違うresourcesディレクトリに置いてみましょう。

図5 リソースファイルの構成

図5 リソースファイルの構成

この変更に伴うスクリプトの変更は,リスト8にある1行をスクリプトの先頭に付け加えるだけです。

リスト8

// スクリプトファイルとリソースファイルを結びつける
StringLocalizer.associate("resources/worldClock", "", "worldClock.fx");

associate関数の第1引数がリソースファイルの場所を示しています。実際のリソースファイル名はresources/worldClock_xx.fxpropertiesとなります(xxの部分は言語を示します)⁠第2引数がパッケージ,第3引数がスクリプトファイルを示します。ここでは,パッケージを使用していないので,空文字にしてあります。

また,StringLocalizerクラスでも文字列の置き換えを行うことができます。たとえば,都市名をStringLocalizerクラスを使用して言語ごとに置き換えする場合,リスト9のように記述します。

リスト9

var cities = ["New York", "Paris", "Tokyo"];
 
var localizer = StringLocalizer { key: cities[0] }
println("New York: {localizer.localizedString}");
 
localizer.key = cities[1];
println("Paris: {localizer.localizedString}");
 
localizer.key = cities[2];
println("Tokyo: {localizer.localizedString}");

StringLocalizerオブジェクトのkeyアトリビュートにキーとなる文字列を指定すると,localizedStringアトリビュートに言語ごとに置き換えられた文字列を取得することができます。

著者プロフィール

櫻庭祐一(さくらばゆういち)

横河電機に勤務するかたわらJava in the Boxにて新しい技術を追い続けています。JavaOneは今年で11年目。名実共にJavaOneフリークと化しています。

コメント

コメントの記入