当前位置: 首页 > article >正文

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.kler.cn/news/359855.html

相关文章:

  • Lambda架构保持批处理和实时处理之间的数据一致性
  • Vite:功能
  • 基于webpack的react多页面项目框架
  • PHP echo、print_r、print、var_dump之间的区别
  • Qt 窗口悬停事件和鼠标跟踪
  • 云电脑使用教程标准版
  • 基于Java微信小程序的水果销售系统详细设计和实现(源码+lw+部署文档+讲解等)
  • 《汇编语言》笔记一 寄存器
  • 软件I2C的代码
  • PROFIENT开发和Ethernet IP开发—嵌入式板卡:赋予通讯设备之间的神奇力量
  • 机器学习与深度学习1:神经网络概念
  • 高级java每日一道面试题-2024年10月19日-消息队列[RabbitMQ]-RabbitMQ中积压了大量的消息,如何处理?
  • 相同的树算法
  • 手机ip地址怎么切换城市
  • Zookeeper 快速入门到实战
  • VAS1802奇力线性芯片LED驱动芯片车规认证AEC-Q100
  • 深度学习-模型部署
  • python 爬虫 入门 四、线程,进程,协程
  • Go 切片详解
  • 智能安全配电装置在老旧建筑防火中的应用