如何在JSF中以编程方式设置语言环境

时间:2013-01-17 06:13:04

标签: jsf jsf-2

我目前正在尝试以编程方式设置区域设置,但无法找到一个好的解决方案。用例是我有另一个网站将数据发布到我的网站有一个locale参数,并且基于这个区域设置,我必须渲染我的页面。

我已经尝试在preRenderView,构造函数和PostConstruct上设置区域设置,但似乎已经很晚了。

有什么建议吗?感谢。

2 个答案:

答案 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