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 anyo开发者_运维技巧ne see the problem? Please help.
You're setting it with the value of getLanguage()
which returns the current UIViewRoot
locale or otherwise just en
. It does not return the selected language value.
You need to revise the logic in your bean. Here's a rewrite:
@ManagedBean(name="langListing")
@ViewScoped
public class LangListing implements Serializable {
private List<SelectItem> languages = new ArrayList<SelectItem>();
private String language;
public LangListing() {
languages.add(new SelectItem("en", FacesUtil.getResourceBundle().getString("LANG_LABEL_01"))); // English
languages.add(new SelectItem("fr", FacesUtil.getResourceBundle().getString("LANG_LABEL_02"))); // French
language = FacesContext.getCurrentInstance().getViewRoot().getLocale().toString();
}
public List<SelectItem> getLanguages() {
return languages;
}
public String getLanguage() {
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(language));
}
}
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 a Locale
, not String
). I'd warmly recommend to get yourself through this answer to align it out.
精彩评论