JSF中的语言切换器实现

时间:2012-04-18 06:29:03

标签: jsf primefaces

我有一个复杂的jsf页面,其中有一些在PrimeFaces中开发的小部件。到目前为止,应用程序完全被ajaxified,这意味着没有提交,但所有事件和更新都是通过Ajax行为处理的(这不是必须的,而是一个很好的功能)。我还做了SelectOneMenu来切换语言:

<h:form>
    <p:panelGrid columns="2" >
        <h:outputText value="#{msgs.SelectLanguage}" />
        <p:selectOneMenu value="#{languageSwitcher.selectedLanguage}" >
            <f:selectItems value="#{languageSwitcher.languages}" ></f:selectItems>
        </p:selectOneMenu> 
    </p:panelGrid>
</h:form>

切换台效果很好。 我的问题是如何在选择语言时重新加载翻译的消息。

我尝试过这些选项:

选项1

在selectOneMenu中使用ajax更新:

<p:ajax update="myFormsTobeUpdated" ></p:ajax>

这很好用,并且是首选解决方案,因为它是Ajax,但

EDITED

此解决方案不会更新PrimeFaces TabView中的Tab标题,这就是阻塞问题,因为Tab标题需要翻译。

选项2

在Javascript中完全重新加载页面。我试过这个但是没有用(不能说明原因):

<p:selectOneMenu value="#{languageSwitcher.selectedLanguage}" onchange="window.location.reload()" >

选项3

用Java完全重新加载页面,如下所示:https://stackoverflow.com/a/1821708/870122(说实话我还没有尝试过,但很快就会做到!)

欢迎任何建议。

3 个答案:

答案 0 :(得分:3)

如果您至少使用PrimeFaces 3.2,则可以使用

<p:ajax update="@all" />

更新整个视图。在此版本之前,不支持@all

答案 1 :(得分:0)

由于选项1 ,无法在PrimeFaces TabView中更新Tab标题,我已切换到选项2 ,完全重新加载页面的JavaScript。

使其有效的代码是:

<h:form id="selectLanguage">
    <p:panelGrid columns="2">
        <h:outputText value="#{msgs.SelectLanguage}" />
        <p:selectOneMenu value="#{languageSwitcher.selectedLanguage}" onchange="document.getElementById('selectLanguage').submit();" >
            <f:selectItems value="#{languageSwitcher.languages}" ></f:selectItems>
        </p:selectOneMenu> 
    </p:panelGrid>
</h:form>

答案 2 :(得分:0)

在您的表格中:

<h:selectOneRadio   value="#{localeBean.language}"
                        onchange="submit()">
                        <f:selectItems value="#{collection.listLangs()}" var="s"
                            itemLabel="${s.description}" itemValue="${s.code}" />
                    </h:selectOneRadio>

但你没有收藏品(记住,你的表格):

<h:selectOneMenu value="#{localeBean.language}"
                                        onchange="submit()">
                                        <f:selectItem itemValue="en" itemLabel="English" /> 
                                        <f:selectItem itemValue="es" itemLabel="Español" />
                                    </h:selectOneMenu>

在Primefaces中,使用:p:selectOneMenu

在你的Bean中:

import java.lang.invoke.MethodHandles;
import java.util.Locale;
import java.util.ResourceBundle;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

@ManagedBean
@SessionScoped
public class LocaleBean {

    private static final Logger LOG = LogManager.getLogger(MethodHandles.lookup().lookupClass());

    private Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();

    public Locale getLocale() {
        return locale;
    }

    public String getLanguage() {
        return locale.getLanguage();
    }

    public void setLanguage(String language) {
        LOG.info("Vamos a Cambiar a: " + language);
        locale = new Locale(language);
        LOG.info("Vamos a Cambiar a: " + locale.getDisplayName() + FacesContext.getCurrentInstance().getViewRoot());
        FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);
    }



}