3

这个问题是JSF 2中较旧的语言切换器实现的后续问题。

问题的实质仍然有效,尽管 PrimeFaces 发布了一些更新的版本,而且我的 JSF 知识比以前好一点。

总而言之,我有一个完全 ajaxified 的 xhtml 页面。

语言切换器是这样的:

<h:form id="selectLanguage" >
    <p:commandLink action="#{languageSwitcher.setLanguage('it')}" rendered="#{languageSwitcher.language!='it'}" >
        <h:graphicImage library ="images" name="it.gif" title="it" />
    </p:commandLink>
    <p:commandLink action="#{languageSwitcher.setLanguage('en')}" rendered="#{languageSwitcher.language!='en'}" >
        <h:graphicImage library ="images" name="en.gif" title="en" />
    </p:commandLink>
</h:form>

我希望当it被选中时,只en显示标志,反之亦然。我希望网页中的所有内容都使用资源包翻译进行更新。

特别是,我有一些p:dialogS 的标头属性也需要更新。对话框表单位于每个对话框内:

<p:dialog header="#{msgs.myHeader}"  ... >
    <h:form .... />
</p:dialog >

页面的其余部分是<p:layout>包含一些 layoutUnits 的。每个都layoutUnit包含一个带有其他组件的表单,这些组件也需要翻译。

LanguageSwitcher 是一个SessionScoped JSF Managed Bean.

我已经尝试了以下所有方法:

  1. <f:ajax render="@all" />p:commandLink大括号里面
  2. update="@all"里面的属性p:commandLink
  3. <p:ajax update="@all" />p:commandLink大括号里面

不幸的是,它们都不起作用。

我已经尝试过@all,虽然我可以插入表单的 id,但它们并不多。问题是对话框标题没有以这种方式更新。

我正在使用 PrimeFaces 3.4.1 - Mojarra 2.1.13

4

1 回答 1

1

update="@all"到目前为止,所有 PrimeFaces 版本(3.4.2)都在 IE 中失败。与 ajax 响应一起交付的任何 JavaScript 代码都未正确初始化。

这在此 PrimeFaces 论坛主题中进行了讨论,并报告为问题 4731

在他们修复它之前,最好的办法是通过在每个(可能)包含update="@all"命令的视图上加载以下 JavaScript 片段来解决它:

var originalPrimeFacesAjaxResponseFunction = PrimeFaces.ajax.AjaxResponse;
PrimeFaces.ajax.AjaxResponse = function(responseXML) {
   var newViewRoot = $(responseXML.documentElement).find("update[id='javax.faces.ViewRoot']").text();

    if (newViewRoot) {
       $('head').html(newViewRoot.substring(newViewRoot.indexOf("<head>") + 6, newViewRoot.indexOf("</head>")));
       $('body').html(newViewRoot.substring(newViewRoot.indexOf("<body>") + 6, newViewRoot.indexOf("</body>")));
    } else {
        originalPrimeFacesAjaxResponseFunction.apply(this, arguments);
    }
};

以 JS 文件的形式提供此文件,该文件由<h:outputScript target="head">内部加载,<h:body>以强制执行正确的加载顺序。

<h:body>
    <h:outputScript name="script.js" target="head" />
    ...
</h:body>
于 2012-11-26T20:33:03.483 回答