0

私は非常に標準的な構成をしており、何度も編集を続け、SOに関する他の質問をチェックしましたが、最終的な構成ではほとんどの人が問題を解決しましたが、結果は得られませんでした. 次のようなリクエストを発行するときはいつでも:

http://localhost:8080/appName/?lang=es_MX

また

http://localhost:8080/appName?lang=es_MX正しいロケールに解決されず、何もしません。

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="/WEB-INF/messages" />
    </bean>


    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>


     <mvc:interceptors>
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
            <property name="paramName" value="lang" />
        </bean>
    </mvc:interceptors>

ヘッダーによるデフォルトのロケールリゾルバーが機能することを知っているので、messageResource と .jsp 構成が正しいことを知っています。

ハンドラー マッピングの定義方法と関係がありますか?

@RequestMapping(value = "/", method = RequestMethod.GET)
public String home( Model model, Locale locale, HttpServletRequest hr) {

    String header = hr.getHeader("User-Agent");
    model.addAttribute("header", header);
    String contextPath = hr.getContextPath();
    model.addAttribute("contextPath", contextPath);

    return "index";
}

神よ、私はこれに多くの時間を費やしました...助けてください

4

2 に答える 2

3

インターセプターを他の構成の代わりに servlet-context.xml に配置することで解決しました。なぜ servlet-context.xml では機能し、私の専用構成では機能しないのかを理解しようとしています。あなたの洞察は貴重です! :-)理由が説明されていないため、回答を受け入れていません。これが事実である理由を説明してください(したがって、テストできます-理想的には、インターセプターがカスタム構成に配置されます)。

困っている人は、これを試してください:

<interceptors>
        <beans:bean
            class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"
            p:paramName="lang" />
</interceptors>

servlet-context.xml 内

名前空間が必要です:

 xmlns:p="http://www.springframework.org/schema/p" 

SessionLocaleResolver は場所を気にしないようで、カスタム構成の場所でも機能します。

于 2013-09-04T16:06:11.720 に答える
0

API ドキュメントを確認 -> http://static.springsource.org/spring/docs/3.2.4.RELEASE/javadoc-api/org/springframework/web/servlet/i18n/SessionLocaleResolver.html

また、SessionLocaleResolver の resolveLocale メソッドのソース:

public Locale resolveLocale(HttpServletRequest request) {
    Locale locale = (Locale) WebUtils.getSessionAttribute(request, LOCALE_SESSION_ATTRIBUTE_NAME);
    if (locale == null) {
        locale = determineDefaultLocale(request);
    }
    return locale;
}

次に、リクエストから Locale を取得します。

protected Locale determineDefaultLocale(HttpServletRequest request) {
    Locale defaultLocale = getDefaultLocale();
    if (defaultLocale == null) {
        defaultLocale = request.getLocale();
    }
    return defaultLocale;
}

そして ServletRequest.getLocale メソッドのドキュメントでは:

Accept-Language ヘッダーに基づいて、クライアントがコンテンツを受け入れる優先ロケールを返します。クライアント要求が Accept-Language ヘッダーを提供しない場合、このメソッドはサーバーの既定のロケールを返します。戻り値: クライアントの優先ロケール

LocaleChangeInterceptor の仕事である正しいセッション属性を更新して、ロケールを変更する必要があるようです。

その場合、インターセプターに何か問題がある可能性があります。ロケールを正しい LocaleResolver に設定しますか? スプリング構成全体を投稿できますか? mvc 名前空間は正しいですか?

ここに完全な i18n チュートリアルがあります -> http://www.mkyong.com/spring-mvc/spring-mvc-internationalization-example/

于 2013-09-04T06:59:22.243 に答える