Как получить текущий пользовательский язык из Spring, не передавая его в качестве параметра для функций?
Я использую Spring 3.1 и хочу, чтобы локаль была активной для текущего пользователя, есть способ захватить локаль напрямую, не будучи вынужденным передать ее с контроллера на сервисный уровень... и т.д.
выполняет ли Spring сохранение локали в локальном хранилище потоков, где его можно схватить, вызвав некоторый статический метод?
Ответы
Ответ 1
Я также искал, как получить доступ к языку без передачи Locale
, но я все еще довольно новичок в Spring и нашел, что большинство решений путают. Оказывается, однако, что Spring MVC сохраняет локаль в локальном хранилище потоков. К нему можно получить доступ:
Locale locale = LocaleContextHolder.getLocale();
Последний подход [...] основан на локальном потоке, чтобы обеспечить текущую локаль в любом объекте вашей архитектуры. [...] Вы должны знать, что содержимое LocaleContextHolder по умолчанию соответствует языку, указанному в веб-запросе.
От: Настройка переключения локалей с помощью Spring MVC 3. (Этот пост также предлагает альтернативные конфигурации/методы для получения локали, которые могут быть полезны для тех, кто хочет это сделать).
Вы также можете просмотреть документы LocaleContextHolder
из Spring здесь.
Ответ 2
В зависимости от того, где вы настроили сохранение локали, сеанса или файла cookie?
В моем приложении я настроил сохранение локали пользователя в своем сеансе с указанной ниже конфигурацией.
<mvc:interceptors>
<ref bean="localeChangeInterceptor"/>
</mvc:interceptors>
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang"/>
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="en"/>
</bean>
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>/WEB-INF/i18n/labels</value>
<value>/WEB-INF/i18n/messages</value>
<value>/WEB-INF/i18n/include</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
Если вы сделали что-то подобное, вы можете легко получить параметр locale из сеанса.
Надеюсь, это поможет вам.
Приветствия.
Ответ 3
У нас была такая же потребность, поэтому возникла проблема с помещением Locale
в контекст ThreadLocal
. У нас уже был объект (некоторая информация пользователя), хранящаяся в ThreadLocal
контексте, поэтому просто добавили его (выглядит как взломать, но самое быстрое решение, которое мы нашли).