【Java 基础】23 国际化

文章目录

    • 1.概念
    • 2.原理
      • 1)Locale
      • 2)ResourceBundle
      • 3)MessageFormat
    • 3.例子
      • 1)准备资源文件
      • 2)加载资源文件
      • 3)格式化消息(非必须)
    • 总结

在全球化的今天,开发支持多语言的应用变得越来越重要,也变得较为常见。

1.概念

国际化是一种使应用程序能够适应不同语言的技术

国际化就是指一个程序可以同时去适应各个国家的语言。例如,如果使用程序的是中国人,那么就会显示中文。如果使用程序的是英国人,那么就显示英语

2.原理

例如:

现在需要一个程序,去同时适应中文和英文的显示

这个时候我们就需要一个国际化支持了,那该如何去实现呢?

在这里插入图片描述

其实挺简单的,我们事先准备一组资源文件,然后里面都是通过 key-value 的形式保存信息,再根据 key一组资源文件 中寻找对应的资源文件中的 value 然后返回

在 Java 中,如果要实现这个国际化需求,那么就离不开下面的 3 个主要类:

1)Locale

用于表示一个国家语言类, java.util.Locale 类表示一个特定的区域,用于确定程序应该使用哪种语言规则。可以通过 Locale 类来创建一个特定的区域设置。

2)ResourceBundle

用于访问资源文件 , java.util.ResourceBundle 类用于加载特定于语言环境的资源文件。资源文件通常是 key-value 的集合,其中 key 是字符串,value 可以是字符串、数字等。

3)MessageFormat

用于格式化资源文件的占位符, java.text.MessageFormat 类用于格式化消息,支持将占位符替换为特定的值,这在处理动态文本时非常有用。

3.例子

上面说了下国际化的概念及原理,接下来就让我们来试一试吧

1)准备资源文件

首先,我们为每种语言创建一个资源文件,其中包含了程序中显示的所有文本消息。资源文件通常以 .properties 后缀结尾

  • message_zh_CN.properties

    msg = 你好世界
    dynamic_msg = {0} 说:你好世界
    
  • message_en_US.properties

    msg = Hello world
    dynamic_msg =  {0} say:Hello world
    

2)加载资源文件

使用 ResourceBundle 来加载特定于语言环境的资源文件

示例代码:

public class Demo {public static void main(String[] args) {// 设置区域Locale cn = new Locale("zh", "CN");// 获取资源ResourceBundle cnBundle = ResourceBundle.getBundle("message", cn);// 获取消息System.out.println(cnBundle.getString("msg"));// 设置区域Locale en = new Locale("en", "US");// 获取资源ResourceBundle enBundle = ResourceBundle.getBundle("message", en);// 获取消息System.out.println(enBundle.getString("msg"));}
}

输出结果:

你好世界
Hello world

在不同的语言和地区切换时,只需更改 Locale 对象即可。

3)格式化消息(非必须)

如果需要在消息中插入动态值,可以使用 MessageFormat,若没有占位符的话,就不用使用这个

示例代码:

public class Demo {public static void main(String[] args) {Locale cn = new Locale("zh", "CN");ResourceBundle cnBundle = ResourceBundle.getBundle("message", cn);String cnMsg = cnBundle.getString("dynamic_msg");System.out.println(MessageFormat.format(cnMsg, "程序员"));Locale en = new Locale("en", "US");ResourceBundle enBundle = ResourceBundle.getBundle("message", en);String enMsg = enBundle.getString("dynamic_msg");System.out.println(MessageFormat.format(enMsg, "Cheney"));}
}

输出结果:

程序员 说:你好世界

Cheney say:Hello world

这个可以应用于 非固定的消息上,可以更灵活的处理动态消息

总结

国际化为开发者提供了一种强大的工具,使他们能够轻松地创建多语言的应用程序。通过合理使用 LocaleResourceBundleMessageFormat 便可以实现灵活、可维护的国际化应用。

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

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

相关文章

STM32F1的TIM输出比较(PWM)

目录 1. OC(Output Compare)输出比较 2. PWM简介 3. 输出比较通道(高级) 4. 输出比较通道(通用) 5. PWM基本结构 6. 配置介绍 6.1 输出比较模块配置 6.2 给输出比较结构体赋一个默认值 6.3 配置强制输出模式 6.4 配置CRR寄存器的预装…

【文件上传系列】No.1 大文件分片、进度图展示(原生前端 + Node 后端 Koa)

分片(500MB)进度效果展示 效果展示,一个分片是 500MB 的 分片(10MB)进度效果展示 大文件分片上传效果展示 前端 思路 前端的思路:将大文件切分成多个小文件,然后并发给后端。 页面构建 先在页…

低代码与MES:智能制造的新篇章

一、引言 随着工业4.0和智能制造的兴起,企业对于生产过程的数字化、智能化需求日益迫切。制造执行系统(MES)作为连接计划层与控制层的关键信息系统,在提升生产效率、优化资源配置、保障产品质量等方面发挥着重要作用。然而&#…

AIGC实战——WGAN(Wasserstein GAN)

AIGC实战——WGAN 0. 前言1. WGAN-GP1.1 Wasserstein 损失1.2 Lipschitz 约束1.3 强制 Lipschitz 约束1.4 梯度惩罚损失1.5 训练 WGAN-GP 2. GAN 与 WGAN-GP 的关键区别3. WGAN-GP 模型分析小结系列链接 0. 前言 原始的生成对抗网络 (Generative Adversarial Network, GAN) 在…

深入探索C语言中的二叉树:数据结构之旅

引言 在计算机科学领域,数据结构是基础中的基础。在众多数据结构中,二叉树因其在各种操作中的高效性而脱颖而出。二叉树是一种特殊的树形结构,每个节点最多有两个子节点:左子节点和右子节点。这种结构使得搜索、插入、删除等操作…

【React Hooks】useReducer()

useReducer 的三个参数是可选的,默认就是initialState,如果在调用的时候传递第三个参数那么他就会改变为你传递的参数,实际开发不建议这样写。会增加代码的不可读性。 使用方法: 必须将 useReducer 的第一个参数(函数…

MySQL - 并发控制与事务的隔离级别

目录 第1关:并发控制与事务的隔离级别 第2关:读脏 第3关:不可重复读 第4关:幻读 第5关:主动加锁保证可重复读 第6关:可串行化 第1关:并发控制与事务的隔离级别 任务描述 本关任务&#…

linux初级学习

(420条消息) 红帽认证-RHCSA_rhcsa红帽认证_yyyzf的博客-CSDN博客 OS:用户和机器的接口,UI:CMD,GUI shell: 通用格式 命令 选项(调控功能) 参数(操作对象)参数 省略参数对象一般使用当前目录作为参数对…

vue3日常知识点学习归纳

1&#xff0c;父子组件传递&#xff1a; 父组件传递参数 <template><div><!-- 子组件 参数&#xff1a;num 、nums --><child :num"nums.num" :doubleNum"nums.doubleNum" increase"handleIncrease"></child>&l…

JAVA全栈开发 day19_JDBC

一、JDBC 1.JDBC概述 1.1什么是jdbc Java DataBase Connectivity是一种用于执行SQL语句的Java API&#xff0c;它由一组用Java语言编写的类和接口组成。通过这些类和接口&#xff0c;JDBC把SQL语句发送给不同类型的数据库进行处理并接收处理结果。 1.2jdbc的作用 提供java…

【目标检测从零开始】torch搭建yolov3模型

用torch从0简单实现一个的yolov3模型&#xff0c;主要分为Backbone、Neck、Head三部分 目录 Backbone&#xff1a;DarkNet53结构简介代码实现Step1&#xff1a;导入相关库Step2&#xff1a;搭建基本的Conv-BN-LeakyReLUStep3&#xff1a;组成残差连接块Step4&#xff1a;搭建Da…

思维模型 色彩心理效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知色彩影响情绪。 1 色彩心理效应的应用 1.1 色彩心理效应在营销中的应用 1 可口可乐公司的“红色”营销 可口可乐公司是全球最著名的饮料品牌之一&#xff0c;其标志性的红色包装已经成为了…

Constraining Async Clock Domain Crossing

Constraining Async Clock Domain Crossing 我们在normal STA中只会去check 同步clock之间的timing,但是design中往往会存在很多CDC paths,这些paths需要被正确约束才能保证design function正确,那么怎么去约束这些CDC paths呢? 以下面的design为例,如下图所示 这里clk…

小红书蒲公英平台开通后,有哪些注意的地方,以及如何进行报价?

今天来给大家聊聊当小红书账号过1000粉后&#xff0c;开通蒲公英需要注意的事项。 蒲公英平台是小红书APP中的一个专为内容创作者设计的平台。它为品牌和创作者提供了一个完整的服务流程&#xff0c;包括内容的创作、推广、互动以及转换等多个方面。 2.蒲公英平台的主要功能 &…

【C语言】vfprintf函数

vfprintf 是 C 语言中的一个函数&#xff0c;它是 fprintf 函数的变体&#xff0c;用于格式化输出到文件中。vfprintf 函数接受一个格式化字符串和一个指向可变参数列表的指针&#xff0c;这个列表通常是通过 va_list 类型来传递的。vfprintf 函数的主要用途是在需要处理不定数…

远传智能水表一般应用于哪些场景?

远传智能水表是一种在水表领域应用广泛的创新技术&#xff0c;它利用物联网和无线通信技术使水表具备了远程监测和数据传输的能力。这种智能水表的应用场景多种多样&#xff0c;可适用于各个领域和环境。那么&#xff0c;远传智能水表一般应用于哪些场景呢&#xff1f; 首先&am…

9.关于Java的程序设计-基于Springboot的家政平台管理系统设计与实现

摘要 随着社会的进步和生活水平的提高&#xff0c;家政服务作为一种重要的生活服务方式逐渐受到人们的关注。本研究基于Spring Boot框架&#xff0c;设计并实现了一种家政平台管理系统&#xff0c;旨在提供一个便捷高效的家政服务管理解决方案。系统涵盖了用户注册登录、家政服…

mybatis数据输出-map类型输出

1、建库建表 create table emp (empNo varchar(10) null,empName varchar(100) null,sal int null,deptno varchar(10) null ); 2、pom.xml <dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis<…

Elasticsearch 8.9 flush刷新缓存中的数据到磁盘源码

一、相关API的handler1、接收HTTP请求的hander2、每一个数据节点(node)执行分片刷新的action是TransportShardFlushAction 二、对indexShard执行刷新请求1、首先获取读锁&#xff0c;再获取刷新锁&#xff0c;如果获取不到根据参数决定是否直接返回还是等待2、在刷新之后transl…

Android Audio实战——音频链路分析(二十五)

在 Android 系统的开发过程当中,音频异常问题通常有如下几类:无声、调节不了声音、爆音、声音卡顿和声音效果异常(忽大忽小,低音缺失等)等。尤其声音效果这部分问题通常从日志上信息量较少,相对难定位根因。想要分析此类问题,便需要对声音传输链路有一定的了解,能够在链…