我正在构建一个支持多语言的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无法
答案 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));
您已适当设置language
和country
的值。
然后在您需要更新的视图的相应控制器中,设置您的包:
bundle = ResourceBundle.getBundle("resources.bundles.SDBundle", Locale.getDefault());
(将上述命令中的String参数替换为捆绑文件的路径)。
最后,(仍然在您需要更新的视图的控制器中),您开始更新每个gui项目,例如
myLabel.setText(bundle.getString("myLabel"));
这当然需要一些样板工作与bundle文件等以及键和值之间的适当映射。 查看this优秀示例。
我已将上述方法与属性文件结合使用,每次更改时都会存储语言和国家/地区值,以便应用程序每次启动时都会记住上次选择。