03 springboot-国际化

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

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


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

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

文章目录

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

1 创建properties国际化文件

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

messages_en_US.properties

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

messages_zh_CN.properties

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

**注:**demo截图

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

GlobalError

java 复制代码
/**
 * 系统异常码枚举
 *
 * @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

java 复制代码
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

java 复制代码
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

java 复制代码
@Api(tags = {"Swagger2测试-demo测试类"})
@RestController
@RequestMapping("/demo")
public class DemoController {

    @ApiOperation(value = "Hello测试", notes = "无参数测试")
    @GetMapping("/hello")
    public RespResult hello() {
        return RespResult.resultOK("OK");
    }
}

RespResult

java 复制代码
@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

java 复制代码
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 测试效果

中文:

英文-默认:

相关推荐
IT·小灰灰3 分钟前
Python——自动化发送邮件
运维·网络·后端·python·自动化
Algorithm15768 分钟前
JVM是什么,与Java的关系是什么,以及JVM怎么实现的跨平台性
java·开发语言·jvm
颜淡慕潇32 分钟前
【K8S系列】Kubernetes 中 Service IP 分配 问题及解决方案【已解决】
后端·云原生·容器·kubernetes
遇见你真好。1 小时前
SpringBoot整合quartz定时任务
java·springboot·quartz
一颗甜苞谷1 小时前
开源一款基于 JAVA 的仓库管理系统,支持三方物流和厂内物流,包含 PDA 和 WEB 端的源码
java·开发语言·开源
攻心的子乐1 小时前
idea使用svn
java·ide·intellij-idea
程序员大佬超1 小时前
IDEA解决 properties 文件乱码问题
java·ide·intellij-idea
秋恬意1 小时前
LinkedList 源码分析
java·开发语言·面试
恬淡虚无真气从之1 小时前
django中的类属性和类方法
后端·python·django
隔窗听雨眠1 小时前
深入理解Redis的四种模式
java·redis·mybatis