【问题标题】:Implementing I18N in JSF在 JSF 中实现 I18N
【发布时间】:2013-01-16 10:45:47
【问题描述】:

我想在他登录时在我的 JSF 应用程序中设置特定的用户区域设置。

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

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

在成功登录的登录过程中。

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

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

始终是默认语言环境。

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

【问题讨论】:

  • 因为 ViewRoot 是 request-scoped 的,所以它会随着每个新的 HTTP 请求而改变。您需要创建一些会话范围的 bean 并将 Locale 存储在那里。

标签: jsf internationalization


【解决方案1】:

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

您可以通过将userLocale 设为某个会话范围 bean 的属性(可能只是登录用户本身?)并在您的主模板中将其引用为 <f:view locale>

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

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

另见:

【讨论】:

    【解决方案2】:

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

    然后,正如 JSF 规范所说:

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

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

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

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

    为什么会这样?因为如果您的应用程序不支持使用该语言环境发送响应,则您无法使用用户首选的语言环境向用户发送响应。 现在您所要做的(我希望如此)就是像这样在WEB-INF 目录中配置您的faces-config.xml(也复制自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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      相关资源
      最近更新 更多