我正在本地化我相对简单的JavaFx应用程序。 "手动" (即我不使用SceneBuilder或其他任何东西)。现在,我想添加对动态本地化的支持,以便用户无需重新启动应用程序即可应用更改。
我的应用中唯一需要以这种方式进行本地化的部分是工具提示。 (我使用了很多ControlsFX对话框,每次都会重新创建它们,所以那里没有问题......)
我之前没有使用过JavaFx绑定系统,但我确信它可以使这个任务变得非常简单。
目前,我只是设置工具提示,如下所示:
myButton.setTooltip(new Tooltip(Utils.i8n("mybutton")));
我已经阅读了一些有关JavaFx绑定的内容,但我似乎对我的选择数量感到不知所措!我将如何继续(ab)使用绑定系统帮助我本地化这些工具提示"动态"?
感谢。
答案 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());