2012-06-20 8 views
1

Я хотел бы подражать решению Grails для разрешения сообщений i18n.Spring MVC ResourceBundleMessageSource XML-конфигурация

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

админ /messages_EN.properties

администратора /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, но без явного указания ему, что такое каждый подкаталог. То есть безсписок из basenames, что указывает на /WEB-INF/i18n/админ/ и /WEB-INF/i18n/сайт/

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

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

Возможно ли это?

Спасибо!

+0

Возможно, вам придется расширить 'ReloadableResourceBundleMessageSource', чтобы ввести какое-то свойство' discovery', которое заставляет источник сообщения искать в каталоге 'basename', а не напрямую загружать файлы. –

+0

@PaulGrime Я внедрил что-то на основе вашего предложения и отредактировал свой вопрос, чтобы включить предлагаемую реализацию. Что-то в этом направлении должно работать правильно? Что-то пропало? Благодаря! – momomo

ответ

2

Вот решение:

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> 

Наслаждайтесь!

Смежные вопросы