JAVA (Springboot) i18n国际化语言配置

JAVA i18n国际化语言配置
  • 一、简介
  • 二、功能
  • 三、Java配置国际化步骤
  • 四、Java国际化配置工具类
  • 五、Spring Boot配置
  • 六、测试

一、简介

在Java中,国际化(Internationalization,通常简称为i18n)是一个过程,它允许应用程序适应不同的语言和地区设置,从而能够支持全球用户。Java平台为国际化提供了强大的支持,包括Locale类、ResourceBundle类以及用于格式化日期、数字和货币的类。

二、功能

1.支持多语言:

应用程序可以显示多种语言的文本,包括但不限于英文、中文、法文等。
通过使用ResourceBundle,可以为每种语言提供独立的资源文件(通常是.properties文件),其中包含该语言的文本。

2.自动选择语言:
Java的Locale类允许应用程序根据用户的偏好或系统设置自动选择适当的语言。
例如,如果用户的操作系统设置为法语,那么应用程序将尝试加载法语的资源文件。格式化日期、数字和货币

3.用户手动切换语言:
应用程序通常还允许用户手动切换语言,即使他们的系统设置或浏览器默认语言不是他们想要使用的语言。这可以通过在应用程序中提供语言选择界面或设置选项来实现。

4.前后端文字、校验、消息提醒的国际化:
国际化不仅限于用户界面上的文本,还包括后端代码中的字符串、错误消息、验证提示等。
通过使用外部化的字符串和消息,可以确保整个应用程序的文本都是可翻译的。

5.通过AOP切面实现多语言的配置:
这是一个高级特性,允许开发人员使用面向切面编程(AOP)来自动处理对象的字符串属性,并根据配置文件中的语言设置进行替换。
这种方法可以确保即使在复杂的业务逻辑中,字符串也能被正确地翻译成用户所需的语言。
配置文件命名规则:
在Java国际化中,配置文件必须遵循特定的命名规则,以便Java能够正确识别。
例如,一个名为“messages”的资源束文件可以有以下命名的资源文件:messages.properties(默认)、messages_en_US.properties(英语(美国))、messages_fr_FR.properties(法语(法国))等。

三、Java配置国际化步骤

3.1 创建资源文件夹
在src/main/resources目录下新建一个文件夹,用于存放国际化配置文件。
例如,您可以创建一个名为i18n或messages的文件夹。

3.2 添加语言文件

3.2.1 选择Resource Bundle 进行添加配置文件

在这里插入图片描述
3.2.2 配置要添加的语言配置文件
在i18n或messages文件夹下,为每个要支持的语言和地区添加.properties文件。文件名的命名规则通常是basename_language_country.properties,其中basename是您的基本文件名(如messages),language是ISO 639语言代码(如en代表英语),country是ISO 3166国家代码(如US代表美国)。

例如:
messages_en_US.properties(美国英语)
messages_en_GB.properties(英国英语)
messages_zh_CN.properties(简体中文)
messages_zh_TW.properties(繁体中文,台湾)

(会有一个Default locale默认的语言配置文件)
在这里插入图片描述

3.2.3、 在对应的配置文件添加对应的语言信息

1.zh_CN:(中文)

sys.config.newParameters=新增参数
sys.config.changeParameters=修改参数
sys.config.newParametersExists=失败,参数键名已存在

2.en_US:(英文)

sys.config.newParameters=New parameters
sys.config.changeParameters=Modify parameters
sys.config.newParametersExists=Failed, parameter key name already exists

四、Java国际化配置工具类

4.1、创建MessageUtils工具类

MessageUtils 工具类在国际化(i18n)应用中扮演着非常重要的角色,它封装了与消息资源相关的常用操作,使得在应用程序的不同部分中都能够方便地获取和格式化本地化消息,而无需重复编写代码,通过key来获取目前系统语言的value值。

import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;

/**
 * 获取i18n资源文件
 *
 * @author cccl
 */
public class MessageUtils {
    /**
     * 根据消息键和参数 获取消息 委托给spring messageSource
     *
     * @param code 消息键
     * @param args 参数
     * @return 获取国际化翻译值
     */
    public static String message(String code, Object... args) {
        MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
        return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
    }
}

4.2、添加国际化(i18n配置类)

import lombok.extern.slf4j.Slf4j; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.servlet.config.annotation.InterceptorRegistration; 
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**  
 * 国际化(i18n)配置类  
 */  
@Configuration   
@Slf4j 
// 实现WebMvcConfigurer接口,用于自定义Spring MVC的配置  
public class I18nConfig implements WebMvcConfigurer { 
  
    /**  
     * 添加拦截器到Spring MVC的拦截器链中  
     *  
     * @param registry 拦截器注册器,用于添加和配置拦截器  
     */  
    @Override  
    public void addInterceptors(InterceptorRegistry registry) {  
        // 创建一个自定义的国际化拦截器实例  
        MyI18nInterceptor myHandlerInterceptor = new MyI18nInterceptor();  
        // 使用拦截器注册器注册自定义的国际化拦截器  
        InterceptorRegistration loginRegistry = registry.addInterceptor(myHandlerInterceptor);  
        // 设置需要拦截的路径模式,这里配置为拦截所有路径("/**")  
        loginRegistry.addPathPatterns("/**");  
    }  
  
}

4.3、添加国际化(i18n拦截器)

import com.github.pagehelper.util.StringUtil;
import lombok.extern.slf4j.Slf4j;  
import org.springframework.context.i18n.LocaleContextHolder;  
import org.springframework.web.servlet.HandlerInterceptor;  
import org.springframework.web.servlet.ModelAndView;  
  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import java.util.Locale;  
  
/**  
 * i18n拦截器:用于从HTTP请求头中获取国际化参数,并设置当前线程的Locale。  
 */  
@Slf4j  
public class MyI18nInterceptor implements HandlerInterceptor {  
  
    /**  
     * 在请求处理之前进行调用。  
     *  
     * @param request  HttpServletRequest对象,提供对客户端请求信息的访问  
     * @param response HttpServletResponse对象,提供对HTTP响应的控制  
     * @param handler  被调用的处理器,通常是HandlerMethod  
     * @return 如果返回false,则请求处理流程将被中断并返回给客户端;如果返回true,则继续执行后续流程  
     * @throws Exception 抛出异常将中断请求处理流程  
     */  
    @Override  
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
        // 假设请求头中存储语言信息的键名为"Language"  
        final String key = "Language"; 
        // 从请求头中获取语言信息  
        String language = request.getHeader(key); 
         // 使用自定义的字符串工具类判断语言信息是否非空  
        if (JoventStringUtils.isNotEmpty(language)) {
            // 假设语言信息格式为"zh_CN"或"en_US",这里通过下划线分割获取语言和地区信息  
            String[] languageParts = language.split("_");  
            // 确保分割后有两个部分  
            if (languageParts.length == 2) { 
                // 创建Locale对象  
                Locale locale = new Locale(languageParts[0], languageParts[1]); 
                // 设置当前线程的Locale  
                LocaleContextHolder.setLocale(locale); 
            } else {  
                // 如果格式不正确,可以记录日志或进行其他处理  
                log.warn("Invalid language format: {}", language);  
            }  
        }  
        // 继续执行后续流程 
        return true;  
    }  
  
    /**  
     * 在请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)  
     * 通常用于处理一些需要在请求处理之后、视图渲染之前执行的逻辑  
     *  
     * @param request   HttpServletRequest对象  
     * @param response  HttpServletResponse对象  
     * @param handler   被调用的处理器  
     * @param modelAndView 如果处理器方法的返回值是ModelAndView类型,则为该方法的返回值,否则为null  
     */  
    @Override  
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {  
        // 可以在这里添加处理请求处理之后、视图渲染之前的逻辑  
    }  
  
    /**  
     * 在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要是用于进行资源清理工作)  
     *  
     * @param request   HttpServletRequest对象  
     * @param response  HttpServletResponse对象  
     * @param handler   被调用的处理器  
     * @param ex        如果在请求处理过程中发生异常,则为该异常,否则为null  
     */  
    @Override  
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {  
        // 可以在这里添加请求处理完毕后的清理逻辑,例如关闭资源等  
    }  
}

五、Spring Boot配置

spring:  
  # 资源信息配置  
  messages:  
    # 国际化资源文件的基础名称(不包含文件后缀),Spring将会在这个基础上添加语言代码和地区代码(例如messages_zh_CN.properties)来查找具体的资源文件  
    basename: i18n/messages # 国际化资源文件路径  
  
    # 当找不到特定Locale的资源文件时,是否回退到系统默认的Locale。如果设置为true,并且找不到特定Locale的资源文件,Spring将尝试使用系统默认的Locale来加载资源文件  
    fallback-to-system-locale: true # 回退到系统Locale  
  
    # 指定资源文件的编码格式。在读取资源文件时,Spring将使用此编码格式  
    encoding: UTF-8 # 编码格式  
  
    # 国际化资源文件的缓存时间(以秒为单位)。在这段时间内,相同的资源请求将不会再次加载资源文件,而是从缓存中获取。设置为-1将禁用缓存  
    cache-duration: 3600 # 缓存持续时间(秒)

六、测试

6.1、接口

@Log(title = "参数管理", businessType = BusinessType.INSERT)
@GetMapping("/add")
public AjaxResult add() {
    return AjaxResult.success(MessageUtils.message("sys.config.newParameters"));
}

此处截取的是请求头的Language参数,那么我们在请求的时候添加一个Language参数 (具体的截取字段名自行配置)

6.2 、英文请求(en_US)

在这里插入图片描述
6.3 、中文请求(zh_CN)
在这里插入图片描述

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

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

相关文章

Jenkins 中自定义Build History中显示构建信息

有时候会遇到一个代码仓库下面会有多个不同的分支,而这写分支表示着不同的开发者在开发新的需求,但是这样就会出现一个问题,在Jenkins上进行多分支构建的时候,很难找到哪一个是属于自己分支构建的,这样的问题大家应该都…

springboot安康旅游网站的设计与实现(代码+数据库+LW)

目 录 目 录 摘 要 Abstract 第一章 绪论 1.1 研究现状 1.2 设计原则 1.3 研究内容 第二章 相关技术简介 2.1 JSP技术 2.2 Java技术 2.3 MYSQL数据库 2.4 B/S结构 2.5 Spring Boot框架 第三章 系统分析 3.1可行性分析 3.1.1技术可行性 …

asp.net core过滤器应用

筛选器类型 授权筛选器 授权过滤器是过滤器管道的第一个被执行的过滤器,用于系统授权。一般不会编写自定义的授权过滤器,而是配置授权策略或编写自定义授权策略。简单举个例子。 using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCo…

深入体验c语言中const的多种多样的用法

const是一个C语言(ANSI C)的关键字,它限定一个变量不允许被改变,一定程序上提高程序的安全性和可靠性。虽然这个关键字看起来简单,但是实际上随着它限定位置不一样,产生的效果也各异。 一、const作用 cons…

齐护机器人ModbusRTU RS485转TTL通信模块与ESP32 Arduino通信可Mixly的图形化编程Scratch图形化编程

齐护机器人ModbusRTU RS485-TTL通信模块 一、概念理解 Modbus协议是一种由Modicon公司(现为施耐德电气Schneider Electric)于1979年发表的网络通信协议,旨在实现可编辑逻辑控制器(PLC)之间的通信。 1.1 什么是Mod…

【动手学运动规划】 4.5 A*算法

我宁愿永远做我自己,也不愿成为别人,即使那个人比你更快乐。 —《成为简奥斯汀》 🏰代码及环境配置:请参考 环境配置和代码运行! 4.5.1 概述 Dijkstra算法是基于广度优先搜索策略来遍历空间内的所有节点,最终计算出…

一些引入依赖,提示引入方式报错的问题

背景 当我们使用gulp自动化处理文件的时候,难免会遇到需要按照一定条件过滤的需求,这里博主所遇到问题是,通过文件内容中是否包含 某一串字符串 决定过滤当前的文件 比如: 碰到文件中包含注释 * replace-note 此文件未被引用 ,那…

十二月第二周

作业题: 嵌套循环穷举,先看一道题也是今天作业题: 重点掌握题: 接下来,我们看一下未来要学习的内容:数组 数组基本用法如下: 扩展题:

PyTorch环境迁移指南

在进行深度学习研究和开发时,我们经常需要在不同计算机之间迁移PyTorch环境。无论是更换新设备还是在多台机器间协同工作,都需要确保环境配置的一致性。本文将详细介绍PyTorch环境迁移的完整流程和注意事项。 环境迁移看似简单,实则暗藏玄机。直接复制文件可能会遇到系统差异带…

QGroundControl之4-QGCCorePlugin.cc

介绍 核心控件接口 Core Plugin Interface for QGroundControl 。主要看settingsPages、analyzePages、instrumentPages 等,这里明显看出配置了不同类型toolbar按钮对应的页面 1.MainRootWindow.qml MainRootWindow.qml页面中使用 AppSettings.qml 2.AppSettings.…

tomcat 运行加载机制解析

tomcat 运行加载机制 从tomcat jar包的加载顺序: tomcat的具体运行加载 可以从 start、setclasspath、catalina文件中看出来: start.bat执行 去找bin目录下的catalina.bat,catalina 或去找 bin\setenv.bat以获取标准环境变量,然后去找bin\…

【机器学习 | 基于Lasso回归和随机森林的上海链家二手房房价预测】

文章目录 🏳️‍🌈 1. 导入模块🏳️‍🌈 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 去除重复数据2.4 去除缺失数据2.5 面积、价格、单价、楼层、建筑时间数据提取2.6 朝向数据处理 🏳️‍🌈 3. 特…

npm, yarn, pnpm之间的区别

前言 在现代化的开发中,一个人可能同时开发多个项目,安装的项目越来越多,所随之安装的依赖包也越来越臃肿,而且有时候所安装的速度也很慢,甚至会安装失败。 因此我们就需要去了解一下,我们的包管理器&#…

使用Java将PDF文件解析成Excel文件

安装pom依赖 <!-- 解析pdf--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version> <!-- 请检查并使用最新版本 --></dependency>测试读取pdf文件…

Celery使用小结

介绍 Celery 是异步任务调度工具就&#xff0c;或分布式任务队列&#xff08;Distributed Task Queue&#xff09;&#xff0c;有多个worker。 Broker&#xff1a;中间人&#xff0c;所有任务放在broker中&#xff0c;worker到broker中提取任务执行。 这样系统为开环系统&am…

java注解(二):注解的解析以及应用场景、用注解和反射模拟junit框架代码演示

目录 1、什么是注解的解析&#xff1f; 2、解析注解的案例 1、自定义一个注解 2、在类和方法上使用自己定义的注解 3、解析注解 3、模拟Junit框架案例 1、自定义一个MyTest注解 2、定义一个测试类&#xff0c;使用自定义的注解 3、写一个启动类 本文章主要讲解什么是注…

VUE脚手架练习

脚手架安装的问题&#xff1a; 1.安装node.js,配置环境变量,cmd输入node -v和npm -v可以看到版本号&#xff08;如果显示不是命令&#xff0c;确认环境变量是否配置成功&#xff0c;记得配置环境变量之后重新打开cmd&#xff0c;再去验证&#xff09; 2.在安装cnmp时&#xf…

unity3d—demo(实现给出图集名字和图片名字生成对应的图片)

目录 实现给出图集名字和图片名字生成对应的图片&#xff1a; 代码示例&#xff1a; dic: 键 是图集名称 值是一个字典 该字典键是图片名称 值是图片&#xff0c;结构如图&#xff1a; 测试代码&#xff1a; 结果&#xff1a; SpriteRenderer 讲解&#xff1a; Resour…

国内外网络安全政策动态(2024年11月)

▶︎ 1.13项网络安全国家标准自11月1日起实施 11月1日起&#xff0c;《网络安全技术 信息技术安全评估准则》等13项网络安全国家标准开始实施&#xff0c;其中&#xff0c;《网络安全技术 信息技术安全评估准则 第1-5部分》《网络安全技术 信息技术安全评估方法》等6项推荐性国…

Modbus Poll的使用

最近从串口调试助手接触到了Modbus Poll&#xff0c;一开始用的时候有些生疏&#xff0c;了解之后不得不说真香。 相对于串口调试助手&#xff0c;有些设备厂家会给一些点表和指令码&#xff0c;有些也可以通过modbus协议解析出来&#xff0c;相对来说&#xff0c;使用Modbus …