我目前正在尝试以编程方式设置区域设置,但无法找到一个好的解决方案。用例是我有另一个网站将数据发布到我的网站有一个locale参数,并且基于这个区域设置,我必须渲染我的页面。
我已经尝试在preRenderView,构造函数和PostConstruct上设置区域设置,但似乎已经很晚了。
有什么建议吗?感谢。
答案 0 :(得分:4)
关键是您需要在呈现视图之前按UIViewRoot#setLocale()
设置区域设置。仅在构建视图期间设置<f:view locale="#{languageBean.currentLocale}">
。因此,此后调用的任何基于请求的操作意图更改仅 bean属性将不会产生任何影响。您确实需要手动调用UIViewRoot#setLocale()
。
最简单的方法是在UIViewRoot#setLocale()
属性的setter中执行currentLocale
作业。 Daniel在您的问题评论中提供的链接答案中提到的bean示例正是如此:JSF 2.0 set locale throughout session from browser and programmatically。这样,重新加载页面就不需要丑陋的JS hack。
根据您自己的答案,还有另一个可能的问题:您的“接收器bean”似乎是请求作用域而不是#{languageBean}
本身。如果这个bean第一次构建之后视图的任何语言环境/语言相关方面(例如语言下拉列表,本地化文本等),那么改变它们为时已晚。您希望将bean的构造移动到预渲染视图事件(例如,通过<f:event listener>
)。另一种方法是仅在currentLocale
属性的 getter 中执行请求参数收集作业。
答案 1 :(得分:1)
我已经通过使用普通的javascript来加载页面来解决这个问题。
在我的PostConstruct中,我从context的请求参数映射中读取参数。 //设置语言环境
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