0

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

所以我在 beforePageLoad 中这样做

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

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

但是 context.reloadPage 在加载页面时会出现各种其他问题,因此我需要找到更好的方法。

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

4

4 回答 4

2

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

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

于 2015-10-27T14:48:10.677 回答
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>

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

希望这可以帮助。

于 2015-10-23T08:03:38.653 回答
1

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

如果您使用 , 它可能会起作用ViewHandler,例如 Jesse Gallagher 在 OpenNTF 上的 Scaffolding 框架。不过,您肯定需要在调用之前识别语言super.createView()

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

于 2015-10-22T14:04:47.417 回答
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;
    }
}
于 2015-10-22T14:14:40.710 回答