【问题标题】:How to implement language support for JavaFX in FXML documents?如何在 FXML 文档中实现对 JavaFX 的语言支持?
【发布时间】:2014-12-07 03:46:03
【问题描述】:

如何为 FXML 文档中的视图设置不同的语言以支持多个国家/地区?

【问题讨论】:

    标签: java xml javafx fxml


    【解决方案1】:

    使用ResourceBundles 存储依赖于语言环境的文本,并使用"%resourceKey" 访问包中的数据。

    具体来说,为您想要支持的每种语言创建文本文件并将它们放在类路径中。 Javadocs for ResourceBundle 包含有关命名方案的详细信息,但您应该有一个由BaseName.properties 定义的默认捆绑包,以及由BaseName_xx.properties 定义的其他语言和变体的捆绑包。例如(使用类路径根目录中的resources 目录):

    资源/UIResources.properties:

    greeting = Hello
    

    资源/UIResources_fr.properties:

    greeting = Bonjour
    

    然后在你的 FXML 文件中你可以做

    <Label text = "%greeting" />
    

    要将ResourceBundle 传递给FXMLLoader,请执行以下操作:

    ResourceBundle bundle = ResourceBundle.getBundle("resources.UIResources");
    FXMLLoader loader = new FXMLLoader(getClass().getResource("/path/to/FXML.fxml"), bundle);
    Parent root = loader.load();
    

    此代码将加载与默认语言环境(通常是您在操作系统级别设置的语言环境)对应的资源包,如果找不到相应的包,则返回默认值。如果你想强制它使用特定的包,你可以这样做

    ResourceBundle bundle = ResourceBundle.getBundle("/resources/UIResources", new Locale("fr"));
    

    最后,如果您需要访问 FXML 控制器中的资源包,您可以将其注入到类型为 ResourceBundle 且名称为 resources 的字段中:

    public class MyController {
    
        @FXML
        private ResourceBundle resources ;
    
        // ...
    }
    

    【讨论】:

    • 我无法将 ResourceBundle 放在 ContextMenu 上。你能帮我吗
    • 其实还有疑惑的人,bundle参数是要放在load方法或者构造函数的调用中作为第二个参数!
    • @AlexandrePieroux 答案没有明确说明吗? "将ResourceBundle 传递给FXMLLoader 做..."
    • 在示例中,它实际上将包传递给 getResource 方法。只是表明示例中存在拼写错误 -> 在逗号之前缺少括号。
    • @AlexandrePieroux 啊,我明白了。谢谢;我修好了。
    猜你喜欢
    • 1970-01-01
    • 2016-08-08
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    相关资源
    最近更新 更多