JSF 2.2:在faces-config.xml之外配置可用的语言环境

4

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

这是预期的工作。

问题在于,我必须能够定义这些区域设置,而不触及我的war中的faces-config.xml。想法是在资源路径上有一个配置文件,定义所有可用的区域设置。

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

有没有什么好办法可以做到这一点而不触及原始的faces-config呢?

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


@Kukeltje:不幸的是,这些答案对我没有帮助。但问题似乎非常相似。我已经用自己的逻辑解决了所有资源,只是希望将浏览器接受的语言处理留给myfaces实现。 - Abaddon666
问题是,我们希望让用户选择使用浏览器语言还是自己的设置。因此,我们必须以某种方式处理浏览器发送的本地化信息。不幸的是,使用Faces唯一的方法是定义locale-config。否则,我们必须自己从请求中提取这些信息。 - Abaddon666
1个回答

2
据我所见,这里存在一个误解。如果您使用自定义解析器/资源包/其他,并且对事物有完全控制,则无需在locale-config中配置任何内容。
如果您查看Add Resource Bundles Programmatically中的答案,您会发现OmniFaces Faces.getLocale()被用来向resourceBundle传递语言环境。
Locale userLocale = Faces.getLocale();
ResourceBundle b = ResourceBundle.getBundle("msgs", userLocale);

因此,实际上所做的是向其传递一个以编程方式选择的区域设置,而不是自动使用在“locale-config”中配置的内容。在“Faces.getLocale()”中存在一些代码来使用“locale-config”,以确保在普通的JSF中行为符合预期,当人们在“locale-config”中配置了一些内容时。在第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并根据用户设置和请求设置区域设置的编程方法,类似于您的示例。 - Abaddon666
我曾希望使用 Faces 处理浏览器语言,但经过短暂的评估后,发现自己做决定更容易。 - Abaddon666
不用谢,希望你能让它正常工作。对你而言,“faces/Faces”是什么?是Omnifaces实用类还是其他什么东西? - Kukeltje
哦,抱歉。我没有考虑到这一点。我指的是我们应用服务器中的JSF实现。到目前为止,我们只是简单地调用FacesContext.getCurrentInstance().getViewRoot().getLocale(),结合正确的face-config.xml文件,这样就可以获取JSF根据请求决定的区域设置。 - Abaddon666

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接