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。
沒有留言:
張貼留言