読者です 読者をやめる 読者になる 読者になる

アラカン"BOKU"のITな日常

人事評価と人工知能について考えたことがメインテーマです。

STS 3.8.3(Spring Boot 1.5.1)+thymeleaf 多言語対応はできるようにはしとこう。

Spring Boot入門 プログラミング

日本語しか使う予定はない!と言い切れる場合でも、多言語対応できるようにはしときましょう。

 

その場合、正確には多言語対応ではなく、メッセージの外出し(=プロパティファイルで管理)です。

 

メッセージを外出しするだけで、十分メリットがあります。

 

メッセージを1ファイルにまとめて管理できるのは、プログラムソースの数が増えるほど有り難みが増してきます。プロパティファイルを用意するだけで多言語化できるより、そちらが大きいです。

 

Springの多言語化(i18n)でググると、applicationContext.xmlで<bean>タグを使ったやり方がたくさんヒットしますが、それはSpring Bootのやり方とは違うので、気をつけてください。

 

Spring Bootで、多言語化を使うための設定は、src/main/resources/application.propertiesに以下の様に書きます。

spring.messages.basename=messages
spring.messages.cache-seconds=-1
spring.messages.encoding=UTF-8 

 

後は src/main/resources/messages.properties というファイルを用意します。

 

ファイル名がとても重要です。一文字違っていても、例外が発生して画面表示ができません。一度、つまづくと結構苦しみます。慎重に行きましょう。

 

ちなみに、多言語化する時には、messagesの後ろにロケールを示す文字、例えば英語(en)なら、messages_en.properties のようにファイルを用意することになります。

 

この messages.properties に以下のように書いてみます。

hello.welcome=こんにちは、世界の皆様へ

 

これをthymeleafから直接参照する時には、こう書きます。

<h1 th:text="#{hello.welcome}">XXXXX</h1>

 

もう一つのやり方が、JAVA側でプロパティファイルから取得してメッセージにセットする方法です。

@Autowired
protected MessageSource messageSource;

@RequestMapping("/hello2")
public String hello(Model model) {

     model.addAttribute("titleMsg", messageSource.getMessage("hello.welcome", null, Locale.JAPAN));
     return "hello2";
}

 

MessageSourceクラスを、@Autowiredをつけて宣言し、messageSource.getMessage("hello.welcome", null, Locale.JAPAN));で、プロパティファイルから読みこむわけです

 

あとは、titleMsgで参照できるように、addAttributeしてますから、受け側のHTMLではこう書くと表示できます。

<h1 th:text="${titleMsg}">XXXXX</h1>

 

どちらのやり方をしても、実行すると、このように表示されます。

f:id:arakan_no_boku:20170314233150j:plain

 

この2種類のやり方ができれば、ほぼほぼ問題ないですね。