다국어 처리 - localeResolver, messageSource

FRAMEWORK/SPRING 2013. 7. 15. 15:02

스프링에서 다국어를 처리하려면

LocaleChangeInterceptor + messageSource

조합으로 가능하다.
국가별로 페이지들 별도로 만드는짓은 더이상 하지 말자.

만약 서버단에서 위의 조합으로 다국어 처리된 문자열을
jsp단으로 보내주고 싶을 경우에는
추가로 taglib를 사용하면 된다.


1. LocaleResolver

말그대로 현재 접속된 사용자에게 적합한 언어셋을 제공하기 위해
브라우저의 useragent 값이나 쿠키, 세션을 통해 locale 값을 처리한다.
그래서 우선 해당 xml에 아래처럼 추가해준다.

<applicationContext.xml>

<mvc:interceptors>  
        <bean  id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
            <property name="paramName" value="lang"></property>
        </bean>
</mvc:interceptors>

<bean id="localeResolver"  class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>


localeResolver의 종류는 3가지가 있다.
defalut는 AceeptHeaderLocaleResolver이다.
reqest 헤더의 accept-language부분에서 locale을 읽어온다.
나머지는 이름 그대로 쿠키나 세션을 사용한다.

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver" />


<bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver" >
    <property name="cookieName" value="clientlanguage"/>    
    <property name="cookieMaxAge" value="100000"/>
    <property name="cookiePath" value="web/cookie"/>
</bean>


<bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />



2. MessageSource

locale값이 정해지면 Spring에서해는 해당 locale의 messagesource의 값으로 변환해서 돌려준다.
그래서 우선 localechangeinterceptor처럼 xml에 등록먼저 해주자.

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="WEB-INF/messages/Messages"/>
        <property name="defaultEncoding" value="UTF-8" />
        <property name="cacheSeconds" value="180"/>
</bean>

※ basename : Messages 파일 위치

본인의 설정에서는
WEB-INF/messages폴더밑에
'Messages_[locale]' 형태의 파일을 만들었다.







ko와 en두가지 버전이 있다.
만약 locale값이 ko,en이 아닐 경우
맨 마지막에 있는 Message.properties를 참조하게 된다.


왼쪽은 변수명이고,
오른쪽은 locale값이 ko 일경우에
돌려주는 값이다.
Messages 파일에서는 영어가 아닐 경우
자동으로 유니코드값으로 변환되어 기록된다.
그러나 출력시에는 저렇게 유니코드값이 아닌 정상적으로 출력된다.


3. message 호출

위처럼 만들고 써먹으려면 아래 함수를 호출하면 된다.
code는 2번에서 작성한 좌측의 변수명이고
locale은 말그대로 locale이다

import org.springframework.context.MessageSource;
......
messageSource.getMessage(code, null, locale)


임의적으로 locale값을 설정하고 싶으면

localeResolver.setLocale(request, response, Locale.KOREA);


처럼 하면 된다.


4. jsp에서 처리 (taglib)

localeResolver와 message 프로퍼티 설정이 끝나면
jsp에서도 바로 다국어 처리가 가능하다.

우선 jsp 상단에

<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>


를 추가하고,
다국어 처리가 필요한 부분에

<spring:message code="code_name"/>

를 삽입해주면 된다.


출처 - http://changpd.blogspot.kr/2013/05/localeresolver-messagesource.html

: