文章目录
核心原理
Spring Boot 国际化的核心是 MessageSource 接口,其默认实现是 ResourceBundleMessageSource。它会根据当前用户的区域(Locale)信息,从配置的资源文件(.properties 文件)中加载对应的文本信息。
整个过程可以分解为:
- 识别区域(Locale): 通过拦截器解析请求,获取用户的语言环境(如从请求头、会话、参数等)。
- 加载资源: 根据识别到的 Locale,找到对应的 .properties 文件。
- 获取文本: 在代码或模板中,通过唯一的消息键(key) 获取对应的本地化文本。
详细实现步骤
1.在resources文件下新建i18n文件,并新建国际化资源文件

输入messages,添加简体中文、繁体中文、英文

出现以下文件,表示创建成功。
messages.properties文件中添加多语言信息
中文转为UNICODE编码,可以找一个在线 Unicode 编码转换
这里我使用了:在线 Unicode 编码转换
messages.properties
js
10001=\u7cfb\u7edf\u7e41\u5fd9\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff01
10002=\u8bf7\u52ff\u91cd\u590d\u63d0\u4ea4\uff01
messages_en_US.properties
js
10001=The system is busy, please try again later!
10002=Please do not resubmit!
messages_zh_CN.properties
js
10001=\u7cfb\u7edf\u7e41\u5fd9\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff01
10002=\u8bf7\u52ff\u91cd\u590d\u63d0\u4ea4\uff01
messages_zh_TW.properties
js
10001=\u7cfb\u7d71\u7e41\u5fd9\uff0c\u8acb\u7a0d\u5f8c\u518d\u8a66\uff01
10002=\u8acb\u52ff\u91cd\u8907\u63d0\u4ea4\uff01
2.相关配置
application.yml
yml
spring:
messages:
basename: i18n/messages
encoding: utf-8
国际化参数解析器
java
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
/**
* 国际化参数解析器
*
* @author qf
* @date 2025-05-08 20:58:18
*/
public class HeaderLocalResolver implements LocaleResolver {
private static final String ACCEPT_LANGUAGE = "lang";
/**
* 国际化参数解析方法
*/
@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
Locale locale = Locale.getDefault();
String acceptLanguageHeader = httpServletRequest.getHeader(ACCEPT_LANGUAGE);
if (StringUtils.isEmpty(acceptLanguageHeader)) {
//前端未传lang请求头 默认使用简体中文
String[] params = LanguageEnum.CN.getLang().split("-");
return new Locale(params[0], params[1]);
}
String lang = acceptLanguageHeader.split(";")[0];
String[] params = lang.split("-");
if (params.length == 1) {
return locale;
}
locale = new Locale(params[0], params[1]);
return locale;
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
}
}
java
/**
* 多语言枚举
* @author qf
* @date 2025-05-08 20:58:18
*/
public enum LanguageEnum {
// 简体中文
CN("zh-CN"),
//繁体中文
TW("zh-TW"),
//英文
US("en-US");
private String lang;
LanguageEnum(String lang) {
this.lang = lang;
}
public String getLang(){
return this.lang;
}
}
国际化配置类
java
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
/**
* 国际化配置类
* @author qf
* @date 2025-05-08 20:58:18
*/
@Configuration
public class I18nConfig {
@Value("${spring.messages.basename:i18n.messages}")
private String baseName;
@Value("${spring.messages.encoding:UTF-8}")
private String encoding;
/**
* 注入文本解析
*/
@Bean(name = "messageSource")
public ResourceBundleMessageSource getMessageResource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename(baseName);
messageSource.setDefaultEncoding(encoding);
return messageSource;
}
/**
* 注入自定义国际化解析器
*/
@Bean(name = "localeResolver")
public LocaleResolver localeResolver(){
return new HeaderLocalResolver();
}
}
测试效果
java
@RestController
@RequestMapping("api")
public class TestController {
/**
* 通过code拿多语言下的内容
* @param code
* @return
*/
@GetMapping("/test")
public String test(String code) {
String message = LanguageUtil.get(code);
return message;
}
}
请求头中不添加lang
之前在HeaderLocalResolver.resolveLocale()中进行了配置,默认使用简体中文
请求头中添加lang
在请求头中添加lang,value值传需要的简体中文、繁体中文或英文,即可进行切换。
lang = en-US zh-TW zh-CN