当前位置: 首页 > news >正文

SpringBoot实现国际化(多语言)配置

文章目录

  • 核心原理
  • 详细实现步骤
    • 1.在resources文件下新建i18n文件,并新建国际化资源文件
    • 2.相关配置
      • application.yml
      • 国际化参数解析器
      • 国际化配置类
  • 测试效果
    • 请求头中不添加lang
    • 请求头中添加lang


核心原理

Spring Boot 国际化的核心是 MessageSource 接口,其默认实现是 ResourceBundleMessageSource。它会根据当前用户的区域(Locale)信息,从配置的资源文件(.properties 文件)中加载对应的文本信息。

整个过程可以分解为:

  1. 识别区域(Locale): 通过拦截器解析请求,获取用户的语言环境(如从请求头、会话、参数等)。
  2. 加载资源: 根据识别到的 Locale,找到对应的 .properties 文件。
  3. 获取文本: 在代码或模板中,通过唯一的消息键(key) 获取对应的本地化文本。

详细实现步骤

1.在resources文件下新建i18n文件,并新建国际化资源文件

在这里插入图片描述
输入messages,添加简体中文、繁体中文、英文

在这里插入图片描述
出现以下文件,表示创建成功。
在这里插入图片描述

messages.properties文件中添加多语言信息
中文转为UNICODE编码,可以找一个在线 Unicode 编码转换
这里我使用了:在线 Unicode 编码转换

messages.properties

10001=\u7cfb\u7edf\u7e41\u5fd9\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff01
10002=\u8bf7\u52ff\u91cd\u590d\u63d0\u4ea4\uff01

messages_en_US.properties

10001=The system is busy, please try again later!
10002=Please do not resubmit!

messages_zh_CN.properties

10001=\u7cfb\u7edf\u7e41\u5fd9\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff01
10002=\u8bf7\u52ff\u91cd\u590d\u63d0\u4ea4\uff01

messages_zh_TW.properties

10001=\u7cfb\u7d71\u7e41\u5fd9\uff0c\u8acb\u7a0d\u5f8c\u518d\u8a66\uff01
10002=\u8acb\u52ff\u91cd\u8907\u63d0\u4ea4\uff01

2.相关配置

application.yml

spring:messages:basename: i18n/messagesencoding: utf-8

国际化参数解析器

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";/*** 国际化参数解析方法*/@Overridepublic 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;}@Overridepublic void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {}
}
/*** 多语言枚举* @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;}
}

国际化配置类

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();}
}

测试效果

@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
在这里插入图片描述


http://www.xdnf.cn/news/1457893.html

相关文章:

  • MySQL 8.0 主从复制原理分析与实战
  • 深入解析Java HashCode计算原理 少看大错特错的面试题
  • 多线程——线程状态
  • 并发编程——17 CPU缓存架构详解高性能内存队列Disruptor实战
  • ResNet(残差网络)-彻底改变深度神经网络的训练方式
  • linux——自定义协议
  • 多Agent协作案例:用AutoGen实现“写代码+测Bug”的自动开发流程
  • 秒店功能更新:多维度优化升级,助力商家经营
  • 当 LLM 遇上真实世界:MCP-Universe 如何撕开大模型 “工具能力” 的伪装?
  • 记录相机触发相关
  • 机器学习入门,第一个MCP示例
  • (D题|矿井突水水流漫延模型与逃生方案)2025年高教杯全国大学生数学建模国赛解题思路|完整代码论文集合
  • 生成式引擎优化(GEO):数字营销新标配,企业如何抢占AI搜索流量高地?
  • Trae + MCP : 一键生成专业封面的高阶玩法——自定义插件、微服务编排与性能调优
  • 设计模式六大原则2-里氏替换原则
  • Linux —— 环境变量
  • mysql中find_in_set()函数的使用, ancestors字段,树形查询
  • AI视频画质提升效果实用指南:提升清晰度的完整路径
  • [论文阅读] 软件工程 | REST API模糊测试的“标准化革命”——WFC与WFD如何破解行业三大痛点
  • 【论文阅读】-《Besting the Black-Box: Barrier Zones for Adversarial Example Defense》
  • AutoLayout与Masonry:简化iOS布局
  • (E题|AI 辅助智能体测)2025年高教杯全国大学生数学建模国赛解题思路|完整代码论文集合
  • 解密llama.cpp:Prompt Processing如何实现高效推理?
  • Nginx 实战系列(一)—— Web 核心概念、HTTP/HTTPS协议 与 Nginx 安装
  • Scikit-learn Python机器学习 - 特征预处理 - 归一化 (Normalization):MinMaxScaler
  • 孩子学手机里的坏毛病,怎样限制他打开某些APP?
  • Flutter 3.35.2 以上版本中 数字转字符串的方法指南
  • 机器学习基础-day05-深度学习框架PyTorch的tensor及PyTorch进行线性回归
  • 猫头虎AI 荐研|腾讯开源长篇叙事音频生成模型 AudioStory:统一模型,让 AI 会讲故事
  • 数据结构 之 【哈希的相关概念】