메시지, 국제화 소개
'상품명' -> '상품이름' 으로 모두 바꿔주려면 어떻게 해야할까?
=> 수십개의 파일에 가서 직접 이름을 바꿔줘야한다
이때 messages.properties 라는 메시지 관리용 파일을 만들자
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
이후
//addForm.html
<label for="itemName" th:text="#{item.itemName}"></label>
//이런식으로 해당 데이터를 key값으로 불러서 사용 가능
위에 설정한 메시지파일 (messages.properties) 를 나라별로 관리 => 국제화
messages_en.properties
messages_ko.properties
두 파일을 생성하고 각 나라별로 접근이 다르므로
(HTTP acept-language 헤더 값을 사용하거나 사용자가 직접 언어를 선택하도록 하고, 쿠키 등을 사용해서 처리)
스프링 메시지 소스 설정
스프링은 기본적인 메시지 관리 기능을 제공
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource
= new ResourceBundleMessageSource();
//MessageSource 인터페이스의 구현체인
//ResourceBundleMessageSource 를 스프링빈으로 등록
messageSource.setBasenames("messages", "errors"); // 설정 파일의 이름 지정
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
스프링 메시지 소스 사용
ms.getmessage("hello", null, null)
// code: hello, args: null, locale: null
//locale 정보가 없으면 basename에서 설정한 기본 이름 메시지 파일 조회
웹 애플리케이션에 메시지 적용하기
//messages.properties
label.item=상품
label.item.id=상품 ID
label.item.itemName=상품명
...
<div th:text="#{label.item}"></h2>
웹 애플리케이션에 국제화 적용하기
//messages_en.properties
label.item=Item
label.item.id=Item ID
label.item.itemName=Item Name
...
크롬 -> 설정 -> 언어를 검색해서 우선 순위 변경하여 국제화 적용여부 확인 가능
(이렇게 웹 브라우저에서 언어 설정 값 요청 시 Accept_Language의 값이 변경된다
)
Accept-Language 는 클라이언트가 서버에 기대하는 언어 정보를 담아서 요청하는 HTTP 요청 헤더이다.
스프링의 메시지 기능은 Locale 정보를 알아야 언어 선택이 가능한데, 기본으로 Accept-Language 헤더의 값을 사용한다.
public interface LocaleResolver {
Locale resolveLocale(HttpServletRequest request);
void setLocale(HttpServletRequest request, @Nullable HttpServletResponse
response, @Nullable Locale locale);
}
LocaaleResolver의 구현체에서 쿠키나 세션 기반의 Locale을 사용하도록 선택기능 사용 가능 -> 클라이언트가 직접 Locale 선택 가능
Reference
김영한 님 - 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술