Большинство составляющих архитектуры Spring поддерживают интернационализацию, как и веб-фреймворк Spring MVC. DispatcherServlet
позволяет автоматически распознавать сообщения, используя региональные настройки (локаль) клиента. Это делается с помощью объектов LocaleResolver
.
Когда поступает запрос, DispatcherServlet
ищет распознаватель региональных настроек и, если находит его, пытается использовать его для установки региональных настроек. Используя метод RequestContext.getLocale()
, вы всегда сможете получить региональные настройки, которые были распознаны распознавателем региональных настроек.
В дополнение к автоматическому распознаванию региональных настроек, вы также можете привязать перехватчик к отображению обработчиков, чтобы изменить региональные настройки при определенных обстоятельствах (например, на основе параметра в запросе).
Распознаватели региональных настроек и перехватчики определяются в пакете org.springframework.web.servlet.i18n
и конфигурируются в контексте вашего приложения обычным образом. В Spring включен следующий набор распознавателей региональных настроек.
-
Часовой пояс
-
Распознаватель заголовков
-
Распознаватель cookie
-
Распознаватель сессий
-
Перехватчик региональных настроек
Часовой пояс
В дополнение к получению региональных настроек клиента, зачастую полезно знать его часовой пояс. Интерфейс LocaleContextResolver
предоставляет расширение LocaleResolver
, позволяющее распознавателям обеспечивать более функциональный LocaleContext
, который может содержать информацию о часовом поясе.
Если доступно, TimeZone
пользователя можно получить с помощью метода RequestContext.getTimeZone()
. Информация о часовом поясе автоматически используется всеми объектами Converter
и Formatter
даты/времени, которые зарегистрированы в ConversionService
из Spring.
Распознаватель заголовков
Этот распознаватель региональных настроек проверяет заголовок accept-language
в запросе, отправленном клиентом (например, веб-браузером). Обычно это поле заголовка содержит региональные настройки операционной системы клиента. Обратите внимание, что этот распознаватель не поддерживает информацию о часовом поясе.
Распознаватель cookie
Этот распознаватель региональных настроек проверяет Cookie
, которые могут существовать на стороне клиента, на предмет заданных Locale
или TimeZone
. Если таковые есть, то используются заданные сведения. Используя свойства этого распознавателя региональных настроек, вы можете задать имя cookie, а также максимальный срок действия. В следующем примере определен CookieLocaleResolver
:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieName" value="clientlanguage"/>
<!-- в секундах. Если установлено значение -1, cookie не сохраняется (удаляется при закрытии браузера) -->
<property name="cookieMaxAge" value="100000"/>
</bean>
В следующей таблице описаны свойства CookieLocaleResolver
:
Свойство | По умолчанию | Описание |
---|---|---|
|
имя класса + LOCALE |
Имя cookie |
|
Контейнер сервлетов по умолчанию |
Максимальное время, в течение которого cookie хранится на стороне клиента. Если задано |
|
/ |
Ограничивает видимость cookie определенной частью вашего сайта. Если задан |
Распознаватель сессий
SessionLocaleResolver
позволяет получать Locale
и TimeZone
из сессии, которая может быть связана с запросом пользователя. В отличие от CookieLocaleResolver
, эта стратегия хранит локально выбранные региональные настройки в HttpSession
контейнера сервлета. Как следствие, эти настройки являются временными для каждой сессии и, следовательно, теряются при завершении каждой сессии.
Обратите внимание, что здесь нет прямой связи с внешними механизмами управления сессиями, такими как проект Spring Session. Этот SessionLocaleResolver
вычисляет и изменяет соответствующие атрибуты HttpSession
в текущем HttpServletRequest
.
Перехватчик региональных настроек
Вы можете включить активировать смену региональных настроек, добавив LocaleChangeInterceptor
к одному из определений HandlerMapping
. Он обнаруживает параметр в запросе и соответствующим образом изменяет региональные настройки, вызывая метод setLocale
для LocaleResolver
в контексте приложения диспетчера. В следующем примере показано, что вызовы всех ресурсов *.view
, содержащих параметр с именем siteLanguage
, теперь будут изменять региональные настройки. Так, например, запрос по URL-адресу https://www.sf.net/home.view?siteLanguage=nl
меняет язык сайта на голландский. В следующем примере показано, как перехватить региональные настройки:
<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>