Spring MVC Maven项目I18n失效:仅加载messages_pl.properties求助
咱们一步步排查修复这个问题,你的配置框架是对的,但几个细节可能导致了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

