0

我想在我的 JSF 应用程序中登录时设置特定的用户语言环境。

为此,我从他的属性中获取用户区域设置并通过设置用户区域设置

FacesContext.getCurrentInstance().getViewRoot().setLocale(userLocale);

在成功登录的登录期间。

我的问题是,当我在用户会话期间向用户显示消息时,我通过的语言环境

FacesContext context = FacesContext.getCurrentInstance();
    if (context != null && context.getViewRoot() != null) {
        locale = context.getViewRoot().getLocale();
        ... 

始终是默认语言环境。

我的代码中没有设置语言环境的其他点,所以我无法弄清楚为什么会发生这种情况。

4

2 回答 2

1

您基本上只是为当前视图设置区域设置,即登录页面。您需要记住会话范围内的用户区域设置,并在同一会话的所有后续视图中进行设置。

您可以通过创建userLocale某个会话范围 bean 的属性(可能只是登录用户本身?)并<f:view locale>在您的主模板中引用它来做到这一点。

<f:view locale="#{user.locale}">

viewRoot.setLocale(user.getLocale())这将对每个视图隐式执行。

也可以看看:

于 2013-01-16T11:30:00.457 回答
0

您应该多说些什么,为什么您从有关用户首选本地的请求信息中收集什么,但可以说您是从标头中获取的accept-language

然后,正如 JSF 规范所说:

UIViewRoot 的 Locale 由 ViewHandler 在执行 ViewHandler 的 createView() 方法期间确定和设置。此方法必须通过查看用户的偏好以及应用程序声明的支持的语言环境来确定活动的语言环境。

因此,一件事是在 ViewRoot 中设置 Locale 并从请求标头中收集 Locale,另一件事是在您的配置文件中正确设置支持的语言环境。

在规范的其他部分,您可以阅读(参见ViewHandler calculateLocale方法):

方法 Application.getSupportedLocales() 定义了这个 JSF 应用程序能够支持的语言环境。此方法应匹配此类数据源并返回 Locale 对象,这是将当前应用程序呈现给当前用户的最佳选择。

为什么会这样?因为如果您的应用程序不支持使用该语言环境发送响应,则您无法使用用户首选的语言环境向用户发送响应。现在您所要做的(我希望如此)就是像这样配置您的faces-config.xmlinWEB-INF目录(也从 JSF 规范复制):

<faces-config>
  <application>
    <locale-config>
      <default-locale>en</default-locale>
      <supported-locale>de</supported-locale>
      <supported-locale>fr</supported-locale>
      <supported-locale>es</supported-locale>
//    ...
    </locale-config>
  </application>
</faces-config>
于 2013-01-16T11:17:05.057 回答