刷新JavaFX中语言更改的屏幕

时间:2013-01-31 09:43:24

标签: java javafx multilingual

我正在构建一个支持多语言的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更新文本。在挥杆时,它会定期刷新。但是fx iam无法

2 个答案:

答案 0 :(得分:2)

Benefits of FXML,问题3:

  

可以在读取文件时本地化FXML文件的内容。对于   例如,如果使用en_US语言环境加载FXML文件,那么它   根据以下内容为标签生成字符串“First Name”   资源字符串:如果更改了区域设置   到fr_FR FXML文件重新加载,然后标签显示“Prénom”。 ...

因此,如果您的目标是通过FXMLLoader本地化应用程序,那么除了重新加载它之外,您不能发信号通知FXML刷新其捆绑的文本,我认为。

答案 1 :(得分:0)

首先,在相应的处理程序中(例如,例如ComboBox语言选择器的onAction),您需要更新Locale,例如:

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

您已适当设置languagecountry的值。

然后在您需要更新的视图的相应控制器中,设置您的包:

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

(将上述命令中的String参数替换为捆绑文件的路径)。

最后,(仍然在您需要更新的视图的控制器中),您开始更新每个gui项目,例如

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

这当然需要一些样板工作与bundle文件等以及键和值之间的适当映射。 查看this优秀示例。

我已将上述方法与属性文件结合使用,每次更改时都会存储语言和国家/地区值,以便应用程序每次启动时都会记住上次选择。