4

多言語サポートを備えた JavaFX アプリケーションを構築しています。そのため、次の方法でファイルをロードしfxmlます。

AnchorPane page = (AnchorPane) FXMLLoader.load(Main.class.getResource("fxml/RealTimeInitialPanel.fxml"),Language.getBundle());

デフォルトに基づいてリソースバンドルを渡していますLanguage。上記Languageのクラスは ResourceBundle を拡張し、現在の Locale に基づいて String を返します。言語を変更するには、 を呼び出すだけLanguage.setLocale(..)です。すべてがうまく機能します。

しかし、ユーザーが外出先で言語を変更したとします。画面を更新するように fxml または UI に通知するにはどうすればよいですか。そうすれば、再び呼び出さgetString(..)れ、setLocale に基づいてテキストが更新されます。Swing では、定期的に更新されます。しかし、fx iamではできません

4

2 に答える 2

2

Benefits of FXML ごとに、重要事項 3:

FXML ファイルのコンテンツは、ファイルの読み取り時にローカライズできます。たとえば、FXML ファイルが en_US ロケールを使用してロードされた場合、次のリソース文字列に基づいてラベルの文字列「First Name」が生成されます。ロケールが fr_FR に変更され FXML ファイルが再ロードされた場合、ラベル「プレノム」を表示します。...

したがって、アプリをローカライズすることを目指している場合は、FXMLLoaderFXML にバンドルされたテキストを再読み込みする以外に更新するよう通知することはできないと思います。

于 2013-01-31T19:22:58.317 に答える
0

まず、それぞれのハンドラー (例: ComboBox 言語チューザーの onAction など) で、ロケールを更新する必要があります。例:

Locale.setDefault(new Locale(language, country));

languageとの値を適切に設定した場所country

次に、更新する必要があるビューのそれぞれのコントローラーで、バンドルを設定します。

bundle = ResourceBundle.getBundle("resources.bundles.SDBundle", Locale.getDefault());

(上記のコマンドの String パラメータをバンドル ファイルへのパスに置き換えます)。

最後に、(更新する必要があるビューのコントローラーに残っています)、各 GUI アイテムの更新を開始します。

myLabel.setText(bundle.getString("myLabel"));

もちろん、これにはバンドルファイルなどを使用した定型的な作業と、キーと値の間の適切なマッピングが必要です。この優れた例を確認してください。

前述のアプローチを、言語と国の値が変更されるたびに保存されるプロパティ ファイルと組み合わせて使用​​し、アプリが起動するたびに最後の選択を記憶するようにしました。

于 2014-10-29T17:52:18.783 に答える