我有一个faces-config.xml
文件,其中声明了一些资源包,如下所示:
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<application>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>de</supported-locale>
<supported-locale>es</supported-locale>
<supported-locale>pt</supported-locale>
<supported-locale>zh</supported-locale>
</locale-config>
<resource-bundle>
<base-name>messages.Messages</base-name>
<var>bundle</var>
</resource-bundle>
<resource-bundle>
<base-name>countries.Countries</base-name>
<var>countryBundle</var>
</resource-bundle>
</application>
</faces-config>
这些资源包已注册,可以在任何.xhtml
文件中使用,但有没有办法以编程方式注册这些资源包?我的意思是使用动态代码而不是xml
声明。
答案 0 :(得分:2)
这是我使用CDI做的简化版本:
@ApplicationScoped
public class BundleProducer {
@Produce @RequestScoped @Named
public ResourceBundle getMsgBundle() {
Locale userLocale = Faces.getLocale();
return ResourceBundle.getBundle("messages", userLocale);
}
}
注意使用omnifaces&#39; getLocale()要避免大量的套接字代码(对于不太合理的版本,您可以在链接到的教程中替换FacesContext.getCurrentInstance().getViewRoot().getLocale()
)。
由于@Named注释,如果需要访问getMsgBundle
,这将导致CDI框架在每次请求时调用msgBundle
。在这个简单的例子中,我依靠ResourceBundle
内部缓存和查找机制来有效地生成我的包。只要您从方法中返回BundleProducer
,就可以执行您喜欢的任何逻辑(例如,从封闭的ResourceBundle
加载内容)(您不允许返回null
})。
根据您的喜好重复生成不同的包。
不确定我是否得到了你想要的东西,所以如果你需要更多说明,请发表评论。
为了更轻松地处理FacesMessage
内容,我建议您查看omnifaces&#39; Messages实用程序类。我使用这样的东西来选择将包密钥作为消息字符串提供:
@Singleton
@Startup
public class MessageResolverInit {
@PostConstruct
public void initMessageResolver() {
Messages.setResolver(new Messages.Resolver() {
@Override
public String getMessage(String message, Object... params) {
Locale userLocale = Faces.getLocale();
ResourceBundle b = ResourceBundle.getBundle("msgs", userLocale);
if (b.containsKey(message)) {
return MessageFormat.format(b.getString(message), params);
}
return message;
}
});
}
请注意,我仅将b
用作变量名,仅用于演示目的。用法如下:
Messages.addGlobalError("my_msg_key", param1);
Messages.addGlobalInfo("I'm a standalone message");
答案 1 :(得分:0)
以下是Oracle文档的答案:Using FacesMessage to Create a Message