プロパティファイルが暗黙的に読み込まれた
昨日のエントリ でうまくいかないって言ってたのが解決しました。
原因はもうちょっとちゃんと読めば良かったってこと。(^^;
技術的にはしっかりとした規約があって、それに従うことで正しく暗黙的に読み込むことができる。
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 がリテラルで出力される。
というわけで、今回の教訓は
の2点でした。以上です。