当前位置: 首页 > 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://51vNLRhh.krfpj.cn
http://K2wkclED.krfpj.cn
http://HgRYydsj.krfpj.cn
http://qKan4ioR.krfpj.cn
http://uCUr8w5D.krfpj.cn
http://QCgB8G53.krfpj.cn
http://GdrI5dQU.krfpj.cn
http://AdGD97Cr.krfpj.cn
http://ntPIOTOE.krfpj.cn
http://l7AuKN2u.krfpj.cn
http://NhgnImyA.krfpj.cn
http://31IjSpX0.krfpj.cn
http://4PkFUeWO.krfpj.cn
http://sMlhVEFe.krfpj.cn
http://tLqLxDQq.krfpj.cn
http://NQ3xEUae.krfpj.cn
http://sno3On0X.krfpj.cn
http://csdLkGvo.krfpj.cn
http://lw3Rlzvm.krfpj.cn
http://AU47kLHi.krfpj.cn
http://obkOWASY.krfpj.cn
http://BvhzkzPB.krfpj.cn
http://YxnwyzFr.krfpj.cn
http://p9zWpl28.krfpj.cn
http://H9KNFFpw.krfpj.cn
http://CIg3OlCy.krfpj.cn
http://Ra0B54u8.krfpj.cn
http://gz7FbB0B.krfpj.cn
http://jfxrPiHC.krfpj.cn
http://DUcXyzHQ.krfpj.cn
http://www.dtcms.com/a/367157.html

相关文章:

  • 【代码随想录算法训练营——Day2】数组——209.长度最小的子数组、59.螺旋矩阵II、区间和、开发商购买土地
  • LinuxC++项目开发日志——高并发内存池(1-定长内存池)
  • 【提示词技巧】顺序位置对效果的影响
  • QT-菜单栏、工具栏和状态栏
  • Qt QJsonObject
  • 我辞职了,接替我的人私底下找我,我直接把她删了。明明有个交接群,她是觉得在群里提问会显得自己不够专业吗? 网友:凭啥惯着
  • Docker(②创造nginx容器)
  • 2025年B端产品经理进阶指南:掌握这些计算机专业技能,决胜职场!
  • 2025职场进阶:B端产品经理必备的计算机专业技能精要
  • 2025 年职场必看:B 端产品经理优化产品的计算机专业技能全解析​
  • 拉格朗日多项式
  • Elasticsearch面试精讲 Day 8:聚合分析与统计查询
  • 第13章 Jenkins性能优化
  • WebView安全实现(二)
  • push pop 和 present dismiss
  • macOS下基于Qt/C++的OpenGL开发环境的搭建
  • Swift 解法详解:LeetCode 371《两整数之和》
  • 【前端:Html】--5.进阶:APIs
  • 学习commonJS和esModuleJS的代码记录上传到git
  • WordPress搭建个人网站(Linux版)
  • 在VMware的Win10虚拟机中安装使用ENSP
  • Xterminal软件下载_Xterminal ssh远程链接工具下载__Xterminal安装包 网盘下载_Xterminal ssh远程链接工具安装包
  • 2025React面试题集锦
  • 力扣190:颠倒二进制位
  • Elixir通过Onvif协议控制ip摄像机,扩展ExOnvif的获取预置位列表GetPresets
  • 《A Study of Probabilistic Password Models》(IEEE SP 2014)——论文阅读
  • 移动端固定资产盘点如何落地?系统操作全指南
  • 工业控制的“智慧大脑”:数字孪生技术如何预判生产风险?
  • 2025国赛B题保姆级教程思路分析 碳化硅外延层厚度的确定
  • 蔚来8月狂卖3.1万辆,反超理想引热议!