Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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 контексте, поэтому просто добавили его (выглядит как взломать, но самое быстрое решение, которое мы нашли).