Spring Boot 国际化配置项详解


Spring Boot 国际化配置项详解


1. 核心配置项分类

将配置项分为以下类别,便于快速定位:


1.1 消息源配置(MessageSource 相关)

控制属性文件的加载、编码、缓存等行为。

配置项作用默认值示例说明
spring.messages.basename指定属性文件的路径前缀(不包含语言后缀)messagesclasspath:i18n/messages支持多路径用逗号分隔,如 messages,custom
spring.messages.encoding属性文件的编码格式UTF-8GBK避免中文乱码需显式指定
spring.messages.cache-duration属性文件缓存时间(仅 ReloadableResourceBundleMessageSource 有效)7200s(2小时)60sPT1M(ISO 8601格式)设置为 0 禁用缓存,实现热加载

1.2 区域解析配置(LocaleResolver 相关)

控制如何确定用户的区域(Locale)。

配置项作用默认值示例说明
spring.mvc.locale默认区域(当无法自动检测时使用)由系统 Locale 决定es(西班牙语)直接指定语言代码(如 zh-CN
spring.mvc.fallback-locale备用区域(当主区域无效时使用)enzh支持多个值,用逗号分隔
spring.http.accept-language.header自定义语言检测的请求头名称Accept-LanguageX-Language例如从自定义头读取语言

1.3 Cookie 持久化配置(仅 CookieLocaleResolver
配置项作用默认值示例说明
spring.mvc.locale-resolver.cookie-nameCookie 名称LOCALElang自定义 Cookie 名称
spring.mvc.locale-resolver.cookie-max-ageCookie 有效期(秒)1440(24分钟)3600(1小时)设置为 -1 表示会话级,0 删除 Cookie

1.4 Session 持久化配置(仅 SessionLocaleResolver

无独立配置项,依赖 Session 的默认行为。


1.5 其他高级配置
配置项作用默认值示例说明
spring.messages.always-use-message-format是否强制使用 MessageFormat 解析消息(支持 {0} 占位符)truefalse关闭后仅支持简单键值对,性能更高
spring.messages.use-code-as-default-message当消息未找到时,是否返回原始键(如 error.loginfalsetrue开启后避免因消息缺失导致空值

2. 完整配置示例(application.properties/yml)
2.1 properties 格式
# 消息源配置
spring.messages.basename=classpath:i18n/messages,classpath:i18n/overrides
spring.messages.encoding=UTF-8
spring.messages.cache-duration=3600s # 1小时热加载# 区域配置
spring.mvc.locale=zh-CN
spring.mvc.fallback-locale=en
spring.http.accept-language.header=X-Language# Cookie 持久化配置
spring.mvc.locale-resolver.cookie-name=MY_LOCALE
spring.mvc.locale-resolver.cookie-max-age=86400 # 1天
2.2 YAML 格式
spring:messages:basename: "classpath:i18n/messages,classpath:i18n/overrides"encoding: UTF-8cache-duration: 3600smvc:locale: "zh-CN"fallback-locale: enlocale-resolver:cookie-name: MY_LOCALEcookie-max-age: 86400http:accept-language:header: X-Language

3. 代码配置示例(Java 配置覆盖)
3.1 自定义 ReloadableResourceBundleMessageSource
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;@Configuration
public class I18nConfig {@Beanpublic ReloadableResourceBundleMessageSource messageSource() {ReloadableResourceBundleMessageSource source = new ReloadableResourceBundleMessageSource();source.setBasenames("i18n/messages", "i18n/overrides"); // 支持多个前缀source.setDefaultEncoding("UTF-8");source.setCacheSeconds(60); // 覆盖配置项,60秒热加载return source;}
}
3.2 自定义 LocaleResolver(Cookie 持久化)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;@Configuration
public class LocaleConfig {@Beanpublic CookieLocaleResolver localeResolver() {CookieLocaleResolver resolver = new CookieLocaleResolver();resolver.setCookieName("CUSTOM_LOCALE"); // 覆盖配置项resolver.setCookieMaxAge(86400);         // 1天有效期resolver.setDefaultLocale(Locale.JAPAN); // 默认日语return resolver;}
}

4. 配置项总结表格
配置类型配置项作用默认值适用场景
消息源spring.messages.basename属性文件路径messages自定义多语言文件路径
消息源spring.messages.encoding文件编码UTF-8解决乱码问题
消息源spring.messages.cache-duration热加载间隔7200s开发环境快速调试
区域spring.mvc.locale默认语言系统默认设置全局默认语言
区域spring.http.accept-language.header自定义语言头Accept-Language适配非标准请求头
Cookiespring.mvc.locale-resolver.cookie-nameCookie 名称LOCALE避免与其他应用冲突
Session无独立配置项依赖 Session——会话内语言切换

5. 常见问题解答

Q1:如何确保属性文件被正确加载?
  • 检查路径:确保文件位于 src/main/resources/i18n/ 目录(或配置的路径)。
  • 文件命名:格式为 <basename>_{language}.properties(如 messages_zh_CN.properties)。
  • 日志调试:添加 logging.level.org.springframework.context.support=DEBUG 查看加载日志。

Q2:如何强制使用固定语言?
# application.properties
spring.mvc.locale=es # 强制西班牙语
spring.mvc.fallback-locale=es # 备用语言也设为西班牙语

Q3:如何同时支持 URL 参数切换语言?

结合 LocaleChangeInterceptor

import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LocaleChangeInterceptor()).addPathPatterns("/**"); // 通过 ?lang=es 参数切换}
}

Q4:属性文件中的 {0} 占位符无效?
  • 确保 spring.messages.always-use-message-format=true(默认值)。
  • 示例消息:
    greeting=Hello, {0}!
    

Q5:如何避免 Cookie 跨域问题?

CookieLocaleResolver 中设置域:

resolver.setCookieDomain(".example.com"); // 设置域为整个域名

6. 最佳实践
  • 多环境配置:通过 application-{profile}.properties 区分开发和生产环境的 cache-duration
  • 性能优化:生产环境禁用热加载(设为 0 可能影响性能)。
  • 国际化测试:使用 Postman 或浏览器插件修改 Accept-Language 头测试不同语言。

总结

通过上述配置,可灵活控制 Spring Boot 国际化行为。核心是理解 MessageSourceLocaleResolver 的协作关系,结合业务需求选择合适的持久化策略(Cookie/Session)和文件加载方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

拍摄的婚庆视频有些DAT的视频文件打不开怎么办

3-12 现在的婚庆公司大多提供结婚的拍摄服务&#xff0c;或者有一些第三方公司做这方面业务&#xff0c;对于视频拍摄来说&#xff0c;有时候会遇到这样一种问题&#xff0c;就是拍摄下来的视频文件&#xff0c;然后会有一两个视频文件是损坏的&#xff0c;播放不了&#xff0…

【力扣hot100题】(073)数组中的第K个最大元素

花了两天时间搞明白答案的快速排序和堆排序。 两种都写了一遍&#xff0c;感觉堆排序更简单很多。 两种都记录一下&#xff0c;包括具体方法和易错点。 快速排序 class Solution { public:vector<int> nums;int quicksort(int left,int right,int k){if(leftright) r…

【亲测】Linux 使用 Matplotlib 显示中文

文章目录 安装中文字体在Matplotlib中使用该字体来显示中文 在 Linux 系统中使用 Matplotlib 绘制图表时&#xff0c;如果需要显示中文&#xff0c;可能会遇到中文字符显示为方块或者乱码的问题。这是因为Matplotlib 默认使用的字体不支持中文。本文手把手带你解决这个问题。 …

Redis Java 客户端 之 SpringDataRedis

SpringDataRedis SpringData是Spring中数据操作的模块&#xff0c;包含对各种数据库的集成&#xff0c;其中对Redis集成模块就叫做SpringDataRedis&#xff0c; 官方地址&#xff1a;https://spring.io/projects/spring-data-redis 特性&#xff1a; 提供了对不同Redis客户端…

数字化转型:重构生存逻辑,不止系统升级

数字化转型不过是升级系统&#xff0c;砸了钱、耗了力&#xff0c;却没达到预期&#xff0c;竞争力也没提升。实际上&#xff0c;数字化转型是对企业生存逻辑的彻~底重构&#xff0c;关乎商业模式、运营流程等方方面面。​ 很多企业觉得数字化转型是 IT 部门的事&#xff0c;只…

C语言队列的实现

目录 ​编辑 &#xff08;一&#xff09;队列的定义,初始化及创建结点 &#xff08;二&#xff09;入队和出队&#xff0c;以及取队头队尾的数据 (三)销毁队列 队列是指只允许在一端进行插入数据操作&#xff0c;在另⼀端进行删除数据操作的特殊线性表&#xff0c;队列具有先…

mapbox进阶,使用本地dem数据,加载hillshade山体阴影图层

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️hillshade 山体阴影图层 api1.3.1 ☘️…

量子纠错码实战:从Shor码到表面码

引言&#xff1a;量子纠错的必要性 量子比特的脆弱性导致其易受退相干和噪声影响&#xff0c;单量子门错误率通常在10⁻~10⁻量级。量子纠错码&#xff08;QEC&#xff09;通过冗余编码测量校正的机制&#xff0c;将逻辑量子比特的错误率降低到可容忍水平。本文从首个量子纠错…

10. git switch

基本概述 git switch是 Git 2.23 版本之后新增的命令&#xff0c;专门用于切换分支&#xff0c;目的是替代 git checkout 中与分支操作相关的功能&#xff0c;使命令语义更清晰、更安全。 基本用法 1.切换到已有分支 git switch <branch-name>常用选项 1.从当前分支…

LeetCode 热题 100 堆

215. 数组中的第K个最大元素 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 **k** 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 …

PIXOR:基于LiDAR的3D检测模型解析

目录 1、前言 2、PIXOR介绍 2.1. 什么是PIXOR&#xff1f; 2.2. PIXOR如何工作&#xff1f; 3、表现和应用 3.1、PIXOR的性能表现 3.2、PIXOR的应用场景 3.3、PIXOR的局限性与挑战 4. PIXOR的未来展望 5. 结语 1、前言 自动驾驶技术正以前所未有的速度发展&#xff…

Vue中权限控制的方案

文章目录 源码&#xff1a;一、页面级1.1、路由守卫1.2、动态路由 二、按钮级别2.1、通过v-if来判断2.2、通过组件包裹的方式来判断2.3、通过自定义指令的方式 三、接口级别 源码&#xff1a; https://gitee.com/liu-qiang-yyds/sysPermission 一、页面级 1.1、路由守卫 前端…

【OSG学习笔记】Day 1: OSG初探——环境搭建与第一个3D窗口

什么是 OSG&#xff1f; 全称&#xff1a;OpenSceneGraph&#xff08;开源场景图&#xff09; 定位&#xff1a;一个基于 C/OpenGL 的高性能开源3D图形开发工具包&#xff0c;专注于实时渲染和复杂场景管理。 核心思想&#xff1a;通过 场景图&#xff08;Scene Graph&#xf…

Kubernetes 入门篇之网络插件 calico 部署与安装

在运行kubeadm init 和 join 命令部署好master和node节点后&#xff0c;kubectl get nodes 看到节点都是NotReady状态&#xff0c;这是因为没有安装CNI网络插件。 kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Not…

游戏开发中 C#、Python 和 C++ 的比较

&#x1f3ac; Verdure陌矣&#xff1a;个人主页 &#x1f389; 个人专栏: 《C/C》 | 《转载or娱乐》 &#x1f33e; 种完麦子往南走&#xff0c; 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ 摘要&#xff1a; 那么哪种编程语言最适合游戏开发…

LabVIEW真空度监测与控制系统

开发了一种基于LabVIEW的真空度信号采集与管理系统&#xff0c;该系统通过图形化编程语言实现了真空度的高精度测量和控制。利用LabVIEW的强大功能&#xff0c;研制了相应的硬件并设计了完整的软件解决方案&#xff0c;以满足工业应用中对真空度监测的精确要求。 项目背景 随着…

checkra1n越狱出现的USB error -10问题解决

使用checkra1n进行越狱是出现&#xff1a; 解决办法(使用命令行进行越狱)&#xff1a; 1. cd /Applications/checkra1n.app/Contents/MacOS 2. ./checkra1n -cv 3. 先进入恢复模式 a .可使用爱思助手 b. 或者长按home,出现关机的滑条&#xff0c;同时按住home和电源键&#…

spring boot 中 WebClient 与 RestTemplate 的对比总结

以下是 WebClient 与 RestTemplate 的对比总结&#xff0c;以纯文本表格形式呈现&#xff1a; 核心特性对比 特性RestTemplateWebClient线程模型同步阻塞&#xff1a;每个请求占用线程&#xff0c;直到响应返回。异步非阻塞&#xff1a;基于事件循环&#xff0c;高效处理高并发…

深入浅出SPI通信协议与STM32实战应用(W25Q128驱动)(实战部分)

1. W25Q128简介 W25Q128 是Winbond推出的128M-bit&#xff08;16MB&#xff09;SPI接口Flash存储器&#xff0c;支持标准SPI、Dual-SPI和Quad-SPI模式。关键特性&#xff1a; 工作电压&#xff1a;2.7V~3.6V分页结构&#xff1a;256页/块&#xff0c;每块16KB&#xff0c;共1…

STM32 HAL库之EXTI示例代码

外部中断按键控制LED灯 在main.c中 HAL_Init(); 初始化Flash&#xff0c;中断优先级以及HAL_MspInit函数&#xff0c;也就是 stm32f1xx_hal.c 中 HAL_StatusTypeDef HAL_Init(void) {/* Configure Flash prefetch */ #if (PREFETCH_ENABLE ! 0) #if defined(STM32F101x6) || …