如何在 Xpages 中设置用户定义的语言
How to set a user defined language in Xpages
在我的 xpage 中,我需要在页面加载之前设置用户定义的语言。要设置的语言存储在数据库中的文档中
所以我在 beforePageLoad
中这样做
var lang = getUserDoc().getItemValueString("Language")
facesContext.getViewRoot().setLocale(new java.util.Locale(lang));
context.reloadPage();
问题是如果我不这样做 context.reloadPage 语言没有设置。
但是 context.reloadPage 在加载页面时会出现各种其他问题,所以
我需要找到更好的方法。
有没有办法在不重新加载页面的情况下设置页面的语言
问题是 beforePageLoad
运行得太晚了 - 组件已经用相关语言加载到组件树中。
如果您使用 ViewHandler
,它可能会起作用,如 Jesse Gallagher 在 OpenNTF 上的脚手架框架。不过,您肯定需要在调用 super.createView()
之前确定语言。
要使用 beforePageLoad
,我认为您随后需要遍历控件并修改标签等。
设置阶段侦听器,根据用户的配置设置适当的语言环境。
有关更多详细信息,请参阅 Sven Hasselbach 的博客 post: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;
}
}
希望我没听错,只是在这里扩展我对 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>
我刚刚在这里使用了上下文变量,但我确信文档变量也可以访问。
希望对您有所帮助。
本文档建议使用 context.setLocale/setLocaleString 而不是 viewRoot.setLocale。优点是上下文区域设置用于浏览器会话的其余部分。当加载任何后续的 viewRoots 时,上下文区域设置将设置为 viewRoot 区域设置,因此您不必为每个页面重新设置区域设置。不过,它仍然需要 context.reloadPage 用于当前的 viewRoot,因此它并不完全符合您的要求。
文档是:
Locale use in XPages: Programmatically setting the locale
在我的 xpage 中,我需要在页面加载之前设置用户定义的语言。要设置的语言存储在数据库中的文档中
所以我在 beforePageLoad
中这样做var lang = getUserDoc().getItemValueString("Language")
facesContext.getViewRoot().setLocale(new java.util.Locale(lang));
context.reloadPage();
问题是如果我不这样做 context.reloadPage 语言没有设置。
但是 context.reloadPage 在加载页面时会出现各种其他问题,所以 我需要找到更好的方法。
有没有办法在不重新加载页面的情况下设置页面的语言
问题是 beforePageLoad
运行得太晚了 - 组件已经用相关语言加载到组件树中。
如果您使用 ViewHandler
,它可能会起作用,如 Jesse Gallagher 在 OpenNTF 上的脚手架框架。不过,您肯定需要在调用 super.createView()
之前确定语言。
要使用 beforePageLoad
,我认为您随后需要遍历控件并修改标签等。
设置阶段侦听器,根据用户的配置设置适当的语言环境。
有关更多详细信息,请参阅 Sven Hasselbach 的博客 post: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;
}
}
希望我没听错,只是在这里扩展我对 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>
我刚刚在这里使用了上下文变量,但我确信文档变量也可以访问。
希望对您有所帮助。
本文档建议使用 context.setLocale/setLocaleString 而不是 viewRoot.setLocale。优点是上下文区域设置用于浏览器会话的其余部分。当加载任何后续的 viewRoots 时,上下文区域设置将设置为 viewRoot 区域设置,因此您不必为每个页面重新设置区域设置。不过,它仍然需要 context.reloadPage 用于当前的 viewRoot,因此它并不完全符合您的要求。
文档是: Locale use in XPages: Programmatically setting the locale