03 springboot-国际化

news2024/11/25 8:15:00

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.coloradmin.cn/o/2220153.html

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

相关文章

构建高效房屋租赁平台:SpringBoot应用案例

第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各行业&#xff0c;尤其是规模较大的企业和学校等…

爱维艾夫净利润下滑权益回报率骤降,退款数量增加市占率仅1%

《港湾商业观察》施子夫 9月13日&#xff0c;爱维艾夫医院管理集团有限公司&#xff08;以下简称&#xff0c;爱维艾夫&#xff09;第二次递表港交所&#xff0c;保荐机构为中信证券。 爱维艾夫的第一次递表发生在2023年12月&#xff0c;后因递表资料失效而告终。一年不到的时…

基于SSM机场网上订票系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;机票信息管理&#xff0c;订单信息管理&#xff0c;机场广告管理&#xff0c;系统管理 前台账号功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;机票信息&#xf…

餐饮行业有什么好的供应链管理系统

在餐饮企业的供应链管理中&#xff0c;合适的供应链管理系统是至关重要的&#xff0c;它能够帮助企业提高食材采购效率、降低成本、确保食材供应的及时性和质量。然而&#xff0c;许多餐饮企业在供应链管理系统方面存在诸多问题&#xff0c;常常会面临以下困境&#xff1a; ●…

【路径跟踪控制:Bang-Bang 控制与车辆运动学模型】

【路径跟踪控制&#xff1a;Bang-Bang 控制与车辆运动学模型】 1. 引言2. 环境准备3. 车辆运动学模型3.1 理论基础3.2 Python 实现车辆运动学模型建模 4. Bang-Bang 控制策略4.1 理论基础4.1.1 误差角度计算与转向角调整4.1.2 Bang-Bang控制实现 4.2 完整代码4.3 控制策略解释 …

springboot051医院管理系统(论文+源码)_kaic

医院管理系统 摘要 随着信息互联网信息的飞速发展&#xff0c;医院也在创建着属于自己的管理系统。本文介绍了医院管理系统的开发全过程。通过分析企业对于医院管理系统的需求&#xff0c;创建了一个计算机管理医院管理系统的方案。文章介绍了医院管理系统的系统分析部分&#…

万家数科:零售业务信息化融合的探索|OceanBase案例

本文作者&#xff1a;马琳&#xff0c;万家数科数据库专家。 万家数科商业数据有限公司&#xff0c;作为华润万家旗下的信息技术企业&#xff0c;专注于零售行业&#xff0c;在为华润万家提供服务的同时&#xff0c;也积极面向市场&#xff0c;为零售商及其生态系统提供全面的核…

基于DSP+ARM+FPGA的电能质量分析仪的软件设计

软件设计是电能质量设备的核心内容&#xff0c;上述章节详细介绍了电能质量参数的 算法&#xff0c;并且通过仿真实验进行了验证&#xff0c;本章将结合现代电能质量监测设备需求实 现算法在实际电网中应用。根据设计的电能质量分析仪的需求分析&#xff0c;进行总体的 软件…

【Android】Jetpack入门知识总结(LifeCycle,ViewModel,LiveData,DataBinding等)

文章目录 LifeCycle使用Lifecycle解耦页面与组件自定义控件实现LifecycleObserver接口注册生命周期监听器 使用LifecycleService解耦Service与组件使用ProcessLifecycleOwner监听应用程序生命周期 ViewModel用法在 Fragment 中使用 ViewModel LiveDataDataBinding导入依赖基本用…

Redis 性能优化选择:Pika 的配置与使用详解

引言 在我们日常开发中 redis是我们开发业务场景中不可缺少的部分。Redis 凭借其内存存储和快速响应的特点&#xff0c;广泛应用于缓存、消息队列等各种业务场景。然而&#xff0c;随着数据量的不断增长&#xff0c;单节点的 Redis 因为内存限制和并发能力的局限&#xff0c;逐…

FP7127:降压恒流LED芯片 支持双路调色调光 PWM调光

一、降压恒流LED芯片FP7127 FP7127 是平均电流模式控制的 LED 驱动 IC&#xff0c;具有稳定输出恒流的能力&#xff0c;优秀的负载调整率与高精度的电流控制。不用额外增加外部补偿元件&#xff0c;简化 PCB 板设计。输出的LED电流精度为 2%。 如果你想进行PWM数位调光&#…

R语言机器学习教程大纲

文章目录 介绍机器学习算法监督学习Supervised Learning分类Classification回归Regression 无监督学习 Unsupervised Learning聚类 Clustering降纬 Dimensionality Reduction相关Association 强化学习Reinforcement Learning模型自由 Model-Free Methods模型驱动 Model-Based M…

Rancher—多集群Kubernetes管理平台

目录 一、Rancher 简介1.1 Rancher 和 k8s 的区别 二、Rancher 安装及配置2.1 安装 rancher2.2 登录 Rancher 平台2.3 Rancher 管理已存在的 k8s 集群2.4 创建名称空间 namespace2.5 创建 Deployment 资源2.6 创建 service2.7 Rancher 部署监控系统 一、Rancher 简介 Rancher …

curl支持ssl错误:curl: (60) SSL certificate problem: certificate is not yet valid

在测试curl命令的时候发现curl: (60) SSL certificate problem: certificate is not yet valid出现这个错误&#xff0c;已经设置了ssl证书路径&#xff0c;最终发现是板子上时间不对&#xff0c;设置时间后可以正常使用。

论文研读 | End-to-End Object Detection with Transformers

DETR&#xff1a;端到端目标检测的创新 —— 作者 Nicolas Carion 等人 一、背景与挑战 目标检测是计算机视觉领域的一个核心任务&#xff0c;要求模型精确识别图像中的物体类别和位置。传统方法如 Faster R-CNN&#xff0c;因其区域建议网络等复杂结构&#xff0c;使得模型调…

网络安全基础知识点_网络安全知识基础知识篇

文章目录 一、网络安全概述1.1 定义1.2 信息安全特性1.3 网络安全的威胁1.4 网络安全的特征 二、入侵方式2.1 黑客2.1.1 入侵方法2.1.2 系统的威胁2.2 IP欺骗与防范2.2.1 TCP等IP欺骗基础知识2.2.2 IP欺骗可行的原因2.2.3 IP欺骗过程2.2.4 IP欺骗原理2.2.5 IP欺骗防范2.3 Sniff…

数据结构编程实践20讲(Python版)—16有向图

本文目录 16 有向图(Directed Graph)S1 说明特征应用领域S2 示例S3 问题:利用有向图构建贝叶斯网络Python代码代码说明结果S4 问题:有依赖的任务调度Python代码代码说明结果S5 问题:基于有向图的搜索引擎排序算法Python代码代码说明结果往期链接 01 数组02 链表03 栈04 队…

成都睿明智科技有限公司电商服务可靠不?

在这个短视频风起云涌的时代&#xff0c;抖音不仅成为了人们娱乐消遣的首选平台&#xff0c;更是众多商家竞相追逐的电商新蓝海。成都睿明智科技有限公司&#xff0c;作为抖音电商服务领域的佼佼者&#xff0c;正以其独到的洞察力和专业的服务&#xff0c;助力无数品牌在这片沃…

使用redis存储股股票数据及近一个月的行情数据

使用redis存储股票数据及近一个月的行情数据 性能瓶颈redis的使用odoo连接redis股票数据的读写结论 性能瓶颈 股票行情对数据的实时性是有要求的&#xff0c;在数据同步时如果都从数据库中查询数据&#xff0c;对于股票行情数据来说是有些慢了&#xff0c;因此我们使用redis来…

视频网站开发:Spring Boot框架的高效实现

5 系统实现 5.1用户信息管理 管理员管理用户信息&#xff0c;可以添加&#xff0c;修改&#xff0c;删除用户信息信息。下图就是用户信息管理页面。 图5.1 用户信息管理页面 5.2 视频分享管理 管理员管理视频分享&#xff0c;可以添加&#xff0c;修改&#xff0c;删除视频分…