網頁

2020/6/29

Spring Boot MessageSource i18n 範例

Spring Boot自動配置MessageSource多國語言(i18n)簡單範例。

範例環境:

  • Java 8
  • Spring Boot 2.2.1.RELEASE
  • Maven

建立Spring Boot專案(參考IntelliJ IDEAEclipse STS)。

Spring Boot預設會尋找classpath根目錄下名稱為messages的properties作為訊息來源。

若要設定不同語系的訊息,可新增messages_language_COUNTRY.properties,例如新增台灣正體中文語系訊息檔為messages_zh_TW.properties、日文語系訊息檔為messages_ja_JP。檔案名稱規則參考Java的ResourceBundle

專案application.properties設定。使用Spring Boot預設MessageSource配置,所以不設定spring.messages配置。

application.properties

#context path
server.servlet.context-path=/demo
#port
server.port=8080


messages.propertiesmessages_zh_TW.properties內容如下。

src/main/resources/messages.properites

demo.message=MessageSource auto config
demo.message.args=A message with args, arg_0={0}, arg_1={1}

src/main/resources/messages_zh_TW.properites

demo.message=MessageSource自動配置
demo.message.args=帶參數的訊息,參數0={0}, 參數1={1}

訊息來源檔中的{0}{1}MessageFormat的format,可在程式中帶入變數。

新增DemoController使用MessageSource如下。注意第二個訊息的LocaleLocale.TAIWAN

DemoController

package com.abc.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Locale;

@RestController
public class DemoController {

    @Autowired
    private MessageSource messageSource;

    @GetMapping("/message")
    public void message() {
        String s1 = messageSource.getMessage(
                "demo.message", 
                null, 
                Locale.ENGLISH);
        System.out.println(s1); // MessageSource auto config

        String s2 = messageSource.getMessage(
                "demo.message.args", 
                new String[]{"hello", "world"}, 
                Locale.TAIWAN);
        System.out.println(s2); // 帶參數的訊息,參數0=hello, 參數1=world
    }
}

呼叫MessageSource.getMessage()取得messages.propertiesmessages_zh_TW.properties的文字。
第一個參數為properties訊息的key,
第二個參數為format可帶入的變數,
第三個參數為Locale,此參數決定從哪個語系檔取得key的值。若找不到對應的語系檔則從預設的messages.properties取得訊息。


目錄結構

─src
 └─main
    ├─java
    │  └─com
    │      └─abc
    │          └─demo
    │              │  DemoApplication.java
    │              │
    │              └─controller
    │                      DemoController.java
    │
    └─resources
        │  application.properties
        │  messages.properties
        │  messages_zh_TW.properties 

完整程式碼請參考github


沒有留言:

張貼留言