SpringBoot项目如何国际化操作,让你可以随意切换语言

1.前言

最近接触的项目需要中文/英文或者其他国家语言的切换,在后台的时候有一个选择,你可以选择中文还是英文,或者其他语言,选择完毕界面语言就都变了,咱不知道前端怎么操作的,但是后台在处理提示语的时候也要对应改变为不同的语言,这怎么办呢?

别担心,Spring和java都有相关国际化的操作,只要按照相应的规则去使用就可以了。

2.定义配置文件

首先我们要定义双语环境,如果有多个语言就建立多个语言的配置文件,如下图片

我定义了两个语言配置文件,一个是英语国家美国的,一个是中华国家是中国的配置文件。

那我们在resources下添加一个i18n目录,这个i18n就是internationalization,国际化英文去掉前面i和后面n是18个字母,所以i18n,代表国际化。

然后在i18n目录下添加bundle的文件

文件名类似如下,文件名字en代表英文,这个位置也就是语言文化代码,US代表国家,这个位置就代表国家地区。中文就是zh_CN。

 

messages_en_US.properties 里放的是英语,假如我放的是这个提示语,我们需要定义对应的key,然后值就是对应的提示输出,这里的目的方便后面设置的时候找key,对应不同的输出(因为有很多提示语要用哪个需要指定)。

USER_NAME_ISNOT_NULL=User name cannot be empty

messages_zh_CN.properties里放的是中文,那就放对应的中文

USER_NAME_ISNOT_NULL=User name cannot be empty

 3.代码说明

然后就需要语言的配置,通过bean注入,默认设置中文

@Configuration
public class LocaleConfig {
    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver slr = new SessionLocaleResolver();
        // 汉语
        final Locale locale = new Locale("zh","CN");
        slr.setDefaultLocale(locale);
        return slr;
    }
}

然后定义一个Controller,模拟前端访问接口时返回对应不同语言的提示,

定义了一个test/i18n的接口,让用户在header里传递language参数,en代表英语,zh代表汉语,然后正常是请求接口时进行拦截,拦截后去设置语言,如代码:localeResolver.setLocale,但是咱们是模拟吗,就都写在Controller这个方法了。

这里就判断对应不同的语言类型,直接设置语言类型就可以啦。

@RestController
public class i18nTestController {

    @Autowired
    private LocaleResolver localeResolver;

    @GetMapping("/test/i18n")
    public I18nResponse TestI18n(HttpServletRequest request, HttpServletResponse response,
                                 @RequestHeader(value = "language",required = false) String language) {

        // 假如这是一个拦截器,拿到了语言就可以设置使用哪种语言
        Locale locale = null;

        // 根据传入值的不同设置不同的语言
        if (language!=null&&language.equals("en")) locale = new Locale("en", "US");
        if (language!=null&& language.equals("zh")) locale = new Locale("zh", "CN");
        if (locale!=null)localeResolver.setLocale(request, response, locale);

        // 这里是就是执行完逻辑给前端的提示
        return new I18nResponse("0001", I18nEnum.USER_NAME_ISNOT_NULL);
    }
}

返回提示类,在用户调用返回类时,直接通过ResourceBundle.getBundle获取对应不同语言环境并取到对应语言值。

public class I18nResponse{
    private String code;
    private String msg;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public I18nResponse(String code, I18nEnum i18nEnum) {
        this.code = code;
        // 拿到配置文件设置语言
        final ResourceBundle bundle = ResourceBundle.getBundle("i18n/messages", LocaleContextHolder.getLocale());
        // 根据key值获取对应语言的数据
        this.msg = bundle.getString(i18nEnum.name());
    }
}

枚举值,这里枚举名称要对应配置文件里的key,其实你也可以不用枚举,也可以用字符串传递,只不过规范来说还是单独定义一个枚举更好,改动的时候也方便查找。

public enum I18nEnum {

    USER_NAME_ISNOT_NULL;
}

4.测试

然后就可以测试了,在选择英文的时候,返回提示是英文。

切换中文情况下

 

什么都不选,默认的是中文

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt/C++推流组件使用说明

2.1 网络推流 公众号:Qt实战,各种开源作品、经验整理、项目实战技巧,专注Qt/C软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发。 公众号:Qt入门和进阶,专门介绍Qt/C相关知识点学…

ppt从零基础到高手【办公】

第一章:文字排版篇01演示文稿内容基密02文字操作规范03文字排版处理04复习&作业解析第二章:图形图片图表篇05图形化表达06图片艺术化07轻松玩转图表08高效工具&母版统一管理09复习&作业解析10轻松一刻-文字图形小技巧速学第三章:…

[dvwa] xss dom

xss dom 0x01 low <script>alert(document.cookie)</script>弹个窗 script被写入html 0x02 medium 过滤<script 考虑使用img标签&#xff0c;其onerror属性在该元素加载src错误时触发 注入元素被写入value&#xff0c;就在value闭合option 和 select标签…

DP:子数组模型

一、最大子数组和 . - 力扣&#xff08;LeetCode&#xff09; 二、环形子数组的最大和 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int maxSubarraySumCircular(vector<int>& nums) {//动态规划思想解决 //环形数组问题&#xff0c;尝试转…

SpringBoot之SpringBoot整合MyBatis

本章详情 使用SpringBoot和MyBatis通过注解的方式操作数据库使用SpringBoot和MyBatis通过XML配置文件的方式操作数据库 项目搭建 1. 打开idea,选择Create New Project 2.选择Spring Initializer,然后点击Next 3.填写组织&#xff0c;坐标等信息&#xff0c;然后点击Next 4.选…

Qt | QObject 类中的成员函数存取属性值与动态属性、用反射机制获取属性的信息

1、注册自定义类型与 QMetaType 类 ①、QMetaType 类用于管理元对象系统中命名的类型,该类用于帮助 QVariant 中的类型以及队列中信号和槽的连接。它将类型名称与类型关联,以便在运行时动态创建和销毁该名称。 ②、QMetaType::Type 枚举类型定义了 QMetaType 支持的类型。其…

婴儿专用洗衣机有必要吗?精选4款品质婴儿洗衣机疯狂安利!

宝宝衣服的清洗对父母来说都很重要&#xff0c;所以挑选一款适合宝宝的小型洗衣机显得尤为重要。也许有许多人认为&#xff0c;为婴儿购买独立的洗衣机是不必要的&#xff0c;但是你是否了解呢&#xff1f;新生婴儿的肌肤要比成人更脆弱&#xff0c;更易受到感染而受到伤害&…

无人零售革新购物体验

无人零售革新购物体验 在智能化技术不断进步的今天&#xff0c;无人零售作为一种整合了尖端科技的新型零售方式&#xff0c;正在快速转变我们的消费体验。这种零售模式&#xff0c;凭借其高效与便捷性&#xff0c;不仅极大地丰富了消费者的购物方式&#xff0c;同时也为零售行…

xss.pwnfunction-Ah That‘s Hawt

<svg/onloadalert%26%2340%3B1%26%2341%3B> <svg/>是一个自闭合形式 &#xff0c;当页面或元素加载完成时&#xff0c;onload 事件会被触发&#xff0c;从而可以执行相应的 JavaScript 函数

flask 访问404

当你的项目有自己的蓝图&#xff0c;有添加自己的前缀&#xff0c;也注册了蓝图。 在访问的路由那里也使用了自己的蓝图&#xff0c;如下图 然后你访问的地址也没问题&#xff0c;但是不管怎么样访问就是返回404&#xff0c;这个时候不要怀疑你上面的哪里配置错误&#xff0c;…

JVM规范中的运行时数据区

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

[网鼎杯 2020 玄武组]SSRFMe-反弹shell

[网鼎杯 2020 玄武组]SSRFMe 因为用常规方法一直写不出来&#xff0c;所以就换了一种 反弹shell 参考文章 很经典的一道CTF-WriteUP[网鼎杯 2020 玄武组]SSRFMe - FreeBuf网络安全行业门户

大厂Java笔试题之判断字母大小写

/*** 题目&#xff1a;如果一个由字母组成的字符串&#xff0c;首字母是大写&#xff0c;那么就统计该字符串中大写字母的数量&#xff0c;并输出该字符串中所有的大写字母。否则&#xff0c;就输出* 该字符串不是首字母大写*/ public class Demo2 {public static void main(St…

[dvwa] sql injection

sql injection 0x01 low sql语句没有过滤 经典注入&#xff0c;通过逻辑or为真相当于select * from users where true&#xff0c;99换成1也成 用union select 对齐列数&#xff0c;查看数据库信息 1’ union select 1,2# order by探测对齐列数更方便 1’ or 11 order b…

盛最多水的容器(双指针)

11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 …

爱因斯坦求和约定 含代码

目录 一、简介 1.自由标 2.哑标 二、torch实现 1.计算迹 2.取矩阵对角线 3.计算外积 4.batch矩阵乘法 5.带有子列表和省略号 6.变换维度 7.双线性变换&#xff0c;类似于torch.nn.functional.bilinear 一、简介 爱因斯坦求和约定(Einstein summation convention)是一…

Execute-Assembly(1)

原理 在《Cobalt Strike 原理分析》一文中&#xff0c;介绍了内存加载程序集(Assembly)的主要有四步&#xff1a; 1 加载CLR环境 2 获取程序域 3 装载程序集 4 执行程序集 在odzhan的Shellcode: Loading .NET Assemblies From Memory所描述的那样&#xff0c;.Net Framework随着…

MySQL 嵌套查询

嵌套查询 是指在一个完整的查询语句之中&#xff0c;包含若干个不同功能的小查询&#xff1b;从而一起完成复杂查询的一种编写形式。包含的查询放在&#xff08;&#xff09;里 &#xff0c; 包含的查询出现的位置&#xff1a; 位置含义SELECT之后把查询结果作为表头使用FROM…

【InternLM】茴香豆:搭建你的RAG智能助理

茴香豆是 InternLM开源的基于 LLM的群聊知识助手&#xff0c;其提供了一整套前后端 web、android、算法源码&#xff0c;支持工业级商用。其最低运行运行成本低至 1.5G 显存&#xff0c;无需训练适用各行业。 1. 技术报告 参照技术报告HuixiangDou: Overcoming Group Chat Sc…

【DM8】外部表

外部表是指不存在于数据库中的表。 通过向达梦数据库定义描述外部表的元数据&#xff0c;可以把一个操作系统文件当成一个只读的数据库表&#xff0c;对外部表将像普通定义的表一样访问。 外部表的数据存储在操作系统文件中&#xff0c;建立外部表的时候&#xff0c;不会产生…