#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, но также обновляет всю страницу, так что это не оптимальное решение, но оно работает.