我有一個組合框,用戶可以選擇一種可用的語言。該應用程序包含每種語言的屬性文件。 在頁面的資源部分,根據用戶配置文檔中的語言標記(DE,EN ...)計算資源束。如何設置資源包「即時」?
是否有任何簡單的方法根據組合框的值更改onChange事件中的語言?我想到了context.setProperty(???)
。 有什麼建議嗎?
我有一個組合框,用戶可以選擇一種可用的語言。該應用程序包含每種語言的屬性文件。 在頁面的資源部分,根據用戶配置文檔中的語言標記(DE,EN ...)計算資源束。如何設置資源包「即時」?
是否有任何簡單的方法根據組合框的值更改onChange事件中的語言?我想到了context.setProperty(???)
。 有什麼建議嗎?
要實現此應用程序範圍,您可以使用階段偵聽器。在此示例中,要使用的語言環境存儲在名爲「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()」方法的用戶配置文件。
希望這會有幫助 斯文
我在過去曾經有過一些掙扎,並且還沒有正確解決它。 您可以使用設置語言
context.setLocaleString(「en」); context.reloadPage();
但是如果你想要根據用戶文檔改變語言,我認爲你需要將代碼添加到每個beforePageLoad事件中。因爲瀏覽器將始終使用您在html lang =「..」中的設置。資源包還將使用此設置中的語言
我有一些問題無法手動重新加載或重新加載兩次。 您還可以嘗試使用phaselistener更改lang屬性
太棒了。非常感謝你。 – 2012-03-15 20:23:33