spring项目实现国际化流程解析

 更新时间:2026年01月22日 08:45:32   作者:makowin  
SpringBoot实现国际化(i18n)的步骤包括创建国际化资源文件、配置application.yml、自定义LocaleResolver和LocaleChangeInterceptor、在代码中使用MessageSource获取国际化消息,本文介绍spring项目实现国际化流程,感兴趣的朋友一起看看吧

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

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

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

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

messages.properties(中文示例):

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

messages_en_US.properties(英文示例):

 success=Operation successful
 error.system=System error, please try again later
 error.notfound=Resource not found
 user.login.success=Login successful
 user.login.fail=Username or password is incorrect
 user.notfound=User not found

注意

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

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

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

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

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

使用 SessionLocaleResolver + LocaleChangeInterceptor:

  @Configuration
  public class LocaleConfig implements WebMvcConfigurer {
      // 默认语言
      @Bean
      public LocaleResolver localeResolver() {
          SessionLocaleResolver localeResolver = new SessionLocaleResolver();
          localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE); // 默认简体中文
          return localeResolver;
     }
     // 拦截器:支持 ?lang=zh_CN 或 ?lang=en_US 切换语言
     @Bean
     public LocaleChangeInterceptor localeChangeInterceptor() {
         LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
         lci.setParamName("lang"); // 前端传参名
         return lci;
     }
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
         registry.addInterceptor(localeChangeInterceptor());
     }
 }

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

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

方式一:注入 MessageSource

  @RestController
  @RequestMapping("/api")
  public class UserController {
      @Autowired
      private MessageSource messageSource;
      @GetMapping("/test")
      public ResponseEntity<String> test(Locale locale) { // Locale 可选从参数注入
         // 方式1:直接使用 locale 参数
         String msg = messageSource.getMessage("user.login.success", null, locale);
         // 方式2:从 LocaleContextHolder 获取当前语言(推荐!)
         String msg2 = messageSource.getMessage("user.login.success", null, LocaleContextHolder.getLocale());
         return ResponseEntity.ok(msg2);
     }
 }

方式二:统一封装工具类

  @Component
  public class MessageUtils {
      private static MessageSource messageSource;
      @Autowired
      public void setMessageSource(MessageSource messageSource) {
          MessageUtils.messageSource = messageSource;
      }
     /**
      * 获取国际化消息
      */
     public static String getMessage(String code, Object... args) {
         return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
     }
     public static String getMessage(String code) {
         return getMessage(code, (Object) null);
     }
 }

使用方式:

 throw new BusinessException(MessageUtils.getMessage("user.notfound"));
 // 或
 return Result.error(MessageUtils.getMessage("error.system"));

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

  @RestControllerAdvice
  public class GlobalExceptionHandler {
      @ExceptionHandler(BusinessException.class)
      public Result<?> handleBusinessException(BusinessException e) {
          // 假设 BusinessException 里面存了 messageCode
          String message = MessageUtils.getMessage(e.getCode(), e.getArgs());
          return Result.error(message);
      }
     @ExceptionHandler(Exception.class)
     public Result<?> handleException(Exception e) {
         return Result.error(MessageUtils.getMessage("error.system"));
     }
 }

6. 支持参数占位符

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

7. 常见最佳实践总结

处理点处理方式
资源文件位置src/main/resources/i18n/messages_*.properties
默认语言简体中文(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 项目就实现了标准的国际化支持,所有提示信息都可以根据用户语言自动切换。

到此这篇关于spring项目国际化流程的文章就介绍到这了,更多相关spring项目国际化流程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中的内存泄漏

    Java中的内存泄漏

    这篇文章主要介绍了Java中的内存泄漏的相关资料,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-11-11
  • SpringBoot 创建获取yml里配置字段值

    SpringBoot 创建获取yml里配置字段值

    在Spring Boot中通过@ConfigurationProperties绑定YML配置,创建Bean并提供访问方法,实现根据配置字段动态处理业务逻辑,具有一定的参考价值,感兴趣的可以了解一下
    2025-06-06
  • SpringBoot中的五种对静态资源的映射规则的实现

    SpringBoot中的五种对静态资源的映射规则的实现

    这篇文章主要介绍了SpringBoot中的五种对静态资源的映射规则的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Java虚拟机精选面试题20道

    Java虚拟机精选面试题20道

    现在面试Java开发时,基本都会问到Java虚拟机的知识,根据职位不同问的内容深浅又有所区别。本文整理了10道面试中常问的Java虚拟机面试题,希望对正在面试的同学有所帮助
    2021-06-06
  • springboot+feign+Hystrix整合(亲测有效)

    springboot+feign+Hystrix整合(亲测有效)

    本文主要介绍了springboot+feign+Hystrix整合,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • java判断字符串是否为null的四种方式汇总

    java判断字符串是否为null的四种方式汇总

    这篇文章主要介绍了java判断字符串是否为null的四种方式汇总,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java -jar启动项目以及日志输出的相关问题

    java -jar启动项目以及日志输出的相关问题

    这篇文章主要介绍了java -jar启动项目以及日志输出的相关问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • SpringBoot中版本兼容性处理的实现示例

    SpringBoot中版本兼容性处理的实现示例

    SpringBoot版本兼容性问题通常是由于依赖库与SpringBoot版本不兼容引起的,本文主要介绍了SpringBoot中版本兼容性处理的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • 一文详解Java中的JSON数据处理指南

    一文详解Java中的JSON数据处理指南

    JSON作为一种轻量级的数据交换格式,在Web服务和应用程序之间广泛使用,本文详细介绍了在Java中解析和操作JSON数据的步骤,包括导入库、创建JSON对象和数组、读取数据、创建和序列化JSON对象,以及错误处理等,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • java判断回文数示例分享

    java判断回文数示例分享

    这篇文章主要介绍了java判断回文数示例,需要的朋友可以参考下
    2014-03-03

最新评论