47、springboot 的 国际化消息支持--就是根据浏览器选择的语言,项目上的一些提示信息根据语言的选择进行对应的显示

news2025/1/17 0:25:36

springboot的国际化也是基于spring mvc 的。

springboot 的 国际化消息支持–就是根据浏览器选择的语言,项目上的一些提示信息根据语言的选择进行对应的显示。

总结下国家化自动配置:
功能实现就是:
比如一个登录页面,我们在浏览器选择语言是中国的,那么登录页面的所有提示消息就都是中文的。
如果浏览器语言选择英语,那么登录页面的所有提示消息就都是英文的。
而这些提示信息是写在 properties 配置文件中的。

★ 国际化的自动配置

Spring Boot为国际化自动配置提供了MessageSourceProperties类,该类负责读取有关国际化的配置属性

只有当指定basename的、默认的国际化资源文件(与语言、国家无关的国际化资源)存在时,Spring Boot的自动配置才会生效。比如配置 spring.messages.basename=mess,

那就意味着如果仅提供

appMess_zh_CN.properties(简体中文的资源文件)

appMess_en_US.properties(美式英语的资源文件),

关于国际化的自动配置不会生效;
只有当提供默认的 appMess.properties 文件时,国际化的自动配置才会生效。

代码演示:
需要有一个默认的才能生效。
在这里插入图片描述

★ 国际化的步骤

(1)编写国际化资源文件:basename_语言代码_国家代码.properties

(2)使用配置属性加载国际化资源文件。

Spring Boot只要使用简单的配置即可加载国际化资源文件。

 # 加载国际化资源文件
 spring.messages.basename=login_mess
 # 设置使用国际化消息的key作为默认消息
 spring.messages.use-code-as-default-message=true
 # 设置读取国际化消息的字符集是UTF-8
 spring.messages.encoding=UTF-8

(3)根据key输出国际化消息

分为两种情况:

 ▲ 在Java组件(如控制器等)中,直接使用容器内的MessageSource Bean(Spring Boot自动配置)
    的getMessage()方法获取国际化消息。

 ▲ 在页面模板中,使用标签或表达式输出国际化消息。比如在Thymeleaf模板中,

    直接使用#{key}即可输出指定key对应的国际化消息。

    【对比】,要输出表达式的值,使用${}。

    【注意】:如果使用devtools来打包Spring Boot项目,最好将*.properties文件设为UTF-8字符集。

代码演示

需求:我们弄一个中文版和英文版的配置文件,在浏览器选择中国语言或者英语的时候,能相应的切换。

现在是什么都没配置的,看一下原始的情况。
创建一个项目,添加一个 index 登录页面,其他什么都没有。
然后查看常规的语言,也是默认的中国。所以是这样显示。

<h4 th:text="#{login_title}">首页</h4>
不理解为什么当 login_title 没值的时候,不是显示 “首页” 两个字

在这里插入图片描述

页面输出国际化信息的代码:
1、添加一个登录页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>国际化</title>
	<!--  引入css样式,用 link 元素  ,  stylesheet 样式单 , .gz表示是打包的,但是springboot会自动解包 -->
	<!--  引入 BootstrapWeb Jar 中的 CSS 样式  -->
	<link rel="stylesheet" th:href="@{'/webjars/bootstrap/css/bootstrap.min.css'}">

	<!--  jquery 放在 bootstrap 前面,因为 bootstrap 需要依赖到 jquery  -->
	<!--  引入 jQuery 的 Web Jar 中的 js 脚本  -->
	<script type="text/javascript" th:src="@{'/webjars/jquery/jquery.min.js'}"></script>

	<!--  引入 BootstrapWeb Jar 中的 js 脚本  -->
	<script type="text/javascript" th:src="@{'/webjars/bootstrap/js/bootstrap.bundle.min.js'}"></script>

	<!--  引入 popper 的 Web Jar 中的 Js 脚本  -->
	<script type="text/javascript" th:src="@{'/webjars/popper.js/umd/popper.min.js'}"></script>

</head>
<body>
<div class="container">
	<h4 th:text="#{login_title}">首页</h4>
	<div class="text-danger" th:if="${tip != null}" th:text="${tip}"></div>
	<form method="post" th:action="@{/login}">
		<div class="form-group row">
			<label for="username" class="col-sm-3 col-form-label"
				   th:text="#{name_label}">用户名</label>
			<div class="col-sm-9">
				<input type="text" id="username" name="username"
					   class="form-control" th:placeholder="#{'name_hint'}">
			</div>
		</div>
		<div class="form-group row">
			<label for="pass" class="col-sm-3 col-form-label"
				   th:text="#{password_label}">密码</label>
			<div class="col-sm-9">
				<input type="password" id="pass" name="pass"
					   class="form-control" th:placeholder="#{'password_hint'}">
			</div>
		</div>
		<div class="form-group row">
			<div class="col-sm-6 text-right">
				<button type="submit" class="btn btn-primary"
						th:text="#{login_btn}">登录</button>
			</div>
			<div class="col-sm-6">
				<button type="reset" class="btn btn-danger"
						th:text="#{reset_btn}">重设</button>
			</div>
		</div>
	</form>
</div>
</body>
</html>

2、
编写国际化资源文件:basename_语言代码_国家代码.properties
在这里插入图片描述

3、使用配置属性加载国际化资源文件。

Spring Boot只要使用简单的配置即可加载国际化资源文件。
要配置这些才能加载

#加载国际化资源文件
spring.messages.basename=appMess
#设置使用国际化消息的key作为默认消息
spring.messages.use-code-as-default-message=true
#设置读取国际化消息的字符集是 UTF-8
spring.messages.encoding=UTF-8
#设置消息的缓存时间--单位是秒
spring.messages.cache-duration=7200

在这里插入图片描述

可以看到这些属性已经能拿到配置类里面对应的值了。
在这里插入图片描述

测试:
当我们在浏览器切换语言的时候,这些页面会显示对应的文字,而且是我们自定义的文字。
在这里插入图片描述

controller 输出国际化信息的代码:

写一下controller 和domain
通过获取登录的用户名和密码,返回登录成功或失败的消息。
放回的这些消息是国际化的消息。就是要实现如果我在浏览器把默认语言改成英语,那么代码显示和消息也是英语。
在这里插入图片描述

配置添加登录成功和失败的国际化提示消息
在这里插入图片描述

前端取值的 # 和 $ 号。
在这里插入图片描述

完整代码:

application.properties

#加载国际化资源文件
spring.messages.basename=appMess
#设置使用国际化消息的key作为默认消息
spring.messages.use-code-as-default-message=true
#设置读取国际化消息的字符集是 UTF-8
spring.messages.encoding=UTF-8
#设置消息的缓存时间--单位是秒
spring.messages.cache-duration=7200

appMess.properties

这个配置啥也不用写,默认的,但必须有这个,国际化消息的功能才能生效

appMess_zh_CN.properties

login_title=登录页面
name_label=用户名
name_hint=请输入用户名
password_label=密码
password_hint=请输入密码
login_btn=登录
reset_btn=重设
#{0} 占位符
welcome={0}, 欢迎登录学习
failure=用户名和密码不匹配

appMess_en_US.properties

login_title=Login Page
name_label=User Name
name_hint=Please input User Name
password_label=Password
password_hint=Please input Password
login_btn=Login
reset_btn=Reset
#{0} 占位符
welcome={0}, Welcome to study
failure=sorry,password and username not matched

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>国际化</title>
	<!--  引入css样式,用 link 元素  ,  stylesheet 样式单 , .gz表示是打包的,但是springboot会自动解包 -->
	<!--  引入 Bootstrap 的 Web Jar 中的 CSS 样式  -->
	<link rel="stylesheet" th:href="@{'/webjars/bootstrap/css/bootstrap.min.css'}">

	<!--  jquery 放在 bootstrap 前面,因为 bootstrap 需要依赖到 jquery  -->
	<!--  引入 jQuery 的 Web Jar 中的 js 脚本  -->
	<script type="text/javascript" th:src="@{'/webjars/jquery/jquery.min.js'}"></script>

	<!--  引入 Bootstrap 的 Web Jar 中的 js 脚本  -->
	<script type="text/javascript" th:src="@{'/webjars/bootstrap/js/bootstrap.bundle.min.js'}"></script>

	<!--  引入 popper 的 Web Jar 中的 Js 脚本  -->
	<script type="text/javascript" th:src="@{'/webjars/popper.js/umd/popper.min.js'}"></script>

</head>
<body>
<div class="container">
	<h4 th:text="#{login_title}">首页</h4>

	<div class="text-danger" th:if="${tip != null}" th:text="${tip}"></div>

	<form method="post" th:action="@{/login}">
		<div class="form-group row">
			<label for="username" class="col-sm-3 col-form-label"
				   th:text="#{name_label}">用户名</label>
			<div class="col-sm-9">
				<input type="text" id="username" name="username"
					   class="form-control" th:placeholder="#{'name_hint'}">
			</div>
		</div>
		<div class="form-group row">
			<label for="password" class="col-sm-3 col-form-label"
				   th:text="#{password_label}">密码</label>
			<div class="col-sm-9">
				<input type="password" id="password" name="password"
					   class="form-control" th:placeholder="#{'password_hint'}">
			</div>
		</div>
		<div class="form-group row">
			<div class="col-sm-6 text-right">
				<button type="submit" class="btn btn-primary"
						th:text="#{login_btn}">登录</button>
			</div>
			<div class="col-sm-6">
				<button type="reset" class="btn btn-danger"
						th:text="#{reset_btn}">重设</button>
			</div>
		</div>
	</form>
</div>
</body>
</html>

success.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>登录成功</title>
	<!--  引入css样式,用 link 元素  ,  stylesheet 样式单 , .gz表示是打包的,但是springboot会自动解包 -->
	<!--  引入 Bootstrap 的 Web Jar 中的 CSS 样式  -->
	<link rel="stylesheet" th:href="@{'/webjars/bootstrap/css/bootstrap.min.css'}">

	<!--  jquery 放在 bootstrap 前面,因为 bootstrap 需要依赖到 jquery  -->
	<!--  引入 jQuery 的 Web Jar 中的 js 脚本  -->
	<script type="text/javascript" th:src="@{'/webjars/jquery/jquery.min.js'}"></script>

	<!--  引入 Bootstrap 的 Web Jar 中的 js 脚本  -->
	<script type="text/javascript" th:src="@{'/webjars/bootstrap/js/bootstrap.bundle.min.js'}"></script>

	<!--  引入 popper 的 Web Jar 中的 Js 脚本  -->
	<script type="text/javascript" th:src="@{'/webjars/popper.js/umd/popper.min.js'}"></script>

</head>
<body>
<div class="container">
	<h4 th:text="${tip}">tip</h4>
</div>
</body>
</html>

LoginController

package cn.ljh.i18n.controller;

import cn.ljh.i18n.domain.User;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;

import java.util.Locale;

@Controller
public class LoginController
{
    //依赖注入容器中自动配置 MessageSource Bean , 用于访问国际化信息
    private MessageSource messageSource;
    //构造器注入的方式
    public LoginController(MessageSource messageSource)
    {
        this.messageSource = messageSource;
    }

    @PostMapping("/login")
    public String proLogin(User user , Model model , Locale locale)
    {
        if (user.getUsername().equals("ljh") && user.getPassword().equals("123456"))
        {
            //要添加国际化的提示信息
            //参数1:key   参数2:占位符  参数3:要确定国家地区和语言,用locale这个参数,springboot会自动揣摩
            model.addAttribute("tip",
                    messageSource.getMessage("welcome" , new String[]{user.getUsername()} , locale));
            return "success";
        }
        //参数2:不需要占位符,直接给个 null 就行
        model.addAttribute("tip",
                messageSource.getMessage("failure" , null , locale));
        return "index";
    }

}

User

@Data
public class User
{
    private Integer id;
    private String username;
    private String password;
}

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

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

相关文章

ORB-SLAM3复现的详细过程——配置安装及ROS和脚本运行---Ubuntu20.04

ORB-SLAM3配置安装及ROS和脚本运行---Ubuntu20.04 1. 安装所需要的依赖和包2. 修改代码及文件内容2.1 CMakeLists.txt文件的修改2.2 单目可视化代码修改2.3 环境配置文件的修改2.4 源码的修改 3.ORB-SLAM3的编译3.1 构建 ORB-SLAM3 库3.2 生成ROS节点 4.ORB-SLAM3的运行4.1 非R…

ModaHub魔搭社区专访百度智能云李莅:您认为向量数据库是一个刚需产品吗?

ModaHub魔搭社区&#xff1a;可以看到&#xff0c;大模型火了以后&#xff0c;向量数据库受到了特别高的关注&#xff0c;您是如何看待这种现象呢&#xff1f;您认为向量数据库是一个刚需产品吗&#xff1f; 李莅&#xff1a;是的。大模型是在今年才崭露头角&#xff0c;或者说…

【Python Odyssey】1-1 | Python初见面

文章目录 Python 由来Python 的历史Python 的优点Python的缺点Python 运用领域Python 环境配置Python 解释器安装确认Python的版本编写Python源代码运行程序 Python 由来 Python 是 吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;在阿姆斯特丹为了打发无聊的圣诞节&…

三维点云转换为二维图像

文章目录 前言原理代码总结与反思实验结果展示 前言 目的&#xff1a;将三维点云转换为二维图像 作用&#xff1a; a.给点云赋予彩色信息&#xff0c;增强点云所表达物体或对象的辨识度&#xff1b; b.将三维点云中绘制的目标物体通过映射关系绘制到二维图像中&#xff0c;这个…

Lesson5-1:OpenCV视频操作---视频读写

学习目标 掌握读取视频文件&#xff0c;显示视频&#xff0c;保存视频文件的方法 1 从文件中读取视频并播放 在OpenCV中我们要获取一个视频&#xff0c;需要创建一个VideoCapture对象&#xff0c;指定你要读取的视频文件&#xff1a; 创建读取视频的对象 cap cv.VideoCapt…

Nginx安装与部署

文章目录 一,说明二,下载三,Windows下安装1,安装2,启动3,验证 四,Linux下安装1,安装2,启动3,验证 五,Nginx配置 一,说明 Nginx是一款高性能Web和反向代理服务器,提供内存少,高并发,负载均衡和反向代理服务,支持windos和linux系统 二,下载 打开浏览器,输入地址: https://ngin…

【小沐学NLP】Python使用NLTK库的入门教程

文章目录 1、简介2、安装2.1 安装nltk库2.2 安装nltk语料库 3、测试3.1 分句分词3.2 停用词过滤3.3 词干提取3.4 词形/词干还原3.5 同义词与反义词3.6 语义相关性3.7 词性标注3.8 命名实体识别3.9 Text对象3.10 文本分类3.11 其他分类器3.12 数据清洗 结语 1、简介 NLTK - 自然…

递归算法学习——目标和,组合总和,字母大小写全排列

目录 一&#xff0c;目标和 1.题意 2.例子 3.题目接口 4.解题思路及代码 二&#xff0c;组合总和 1.题意 2.例子 3.题目接口 4.解题思路及代码 三&#xff0c;字母大小写全排列 1.题意 2.例子 3.题目接口 4.解题思路及代码 一&#xff0c;目标和 1.题意 给你一个…

jsp 新能源汽车论坛网Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 新能源汽车论坛网是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

Android逆向学习(二)vscode进行双开与图标修改

Android逆向学习&#xff08;二&#xff09;vscode进行双开与图标修改 写在前面 这其实应该还是吾爱的第一个作业&#xff0c;但是写完上一个博客的时候已经比较晚了&#xff0c;如果继续敲机械键盘吵到室友&#xff0c;我怕我看不到明天的太阳&#xff0c;所以我决定分成两篇…

英国一大学宣布:严禁使用AI生成个人陈述

8月29日&#xff0c;伦敦都会大学&#xff08;London Met Uni&#xff09;在发给合作伙伴的邮件中表示&#xff1a;“我们知道人工智能技术已经被用来生成个人陈述&#xff08;personal statements&#xff0c;即文书&#xff09;。请注意&#xff0c;本大学不接受任何由人工智…

网络实验 VlAN 中 Trunk Access端口的说明及实验

网络实验 VlAN 中 Trunk Access端口的说明及实验 VlAN 虚拟局域网技术Access端口 工作原理Trunk端口 工作原理简单实验&#xff08;一&#xff09;划分不同Vlan&#xff0c;实现vlan内部通信拓朴图主机IP 配置划分Vlanping 测试 &#xff08;二&#xff09;跨交换机实现VLAN间通…

mate60 里的2035 到底是什么鬼?

华为在 lengbulangqiang 的情况下发布了 mate60 手机&#xff0c;犹如一颗核弹升到了各国的上空&#xff0c;每个人都很想知道这其中发生了什么事情&#xff0c;也是疑点重重&#xff0c;这其中的一些疑点&#xff0c;足以让某些人暴跳如雷。 这 2035 标识到底是什么&#xff1…

李宏毅机器学习笔记:RNN循环神经网络

RNN 一、RNN1、场景引入2、如何将一个单词表示成一个向量3种典型的RNN网络结构 二、LSTMLSTM和普通NN、RNN区别 三、 LSTM的训练 一、RNN 1、场景引入 例如情景补充的情况&#xff0c;根据词汇预测该词汇所属的类别。这个时候的Taipi则属于目的地。但是&#xff0c;在订票系统…

CSS流光按钮-圆形

主要思路 仅保留一条边框 border-radius 50%drop-shadow动画 animation keyframes 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, …

QT串口助手:识别串口号,发送,接收,十六进制

1 摘要 本文主要讲述如何使用QT从零开始实现一个串口助手的基本功能&#xff0c;功能如标题所示&#xff0c;文末附有源码供大家参考。文中若有纰漏&#xff0c;烦请读者斧正。 2 环境 QT 5.14.1Window 11 3 功能 串口打开/关闭 启动软件时识别串口号打开按键随串口打开状…

【python】可视化

柱状图 matplotlib之pyplot模块之柱状图&#xff08;bar()&#xff1a;基础参数、外观参数&#xff09;_plt.bar_mighty13的博客-CSDN博客 bar()的基础参数如下&#xff1a; x&#xff1a;柱子在x轴上的坐标。浮点数或类数组结构。注意x可以为字符串数组&#xff01; height&…

【MySQL】七种SQL优化方式 你知道几条

1.插入数据 1.1insert 如果我们需要一次性往数据库表中插入多条记录&#xff0c;可以从以下三个方面进行优化。 insert into tb_test values(1,tom); insert into tb_test values(2,cat); insert into tb_test values(3,jerry); 1). 优化方案一 批量插入数据 Insert into t…

CSS 一个好玩的卡片“开卡效果”

文章目录 一、用到的一些CSS技术二、实现效果三、代码 一、用到的一些CSS技术 渐变 conic-gradientbox-shadowclip-path变换、过渡 transform、transition动画 animation keyframes伪类、伪元素 :hover、::before、::after …绝对布局。。。 clip-path 生成网站 https://techb…

新手做TikTok适合哪些类目?

现在很多小伙伴争先恐后想要在TikTok入驻&#xff0c;开店开直播带货赚钱&#xff0c;但是又怕自己是小白&#xff0c;不好拿捏这个平台。TikTok平台&#xff0c;适合小白做吗&#xff1f;现在tiktok千亿级的流量还处于蓝海阶段&#xff0c;想入局要趁早。那么肯定又有小伙伴疑…