ref: inflearn 김영한 - 스프링 mvc 2
// messages.properties
...
item = 상품
item.id = 상품id
item.name = 상품 이름
...
<label th:text="${item.name}"/>
+ 국제화란?
국제화 = 메시지를 모아놓은 파일을 각 언어별로 분리해서 저장해놓고, 클라이언트의 locale 에 따라 다른 메시지를 보여주게 하는 것
messages_en.properties
messages_ko.properties
HTTP accept-language 헤더값을 사용할 수도 있고, 리퀘스트 바디에 담아서 선택할 수도 있다
스프링의 localeResolver
을 이용하면 국제화를 쉽게 구현할 수 있다. 에 관한 간략한 내용은 LocaleResolver 개요 내용을 확인하자
설정하기 (직접 등록, 자동 등록[부트])
MessageSource
인터페이스로 메시지 기능을 제공한다ResourceBundleMessage
을 사용한다직접 빈으로 등록해야 한다
// 직접 등록
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBumndleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSrouce.setDefaultEncoding("utf-8");
return messageSource;
}
auto config에 의해 등록이 되어있다
설정을 위해선 application.properties 에 다음과 같은 Path에 값을 할당한다
// application.properties
// basename 기본값은 'messages'
spring.messages.basename = blah blah
basename
의 기본값이 messages
이므로, messages_en.properties, messages_ko.properties 등의 파일만 잘 등록해도 메시지가 잘 작동한다.
/resources
ㄴ messages.properties
ㄴ /static
ㄴ /templates
ㄴ etc...
hello=안녕
hello.name=안녕 {0}
hello=hello
hello.name=hello {0}
* Trouble Shooting
: 메시지를 포함시키지 않더라도 __basename__.properties 파일 (locale이 없는 기본 파일)을 꼭 만들어야 한다. 만들지 않으면 MessageSource 객체가 아예 생성이 안됨
MessageSource
가 등록되어 있기 때문에, 이를 불러와서 사용하면 된다MessageSource
에는 getMessage
메서드가 선언되어있다.String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;
( locale 은 Null 을 넣으면 Locale.getDefault 값이 나간다 / 참고로 내 컴퓨터는 en_KR (영어를 쓰는데, 지역은 한국) )
( args는 {0} {1} 등으로 받아올 수 있다 )
간단한MessageService
와 MessageController
코드를 확인하자
// MessageService.java
@Component
class MessageService{
private MessageSource messageSource;
String getMessage(
messageId: String,
supportLang: SupportLang,
args: Array<Any>? = null
) {
return messageSource.getMessage(messageId, args, supportLang.locale);
}
}
// MessageController.java
@RestController
class MessageController {
private MessageService service;
@GetMapping("/message/{messageId}")
String getMessage(RequestLocale requestLocale, @PathVariable String messageId) {
return service.getMessage(messageId, SupportLang.from(requestLocale.locale));
};
}
원하는 메시지가 없을때, 디폴트 메시지를 출력하는 방식도 있다. 필요하면 찾아서 사용하자.