news 2026/4/25 19:14:19

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/4/23 6:41:20

CAM++输出文件解析:result.json与npy保存机制揭秘

CAM输出文件解析&#xff1a;result.json与npy保存机制揭秘 1. 系统功能与使用场景回顾 CAM 是一个基于深度学习的说话人识别系统&#xff0c;由科哥开发并进行了Web界面二次封装。该系统能够完成两项核心任务&#xff1a;说话人验证和声纹特征提取。在实际使用中&#xff0c…

作者头像 李华
网站建设 2026/4/23 8:15:33

MCP服务器resources动态扩展实践:应对高并发的4步速成方案

第一章&#xff1a;MCP服务器resources动态扩展的核心机制 MCP&#xff08;Microservice Control Plane&#xff09;服务器的 resources 动态扩展机制&#xff0c;是支撑其高可用性与弹性伸缩能力的关键设计。该机制不依赖静态配置或重启生效&#xff0c;而是通过实时感知负载变…

作者头像 李华
网站建设 2026/4/24 15:17:42

Live Avatar新手必看:首次运行常见问题解决指南

Live Avatar新手必看&#xff1a;首次运行常见问题解决指南 1. 引言&#xff1a;快速上手前的必要准备 你刚下载了Live Avatar这个由阿里联合高校开源的数字人项目&#xff0c;满心期待地想要生成一个属于自己的虚拟形象视频。但一运行就遇到显存不足、进程卡死、NCCL报错等问…

作者头像 李华
网站建设 2026/4/23 8:15:42

Dify如何高效接入Milvus向量库?10分钟搞定全流程配置

第一章&#xff1a;Dify与Milvus集成的核心价值 将 Dify 与 Milvus 集成&#xff0c;为构建高效、智能的向量驱动应用提供了强大支持。这种组合充分发挥了 Dify 在低代码 AI 应用开发中的优势&#xff0c;以及 Milvus 在大规模向量相似性搜索中的高性能能力。 实现语义搜索的无…

作者头像 李华
网站建设 2026/4/22 16:25:55

413错误频发?掌握这3步彻底搞定Dify部署上传限制

第一章&#xff1a;413错误频发&#xff1f;掌握这3步彻底搞定Dify部署上传限制 在部署 Dify 应用时&#xff0c;频繁出现的 413 Request Entity Too Large 错误常常阻碍大文件上传流程。该问题通常源于反向代理服务器&#xff08;如 Nginx&#xff09;默认限制了请求体大小。只…

作者头像 李华