Spring Boot 如何支持国际化
🌍 一、什么是“国际化”(i18n)?
- 让同一个应用能 自动显示不同语言的内容。
- 比如:
- 用户浏览器语言是
zh-CN(简体中文)→ 显示“欢迎” - 用户语言是
en-US(美式英语)→ 显示“Welcome”
- 用户浏览器语言是
Spring Boot 通过 MessageSource 接口实现这一功能,而它默认使用 资源文件(properties 文件) 来存储不同语言的消息。
📁 二、默认行为:自动配置 MessageSource
✅ 自动生效的条件:
Spring Boot 只有在 classpath 根目录下找到
messages.properties文件时,才会自动配置MessageSource。
也就是说:
- 如果你有
messages.properties(这是默认语言,通常是英文或中性语言),Spring Boot 会自动启用国际化支持。 - 如果你只有
messages_zh.properties或messages_fr.properties,但没有messages.properties,那么 Spring Boot 不会自动配置MessageSource!
💡 所以:必须提供一个默认的
messages.properties,即使它是空的!
📦 三、如何自定义资源包位置?
你可以通过 application.properties 或 application.yml 修改默认设置:
# 指定多个资源文件基名(basename),用逗号分隔
spring.messages.basename=messages,config.i18n.messages# 是否回退到系统本地语言(默认 true)
spring.messages.fallback-to-system-locale=false
解释:
-
spring.messages.basename=messages,config.i18n.messages- 表示 Spring 会去加载两类资源文件:
messages.properties、messages_zh_CN.properties等config/i18n/messages.properties、config/i18n/messages_en.properties等
- 路径可以是:
- 类路径根目录下的文件(如
messages.properties) - 包路径形式(如
config.i18n.messages→ 对应classpath:config/i18n/messages.properties)
- 类路径根目录下的文件(如
- 表示 Spring 会去加载两类资源文件:
-
spring.messages.fallback-to-system-locale=false- 默认为
true:如果用户 locale 是zh-CN,但找不到messages_zh_CN.properties,就会尝试messages_zh.properties→ 再找不到就用系统默认 locale(比如服务器操作系统的语言)。 - 设为
false:找不到精确匹配就直接用messages.properties(不回退到系统 locale)。
- 默认为
🗂️ 四、资源文件命名规则
假设你的 basename 是 messages,那么 Spring 会按以下优先级查找:
| 用户 Locale | 尝试加载的文件(按顺序) |
|---|---|
zh_CN | messages_zh_CN.properties → messages_zh.properties → messages.properties |
fr | messages_fr.properties → messages.properties |
| 任意未知 locale | 直接用 messages.properties |
⚠️ 注意:
messages.properties是兜底文件,必须存在,否则整个国际化机制不会启动!
🔧 五、代码中如何使用?
在 Controller 或 Service 中注入 MessageSource:
@Autowired
private MessageSource messageSource;@GetMapping("/greet")
public String greet(Locale locale) {return messageSource.getMessage("greeting", null, locale);
}
对应的 messages.properties:
greeting=Hello!
messages_zh.properties:
greeting=你好!
当请求带 Accept-Language: zh 时,返回“你好!”;否则返回“Hello!”。
✅ 总结关键点
| 要点 | 说明 |
|---|---|
必须有 messages.properties | 否则 Spring Boot 不会自动配置 MessageSource |
| 支持多组资源文件 | 用 spring.messages.basename=a,b,c 配置 |
| 路径写法 | config.i18n.messages 表示 classpath:config/i18n/messages.properties |
| 回退机制 | 默认会尝试系统 locale,可通过 fallback-to-system-locale=false 关闭 |
| 文件命名 | basename + _ + language + _ + country + .properties |
💡 建议实践
- 在
src/main/resources/下创建:messages.properties(默认英文)messages_zh.properties(中文)
- 在
application.yml中明确配置(可选但推荐):spring:messages:basename: messagesfallback-to-system-locale: false - 在代码中通过
MessageSource获取本地化消息。
这样你的 Spring Boot 应用就具备了多语言能力!
需要我给你一个完整的示例项目结构吗?
