Cómo volver a cargar los componentes en Vaadin después de clic de los botones de internacionalización?

sulox32:

Yo uso Internacionalización I18N en Vaadin. Tengo una clase de internacionalización con el método 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;
    }

Puedo llamar a este método de todas partes para utilizar este getText()método. Mis Componentes consiguen un texto de internacionalización con la llamada de este método como este:label.setCaption(Internationalization.getText("Willkommen"));

Tengo ahora dos botones "de" y "en" para los idiomas alemán e inglés. En el ClickListener de estos botones i establecer la nueva configuración regional de la siguiente manera:

    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"); 
        });

El problema es que si hago clic en el botón que establecen el local, pero no se vuelven a cargar los componentes de la página. Se cambia sólo si vuelvo a cargar la página manualmente. Traté de llamar a esto UI.getCurrent().getPage().getLocation();, pero no hay efectos.

¿Cómo puedo volver a cargar los componentes con la configuración regional actual?

kscherrer:

Hay una buena documentación sobre internationlization / localización con vaadin.

En primer lugar, parece que han puesto en marcha su propia lógica de cómo se puede acceder etiquetas traducidas con su clase internacionalización.
Vaadin ya ha implementado este; puede dejar que su clase internacionalización implementar I18NProvider(y anotar con @Component si está usando la primavera. Si no es así, es necesario registrarse de alguna manera creo que los documentos vinculados explican cómo) y cambiar su methodname de getTexta getTranslation. Cada Vaadin de componentes (por lo tanto en todas las vistas, ya que clases de vista deben extender un componente) puede llamar getTranslation(keyString);en el que el I18NProviderse capta y se utiliza.
Todo esto es opcional, ya que ya hizo implementaciones similares a ti mismo. Pero hacerlo así sería la mejor práctica.


Ahora a su pregunta real - Hay que dejar todas las vistas que tiene una cadena traducible implements LocaleChangeObserver. Esto obliga a la vista para poner en práctica el método localeChange(LocaleChangeEvent event)que se llama automáticamente cuando se cambia la configuración regional de la interfaz de usuario. en el localeChangemétodo, se pueden establecer todos los textos de nuevo que se traducen.
No hay necesidad de actualizar la página!

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

Puede cambiar la configuración regional de la interfaz de usuario de la siguiente manera:

UI.getCurrent().setLocale(myNewLocale);

He compartido el código de mi selección de idioma en otro post StackOverflow - Creo que se encuentra el código de ejemplo relevante, ya que mi Selectcomponente tiene un valueChangeListener que establece un nuevo locale - que directa desencadenantes localeChange.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=333190&siteId=1
Recomendado
Clasificación