spring 的 messagesource 是实现国际化的核心组件,通过配置 resourcebundlemessagesource、准备标准命名的多语言 properties 文件(如 messages_zh_cn.properties)、注入使用并结合 localeresolver 与 localechangeinterceptor 实现自动语言切换。

Spring 中的 MessageSource 是实现国际化(i18n)的核心组件,它不依赖硬编码,靠配置和资源文件就能动态加载不同语言的文本。关键在于三步:准备多语言资源、注入 MessageSource Bean、在代码或视图中按需取值。
准备标准命名的资源文件
所有 .properties 文件必须放在 src/main/resources 目录下(即 classpath 根路径),命名严格遵循 basename_language_country.properties 规则:
- messages.properties —— 默认语言(如英文),无后缀
- messages_zh_CN.properties —— 简体中文
- messages_en_US.properties —— 美式英语
- messages_ja_JP.properties —— 日语
每个文件内容为 key=value 形式,例如:
login.title=Login Page login.username=Username login.password=Password
中文文件对应写:
login.title=登录页面 login.username=用户名 login.password=密码
注意:文件必须用 UTF-8 编码保存,否则中文会乱码。
配置 MessageSource Bean
推荐使用 ResourceBundleMessageSource,它是 Spring 最常用、最稳定的实现。Java 配置方式如下:
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasename("messages"); // 对应文件前缀
source.setDefaultEncoding("UTF-8"); // 强制 UTF-8 解析
source.setUseCodeAsDefaultMessage(true); // 找不到翻译时返回 key,便于排查遗漏
return source;
}
如果你用的是 Spring Boot,也可以用 yml 简化配置:
spring:
messages:
basename: messages
encoding: UTF-8
default-locale: zh-CN
该配置等效于上面的 Java Bean,且自动注册名为 messageSource 的 Bean,可直接注入使用。
在 Controller 或 Service 中获取翻译
通过 @Autowired 注入 MessageSource,再结合当前 Locale 获取对应文本:
@Autowired
private MessageSource messageSource;
@GetMapping("/login")
public String login(Model model) {
Locale locale = LocaleContextHolder.getLocale(); // 自动获取请求语言
String title = messageSource.getMessage("login.title", null, locale);
model.addAttribute("title", title);
return "login";
}
支持带参数的占位符,比如:
welcome.message=欢迎 {0},您已登录 {1} 次
调用时传入 Object[] 参数:
messageSource.getMessage("welcome.message",
new Object[]{"张三", 5}, locale);
配合 LocaleResolver 实现自动语言识别与切换
仅靠 MessageSource 还不能自动选语言,需要搭配 LocaleResolver 和 LocaleChangeInterceptor:
- CookieLocaleResolver:把用户选择的语言存在 Cookie 中,下次请求自动读取
-
AcceptHeaderLocaleResolver(默认):根据 HTTP 请求头
Accept-Language自动匹配(浏览器语言设置) -
LocaleChangeInterceptor:监听特定参数(如
?lang=zh_CN)并切换语言
示例配置拦截器:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("lang"); // 访问 /xxx?lang=zh_CN 即切换
registry.addInterceptor(interceptor);
}
}
这样用户访问 /login?lang=zh_CN 就能实时看到中文界面,无需重启服务。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











