03 springboot-国际化

Spring Boot 提供了很好的国际化支持,可以轻松地实现中英文国际化。

项目创建,及其springboot系列相关知识点详见:springboot系列


springboot系列,最近持续更新中,如需要请关注

如果你觉得我分享的内容或者我的努力对你有帮助,或者你只是想表达对我的支持和鼓励,请考虑给我点赞、评论、收藏。您的鼓励是我前进的动力,让我感到非常感激。

文章目录

  • 1 创建properties国际化文件
  • 2 创建异常码(和国际化文件有关联关系)
  • 3 使用
  • 4 测试效果

1 创建properties国际化文件

在 src/main/resources 目录下创建多个属性文件(.properties),每个文件对应一种语言

messages_en_US.properties

# 系统状态码 ============================================================================================================
error.20000=The request is successful.
error.40000=Param error!
error.50000=System error!

messages_zh_CN.properties

# 系统状态码 ============================================================================================================
error.20000=请求成功.
error.40000=参数错误!
error.50000=系统异常!

**注:**demo截图
请添加图片描述

2 创建异常码(和国际化文件有关联关系)

GlobalError

/*** 系统异常码枚举** @author w30009430* @since 2023 -09-05 12:03*/
public enum GlobalError {// 系统状态码 ====================================================================================================/*** Success ai model error.*/SUCCESS(20000),/*** Param error ai model error.*/PARAM_ERROR(40000),/*** Exception ai model error.*/EXCEPTION(50000);/*** The Code.*/int code;GlobalError(int code) {this.code = code;}/*** Gets code.** @return the code*/public int getCode() {return code;}/*** Gets message.** @return the message*/public String getMessage() {return I18nUtils.getMsgByErrorCode(code);}/*** Gets message with params.** @param supplementMsg the supplement msg* @return the message with params*/public String getMessageWithParams(String supplementMsg) {return I18nUtils.getI18nErrorMsg(code, supplementMsg, CookieUtil.getLanguage());}/*** Gets message en with params.** @param supplementMsg the supplement msg* @return the message en with params*/public String getMessageEnWithParams(String supplementMsg) {return I18nUtils.getI18nErrorMsg(code, supplementMsg, Constants.Other.EN);}/*** Gets message cn with params.** @param supplementMsg the supplement msg* @return the message cn with params*/public String getMessageCnWithParams(String supplementMsg) {return I18nUtils.getI18nErrorMsg(code, supplementMsg, Constants.Other.ZH);}
}

CookieUtil

import org.apache.commons.lang3.StringUtils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import java.net.HttpCookie;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;public class CookieUtil {private static final String ZH = "zh";private static final String EN = "en";private static final String CN = "cn";private static final String US = "us";private static final String ZH_CN = "zh_cn";private static final String LANG = "lang_key";public CookieUtil() {}public static String getLanguage() {return decideLocaleInfoFromCookie("en", "zh");}public static String getCountry() {return decideLocaleInfoFromCookie("us", "cn");}private static String decideLocaleInfoFromCookie(String defaultEnValue, String cnValue) {HttpServletRequest request = getRequest();Cookie[] cookies = null;if (request != null) {cookies = getCookies(request);}if (cookies != null) {Cookie[] var4 = cookies;int var5 = cookies.length;for (int var6 = 0; var6 < var5; ++var6) {Cookie cookie = var4[var6];if ("lang_key".equals(cookie.getName()) && "zh_cn".equals(cookie.getValue())) {return cnValue;}}}return defaultEnValue;}public static Cookie[] getCookies(HttpServletRequest request) {Cookie[] cookies = null;if (request.getCookies() != null) {cookies = request.getCookies();} else {String cookieStr = request.getHeader("cookie");if (StringUtils.isNotBlank(cookieStr)) {cookies = (Cookie[]) HttpCookie.parse(cookieStr).stream().map((httpCookie) -> {return new Cookie(httpCookie.getName(), httpCookie.getValue());}).toArray((x$0) -> {return new Cookie[x$0];});}}return cookies;}public static String getCountryByLanguage(String language) {String country = "us";if ("zh".equals(language)) {country = "cn";}return country;}public static HttpServletRequest getRequest() {HttpServletRequest request = null;RequestAttributes attributes = RequestContextHolder.getRequestAttributes();if (attributes != null && attributes instanceof ServletRequestAttributes) {request = ((ServletRequestAttributes) attributes).getRequest();}return request;}
}

I18nUtils

import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;/*** 功能描述** @author w30009430* @since 2023 -09-05 12:03*/
@Slf4j
public class I18nUtils {/*** Gets i 18 n error msg.** @param code          the code* @param supplementMsg the supplement msg* @param language      the language* @return the i 18 n error msg*/public static String getI18nErrorMsg(int code, String supplementMsg, String language) {String key = "error." + code;String message = getMsgByLanguage(key, language);if (StringUtils.isNotEmpty(message)) {message = message + " " + supplementMsg;}return message;}private static String getMsgByLanguage(String key, String language) {String country = getCountryByLanguage(language);ResourceBundle bundle = null;String value = null;ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();return getMsg(key, language, country, value, contextClassLoader);}private static String getMsg(String key, String language, String country, String value, ClassLoader contextClassLoader) {ResourceBundle bundle;try {if (contextClassLoader != null) {bundle = ResourceBundle.getBundle("i18/messages", new Locale(language, country), contextClassLoader);} else {bundle = ResourceBundle.getBundle("i18/message", new Locale(language, country));}if (bundle != null) {value = bundle.getString(key);}} catch (MissingResourceException var8) {log.error("missing resource error !");}return value;}private static String getCountryByLanguage(String language) {String country = "us";if ("zh".equals(language)) {country = "cn";}return country;}public static String getMsgByErrorCode(int code) {ClassLoader classLoader = null;if (code > 10000) {classLoader = Thread.currentThread().getContextClassLoader();}String key = "error." + code;String language = CookieUtil.getLanguage();String country = CookieUtil.getCountry();String value = null;return getMsg(key, language, country, value, classLoader);}
}

3 使用

DemoController

@Api(tags = {"Swagger2测试-demo测试类"})
@RestController
@RequestMapping("/demo")
public class DemoController {@ApiOperation(value = "Hello测试", notes = "无参数测试")@GetMapping("/hello")public RespResult hello() {return RespResult.resultOK("OK");}
}

RespResult

@Data
public class RespResult {/*** The Code.*/int code = RespCodeEnum.SUCCESS.getCode();/*** The Data.*/Object data;/*** The Msg.*/String msg;/*** 处理请求响应正常时方法** @param data 返回的数据* @return RespResult 数据*/public static RespResult resultOK(Object data) {RespResult respResult = new RespResult();respResult.data = data == null ? new HashMap<>() : data;respResult.msg = GlobalError.SUCCESS.getMessage();return respResult;}/*** 处理请求异常时方法** @param code 状态码* @param msg  异常信息* @param data 数据* @return RespResult data*/public static RespResult resultFail(int code, String msg, Object data) {RespResult respResult = new RespResult();respResult.code = code;respResult.msg = msg;respResult.data = data;return respResult;}/*** 处理请求异常时方法** @param code 状态码* @param msg  异常信息* @return RespResult data*/public static RespResult resultFail(int code, String msg) {RespResult respResult = new RespResult();respResult.data = new HashMap<>();respResult.code = code;respResult.msg = msg;return respResult;}
}

RespCodeEnum

public enum RespCodeEnum {SUCCESS(200, "The request is successful.", "请求成功."),EXP(500, "System error! ", "系统异常!");private Integer code;private String descEn;private String descCn;RespCodeEnum(final int code, final String descEn, final String descCn) {this.code = code;this.descEn = descEn;this.descCn = descCn;}/*** <设置code值>** @return Integer 数据*/public Integer getCode() {return code;}/*** <获取导入校验枚举描述>** @return Integer 数据*/public String getDescEn() {return descEn;}/*** <获取导入校验枚举描述>** @return Integer 数据*/public String getDescCn() {return descCn;}
}

4 测试效果

中文:
在这里插入图片描述
英文-默认:
在这里插入图片描述

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

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

相关文章

2024年软件设计师中级(软考中级)详细笔记【11】知识产权基础知识(分值2~3分)

目录 前言第11章 知识产权基础知识【2-3分】11.1 标准化基础知识11.2 知识产权基础知识11.2.2 计算机软件著作权11.2.3 计算机软件的商业秘密权11.2.4 专利权概述习题 结语 前言 在备考软件设计师中级考试的过程中&#xff0c;我遇到了些许挑战&#xff0c;也收获了宝贵的经验…

基于django的个人相册日记管理系统

你是否还在为毕业设计苦思冥想&#xff0c;不知道怎么选择一个合适又实用的技术项目&#xff1f;今天给大家介绍一款功能全面的Django项目——个人相册日记管理系统&#xff0c;堪称毕业设计的完美选择&#xff01; 首先&#xff0c;这不是简单的相册或日记本&#xff0c;而是…

苍穹外卖05

redis 1. 启动redis .\redis-server.exe redis.windows.conf 2. 连接redis到客户端(这里我们使用ARDM图形化工具) 新建连接 一旦建立好后就永久直接可用(和mysql一个道理) 连接成功界面

【华为HCIP实战课程十八】OSPF的外部路由类型,网络工程师

一、外部路由类型: 上节讲的外部路由类型,无关乎COST大小,OSPF外部路由类型1优先于外部路由类型2 二、转发地址实验拓扑 我们再SW3/R5/R6三台设备运行RIP,SW3即运行RIP又运行OSPF SW3配置rip [SW3-rip-1]ver 2 [SW3-rip-1]network 10.0.0.0 AR5去掉ospf配置和AR6配置rip…

win10中mysql数据库binlog恢复

win10中mysql数据库binlog恢复 昨天有朋友江湖救急&#xff0c;说测试库里的表不小心删除更新了数据。这里也复习下binlog数据恢复&#xff0c;当然需要一定的条件&#xff1a;首先mysql开启binlog&#xff0c;然后每天需要备份对应的数据库 1 单库单表准备 在恢复数据前&am…

使用Python和Matplotlib模拟3D海浪动画

使用Python和Matplotlib模拟3D海浪动画 在计算机图形学和动画领域&#xff0c;模拟逼真的海洋表面一直是一个具有挑战性的问题。本文将介绍如何使用Python的Matplotlib库和Gerstner波浪模型&#xff0c;创建一个动态的3D海浪动画。通过叠加多个波浪&#xff0c;我们可以生成复…

vim的使用方法

常见的命令可参考&#xff1a; Linux vi/vim | 菜鸟教程​www.runoob.com/linux/linux-vim.html​编辑https://link.zhihu.com/?targethttps%3A//www.runoob.com/linux/linux-vim.html 1. vim的工作模式 vi/vim 共分为三种模式&#xff0c;命令模式、编辑输入模式和末行&am…

高薪、高含金量、高性价比的“三高”证书——PMP证书

24年感觉什么都不好做&#xff0c;经济大环境也不太好&#xff0c;工作也卷&#xff0c;裁员降薪&#xff0c;为什么有的人没有危机&#xff0c;不降反增了呢&#xff1f;古语云往往越是危机的时候&#xff0c;越是机会多的时候&#xff0c;今天分享一个高薪、高含金量、高性 如…

关于写“查看IT设备详细信息”接口的理解

这两个星期一直在做关于IT资产管理相关的内容。这个内容大概就建立三张表&#xff0c;然后对三张表进行操作。一般情况下&#xff0c;对一张表也就那么几种操作&#xff1a;增删改查&#xff0c;导入导出。这里我说了6个操作&#xff0c;那就代表要写6个接口。这6个接口就是最常…

[Linux关键词]内建命令

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

Qt 二进制文件的读写

Qt 二进制文件的读写 开发工具&#xff1a;VS2013 QT5.8.0 实例功能概述 1、新建项目“sample7_2binFile” 完成以上步骤后&#xff0c;生成以下文件&#xff1a; 2、界面设计 如何添加资源文件&#xff1a; 鼠标双击“***.qrc”文件 弹出以下界面&#xff1a; 点击 “Add F…

【AI视频抠图整合包及教程】开启视觉分割新纪元 —— Meta SAM 2

在数字化时代&#xff0c;Meta公司推出的SAM 2&#xff08;Segment Anything Model 2&#xff09;标志着图像和视频分割技术的一个新高度。SAM 2不仅继承了前代SAM模型的卓越性能&#xff0c;更在实时处理、视频分割、交互式提示等方面实现了重大突破。以下是SAM 2的全面营销文…

075_基于springboot的万里学院摄影社团管理系统

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…

502 错误码通常出现在什么场景?

服务器过载场景 高流量访问&#xff1a;当网站遇到突发的高流量情况&#xff0c;如热门产品促销活动、新闻热点事件导致网站访问量激增时&#xff0c;服务器可能会因承受过多请求而无法及时响应。例如&#xff0c;电商平台在 “双十一” 等购物节期间&#xff0c;大量用户同时…

[分享] SQL在线编辑工具(好用)

在线SQL编写工具&#xff08;无广告&#xff09; - 在线SQL编写工具 - Web SQL - SQL在线编辑格式化 - WGCLOUD

AI修图太牛了! | 换模特、换服装、换背景都如此简单!

前言 推荐一款我最近发现的AI工具&#xff0c;它就是最懂电商的千鹿AI&#xff0c;专门用来做电商产品图、场景图的&#xff0c;除此外还有AI修图、线稿上色、批量抠图等等超多图片处理工具。 本人也从事过电商行业&#xff0c;包括跨境电商&#xff0c;非常知道电商人的疾苦…

Java 多线程(七)—— 定时器

定时器介绍与使用 先简单介绍一下什么是定时器&#xff1a;定时器类似生活中的闹钟&#xff0c;当时间一到&#xff0c;我们就会去做某些事情。 在代码层面理解就是&#xff0c;当我们设置的时间一到&#xff0c;程序就会执行我们固定的代码片段&#xff08;也就是任务&#x…

谷歌新安装包文件形式 .aab 在UE4中的打包原理

摘要 本文学习了aab的基本概念以及UE4中产生aab的构建原理。 从官网了解基本概念 官网&#xff1a;Android Developers 1、什么是aab&#xff1f; .aab包形如&#xff1a; 2021年7月&#xff0c;在Google Play应用程序中&#xff0c;已经有数千个应用程序率先跟进了AAB格式。…

OpenCV视觉分析之运动分析(2)背景减除类:BackgroundSubtractorKNN的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 K-最近邻&#xff08;K-nearest neighbours, KNN&#xff09;基于的背景/前景分割算法。 该类实现了如 319中所述的 K-最近邻背景减除。如果前景…

Zypher Network Layer3 主网上线,“宝藏方舟”活动是亮点

前言 随着 Zytron Layer3 主网的上线&#xff0c;Zypher Network联合Linea共同推出了“宝藏方舟”活动&#xff0c;用户可通过参与活动&#xff0c;获得包括代币、积分、SBT等系列奖励。 Zypher Network 是一个以ZK方案为核心的游戏底层堆栈&#xff0c;其提供了一个具备主权…