单击国际化按钮后如何重新加载Vaadin中的组件?
How to reload the components in Vaadin after click internationalization Button?
我在 Vaadin 中使用国际化 I18N。我有一个国际化 class 方法 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;
}
我可以从任何地方调用这个方法来使用这个 getText()
方法。
我的组件通过调用此方法获得国际化文本,如下所示:
label.setCaption(Internationalization.getText("Willkommen"));
我现在有两个按钮 "DE" 和 "EN" 用于德语和英语。在这个按钮的 ClickListener 中,我像这样设置新的 Locale:
btnLanguageDE.addClickListener(e -> {
VaadinServletService.getCurrentServletRequest().getSession().setAttribute("locale", new Locale("de", "DE"));
});
btnLanguageEN.addClickListener(e -> {
VaadinServletService.getCurrentServletRequest().getSession().setAttribute("locale", new Locale("en", "EN"));
logger.debug("Internationalization change to: EN");
});
问题是,如果我单击按钮,它们会设置本地但不会重新加载页面上的组件。只有当我手动重新加载页面时它才会改变。
我试着调用这个 UI.getCurrent().getPage().getLocation();
但没有效果。
如何使用实际语言环境重新加载组件?
我确实建议重新加载页面,UI.getCurrent().getPage().reload()
。
vaadin 有很好的documentation about internationlization / localization
首先,您似乎已经实现了您自己的逻辑,即如何通过国际化访问已翻译的标签 class。
Vaadin 已经实现了这个;您可以让您的国际化 class 实现 I18NProvider
(如果您使用 Spring,则用 @Component 对其进行注释。如果没有,您需要以某种方式注册它,我认为链接文档解释了如何) 并将您的方法名称从 getText
更改为 getTranslation
。每个 Vaadin 组件(因此在每个视图中,因为视图 classes 必须扩展一个组件)可以调用 getTranslation(keyString);
,其中 I18NProvider
被获取和使用。
所有这些都是可选的,因为您自己已经实现了类似的实现。但这样做是最好的做法。
现在回答您的实际问题 - 您需要让每个具有可翻译字符串的视图 implements LocaleChangeObserver
。这会强制视图实现 localeChange(LocaleChangeEvent event)
方法,当 UI 的区域设置更改时,该方法会自动 调用。
在localeChange
方法中,您可以重新设置所有翻译的文本。
无需刷新页面!
public void localeChange(LocaleChangeEvent event){
label.setCaption(getTranslation("Willkommen"));
}
您可以像这样更改 UI 的语言环境:
UI.getCurrent().setLocale(myNewLocale);
我已经在 another Whosebug post 中分享了我的语言选择代码 - 我想你会发现示例代码相关,因为我的 Select
组件有一个设置新语言环境的 valueChangeListener - 它直接触发器 localeChange
。
您应该看看 I18N 教程。您可以在这里找到它们:Vaadin Tutorials - I18N
干杯斯文
我在 Vaadin 中使用国际化 I18N。我有一个国际化 class 方法 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;
}
我可以从任何地方调用这个方法来使用这个 getText()
方法。
我的组件通过调用此方法获得国际化文本,如下所示:
label.setCaption(Internationalization.getText("Willkommen"));
我现在有两个按钮 "DE" 和 "EN" 用于德语和英语。在这个按钮的 ClickListener 中,我像这样设置新的 Locale:
btnLanguageDE.addClickListener(e -> {
VaadinServletService.getCurrentServletRequest().getSession().setAttribute("locale", new Locale("de", "DE"));
});
btnLanguageEN.addClickListener(e -> {
VaadinServletService.getCurrentServletRequest().getSession().setAttribute("locale", new Locale("en", "EN"));
logger.debug("Internationalization change to: EN");
});
问题是,如果我单击按钮,它们会设置本地但不会重新加载页面上的组件。只有当我手动重新加载页面时它才会改变。
我试着调用这个 UI.getCurrent().getPage().getLocation();
但没有效果。
如何使用实际语言环境重新加载组件?
我确实建议重新加载页面,UI.getCurrent().getPage().reload()
。
vaadin 有很好的documentation about internationlization / localization
首先,您似乎已经实现了您自己的逻辑,即如何通过国际化访问已翻译的标签 class。
Vaadin 已经实现了这个;您可以让您的国际化 class 实现 I18NProvider
(如果您使用 Spring,则用 @Component 对其进行注释。如果没有,您需要以某种方式注册它,我认为链接文档解释了如何) 并将您的方法名称从 getText
更改为 getTranslation
。每个 Vaadin 组件(因此在每个视图中,因为视图 classes 必须扩展一个组件)可以调用 getTranslation(keyString);
,其中 I18NProvider
被获取和使用。
所有这些都是可选的,因为您自己已经实现了类似的实现。但这样做是最好的做法。
现在回答您的实际问题 - 您需要让每个具有可翻译字符串的视图 implements LocaleChangeObserver
。这会强制视图实现 localeChange(LocaleChangeEvent event)
方法,当 UI 的区域设置更改时,该方法会自动 调用。
在localeChange
方法中,您可以重新设置所有翻译的文本。
无需刷新页面!
public void localeChange(LocaleChangeEvent event){
label.setCaption(getTranslation("Willkommen"));
}
您可以像这样更改 UI 的语言环境:
UI.getCurrent().setLocale(myNewLocale);
我已经在 another Whosebug post 中分享了我的语言选择代码 - 我想你会发现示例代码相关,因为我的 Select
组件有一个设置新语言环境的 valueChangeListener - 它直接触发器 localeChange
。
您应该看看 I18N 教程。您可以在这里找到它们:Vaadin Tutorials - I18N
干杯斯文