2013-08-19 3 views
1

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

<bean id="messageSource" 
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basename" value="classpath:messages" /> 
    <property name="defaultEncoding" value="UTF-8" /> 
</bean> 

<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.CookieLocaleResolver"> 
    <property name="defaultLocale" value="en"/> 
</bean> 

<bean id="handlerMapping" 
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="interceptors"> 
     <ref bean="localeChangeInterceptor" /> 
    </property> 
</bean> 

Когда я пытаюсь вызвать локаль в контроллере с помощью

@RequestMapping(value = "customers/customer-{idCustomer:[0-9]+}/detail", method = RequestMethod.GET) 
public ModelAndView detail(Map<String, Object> map, @PathVariable Integer idCustomer, Locale locale) { 
    logger.info(locale.toString()); 
    logger.info(request.getLocale().toString()); 
    ... 
} 

Он возвращает различные значения. Но когда я переключаю язык на сайте с использованием параметра GET в URL ?lang=en, он ничего не меняет в вызовах указанного контроллера. i18n отлично работает, он загружает ярлыки из правильного файла. Но я хочу получить измененный язык в моих контроллерах. Я хочу получить выбранный язык самостоятельно на открытой странице (с/без запроса param lang в URL).

+0

'lang = en' - всего лишь параметр запроса. Используйте '@ RequestParam'. –

+0

Да, но переменная 'lang' не будет доступна на странице без этого параметра запроса. – misco

ответ

3

Вы можете использовать класс LocaleContextHolder, который предназначен для этой цели. Из документации:

Используется в качестве центрального держателя для текущей локали весной везде, где необходимо: например, в MessageSourceAccessor. DispatcherServlet автоматически раскрывает свой текущий локаль здесь. Другие приложения могут разоблачить их, чтобы такие классы, как MessageSourceAccessor , автоматически использовали этот язык.

Тогда в контроллере просто позвоните:

LocaleContextHolder.getLocale(); 

для получения локали с использованием Spring.

LocaleContextHolder.getLocale() javadoc.

Смежные вопросы