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)
在这里插入图片描述

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

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

相关文章

如何创建基于udp的客户端和服务端

1.先创建好udpServer.hpp、udpServer.cc、udpClient.hpp、udpClient.cc的框架。 #pragma once #include <string> #include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <cerrno> #include…

【上线文档】系统上线方案模板,计算机系统上线保障计划,系统运维信息系统运行保障方案,系统上线方案模板(Word原件)

一、项目背景和目标 二、项目需求分析 2.1 功能需求 2.2 非功能需求 三、系统设计 3.1 系统架构设计 3.2 数据库设计 3.3 接口设计 3.4 用户界面设计 四、系统开发 4.1 开发环境搭建 4.2 业务逻辑开发 4.3 数据库实现 4.4 接口实现 4.5 用户界面实现 五、系统测…

大模型应用的数字能源数据集

除了尚须时日的量子计算解决算力效率和能源问题&#xff0c;以及正在路上的超越transformer的全新模型架构外&#xff0c;无疑是“数据集”&#xff0c;准确讲是“高质量大规模多样性的数据集”。数据集是大模型发展的核心要素之一&#xff0c;是大计算的标的物&#xff0c;是实…

【OpenCV】图像转换

理论 傅立叶变换用于分析各种滤波器的频率特性。对于图像&#xff0c;使用 2D离散傅里叶变换&#xff08;DFT&#xff09; 查找频域。快速算法称为 快速傅立叶变换&#xff08;FFT&#xff09; 用于计算DFT。 Numpy中的傅立叶变换 首先&#xff0c;我们将看到如何使用Numpy查…

如何使用Java编写Jmeter函数

Jmeter 自带有各种功能丰富的函数&#xff0c;可以帮助我们进行测试&#xff0c;但有时候提供的这些函数并不能满足我们的要求&#xff0c;这时候就需要我们自己来编写一个自定义的函数了。例如我们在测试时&#xff0c;有时候需要填入当前的时间&#xff0c;虽然我们可以使用p…

【2024版】最新kali linux入门及常用简单工具介绍(非常详细)从零基础入门到精通,看完这一篇就够了

前言 相信很多同学了解到和学习网络安全的时候都听过kali系统&#xff0c;大家都称之为黑客最喜爱的系统&#xff0c;那么什么是kali&#xff0c;初学者用kali能做些什么&#xff0c;大白我将在本文中做详细的介绍&#xff1a; 一、kali linux是什么&#xff1f; Kali Linux…

使用 electron 把 vue 项目打包成客户端

1. 新建一个Vue项目 新建一个vue项目&#xff0c;或者在已经写好的vue项目上操作 2. 安装依赖包 需要安装的包有2个 electron electron-builder 安装失败的&#xff0c;可看另外一篇解决方法https://blog.csdn.net/Anorry/article/details/144061069?spm1001.2014.3001.5501 3…

六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序

本章讲述数据结构中的六大排序算法 欢迎大佬们踊跃讨论&#xff0c;感谢大家支持&#xff01; 我的博客主页链接 六大排序算法 一.插入排序1.1 直接插入排序1.2 希尔排序 二.选择排序2.1 单向选择排序2.2双向选择排序2.3 堆排序 三.交换排序3.1 冒泡排序3.2 快速排序3.2.1 Hoa…

el-table手动触发懒加载

二次修改了一下&#xff0c;确保点击某一单元格格元素触发 // 隐藏懒加载箭头后手动触发懒加载 expandRows(scope){scope.row.isExpanded !scope.row.isExpanded // 切换展开状态let isExpanded scope.row.isExpandedconst { table: { toggleRowExpansion, store }} this.$r…

【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…

threejs相机辅助对象cameraHelper

为指定相机创建一个辅助对象&#xff0c;显示这个相机的视锥。 想要在场景里面显示相机的视锥&#xff0c;需要创建两个相机。 举个例子&#xff0c;场景中有个相机A&#xff0c;想要显示相机A的视锥&#xff0c;那么需要一个相机B&#xff0c;把B放在A的后面&#xff0c;两个…

反向代理-缓存篇

文章目录 强缓存一、Expires(http1.0 规范)二、cache-control(http1.1 出现的 header 信息)Cache-Control 的常用选项Cache-Control 常用选项的选择三、弊端协商缓存一、ETag二、If-None-Match三、Last-modified四、If-Modified-Since浏览器的三种刷新方式静态资源部署策略…

健康管理系统(Koa+Vue3)

系统界面(源码末尾获取) 系统技术 Vue3 Koa Nodejs Html Css Js ....... 系统介绍 系统比较简单,轻轻松松面对结业课堂作业.采用的是基于nodejs开发的Koa框架作为后端,采用Vue框架作为前端,完成快速开发和界面展示. 系统获取 啊啊啊宝/KoaVue3https://gitee.com/ah-ah-b…

数据清洗代码:缺失值,异常值,离群值Matlab处理

目录 基本介绍程序设计参考资料基本介绍 一、过程概述 本过程适用于处理SCADA系统采集到的数据,以及具有类似需求的数据集。处理步骤包括缺失值处理、异常值处理和离群值处理,旨在提升数据质量,增强数据的相关性,同时保持数据的原始特征和随机性。 二、缺失值处理 对于SC…

Leetcode 每日一题 202.快乐数

目录 题意 算法思路 过题图片 算法实现 代码解析 复杂度分析 题目链接 结论 题意 判断正整数 n 是不是快乐数。 快乐数定义&#xff1a; &#xff08;1&#xff09;每次将正整数替换为它每个位置上的数字的平方和。 &#xff08;2&#xff09;重复这个过程直到这个数…

【鸿蒙生态崛起】开发者如何把握机遇,应对挑战,打造卓越应用体验?

文章目录 每日一句正能量前言鸿蒙简析鸿蒙生态的认知和了解鸿蒙生态的崛起分析 鸿蒙生态下开发时遇到的挑战开发工具不完善技术难度生态竞争抓住机遇、应对挑战 鸿蒙生态未来的发展趋势1. 全场景智慧生活的推动者2. 技术创新的引领者3. 开放合作的倡导者对鸿蒙生态和开发者的建…

Nignx部署Java服务测试使用的Spring Boot项目Demo

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

文本域设置高度 加上文字限制并show出来:

文本域设置高度 :rows"4" 加上文字限制并show出来&#xff1a; maxlength"30" show-word-limit 效果: <el-form-item label"产品备注" prop"remark"><el-input v-model"form.remark" type"textarea"…

区块链软件系统海外宣发:全球化市场中的策略与实施

随着区块链技术的快速发展&#xff0c;越来越多的区块链软件系统进入全球市场&#xff0c;涉及加密货币、智能合约、去中心化金融&#xff08;DeFi&#xff09;、供应链管理等多个行业应用。为了在激烈的竞争中脱颖而出&#xff0c;区块链软件系统不仅需要具备卓越的技术能力&a…

springboot413福泰轴承股份有限公司进销存系统(论文+源码)_kaic

摘 要 使用旧方法对福泰轴承股份有限公司进销存系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在福泰轴承股份有限公司进销存系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不…