XML-конфигурация Spring MVC ResourceBundleMessageSource

Я хотел бы подражать способу разрешения сообщений i18n в Grails.

В WEB-INF/i18n/ у меня есть следующие каталоги:

admin/messages_EN.properties

admin/messages_FR.properties

веб-сайт/messages_EN.properties

веб-сайт/messages_FR.properties

пожалуйста, игнорируйте языковые окончания ( EN и FR ) в этом примере

в моей конфигурации xml у меня сейчас есть:

<!-- Register the welcome.properties -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
  <property name="defaultEncoding" value="utf-8" />
  <property name="basename" value="/WEB-INF/i18n/" />
</bean>

То, что я ищу здесь, - это способ сказать Spring искать файлы .properties в i18n, но без явного указания, что такое каждый подкаталог. Это без списка базовых имен, который указывает на /WEB-INF/i18n/admin/ и /WEB-INF/i18n/веб-сайт/

Я хочу, чтобы каталог WEB-INF/i18n/ был динамическим, и чтобы пакеты (каталоги) можно было создавать без необходимости повторного изменения файла конфигурации xml.

Я не пытаюсь решить этот конкретный пример с подкаталогами администратора и веб-сайта

Это возможно?

Спасибо!


person mmm    schedule 20.06.2012    source источник
comment
Вам, вероятно, придется расширить ReloadableResourceBundleMessageSource, чтобы ввести какое-то свойство discover, которое заставляет источник сообщения выполнять поиск в каталоге basename вместо прямой загрузки файлов.   -  person Paul Grime    schedule 20.06.2012
comment
@PaulGrime Я реализовал кое-что на основе вашего предложения и отредактировал свой вопрос, включив в него предложенную реализацию. Что-то в этом роде должно работать правильно? Что-то упустил? Спасибо!   -  person mmm    schedule 20.06.2012


Ответы (1)


Вот решение:

package com.mypackage.core.src;

import java.io.File;
import java.util.ArrayList;

import javax.servlet.ServletContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;

public class UnderDirectoryReloadableResourceBundleMessageSource extends ReloadableResourceBundleMessageSource {

    @Autowired
    ServletContext servletContext;

    public void setWorkingDirectory(String directoryPath) {
        File rootDir = new File( servletContext.getRealPath(directoryPath) );
        ArrayList<String> baseNames = new ArrayList<String>();
        iterateScanDirectoryAndAddBaseNames(baseNames, rootDir);
        setBasenames(baseNames.toArray(new String[baseNames.size()]));
    }

    private void iterateScanDirectoryAndAddBaseNames(ArrayList<String> baseNames, File directory) {
        File[] files = directory.listFiles();

        for (File file : files) {
            if (file.isDirectory()) {
                iterateScanDirectoryAndAddBaseNames(baseNames, file);
            } else {
                if (file.getName().endsWith(".properties")) {
                    String filePath = file.getAbsolutePath().replaceAll("\\\\", "/").replaceAll(".properties$", "");
                    filePath = filePath.substring(filePath.indexOf("/WEB-INF/"), filePath.length());
                    baseNames.add(filePath);
                    System.out.println("Added file to baseNames: " + filePath);
                }
            }
        }
    }

}

XML-конфигурация:

<bean id="messageSource" class="com.mypackage.core.src.UnderDirectoryReloadableResourceBundleMessageSource">
  <property name="defaultEncoding" value="utf-8" />
  <property name="workingDirectory" value="/WEB-INF/webspring/i18n" />
  <property name="cacheSeconds" value="3" />
  <property name="fallbackToSystemLocale" value="false" />
</bean>

Наслаждаться!

person mmm    schedule 27.06.2012