Spring Boot自動配置了MessageSource做i18n多國語言訊息,所以若無特殊需求不用自己配置MessageSource的bean。
自動配置類別為MessageSourceAutoConfiguration。
範例環境:
- Java 8
- Spring Boot 2.2.1.RELEASE
- Maven
建立Spring Boot專案(參考IntelliJ IDEA,Eclipse STS)。
Spring Boot預設會尋找classpath根目錄下名稱為messages的properties作為訊息來源。如果想要使用其他名稱或路徑,可在Spring Boot配置檔application.properties設定spring.messages.basename修改,不過一旦自訂了訊息檔名稱,則預設就不再讀取messages。
例如下面設定訊息檔為classpath根目錄(src.main.resources)的messages.properties及i18n/simple.properties。
application.properties
#context path
server.servlet.context-path=/demo
#port
server.port=8080
#MessageSourceProperties
spring.messages.basename=messages,i18n.simple
其他spring.messages配置屬性請參考MessageSourceProperties。
messages.properties及i18n/simple.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/i18n/simple.properites
demo.simple=A simple message
demo.simple.args=A simple message with args, arg_0={0}, arg_1={1}
訊息來源檔中的{0}、{1}為MessageFormat的format,可在程式中帶入變數。
新增DemoController使用MessageSource如下。
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.simple", null, Locale.ENGLISH);
System.out.println(s1); // A simple message
String s2 = messageSource.getMessage("demo.simple.args", new String[]{"hello", "world"}, Locale.ENGLISH);
System.out.println(s2); // A simple message with args, arg_0=hello, arg_1=world
String s3 = messageSource.getMessage("demo.message", null, Locale.ENGLISH);
System.out.println(s3); // MessageSource auto config
String s4 = messageSource.getMessage("demo.message.args", new String[]{"foo", "bar"}, Locale.ENGLISH);
System.out.println(s4); // A message with args, arg_0=foo, arg_1=bar
}
}
呼叫MessageSource.getMessage()取得messages.properties及simple.properties中的文字。
第一個參數為properties訊息的key,
第二個參數為format可帶入的變數,
第三個參數為Locale。
目錄結構
src/main
├─java/com/abc/demo/
│ ├─DemoApplication.java
│ └─controller/
│ └─DemoController.java
└─resources
├─application.properties
├─messages.properties
└─i18n/
└─simple.properites
完整程式碼請參考github。
沒有留言:
張貼留言