【问题标题】:How to set the locale programmatically in JSF如何在 JSF 中以编程方式设置语言环境
【发布时间】:2012-12-31 15:24:48
【问题描述】:

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

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

有什么建议吗?谢谢。

【问题讨论】:

  • 是的,我知道如何设置语言环境。我的问题是如何在页面呈现之前设置语言环境。这是因为我的语言环境值来自一个 post 变量。
  • @czetsuya,只需确保重新加载页面(h:commandButton 没有f:ajax 可以完成这项工作,例如f:ajax render="@all"
  • @Daniel,是的,这就是我想要做的。但我需要在不点击任何按钮的情况下做到这一点。我正在尝试重定向到它可以工作但看起来不优雅的同一页面。
  • 那么该语言环境是如何设置的?发帖后页面不是在刷新吗?

标签: jsf jsf-2


【解决方案1】:

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

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

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

【讨论】:

  • 实际上我的接收器 bean 是 ConversationScope。不幸的是,我无法将收集工作放在 languageBean currentLocale getter 中,因为我在整个项目中都在使用 languageBean。我会试试 preRenderView 事件。
【解决方案2】:

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

【讨论】:

  • FacesContext.getCurrentInstance().getViewRoot().setLocale(LocaleUtils.toLocale(temp.getLocale())); 不是为你工作的吗?
猜你喜欢
  • 2011-06-26
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
相关资源
最近更新 更多