LocaleContextResolver实现多语言切换-笔记
1. LocaleContextResolver功能简介
org.springframework.web.servlet.LocaleContextResolver是 Spring MVC 中用于解析和管理用户 Locale(语言环境) 的核心接口。
//LocaleContextResolver 接口定义
public interface LocaleContextResolver extends LocaleResolver {LocaleContext resolveLocaleContext(HttpServletRequest var1);void setLocaleContext(HttpServletRequest var1, @Nullable HttpServletResponse var2, @Nullable LocaleContext var3);
}//LocaleResolver 定义
public interface LocaleResolver {Locale resolveLocale(HttpServletRequest var1);void setLocale(HttpServletRequest var1, @Nullable HttpServletResponse var2, @Nullable Locale var3);
}
它的主要作用是:
-
解析请求中的 Locale 信息
从 HTTP 请求中提取用户指定的语言/地区信息(如 URL 参数、请求头、Cookie 等)。 -
维护 Locale 上下文
将解析后的 Locale 信息存储在当前线程的上下文中(LocaleContext
),确保整个请求链(如 Controller、视图渲染)使用一致的 Locale。 -
支持多级存储策略
提供多种实现类,支持基于请求头、会话(Session)、Cookie 或固定值的 Locale 解析。
常见 LocaleContextResolver
实现类:
实现类 | 特点 |
---|---|
AcceptHeaderLocaleResolver | 从 HTTP 请求头 Accept-Language 解析 Locale。 |
SessionLocaleResolver | 从Session中解析Locale;将 Locale 存储在用户 Session 中,适合需要持久化语言偏好的场景。 |
CookieLocaleResolver | 从Cookie中解析Locale;将 Locale 存储在 Cookie 中,适合无状态或分布式系统。 |
FixedLocaleResolver | 固定使用一个 Locale(如开发环境调试)。 |
典型使用场景
场景 | 描述 |
---|---|
国际化支持 | 根据用户选择的语言显示不同的界面内容(如中英文切换)。 |
动态语言切换 | 用户通过 URL 参数(如 ?lang=zh-CN )或按钮切换语言。 |
自动语言检测 | 通过浏览器的 Accept-Language 请求头自动识别用户语言偏好。 |
持久化语言偏好 | 使用 Cookie 或 Session 保存用户的语言选择,避免重复传递参数。 |
2. 用法演示
下面用一个例子演示使用 LocaleContextResolver
实现多语言切换功能,根据当前语言环境返回国际化消息,动态适配用户的语言偏好。
2.1 完整代码
step1. 配置 LocaleContextResolver
和拦截器
import java.util.Locale;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;@Configuration
public class WebLocalConfig implements WebMvcConfigurer {// 1. 配置 MessageSource(用于加载国际化资源文件)@Beanpublic MessageSource messageSource() {ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();messageSource.setBasename("classpath:CustomMessages"); // 指定国际化资源文件的前缀messageSource.setDefaultEncoding("UTF-8"); // 设置编码return messageSource;}// 2. 配置 LocaleResolver(用于解析语言环境)// 这里使用 LocaleContextResolver 的实现类 SessionLocaleResolver@Beanpublic LocaleResolver localeResolver() {// 使用 Session 存储 Locale,避免每次请求传递参数SessionLocaleResolver resolver = new SessionLocaleResolver();//设置默认语言为中文(zh_CN)resolver.setDefaultLocale(Locale.CHINA);return resolver;}// 3. 配置 LocaleChangeInterceptor(用于通过 URL 参数切换语言)@Beanpublic LocaleChangeInterceptor localeChangeInterceptor() {// 通过 URL 参数(如 xxx?lang=zh-CN)切换语言LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();interceptor.setParamName("lang");// 设置参数名return interceptor;}//4. 将 LocaleChangeInterceptor 添加到拦截器中,使其生效@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(localeChangeInterceptor());}
}
step2.根据Locale解析对应的国际化语言
Service 层使用 LocaleContextHolder
获取上下文中的 Locale,并根据Locale解析对应的国际化语言
import java.util.Locale;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Service;@Service
public class MessageService {@Autowiredprivate MessageSource messageSource;public String getLocalizedMessage(String code) {// 从 LocaleContext 中获取当前线程的 LocaleLocale currentLocale = LocaleContextHolder.getLocale();// 打印当前语言环境System.out.println("Current Locale: " + currentLocale);System.out.println("Trying to get message for code: " + code); // 打印 key//根据 Locale 从对应的资源文件中加载code的值return messageSource.getMessage(code, null, currentLocale);}
}
step3. 新建测试Controller
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class GreetingController {@Autowiredprivate MessageService messageService;@GetMapping("GreetingController/greet")public String greet() {// 获取国际化消息return messageService.getLocalizedMessage("greeting.message");}}
step4. 配置国际化资源文件
- CustomMessages_zh_CN.properties(中文)
-
greeting.message=你好,世界
-
- CustomMessages_en_US.properties (英文)
-
greeting.message=hello,world
-
资源位置:
-
src/main/resources/ ├── CustomMessages_en_US.properties // 英文 ├── CustomMessages_zh_CN.properties // 中文
step5. 测试
case1. 不设定 lang参数,默认为中文。
- 浏览器访问:http://127.0.0.1:8080/GreetingController/greet,输入如下:
case2. lang参数设为 zh_CN,输出结果为中文
-
浏览器访问:http://127.0.0.1:8080/GreetingController/greet?lang=zh_CN,输入如下:
case3. lang参数设为 en_US,输出结果为英文
- 浏览器访问:http://127.0.0.1:8080/GreetingController/greet?lang=en_US,输入如下:
2.2 代码流程简介
上述流程的核心原理简述:
- LocaleContextResolver 负责从请求中解析出
Locale
(如 URL 参数、请求头、Session、Cookie 等)。这里用的实现类为SessionLocaleResolver, 即WebLocalConfig#localeResolver方法中配置。 - 解析出的
Locale
会通过LocaleContextHolder.setLocale(...)
设置到当前线程的上下文中。 - 后续的组件(这里对应MessageService,也能是Controller或视图)可以直接从
LocaleContextHolder.getLocale()
获取当前的Locale
,实现上下文一致性。
通过 LocaleContextResolver
,Spring MVC 提供了灵活的国际化支持机制。开发者可以根据业务需求选择不同的 Resolver 实现,结合 LocaleChangeInterceptor
实现语言切换,使用LocaleContextHolder维护
整个请求生命周期中 Locale
上下文的一致性,从而实现灵活的国际化支持。
相关文章:

LocaleContextResolver实现多语言切换-笔记
1. LocaleContextResolver功能简介 org.springframework.web.servlet.LocaleContextResolver是 Spring MVC 中用于解析和管理用户 Locale(语言环境) 的核心接口。 //LocaleContextResolver 接口定义 public interface LocaleContextResolver extends L…...
Android从单体架构迁移到模块化架构。你会如何设计模块划分策略?如何处理模块间的通信和依赖关系
从单体架构迁移到模块化架构。可能有些小伙伴已经深陷单体架构的泥潭,代码耦合得跟一团麻线似的,改个小功能都能牵一发而动全身;也可能有些团队在协作时,经常因为代码冲突或者职责不清搞得焦头烂额。相信我,这些问题我都经历过,真的能把人逼疯!所以,咱得找个更好的方式…...

Zephyr OS Nordic芯片的Flash 操作
目录 概述 1. 软硬件环境 1.1 软件开发环境 1.2 硬件环境 2 Flash操作库函数 2.1 nRF52832的Flash 2.2 Nordic 特有的 Flash 操作 2.2.1 nrfx_nvmc_bytes_write 函数 2.2.2 nrfx_nvmc_page_erase函数 2.2.3 nrfx_nvmc_write_done_check 函数 3 操作Flash的接口函数…...

uv python 卸载
又是查了半天 官网wiki没有 网上一堆傻子胡说 uv提示也不对 AI还在这尼玛胡编乱造 开始 我原来装了这几个环境 uv python list 现在python3.7.7不需要了,卸载,直接 uv python uninstall 3.7.7 去找你自己要卸载的版本号,不需要整个包名复制…...
MCP本地高效与云端实时:stdio 与 HTTP+SSE 传输机制深度对比
概览 模型上下文协议(MCP)定义了客户端与服务器之间通信的统一标准,所有消息均采用 JSON-RPC 2.0 格式进行封装,并在此基础上支持两种传输机制:stdio(标准输入/输出) 与 HTTPSSE(Se…...

浮点数截断法:四舍五入的精确模拟
理论解释: 1. 目标 假设 a 3.14159,我们想四舍五入到 小数点后两位(即 3.14 或 3.15)。 2. 步骤拆解 (1) a * 100 把 a 放大 100 倍,让小数点后两位变成整数部分: 3.14159 * 100 314.159 (2) 0.5 关…...

技术文章:解决汇川MD500系列变频器干扰问题——GRJ9000S EMC滤波器的应用
1. 引言 汇川MD500系列变频器(Variable Frequency Drive, VFD)以其高性能、宽功率范围(0.4kW-500kW)和灵活的控制方式,广泛应用于工业自动化领域,如风机、水泵、传送带和压缩机等。然而,MD500系…...

大模型数据分析破局之路20250512
大模型数据分析破局之路 本文面向 AI 初学者、数据分析从业者与企业技术负责人,围绕大模型如何为数据分析带来范式转变展开,从传统数据分析困境谈起,延伸到 LLM MCP 的协同突破,最终落脚在企业实践建议。 🌍 开篇导语…...

基于javaweb的SSM驾校管理系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

Java内存泄露生产环境排查过程,通透了
昨天线上环境崩了 java堆内存溢出。。。 报错:java.lang.OutOfMemoryError: Java heap space 下面我将我排查问题的思路和过程记录了下来 1. 场景 客户端跟Java服务端通过websocket连接建立长链接并发送语音数据(text格式)Java服务端跟听…...

NHANES指标推荐:MDS
文章题目:The association between magnesium depletion score (MDS) and overactive bladder (OAB) among the U.S. population DOI:10.1186/s41043-025-00846-x 中文标题:美国人群镁耗竭评分 (MDS) 与膀胱过度活动症…...
以项目的方式学QT开发C++(二)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!
API 描述 函数原型 参数说明 push_back() 在 list 尾部 添加一个元素 void push_back(const T& value); value :要添 加到尾部的元 素 这个示例演示了如何创建 std::list 容器,并对其进行插入、删除和迭代操作。在实际应用中&am…...
Docker使用经验-从Image导出dockerfile并进行修改
好久没进行记录写作了,还是得进行下去 0 前言 项目上拉下来的docker-image在我自己电脑上创建的容器不能正常启动,创建者在容器里面添加的了用户,容器启动后会进入该用户 1 docker导出dockerfile dfimage是一个用于从Docker镜像生成Docker…...

【HTML5学习笔记1】html标签(上)
web标准(重点) w3c 构成:结构、表现、行为,结构样式行为相分离 结构:网页元素整理分类 html 表现:外观css 行为:交互 javascript html标签 1.html语法规范 1) 所有标签都在…...

计算机视觉---目标检测(Object Detecting)概览
一、目标检测定义与核心任务 1. 定义 任务:在图像/视频中定位并分类所有感兴趣目标,输出边界框(Bounding Box)和类别标签。核心输出: 坐标:((x_1, y_1, x_2, y_2))(左上角右下角)或…...

在vue3中使用Cesium的保姆教程
1. 软件下载与安装 1. node安装 Vue.js 的开发依赖于 Node.js 环境,因此我们首先需要安装 Node.js。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它允许你在服务器端运行 JavaScript 代码,同时也为前端开发提供了强大的工具支…...

IP地址、端口、TCP介绍、socket介绍、程序中socket管理
1、IP地址:IP 地址就是 标识网络中设备的一个地址,好比现实生活中的家庭地址。IP 地址的作用是 标识网络中唯一的一台设备的,也就是说通过IP地址能够找到网络中某台设备。 2、端口:代表不同的进程,如下图: 3、socket:…...
基于MCP的桥梁设计规范智能解析与校审系统构建实践
引言 在腾讯云开发者社区中,有多种MCP工具可以用于本系统的开发和优化中,以下是一些潜在的应用场景: PDF解析工具:如pdfplumber等,可以用于规范文件的预处理,提取文本和图像信息。自然语言处理工具…...

搭建运行若依微服务版本ruoyi-cloud最新教程
搭建运行若依微服务版本ruoyi-cloud 一、环境准备 JDK > 1.8MySQL > 5.7Maven > 3.0Node > 12Redis > 3 二、后端 2.1数据库准备 在navicat上创建数据库ry-seata、ry-config、ry-cloud运行SQL文件ry_20250425.sql、ry_config_20250224.sql、ry_seata_2021012…...
OM和SCADA的区别
在工业与能源领域,O&M(Operation and Maintenance,运维) 和 SCADA(Supervisory Control And Data Acquisition,监控与数据采集系统) 是两类截然不同的概念,前者是 人员与流程驱动…...
CentOS7 grub配置文件介绍
1. grub2-editenv list saved_entryCentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core) 这个命令查询出当前启动的内核版本。 2.grep ^menu /boot/grub2/grub.cfg menuentry CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core) --class centos --class gnu-linux --class gnu --c…...
SpringBoot常用注解详解
文章目录 1. 前言2. 核心注解2.1 SpringBootApplication2.2 Configuration2.3 EnableAutoConfiguration2.4 ComponentScan2.5 Bean2.6 Autowired2.7 Qualifier2.8 Primary2.9 Value2.10 PropertySource2.11 ConfigurationProperties2.12 Profile 3. Web开发相关注解3.1 Control…...
Python字符串常用内置函数详解
文章目录 Python字符串常用内置函数详解一、基础字符串函数1. len() - 获取字符串长度2. ord() - 获取字符的Unicode码点3. chr() - 通过Unicode码点获取字符4. ascii() - 获取字符的ASCII表示 二、类型转换函数1. str() - 将对象转为字符串2. repr() - 获取对象的官方字符串表…...
MyBatis 批量新增与删除功能完整教程
一、功能概述 通过 MyBatis 动态 SQL 实现以下功能: 批量新增:一次性插入多条员工记录,支持自增主键回填。批量删除:根据 ID 数组一次性删除多条记录。二、代码逐行解析 1. Mapper 接口定义 // 批量新增:传入员工对象集合 void insertAll(List<Emp> empList);// …...
HTML常用标签用法全解析:构建语义化网页的核心指南
HTML作为网页开发的基石,其标签的合理使用直接影响页面的可读性、SEO效果及维护性。本文系统梳理HTML核心标签的用法,结合语义化设计原则与实战示例,助你构建规范、高效的网页结构。 一、基础结构与排版标签 1.1 文档结构 <!DOCTYPE htm…...
大数据架构选型全景指南:核心架构对比与实战案例 解析
目录 大数据架构选型全景指南:核心架构对比与实战案例解析1. 主流架构全景概览1.1 核心架构类型1.2 关键选型维度 2. 架构对比与选型矩阵2.1 主流架构对比表2.2 选型决策树 3. 案例分析与实现案例1:电商实时推荐系统(Lambda架构)案…...
FPGA: XILINX Kintex 7系列器件的架构
本文将详细介绍Kintex-7系列FPGA器件的架构。以下内容将涵盖Kintex-7的核心架构特性、主要组成部分以及关键技术,尽量全面且结构化,同时用简洁的语言确保清晰易懂。 Kintex-7系列FPGA架构概述 Kintex-7是Xilinx 7系列FPGA中的中高端产品线,基…...

RK3568-鸿蒙5.1与原生固件-扇区对比分析
编译生成的固件目录地址 ../openharmony/out/rk3568/packages/phone/images鸿蒙OS RK3568固件分析 通过查看提供的信息,分析RK3568开发板固件的各个组件及其用途: 主要固件组件 根据终端输出的文件列表,RK3568固件包含以下关键组件&#x…...

常见激活函数——作用、意义、特点及实现
文章目录 激活函数的意义常见激活函数及其特点1. Sigmoid(Logistic 函数、S型函数)2. Tanh(双曲正切函数)3. ReLU(Rectified Linear Unit修正线性单元)4. Softmax5. Swish(Google 提出ÿ…...
Spring模拟转账开发
完成转账代码的编写 service public class AccountServiceImpl implements AccountService {Autowiredprivate AccountDao accountDao;public void setAccountDao(AccountDao accountDao) {this.accountDao accountDao;}public void pay(String out, String in, Double money)…...