JavaFx绑定和本地化

时间:2014-09-11 17:41:07

标签: java localization javafx

我正在本地化我相对简单的JavaFx应用程序。 "手动" (即我不使用SceneBuilder或其他任何东西)。现在,我想添加对动态本地化的支持,以便用户无需重新启动应用程序即可应用更改。

我的应用中唯一需要以这种方式进行本地化的部分是工具提示。 (我使用了很多ControlsFX对话框,每次都会重新创建它们,所以那里没有问题......)

我之前没有使用过JavaFx绑定系统,但我确信它可以使这个任务变得非常简单。

目前,我只是设置工具提示,如下所示:

myButton.setTooltip(new Tooltip(Utils.i8n("mybutton")));

我已经阅读了一些有关JavaFx绑定的内容,但我似乎对我的选择数量感到不知所措!我将如何继续(ab)使用绑定系统帮助我本地化这些工具提示"动态"?

感谢。

1 个答案:

答案 0 :(得分:4)

public class Utils {
    private static final ObjectProperty<Locale> locale = new SimpleObjectProperty<>(Locale.getDefault());
    public static ObjectProperty<Locale> localeProperty() {
        return locale ;
    }
    public static Locale getLocale() {
        return locale.get();
    }
    public static void setLocale(Locale locale) {
        localeProperty().set(locale);
    }

    public static String i18n(String key) {
        return ResourceBundle.getBundle("bundleName", getLocale()).getString(key);
    }
}

然后

myButton.setTooltip(createBoundTooltip("mybutton"));

private Tooltip createBoundTooltip(final String key) {
    Tooltip tooltip = new Tooltip();
    tooltip.textProperty().bind(Bindings.createStringBinding( 
         () -> Utils.i18n(key), Utils.localeProperty()));
    return tooltip ;
}

然后Utils.setLocale(...)应自动更新工具提示文字。你也可以做一些有趣的事情,比如

ComboBox<Locale> languages = new ComboBox<>();
languages.getItems().addAll(new Locale("en"), new Locale("fr"), new Locale("fi"), new Locale("ru"));
languages.setConverter(new StringConverter<Locale>() {
    @Override
    public String toString(Locale l) {
        return l.getDisplayLanguage(l);
    }
    @Override
    public Locale fromString(String s) {
        // only really needed if combo box is editable
        return Locale.forLanguageTag(s);
    }
});

Utils.localeProperty().bind(languages.valueProperty());