【Java 基础】23 国际化

news2025/2/24 9:58:16

文章目录

    • 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.coloradmin.cn/o/1292927.html

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

相关文章

配置BFD状态与接口状态联动示例

1、BFD检测IP链路。 在IP链路上建立BFD会话,利用BFD检测机制快速检测故障。BFD检测IP链路支持单跳检测和多跳检测: BFD单跳检测是指对两个直连系统进行IP连通性检测,“单跳”是IP链路的一跳。 BFD多跳检测是指BFD可以检测两个系统间的任意路…

每日一练:插入排序

1. 概念及原理 插入排序是一种简单直观的排序算法,其基本思想是将一个元素插入到已经排序好的部分,然后不断地重复这个过程,直到整个数组有序。下面是插入排序的算法原理: 初始状态: 数组被分为已排序和未排序两个部分…

论文阅读——Deformable ConvNets v2

论文:https://arxiv.org/pdf/1811.11168.pdf 代码:https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch 1. 介绍 可变形卷积能够很好地学习到发生形变的物体,但是论文观察到当尽管比普通卷积网络能够更适应物体形变&#xff…

Python中如何判断List中是否包含某个元素

更多资料获取 📚 个人网站:ipengtao.com 在Python中,判断一个列表(List)是否包含某个特定元素是常见的任务之一。在本文中,将深入探讨多种判断List成员包含性的方法,并提供丰富的示例代码&…

Scratch少儿编程系统开发时案例验证的必要性

scratch少儿编程[1] 随着少儿编程教育的普及,越来越多的公司和集成商开始关注scratch少儿编程系统的二次开发。scratch是一个由麻省理工学院媒体实验室开发的免费、开源的少儿编程软件。它具有易用、趣味性强、可扩展性强等特点,非常适合少儿编程教育。…

产品成本收集器流程演示

感谢大佬的文章,我只是一个翻译搬运工,原文地址:产品成本收集器 概述 SAP 令人兴奋的部分之一是它在不同操作模块之间的集成程度。使用产品成本收集器来跟踪生产就是一个很好的例子。在本博客中,我计划遵循产品成本收集器流程&a…

分享一个微信红包封面过审方法

大家好,我是小悟 兄弟们,已经12月份了,今年的最后一个月,距离过年还有两个月左右,如果你需要制作微信红包封面,我建议你现在就可以着手了。 一方面,临近春节,会有很多人在制作红包封…

[b01lers2020]Life on Mars 一个接口的sql schema.schemate表

这里还是很简单的 啥也没有 然后抓包看看 发现传递参数 直接尝试sql 然后如果正确就会返回值 否则 返回1 chryse_planitia union select database(),version() 发现回显 直接开始注入 chryse_planitia union select database(),version()chryse_planitia union select data…

ESP32-Web-Server编程- 在 Web 上开发动态纪念册

ESP32-Web-Server编程- 在 Web 上开发动态纪念册 概述 Web 有很多有趣的玩法,在打开网页的同时送她一个惊喜。 需求及功能解析 本节演示在 ESP32 上部署一个 Web,当打开对应的网页时,将运行动态的网页内容,显示炫酷的纪念贺词…

linux学习之详解文件

目录 1.先认识文件 2.c语言中常用文件接口 fopen(打开文件) 3.系统接口操作文件 open write 文件的返回值以及打开文件的本质 理解struct_file内核对象 了解文件描述符(fd)分配规则 重定向 dup接口 标准错误流 文件缓冲…

【项目问题解决】IDEA2020.3 使用 lombok 插件 java: 找不到符号 符号: 方法 builder()

目录 lombok找不到符号问题修改 1.问题描述2.问题原因3.解决思路4.解决方案5.总结6.参考 文章所属专区 项目问题解决 1.问题描述 IDEA2020.3 使用 lombok 插件 java: 找不到符号 符号: 方法 builder(),无法使用lombok下应有的注解,一度怀疑是版本问题 …

二十一章(网络通信)

计算机网络实现了多台计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序,这些程序借助于网络协议,相互之间可以交换数据。编写网络应用程序前,首先必须明确所要使用的网络协议…

hive映射es表任务失败,无错误日志一直报Task Transitioned from NEW to SCHEDULED

一、背景 要利用gpt产生的存放在es种的日志表做统计分析,通过hive建es的映射表,将es的数据拉到hive里面。 在最初的时候同事写的是全量拉取,某一天突然任务报错,但是没有错误日志一直报:Task Transitioned from NEW t…

MySQL数据库从小白到入门(二)

多表关系: 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构。由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种。 外键: 创…

JavaSE基础50题:11. 输出一个整数的每一位

概述 输出一个整数的每一位。 如:1234的每一位是4,3,2,1 。 个位:1234 % 10 4 十位:1234 / 10 123 123 % 10 3 百位:123 / 10 12 12 % 10 2 千位: 12 / 10 1 代码 ublic sta…

LinuxBasicsForHackers笔记 -- 管理用户环境变量

查看和修改环境变量 env – 您可以通过从任何目录在终端中输入 env 来查看所有默认环境变量。环境变量的名称始终为大写,如 HOME、PATH、SHELL 等。 查看所有环境变量 set – 查看所有环境变量,包括 shell 变量、局部变量和 shell 函数(例…

java学习part40collections工具类

162-集合框架-Collections工具类的使用_哔哩哔哩_bilibili 1.collections工具类 感觉类似c的algorithm包,提供了很多集合的操作方法 2.排序 3.查找 4.复制替换 5.添加,同步

蓝桥杯day03——Bigram 分词

1.题目 给出第一个词 first 和第二个词 second,考虑在某些文本 text 中可能以 "first second third" 形式出现的情况,其中 second 紧随 first 出现,third 紧随 second 出现。 对于每种这样的情况,将第三个词 "th…

计数排序(C语言实现)

文章目录 算法思想操作步骤计数排序的特性总结代码实现 算法思想 计数排序是一种非比较排序,又称为鸽巢原理,是对哈希直接定址法的变形应用。 操作步骤 统计相同元素出现次数;根据统计的结果将序列回收到原来的序列中。 计数排序的特性总…