I have this bean:
@ManagedBean(name="langListing")
@ViewScoped
public class LangListing implements Serializable
{
private List<SelectItem> languages = new ArrayList<SelectItem>();
private String language;
public LangListing() {
createLangs(); // lazy loading
}
public void createLangs()
{
languages.add(new SelectItem("en", FacesUtil.getResourceBundle().getString("LANG_LABEL_01"))); // English
languages.add(new SelectItem("fr", FacesUtil.getResourceBundle().getString("LANG_LABEL_02"))); // French
}
public List<SelectItem> getLanguages() {
return languages;
}
public String getLanguage()
{
if (FacesContext.getCurrentInstance().getViewRoot().getLocale() != null) {
language = FacesContext.getCurrentInstance().getViewRoot().getLocale().toString();
} else {
language = "en";
}
return language;
}
public void setLanguages(List<SelectItem> languages) {
this.languages = languages;
}
public void setLanguage(String language) {
this.language = language;
}
public void changeLocale(AjaxBehaviorEvent event) {
FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale(getLanguage()));
}
}
I’m calling the bean methods from:
<h:selectOneMenu id="selectLang" immediate="true" value="#{langListing.language}">
<f:ajax listener="#{langListing.changeLocale}" render="@form" />
<f:selectItems value="#{langListing.languages}" />
</h:selectOneMenu>
The problem is I can’t get the codes to change locale from English to French. Can anyone see the problem? Please help.
You’re setting it with the value of
getLanguage()which returns the currentUIViewRootlocale or otherwise justen. It does not return the selected language value.You need to revise the logic in your bean. Here’s a rewrite:
Note that there are more potential flaws/holes with this approach. The bean is view scoped instead of session scoped and you don’t seem to be using
<f:view>(since that expects aLocale, notString). I’d warmly recommend to get yourself through this answer to align it out.