Как получить текущую локаль пользователя из Spring, не передавая ее в качестве параметра в функции?



Я использую Spring 3.1 и хочу найти локаль, активную для текущего пользователя, есть ли способ захватить локаль напрямую, не будучи вынужденным передавать ее с контроллера на уровень сервиса ... так далее.



сохраняет ли spring локаль в локальном хранилище потока, где ее можно захватить, вызвав какой-либо статический метод?

674   3  

3 ответов:

Я также искал, как получить доступ к локали без передачи Locale вокруг, но я все еще довольно новичок в Spring и нашел большинство решений, которые сбивают с толку. Оказывается, однако, что Spring MVC хранит локаль в локальном хранилище потоков. Он может быть доступен по адресу:

Locale locale = LocaleContextHolder.getLocale();

последний подход...] основан на локальном потоке, чтобы обеспечить текущую локаль в любом объекте вашей архитектуры. [...] Вы должны знать, что содержание LocaleContextHolder по умолчанию соответствует языковому стандарту, указанному в веб-запросе.

от: настройка переключения локали с помощью Spring MVC 3. (Этот пост также предлагает альтернативные конфигурации / методы для получения локали, которые могут быть полезны для тех, кто хочет это сделать).

вы также можете посмотреть LocaleContextHolder документы с весны здесь.

Это зависит от того, где вы настроили хранить язык в сессии или в куки?

в моем приложении я настроил для хранения языкового стандарта пользователя в его сеансе с приведенной ниже конфигурацией.

    <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 из сеанса.

надеюсь, что это поможет вам.

Ура.

у нас была такая же потребность, так-то Locale на ThreadLocal контексте. У нас уже был объект (некоторая пользовательская информация), хранящийся в ThreadLocal контекст, так что просто добавил его (выглядит как хак, но самое быстрое решение, которое мы нашли).

Comments

    Ничего не найдено.