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

ops/2024/10/11 13:23:17/

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

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

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

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

第一步 配置文件

java">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;}}

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

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

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

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

最后样子

在这里插入图片描述

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

java">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;
}

第三步 编写工具类

java">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问题

java">   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 存储前端发来的 语言类型

java">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();}}

测试控制器

java">   @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.ppmy.cn/ops/14274.html

相关文章

智能驾驶+网络安全

在智能驾驶场景下&#xff0c;安全问题一直是一个持续热点。 针对车机模块不被黑客利用Linux的漏洞攻击&#xff0c;可以采取以下几种方式来提高安全性&#xff1a; 安全设计和防护&#xff1a;在设计车机模块时&#xff0c;需要考虑安全性&#xff0c;并采取相应的安全防护措施…

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务&#xff08;Spring MVC Springboot&#xff09;同时允许跨域 Tomcat 配置允许跨域Web 项目配置允许跨域Tomcat 同时允许静态文件和 Web 服务跨域 偶尔遇到一个 Tomcat 部署项目跨域问题&#xff0c;因为已经处理过…

基于vscode的c++开发(Windows)

文章目录 开发环境搭建项目文件夹GCC编译器编译过程g的重要编译参数 CMake语法特性重要指令CMake编译工程 参考链接 开发环境搭建 安装VScode和GCC编译器。 项目文件夹 一般一个项目中应该包含 include文件夹——用于保存头文件 src文件夹——用于保存源文件 GCC编译器 GC…

SpringBoot钩子函数

在Java Spring Boot中&#xff0c;并没有直接称为“钩子函数”的概念&#xff0c;但你可以通过实现特定的接口、注解、事件监听或使用AOP&#xff08;面向切面编程&#xff09;来实现类似的功能。这些功能允许你在应用的特定点插入自定义逻辑&#xff0c;类似于钩子函数的作用。…

CTFshow-PWN-栈溢出(pwn44)

64位的 system(); 但是好像没"/bin/sh" 上面的办法不行了&#xff0c;想想办法 检查&#xff1a; 是 64 位程序 ida 反编译 main 函数&#xff1a; 跟进 ctfshow 函数&#xff1a; 存在栈溢出 offset&#xff1a;0xAh8 在前面经验的基础上&#xff0c;这里我们直…

DataGrip操作Oracle

一、创建表空间 表名任意起&#xff0c;路径自己指定 -- 创建表空间 create tablespace mydb1 -- 表名 datafile E:\Code\sql\oracle\oracle_tablespace\mydb1.dbf --指定表空间路径 size 100M --指定表空间大小 autoextend on next 50M --指定一次扩充多少mb extent managemen…

css盒子设置圆角边框的方法

前言 欢迎来到我的博客 个人主页&#xff1a;北岭敲键盘的荒漠猫-CSDN博客 本文为我整理的设置圆角边框的方法 需求描述 我们在设置盒子边框时&#xff0c;他总是方方正正的。 我们想让这个直直的边框委婉一点该怎么办呢。这个就提到了我们这篇文章讲的东西&#xff1a; bord…

【设计模式】8、adapter 适配器模式

文章目录 八、adapter 适配器模式8.1 convert_lightning_to_usb8.1.1 client_test.go8.1.2 client.go8.1.3 computer.go8.1.4 adapter.go 八、adapter 适配器模式 https://refactoringguru.cn/design-patterns/adapter 通常用于老旧系统, 或第三方系统, 提供一层适配器或插件…