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



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

中的文档中。

所以我在beforePageLoad

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

的问题是,如果我不做上下文。reloadPage语言未设置

但上下文。reloadPage在加载页面时给出了所有其他问题我需要找到一个更好的方法。

我可以在不重新加载页面的情况下设置页面语言

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

文档是:XPages中的语言环境使用:以编程方式设置语言环境

希望我已经正确地得到了它,只是扩展我的回答到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>

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

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

如果您使用ViewHandler,就像Jesse Gallagher在OpenNTF上的Scaffolding框架一样,它可能会工作。但是,在调用super.createView()之前,您肯定需要识别语言。

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

设置一个阶段侦听器,根据用户的配置设置适当的区域设置。

请参阅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;
    }
}

相关内容

  • 没有找到相关文章

最新更新