SpringBootでメッセージ国際化をしてみます
何をするかというと、HTML内に表示されるメッセージを一つのファイルにまとめておきます。
あとからの修正が楽になるなどのメリットがありサイトを多言語展開する場合などに役立ちます
プロパティファイルに指定したメッセージは起動時に読み込まれ、インスタンス内にキャッシュされます
キャッシュされる方を使いたい場合には、ResourceBundleMessageSourceを使います。
今回は
リソースが変更されたらメッセージも変更される様にしたいのでReloadableResourceBundleMessageSourceをつかいます。
この機能はSpringの機能を利用する事になります。
必要なライブラリなどはなく、
1.ビーン登録
2.メッセージ用のpropertyファイルの配置
3.MessageSourceの継承
のみになります。
1.ビーン登録
WebMvcConfigurerAdapterを継承したクラス内で記述します
hymeleafConfig.java
@Configuration
public class ThymeleafConfig extends WebMvcConfigurerAdapter {
@Value("${lang.default.lang}")
private String defLang;
@Value("${lang.default.locale}")
private String defLocale;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("language");
return localeChangeInterceptor;
}
@Bean
public CookieLocaleResolver localeResolver() {
CookieLocaleResolver localeResolver = new CookieLocaleResolver();
Locale defaultLocale = new Locale(defLang + "_" + defLocale);
localeResolver.setDefaultLocale(defaultLocale);
return localeResolver;
}
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages/messages");
return messageSource;
}
}
3.MessageSourceの継承
MessageResolver.java
public class MessageResolver implements MessageSource{
@Autowired
private MessageSource messageSource;
public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}
@Override
public String getMessage(String code, Object[] args,String defaultMessage, Locale locale) {
return this.getMessage(code,args,"",locale);
}
@Override
public String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException {
// TODO Auto-generated method stub
String sMess = messageSource.getMessage(code,args,locale);
return sMess;
}
@Override
public String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException {
// TODO Auto-generated method stub
String sMess = messageSource.getMessage(resolvable,locale);
return sMess;
}
}