开发者

JSF 2 - Ajax - Locale not updated [duplicate]

开发者 https://www.devze.com 2023-02-11 11:44 出处:网络
This question already has answers here: Localization in JSF, how to remember selected locale per session instead of per request/view
This question already has answers here: Localization in JSF, how to remember selected locale per session instead of per request/view (5 answers) Closed 7 years ago.

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消