SpringBoot国际化

news2024/10/10 0:25:22


软件的国际化

软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据。国际化internationalization,在i和n之间有 18 个字母,所以叫i18n。

MessageSource组件

Spring定义了 MessageSource 接口,用于访问国际化信息。

getMessage(String code, Object[] args, String defaultMessage, Locale locale)

getMessage(String code, Object[] args, Locale locale)

getMessage(MessageSourceResolvable resolvable, Locale locale)

属性

说明

code

国际化资源中的属性名

args

传递格式化串占位符所用的运行期参数,当在资源找不到对应属性名时,会返回defaultMessage参数所指定的默认信息

locale

表示本地化对象

resolvable

封装了属性名、参数数组以及默认信息的大类

其内部实现(MessageSource 是如何从 properties 文件中读取国际化的值的?),大致看了一下源码并进行了调试,最终了解到它是将 properties文件中的msgKey、value都load到了一个lookup的HashMap中(第一次加载时会缓存起来,后面直接走的缓存,有兴趣的同学可以在 PropertyResourceBundle.java:157 中寻找答案),得到 msgKey -> value,外层还有一个 locale 做索引,即 locale -> (msgKey -> value),最后是通过 locale + msgKey 得到相应的 value 。

最终,一个 properties 文件对应于一个 PropertyResourceBundle 对象。

Spring区域信息解析器

spring 支持获取请求头Accept-Language区域信息解析器。

不需重写。只需要Http请求头中带有Accept-Language就可以实现国际化语言支持。

其他文章多次提到自定义编写此部分,大家一定要避免此坑。

关于Accept-Language如下

Accept-Language

Accept-Language:表示浏览器所支持的语言。

当我们在开发国际化的网站时,后端接口的信息需要根据用户所使用的语言返回对应的内容。作为后端我需要前端在请求头的Accept-Language属性声明需要返回的语言。

格式

Accept-Language: lange-range[weight]

示例

  • Accept-Language: zh-cn,zh;q=0.5

意思: 支持的语言分别是简体中文和中文,优先支持简体中文。

zh-cn:表示简体中文,zh:表示中文(包括简体中文,繁体中文)

  • Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

意思:优先支持中文,如果没有中文则支持英文。

q:表示他之前语言的权重, 0 <= q <= 1

  • Accept-Language: zh-cn;q=0.8,en-US;q=0.9

意思:优先支持英文,如果没有英文则支持中文。

  • Accept-Language: zh-cn;q=0.8,en-US;q=0.6

意思:优先支持中文,如果没有中文则支持英文。

  • **Accept-Language: ***

意思: 支持所有语言

配置国际化资源文件

在application.yml中指定资源文件配置

spring: 
  messages:
    basename: i18n/messages
    encoding: UTF-8

然后在resource下创建i18n目录,然后在其下创建文件

messages.properties不带后缀为默认语言资源

可以按照一定规则分类编写,后期会很多信息。

# 参数校验信息
validation.UserVo.NAME_NOT_EMPTY=姓名不能为空
validation.UserVo.AGE_NOT_EMPTY=年龄不能为空

# 异常信息
exception.userBizException.10000 = 用户保存异常

# 断言校验信息
assert.userService.CHECK_ITEM_KEY = 姓名[{0}]已经存在,请勿重复创建

支持占位符参数。

国际化工具类

import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;

/**
 * 国际化工具类
 * @Author : xiayi
 * @Date: 2023-01-31 14:59
 */
@Component
public class I18nUtil {
    public static MessageSource messageSource;

    public I18nUtil(MessageSource messageSource) {
        // spring的bean注入
        I18nUtil.messageSource = messageSource;
    }

    /**
     * 获取国际化翻译值
     */
    public static String get(String msgKey) {
        return messageSource.getMessage(msgKey, null, LocaleContextHolder.getLocale());
    }

    /**
     * 获取国际化翻译值(包括占位符)
     */
    public static String get(String msgKey, Object... args) {
        return messageSource.getMessage(msgKey, args, LocaleContextHolder.getLocale());
    }
}

使用方式:

I18nUtil.get("assert.userService.CHECK_ITEM_KEY",user.getName())

Validation国际化

Spring Boot Validation支持JSR-380(aka. Bean Validation 2.0,part of Jakarta EE and JavaSE)注解,可通过验证注解的message属性设置验证错误提示信息,且每个验证注解都有默认的message配置,例如@NotEmpty的message属性值设置如下图:

    /**
     * 名称
     */
    @NotEmpty(message = "{validation.DictSaveVO.name.NAME_NOT_EMPTY}")
    private String name;

注意:

默认的message = "{...}"的形式即指定国际化属性的名称,后续会根据语言环境替换为对应的值,而这些国际化属性的定义可参见hibernate-validator中的org.hibernate.validator.ValidationMessages.properties等一些列国际化属性定义:

Spring Boot Validation起初其并不直接支持读取Spring Boot自身的国际化配置(通过spring.messages进行配置),而是需要在resources/ValidationMessages.properties中进行配置的国际化属性才会生效,而后续在Spring Boot 2.6+版本才支持Validation与Spring Boot自身的国际化配置相结合。接下来结合Spring Boot 2.5和2.6版本分别介绍下Spring Boot Validation如何集成自定义国际化验证提示信息。

在Spring Boot 2.5.x版本中,Spring Boot Validation默认只支持读取resources/ValidationMessages.properties系列文件的中的国际化属性,且中文需要进行ASCII转码才可正确显示而就算Spring Boot应用亦声明了自身的国际化配置,但是Spring Boot Validation框架是读取不到的,而想要Spring Boot Validation框架和Spring Boot自身使用同样的国际化配置,则可通过如下方式进行配置:

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Spring Web验证器自定义国际化文件配置<br/>
 * 注:适用于Spring Boot 2.5.*
 *
 */
@Configuration
public class WebValidationConfig implements WebMvcConfigurer {

    /**
     * 国际化消息源
     */
    private MessageSource messageSource;

    public WebValidationConfig(MessageSource messageSource) {
        //注入Spring Boot国际化消息源(需通过spring.messages明确指定)
        this.messageSource = messageSource;
    }

    /**
     * 使用自定义LocalValidatorFactoryBean,
     * 设置Spring国际化消息源
     */
    @Bean
    @Override
    public Validator getValidator() {
        LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
        //仅兼容Spring Boot spring.messages设置的国际化文件和原hibernate-validator的国际化文件
        //不支持resource/ValidationMessages.properties系列
        bean.setValidationMessageSource(this.messageSource);
        return bean;
    }
}

Spring Boot 2.6.x版本之后已支持验证注解message属性引用Spring Boot自身国际化配置,无需上面自定义配置。

SpringBoot2.7.6已设置ApplicationContext实现MessageSource

避坑:

使用原始validator校验,不要自定义注解来实现拦截,否则无法国际化。

参考:

https://blog.csdn.net/u013565163/article/details/104262975

https://blog.csdn.net/GAOXINXINGgaoxinxing/article/details/92642470

https://blog.csdn.net/haihui_yang/article/details/83987839

https://blog.csdn.net/qq_42315935/article/details/125337214

https://blog.csdn.net/luo15242208310/article/details/124897389

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

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

相关文章

AXI 总线协议学习笔记(2)

引言 从本文开始&#xff0c;正式系统性学学习AXI总线。 如何获取官方协议标准&#xff1f; 第一步&#xff1a;登陆官网&#xff1a;armDeveloper 第二步&#xff1a;登录&#xff0c;无账号需要注册 第三步&#xff1a;点击文档 第四步&#xff1a; 第五步&#xff1a;浏…

最新最全阿里内推830道面试题合集,BATJ都有问到

小小叹语&#xff1a;你是否对你现在的生活状态有满足感呢&#xff1f;逝去日子经过多少风雨波折才有今天的成就&#xff0c;只有努力向上不断闯断&#xff0c;热爱竟逐每秒每分钟&#xff0c;才能拥有的更多。 而对于一个程序员来说&#xff0c;如果说你是想要在互联网行业找…

【题解】2023牛客寒假算法基础集训营4

目录A 清楚姐姐学信息论思路B. 清楚姐姐学构造思路C. 清楚姐姐学01背包(Easy Version)思路D. 清楚姐姐学01背包(Hard Version)思路E. 清楚姐姐打怪升级思路F. 清楚姐姐学树状数组思路G. 清楚姐姐逛街(Easy Version)思路L. 清楚姐姐的三角形I思路M. 清楚姐姐的三角形II思路A 清楚…

Grafana 系列文章(四):Grafana Explore

&#x1f449;️URL: https://grafana.com/docs/grafana/latest/explore/ &#x1f4dd;Description: Explore Grafana 的仪表盘 UI 是关于构建可视化的仪表盘。Explore 剥离了仪表盘和面板选项&#xff0c;这样你就可以。.. Grafana 的仪表盘 UI 是关于构建可视化的仪表盘的。…

happen-before

happen-before 什么是happen-before JMM可以通过happens-before关系向程序员提供跨线程的内存可见性保证(如果A线程的写操作a与B线程的读操作b之间存在happens-before关系&#xff0c;尽管a操作和b操作在不同的线程中执行&#xff0c;但JMM向程序员保证a操作将对b操作可见). …

Leetcode(上)

Leetcode&#xff08;上&#xff09; 1.LeetCode01 两数之和 给定一个整数数组nums和一个整数目标值target&#xff0c;请你在该数组中找出和为目标值target的那两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一…

数据结构——优先级队列和堆

目录 一、堆 1.概念 2.堆的存储方式 3.性质 4.模拟实现堆&#xff08;以小根堆为例&#xff09; &#xff08;1&#xff09;.堆的调整 &#xff08;2&#xff09;.堆的创建 &#xff08;3&#xff09;.建堆的时间复杂度 &#xff08;4&#xff09;.堆的插入和删除 5.堆…

微服务篇之Eureka注册中心

目录 1. 初识Eureka 1.1 Eureka是什么 1.2 什么是注册中心 1.3 Eureka的原理 2. Eureka的快速入门 2.1 搭建eureka的单机服务 2.2 注册服务的消费者 2.3 注册服务的提供者 3. Eureka的特性 3.1 自我保护机制 3.2 集群支持AP特性 4. Eureka的集群 4.1 不分区集群模式 4.2 分…

Go语言测试(回归测试、集成测试、单元测试简述)与项目开发的流程简述

测试项目流程1. 测试的类别2. 单元测试的规则&#xff08;函数以Test开头&#xff09;2.1 示例12.2 示例23. Mock测试&#xff08;打桩&#xff09;4. 基准测试&#xff08;类似于单元测试&#xff0c;函数以Benchmark开头&#xff09;5. 项目开发的流程项目拆解代码设计测试运…

浪涌保护器(电涌保护器)连接线规格分析方案

低压配电设计中&#xff0c;现在对于浪涌保护器(SPD)及其专用保护装置的标注和画法&#xff0c;都比较规范统一了。那有没有遇到要求标注浪涌保护器连接线规格的情况&#xff1f;或者说&#xff0c;设计师有没有责任要标注清楚各类浪涌保护器连接线规格&#xff1f;地凯科技防雷…

屈光发育档案是什么?为什么专业医生建议从3岁开始就要建立?

当孩子出现近视问题时&#xff0c;家长们都会很焦虑。其实儿童视力发育是一个循序渐进&#xff0c;逐渐成长完善的过程。我们唯一能做的就是预防&#xff0c;在未近视时提前发现近视的趋势。来源&#xff1a;卫生健康委网站这其中最为关键的是建立屈光发育档案。国家青少年近视…

视频剪辑有这6个高清视频素材库就够了

视频剪辑必备的6个网站&#xff0c;免费、可商用&#xff0c;建议收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材类型非常多&#xff0c;平面设计、UI设计、电商类、图片、视频、音频等素材站内都能找到。视频素材全部高清、无…

C++——map和set封装实现

目录 mao和set模拟实现 模拟实现 取K的仿函数 Insert 迭代器 begin和end 和-- operator[] 完整代码 set.h map.h rbtree.h mao和set模拟实现 STL map和set只是包含了几个头文件 主要在选中的这个文件里&#xff0c;打开之后我们可以看到红黑树 用红黑树…

【操作系统】第二章 进程与线程

文章目录第二章 知识体系2.1 进程与线程2.1.1 进程的概念和特征2.1.2 进程的状态与转换2.1.3 进程的组成2.1.4 进程控制2.1.5 进程通信2.1.6 进程的上下文切换2.1.7 线程和多线程模型2.2 处理机调度2.2.1 调度的概念2.2.2 调度的层次分类2.2.3 调度的实现2.2.4 典型的调度算法2…

【八大数据排序法】选择排序法的图形理解和案例实现 | C++

第十五章 选择排序法 目录 第十五章 选择排序法 ●前言 ●认识排序 ●一、选择排序法是什么&#xff1f; 1.简要介绍 2.图形理解 3.算法分析 ●二、案例实现 1.案例一 ● 总结 前言 排序算法是我们在程序设计中经常见到和使用的一种算法&#xff0c;它主要是将一堆不规则…

活体识别3:论文笔记之《FACE ANTI-SPOOFING BASED ON COLOR TEXTURE ANALYSIS》

说明 本文是我对论文《FACE ANTI-SPOOFING BASED ON COLOR TEXTURE ANALYSIS》做的一个简单笔记。 这个论文是芬兰奥卢大学(Oulu)课题组的一篇很有代表性的论文&#xff0c;写于2015年&#xff0c;使用的是“LBP特征SVM分类器”这种比较传统的方案&#xff0c;方案不复杂&…

如何使用 JuiceFS 创建 WebDAV 共享

WebDAV 是一种基于 HTTP 的文件共享协议&#xff0c;最初被设计用于多用户文档协作编辑的场景&#xff0c;也被广泛应用在基于互联网的文件存储、数据同步等网盘类应用场景。 手机端和 PC 端有大量的应用内置了对 WebDAV 的支持&#xff0c;比如知名的文献管理工具 Zotero、iP…

微信小程序 java Springboot校园租房指南房屋租赁系统

东前端&#xff1b;首页、房源信息、租房指南、我的&#xff0c;用户前端&#xff1b;首页、房源信息、租房指南、我的等主要功能模块的操作和管理。 1.出租房源信息的上传、审核、发布&#xff1b; 2.租房信息的浏览、查找、查看&#xff1b; 3.用户与出租方通信&#xff1b; …

Docker-01基本命令

1、Docker安装 系统镜像为Centos7.x yum包更新到最新 sudo yum update安装需要的软件包&#xff0c;yum-util提供yum-config-manager功能。另外两个是devicemapper驱动依赖的 sudo yum install -y yum-utils device-mapper-persistent-data lvm2设置yum源为阿里云 sudo yu…