我目前正在尝试以编程方式设置语言环境,但找不到好的解决方案。用例是我有另一个网站将数据发布到我的网站,它有一个语言环境参数,并且基于这个语言环境,我必须呈现我的页面。
我已经尝试在 preRenderView、构造函数和 PostConstruct 上设置语言环境,但似乎已经为时已晚。
有什么建议吗?谢谢。
关键是您需要在UIViewRoot#setLocale()
渲染视图之前设置语言环境。<f:view locale="#{languageBean.currentLocale}">
仅在构建视图期间设置。因此,此后为了仅更改bean 属性而调用的任何基于请求的操作都不会产生任何影响。你真的需要手动调用UIViewRoot#setLocale()
。
最简单的方法是在属性的设置器中执行该UIViewRoot#setLocale()
工作。currentLocale
Daniel 在您的问题评论中提供的链接的答案中提到的 bean 示例正是这样做的:JSF 2.0 set locale entire session from browser and programmatically。这种方式不需要丑陋的 JS hack 来重新加载页面一次。
根据您自己的回答,还有另一个可能的问题:您的“接收器 bean”似乎是请求范围的,而不是它#{languageBean}
本身。如果此 bean 是在视图的任何区域设置/语言相关方面(例如语言下拉列表、本地化文本等)之后第一次构造的,那么更改它们也为时已晚。您想将 bean 的构造移动到预渲染视图事件(例如,通过<f:event listener>
)。另一种方法是仅在属性的getter中执行请求参数收集作业。currentLocale
我已经通过使用纯 javascript 加载页面解决了这个问题。
在我的 PostConstruct 中,我从上下文的请求参数映射中读取参数。// 设置语言环境
try {
languageBean.setCurrentLocale(LocaleUtils.toLocale(temp.getLocale()));
} catch (IllegalArgumentException | NullPointerException e) {
languageBean.setCurrentLocale(Locale.JAPAN);
}
然后使用纯 javascript 重新加载页面:
<script type="text/javascript">
window.onload = function() {
if (!window.location.hash) {
window.location = window.location + '#loaded';
window.location.reload();
}
}
</script>
我在这里写了更详细的代码:http: //czetsuya-tech.blogspot.com/2013/01/loading-locale-from-postget-parameter.html