我有一个组合框,用户可以选择一种可用的语言。该应用程序包含每种语言的属性文件。 在页面的资源部分,资源包是根据用户配置文档中的语言标记(DE,EN ...)计算的。
有没有简单的方法根据组合框的值更改onChange事件中的语言?我想到了context.setProperty(???)
。
有什么建议吗?
答案 0 :(得分: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()”方法中的用户配置文件。
希望这会有所帮助 斯文
答案 1 :(得分:1)
我过去曾经为此苦苦挣扎,但仍然没有正确解决。 您可以使用
设置语言context.setLocaleString( “EN”); context.reloadPage();
但如果您希望根据用户文档更改语言,我认为您需要将代码添加到您拥有的每个beforePageLoad事件中。因为浏览器将始终使用html lang =“..”中的设置资源包也将使用此设置中的语言
我遇到一些问题,无法手动重新加载或重新加载两次。 您还可以尝试使用phaselistener
更改lang属性