【问题标题】:Primefaces changing localePrimefaces 更改语言环境
【发布时间】:2012-10-17 12:26:42
【问题描述】:

我有带有用户配置文件设置的表单。这些设置之一是网站的默认语言。当用户更改默认语言设置时,我想更改当前会话的语言环境。 表格处理方法:

@ManagedBean(name="userEditBean")
@RequestScoped
public class UserEditBean {


    @ManagedProperty(value = LanguageBean.INJECTION_NAME)
    private LanguageBean languageMB;

    private AdminUsersEditForm editForm = new AdminUsersEditForm();


    public String changeDefaultLanguage() {
        editForm.getUser().setDefaultLanguage(editForm.getLocaleCode());
        adminUserEditService.update(editForm.getUser());
        languageMB.changeLocale(editForm.getLocaleCode());
        FacesContext context = FacesContext.getCurrentInstance();  
        context.addMessage(null, new FacesMessage(languageMB.translate("user.edit.languageChanged")));
        return "/pages/protected/user/edit.xhtml?faces-redirect=true";
    }

还有changeLocale:

@ManagedBean(name="languageMB")
@SessionScoped
public class LanguageBean implements Serializable {
    public void changeLocale(String newLocaleValue) {
            //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());
                }
            }
        }

DB 中的语言已更改,但站点仍使用旧语言环境。当我从 eventListener 调用 changeLocale 以更改站点语言时,它可以工作,那么问题出在哪里。谢谢。

更新: 我做了一些调试,问题出在ViewHandlingStrategy#createView()就行了:

if (ctx.getViewRoot() != null) {
    locale = ctx.getViewRoot().getLocale();

ctx.getViewRoot() 显然返回 null 并且区域设置未设置 grom getViewRoot()。 但我不知道,我的 viewRoot “丢失”了哪里

【问题讨论】:

  • 为了避免显而易见,你喜欢&lt;f:view locale="#{languageMB.locale}"&gt;,对吧?另见例如stackoverflow.com/questions/4830588/…
  • 我有 。我将其更改为 ,它返回 Locale 实例,但没有区别。

标签: primefaces jsf-2 locale


【解决方案1】:

我想您的语言环境 bean 是 @SessionScoped bean,对吧?

如果是这样,您还应该:

  • 在您的根模板或所有页面中设置区域设置,以防您不使用模板:

    <f:view contentType="text/html" locale="#{yourLocaleBean.locale}">
        <h:head>
            <!-- headers here -->
        </h:head>
        <h:body>
            <!-- content here -->
        </h:body>
    </f:view>
    

希望对你有帮助。

【讨论】:

  • LanguageBean 确实有 @SessionScoped 注释。 @all 的更新是不必要的,因为操作结果会执行重定向。使用actionListener 而不是action 毫无意义(这只是调用方法的一种不同方式,而不是具体问题的潜在解决方案,另请参见stackoverflow.com/questions/3909267/…)。
  • @BalusC 谢谢,由于某些奇怪的原因,设置区域设置的代码没有显示。我已经确定了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
相关资源
最近更新 更多