【问题标题】:Language switcher implementation in JSFJSF 中的语言切换器实现
【发布时间】:2017-08-21 01:31:10
【问题描述】:

我有一个复杂的 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(老实说,我还没有尝试过,但很快就会尝试!)

欢迎提出任何建议。

【问题讨论】:

    标签: jsf primefaces


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,这是一个很好的功能,但不幸的是它在 IE9 中似乎存在渲染问题(选择项目后,小部件冻结)。使用 update="id1,id2" 时问题消失。我会发布一个错误并在此处添加链接
    【解决方案2】:

    在您的表单中:

    <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);
        }
    
    
    
    }
    

    【讨论】:

      【解决方案3】:

      由于使用 Option 1 无法对 PrimeFaces TabView 中的 Tab 标题进行 ajax 更新,我已切换到 Option 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>
      

      【讨论】:

        猜你喜欢
        • 2016-10-26
        • 1970-01-01
        • 2023-03-31
        • 2021-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多