如何设置资源包"On-The-Fly"?

Ulr*_*use 2 xsp xpages

我有一个组合框,用户可以选择一种可用的语言.该应用程序包含每种语言的属性文件.在页面的资源部分中,根据用户配置文档中的语言标记(DE,EN ...)计算资源包.

有没有简单的方法根据组合框的值更改onChange事件中的语言?我想到了context.setProperty(???).有什么建议吗?

Sve*_*ach 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>
Run Code Online (Sandbox Code Playgroud)

然后你必须使用像这样的阶段监听器:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以添加查找/等以访问"getLanguag()"方法中的用户配置文件.

希望这有助于斯文