3

ここに私のロケール設定があります

<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());
    ...
}

異なる値を返します。しかし、 URL?lang=enで GET param を使用してサイトの言語を切り替えると、前述のコントローラーの呼び出しでは何も変わりません。i18n は正常に動作し、正しいファイルからラベルをロードします。しかし、コントローラーで変更された言語を取得したいと考えています。開いたページで選択した言語を個別に取得したい(langURLにリクエストパラメータあり/なし)。

4

1 に答える 1

5

LocaleContextHolderこの目的のために Spring が提供するクラスを使用できます。ドキュメントから:

必要に応じて、Spring の現在の Locale の中心的なホルダーとして使用されます: MessageSourceAccessor など。DispatcherServlet は、現在の Locale をここで自動的に公開します。他のアプリケーションもそれらを公開して、MessageSourceAccessor などのクラスが自動的にその Locale を使用するようにすることができます。

次に、コントローラーで次のように呼び出します。

LocaleContextHolder.getLocale();

Spring を使用してロケールを取得します。

LocaleContextHolder.getLocale() javadoc.

于 2013-08-19T16:15:11.487 に答える