ex)
//messages.properties
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
//addForm.html
<label for="itemName" th:text="#{item.itemName}"></label>
//editForm.html
<label for="itemName" th:text="#{item.itemName}"></label>
ex)
//messages_en.properties
item=Item
item.id=Item ID
item.itemName=Item Name
item.price=price
item.quantity=quantity
//messages_ko.properties
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
1) Basename : 설정 파일의 이름 지정
2) defaultEncoding : 인코딩 정보 지정
💡 스프링 부트의 경우
- 자동으로 MessageSource 를 스프링 빈으로 등록
메시지 소스 설정
기본값
spring.messages.basename=messages
직접 설정 가능
application.properties
spring.messages.basename=messages,config.i18n.messages
MessageSource 인터페이스
public interface MessageSource {
String getMessage(String code,
@Nullable Object[] args,
@Nullable String defaultMessage,
Locale locale);
String getMessage(String code,
@Nullable Object[] args,
Locale locale) throws NoSuchMessageException;
코드를 포함한 일부 파라미터로 메시지를 읽어오는 기능 제공
locale 정보가 없거나 찾는 파일이 없으면
basename 에서 설정한 기본 이름 메시지 파일 조회
메시지가 없는 경우 NoSuchMessageException 발생
기본 메시지(defaultMessage)를 사용하면 기본 메시지 반환
ms.getMessage("no_code", null, "기본 메시지", null);
ms.getMessage("hello.name", new Object[]{"Spring"}, null);
hello.name=안녕 {0} -> Spring 전달 -> 안녕 Spring
#{...}
ex)
<div th:text="#{label.item}"></h2>
👇
<div>상품</h2>
파라미터 적용
ex)
hello.name=안녕 {0}
<p th:text="#{hello.name(${item.itemName})}"></p>
언어 선택시 기본으로 Accept-Language 헤더 값 사용
Locale 선택 방식을 변경할 수 있는 LocaleResolver 인터페이스 제공
LocaleResolver 인터페이스
public interface LocaleResolver {
Locale resolveLocale(HttpServletRequest request);
void setLocale(HttpServletRequest request,
@Nullable HttpServletResponse response,
@Nullable Locale locale);
}
💡 스프링 부트의 경우
기본으로 Accept-Language 를 활용하는 AcceptHeaderLocaleResolver 사용