2012-04-18 17 views
1

私はPrimeFacesで開発されたウィジェットを含む複雑なjsfページを持っています。今のところ、アプリケーションは完全にajax化されています。つまり、サブミットはありませんが、すべてのイベントと更新はAjaxの動作によって処理されます(これは必須ではありませんが、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> 

スイッチャーがうまく機能:私はまた、言語を切り替えるSelectOneMenuを行っています。 私の問題は、言語を選択したときに翻訳されたメッセージを再読み込みする方法です。

私は、これらのオプションを試してみました:selectOneMenu内部Ajaxのアップデートで

オプション1

<p:ajax update="myFormsTobeUpdated" ></p:ajax> 

これは素晴らしい作品、そしてそれはAjaxのだから好ましい解決策であるが、しかし、

EDITED

このソリューションは、PrimeFaces TabViewでタブのタイトルをajaxで更新しません。これは、タブのタイトルを翻訳する必要があるため、問題がブロックされています。 JavaScriptでページの完全なリロードして

オプション2

。私はこれを試してみましたが、動作しません(理由を伝えることはできません):

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

オプション3

Javaでページの完全なリロードすると、ここで説明したように:https://stackoverflow.com/a/1821708/870122(正直に言うと私はまだそれを試していないが、すぐになります!)

任意の提案を歓迎します。

答えて

0

オプション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> 
3

あなたは少なくともPrimeFaces 3.2で使用している場合は、ビュー全体を更新するために

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

を使用することができます。このバージョン以前は、@allはサポートされていませんでした。

+0

おかげで、これは良い機能ですが、残念ながら(アイテム、ウィジェットがフリーズを選択した後)IE9でのレンダリングの問題を抱えているようです。この問題は、update = "id1、id2"を使用すると消えます。私はバグを投稿し、ここにリンクを追加します – perissf

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> 

プライムフェイスでは、これを使用します。p:selectOneMenu

あなたの豆で


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



} 
関連する問題