Spring Boot国际化i18n配置指南

Spring Boot国际化i18n配置指南

一、配置

1、yml文件配置

yml 复制代码
spring:
  messages:
    basename: i18n/Messages,i18n/Messages_en_US,i18n/Messages_zh_CN
    encoding: UTF-8

i18n:表示国际化文件的父目录

Messages:默认国际化文件

Messages_en_US:英文文件

Messages_zh_CN:中文文件

2、idea 配置

2.1、创建i18n目录

在 resources 目录下面创建 i18n 目录,接着创建3种资源包,名称为第一步 yml 文件中 spring.messages.basename i18n 后面的名称

添加完成如下所示

2.2、修改idea字符集

勾选自动转换成 Ascii 但显示原生的内容

此步骤防止在文件中显示乱码,如下面的情况

复制代码
dd.test1=\u6D4B\u8BD5\u56FD\u9645\u5316
dd.test2=\u5E26\u53C2\u6570{0}\u6D4B{1}\u8BD5

3、填充参数

Messages_en_US.properties

properties 复制代码
dd.test1=hello
dd.test2=hello {0}

Messages_en_US.properties

properties 复制代码
dd.test1=你好
dd.test2=你好 {0}

Messages.properties

里面的参数可不填写

二、Code

1、国际化工具类

代码说明:

  • 使用单例模式反射调用,兼容工具类中语言国际化

  • LANGUAGE_CACHE:用来缓存当前环境使用语言类型,当页面下发切换语言接口时,将语言类型放入缓存中,每次调用国际化工具类时判断当前处于什么类型的语言环境中,此种方法可省略每个接口中下发 header

  • 默认语言从本地获取,项目启动后未切换语言时

java 复制代码
package com.dstz.agilebpm.util;

import org.apache.commons.lang3.StringUtils;
import org.omg.PortableInterceptor.INACTIVE;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;

/**
 * @Author: Lisy
 * @Description: 国际化工具类
 */
public class MessageUtil {

    private MessageUtil() {
    }

    private static MessageUtil INSTANCE;
    private static MessageSource messageSource;
    private static Locale LOCALE;
    public static final Map<String, Integer> LANGUAGE_CACHE = new HashMap<>(1);

    public static MessageUtil getInstance() {
        if (Objects.isNull(INSTANCE)) {
            synchronized (MessageUtil.class) {
                if (Objects.isNull(INSTANCE)) {
                    INSTANCE = new MessageUtil();
                    messageSource = ReflectUtil.getBean(MessageSource.class);
                    LOCALE = LocaleContextHolder.getLocale();
                }

            }
        }

        return INSTANCE;
    }


    /**
     * 返回默认值,不带参数
     *
     * @param code
     * @return
     */
    public String getMessage(String code) {
        return getMessage(code, "");
    }

    /**
     * 消息中插入参数
     *
     * @param code key
     * @param args 参数
     * @return 转换值
     */
    public String getMessage(String code, String... args) {
        return messageSource.getMessage(code, args, getLocale());
    }

    /**
     * 指定编码返回带参数值
     *
     * @param code   key
     * @param locale 编码
     * @param args   参数
     * @return 转换值
     */
    public String getMessage(String code, Locale locale, String... args) {
        return messageSource.getMessage(code, args, locale);
    }

    private Locale getLocale() {
        Locale local;
        Integer langType = LANGUAGE_CACHE.get("LangType");
        if (Objects.isNull(langType)) {
            local = LOCALE;
        } else {
            switch (langType) {
                case 0:
                    local = new Locale("zh", "CN");
                    break;
                case 1:
                    local = new Locale("en", "US");
                    break;
                default:
                    local = LOCALE;
            }
        }
        return local;
    }

}

2、使用示例

2.1、controller 层

java 复制代码
 @GetMapping("/testMsg")
    public ResultMsg<JSONObject> getL() {
        try {
            JSONObject result = new JSONObject();
            MessageUtil messageUtil = MessageUtil.getInstance();
            result.put("zh", messageUtil.getMessage("dd.test1", new Locale("zh", "CN")));
            result.put("en", messageUtil.getMessage("dd.test1", new Locale("en", "US")));

            result.put("zhParam", messageUtil.getMessage("dd.test2", new Locale("zh", "CN"), "老王"));
            result.put("enParam", messageUtil.getMessage("dd.test2", new Locale("en", "US"), "old wang"));
            return new ResultMsg<>(result);
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
            return new ResultMsg<>(BaseStatusCode.SYSTEM_ERROR, e.getMessage());
        }
    }

返回参数

json 复制代码
{
	"code": "200",
	"data": {
        "zh": "你好",
		"en": "hello",
		"zhParam": "你好 老王",
		"enParam": "hello old wang"
	},
	"isOk": true
}

2.3、切换语言接口

java 复制代码
@PostMapping("/switch")
    public ResultMsg<String> switchLang(@RequestParam Integer language) {
        try {
            MessageUtil.LANGUAGE_CACHE.clear();
            MessageUtil.LANGUAGE_CACHE.put("LangType", language);
            return new ResultMsg<>(BaseStatusCode.SUCCESS, "switch success");
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
            return new ResultMsg<>(BaseStatusCode.SYSTEM_ERROR, e.getMessage());
        }
    }
相关推荐
WeiXin_DZbishe2 小时前
基于springboot宠物领养系统-计算机毕设 附源码【课程设计】94217
vue.js·spring boot·python·django·php·课程设计
架构技术专栏3 小时前
Agent 工具调用:从工具声明到执行反馈
前端·人工智能·后端
vx_bisheyuange3 小时前
基于SpringBoot的体育商品推荐系统
spring boot·毕业设计
别动我齐刘海3 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
码事漫谈3 小时前
你让AI干的活,它可能只干了十分之一——而你根本看不出来
后端
Wx-bishekaifayuan4 小时前
express皖美特色农产品网售系统53118-计算机课程设计、毕业设计
人工智能·spring boot·后端·python·课程设计·express·旅游
Wx-bishekaifayuan4 小时前
springboot汉中旅游服务平台41442-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
code2cat5 小时前
Java进阶篇之AtomicLongFieldUpdater:把累计额度留在对象字段中
java·cas·并发编程
WeiXin_DZbishe5 小时前
基于springboot城市公交实时运营与调度系统-计算机毕设 附源码【课程设计】66173
java·vue.js·spring boot·后端·python·php·课程设计
泡茶喝茶写代码5 小时前
A股量化数据工程:从 REST 接口到策略信号(第 18 篇):放量缩量异动扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口