메시지
만약 프로그램의 "상품명" 이라는 단어를 "상품이름"이라는 단어로 고쳐야 한다면 상당히 어렵다. 만약 화면이 수십개 이상이라면 이것을 전부 고쳐야 한다.
이처럼 해당 html 파일에 메세지가 하드코딩 되어 있기 때문이다.
따라서 이처럼 다양한 메세지를 한 곳에서 관리하도록 하는 기능을 메시지 기능이라 한다.
메세지는 다음과 같이 관리할 수 있다.
//message.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>
국제화
//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;
}
스프링 부트
//application.properties
spring.messages.basename=messages,config.i18n.messages
spring.messages.basename=messages
메세지 파일 만들기
스프링 메세지 소스
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;
}
이번엔 argument 값을 넘겨보겠다. Object를 통해 배열에 "Spring"을 넣어 치환해줄 수 있다.
Locale 값 설정을 통해 국제화 파일을 선택해보겠다. English를 지정하면 hello를 써도 KOREA와 다르게 hello가 출력되는 것을 확인할 수 있다
웹 어플리케이션에 메시지 적용하기
위 메세지 설정 정보를 messages.properties에 추가한다.
타임리프를 활용해 메세지 설정 정보의 파라미터 값을 넘겨주면 "상품 등록 폼"으로 html에 작성되어 있던 문구가 메시지 설정 정보에 의해 "상품 등록"으로 변경되었다.
다른 html도 수정해주면 한꺼번에 반영된다.
hello.name=안녕 {0}
<p th:text="#{hello.name(${item.itemName})}"></p>
웹 어플리케이션에 국제화 적용하기
크롬의 설정-언어 에서 영어를 맨 위로 올리면
다음과 같이 messages_en.properties를 따르는 메세지 설정 정보가 자동으로 적용된다.
이유는 언어 설정 값을 변경하는 순간 http 헤더의 Accept-Language 값이 변경되기 때문이다.
Accept-Language 는 클라이언트가 서버에 기대하는 언어 정보를 담아서 요청하는 HTTP 요청 헤더이다.
locale.english를 넘겨주는 것과 같다.
스프링의 국제화 메세지 선택
위처럼 메세지 기능은 locale 정보를 알아야 언어를 선택할 수 있다.
따라서 스프링도 locale을 알아야 하는데, 스프링은 기본적으로 http 헤더의 accept-language 값을 가지고 언어를 선택한다.
또 스프링은 locale 선택 정보를 변경할 수 있는 인터페이스 또한 제공한다. 이를 LocaleResolver라 하며 스프링 부트는 기본으로 Accept-Language 를 활용하는 AcceptHeaderLocaleResolver 를 사용한다