Springboot配置页面国际化

2023-11-02

有时候网站会涉及中英文甚至多语言的切换,这时候我们需要学习国际化

准备工作

  1. 先设置properties的编码为utf-8
    在这里插入图片描述

  2. 编写国际化配置文件,在resources资源路径下新建i18n目录,存放国际化配置文件

3.建立一个login.properties文件,还有一个login_zh_CN.properties,发现IDEA自动识别了我们要做国际化操作,文件夹改变了

在这里插入图片描述

4.可以在这个文件夹下面新建一个文件

在这里插入图片描述

  1. 可以添加一个存放英文的资源配置文件

在这里插入图片描述

方便快捷
在这里插入图片描述

6.当我们随便打开一个配置文件编写时,发现idea有一个操作

在这里插入图片描述

  1. 点击视图的+号就可以直接添加属性了,新建一个login.tip,发现右边有三个文件框可以输入对应的属性值
    在这里插入图片描述

  2. 添加首页内容、对应页面值为

在这里插入图片描述

在这里插入图片描述

  1. 依次添加其他页面值与配置文件的属性对应

在这里插入图片描述

查看我们的配置文件:

login.properties:它是默认设置

login.passWord=密码
login.remember=记住我
login.submit=登录
login.tip=请登录
login.userName=用户名

英文:

login.passWord=Password
login.remember=Remember me
login.submit=Sign in
login.tip=Please sign in
login.userName=Username

中文:

login.passWord=密码
login.remember=记住我
login.submit=登录
login.tip=请登录
login.userName=用户名

探究配置文件生效问题

  1. 查找一下springboot对国际化的自动配置,有一个类叫MessageSourceAutoConfiguration,里面有一个方法,SpringBoot已经自动配置好了管理我们国际化资源文件的组件 ResourceBundleMessageSource

// 获取 properties 传递过来的值进行判断
@Bean
	public MessageSource messageSource(MessageSourceProperties properties) {
		ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
		 // 设置国际化文件的基础名(去掉语言国家代码的)
		if (StringUtils.hasText(properties.getBasename())) {
			messageSource.setBasenames(StringUtils
					.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(properties.getBasename())));
		}

发现还有一个类

protected static class ResourceBundleCondition extends SpringBootCondition {

		private static ConcurrentReferenceHashMap<String, ConditionOutcome> cache = new ConcurrentReferenceHashMap<>();

		@Override
		public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
		//获取配置文件的位置
			String basename = context.getEnvironment().getProperty("spring.messages.basename", "messages");
			//添加做为候选
			ConditionOutcome outcome = cache.get(basename);
			if (outcome == null) {
				outcome = getMatchOutcomeForBasename(context, basename);
				cache.put(basename, outcome);
			}
			return outcome;
		}

在配置文件中如何配置spring.messages.basename值呢?

private Resource[] getResources(ClassLoader classLoader, String name) {
//帮我们把.转换为/
			String target = name.replace('.', '/');
			try {
			//并从类路径下查找,拼接xxx/xx.properties文件
				return new PathMatchingResourcePatternResolver(classLoader)
						.getResources("classpath*:" + target + ".properties");
			}
			catch (Exception ex) {
				return NO_RESOURCES;
			}
		}
  1. 所有我们在i18n目录下,配置这个messages的路径

spring.messages.basename=i18n.login

在HTML页面配置国际化值

  1. 查看Thymeleaf的文档,发现message取值操作为#{…}
    在这里插入图片描述
  2. 使用Thymeleaf表达式修改HTML页面

在这里插入图片描述

3.启动项目测试:访问主页面,已经自动被识别为中文了

在这里插入图片描述

配置国际化解析

根据按钮自动切换中文英文

  1. 我们在WebMvcAutoConfiguration类中发现有一个国际化Locale (区域信息对象)里面有一个叫做LocaleResolver (获取区域信息对象)的解析器
@Bean
		@ConditionalOnMissingBean(name = DispatcherServlet.LOCALE_RESOLVER_BEAN_NAME)
		@SuppressWarnings("deprecation")
		public LocaleResolver localeResolver() {

		//如果webProperties配置文件中有配置,则用固定的国际化解析器
			if (this.webProperties.getLocaleResolver() == WebProperties.LocaleResolver.FIXED) {
				return new FixedLocaleResolver(this.webProperties.getLocale());
			}
			//如果mvcProperties配置文件中有配置,则用固定的国际化解析器
			if (this.mvcProperties.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
				return new FixedLocaleResolver(this.mvcProperties.getLocale());
			}
			//接收头国际化分解
			AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
			//如果配置文件为null则用默认的配置
			Locale locale = (this.webProperties.getLocale() != null) ? this.webProperties.getLocale()
					: this.mvcProperties.getLocale();
			localeResolver.setDefaultLocale(locale);
			return localeResolver;
		}
  1. AcceptHeaderLocaleResolver实现了一个接口LocaleResolver,并且重写了resolveLocale()方法
public Locale resolveLocale(HttpServletRequest request) {
		Locale defaultLocale = getDefaultLocale();
		 默认的就是根据请求头带来的区域信息获取Locale进行国际化
		if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
			return defaultLocale;
		}
		Locale requestLocale = request.getLocale();
		List<Locale> supportedLocales = getSupportedLocales();
		if (supportedLocales.isEmpty() || supportedLocales.contains(requestLocale)) {
			return requestLocale;
		}
		Locale supportedLocale = findSupportedLocale(request, supportedLocales);
		if (supportedLocale != null) {
			return supportedLocale;
		}
		return (defaultLocale != null ? defaultLocale : requestLocale);
	}
  1. 如果我们想点击链接让我们自己的国际化资源生效,就必须实现LocaleResolver接口,重写resolveLocale方法,让我们的Locale生效,我们可以写一个自己的LocaleResolver,可以在链接上携带区域信息

  2. 修改一下页面的跳转链接

<!-- 这里传入参数不需要使用 ?使用 (key=value)格式即可-->
<a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>
<a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>
  1. 写一个配置类组件,作为webMVC拓展配置类
//可以在链接上携带区域信息
public class MyLocaleResolver implements LocaleResolver {

    //解析请求
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        //解析请求传参
        String language = request.getParameter("lang");
        //获取当地默认的语言,如果解析失败则用默认的国际化语言
        Locale locale = Locale.getDefault();
        //如果请求链接不为空
        if (!StringUtils.isEmpty(language)){
            //分割请求参数
            String[] split  = language.split("_");
            //将分割的字符串代表国家语言和地区,创建一个新locale对象并赋值
            locale=new Locale(split[0],split[1]);
        }
        //将得到的国际化语言对象返回
        return locale;
    }


    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {

    }
}
  1. 为了让我们的区域化信息能够生效,需要在我们自定义配置类中(即实现WebMvcConfigurer接口,以及添加注解@Configuration)将上面的类注册bean交给SpringIOC管理
//自定义webMVC配置类,拓展webMVC的配置
@Configuration
public class MyConfiguration implements WebMvcConfigurer {
    //添加视图控制器
    public void addViewControllers(ViewControllerRegistry registry) {
        //当访问/或者/index.html都会跳转到首页
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/index.html").setViewName("index");
    }

    @Bean("localeResolver")
    public LocaleResolver LocaleResolver(){
        return new MyLocaleResolver();
    }

}

注意:在自定义配置类中的LocaleResolver()方法名必须为这个,因为springboot会自动调用这个方法,而且注入的bean要指定名称(localeResolver),如果不指定名称默认是注入myLocaleResolver,springIOC容器找不到该localeResolver的bean则无法实现国际化转换

浏览器访问:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot配置页面国际化 的相关文章

  • vue3 中绑定多个ref对象

    for循环中 如果给每一个元素绑定一个特定的ref值 ref xxx 那么就要定义N多个变量来分别接受它们 显然不现实 1 在setup中定义一个常量xxxrefs用来接受所有for循环设置ref的元素 ref中必须要是空数组 const
  • python3安装matplotlib的两种方法_如何安装matplotlib与Python3.2

    Matplotlib支持python 3 x版本1 2 发布于2013年1月 要安装它 看看installation instructions 一般来说 调用pip install matplotlib或使用您的首选机制 conda hom
  • c语言编程人狼羊菜过河,基于visual Studio2013解决C语言竞赛题之1079狼羊过河

    题目 解决代码及点评 79 猎人过河 猎人要把一只狼 一头羊和一些白菜从河的左岸带到右岸 但他的船太小 一次只能带一样 因为狼要吃羊 羊会吃白菜 所以狼和羊 羊和白菜不能在无人监视的情况下相处 问猎人怎样才能达到目的 请编程序实现猎人过河
  • SpringBoot注解使用redis做缓存总结

    前言 个人工作中对此相关内容的总结 部分资料来源于网上 一 Cacheable CachePut CacheEvict 注释介绍 Cacheable Cacheable 的作用 主要针对方法配置 能够根据方法的请求参数对其结果进行缓存 主要
  • nmtui 和 nmcli 命令 配置网络

    目录 一 nmtui命令 修改静态IP地址 二 nmcli命令 基于命令行配置网卡参数 三 绑定两块网卡 1 创建出一个bond网卡 2 向bond0设备添加从属网卡 3 配置bond0设备的网络信息 4 启动和测试 一 nmtui命令 修
  • 第001天:第一行Android代码

    1 1 了解全貌 Android王国简介 Android从面世以来到现在已经发布了二十几个版本了 在这几年的发展过程中 谷歌为 Android王国建立了一个完整的生态系统 手机厂商 开发者 用户之间相互依存 共同推进着 Android的蓬勃
  • 人体姿态识别(毕业设计+代码)

    模型效果 从下图可以清楚的看到 提出的模型可以对人眼以及嘴巴进行描述 最终的是对每个关节点进行了划分和表示 前言 从视频中进行人体姿势估计在各种应用中都扮演着关键角色 例如量化身体锻炼 手语识别和全身手势控制 例如 它可以成为瑜伽 舞蹈和健
  • windows内核API种类

    在初学windows驱动时 开始除了要学习驱动的加载 调试等准备工作后 就要学习内核的API了 作为初学者在刚刚看到那些很陌生的函数时可能会感到很迷茫 其实这些都是很正常的 就像我们在刚刚接触编程时那样 今天我在我第一篇正式的博文中总结一下
  • 【VUE】基于VUE的图片预览插件 vue-photo-preview

    使用方法 1 安装 npm install vue photo preview save 2 在 main js 中引入配置文件 import vuePicturePreview from vue picture preview Vue u
  • yolov5lite v1.4 踩坑记录

    yolov5lite v1 4 1 报错 AttributeError module numpy has no attribute int np int was a deprecated alias for the builtin int
  • Surface先进行lockCanvas,随后绘制视频引发的IlleageArgumentException

    表现形式 在SurfaceView或者SurfaceTextture中 先对拿到serface 对其lockCanvas获得画布 绘画解除锁定后 又播放视频 出现了崩溃 思路来源 https stackoverflow com questi
  • [性能优化]为了把首页加载速度从15秒降到2秒我都做了哪些事情?

    性能优化 为了把首页加载速度从15秒降到2秒我都做了哪些事情 前言 对于一个网站来说 首页打开的速度一定程度上决定了用户的访问量和留存率 很显然 5G时代下的人们是缺乏耐心的 如果一个网页卡十几秒还没开 估计会弃之 那么怎么才能提高这个速度
  • centos7安装pip并修改pip源,修改yum源

    修改yum源 wget O etc yum repos d CentOS Base repo http mirrors aliyun com repo Centos 7 repo sudo yum clean all sudo yum ma
  • GoogleNet(Going deeper with convolutions)网络简单介绍(笔记)

    GoogleNet在2014年由Google团队提出 斩获当年ImageNet竞赛中Classification Task 分类任务 第一名 网络中的亮点 1 引入了 Inception结构 融合不同尺度的特征信息 2 使用1x1的卷 积核
  • java float比较_java – 为什么我们不能使用’==’来比较两个float或double数字

    从apidoc Float compare Compares the two specified float values The sign of the integer value returned is the same as that
  • 引入助教来提高知识蒸馏效率

    引入教师助理来提高知识蒸馏效率 知识蒸馏简单介绍 摘要 实验数据证明 多层助教 参考论文 Improved Knowledge Distillation via Teacher Assistant 声明 文章的图片均来自以上论文 知识蒸馏简
  • 【HTML】HTML5的新特性Geolocation

    HTML HTML5的新特性Geolocation 引言 内容速递 看了本文您能了解到的知识 位置是个人隐私 但技术得学习 官方介绍 HTML5 Geolocation API 用于获得用户的地理位置 鉴于该特性可能侵犯用户的隐私 除非用户

随机推荐

  • 用Java实现ESB

    用JAVA实现ESB Jeff Hanson 用SOA集成新老组件和服务需要一个能够连接任意组件或服务的基础设施 通过这个基础设施就不需要考虑组件和服务的位置 消息协议和消息格式 为了能够通过这个基础设施串联起这些服务和组件 必须作很多的客
  • java Object类 && 包装类

    目录 Object 类的使用 操作符与equals方法 equals 重写equals 方法的原则 面试题 toString 方法 包装类 Wrapper 的使用 基本类型 包装类与String类间的转换 包装类用法举例 总结 Object
  • android面试-Handler机制(oppo面试)

    要点 面试的时候回答的最主要的点就是上面的这一个环形的框图 要能够清晰的表达出来 后面具体的源码细节才讲得有意义 不然前面一个整体框架都错了 后面怎么说都没用 另外 本文是基于你已经看过Handler的源码基础上作出的总结 MQ的话主要就是
  • XShell SecueCTR工具远程安装激活 连接使用

    1 1Xshell下载 中文官方网站 http xshellcn com 外文官方网站 https www netsarang com download free license html 这里使用Xshell连接ubuntu 需要Linu
  • 2022年江西省中职组“网络空间安全”赛项模块B-网页渗透

    2022年中职组山西省 网络空间安全 赛项 B 10 网页渗透解析 不懂私信博主 联系方式 3260344435 一 竞赛时间 420分钟 共计7小时 吃饭一小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第 阶段 单兵模
  • 动手学习TCP下

    1 拥塞控制 由于TCP协议向应用层提供不定长字节流传输能力 这将使得TCP有意愿去占满整个网格带宽 如果网络中TCP连接都试图占满整个带宽 那么就可能出现网络拥塞 导致吞吐量下降 极端情况引起网络瘫痪 TCP的拥塞控制算法能够有效的降地低
  • Python自增运算介绍

    接触过其他语言的同学可能都知道算数运算符里面有个自增运算符 在写循环的时候非常常用 但是Python里面可能会不同 需要引起大家注意 请看以下Python代码 num 1 num 1 num 1 Python居然不认识 运算符 同理Pyth
  • ionic cordova 之File插件实现文件下载

    1 项目中引入File插件 File插件使用参见https ionicframework com docs native file 2 File下载文件实现代码示例 import Injectable from angular core i
  • 宫本武藏重做技能介绍 宫本武藏重做有哪些加强

    要说王者荣耀中哪个英雄能被称为超级兵 那肯定都会想到宫本武藏 而在最近 重做后的宫本武藏正式上线了 下面就一起来看看宫本武藏重做技能介绍吧 宫本武藏重做技能介绍 被动技能 二天一流 释放技能获得一重 势 每次普攻消耗一重 势 最高两重 根据
  • 我是华为人

    我是华为人 又见到老皮 Puerschel 已过了五年 这次他是带客户到中国来参观 依旧是神采奕奕 笑容满面 来去匆匆 他是德国人 大学一毕业就进入中国华为工作 一干就是五年 而且始终保持着高昂的斗志 愉快的心情 华为是什么吸引了他 让他能
  • cat /proc/meminfo的解读

    MediaTek On Line Loginhttps online mediatek com QuickStart QS00227 QSS02376 anon pages 匿名页 没有文件背景的页面 如stack heap 数据段等 他们
  • Redis下载安装与配置(windows)

    一 Redis下载 Redis官网建议使用Linux进行部署 未提供windows版本的Redis 但微软开发和维护着Windows64版本的Redis Windows64版本的Redis下载地址 Releases microsoftarc
  • 熟悉Kali源-无法定位软件包问题

    文章目录 Linux安装特性 问题和解决 结论和应对 参考 Linux安装特性 每个LINUX的发行版 比如ubuntu 都会维护一个自己的软件仓库 我们常用的几乎所有软件都在这里面 这里面的软件绝对安全 而且绝对的能正常安装 在ubunt
  • 增广拉格朗日函数的KKT条件及投影形式(projection form)

    我的这篇博文中介绍了增广拉格朗日函数及KKT条件 增广拉格朗日函数 The augmented Lagrangian 及其KKT条件 这篇文章中介绍了Lagrangian的KKT条件和投影形式 KKT条件和投影定理 Projection T
  • glTF2.0_01

    glTF2 0
  • Jenkins---Jenkins配置定时任务

    前言 当我们将自动化代码成功的部署到了Jenkins 领导突然有要求 想要每2小时进行看下自动化的结果 这个时候jenkins能帮助我们实现吗 答案是肯定的 jenkins上有构建定时器 接下来安静通过小小的例子如何操作 Jenkins定时
  • 学习笔记(STM32通用定时器)

    PS 自己做的笔记 质量不高T T 源教程视频 https www bilibili com video BV1th411z7sn vd source e9a6e1a7cd4e8068209a469f8be0be16 STM32F103C8
  • C++开源库集合

    C 开源库集合 Main Site Index Download mimetic A free GPL C MIME Library mimetic is a free GPL Email library MIME written in C
  • 刷脸支付市场生态朝着更加良性方向发展

    购物付款时 不用开机 只是看一眼支付设备 就能完成付款 今年以来 刷脸支付在大小商店 餐馆逐渐铺开 消费者和商家在感到新鲜 好奇的同时也发现 这一设备利用率高 体验比二维支付好 刷脸支付未来市场还在观察 移动支付和支付没有办法确定使用者到底
  • Springboot配置页面国际化

    有时候网站会涉及中英文甚至多语言的切换 这时候我们需要学习国际化 准备工作 先设置properties的编码为utf 8 编写国际化配置文件 在resources资源路径下新建i18n目录 存放国际化配置文件 3 建立一个login pro