1

我有一个复杂的 jsf 页面,其中包含一些在 PrimeFaces 中开发的小部件。到目前为止,应用程序是完全 ajax 化的,这意味着没有提交,但是所有的事件和更新都是通过 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,但是

已编辑

此解决方案不会对 PrimeFaces TabView 中的选项卡标题进行 ajax 更新,这是一个阻塞问题,因为需要翻译选项卡标题。

选项 2

用 Javascript 完全重新加载页面。我已经尝试过了,但不起作用(不知道为什么):

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

选项 3

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

欢迎任何建议。

4

3 回答 3

4

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

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

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

于 2012-04-18T12:29:55.660 回答
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);
    }



}
于 2017-08-20T17:25:29.203 回答
-1

由于使用选项 1无法对 PrimeFaces TabView 中的选项卡标题进行 ajax 更新,因此我已切换到选项 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>
于 2012-04-19T18:43:31.047 回答