我有一个针对不同语言的本地化网站
用户可以选择在配置文件中使用哪种语言,这将在PageLoad之前应用 使用
context.setLocalString("en")
“en”默认为en-US我相信所以网站上的日期以美国格式显示,所以我了解到我可以使用它。
context.setLocale(new Locale("en","gb"))
setLocal的问题是不会更新HTML lang =“en”属性所以事件虽然使用setLocal后日期是正确的,但使用的语言文件仍然是englisn(US)而不是英语(英国)一个。 (即不是html lang =“en-gb”)
所以当来自英国的用户将他们的语言设置为en-uk时,他们会获得美国语言文件。
所以我试着这样做
context.setLocale(new Locale("en","gb"))
context.setLocalString("en-GB")
但是setLocalString会覆盖setLocalString,反之亦然。所以看起来我不能同时使用它们
有什么方法可以在beforePageLoad上添加代码,以确保html lang属性都使用正确的语言更新,并且我的日期以正确的语言集格式显示?
答案 0 :(得分:4)
尝试在 beforeRenderResponse 期间直接在视图根目录中设置语言环境,而不是使用上下文对象:
<xp:this.beforeRenderResponse>
<![CDATA[#{javascript:
facesContext.getViewRoot().setLocale( new java.util.Locale("en-GB") );
}]]>
</xp:this.beforeRenderResponse>
或者您可以按照此处所述在阶段侦听器中切换区域设置: http://openntf.org/XSnippets.nsf/snippet.xsp?id=xpages-localization-setter
修改强>
语言环境设置有点奇怪。使用 context.setLocaleString()(如Panu Haaramo回答)时,您必须在 en 和 GB 之间使用下划线,但这不会解决问题,因为 ViewRootRender 在渲染HTML输出时仅使用语言设置生成 lang 属性。
这个
new java.util.Locale("en", "GB").getLanguage()
仅返回 en ,忽略“GB”。
使用 context.setLocaleString 将带来相同的结果,因为它只解析给定的字符串并将其转换为 java.util.Locale ,它返回与descibed。
但是使用未定义的Locale将生成一个小写的 lang 属性。 F.E.这个
<xp:this.beforeRenderResponse>
<![CDATA[#{javascript:
facesContext.getViewRoot().setLocale( new java.util.Locale("en-Blabla-Blubb") );
}]]>
</xp:this.beforeRenderResponse>
生成以下HTML标记:
<html lang="en-blabla-blubb">
这就是为什么这个答案顶部的代码将lang属性设置为 en-gb ,但这仍然是错误的:它应该将它设置为 en-GB as这里描述:w3.org: Best Practices: Specifying Language in XHTML & HTML Content