Spring Boot国际化i18n配置指南
作者:mmseoamin日期:2024-04-29

Spring Boot国际化i18n配置指南

一、配置

1、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 后面的名称

Spring Boot国际化i18n配置指南,在这里插入图片描述,第1张

添加完成如下所示

Spring Boot国际化i18n配置指南,在这里插入图片描述,第2张

2.2、修改idea字符集

Spring Boot国际化i18n配置指南,在这里插入图片描述,第3张

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

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

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

3、填充参数

Messages_en_US.properties

dd.test1=hello
dd.test2=hello {0}

Messages_en_US.properties

dd.test1=你好
dd.test2=你好 {0}

Messages.properties

里面的参数可不填写

二、Code

1、国际化工具类

代码说明:

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

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

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

    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 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 层

     @GetMapping("/testMsg")
        public ResultMsg 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());
            }
        }
    

    返回参数

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

    2.3、切换语言接口

    @PostMapping("/switch")
        public ResultMsg 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());
            }
        }