我正在尝试从JSF页面访问多个资源包。我有两个资源包:

  • general_messages.properties
  • module_message.properties

  • 我想在JSF文件中访问这两个资源包。我可以这样做的一种方法是为每个捆绑软件定义特定的属性:
    <f:loadBundle basename="com.sample.general_messages" var="general"/>
    <f:loadBundle basename="com.sample.module_message" var="module"/>
    

    有没有一种方法可以使用相同的变量名访问这两个资源包。
    就像是:
    <f:loadBundle basename="com.sample.general_messages, com.sample.module_message" var="general"/>
    

    还是任何其他访问多个资源包的最佳方法?

    最佳答案

    您用Spring标记了您的问题,所以我建议您使用Spring MessageSource。 Spring MessageSource甚至可以按层次聚合许多属性文件。与旧的Java ResourceBundle相比,它具有许多优点。

    您可以像这样在自己的MessageSource中定义spring spring-config.xml:

    <!--
    Application messages configuration.
    -->
    <bean id="messageSource" name="resourceBundle"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
        p:fallbackToSystemLocale="false"
        p:cacheSeconds="0">
        <property name="basenames">
            <list>
                <value>/messages/Messages</value>
    <!--        <value>${application.messages}</value>-->
            </list>
        </property>
    </bean>
    

    比您可以定义这样的Class扩展了ResourceBundlefaces-config.xml(需要一些清理和重构):
    public class SpringResourceBundle extends ResourceBundle
    {
    
        private MessageSource messages;
        private FacesContext fc;
        private Locale locale = null;
    
        public SpringResourceBundle()
        {
            fc = FacesContext.getCurrentInstance();
            WebApplicationContext webAppCtx = (WebApplicationContext) fc.getExternalContext().getApplicationMap().get(
                    WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
            messages = (MessageSource) webAppCtx.getBean("messageSource");
        }
    
        @Override
        public Locale getLocale()
        {
            Locale loc = fc.getELContext().getLocale();
            if (fc.getExternalContext() != null) {
                loc = fc.getExternalContext().getRequestLocale();
            }
            try {
                UIViewRoot viewRoot = fc.getViewRoot();
                if (viewRoot != null) {
                    loc = viewRoot.getLocale();
                }
                if (loc == null) {
                    loc = fc.getApplication().getDefaultLocale();
                }
    
            } catch (Throwable th) {
                System.out.println(th.getMessage());
                loc = locale;
            }
            locale = loc;
            return loc;
        }
    
        @Override
        protected Object handleGetObject(String key)
        {
            try {
                return messages.getMessage(key, null, getLocale());
            } catch (NoSuchMessageException e) {
                return "???" + key + "???";
            }
        }
    
        @Override
        public Enumeration<String> getKeys()
        {
            return Collections.enumeration(Collections.EMPTY_LIST);
        }
    }
    

    最后,在ojit_code中用上述Class声明您的资源包。像这样的东西:
    <application>
        <locale-config>
           <default-locale>en</default-locale>
           <supported-locale>cs</supported-locale>
           <supported-locale>de</supported-locale>
           <supported-locale>en</supported-locale>
        </locale-config>
        <message-bundle>your.package.SpringResourceBundle</message-bundle>
    </application>
    

    在这里,您可以在JSF中使用Spring MessageSource。希望这是可以理解的。

    09-25 22:13