プロパティファイルが暗黙的に読み込まれた

昨日のエントリ でうまくいかないって言ってたのが解決しました。
原因はもうちょっとちゃんと読めば良かったってこと。(^^;


技術的にはしっかりとした規約があって、それに従うことで正しく暗黙的に読み込むことができる。
JavaFX でも Convention over Configuration の Convention みたいな感じ。
で、実際には JavaFX スクリプトのファイルと、プロパティファイルを同じパッケージに配置し、ファイル名のプリフィックスを一緒にしなければならなかったということと、_ja などの言語をあらわす言語コードがプロパティファイル名のプリフィックスの後に必要だった。
ファイルのサフィックスはそれぞれ JavaFX のソースが .fx で、プロパティファイルを .fxproperties にする。


hello.prop_example.fx

package hello;

function run(args : String[]) {
    var foo = ##"foo";
    var am = ##"am";
    var i = ##"i";
    println("foo: {foo}");
    println("am: {am}");
    println("i: {i}");
}


hello/prop_example_ja.fxproperties

"foo" = "ふう"
"am" = "あむ"
"i" = "あい"
"bar" = "ばあ"
"baz" = "ばず"


実行結果(1)

foo: ふう
am: あむ
i: あい


なので Java の ResourceBundle でローカライズするのと同じようなものですな。
(どおりで先のブログ記事のタイトルが「JavaFX Localization」となっているわけだ。悪い癖の発生だ)


参考にさせてもらったブログ記事には更に続きがあって、スクリプトファイルやプロパティファイル、それからパッケージの指定を任意に設定することもできることが書かれている。
今度は Configuration てわけで、これは JavaFX のソース側で指定する。
http://blogs.sun.com/naoko/entry/javafx_localization_part_3_specifying


hello.prop_example2.fx

package hello;

import javafx.util.StringLocalizer;

function run(args : String[]) {
    StringLocalizer.associate("hello.props.prop_example_desuyo", "hello");
    var foo = ##"foo";
    var am = ##"am";
    var i = ##"i";
    println(foo);
    println(am);
    println(i);
}


hello/props/prop_example_desuyo_ja.fxproperties

"foo" = "風"
"am" = "あむ"
"i" = "あい"
"bar" = "おばあさん"
"baz" = "おばずさん"


実行結果(2)

foo: 風
am: あむ
i: あい


StringLocalizer.associate() は第一引数でプロパティファイルを指定して、第二引数にはスクリプトのパッケージ名を指定する。
更に別のシグネチャの associate() メソッドもあるので、それは上のブログ記事を参照すべし。


それからプロパティファイルの記述の注意点として、キーと値はダブルクオートでくくるのがルールみたい。
省略すると

2009/01/27 20:59:31 com.sun.javafx.runtime.util.FXPropertyResourceBundle log
警告: 'f' (U+0066) is incorrectly placed in line 1 of hello/prop_example_ja.fxproperties

や、

2009/01/27 21:00:08 com.sun.javafx.runtime.util.FXPropertyResourceBundle log
警告: 'ふ' (U+3075) is incorrectly placed in line 1 of hello/prop_example_ja.fxproperties

のように警告が出て、結果は

foo: foo
am: am
i: i

のようになりプロパティは読み込まれず、##foo の foo がリテラルで出力される。


というわけで、今回の教訓は

  1. JavaFXローカライズの仕組みは便利だな
  2. チュートリアルは最後までしっかり読めよ

の2点でした。以上です。