1

我有一个针对不同语言的本地化网站

用户可以选择在配置文件中使用哪种语言,这将在PageLoad之前应用

context.setLocalString("en")

我相信“en”默认为 en-US,因此网站上的日期以美国格式显示,所以我知道我可以使用它。

context.setLocale(new Locale("en","gb"))

setLocal 的问题在于它不会更新 HTML lang="en" 属性,因此事件虽然在使用 setLocal 后日期是正确的,但使用的语言文件仍然是英语(美国)而不是英语(英国)。(即不是 html lang="en-gb")

因此,当来自英国的用户在他们的个人资料中将他们的语言设置为 en-uk 时,他们会得到美国语言文件。

所以我试着这样做

 context.setLocale(new Locale("en","gb"))
 context.setLocalString("en-GB")

但随后 setLocalString 会覆盖 setLocalString ,反之亦然。所以看起来我不能同时使用它们

有什么方法可以在 beforePageLoad 上添加代码,以确保 html lang 属性都使用正确的语言进行更新,并且我的日期以语言集的正确格式显示?

4

1 回答 1

5

尝试在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()时,您必须在enGB之间使用下划线(正如 Panu Haaramo 回答的那样),但这不会解决问题,因为ViewRootRender在渲染时仅使用语言设置来生成lang属性HTML 输出。

new java.util.Locale("en", "GB").getLanguage()

将仅返回en,“GB”被忽略。

使用context.setLocaleString将带来相同的结果,因为它只解析给定的字符串并将其转换为java.util.Locale,它返回与描述相同的结果。

但是使用未定义的 Locale 会生成小写的lang属性。铁这个

<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,如下所述:w3.org:最佳实践:在 XHTML 和 HTML 内容中指定语言

于 2013-02-01T11:15:47.953 回答