软件的国际化

软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据。国际化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/messagesencoding: 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@Overridepublic 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

SpringBoot国际化相关推荐

  1. springboot国际化i18n

    springboot国际化 支持多国语言展示 1.自动式国际化:通过浏览器发送请求头携带的信息自动使用国际化 2.手动式国际化:通过点击按钮,动态更改国际化 由于springboot自动配置中已集成国 ...

  2. springboot+jsp中文乱码_【spring 国际化】springMVC、springboot国际化处理详解

    在web开发中我们常常会遇到国际化语言处理问题,那么如何来做到国际化呢? 你能get的知识点? 使用springgmvc与thymeleaf进行国际化处理. 使用springgmvc与jsp进行国际化 ...

  3. springboot国际化04

    springboot国际化 1 文件结构 2 messages.properties 3 优先级 4 在application.yml中配置 5 其他文件使用 6 浏览器渲染乱码 1 文件结构 Res ...

  4. SpringBoot国际化配置(i8n配置)未生效(完美解决)

    最近在整理springBoot国际化时,发现国际化没有生效,通过报错提示在 MessageTag -> doEndTag处打断点 最后发现messageSource并不是ResourceBund ...

  5. Springboot国际化信息(i18n)解析

    国际化信息理解 国际化信息也称为本地化信息 . Java 通过 java.util.Locale 类来表示本地化对象,它通过 "语言类型" 和 "国家/地区" ...

  6. springBoot国际化多语言开发配置,中文OR英文支持一键切换

    springBoot有许多的自动化配置,其中就包括多语言的autoConfiguration,打开org.springframework.boot.autoconfigure.context.Mess ...

  7. SpringBoot 实现国际化 SpringBoot配置国际化 SpringBoot 国际化 springboot实现国际化 springboot配置国际化 springboot国际化代码实现

    SpringBoot 实现国际化,不使用 spring i18n实现方式 配置 全局语言地区拦截器配置 将拦截器注册 多语言实现 多语言接口 中文语言接口实现类 英文语言接口实现类 初始化 使用 配置 ...

  8. SpringBoot国际化配置

    在resource文件下添加如下文件 在login.properties文件下添加键值对 因为国际化的相关类对应的properties对应的文件中 basename是国际化配置文件的真实位置 所以在a ...

  9. SpringBoot国际化失败的原因,切换中英文无效

    现象:在尝试国际化的过程中,无法切换中英文,一直显示中文. 原因:在配置类中,配置LocaleResolver时,方法名出错 @Configuration public class SpringBoo ...

  10. springboot国际化配置中英文切换

    1.新建项目 第一步新建springboot项目,勾选web依赖,或者后面进入在pom.xml中加入也可以. 2.项目结构 项目pom.xml <?xml version="1.0&q ...

最新文章

  1. CDOJ 1073 线段树 单点更新+区间查询 水题
  2. mysql 批处理文件传参_如何实现批处理文件传参数给SQLPLUS
  3. 【Hibernate】映射关系总结
  4. 运维人员应该掌握哪些常用技术
  5. CentOS7 常用命令集合
  6. java servlet 多线程_java – 多线程GAE servlet来处理并发用户
  7. element 往node里面增加属性值_HashMap加载因子为何0.75,为何初始化值2的指数幂,底层解析...
  8. centos7装单机hadoop2.7.3
  9. 7006.vue项目之电商项目实战1-环境搭建及后台接口测试
  10. 修改Chrome默认搜索引擎为Google.com
  11. 算法:冒泡排序、一阶滤波
  12. 工作中git常用命令
  13. 大数据用kettle还是python_Kettle学习系列之Kettle能做什么?(三)
  14. Windows10桌面美化合集(壁纸+任务栏+资源管理器)
  15. 大一计算机课如何做表格,电脑做表格的基本操作教程
  16. 安装nginx和zookeeper
  17. can't find lxxx解决办法
  18. 无法将您的Kindle连接到Wi-Fi网络怎么办-kindle无法连接wifi-kindle无法连接手机热点
  19. Win7安装.Net Framework 4.5.2失败最有效的解决方法
  20. [Spring Boot 6]企业级开发

热门文章

  1. I3S向3DTiles数据格式的转换
  2. 汽车胎压监测(TPMS)系统为何用蓝牙?
  3. 逆天了!3D网页展示居然可以这么屌!
  4. 如何解决“缺失kernelbase.dll”问题?kernelbase.dll的修复问题
  5. npm ERR! code ELIFECYCLE npm ERR! errno 2 npm ERR! meetwebpack@1.0.0 build: `webpack` npm ERR! Exit
  6. 地税机关管理码是计算机代码吗,怎么查找税务机关代码?
  7. react-mde版本5.8.0 - 7.4.1踩坑
  8. 1-2(中文版)掌握音标和读音
  9. VLSI数字信号处理系统——第五章展开
  10. 基于JAVA茗茶文化网系统计算机毕业设计源码+数据库+lw文档+系统+部署