Spring I18N 底层源码大揭秘:你的 MessageSource 到底是怎么找到配置的?

Java国际化i18n实战:ResourceBundle与Locale深层原理 Java国际化(i18n)本质是运行时环境协商机制,而非简单的字符串替换。其核心依托Locale作为JVM级上下文标识符,驱动日期格式、数字分隔、货币符号及排序规则;ResourceBundle则基于候选Locale匹配、类加载器绑定与缓存策略实现动态资源加载。该机制深刻影响Spring Boot多语言支持、REST API本地化响应、跨时区时间格式化等关键场景。理解Locale.getDefault()的三重来源(JVM参数/系统属性/OS设置)、ResourceBundle的层级继承逻辑(zh_CN → 阅读详情

01 引言

上一节介绍了国际化的一个完整案例,但是国际化是到时底层是怎么调用呢?前后端分离的的国家化又当如何使用?

带着这些问题,我们一步步深入了解一下。了解了底层的逻辑,我们才能在使用上随心所欲。

02 前后端分离

上一节使用了后端框架thymeleaf直接获取语言文件的配置信息。前后端分离又当如何传递给前端呢?

2.1 自动装配

这里的关键类是SpringBoot的自动注册类:org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration

自动注入MessageSource对象:

我们调用的时候就可以直接调用messageSource.getMessage()即可获取到对应的数据。

当然我们也可以自己定义。

2.2 调用案例

测试结果:

参数主要包括三个:

  • code:就是文件配置的key
  • args:就是配置文件的参数,参数是一个数组,如:user.welcome=Welcome, {0}!
  • locale:区域,决定了哪一个文件配置

03 源码追踪

3.1 自动注册

Spring容器初始化就专门初始化MessageSource:

关键点:

  • 约定优于配置:约定用户把国际化 Bean 命名为 messageSource。
  • 父子容器自动串联:子 ApplicationContext 会自动把父容器的 MessageSource 设为 parent,多容器场景天然支持。
  • DelegatingMessageSource 兜底:当用户没配置时使用空实现,不会抛异常,但调用 getMessage 会抛 NoSuchMessageException。

3.2 Web调用

大致处理步骤:

  • 请求进入 DispatcherServlet。
  • 拦截器链执行,LocaleChangeInterceptor 检查 URL 参数 lang,若有则用 LocaleResolver 切换。
  • Handler 执行业务逻辑。
  • 业务代码通过注入的 MessageSource 调用 getMessage(code, args, locale)。
  • Spring 在当前 ApplicationContext 中查找 MessageSource,按 code -> locale 链回退到 parent 容器查找资源。
  • 找到原始字符串后用 MessageFormat 按 args 渲染,按 locale 格式化数字/日期。
  • 渲染好的字符串返回给业务层。

04小结

Spring Framework 作为 Java 生态最主流的应用框架,对 I18N 提供了完整、优雅、且高度可扩展的支持。基于 JDK 标准的 java.util.Locale、ResourceBundle 抽象,封装出一套以 MessageSource 为核心的体系,并进一步和 ApplicationContext 容器、事件机制、占位符解析深度集成。

有了框架的支撑,我们就很容易去使用国际化处理多语言的业务。

测算系统海外多语言源码改造:i18n架构、语言包设计与Ruoyi落地实践 国际化(i18n)是软件出海的关键工程能力,尤其对于测算系统这类强计算业务,多语言改造远不止翻译文案那么简单。本文从通用i18n原理出发,解析“格式化与计算解耦”的设计思路:界面文案、规则描述、结果模板分类处理,数字、货币、日期与单位仅在展示层本地化,计算内核保持全局一致。结合gettext、JSON语言包和Spring MessageSource,提供一套可落地的多语言源码改造方案,覆盖目录拆分、按需加载、运行时切换与字典表多语言扩展。同时针对RuoYi、FastAdmin等常见开源框架,给出Sping 阅读详情

相关推荐

RAG优化知识库检索(4):混合检索技术

混合检索技术在RAG(检索增强生成)系统中的应用显著提升了检索效果。本文探讨了语义检索与关键词检索的优缺点,指出两者在语义理解和精确匹配方面的互补性。通过结合BM25与向量检索,混合检索系统能够更全面地捕捉文档的相关性。文章详细介绍了并行检索、级联检索、稀疏-密集混合表示等多种结合方式,并探讨了权重调整策略,如线性组合、动态权重调整和排序融合算法。此外,稀疏-密集混合检索架构的设计和实现方案也被深入分析,展示了如何通过结合不同检索方法的优势,提升RAG系统的检索质量和效率。

分享一些感兴趣的技术方面 2073

OpenMausBot 的回合内旁路注入接缝:各引擎驱动的 Mid-turn Aside 投递契约与实现

本文围绕 OpenMausBot 仓库中的规范文档 [docs/specs/aside-injection-seams.md](https://link.gitcode.com/i/30e96166436cfe64e324e334c4296398),讲清"旁路消息"(aside)这一回合内投递通道的完整契约:什么是 aside、harness 如何决定 steer 还是排队、五种引擎驱动(code

gitblog_00838的博客 337

NRF52832调试方法1——HardFault_Handler问题定位

一、遇到问题 keil debug模式下,直接点击全速运行(Run)发现程序卡死,点击stop按钮后,停到了HardFault_Handler位置,如下图所示。 此时使用navigate backwards(蓝色左箭头)是无效的,找不到程序卡在哪里。 二、解决办法 此时首先观察register窗口 若Stack为MSP,则复制R13(SP)的值到memory观察窗的地址搜索栏。每一行显示连续的28个地址上的存储信息,每个地址上存有一个字节。 从第21个位置起的连续四个字节是LR的值,

小梁的博客 3650

MessageSource学习

MessageSource Spring 国际化

weixin_44877172的博客 3022

深入LSM6DSL的FIFO连续模式:基于STM32和MEMS库的数据流高效处理指南

本文深入探讨了LSM6DSL的FIFO连续模式,结合STM32硬件平台和ST官方MEMS库,提供了高效的数据流处理方案。通过优化I2C通信时序、中断驱动设计以及动态ODR调整,实现低功耗数据采集与处理,显著提升嵌入式传感器应用的性能和续航能力。

weixin_30387799的博客 349

ThingsBoard入门实战(二):ThingsBoard 设备接入

文章目录ThingsBoard 设备接入一、设备配置/设备类型二、设备三、设备接入HTTPCOAPMQTT四、下一步 ThingsBoard 设备接入 设备接入并不一定需要真正的设备,我们可以通过程序。或者命令来模拟设备,向平台发送信息。 这节我们先为用户分配一个设备,然后通过模拟设备命令更新设备的状态(遥测值)。 一、设备配置/设备类型 添加一个叫"路灯"的设备配置。 设备配置听起来比较抽象,可以认为是设备类型或者是设备类型的配置。实际上,ThingsBoard 中很多时候让选择设备类型,就是选的这个。

AIGC搞起 1万+

【SpringBoot框架篇】33.优雅集成i18n实现国际化信息返回

由于公司业务需求,需要支持中英两个版本的返回提示信息,使用spring的类获取对应语种的i18n文件的提示信息。i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称。在资讯领域,国际化(i18n)指让产品(无需做大的改变就能够适应不同的语言和地区的需要。对程序来说,在不修改内部代码的情况下,能根据不同语言及地区显示相应的界面。在全球化的时代,国际化尤为重要,因为产品的潜在用户可能来自世界的各个角落。

皓亮君的博客 7633

内容审核与文本安全技术综述:检测、过滤与对齐

检测质量高度依赖数据。毒性/仇恨/冒犯语言检测领域形成了一批经典数据集,但它们的标签体系差异很大:例如 OLID(OffensEval)强调“是否冒犯—冒犯类型—目标对象”三层结构;HateXplain 在“hate/offensive/normal”三分类之外,还提供目标群体与人类标注的 rationale span;RealToxicityPrompts 则不做离散标签,而是用毒性分数来研究“模型续写时的毒性退化”。ACL 汇编。

nmdbbzcl的博客 1371

从源码MessageSource的三个实现出发实战spring·i18n国际化

从源码去看MessageSource的几个实现类的源码出发,基于spring的国际化支持,实现国际化的开箱即用,静态文件配置刷新生效以及全局异常国际化处理。

逆熵架构 1231

微信小程序 - 真机调试请求异常 Provisional headers are shown,微信小程序开发者工具调试没问题就真机测试时出现请求报错(微信小程序请求接口提示Provisional h)

微信小程序开发 Request Headers: Provisional headers are shown,微信开发工具请求正常,真机调试和上线之后出现 Provisional headers are shown,微信小程序开发工具调试没问题,真机调试Provisional headers are shown,在开发工具调试,请求正常没问题,使用真机调试,请求异常,微信小程序真机调试时后台是本地服务器,显示“Provisional headers are shown”问题解决,微信小程序websocket

🏆 前端领域优质创作者 1万+

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

丨汀、的博客 4327

Spring进行 i18n国际化配置

(本项目是基于Dubbo的,所以会有后端服务和前端Controller两次国际化的配置) 对后端服务的异常代码进行国际化版本的配置 1.在provider的resources中新建一个properties文件夹在其中新建一个messages的文件夹,新建两个properties,内容如下: promptMessage_me_JD.properties: #订单处理 orderCanc...

半岛落枫的博客 7164

爬虫进阶必备:深入理解requests.Session(),提升爬虫效率与稳定性

前两天,有个朋友跟我吐槽,说自己写了个爬虫爬取某个电商网站的商品信息,刚开始跑得好好的,爬了大概几百页之后,突然就开始报错了。HTTP状态码一会儿429,一会儿403,最离谱的是有些页面明明登录了却显示未登录状态。他排查了半天也没找到原因,最后把代码发给我看。 我扫了一眼代码,发现一个典型问题:他每次请求都新建一个requests.Session(),甚至有些请求直接用了requests.get()。这就好比每次进超市都要重新注册会员,每次都重新跟服务器“握手”,不翻车才怪。 其实,这就是我们今天要聊的

2201_76125261的博客 1228

Spring中MessageSource的配置使用方法

ApplicationContext接口扩展了MessageSource接口,因而提供了消息处理的功能(i18n或者国际化)让我们快速浏览一下它所定义的方法:String getMessage(String code, Object[] args, String default, Locale loc):用来从MessageSource获取消息的基本方法。如果在指定的loca...

weixin_33910385的博客 3298

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring i18n国际化

【代码】Spring i18n国际化。

kingyal 563

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

SpringBoot - SpringBoot整合i18n实现消息国际化

/ 根据资源文件的属性名以及当前语言环境,获取国际化信息 super(I18nUtils . tryI18n(i18eCode));// 根据资源文件的属性名,属性值中的参数以及当前语言环境,获取国际化信息 // args用来替换资源文件属性值中的占位符参数 super(I18nUtils . tryI18n(i18eCode , args));} }

你今天真好看呀 4498

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

mysiteforme国际化(i18n)实现:前后端多语言支持完整教程

作为一款基于Spring Boot开发的轻量级权限管理系统,**mysiteforme**已经为全球用户提供了完整的国际化(i18n)支持。无论您需要开发中文、英文还是其他语言版本的应用,这套国际化解决方案都能帮助您快速实现多语言切换功能。😊 ## 📚 为什么需要国际化支持? 在当今全球化时代,软件系统需要面向不同国家和地区的用户。mysiteforme的国际化实现让您的管理系统能够:

gitblog_00846的博客 437

国际化(i18n)项目开发全流程深度解析(后端篇)

配置驱动,资源分层,缓存优化,降级兜底。流程明晰,代码解耦,调试严谨,扩展灵活。

IT技术学习与工作笔记分享 1841

Spring Framework源码解析——MessageSourceAware

本文介绍了Spring框架中的MessageSourceAware接口,该接口允许Bean在初始化阶段获取MessageSource实例,支持国际化消息解析和本地化功能。文章详细分析了接口定义、核心执行机制(通过ApplicationContextAwareProcessor注入ApplicationContext作为MessageSource),以及MessageSource的核心能力与实现类。此外,还阐述了MessageSourceAware在Bean生命周期中的执行时机,并提供了国际化错误提示

谷哥的小弟 999

Spring国际化实现原理+源码解析

Spring在webmvc依赖包下提供了支持国际化的i18n包,支持根据请求中不同语言环境标志位来动态改变当前的语言环境,同时可以支持配置多个不同的语言资源配置,并自动根据当前的语言环境动态读取不同的资源配置值 代码如下: i18包类结构: 由图可见,一共提供了四种支持国际化的实现类,分别是AcceptHeaderLocaleResolver、CookieLocaleResolver、FixedLocaleResolver和SessionLocaleResolver类,这些类都实现了Lo...

weixin_37618968的博客 3006

Spring学习系列(四)——Spring中的国际化

1.Java中的国际化国际化(Internationalization)简称 i18n,简单来说就是不同国家/地区/语言的用户,访问同一个程序,得到对应的本地化资源。 首先要确定国家/地区/语言(Locale类) 然后根据不同的Locale获取对应的本地化资源(locale敏感的)。 而本地化资源相关的主要有两种:ResourceBundle和Format抽象类的子类。①Jdk为R...

670

Springboot国际化信息(i18n)解析

国际化信息理解 国际化信息也称为本地化信息 。 Java 通过 java.util.Locale 类来表示本地化对象,它通过 “语言类型” 和 “国家/地区” 来创建一个确定的本地化对象 。举个例子吧,比如在发送一个具体的请求的时候,在header中设置一个键值对:"Accept-Language":"zh",通过Accept-Language对应值,服务器就可以决定使用哪一个区域的语言,找到相...

胡峻峥的博客 1万+

Spring Framework源码解析——ResourceBundleMessageSource

摘要 ResourceBundleMessageSource是Spring框架实现国际化(i18n)的核心组件,基于Java的ResourceBundle机制,支持.properties资源文件的多语言管理。该类继承AbstractMessageSource并实现BeanClassLoaderAware接口,具有层级消息委托、参数格式化等能力,同时支持缓存、自定义编码等特性。其核心功能包括:通过basename指定资源文件、解决.properties文件编码问题、灵活的缓存控制机制等。特别是通过内部UTF8

谷哥的小弟 1498

【三】springboot启动源码 - initMessageSource

如果IOC容器找不到messageSource的bean,那么会向IOC容器注册一个MessageSource的默认实现类DelegatingMessageSource。这个步骤的代码量比较少。

qq_36382225的博客 146

spring:refresh方法之initMessageSource

initMessageSource 国际化(Internationalization)简称 i18n,简单来说就是不同国家/地区/语言的用户,访问同一个程序,得到对应的本地化资源。 Spring中国际化的支持是AbstractApplicationContext中定义的默认bean(ApplicationContext实现了MessageSource接口) 源码: protected ...

jopen的博客 378

SpringBoot 如何使用 MessageSource 实现国际化?,Java技术篇

一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。

2401_83621499的博客 1395
上一篇: 一文终结 SpringBoot 国际化!从 0 到 1 完整案例(中英日)
下一篇: Base62编码生成6位不重复短码的背后设计
智_永无止境
博客等级 码龄10年 803粉丝 404原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值