Spring Boot国际化i18n配置指南

news2025/2/4 4:58:05

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

在这里插入图片描述

添加完成如下所示

在这里插入图片描述

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

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

 @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());
        }
    }

返回参数

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

2.3、切换语言接口

@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());
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1337443.html

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

相关文章

共享和独享的区别是什么?有必要用独享IP吗?

通俗地讲&#xff0c;共享IP就像乘坐公共汽车一样&#xff0c;您可以到达目的地&#xff0c;但将与其他乘客共享旅程&#xff0c;座位很可能是没有的。独享IP就像坐出租车一样&#xff0c;您可以更快到达目的地&#xff0c;由于车上只有您一个人&#xff0c;座位是您一个人专用…

链表的详细介绍

目录 链表的简单定义&#xff1a; 链表的分类 单项带头非循环 单向不带头循环链表 实现单向非循环无头链表 定义链表&#xff1a; 实现链表方法 打印链表 头插法&#xff1a; 尾插法&#xff1a; 指定插入&#xff1a; 通过对应值删除节点&#xff1a; 删除所有对应…

Unity向Web服务器上传和下载图片

Unity向Web服务器上传和下载图片 如果本片有看不懂的请查看我上篇文章&#xff1a;[Unity与Web服务器Post&#xff0c;Get](https://blog.csdn.net/qq_42194657/article/details/103031573)一、上传和下载图片1.在Unity中创建一个RawImage并在WebManager.cs脚本中添加一个Textu…

.json文件转为.dll文件后还能读取吗?

(只是修改了后缀名而已&#xff0c;做一个伪装&#xff09; 测试&#xff1a; QFile file(QApplication::applicationDirPath() "/config.dll");qDebug()<<QApplication::applicationDirPath() "/config.dll";if (file.open(QIODevice::ReadOnly))…

css mask 案例

文章目录 一、基本用法二、图案遮罩二、文字阴影效果三、日历探照灯效果 CSS的mask属性用于定义一个可重复使用的遮罩&#xff0c;可以将其应用到任何可视元素上。这个功能类似于Photoshop中的图层蒙版。通过mask属性&#xff0c;可以创建独特的效果&#xff0c;比如圆形、渐变…

西门子博途怎么使用PID_Compact做pid调试

到目前为止&#xff0c;我已经在S7-1200中创建了一个可运行的PLC程序&#xff0c;并在Basic Panel中创建了一个HMI项目来操纵和操作该程序。 引文&#xff1a;博途工控人平时在哪里技术交流博途工控人社群 现在&#xff0c;我们该如何深入的让程序开始逐渐智能化呢&#xff0c…

少儿编程加盟培训机构管理系统源码开发方案

一、项目背景与目标 &#xff08;一&#xff09;项目背景 随着少儿编程教育的快速发展&#xff0c;加盟培训机构的数量不断增加。为了更好地管理学员信息、课程安排、教师工资等&#xff0c;需要开发一款少儿编程加盟培训机构管理系统源码。 &#xff08;二&#xff09;项目…

Nginx快速入门:实现企业安全防护|nginx部署https,ssl证书(七)

0. 引言 之前我们讲到nginx的一大核心作用就是实现企业安全防护&#xff0c;而实现安全防护的原理就是通过部署https证书&#xff0c;以此实现参数加密访问&#xff0c;从而加强企业网站的安全能力。 nginx作为各类服务的统一入口&#xff0c;只需要在入口处部署一个证书&…

12.鸿蒙HarmonyOS App(JAVA) page的隐式跳转

跳转到指定Page的指定AbilitySlice MainAbilitySlice按钮触发事件&#xff1a; btn.setClickedListener(component -> { Intent _intent new Intent(); Operation operation new Intent.OperationBuilder() .withBundleName(…

C++ std::string使用效率优化

字符串操作是任何一个C开发程序无法绕过的点&#xff0c;很多时候针对字符串的操作需要进行优化&#xff0c;从而达到更优的使用效率和内存利用率。一般会采用标准的std::string替代C字符串&#xff0c;一方面是std::string为一个成熟的类对象&#xff0c;其成员操作基本能满足…

std::string在 Windows MSVC和Linux Gcc 中capacity容量扩容策略的分析和对比

1、capacity()作用 在std::string中&#xff0c;capacity()为当前string占用内存字符的长度&#xff0c;表示当前string的容量&#xff0c;可以理解为一个预分配制度&#xff0c;如果当前的string不断进行扩展操作&#xff0c;则不需要每次都进行内存上的分配&#xff0c;提高程…

CentOS7搭建Elasticsearch与Kibana服务

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net 1.2拉取elasticsearch镜像 docker pull elasticsearch:7.11.1 1.3.运行 运行docker命令&#xff0c;部…

NLP论文阅读记录 - 以大语言模型为参考学习总结

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1文本生成模型的训练方法2.2 基于LLM的自动评估2.3 LLM 蒸馏和基于 LLM 的数据增强 三.本文方法3.1 Summarize as Large Language Models3.1.1 前提3.1.2 大型语言模型作为参考具有…

面向对象设计与分析40讲(15)简单工厂方法模式

文章目录 定义示例优缺点定义 简单工厂模式是一种创建型模式,用于根据客户端的需求创建对象实例,所谓的需求反映到编程语言里就是传入的参数。 简单工厂模式包括三个主要部分: 工厂类(Simple Factory):这是整个模式的核心。它负责根据客户端的请求来创建并返回相应的对…

罗门哈斯同级抛光树脂:单晶硅电池超纯水生产与应用

在光伏行业中&#xff0c;单晶硅电池是最高效和最可靠的太阳能电池之一。然而&#xff0c;生产单晶硅电池需要使用超纯水&#xff0c;这是许多光伏制造商所面临的一个挑战。那么&#xff0c;超纯水是如何生产的呢&#xff1f; 为什么需要超纯水&#xff1f; 超纯水是一种高纯…

vue3 setup + ts 项目模块找不到问题解决:Cannot find module ...

Vscode contrl shift p 打开vscode配置面板&#xff0c;查找typescript&#xff1b;是使用workspace version,完事儿

EternalBlue【永恒之蓝】漏洞详解(复现、演示、远程、后门、入侵、防御)内容丰富-深入剖析漏洞原理-漏洞成因-以及报错解决方法-值得收藏!

漏洞背景&#xff1a; 1.何为永恒之蓝&#xff1f; 永恒之蓝&#xff08;Eternal Blue&#xff09;爆发于2017年4月14日晚&#xff0c;是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限&#xff0c;以此来控制被入侵的计算机。甚至于2017年5月12日&#xff0c; 不法分子…

JavaScript基础练习题解析与实践

如果大家感感兴趣也可以去看&#xff1a; &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 学习…

HarmonyOS4.0系统性深入开发04UIAbility组件详解(下)

UIAbility组件间交互&#xff08;设备内&#xff09; UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时&#xff0c;会涉及到启动特定的UIAbility&#xff0c;该UIAbility可以是应用内的其他UIAbility&#xff0c;也可以是其他应用的UIAbility&#xff08;例如启…

LSTM的记忆能力实验 [HBU]

目录 模型构建 LSTM层 模型训练 多组训练 模型评价 模型在不同长度的数据集上的准确率变化图 模型汇总 总结 长短期记忆网络&#xff08;Long Short-Term Memory Network&#xff0c;LSTM&#xff09;是一种可以有效缓解长程依赖问题的循环神经网络&#xff0e;LSTM 的…