Кнопка JSF не обновляет атрибут HTML lang

#jsf #localization #internationalization

Вопрос:

У меня есть интернализация, реализованная на моей странице JSF следующим образом:

 <ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:h="http://xmlns.jcp.org/jsf/html"
                xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
                xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
                xmlns:p="http://primefaces.org/ui">
  <p:outputPanel id="menupanel">
</h:form>
      <p:commandButton value="FI" pt:aria-label="Suomeksi" actionListener="#{language.countryLocaleCodeChanged}" #{view.locale.language eq 'fi'? 'ws-lang-selected' : ''}" update="menupanel"/>
      <p:commandButton value="SV" pt:aria-label="På Svenska" actionListener="#{language.countryLocaleCodeChanged}"  #{view.locale.language eq 'sv'? 'ws-lang-selected' : ''}" update="menupanel"/>
      <p:commandButton value="EN" pt:aria-label="In English" actionListener="#{language.countryLocaleCodeChanged}" #{view.locale.language eq 'en'? 'ws-lang-selected' : ''}" update="menupanel"/>
    </h:form>
  </p:outputPanel>
</ui:composition>
 

На моей основной плате я установил:

  <f:view locale="#{language.localeCode}">
 

И языковой контролер:

         @ManagedBean(name = "language")
    @SessionScoped
    public class LanguageController implements Serializable {
    
      private SessionVariablesBean sessionVariables;
      private String localeCode = "fi_FI";
    
      public String getLocaleCode() {
        return localeCode;
      }
    
      public void setLocaleCode(String localeCode) {
        this.localeCode = localeCode;
      }
    
      public String getLang() {
        return this.localeCode.split("_")[0];
      }
    
      public void countryLocaleCodeChanged(ActionEvent e) {
        String newLocaleValue = e.getComponent().getAttributes().get("value").toString();
        //System.out.println("Locale: "   newLocaleValue);
        String kieli = "FI";
        if (newLocaleValue.equals("FI")) {
          newLocaleValue = "fi_FI";
          kieli = "FI";
          localeCode = "fi";
        }
        if (newLocaleValue.equals("SV")) {
          newLocaleValue = "sv_SE";
          kieli = "SE";
          localeCode = "sv";
        }
        if (newLocaleValue.equals("EN")) {
          newLocaleValue = "en_EN";
          kieli = "EN";
          localeCode = "en";
        }
        //loop country map to compare the locale code
        for (Map.Entry<String, Object> entry
            : countries.entrySet()) {
    
          if (entry.getValue().toString().equals(newLocaleValue)) {
   FacesContext.getCurrentInstance().getViewRoot().setLocale((Locale) entry.getValue());
            this.localeCode = newLocaleValue;
          }
        }
      }
    }
 

Моя проблема в том, что следующий код не обновляет атрибут lang при нажатии кнопок для изменения языка. Как этого добиться? Странно, но когда я просматриваю источник страницы и нажимаю F5, атрибут «lang» обновляется на странице. Я использую FireFox в качестве браузера.

Ответ №1:

Похоже, единственный ответ на эту проблему-добавить тег update=»@all» в командную кнопку. <p:commandButton update="@all"/> Это обеспечивает ожидаемый доход от обновления тега lang, но также обновляет всю страницу, так что это не оптимальное решение, но оно работает.