Большинство составляющих архитектуры 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:

Распознаватель сессий

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>