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

时间:2012-03-15 07:19:15

标签: xpages xsp

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

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

2 个答案:

答案 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属性