Using Locale

Request가 들어오면 Dispatcher는 Locale resolver를 찾게 되고 만약에 있으면 Locale을 설정할 때 사용한다.RequestContext.getLocale() 메소드를 사용해서 Locale resolver에 의해 설정 된 Locale을 가져올 수 있으며 Locale resolver는 다음과 같다.

AcceptHeaderLocaleResolver

사용자의 브라우져에서 보내진 request의 헤더에 accept-language부분에서 Locale을 읽어들인다. 사용자의 OS locale을 나타낸다.
<bean id="localeResolver"
	class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver" />

CookieLocaleResolver

사용자의 쿠키에 설정된 Locale을 읽어 들인다. 다음과 같은 속성을 설정할 수 있다.
속성
기본값
설명
cookieName classname + LOCALE 쿠키 이름
cookieMaxAge Integer.MAX_INT 쿠키 살려둘 시간. -1로 해두면 브라우저를 닫을 때 없어짐
cookiePath / Path를 지정해 주면 해당 하는 path와 그 하위 path에서만 참조
<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>

SessionLocaleResolver

requst가 가지고 있는 session으로 부터 locale 정보를 가져온다.
<bean id="localeResolver"
	class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />

LocaleChangeInterceptor

HandlerMapping에 인터셉터를 등록하여 특정 locale의 요청을 가로채서 특정 파라미터에 넘어 온 값으로 locale을 알아낼 수 있다. 속성 정의 파일내의 LocaleChaneInterceptor정의 예는 다음과 같다.
<bean id="localeResolver"
      class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
      
<bean id="localeChangeInterceptor"
      class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="siteLanguage"/>
</bean>

<bean id="urlMapping"
      class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="localeChangeInterceptor"/>
        </list>
    </property>
    <property name="mappings">
        <value>/list.do=getUserListController</value>
    </property>
</bean>
여기서는 모든 /list.do 요청을 가로채서 siteLanguage라는 request의 파라미터로 locale을 알아낼 수 있다.

다국어 지원 기능

Spring MVC는 다국어를 지원하기 위하여 위와같은 종류의 LocaleResolver를 가지고 있으며 빈 설정 파일에 정의하지 않을 경우 디폴트로 AcceptHeaderLocaleResolver를 이용한다. 또한 application 사용자들이 원하는 언어를 직접 선택할 수 있도록 구현해야 한다면 CookieLocaleResolver 또는 SessionLocaleResolver를 이용하여 구현한다. application의 화면은 한글만 지원하는 것이 아니라 영어등의 언어도 지원해야 하므로 메시지를 MessageSource로 추출하여 구현해야한다. Spring MVC에서는 이러한 MessageSource에서 추출한 메시지를 화면에 출력해 줄 수있는 tag 라이브러리를 제공하며 사용 방법은 아래와 같다.
  • Step 1 : properties 파일 작성
  • 각각 언어에 따른 properties파일을 생성하고 출력할 메시지를 작성한다. ResourceBudleEditor 이클립스 플러그인을 사용하면 쉽게 작성할 수 있다.
    • 한글용 (titles_ko.properties)
    • titles.hello = \uC2A4\uD504\uB9C1 MVC \uC138\uACC4\uC5D0 \uC624\uC2E0\uAC83\uC744 
      	      \uD658\uC601\uD569\uB2C8\uB2E4!!
    • 영어용, default용 (titles.properties, titles_en.properties)
    • titles.hello = Hello Spring MVC World
  • Step 2 : MessageSource 정의
  • 다음과 같이 빈 속성 정의 파일에 MessageSource파일을 정의한다.
    <bean id="messageSource"
       class="org.springframework.context.support.ResourceBundleMessageSource">
       <property name="basenames">
          <list>
             <!-- properties파일의 이름을 등록한다. 
                                등록되 있지 않을 시에 디폴트로 message.properties파일을 찾는다.-->
             <value>message</value>
          </list>
       </property>
    </bean>
  • Step 3: JSP 파일 작성
  • JSP파일에서 등록한 message를 출력하기 위해서 Spring에서 제공하는 태그라이브러리를 등록한다.
    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
    다음과 같이 <spring:message> 태그를 사용하여 메시지를 출력할 수 있다.
    <spring:message code="titles.hello" />
    이러한 spring:message 태그의 속성은 다음과 같다.
    속성
    설명
    arguments 부가적인 인자를 넘겨줌. 콤마로 구분된 문자열, 객체 배열, 객체 하나를 넘김.
    argumentSeparator 넘겨줄 인자들의 구분자 설정. 기본값은 콤마.
    code 룩업할 메시지의 키 지정. 지정하지 않으면 text에 입력한 값 출력.
    htmlEscape html 기본 escapse 속성 오버라이딩. 기본값 false.
    javaScriptEscape 기본값 false
    message MessageSourceResolvable 인자로 Spring MVC validation을 거친 errors의 메시지를 쉽게 보여줄 때 사용
    scope 결과 값을 변수에 지정할 때 변수의 scope 지정 (page, request, session, application)
    text 해당 code로 가져온 값이 없을 때 기본으로 보여줄 문자열. 빈 값이면 null 출력.
    var 결과 값을 이 속성에 해당한 문자열에 바인딩 할 때 사용. 빈 값이면 그냥 JSP에 뿌려줌.

Resources