news 2026/3/1 0:07:33

SpringBoot项目的国际化流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot项目的国际化流程

在 Spring Boot 项目已经开发完成后,想要实现国际化(i18n),让所有提示信息(后端返回的错误消息、成功消息、异常信息、枚举描述等)支持多语言,处理流程如下:

1. 创建国际化资源文件(messages.properties)

在 src/main/resources 目录下(新建 i18n 子目录),创建以下文件:

1src/main/resources/2└── i18n/3├── messages.properties # 默认语言(通常是中文或英文)4├── messages_zh_CN.properties # 简体中文5├── messages_en_US.properties # 美式英文6├── messages_zh_TW.properties # 繁体中文(可选)7└── messages_ja.properties # 日语(可选)

messages.properties(中文示例):

1# 通用提示2success=操作成功3error.system=系统异常,请稍后重试4error.notfound=资源不存在56# 业务提示7user.login.success=登录成功8user.login.fail=用户名或密码错误9user.notfound=用户不存在

messages_en_US.properties(英文示例):

1success=Operation successful2error.system=System error, pleasetryagain later3error.notfound=Resource not found45user.login.success=Login successful6user.login.fail=Username or password is incorrect7user.notfound=User not found

注意

  • 文件名必须以 messages 开头(Spring Boot 默认查找规则)。
  • 所有提示统一放在 i18n 目录下,方便管理。

2. 配置 application.yml(或 application.properties)

1# application.yml2spring:3messages:4basename: i18n/messages # 资源文件基础名(支持通配符)5encoding: UTF-8 # 必须是 UTF-86fallback-to-system-locale:false# 推荐设置为false(找不到对应语言时不回退到系统默认Locale)7use-code-as-default-message:true# 找不到key时直接返回code(调试方便,上线可改为false)
1# properties2spring.messages.basename=i18n/messages3spring.messages.encoding=UTF-84spring.messages.fallback-to-system-locale=false5spring.messages.use-code-as-default-message=true

3. 自定义 LocaleResolver 和 LocaleChangeInterceptor(支持前端传参切换语言)

Spring Boot 默认使用AcceptHeaderLocaleResolver(根据请求头 Accept-Language 自动识别),生产环境通常还需要支持通过参数或 cookie 切换语言。

使用 SessionLocaleResolver + LocaleChangeInterceptor:

1@Configuration2publicclassLocaleConfigimplementsWebMvcConfigurer {34//默认语言5@Bean6publicLocaleResolver localeResolver() {7SessionLocaleResolver localeResolver =newSessionLocaleResolver();8localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);//默认简体中文9returnlocaleResolver;10}1112//拦截器:支持 ?lang=zh_CN 或 ?lang=en_US 切换语言13@Bean14publicLocaleChangeInterceptor localeChangeInterceptor() {15LocaleChangeInterceptor lci =newLocaleChangeInterceptor();16lci.setParamName("lang");//前端传参名17returnlci;18}1920@Override21publicvoidaddInterceptors(InterceptorRegistry registry) {22registry.addInterceptor(localeChangeInterceptor());23}24}

若优先从请求头识别,再支持参数切换,可以自定义 LocaleResolver(更灵活)。

4. 在代码中使用 MessageSource 获取国际化消息

方式一:注入 MessageSource
1@RestController2@RequestMapping("/api")3publicclassUserController {45@Autowired6privateMessageSource messageSource;78@GetMapping("/test")9publicResponseEntity<String> test(Locale locale) {//Locale 可选从参数注入10//方式1:直接使用 locale 参数11String msg = messageSource.getMessage("user.login.success",null, locale);1213//方式2:从 LocaleContextHolder 获取当前语言(推荐!)14String msg2 = messageSource.getMessage("user.login.success",null, LocaleContextHolder.getLocale());1516returnResponseEntity.ok(msg2);17}18}
方式二:统一封装工具类
1@Component2publicclassMessageUtils {34privatestaticMessageSource messageSource;56@Autowired7publicvoidsetMessageSource(MessageSource messageSource) {8MessageUtils.messageSource =messageSource;9}1011/**12* 获取国际化消息13*/14publicstaticString getMessage(String code, Object... args) {15returnmessageSource.getMessage(code, args, LocaleContextHolder.getLocale());16}1718publicstaticString getMessage(String code) {19returngetMessage(code, (Object)null);20}21}

使用方式:

1thrownewBusinessException(MessageUtils.getMessage("user.notfound"));2//3returnResult.error(MessageUtils.getMessage("error.system"));

5. 全局异常处理中使用国际化

1@RestControllerAdvice2publicclassGlobalExceptionHandler {34@ExceptionHandler(BusinessException.class)5publicResult<?>handleBusinessException(BusinessException e) {6//假设 BusinessException 里面存了 messageCode7String message =MessageUtils.getMessage(e.getCode(), e.getArgs());8returnResult.error(message);9}1011@ExceptionHandler(Exception.class)12publicResult<?>handleException(Exception e) {13returnResult.error(MessageUtils.getMessage("error.system"));14}15}

6. 支持参数占位符

1# messages.properties2user.age.limit=年龄必须在 {0} 到 {1} 岁之间
1String msg = MessageUtils.getMessage("user.age.limit", 18, 60);2//输出:年龄必须在 18 到 60 岁之间

7. 常见最佳实践总结

处理点处理方式
资源文件位置/* by 01022.hk - online tools website : 01022.hk/zh/reproduce.html */ src/main/resources/i18n/messages_*.properties
默认语言简体中文(/* by 01022.hk - online tools website : 01022.hk/zh/reproduce.html */ Locale.SIMPLIFIED_CHINESE
语言切换方式请求头Accept-Language+?lang=zh_CN
消息获取方式优先使用LocaleContextHolder.getLocale()
工具类封装MessageUtils统一获取
异常消息全部使用 code + MessageUtils 获取
找不到key建议use-code-as-default-message=false
编码必须UTF-8

8. 测试方法

  • 浏览器开发者工具 → Network → 修改请求头 Accept-Language: en-US,en;q=0.9
  • 或直接在 URL 后加 ?lang=en_US

完成以上步骤,你的 Spring Boot 项目就实现了标准的国际化支持,所有提示信息都可以根据用户语言自动切换。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/22 12:38:49

CAM++说话人验证不准确?相似度阈值调优实战指南

CAM说话人验证不准确&#xff1f;相似度阈值调优实战指南 1. 为什么你的CAM说话人验证结果总不准&#xff1f; 你是不是也遇到过这种情况&#xff1a;用CAM做说话人验证&#xff0c;明明是同一个人的两段语音&#xff0c;系统却判定“不是同一人”&#xff1b;或者反过来&…

作者头像 李华
网站建设 2026/2/27 2:26:51

GPEN紫蓝渐变UI设计亮点解析:用户体验优化实战案例

GPEN紫蓝渐变UI设计亮点解析&#xff1a;用户体验优化实战案例 1. 引言&#xff1a;从工具到体验的升级 你有没有遇到过这种情况&#xff1f;好不容易找到一个功能强大的AI图像修复工具&#xff0c;结果打开界面后一脸懵——按钮乱糟糟、参数看不懂、操作流程像迷宫。很多技术…

作者头像 李华
网站建设 2026/2/27 8:19:00

mcp-server-sqlite本地数据库连接失败?90%的人都忽略了这3个细节

第一章&#xff1a;mcp-server-sqlite 安装并连接本地数据库教程 环境准备与依赖安装 在开始使用 mcp-server-sqlite 前&#xff0c;需确保系统中已安装 Node.js&#xff08;v16 或更高版本&#xff09;和 npm。可通过以下命令验证环境&#xff1a; node -v npm -v若环境就绪…

作者头像 李华