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 配置也是正确的,因为我明确设置了一个浏览器以具有 es_MX 语言环境,并且它可以正确地使用 AcceptHeaderLocaleResolver 解析。

它与我的处理程序映射的定义方式有关吗?

@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;
}

它将依次从请求中获取语言环境:

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 回答