JSF 2.2:在faces-config.xml之外配置可用的Locales

时间:2016-06-16 11:21:24

标签: jsf jsf-2 myfaces

目前我的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>

这是按预期工作的。

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

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

有没有很好的方法可以在不触及原始faces-config的情况下执行此操作?

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

1 个答案:

答案 0 :(得分:1)

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

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

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

所以有效的做法是将一个以编程方式选择的语言环境传递给它,而不是自动使用locale-config中配置的内容。

使用Faces.getLocale()时出现IN 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  }

因此,可以根据自己的喜好完全调整此代码,包括首先检查用户是否在应用程序中配置了首选项区域设置,以及使用支持的浏览器IF发送的区域设置。