Spring 아키텍처의 대부분은 Spring 웹 MVC 프레임워크처럼 국제화(internalization)를 지원합니다. DispatcherServlet
을 사용하면 클라이언트의 로케일을 사용하여 메시지를 자동으로 resolve할 수 있습니다. 이는 LocaleResolver
개체를 사용하여 수행됩니다.
요청이 들어오면 DispatcherServlet
은 로케일 resolver를 찾고, 찾으면 이를 사용하여 로케일을 설정하려고 시도합니다. RequestContext.getLocale()
메소드를 사용하면 로케일 resolver에 의해 resolve된 로케일을 항상 검색할 수 있습니다.
자동 로케일 확인 외에도 인터셉터를 핸들러 매핑(핸들러 매핑 인터셉터에 대한 자세한 내용은 Interception 참조)에 연결하여 특정 상황(예: 요청의 매개변수 기반)에서 로케일을 변경할 수도 있습니다.
로케일 resolver와 인터셉터는 org.springframework.web.servlet.i18n
패키지에 정의되어 있으며 일반적인 방식으로 애플리케이션 컨텍스트에서 구성됩니다. 다음과 같은 로케일 resolver가 Spring에 포함되어 있습니다.
클라이언트의 로케일을 얻는 것 외에도 해당 시간대(time zone)를 아는 것이 유용한 경우가 많습니다. LocaleContextResolver
인터페이스는 resolver가 시간대 정보를 포함할 수 있는 보다 풍부한 LocaleContext
를 제공할 수 있도록 하는 LocaleResolver
에 대한 확장을 제공합니다.
가능한 경우 RequestContext.getTimeZone()
메서드를 사용하여 사용자의 TimeZone
을 얻을 수 있습니다. 시간대 정보는 Spring의 ConversionService
에 등록된 모든 날짜/시간 Converter
및 Formatter
객체에 의해 자동으로 사용됩니다.
이 로케일 확인자는 클라이언트(예: 웹 브라우저)가 보낸 요청에서 accept-language
헤더를 검사합니다. 일반적으로 이 헤더 필드에는 클라이언트 운영 체제의 로캘이 포함됩니다. 이 resolver는 시간대 정보를 지원하지 않습니다.
이 로케일 확인자는 클라이언트에 존재할 수 있는 Cookie
를 검사하여 Locale
또는 TimeZone
이 지정되었는지 확인합니다. 그렇다면 지정된 세부 정보를 사용합니다. 이 로캘 resolver의 속성을 사용하면 쿠키 이름과 최대 수명을 지정할 수 있습니다. 다음 예제에서는 CookieLocaleResolver
를 정의합니다.
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieName" value="clientlanguage"/>
<!-- in seconds. If set to -1, the cookie is not persisted (deleted when browser shuts down) -->
<property name="cookieMaxAge" value="100000"/>
</bean>
다음 표에는 CookieLocaleResolver
속성(property)이 설명되어 있습니다.
속성 | 기본값 | 설명 |
---|---|---|
|
클래스 이름 + LOCALE |
쿠키의 이름 |
|
서블릿 컨테이너 기본값 |
쿠키가 클라이언트에 유지되는 최대 시간. |
|
/ |
쿠키의 가시성(visibility)을 사이트의 특정 부분으로 제한합니다. |
SessionLocaleResolver
를 사용하면 사용자 요청과 연결될 수 있는 세션에서 Locale
및 TimeZone
을 검색할 수 있습니다. CookieLocaleResolver
와 달리 이 전략은 로컬에서 선택한 로케일 설정을 서블릿 컨테이너의 HttpSession
에 저장합니다. 결과적으로 이러한 설정은 각 세션마다 일시적이므로 각 세션이 종료되면 손실됩니다.
Spring Session 프로젝트와 같은 외부 세션 관리 메커니즘과 직접적인 관계가 없다는 점에 유의하세요. 이 SessionLocaleResolver
는 현재 HttpServletRequest
에 대해 해당 HttpSession
속성을 평가하고 수정합니다.
HandlerMapping
정의 중 하나에 LocaleChangeInterceptor
를 추가하여 로케일 변경을 활성화할 수 있습니다. 요청에서 매개변수를 감지하고 이에 따라 로케일을 변경하여 디스패처의 애플리케이션 컨텍스트에서 LocaleResolver
의 setLocale
메소드를 호출합니다. 다음 예에서는 siteLanguage
라는 매개변수가 포함된 모든 *.view
리소스에 대한 호출이 이제 로케일을 변경함을 보여줍니다. 예를 들어, www.sf.net/home.view?siteLanguage=nl
이라는 URL을 요청하면 사이트 언어가 네덜란드어로 변경됩니다. 다음 예에서는 로케일을 가로채는 방법을 보여줍니다.
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="siteLanguage"/>
</bean>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor"/>
</list>
</property>
<property name="mappings">
<value>/**/*.view=someController</value>
</property>
</bean>