歩行訓練

おいっちにー!

Spring boot で application.properties の spring.messages.basename を使わずに国際対応をした感出したい

やりたいことは、application.properties の spring.messages.basename を使わずに国際対応をしたい。前々回辺りに書いた ValidationMessages.properties を流用したい。つまり、デフォルトの機能を使わずになんとか楽したい。

 

ResourceBundleMessageSource を使う場合。

ReloadableResourceBundleMessageSource (Spring Framework 4.2.2.RELEASE API)

 

問題はこのResourceBundleMessageSource がUTF-8ではなく、ISO-8859-1で文字列を持ってくる点だけど、よく考えたら変換すればいいだけだった。

import java.util.Locale;

import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.stereotype.Service;

@Service
public class I18nMessageService
{
    private final String VALID_MSG_FILE = "i18n/ValidationMessages";
    private ResourceBundleMessageSource validRb;
    public I18nMessageService()
    {
        validRb = new ResourceBundleMessageSource();
        validRb.setBasename( VALID_MSG_FILE );
    }
    
    public String getValidationMsg( String propStr, Locale locale )
    {
        String msg = validRb.getMessage( propStr, null, locale);
        return toUtf8( msg );
    }
   
    private String toUtf8( String str8859 )
    {
        String strUtf8 = str8859;
        try {
            strUtf8 = new String( str8859.getBytes( "ISO-8859-1" ), "UTF-8" );
        }catch ( Exception e ){
        }
        return strUtf8;
    }
}

ここでファイルへのパスに前回同様「classpath:」で指定するのかな、と思って入れてみたら動かなかった。なんでなんだ・・・?

 

じゃあ、前回と同様に ReloadableResourceBundleMassageSource使えばいいんじゃね。

import java.util.Locale;

import org.springframework.context.MessageSource;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Service;

@Service
public class I18nMessageService
{
    private final String VALID_MSG_FILE = "classpath:i18n/ValidationMessages";
    private MessageSource validMs;

    public I18nMessageService()
    {
        validMs = getMessageSource( VALID_MSG_FILE );
    }
    
    public String getValidationMsg( String propStr, Locale locale )
    {
        return validMs.getMessage( propStr, null, "", locale );
    }
    
    private MessageSource getMessageSource( String filePath )
    {
        ReloadableResourceBundleMessageSource validRb = new ReloadableResourceBundleMessageSource();
        validRb.setBasename( filePath );
        validRb.setDefaultEncoding( "UTF-8" );
        return validRb;
    }
}

 こちらも動いた。こちらは「classpath」付き。うーん。