目前我的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
是没有选择的。
答案 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发送的区域设置。