実行時に相手に言語を選択させて表示言語を切り替えるっていうことがあると思います。 Spring Bootでもそういった機能があります。
まず、Appクラスで以下のBeanを公開します。
- SessionLocaleResolver
- LocaleChangeInterceptor
そしてWebMvcAutoCOnfigurationAdapterを継承してaddInterceptorsメソッドをオーバーライドしてLocaleChangeInterceptorを登録します。コードで書くと以下のような感じです。
package okazuki.validationEdu; import java.util.Locale; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter; import org.springframework.context.annotation.Bean; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.i18n.SessionLocaleResolver; @SpringBootApplicationpublicclass App extends WebMvcAutoConfigurationAdapter { publicstaticvoid main(String[] args) { SpringApplication.run(App.class, args); } @Beanpublic SessionLocaleResolver localeResolver() { SessionLocaleResolver r = new SessionLocaleResolver(); r.setDefaultLocale(Locale.JAPAN); return r; } @Beanpublic LocaleChangeInterceptor localeChangeInterceptor() { LocaleChangeInterceptor i = new LocaleChangeInterceptor(); i.setParamName("lang"); return i; } @Overridepublicvoid addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(localeChangeInterceptor()); } }
あとは、message.properties, message_ja.properties, message_en.propertiesあたりを準備しておいて以下のようなThymeleafのテンプレート書けばOKです。
<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head><metacharset="UTF-8" /><title>Insert title here</title></head><body><ahref="index?lang=ja" th:href="@{/index?lang=ja}">日本語</a><br/><ahref="index?lang=en" th:href="@{/index?lang=en}">English</a><hr /><span th:text="#{message}">こんにちは</span></body></html>
aタグの日本語とEnglishを押すと表示が切り替わります。
プログラム側でメッセージを取得するには以下のようになります。
package okazuki.validationEdu; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controllerpublicclass HomeController { privatestaticfinal Logger log = Logger.getLogger(HomeController.class); @Autowired MessageSource messageSource; @RequestMappingpublic String index() { log.info(this.messageSource.getMessage("message", null, LocaleContextHolder.getLocale())); return"index"; } }
MessageSourceをDIしてLocaleContextHolderからLocaleを取得してメッセージを取得します。