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 更新文本。在摇摆中,它会定期刷新。但是使用 fx iam 无法

4

2 回答 2

2

根据FXML 的好处,没有 3:

FXML 文件的内容可以在读取文件时进行本地化。例如,如果使用 en_US 语言环境加载 FXML 文件,则它会根据以下资源字符串为标签生成字符串“First Name”: 如果语言环境更改为 fr_FR并且重新加载FXML 文件,则标签显示“Prénom”。...

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

于 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 回答