Spingboot落地国际化需求,Springboot按照请求的地区返回信息

文章目录

  • 一、国际化
    • 1、概述
    • 2、Spring国际化
  • 二、springboot简单使用国际化
    • 1、定义MessageSource
    • 2、定义message配置文件
    • 3、测试
  • 三、根据请求的地区获取信息
    • 1、定义message配置文件
    • 2、定义配置类
    • 3、基础模板工具
    • 4、消息模板定义枚举
    • 5、测试一下
    • 6、总结

一、国际化

1、概述

国际化(internationalization)是设计和制造领域适应不同区域要求的产品的一种方式。它要求从产品中抽离所有地域语言,国家/地区和文化相关的元素。换言之,应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产。开发这样的程序的过程,就称为国际化。

2、Spring国际化

Spring国际化详解,Spring国家化实例及源码详解

二、springboot简单使用国际化

1、定义MessageSource

/**
 * 国际化相关
 * @return
 */
@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("messages/message");
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}

2、定义message配置文件

在这里插入图片描述

# message_en.properties
test=meiguo
test2=meiguo{0}

# message_zh.properties
test=中国

3、测试

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    String message = applicationContext.getMessage("test", null, new Locale("zh"));
    System.out.println(message); // 中国

    String message2 = applicationContext.getMessage("test", null, new Locale("en"));
    System.out.println(message2); // meiguo

	String message3 = applicationContext.getMessage("test2", new String[]{"content"}, new Locale("en"));
    System.out.println(message3); // meiguocontent
}

我们发现,按照不同地区,根据配置文件获取到了不同的配置。

三、根据请求的地区获取信息

1、定义message配置文件

在这里插入图片描述

# message_en_US.properties
Success={0}success
Test=myTest

# message_zh_CN.properties
Success={0}成message功
Test=我的test内容

2、定义配置类

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;

@Configuration
public class I18nConfig {

    /**
     * 国际化相关
     */
    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("messages/message");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }
}

3、基础模板工具

import org.springframework.context.NoSuchMessageException;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.servlet.support.RequestContextUtils;

import javax.servlet.http.HttpServletRequest;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

public interface I18nTemplateBase {


    String defaultMessage();

    String name();


    /**
     * 解析国际化模板
     */
    default String resolve(HttpServletRequest request, Object... args) {
        // 先解析参数
        List<Object> argResolveList = new ArrayList<>();
        if (args != null) {
            for (Object arg : args) {
                if (arg instanceof I18nTemplateBase) {
                    I18nTemplateBase i18nTemplateBase = (I18nTemplateBase) arg;
                    try {
                        argResolveList.add(resolveTemplate(request, i18nTemplateBase.name()));
                    } catch (NoSuchMessageException e) {
                        argResolveList.add(i18nTemplateBase.defaultMessage());
                    }
                }
            }
        }


        // 再解析最终的
        String resolveResult;
        try {
            resolveResult = resolveTemplate(request, name(), argResolveList.toArray());
        } catch (NoSuchMessageException e) {
            // 拿不到模板用默认模板
            resolveResult = MessageFormat.format(defaultMessage(), args);
        }
        return resolveResult;

    }


    /**
     * 根据key解析国际化模板
     */
    default String resolveTemplate(HttpServletRequest request, String code, Object... args) {
        Locale locale = RequestContextUtils.getLocale(request);
        WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
        if (context != null) {
            return context.getMessage(String.valueOf(code), args, locale);
        } else {
            throw new NoSuchMessageException("WebApplicationContext not available");
        }
    }
}

4、消息模板定义枚举


/**
 * 标准国际化消息模板
 */
public enum I18nTemplate implements I18nTemplateBase {

    Success("{0}成功"),
    Error("{0}失败"),

    Data("{0}"),

    // TODO - 定义更多消息模板
    Test("测试结果"),
    ;

    private final String defaultMessage;

    I18nTemplate(String defaultMessage) {
        this.defaultMessage = defaultMessage;
    }

    public String defaultMessage() {
        return defaultMessage;
    }

}

5、测试一下

@GetMapping("/test1")
public String test1(HttpServletRequest request) {
    // 模板定制 + 参数定制
    String resolve1 = I18nTemplate.Success.resolve(request, I18nTemplate.Test);
    System.out.println(resolve1);

    // 模板定制 + 参数手输
    String resolve2 = I18nTemplate.Error.resolve(request, "手写的参数");
    System.out.println(resolve2);

    // 模板参数都手输
    String resolve3 = I18nTemplate.Data.resolve(request, "手写的参数");
    System.out.println(resolve3);
    return "success";
}
请求头:Accept-Language=en-US

结果:
myTestsuccess
手写的参数失败
手写的参数
请求头:Accept-Language=zh-CN

结果:
我的test内容成message功
手写的参数失败
手写的参数

可以实现模板消息、默认消息等。

6、总结

我们可以通过Spring的国际化,将每一个国家的语言模板都定义在配置文件中,这样就可以动态的解决数据返回的语言问题了。

真正生产环境还会将消息再进一步封装,配合httpcode码、返回的数据、请求成功状态、消息等等统一进行封装返回。此处就不进行详细分享了。

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

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

相关文章

设计模式-结构型-装饰器模式-decorator

发票基本类 public class Invoice {public void printInvoice() {System.out.println("打印发票正文");} } 发票正文类 public class Decorator extends Invoice {protected Invoice ticket;public Decorator(Invoice ticket) {this.ticket ticket;}Overridepubl…

Java配置自定义校验

1、自定义注解State message、groups、payload package com.zhang.anno;import com.zhang.validartion.StateValidation; import jakarta.validation.Constraint; import jakarta.validation.Payload;import java.lang.annotation.*;import static java.lang.annotation.Eleme…

javaScript中原型链

一、原型链 js 的对象分为普通对象和函数对象。每个对象都有__proto__ 但是只有函数对象 (非箭头函数) 才有 prototype 属性。 new的过程&#xff1a; 1、创建一个空的简单 javaScript对象 2、将空对象的 __proto__连接到该函数的 prototype 3、将函数的this指向新创建的对象…

鲁棒线性模型估计(Robust linear model estimation)

鲁棒线性模型估计 1.RANSAC算法1.1 算法的基本原理1.2 迭代次数N的计算1.3 参考代码 参考文献 当数据中出现较多异常点时&#xff0c;常用的线性回归OLS会因为这些异常点的存在无法正确估计线性模型的参数&#xff1a; W ( X T X ) − 1 X T Y \qquad \qquad W(X^TX)^{-1}X^T…

【docker】Docker 简介

Docker 简介 什么是虚拟化、容器化?为什么要虚拟化、容器化&#xff1f;虚拟化实现方式应用程序执行环境分层虚拟化常见类别虚拟机容器JVM 之类的虚拟机 常见虚拟化实现主机虚拟化(虚拟机)实现容器虚拟化实现容器虚拟化实现原理容器虚拟化基础之 NameSpace 什么是虚拟化、容器…

人体跟随小车(旭日x3派、yolov5、目标检测)

人体跟随小车&#xff08;yolov5、目标检测&#xff09; 前言最终结果接线实现注意 前言 上板运行的后处理使用cython封装了&#xff0c;由于每个版本的yolo输出的形状不一样&#xff0c;这里只能用yolov5-6.2这个版本。 ①训练自己的模型并部署于旭日x3派参考&#xff1a; ht…

RuntimeError: Library cublas64_12.dll is not found or cannot be loaded

运行guillaumekln/faster-whisper-large-v2模型进行语音识别的时候报错了 RuntimeError: Library cublas64_12.dll is not found or cannot be loaded 代码&#xff1a; from faster_whisper import WhisperModelmodel WhisperModel("H:\\model\\guillaumekln\\faster…

【C++】优先级队列(priority_queue)的用法与实现

目录 一、概念&#xff1a; 二、仿函数&#xff08;Functor&#xff09;&#xff1a; 概念&#xff1a; 应用&#xff1a; 三、底层实现&#xff1a; 基本操作&#xff1a; 完整代码&#xff1a; 测试示例&#xff1a; 一、概念&#xff1a; 优先级队列&#xff08;pri…

PostgreSQL入门到实战-第六弹

PostgreSQL入门到实战 PostgreSQL查询语句(三)官网地址PostgreSQL概述PostgreSQL中ORDER BY理论PostgreSQL中ORDER BY实操更新计划 PostgreSQL查询语句(三) 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://www.post…

tcp的全连接队列和半连接队列满时,客户端再connect发生的情况

首先简单介绍下tcp的全连接队列(accept queue)和半连接队列(syn queue)&#xff0c; 1.客户端发起syn请求时&#xff0c;服务端收到该请求&#xff0c;将其放入到syn queue&#xff0c;然后回复acksyn给客户端。 2.客户端收到acksyn&#xff0c;再发送ack给服务端。 3. 服务端从…

3、最大池化maxinmum pooling

了解有关最大池化特征提取的更多信息。 简介 在第二课中,我们开始讨论卷积神经网络(convnet)的基础如何进行特征提取。我们了解了这个过程中的前两个操作是在带有 relu 激活的 Conv2D 层中进行的。 在这一课中,我们将看一下这个序列中的第三个(也是最后一个)操作:通过…

3dmax渲染十几个小时怎么办?3dmax怎么多机渲染

当使用3ds Max进行渲染作业时&#xff0c;如果发现单张图像的渲染时间长达十数小时&#xff0c;这可能是由于计算机硬件配置较低或渲染场景过于复杂所致。为了缩短渲染时间并提高效率&#xff0c;我们可以考虑采用多台计算机进行协同渲染。下面&#xff0c;让我们一起探讨如何通…

MyBatis操作数据库(2)

MyBatis XML配置文件 MyBatis开发有两种方式: 1.注解 2.xml 上面我们学习了注解的方式, 下面来学习xml的方式 使用MyBatis的注解方式, 主要是为了完成一些简单的增删改查功能, 而下面我们介绍的xml方式, 则一般用于写一些比较复杂的sql语句. MyBatis XML的方式需要以下两步: …

《荒野大镖客》游戏提示emp.dll文件丢失如何解决?

emp.dll它作为一种动态链接库&#xff08;DLL&#xff09;文件&#xff0c;在Windows操作系统中扮演着重要角色。当打开一个程序时&#xff0c;操作系统会将程序的代码和数据加载到内存中&#xff0c;并创建一个进程来运行该程序。在这个过程中&#xff0c;emp.dll负责将这些代…

OpenHarmony开发-连接开发板调试应用

在 OpenHarmony 开发过程中&#xff0c;连接开发板进行应用调试是一个关键步骤&#xff0c;只有在真实的硬件环境下&#xff0c;我们才能测试出应用更多的潜在问题&#xff0c;以便后续我们进行优化。本文详细介绍了连接开发板调试 OpenHarmony 应用的操作步骤。 首先&#xf…

实现几何对象按照一定距离向外缓冲

1、首先&#xff0c;确保你已经引入了Turf.js库。你可以通过在HTML文件中添加以下代码来引入 <script src"https://cdn.jsdelivr.net/npm/turf/turf6.5.0/turf.min.js"></script>2、使用turf.buffer实现几何对象按照设定距离扩充 let originalCoordinat…

【MATLAB源码-第183期】基于matlab的图像处理GUI很全面包括滤波,灰度,边缘提取,RGB亮度调节,二值化等。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. RGB颜色亮度调整 1.1 RGB颜色模型 RGB颜色模型是一种加色模型&#xff0c;使用红色&#xff08;R&#xff09;、绿色&#xff08;G&#xff09;、蓝色&#xff08;B&#xff09;三种颜色的不同组合来表示各种颜色。每种…

每日OJ题_两个数组dp⑤_力扣10. 正则表达式匹配

目录 力扣10. 正则表达式匹配 解析代码 力扣10. 正则表达式匹配 10. 正则表达式匹配 难度 困难 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c…

部署 GlusterFS 群集

目录 一、GFS部署 1.1.环境 1.2.更改节点名称 1.3.节点进行磁盘挂载&#xff0c;安装本地源 1.4.添加节点创建集群 1.5.根据规划创建卷 1.6. 部署gluster客户端 1.7. 破坏性测试 挂起 node2 节点或者关闭glusterd服务来模拟故障 复制卷&#xff0c;在node3和no…

基于springboot+vue+Mysql的药品商超管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…