You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC Maven项目I18n失效:仅加载messages_pl.properties求助

解决Spring MVC国际化始终读取波兰语配置的问题

咱们一步步排查修复这个问题,你的配置框架是对的,但几个细节可能导致了locale切换失效:

1. 规范国际化文件命名

Spring的ResourceBundleMessageSource会按locale后缀匹配文件:

  • 请求?lang=en时,会优先查找messages_en.properties,找不到才会 fallback 到默认的messages.properties
  • 请求?lang=pl时,会直接匹配messages_pl.properties

你提到只放置了messages.properties和messages_pl.properties,如果messages.properties是英文内容,理论上请求en时会用它,但如果浏览器默认locale是波兰语,或者session里已保存过pl的设置,就会优先加载波兰语文件。建议你专门创建messages_en.properties存放英文内容,避免默认文件的逻辑混淆。

2. 调整拦截器执行顺序

你的拦截器配置里,PerformanceMonitorInterceptor排在了LocaleChangeInterceptor前面,这会导致locale切换逻辑晚于性能监控执行,视图渲染时可能还没完成locale切换。

修改DispatcherServlet-context.xml的拦截器顺序,把LocaleChangeInterceptor放在最前面:

<mvc:interceptors>
    <!-- 优先执行locale切换拦截器 -->
    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="lang"/>
    </bean>
    <bean class="com.ehr.webstore.interceptor.PerformanceMonitorInterceptor"/>
</mvc:interceptors>

3. 测试时清理会话缓存

SessionLocaleResolver会把用户选择的locale存在session中,如果你之前访问过?lang=pl,session里会保留这个设置,后续即使传?lang=en,只要session没过期,还是会用波兰语配置。

测试时可以:

  • 关闭浏览器重新打开
  • 使用隐私/无痕窗口访问
  • 手动清除浏览器的session缓存

4. 验证当前Locale是否生效

可以在控制器里加一段代码,打印当前使用的locale,确认切换逻辑是否生效:

@GetMapping("/check-locale")
public String checkCurrentLocale(Locale locale) {
    System.out.println("当前生效的Locale: " + locale.toString());
    return "your-page";
}

访问/check-locale?lang=en,查看控制台输出的locale是否为en,如果不是,说明拦截器的逻辑没被正确触发。

按上面的步骤调整后,应该就能正常切换国际化配置了。

内容的提问来源于stack exchange,提问作者ehr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:58:48