2012-03-15 58 views
2

我有一個組合框,用戶可以選擇一種可用的語言。該應用程序包含每種語言的屬性文件。 在頁面的資源部分,根據用戶配置文檔中的語言標記(DE,EN ...)計算資源束。如何設置資源包「即時」?

是否有任何簡單的方法根據組合框的值更改onChange事件中的語言?我想到了context.setProperty(???)。 有什麼建議嗎?

回答

5

要實現此應用程序範圍,您可以使用階段偵聽器。在此示例中,要使用的語言環境存儲在名爲「Language」的sessionScope變量中。

只需將一個組合框添加到包含所有允許的語言環境的XPage中。

<xp:comboBox id="comboBox1" value="#{sessionScope.Language}"> 
    <xp:selectItem itemLabel="Chinese" itemValue="zh"></xp:selectItem> 
    <xp:selectItem itemLabel="German" itemValue="de"></xp:selectItem> 
    <xp:selectItem itemLabel="Turkish" itemValue="tr"></xp:selectItem> 
    <xp:eventHandler event="onchange" submit="true" refreshMode="complete" /> 
</xp:comboBox> 

然後,你必須使用一個階段監聽器像這樣的:

package ch.hasselba.xpages.jsf.core; 

import javax.faces.context.FacesContext; 
import javax.faces.application.Application; 
import javax.faces.event.PhaseEvent; 
import javax.faces.event.PhaseId; 
import javax.faces.event.PhaseListener; 
import javax.faces.component.UIViewRoot; 
import java.util.Locale; 
import java.util.Map; 

public class LocalizationSetter implements PhaseListener { 

    private static final long serialVersionUID = -1L; 
    private static final String scopeVarName = "Language"; 
    private static final String scopeName = "sessionScope"; 

    public void afterPhase(PhaseEvent event) {} 

    public void beforePhase(PhaseEvent event) { 
     FacesContext facesContext = event.getFacesContext(); 
     UIViewRoot view = facesContext.getViewRoot(); 
     view.setLocale(getLanguage(facesContext)) ; 
    } 

    public PhaseId getPhaseId() { 
     return PhaseId.RENDER_RESPONSE; 
    } 

    private Locale getLanguage(FacesContext facesContext){ 
     try{ 
      Application app = facesContext.getApplication(); 
      Object obj = app.getVariableResolver().resolveVariable(facesContext, scopeName); 
      Object lang = ((Map) obj).get(scopeVarName); 
      if(lang != null){ 
       return new Locale((String) lang); 
      } 
     }catch(Exception e){} 

     return Locale.getDefault(); 
    } 
} 

您可以添加查找/等來訪問「getLanguag()」方法的用戶配置文件。

希望這會有幫助 斯文

+0

太棒了。非常感謝你。 – 2012-03-15 20:23:33

1

我在過去曾經有過一些掙扎,並且還沒有正確解決它。 您可以使用設置語言

context.setLocaleString(「en」); context.reloadPage();

但是如果你想要根據用戶文檔改變語言,我認爲你需要將代碼添加到每個beforePageLoad事件中。因爲瀏覽器將始終使用您在html lang =「..」中的設置。資源包還將使用此設置中的語言

我有一些問題無法手動重新加載或重新加載兩次。 您還可以嘗試使用phaselistener更改lang屬性