お天気ウィジェットでローカライズされたリソースを使う

お天気ウィジェットに、この前覚えた .fxproperties ファイルでローカライズする仕組みを使うようにしてみた。
ローカライズといっても Livedoor お天気Webサービスがそもそも国内向けサービスだけど)


ちなみにこれまでは日本語の文字列を一度、native2ascii して Unicode エスケープをソースに埋め込んでいた。
なぜソースに日本語を直接埋め込むようにしなかったのかというと、NetBeans 6.5 の JavaFX プラグインを使うと、デフォルトのファイルエンコーディングでは、コンパイルできなくなってしまうから。※


まあ何にしろ .fxproperties の仕組みは使うと便利。


resources_ja.fxproperties

"WeatherFX" = "WeatherFX"
"Temperature" = "気温"
"Max" = "最高"
"Min" = "最低"
"Couldn't retrieve forecasts" = "予報を取得できませんでした"
"Configure preference" = "地域の設定"
"Select Area" = "地域(大分類)を選択"
"Select Prefecture" = "地域(中分類)を選択"
"Select City" = "地域(小分類)を選択"
"About WeatherFx" = "WeatherFX について"
"About Forecast" = "天気予報について"


Main.fx

    ...
var resTitle: String;
var resTemperature: String;
var resTempMax: String;
var resTempMin: String;
var resFailure: String;
var resPreference: String;
var resSelectArea: String;
var resSelectPref: String;
var resSelectCity: String;
var resAboutWeatherFX: String;
var resAboutForecast: String;

function run(args : String[]) {
    ...
    StringLocalizer.associate("jp.fooami.weatherfx.resources", "jp.fooami.weatherfx");
    resTitle = ##"WeatherFX";
    resTemperature = ##"Temperature";
    resTempMax = ##"Max";
    resTempMin = ##"Min";
    resFailure = ##"Couldn't retrieve forecasts";
    resPreference = ##"Configure preference";
    resSelectArea = ##"Select Area";
    resSelectPref = ##"Select Prefecture";
    resSelectCity = ##"Select City";
    resAboutWeatherFX = ##"About WeatherFx";
    resAboutForecast = ##"About Forecast";
    return widget;
}
    ...
def widget: Widget = Widget {
    ...
                // temperature 1
                Text {
                    font: regularFont;
                    x: 10,
                    y: 55
                    content: bind resTemperature
                    fill: Color.WHITE
                }
    ...


ついでに詳細な予報を表示するテキストリンクにマウスカーソルが当てられたときに、アンダーラインを表示するように変更した。

宮古島は暖かそう。。。)


他の修正は、Configuration 画面で地域が選択された際の処理をちょっと変更。これは javafx.ext.swing.SwingListItem の value プロパティの型が単なる文字列でなく、Object 型を格納できるので、データオブジェクトを格納するようにした。若干効率が良くなった。


お天気ウィジェット 


※この解決方法は下のページに書かれている。しかし解決すると今度は NetBeans の動作が重くなってしまうらしい。現在 BUG FIX 作業中の様子。
解決方法が説明されたページ
http://gihyo.jp/dev/serial/01/javafx/0002?page=4
重くなってしまうことが書かれた id:skrb さんのエントリ(コメントにはバグレポートについて書かれている)
http://d.hatena.ne.jp/skrb/20081224