쌓고 쌓다

메시지, 국제화 사용하기 본문

프로그래밍/spring

메시지, 국제화 사용하기

승민아 2023. 8. 21. 19:14

사용자에게 보이는 HTML 화면에 "상품명"이라는 단어를 모두 "상품 이름"으로 바꾸길 원한다.

 

하지만 "상품명"은 아래처럼 하드코딩되어 있다.

<h2>상품명</h2>

"상품명"을 "상품 이름"으로 바꾸길 원한다면 모든 파일을 하나하나 열어서 수정해야 한다.

 

이 문제를 해결할 좋은 메시지 기능이 있다.

이런 문자열 메시지를 한 곳에서 관리하는 것이다.

 

resources 아래에 messages.properties로 관리 파일을 만들자.

 

그리고 아래의 내용을 작성해 보자.

 

messages.properties

label.item=상품
label.item.id=상품 ID
label.item.itemName=상품명

Key와 Value 형식이다.

{0}로 파라미터를 받을 수 있다.

 

test.html

<th th:text="#{label.item.id}">TEST</th>
<th th:text="#{label.item.itemName}">TEST</th>

타임리프의 #{...}를 통해 메시지식을 사용할 수 있다.

그러면 <th>TEST</th>에 TEST 부분의 텍스트가 #{...} 메시지 식으로 넣어진다.

 

이렇게 messages.properties를 통해 모든 파일의 메시지를 관리할 수 있다.

 

파라미터는 아래와 같이 사용할 수 있다.

hello.name=안녕 {0}

<p th:text="#{hello.name(${item.itemName})}"></p>

 

스프링 메시지 소스 등록

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasenames("messages", "errors");
    messageSource.setDefaultEncoding("utf-8");
    return messageSource;
}

메시지 관리 기능을 사용하려면

스프링이 제공하는 MessageSource 인터페이스를 스프링 빈으로 등록해야 한다.

구현체로 ResourceBundleMessageSource를 사용한다.

  • setBasenames: 설정 파일의 이름을 지정한다. 예로 messages, errors를 등록함.
    • 파일의 위치는 /resources/messages.properties이다.
    • 국제화 기능을 사용하면 messages_en.properties처럼 끝에 언어 정보를 적는다.

 

스프링부트 메시지 소스 등록

스프링부트는 MessageSource를 자동으로 스프링 빈으로 등록한다.

메시지 소스 설정은 아래와 같이 한다.

 

application.properties

spring.messages.basename=messages,...

messages는 기본값이다.

 

국제화

messages.properties: 기본 값으로 한글을 Value로 적음.

messages_en.properties: 영어. 값으로 영어를 적음

*찾는 국제화 파일이 없다면 messages.properties(언어정보가 없는 파일)를 기본으로 사용한다.

 

-- messages.properties --
label.item=상품
label.item.id=상품 ID
label.item.itemName=상품명

-- messages_en.properties --
label.item=Item
label.item.id=Item ID
label.item.itemName=Item Name

 

이제 요청 메시지의 헤더에 있는 Accept-Language에 따라 언어를 선택하여 렌더링 한다.

Comments