Java 单击国际化按钮后如何重新加载Vaadin中的组件?

Java 单击国际化按钮后如何重新加载Vaadin中的组件?,java,internationalization,vaadin,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 { // sess

我在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;
    }
我可以从任何地方调用这个方法来使用这个
getText()
方法。 我的组件他们通过如下方式调用此方法获得国际化文本:
label.setCaption(Internationalization.getText(“Willkommen”)

我现在有两个按钮“DE”和“EN”,分别对应德语和英语。在该按钮的ClickListener中,我将新区域设置如下:

    btnLanguageDE.addClickListener(e -> {
VaadinServletService.getCurrentServletRequest().getSession().setAttribute("locale", new Locale("de", "DE"));
        });
问题是,如果我点击按钮,他们设置了本地,但没有在页面上重新加载组件。只有手动重新加载页面时,它才会更改。 我试图调用这个
UI.getCurrent().getPage().getLocation()但没有效果


如何用实际的语言环境重新加载组件?

我确实建议重新加载页面,
UI.getCurrent().getPage().reload()
我确实建议重新加载页面,
UI.getCurrent().getPage().reload()
vaadin有一个很好的用法

首先,您似乎已经实现了自己的逻辑,即如何使用国际化类访问翻译后的标签。
瓦丁已经实施了这一计划;您可以让您的国际化类实现
I18NProvider
(如果您使用的是Spring,则使用@Component对其进行注释。如果不是,您需要以某种方式注册它,我认为链接的文档会解释如何注册),并将您的方法名从
getText
更改为
getTranslation
。每个Vaadin组件(因此在每个视图中,因为视图类必须扩展一个组件)都可以调用
getTranslation(keyString)获取并使用
i18n提供程序的地方。
所有这些都是可选的,因为您已经自己进行了类似的实现。但这样做是最好的做法


现在谈谈您的实际问题-您需要让每个具有可翻译字符串的视图
实现LocaleChangeObserver
。这将强制视图实现方法
localeChange(LocaleChangeEvent事件)
,该方法在更改UI的区域设置时自动调用。 在
localeChange
方法中,您可以重新设置所有已翻译的文本。
无需刷新页面

public void localeChange(LocaleChangeEvent event){
    label.setCaption(getTranslation("Willkommen"));
}
您可以按如下方式更改UI的区域设置:

UI.getCurrent().setLocale(myNewLocale);
我已经在中共享了我的语言选择代码-我想您会发现示例代码是相关的,因为我的
Select
组件有一个valueChangeListener,它设置了一个新的区域设置-它直接触发
localeChange

瓦丁有很好的疗效

首先,您似乎已经实现了自己的逻辑,即如何使用国际化类访问翻译后的标签。
瓦丁已经实施了这一计划;您可以让您的国际化类实现
I18NProvider
(如果您使用的是Spring,则使用@Component对其进行注释。如果不是,您需要以某种方式注册它,我认为链接的文档会解释如何注册),并将您的方法名从
getText
更改为
getTranslation
。每个Vaadin组件(因此在每个视图中,因为视图类必须扩展一个组件)都可以调用
getTranslation(keyString)获取并使用
i18n提供程序的地方。
所有这些都是可选的,因为您已经自己进行了类似的实现。但这样做是最好的做法


现在谈谈您的实际问题-您需要让每个具有可翻译字符串的视图
实现LocaleChangeObserver
。这将强制视图实现方法
localeChange(LocaleChangeEvent事件)
,该方法在更改UI的区域设置时自动调用。 在
localeChange
方法中,您可以重新设置所有已翻译的文本。
无需刷新页面

public void localeChange(LocaleChangeEvent event){
    label.setCaption(getTranslation("Willkommen"));
}
您可以按如下方式更改UI的区域设置:

UI.getCurrent().setLocale(myNewLocale);

我已经在中共享了我的语言选择代码-我想您会发现示例代码是相关的,因为我的
Select
组件有一个valueChangeListener,它设置了一个新的区域设置-它直接触发
localeChange

您应该看看I18N教程。你可以在这里找到它们:


干杯,斯文你应该看看I18N教程。你可以在这里找到它们:


Cheers Sven

它加载新页面但不更改文本。它加载新页面但不更改文本。