Как перезагрузить компоненты в Vaadin после нажатия кнопки интернационализации? - PullRequest
1 голос
/ 29 мая 2019

Я использую интернационализацию I18N в Vaadin.У меня есть класс Интернационализация с методом 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"));
        });
btnLanguageEN.addClickListener(e -> {
VaadinServletService.getCurrentServletRequest().getSession().setAttribute("locale", new Locale("en", "EN"));
logger.debug("Internationalization change to: EN"); 
        });

Проблема в том, что если я нажимаю на кнопку, они устанавливают локальный, но не перезагружают компоненты на странице.,Он меняется только если я перезагрузил страницу вручную.Я пытался назвать это UI.getCurrent().getPage().getLocation();, но без эффектов.

Как я могу перезагрузить компоненты с фактической локалью?

Ответы [ 3 ]

3 голосов
/ 29 мая 2019

Имеется хорошая документация по интернационализации / локализации с vaadin.

Прежде всего, вы, кажется, реализовали свою собственную логику, как вы можете получить доступ к переведенным меткам с помощью вашего класса интернационализации.
Ваадин уже реализовал это; вы можете позволить вашему классу интернационализации реализовать I18NProvider (и аннотировать его с помощью @Component, если вы используете Spring. Если нет, вам нужно как-то зарегистрировать его, я думаю, что связанные документы объяснят, как) и изменить имя метода с getText на getTranslation. Каждый компонент Vaadin (следовательно, в каждом представлении, поскольку классы представления должны расширять компонент) может вызывать getTranslation(keyString);, где I18NProvider выбирается и используется.
Все это необязательно, так как вы уже сделали подобные реализации самостоятельно. Но делать это так лучше всего.


Теперь к вашему актуальному вопросу - вам нужно разрешить каждое представление с переводимой строкой implements LocaleChangeObserver. Это заставляет представление реализовать метод localeChange(LocaleChangeEvent event), который автоматически вызывается при изменении локали интерфейса. в методе localeChange вы можете заново установить все переводимые тексты.
Нет необходимости обновлять страницу!

public void localeChange(LocaleChangeEvent event){
    label.setCaption(getTranslation("Willkommen"));
}

Вы можете изменить локаль интерфейса следующим образом:

UI.getCurrent().setLocale(myNewLocale);

Я поделился кодом для выбора языка в другом посте StackOverflow - я думаю, вы найдете соответствующий пример кода, так как у моего Select компонента есть valueChangeListener, который устанавливает новую локаль - которая напрямую триггеры localeChange.

0 голосов
/ 29 мая 2019

вы должны взглянуть на учебники I18N.Вы можете найти их здесь: Vaadin Tutorials - I18N

Cheers Sven

0 голосов
/ 29 мая 2019

Я бы действительно рекомендовал перезагрузить страницу, UI.getCurrent().getPage().reload().

...