2

我目前正在尝试以编程方式设置语言环境,但找不到好的解决方案。用例是我有另一个网站将数据发布到我的网站,它有一个语言环境参数,并且基于这个语言环境,我必须呈现我的页面。

我已经尝试在 preRenderView、构造函数和 PostConstruct 上设置语言环境,但似乎已经为时已晚。

有什么建议吗?谢谢。

4

2 回答 2

4

关键是您需要在UIViewRoot#setLocale()渲染视图之前设置语言环境。<f:view locale="#{languageBean.currentLocale}">仅在构建视图期间设置。因此,此后为了更改bean 属性而调用的任何基于请求的操作都不会产生任何影响。你真的需要手动调用UIViewRoot#setLocale()

最简单的方法是在属性的设置器中执行该UIViewRoot#setLocale()工作。currentLocaleDaniel 在您的问题评论中提供的链接的答案中提到的 bean 示例正是这样做的:JSF 2.0 set locale entire session from browser and programmatically。这种方式不需要丑陋的 JS hack 来重新加载页面一次。

根据您自己的回答,还有另一个可能的问题:您的“接收器 bean”似乎是请求范围的,而不是它#{languageBean}本身。如果此 bean 是在视图的任何区域设置/语言相关方面(例如语言下拉列表、本地化文本等)之后第一次构造的,那么更改它们也为时已晚。您想将 bean 的构造移动到预渲染视图事件(例如,通过<f:event listener>)。另一种方法是仅在属性的getter中执行请求参数收集作业。currentLocale

于 2013-01-17T13:14:19.713 回答
1

我已经通过使用纯 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

于 2013-01-17T08:30:18.337 回答