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

Я использую интернационализацию 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();, но безрезультатно.

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 213
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

он загрузил новую страницу, но не изменил текст.

sulox32 29.05.2019 11:58
Ответ принят как подходящий

Есть хороший документация по интернационализации/локализации с ваадином.

Во-первых, вы, кажется, реализовали свою собственную логику, как вы можете получить доступ к переведенным меткам с помощью своего класса интернационализации. Ваадин уже реализовал это; вы можете позволить своему классу интернационализации реализовать 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.

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

Привет Свен

Другие вопросы по теме