sul*_*x32 1 java internationalization vaadin
我在 Vaadin 使用国际化 I18N。我有一个带有 getText 方法的国际化类。
public static String getText(String key) {
String returnValue = "";
String value = "";
String space = " ";
Locale locale = new Locale("de", "DE");
try {
// session specific locale stored in attribute "locale"
// if you want add a new language then add a new else if with the
// new Locale like ("fr", "FR").
if (VaadinServletService.getCurrentRequest() != null) {
if ((Locale) VaadinServletService.getCurrentServletRequest().getSession().getAttribute("locale") != null) {
if (VaadinServletService.getCurrentServletRequest().getSession().getAttribute("locale").toString().equals("en_EN")) {
locale = new Locale("en", "US");
} else if (VaadinServletService.getCurrentServletRequest().getSession().getAttribute("locale").toString().equals("de_DE")) {
locale = new Locale("de", "DE");
}
}
}
ResourceBundle bundle = ResourceBundle.getBundle(baseName, locale);
value = bundle.getString(key);
returnValue = new String(value.getBytes("ISO-8859-1"), "UTF-8");
} catch (MissingResourceException e) {
// Missing key
try {
// return the Key
String keyString = key.replace("_", space);
returnValue = new String(keyString.getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return returnValue + space;
}
Run Code Online (Sandbox Code Playgroud)
我可以从任何地方调用这个方法来使用这个getText()方法。我的组件通过调用此方法获得国际化文本,如下所示:
label.setCaption(Internationalization.getText("Willkommen"));
我现在有两个按钮“DE”和“EN”,分别用于德语和英语。在此按钮的 ClickListener 中,我设置新的区域设置,如下所示:
btnLanguageDE.addClickListener(e -> {
VaadinServletService.getCurrentServletRequest().getSession().setAttribute("locale", new Locale("de", "DE"));
});
Run Code Online (Sandbox Code Playgroud)
btnLanguageEN.addClickListener(e -> {
VaadinServletService.getCurrentServletRequest().getSession().setAttribute("locale", new Locale("en", "EN"));
logger.debug("Internationalization change to: EN");
});
Run Code Online (Sandbox Code Playgroud)
问题是,如果我单击按钮,它们会设置本地但不会重新加载页面上的组件。仅当我手动重新加载页面时它才会改变。我试图调用这个UI.getCurrent().getPage().getLocation();但没有效果。
如何使用实际区域设置重新加载组件?
有一个关于vaadin国际化/本地化的很好的文档。
首先,您似乎已经实现了自己的逻辑,如何使用国际化类访问翻译的标签。
Vaadin 已经实现了这一点;你可以让你的 Internationalization 类实现I18NProvider(如果你使用 Spring,则用 @Component 注释它。如果没有,你需要以某种方式注册它,我认为链接的文档解释了如何注册)并将你的方法名从 更改getText为getTranslation。每个 Vaadin 组件(因此在每个视图中,因为视图类必须扩展组件)都可以调用获取和使用的getTranslation(keyString);位置。所有这些都是可选的,因为您已经自己进行了类似的实现。但这样做将是最佳实践。I18NProvider
现在回答您的实际问题 - 您需要让每个视图都有可翻译的字符串implements LocaleChangeObserver。这会强制视图实现当 UI 区域设置更改时自动localeChange(LocaleChangeEvent event)调用的方法。在该方法中,您可以重新设置所有已翻译的文本。无需刷新页面!localeChange
public void localeChange(LocaleChangeEvent event){
label.setCaption(getTranslation("Willkommen"));
}
Run Code Online (Sandbox Code Playgroud)
您可以像这样更改 UI 的区域设置:
UI.getCurrent().setLocale(myNewLocale);
Run Code Online (Sandbox Code Playgroud)
我在另一篇 StackOverflow 帖子中分享了我的语言选择的代码- 我想您会发现相关的示例代码,因为我的Select组件有一个 valueChangeListener 设置一个新的 Locale - 它直接触发localeChange.
| 归档时间: |
|
| 查看次数: |
2589 次 |
| 最近记录: |