如何在Xpages中设置用户定义的语言

时间:2015-10-22 12:28:53

标签: java xpages lang facescontext

在我的xpage中,我需要在页面加载之前设置用户定义的语言。要设置的语言存储在数据库中的文档中

所以我在beforePageLoad

中这样做
var lang = getUserDoc().getItemValueString("Language")
facesContext.getViewRoot().setLocale(new java.util.Locale(lang));
context.reloadPage();

问题是,如果我不做context.reloadPage,则不设置语言。

但context.reloadPage在加载页面时会出现所有其他问题 我需要找到一个更好的方法。

无论如何,我可以在不重新加载页面的情况下设置页面的语言。

4 个答案:

答案 0 :(得分:2)

此文档建议使用context.setLocale / setLocaleString而不是viewRoot.setLocale。优点是上下文区域设置用于浏览器会话的其余部分。在加载任何后续viewRoot时,上下文区域设置将被设置为viewRoot区域设置,因此您不必为每个页面重新设置区域设置。它仍然需要一个context.reloadPage作为当前的viewRoot,所以它不完全是你要求的。

该文件是: Locale use in XPages: Programmatically setting the locale

答案 1 :(得分:1)

问题是beforePageLoad运行得太晚 - 组件已经使用相关语言加载到组件树中。

如果您使用ViewHandler,可能会有效,就像在OpenNTF上使用Jesse Gallagher的脚手架框架一样。在调用super.createView()之前,您肯定需要识别语言。

要使用beforePageLoad,我认为您随后需要遍历控件并修改标签等。

答案 2 :(得分:1)

设置一个阶段监听器,根据用户的配置设置适当的语言环境。

有关详细信息,请参阅Sven Hasselbach撰写的此博客文章:http://hasselba.ch/blog/?p=649

我在几个应用程序中使用此方法,使用基于Sven方法的以下阶段侦听器。代码从用户bean读取语言环境:

public class LocalizationSetter implements PhaseListener {

    private static final long serialVersionUID = -1L;

    public void afterPhase(PhaseEvent event) {
    }

    public void beforePhase(PhaseEvent event) {
        FacesContext facesContext = event.getFacesContext();
        UIViewRoot view = facesContext.getViewRoot();
        view.setLocale(User.get().getLocale());
    }

    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }
}

答案 3 :(得分:1)

希望我能正确理解,只需将我的答案扩展到Per Henrik的解决方案(基于最后的评论),正确设置资源包可能只是计算它?像这样的东西?

<xp:this.resources>
        <xp:bundle var="application">
            <xp:this.src><![CDATA[#{javascript:if(context.getLocale()=="en_US")
return "/application.properties";
else
return "/application_de.properties";}]]></xp:this.src>
        </xp:bundle>
    </xp:this.resources>

我刚刚在这里使用了上下文变量,但我确信文档变量也是可访问的。

希望这有帮助。