【问题标题】:Refresh Screen for language change in JavaFXJavaFX 中语言更改的刷新屏幕
【发布时间】:2013-01-15 08:52:13
【问题描述】:

我正在构建一个支持多语言的 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 无法

【问题讨论】:

    标签: java javafx multilingual


    【解决方案1】:

    根据Benefits of FXML,第三点:

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

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

    【讨论】:

    • 谢谢,这就是我目前正在做的事情。但我担心随着 UI 变大,重新加载需要更长的时间。而且我将不得不使用模态重新初始化 UI
    【解决方案2】:

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

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

    您已适当设置 languagecountry 的值。

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      相关资源
      最近更新 更多