Більшість складових архітектури 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>