JSF语言切换器和ajax更新

时间:2012-11-25 15:41:49

标签: ajax jsf primefaces facelets

这个问题是旧版Language switcher implementation in JSF 2的后续跟进。

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

总结一下,我有一个单独的xhtml页面,完全被ajaxified。

语言切换器是:

<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 标志,反之亦然。我希望网页中的所有内容都使用Resource Bundle翻译进行更新。

特别是,我有一些p:dialog S,其标题属性也需要更新。 对话框表单位于每个对话框中:

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

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

LanguageSwitcher是SessionScoped JSF Managed Bean

我尝试了以下所有方法:

    {li> <f:ajax render="@all" />p:commandLink大括号内 {li> update="@all" p:commandLink 内的属性 {li> <p:ajax update="@all" />p:commandLink大括号内

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

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

    我正在使用PrimeFaces 3.4.1 - Mojarra 2.1.13

1 个答案:

答案 0 :(得分:1)

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

这在this PrimeFaces forum topic中讨论,并报告为issue 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);
    }
};

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

<h:body>
    <h:outputScript name="script.js" target="head" />
    ...
</h:body>