Spring之 国际化:i18n

news2024/11/16 11:30:58

1、i18n概述

国际化也称作i18n,其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数。由于软件发行可能面向多个国家,对于不同国家的用户,软件显示不同语言的过程就是国际化。通常来讲,软件中的国际化是通过配置文件来实现的,假设要支撑两种语言,那么就需要两个版本的配置文件。

2、Java国际化

Java国际化是一种重要的技术,它允许您的应用程序在不同的语言环境和地域之间无缝切换,以提供更广泛的用户群体。Java提供了一些关键的类和机制来实现国际化,其中包括java.util.Localejava.util.ResourceBundle

1. java.util.Locale

Locale类用于表示用户的语言环境和地域信息。它包括语言代码和国家/地区代码。您可以使用Locale来确定用户所在的语言环境,然后加载相应的本地化资源。例如:

Locale usLocale = new Locale("en", "US"); // 英语(美国)

2. java.util.ResourceBundle

ResourceBundle类用于加载本地化资源。资源束是包含本地化文本、图像、音频等资源的文件。这些资源文件的命名规则是基于基本文件名加上语言和国家/地区的标识符。例如,如果有一个名为"messages"的资源束文件,那么可以有以下命名的资源文件:

  • messages.properties(默认)
  • messages_en_US.properties(英语(美国))
  • messages_fr_FR.properties(法语(法国))
  • messages_zh_CN.properties (中文(中国))

ResourceBundle会根据Locale自动选择合适的资源文件。如果找不到特定的本地化资源文件,它会回退到默认资源文件。

3. 配置文件命名规则

在Java国际化中,配置文件必须遵循特定的命名规则,以便Java能够正确识别。这些规则是:

  • 必须包括基本文件名,例如"messages"。
  • 语言和国家/地区代码是可选的,例如"_en_US"表示英语(美国)。

Java将首先查找与给定Locale完全匹配的资源文件,然后回退到默认资源文件。所有的配置文件必须位于classpath中,通常放在resources目录下。

4. 演示Java国际化

第一步 创建子模块spring6-i18n,

image-20240102213056426

引入spring依赖

<dependencies>
        <!--spring context依赖-->
        <!--当你引入Spring Context依赖之后,表示将Spring的基础依赖引入了-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.2</version>
        </dependency>

        <!--spring对junit的支持相关依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>6.0.2</version>
        </dependency>

        <!--junit5测试-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.9.0</version>
        </dependency>

        <!--log4j2的依赖-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.19.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j2-impl</artifactId>
            <version>2.19.0</version>
        </dependency>

        <!-- junit测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

第二步 在resource目录下创建两个配置文件:messages_zh_CN.properties和messages_en_GB.properties

image-20240102214429860

第三步 测试

public static void main(String[] args) {
        //  1. 通过指定Locale来获取资源文件
        System.out.println(ResourceBundle.getBundle("messages",
                new Locale("en", "GB")).getString("test"));

        //  2. 通过指定Locale来获取资源文件
        System.out.println(ResourceBundle.getBundle("messages",
                new Locale("zh", "CN")).getString("test"));
    }

image-20240102214533013

3、Spring6国际化

3.1 MessageSource接口

Spring框架支持国际化通过MessageSource接口来实现,这允许您在应用程序中轻松管理多语言和本地化资源。

常见实现类

  1. ResourceBundleMessageSource

ResourceBundleMessageSource是一个常见的MessageSource实现,它基于Java的ResourceBundle基础类。它允许您仅通过资源名加载国际化资源。这意味着您可以将不同语言版本的资源存储在不同的属性文件中,并根据需要加载它们。

  1. ReloadableResourceBundleMessageSource

ReloadableResourceBundleMessageSourceResourceBundleMessageSource类似,但它提供了一个额外的功能,即定时刷新。这允许您在不重启应用程序的情况下更新资源信息。这对于需要经常更新本地化内容的应用程序非常有用。

  1. StaticMessageSource

StaticMessageSource是另一个MessageSource实现,它允许您通过编程的方式提供国际化信息。这意味着您可以在代码中动态添加和管理本地化消息,甚至从数据库中提取国际化信息。这对于需要动态管理本地化内容的情况非常有用。

通过使用这些不同的MessageSource实现,Spring框架使国际化在应用程序中变得更加灵活和可定制。我们可以选择最适合您项目需求的实现来管理多语言和本地化资源,以提供更好的用户体验。

3.2 使用Spring6国际化

第一步 创建资源文件

国际化文件命名格式:基本名称 _ 语言 _ 国家.properties

image-20240103195605660

messages_en_GB.properties

test=welcome {0},时间:{1}

messages_zh_CN.properties

test=welcome {0},时间:{1}

解释:{0},{1}这样内容,就是动态参数

第二步 创建spring配置文件,配置MessageSource

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 配置国际化资源文件 -->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">

        <!-- 配置国际化资源文件的基本名称 -->
        <property name="basenames">

            <!-- 配置国际化资源文件的基本名称 -->
            <list>
                <value>messages</value>
            </list>
        </property>
        <property name="defaultEncoding" value="utf-8"/>
    </bean>
</beans>

image-20240103200428447

第三步 创建测试类

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.Date;
import java.util.Locale;

public class Demo2 {

    public static void main(String[] args) {
        // 1. 加载Spring配置文件,根据创建对象
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

        // 传递动态参数,使用数组形式对应{0} {1}顺序
        Object[] objs = new Object[]{"test", new Date().toString()};

        //test为资源文件的key值,
        //objs为资源文件value值所需要的参数,Local.CHINA为国际化为语言
        String str = context.getMessage("test", objs, Locale.CHINA);
        System.out.println(str);
    }
}

image-20240103200455139

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

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

相关文章

Ant Design Vue 编译后的网页特点是什么,怎么确认他是用的前端 Ant Design Vue 技术栈的呢?

Ant Design Vue 是一个前端 UI 框架&#xff0c;使用 Vue.js 构建。它包含了大量的预设样式和组件&#xff0c;如按钮、表单、表格等&#xff0c;可以帮助开发者快速构建出优雅且功能丰富的网页。但是&#xff0c;要确定一个编译后的网页是否使用了 Ant Design Vue&#xff0c;…

缓存和数据库,1+1如何大于2?

一、缓存的本质 缓存&#xff0c;简单说就是为了节约对原始资源重复获取的开销&#xff0c;而将结果数据副本存放起来以供获取的方式。 首先&#xff0c;缓存往往针对的是“资源”。我们前面已经多次提到过&#xff0c;当某一个操作是"幂等"的和“安全"的&#…

Cesium特效-2023年汇总

1-3dTiles建筑实现随机贴图 使用3dTiles的customShader接口&#xff0c;在前端实现不同白模建筑贴不同的图片 2-淡入淡出的扩散雷达效果 在扩散雷的基础上&#xff0c;实现渐隐渐现的效果 3-不规则多边形的扩散效果 指定一个中心点&#xff0c;改变每个多边形的顶点位置来实现动…

Vue - 多行文本“展开、收起”功能

TextClamp 使用 js 实现文本展开、收起&#xff0c;并非纯 CSS 实现。 Props&#xff1a; fontSize&#xff1a;Number&#xff0c;默认&#xff1a;14lines&#xff1a;Number&#xff0c;默认&#xff1a;1lineHeight&#xff1a;Number&#xff0c;默认&#xff1a;20 F…

在mac上怎么方便的编辑xml文件

在Mac上 XML 文件不能默认以较直观的方式在“文本编辑”中打开&#xff0c;如果已安装 Xcode&#xff0c;你可以使用 Xcode 打开 XML 文件。在 Xcode 中&#xff0c;XML 文件通常会以可视化的方式显示&#xff0c;使得编辑更加直观&#xff0c;但是如果你不想安装 XCode&#x…

stable diffusion 基础教程-必备插件

说明 持续更新 插件地址,因为这些都是要魔法上网的,大家直接从我百度云盘里获取 链接:https://pan.baidu.com/s/1_xAu47XMdDNlA86ufXqAuQ?pwd=23wi 提取码:23wi 交流群:830970289 必备插件 汉化包 中文汉化包 https://github.com/VinsonLaro/stable-diffusion-webui-chi…

RK3568驱动指南|第九篇 设备模型-第100章 在总线目录下创建属性文件实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

SSM共享汽车租赁平台----计算机毕业设计

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,修改管理员信息,用户信息管理,管理新闻公告,汽车品牌信息管理,城市信息管理,租赁点信息管理,共享汽车信息管理,汽车订单信…

openGauss学习笔记-185 openGauss 数据库运维-升级-提交升级/升级版本回退/异常处理

文章目录 openGauss学习笔记-185 openGauss 数据库运维-升级-提交升级/升级版本回退/异常处理185.1 提交升级操作步骤 185.2 升级版本回滚操作步骤 185.3 异常处理升级问题FAQ openGauss学习笔记-185 openGauss 数据库运维-升级-提交升级/升级版本回退/异常处理 185.1 提交升级…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-7Lead Compensator超前补偿器(调节根轨迹)

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-7Lead Compensator超前补偿器&#xff08;调节根轨迹&#xff09; 1. Plot Rootlocus 绘制根轨迹2. System Performance 系统表现3. 改善/加快收敛速度4. 超前补偿器 Lead Compe…

C++ DAY6 作业

1.用模板类写顺序表 #include <iostream>using namespace std;#define MAXSIZE 10 template <typename T> class Arr {T *data NULL;int len 0; public://构造函数Arr():data(new T){}Arr(T a,int len):data(new T(a)),len(len){}//析构函数~Arr(){delete data;}…

(一)CarPlay集成开发之概述与环境篇

系列文章目录 第一章 CarPlay集成开发之概述与环境篇 文章目录 系列文章目录概述开发环境依赖项总结 概述 CarPlay是由苹果公司开发的一款集成在iOS系统中&#xff0c;用于运行在已完成对接该系统的汽车中控台&#xff0c;仪表盘上的车载系统&#xff0c;该系统通过USB或者WI…

智能求职助手 - ChatGPT 与 RPA 技术的完美结合

随着全球互联网行业的快速发展&#xff0c;互联网求职市场也变得越来越竞争激烈。在互联网求职寒冬的背景下&#xff0c;一位热心的开发者创造了一个令人惊叹的开源项目&#xff0c;结合了 ChatGPT 和 RPA 技术&#xff0c;为求职者提供了一键自动投递简历的便捷解决方案。 项…

电路板设计很难吗?十分钟带你起飞

1、写在前面 其实在20年前&#xff0c;学习资源相对都固化在大学校园里&#xff0c;差一点的学校&#xff0c;学生们想学点真本事&#xff0c;是非常困难的&#xff0c;还好我读书的时候&#xff0c;互联网开始起步腾飞&#xff0c;优酷&#xff0c;土豆兴起&#xff0c;有人开…

【LeetCode:69. x 的平方根 | 二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

《深入理解JAVA虚拟机笔记》对象的创建和访问、对象头

对象的创建 当 Java 虚拟机遇到一条字节码 new 指令时&#xff0c;首先将去检查这个指令的参数是否能做常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有&#xff0c;那必须先执行相应的类加载过程。 在类加载…

xshell登录不上虚拟机了

电脑重启后连不上本地虚机了 1、关闭防火墙 2 虚拟机ping得到主机&#xff0c;而主机ping不到虚拟机的解决办法 原因&#xff1a;可能是主机的网络适配器没有调好 首先&#xff0c;找到虚拟机的网络配置器 根据虚拟机的IP信息修改主机虚拟适配器VMnet8 修改ip使得和虚拟机连…

【力扣100】39.组合总和

添加链接描述 class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:def backtrack(path,target,res,index):if target0:res.append(path[:])returnif target<0:return for i in range(index,len(candidates)):if target&g…

借助libcurl实现ftp文件上传,断点续传demo梳理。

公司业务&#xff0c;需要实现一个ftp大文件上传的功能&#xff0c;简单搭建一个ftp服务器&#xff0c;首先研究demo&#xff0c;以及断点上传的功能。 1&#xff1a;首先了解文件上传相关协议&#xff0c;ftp&#xff0c;sftp或者基于http&#xff0c;其他自己实现等。 2&am…

图像分割-漫水填充法 floodFill

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 本文的C#版本请访问&#xff1a;图像分割-漫水填充法 floodFill (C#&#xff09;-CSDN博客 FloodFill方法是一种图像处理算法&#…