以编程方式添加资源包

时间:2014-04-03 00:08:25

标签: jsf-2

我有一个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声明。

2 个答案:

答案 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