2015-10-22 28 views
0

在我的xpage中,我需要在页面加载之前设置用户定义的语言。要设置的语言被存放在一个文件在数据库如何在X页面中设置用户定义的语言

所以我在beforePageLoad

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

这样做的问题是,如果我不这样做context.reloadPage语言未设置。

但是当加载页面时,context.reloadPage会给出所有其他问题 我需要找到更好的方法。

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

+0

我我看来是没有办法来设置页面的语言无需重新加载它。你对这个解决方案有什么样的其他问题? –

+0

解释有点复杂。在页面超时后或者重建应用程序后,用户会遇到奇怪的重新加载问题。它造成服务器的大量命中。 –

回答

1

希望我已经正确地得到它,只是在这里延长我的答案,每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> 

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

希望这会有所帮助。

+0

非常感谢秦丹,不明白为什么我没有想过这个!似乎工作得很好,可能是我翻译问题的答案。我会再做一些测试,再次感谢 –

+0

很高兴它有帮助,实际上很容易错过,因为XPages在“所有属性”中隐藏了计算的东西,而不是直接显示它可以在资源选项卡下计算。 –

1

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

如果您使用ViewHandler,如Jesse Gallagher在OpenNTF上的Scaffolding框架中,它可能会有效。但在拨打super.createView()之前,您肯定需要确定语言。

要使用beforePageLoad,我想你会随后需要通过控制迭代和修改标签等等

+0

Sven的代码在设置语言的'ViewHandler'中不起作用,因为'UIViewRoot'只能通过调用'super'来创建。createView()',但是在调用之前需要设置语言。关键是要弄清楚它从哪里获取该语言环境 - 它必须保存在会话范围内的某个地方,否则你会在每个视图上默认使用应用程序的默认语言。 –

1

设置一个阶段侦听器将根据用户的配置相应的语言环境。

见斯文哈塞尔巴赫这篇博客了解更多详情:http://hasselba.ch/blog/?p=649

我在使用基于从斯文的做法下一阶段监听器的几个应用程序这种做法。该代码读取用户豆的语言环境:

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; 
    } 
} 
+0

看起来不错!但是,来自Sven的示例仍然需要重新加载页面,我需要页面在加载页面时设置正确的语言。 –

+0

不需要重新加载。这是一个阶段监听器,在加载过程中进行。我使用这种方法根据配置为匿名用户设置默认语言,并根据用户偏好设置语言。 –

+0

你在哪里设置会话变量,在beforePageLoad?在Svens上的最后一个帖子是: 更改语言后需要全面更新! –

2

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

的文档是: Locale use in XPages: Programmatically setting the locale

相关问题