【问题标题】:JSF 2.2: Configure available Locales outside faces-config.xmlJSF 2.2:在 faces-config.xml 之外配置可用的区域设置
【发布时间】:2016-10-17 21:10:37
【问题描述】:

目前我的faces-config.xml 中有一个部分,如下所示:

    <locale-config>
        <default-locale>en</default-locale>
        <supported-locale>en_US</supported-locale>
        <supported-locale>en_GB</supported-locale>
        <supported-locale>de</supported-locale>
        <supported-locale>de_DE</supported-locale>
    </locale-config>

这是按预期工作的。

问题是,在我的战争中,我必须能够在不触及 faces-config.xml 的情况下定义这些语言环境。这个想法是有例如资源路径上的配置文件定义所有可用的语言环境。

我已经尝试了programatic approach,并在另一个模块的 META-INF 中使用了第二个 faces-config.xml,我可以访问并在资源路径上定义一个特定文件,该文件应根据此 @ 合并987654322@。每种情况下的第二个文件都以有效的 faces-config.xml 格式包含上述部分。两者都没有任何影响(既没有错误也没有任何行为变化)

有什么好的方法可以在不触及原始 faces-config 的情况下做到这一点?

我能够更改耳模块并在任何位置以编程方式访问资源。不幸的是,在 .war 中调整 faces-config.xml 是没有选择的。

【问题讨论】:

  • @Kukeltje:不幸的是,答案对我没有帮助。但这个问题实际上似乎非常相似。我已经用自己的逻辑解决了所有资源,我只希望将浏览器接受的语言的处理留给 myfaces 实现
  • 问题是,我们想让用户在使用浏览器语言和他自己的设置之间做出选择。因此,我们必须以某种方式处理浏览器发送的语言环境。不幸的是,使用 Faces 执行此操作的唯一方法是定义 locale-config。否则我们必须自己从请求中提取它们

标签: jsf jsf-2 myfaces


【解决方案1】:

据我所知,这里有一个误解。如果您使用自定义解析器/资源包/其他任何内容并且可以完全控制事物,则无需在 locale-config 中配置任何内容。

如果您查看 Add Resource Bundles Programmatically 中的答案,您会看到 OmniFaces Faces.getLocale() 用于将语言环境传递给 resourceBundle

Locale userLocale = Faces.getLocale();
ResourceBundle b = ResourceBundle.getBundle("msgs", userLocale);

因此,有效的做法是将编程选择的语言环境传递给它,而不是自动使用在locale-config 中配置的东西。

存在 IN Faces.getLocale() 一些代码以使用 locale-config 的事实是确保当人们在 locale-config 中配置某些内容时可以使用它,因此它在普通 JSF 中的行为与预期一样。在第 16 行,它检索用户在请求中发送的语言环境。在第 18 行,它会根据 supported-locale 进行检查(可以在自定义实现中省略!!!)如果不匹配,请使用 default-locale(可以省略,第 7-12 行也可以)

1   /**
2     * {@inheritDoc}
3     * @see Faces#getLocale()
4     */
5   public static Locale getLocale(FacesContext context) {
6       Locale locale = null;
7       UIViewRoot viewRoot = context.getViewRoot();
8
9       // Prefer the locale set in the view.
10      if (viewRoot != null) {
11          locale = viewRoot.getLocale();
12      }
13
14      // Then the client preferred locale.
15      if (locale == null) {
16          Locale clientLocale = context.getExternalContext().getRequestLocale();
17
18          if (getSupportedLocales(context).contains(clientLocale)) {
19              locale = clientLocale;
20          }
21      }
22
23      // Then the JSF default locale.
24      if (locale == null) {
25          locale = context.getApplication().getDefaultLocale();
26      }
27
28      // Finally the system default locale.
29      if (locale == null) {
30          locale = Locale.getDefault();
31      }
32
33      return locale;
34  }

因此,此代码可以完全根据您的喜好进行调整,包括首先检查用户是否在您的应用程序中配置了偏好的区域设置,否则使用浏览器发送的区域设置(如果支持)。

【讨论】:

  • 感谢您的澄清,我将采用(另一种)编程方法完全绕过 Faces 并根据用户设置和类似于您的示例的请求设置语言环境
  • 我曾希望让面孔处理浏览器语言,但经过短暂的评估后发现自己更容易决定
  • 不客气,希望你能成功。什么是你的“面孔/面孔”? omn​​ifaces util 类还是别的什么?
  • 哦,对不起。我没想过要提这个。我的意思是我们 AS 中的 JSF 实现。到目前为止,我们只是简单地调用了 FacesContext.getCurrentInstance().getViewRoot().getLocale(),它与正确的 face-config.xml 结合为我提供了基于请求决定的 Locale JSF。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 2013-03-12
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
相关资源
最近更新 更多