2

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

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

4

2 回答 2

5

要在整个应用程序范围内实现此应用程序,您可以使用阶段侦听器。在此示例中,要使用的语言环境存储在名为“Language”的 sessionScope 变量中。

只需将一个组合框添加到您的 XPage(s) 中,其中包含所有允许的语言环境。

<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()”方法中访问用户配置文件。

希望这有助于斯文

于 2012-03-15T19:09:37.467 回答
1

我过去曾为此苦苦挣扎,但仍未正确解决。您可以使用设置语言

context.setLocaleString("en"); context.reloadPage();

但是如果您希望根据用户文档更改语言,我认为您需要将代码添加到您拥有的每个 beforePageLoad 事件中。因为浏览器将始终使用您在 html lang=".." 中的设置,资源包也将使用此设置中的语言

我在不手动重新加载或重新加载两次的情况下让它工作时遇到了一些问题。您还可以尝试使用 phaselistener 更改 lang 属性

于 2012-03-15T08:11:03.843 回答