springboot 集成 i18n实现国际化信息返回 实现中英文切换 实现网站支持多语言切换

还是直接上代码
目前实现了 中英文 返回 别的语言 都差不多

主要用spring boot 自带的 类实现的 不用引入任何 依赖
使用的就是下面的类
org.springframework.context.MessageSource 是 Spring Framework 中用于支持国际化(Internationalization,简称 i18n)的接口之一。它提供了一种统一的方式来获取文本信息,使得应用程序能够根据不同的语言和区域设置展示对应的文本内容。

具体来说,MessageSource 接口定义了一组方法,可以根据指定的消息代码(message code)和可选的参数获取相应的本地化文本消息。这些消息通常存储在配置文件中,通过配置管理器(如 ApplicationContext)加载并提供给应用程序使用。

在 Spring 应用中,通常会将不同语言版本的文本消息存储在不同的 properties 文件中,然后通过 MessageSource 接口来动态加载并根据当前用户的语言环境提供相应的文本信息,从而实现国际化功能。

第一步 配置文件

package com.xx.init.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;import java.util.Locale;/*** User:Json* Date: 2024/4/20**/
@Configuration
public class LocaleConfig {//这里的配置文件 也可以写在 application.yml 中@Beanpublic ResourceBundleMessageSource messageSource() {Locale.setDefault(Locale.CHINA);ResourceBundleMessageSource source = new ResourceBundleMessageSource();//设置国际化文件存储路径和名称// i18n目录,messages文件名//Spring Boot 会根据不同的语言环境自动加载对应的资源文件,// 例如 messages_zh_CN.properties 或 messages_en_US.propertiessource.setBasenames("i18n/messages");//设置根据key如果没有获取到对应的文本信息,则返回key作为信息source.setUseCodeAsDefaultMessage(true);//设置字符编码source.setDefaultEncoding("UTF-8");return source;}}

一般项目 都会装这个插件 不解释了

 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

创建中英文配置文件之前 看一下编辑器有没有 设置UTF-8 防止乱码
在这里插入图片描述

创建 这个后缀的文件 .properties
在这里插入图片描述
中英文:
messages_zh_CN.properties 或 messages_en_US.properties
在这里插入图片描述

最后样子

在这里插入图片描述

第二步创建 枚举类 定义 项目使用了哪些语言

package com.xx.init.language;import lombok.AllArgsConstructor;
import lombok.Getter;/*** User:Json* Date: 2024/4/20**/
@Getter
@AllArgsConstructor
public enum LanguageEnum {ZH_CN("zh_CN", "中文/中国"),EN("en_US", "英语/美国"),;/*** 格式 是 语言_国家 缩写* 更多国家 java.util.Locale; 可以查看这个类里的*/private String name;/*** 描述*/private String desc;
}

第三步 编写工具类

package com.xx.init.utils;import cn.hutool.extra.spring.SpringUtil;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.context.MessageSource;
import org.springframework.util.StringUtils;import java.util.Locale;/*** User:Json* Date: 2024/4/20**/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class LanguageUtil {/*** 根据key信息获取对应语言的内容** @param key      消息key值* @param language 语言_国家* @return*/public static String get(String key, String language) {if (!StringUtils.isEmpty(language)) {String[] arrs = language.split("_");if (arrs.length == 2) {return get(key, new Locale(arrs[0], arrs[1]));}}//使用默认的国际化语言return get(key, Locale.getDefault());}/*** 根据key信息获取对应语言的内容** @param key      消息key值* @param params   需要替换到占位符中的参数 占位符下标重0开始  格式如: {0} {1}* @param language 语言_国家* @return*/public static String get(String key, Object[] params, String language) {if (!StringUtils.isEmpty(language)) {String arrs[] = language.split("_");if (arrs.length == 2) {return get(key, params, new Locale(arrs[0], arrs[1]));}}return get(key, params, Locale.getDefault());}private static String get(String key, Locale language) {return get(key, new String[0], language);}private static String get(String key, Object[] params, Locale language) {return getInstance().getMessage(key, params, language);}private static MessageSource getInstance() {return Lazy.messageSource;}/*** 使用懒加载方式实例化messageSource国际化工具*/private static class Lazy {private static final MessageSource messageSource = SpringUtil.getBean(MessageSource.class);}}

第四步 编写测试配文文件
在中英文配置文件中 写两句 话 {0} 占位符 不需要就不写
在这里插入图片描述
在这里插入图片描述
第五步 拦截器获取前端 语言类型 这个大家哪获得都行
LanguageType.setLanguage 我定义的存储方式
// 用的是 ThreadLocal 用完 别忘了 释放
//如果ThreadLocal存放的数据不释放,当用户量大的时候会导致系统出现OOM问题

   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {LanguageType.setLanguage(StringUtils.isEmpty(request.getHeader("language")) ? LanguageEnum.ZH_CN.getName() : request.getHeader("language"));}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {//会话结束移除线程缓存LanguageType.removeLanguage();}

第六步 :ThreadLocal 存储前端发来的 语言类型

package com.xx.init.language;/*** User:Json* Date: 2024/4/20**/
public class  LanguageType{private static ThreadLocal<String> language = new ThreadLocal<String>();public static void setLanguage(String  lang) {language.set(lang);}public static String getLanguage() {return language.get();}public static void removeLanguage() {language.remove();}}

测试控制器

   @GetMapping("index15")@ApiOperation(value = "中文/英文测试")@PassTokenpublic R index15(){String s = LanguageUtil.get("test",new Object[]{"JAVA"}, LanguageType.getLanguage());return R.success(s);}// LanguageType.getLanguage()  这个方法 我是从 拦截器 请求头里 获取 前端传入的语言类型 
//  比如前端传个  zh_CN  就是 中文  en_US 就是英文 // 建议前端传的这个 和 LanguageEnum 枚举类里定义的 一样// test  就是对应配置文件的 key 

结果输出
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Java程序的生命周期

ava程序的生命周期指的是程序从编写到结束的整个过程&#xff0c;可以分为以下几个阶段&#xff1a; 编写阶段&#xff1a;程序员使用Java语言编写程序&#xff0c;包括编写源代码、编译、调试等工作。 编译阶段&#xff1a;编译是将Java源代码转换成Java字节码的过程。Java源…

大模型入门指南

随着 ChatGPT 的到来&#xff0c;大模型[1]&#xff08;Large Language Model&#xff0c;简称 LLM&#xff09;成了新时代的 buzzword&#xff0c;各种 GPT 产品百花齐放。 大多数人直接用现有产品就可以了&#xff0c;但对于喜欢刨根问底的程序员来说&#xff0c;能够在本地…

华为机考入门python3--(18)牛客18- 识别有效的IP地址和掩码并进行分类统计

分类&#xff1a;字符串 知识点&#xff1a; 字符串是否由数字组成 my_str.isdigit() 字符串填充 不足8位左侧填充0 my_str.zfill(8) 题目来自【牛客】 import sys def classify_ip(ip_mask): ip_class, is_private_ip, mask_class ignore_ip, 0, valid_mask# 解…

SQL注入漏洞代码分析

1.代码分析 HTML代码 <form action"#" method"GET"><input type"text" name"id"><input type"submit" name"Submit" value"Submit"> </form>action“#”&#xff0c;将数据提…

Hbase java API与过滤器

一、Hbase java API&#xff1a; 1、创建一张表 2、删除一张表 3、向一张表中添加一条数据 4、向一张表中同时添加一批数据 5、获取一条数据 6、获取一批数据 7、创建预分region表 代码实现&#xff1a; import org.apache.hadoop.conf.Configuration; import org.apa…

Spring boot + MyBatis-Plus3

学习 增删改查 在 service 层直接调用。 insert(user) 增selectById(1) 根据id查updateById(user) 更新selectByMap(map) 根据条件查selectBatchIds(list) 根据多个id查selectPage(page, null) 分页查deleteById(1) 删除id为1的用户deleteByMap(map) 删除符合条件的用户d…

【C++】日期计算机

个人主页&#xff1a;救赎小恶魔 欢迎大家来到小恶魔频道 好久不见&#xff0c;甚是想念 今天我们要讲述的是一个日期类计算机的代码实现 引言&#xff1a; 我们日常生活中可能会有一个烦恼。 今天几月几号&#xff1f;过n天后又是几月几号&#xff1f;某年某月某天和x年…

MySQL你想知道序列当前生成的值,你可以使用SHOW TABLE STATUS命令或者查询information_schema数据库

在MySQL中&#xff0c;如果你想知道序列当前生成的值&#xff08;例如&#xff0c;自增主键的当前值&#xff09;&#xff0c;你可以使用SHOW TABLE STATUS命令或者查询information_schema数据库。 使用SHOW TABLE STATUS命令&#xff1a; 这个命令可以显示关于表的各种信息&…

比特币中的符文是什么?

比特币中的符文是什么&#xff1f; 比特币符文是存在于比特币区块链上的独特的、可替代的代币。它们旨在代表具有独特特征和元数据的可替代资产。 Ordinals 协议的创建者 Casey Rodamor 最近放弃了一项替代 BRC-20 可替代代币协议的提案&#xff0c;该替代方案被称为 Runes。 破…

【k8s】Kubernetes 1.29.4离线安装部署(总)

&#xff08;一&#xff09;kubernetes1.29.4离线部署之-安装文件准备 &#xff08;二&#xff09;kubernetes1.29.4离线部署之-镜像文件准备 &#xff08;三&#xff09;kubernetes1.29.4离线部署之-环境初始化 &#xff08;四&#xff09;kubernetes1.29.4离线部署之-组件安装…

掌握Linux Shell脚本函数:提高脚本效率与可维护性

目录标题 1、什么是Shell函数&#xff1f;2、如何定义Shell函数&#xff1f;3、Shell函数参数4、返回值5、实例&#xff1a;使用函数进行文件备份6、为什么使用函数&#xff1f;7、最佳实践 在编写Linux shell脚本时&#xff0c;函数是组织和重用代码的重要手段。本文将介绍如何…

Python实现定时任务的八种方式

在实际的软件开发过程中,经常需要执行定时任务,比如定时备份数据、定时发送邮件、定时清理缓存等。Python作为一种功能强大的编程语言,提供了多种方式来实现定时任务。本文将介绍Python实现定时任务的八种常用方法,并提供相应的代码示例。 1. 使用​​time.sleep()​​函数…

rt1052 模拟hard fault

uint32_t u32Addr ((uint32_t)0x5FFFFFFF); //定义一个单片机不存在的地址 uint32_t u32StackTop *((__IO uint32_t *)u32Addr); //读取这个不存在的地址 //会进入 void HardFault_Handler(void) 中断

现货白银价格走势分析别走弯路!

参与现货白银投资离不开对其价格走势的分析&#xff0c;虽然相关的分析方法有很多种&#xff0c;但说到直观高效的方法&#xff0c;技术分析就是很多专业投资者所钟爱的选择。投资者可以通过平台交易软件所自带的技术指标和画线工具&#xff0c;来辅助自己的分析&#xff0c;实…

移动端js事件、zeptojs、swiper、bootstrap、正则表达式、前端性能优化

移动端场景下的js事件&#xff0c;制作移动端特效常用的js库&#xff0c;介绍移动端常用开发框架Bootstrap 一、移动端js事件 移动端的操作方式和PC端是不同的&#xff0c;移动端主要用手指操作&#xff0c;所以有特殊的touch事件&#xff0c;touch事件包括如下几个事件&…

前缀和 求数列的子序列的K倍区间

(直接截图比复制文字要好多了) 不会做的时候我去看了之前做的关于这道题目的笔记&#xff0c; &#xff08;Ak 1&#xff09;% k 1 &#xff08;Ak 1 Ak&#xff09;% k 1 只要发现了同余数的情况就说明有一个区间满足了题目的要求。 这个方法的精妙之处就在于前缀和包括了…

嵌入式Linux driver开发实操(二十一):linux device driver basic设备驱动程序基础

linux的架构框图: 内核空间是内核(即操作系统的核心)执行(即运行)并提供其服务的地方。 用户空间是执行用户应用程序的地方。 内核模块是可以根据需要加载和卸载到内核中的代码片段。它们扩展了内核的功能,而无需重新启动系统。自定义代码可以通过两种方法添加到Linux内…

C++ —— 继承

什么是继承&#xff1f; 继承是指一种代码可以被复用的机制&#xff0c;在一个类的基础上进行扩展&#xff0c;产生的新类叫做派生类&#xff0c;被继承的类叫基类。&#xff08;也可称为子类和父类&#xff09; 继承的写法&#xff1a; class B : 继承方式 A (…

Java高级阶段面试题库(Redis数据库、MQ消息队列、kafka、SpringBoot + SpringCloud、MySQL、JVMJUC、其它)

文章目录 1. Redis数据库篇(忽略)1.1 简单介绍一下redis1.2 单线程的redis为什么读写速度快?1.3 redis为什么是单线程的?1.4 redis服务器的的内存是多大?1.5 为什么Redis的操作是原子性的&#xff0c;怎么保证原子性的&#xff1f;1.6 你还用过其他的缓存吗&#xff1f;这些…

学习Django

1.python安装是会有几个主要目录&#xff1a; 2.如果某个路径加入了环境变量&#xff0c;那么在命令行直接输入他下面的文件就能找到&#xff0c;不用输入完整路径 2.过程 &#xff08;1&#xff09;安装 &#xff08;2&#xff09;建项目 在终端&#xff1a; &#xff08;…