2012-04-18 69 views
1

我有一個複雜的jsf頁面,其中包含一些在PrimeFaces中開發的小部件。到目前爲止,該應用程序已完全被渲染,這意味着沒有提交,但所有的事件和更新都是通過Ajax行爲處理的(這不是必須的,而是一個很好的功能)。我也做了SelectOneMenu切換語言:JSF中的語言切換器實現

<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> 

這個偉大的工程,是首選的解決方案,因爲它是阿賈克斯,但是

編輯

此解決方案不會更新PrimeFaces TabView中的Tab標題,並且這是因爲Tab標題需要翻譯而被阻止的問題。

選項2

在JavaScript中的頁面的完整的重新加載。我曾經試過,但不工作(不知道爲什麼):

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

選項3

在Java頁面的完整重載喜歡這裏解釋:https://stackoverflow.com/a/1821708/870122(說實話我還沒有嘗試過,但將盡快!)

歡迎任何建議。

回答

0

由於與選項1這是不可能的Ajax更新的PrimeFaces TabView的選項卡標題,我已經切換到選項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> 
3

如果您正在使用至少PrimeFaces 3.2,那麼你可以使用

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

更新整個視圖。在此版本之前,不支持@all

+0

謝謝,這是一個很好的功能,但遺憾的是它似乎有在IE9渲染問題(選擇項目時,窗口小部件凍結後)。使用update =「id1,id2」時,問題消失。我會發佈一個bug並在這裏添加鏈接 – perissf 2012-04-18 19:37:35

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



}