44、Java基础教程之常用类库·国际化

  • 1️⃣ 使用 Locale 类定义语言环境
  • 2️⃣ 利用 ResourceBundle 读取资源文件
  • 3️⃣ 多资源读取
  • * 总结

*

1️⃣ 使用 Locale 类定义语言环境

国际化程序指的是同一套程序代码可以在不同的国家使用,那么在假设项目功能不变的情况下,文字就成为这一操作中最为重要的处理环节。所谓的国际化程序实际上指的就是同一套程序,可以根据其应用的国家自动在项目中显示出本国的相应文字信息,如下图所示。

*

而在本操作中需要两个关键的技术实现点:如何确定当前的软件项目运行的语言环境;要想实现多语言切换,必须针对每一个语言提供一个资源文件,并 且可以根据语言环境选择不同的资源文件进行信息的读取。

如果要对用户使用的语言环境进行定义,则可以使用 java.util.Locale 类完成,此类定义的常用方法如下表所示。

方法 类型 描述
public Locale(String language, String country) 构造 设置要使用的语言以及国家编码
public static Locale getDefault() 普通 取得当前语言环境下的Locale类对象
//	范例 1: 输出 Locale 类对象
package com.xiaoshan.demo;

import java.util.Locale;

public class TestDemo{
   
     
	public static void main(String[] args) throws Exception {
   
     
		Locale loc = Locale.getDefault();             //取得本地默认的Local对象
		System.out.println(loc);                              //直接输出loc对象
	}
}

程序执行结果:

zh_CN

此程序直接取得了当前语言环境中默认的 Locale 对象,而输出的内容由两个部分组成 “zh_CN (语言 标记 国家标记)“,其中 “zh” 表示现在使用的语言是中文,而 “CN” 表示现在的国家是中国。

如果要实现国际化肯定需要知道许多语言及国家编码,那么这些编码信息该从哪里获得呢?

java.util.Locale 类中还提供了一系列的对象常量,例如:中文语言环境(Locale.CHINA) 或英文语言环境(Locale. ENGLISH),这样可以直接取得指定语言编码和国家编码的 Locale对象,使用较为方便。

//	范例 2: 直接使用Locale定义的常量对象
package com.xiaoshan.demo;

import java.util.Locale;

public class TestDemo {
   
     
	public static void main(String[] args) throws Exception {
   
     
		Locale loc = Locale.CHINA;     //中文语言环境
		System.out.println(loc);
	}
}

程序执行结果:

zh_CN

此程序直接取得了中文环境,这样就相当于固定好语言环境,而不能随着运行环境进行自动检测。

2️⃣ 利用 ResourceBundle 读取资源文件

资源文件一般都是以"key=value" 的形式保存文本信息,这样在进行信息读取时就可以根据指定的 key 取得对应的 value数据,但是资源文件的文件名称是有要求的,必须以“ *.properties”作为文件后缀。如果要在程序中读取资源文件,则可以利用 java.util.ResourceBundle类完成,此类的常用方法如下表所示。

方法 类型 描述
ResourceBundle getBundle(String baseName) 普通 根据当前默认语言环境,取得资源对象
ResourceBundle getBundle(String baseName, Locale locale) 普通 普通 根据指定的语言环境,取得资源对象
String getString(String key) 普通 根据key取得对应的value数据

下面通过具体的程序操作来为读者演示资源文件的读取操作。

# 范例 3: 定义 com.xiaoshan.demo.Messages.properties 文件
#(注释内容)xiaoshan.info = 更多信息请访问:www.xiaoshan.com
xiaoshan.info =\u66F4\u591A\u8BFE\u7AOB\u8BF7\u8BBF\u95EE\uFF1Ahttps://lst66.blog.csdn.net

资源文件的所在包名称为 “com.xiaoshan.demo", 而文件名称为"Messages.properties”, 由于需要进行编写中文内容,则必须将中文进行转码,具体的内容使用注释标记。

// 范例3: 读取资源文件
package com.xiaoshan.demo;

import java.util.ResourceBundle;

public class TestDemo {
   
     
	public static void main(String[] args) throws Exception{
   
     
		//访问的时候一定不要加上后缀,因为默认找到的后缀就是"*.properties"
		//此时的 Messages.properties 文件一定要放在CLASSPATH 路径下
		ResourceBundle rb = ResourceBundle.getBundle("com.xiaoshan.demo.Messages");
		System.out.println(rb.getString("xiaoshan.info"));
	}
}

程序执行结果:

更多信息请访问:https://lst66.blog.csdn.net

此程序利用 ResourceBundle 类加载 Messages.properties 文件,而在进行加载时只能加载 “*.properties”文件,所以没有编写文件的后缀,而后就可以利用 getString()方法根据资源文件中定义的 key 取得对应的 value 数据。

但是上边范例读取的数据内容在资源文件中都属于固定的内容,用户也可以通过占位符在资源文件中采用动态的内容设置,而这一操作就必须依靠 java.text.MessageFormat 类完成。设置占位符数据方法为:

public static String format(String pattern, Object... arguments);

# 范例 4: 修改com.xiaoshan.demo.Messages.properties 定义
#(注释内容)xiaoshan.info = 更多信息请访问:{
   
     0},讲师:(1}
xiaoshan.info=\u66F4\u591A\u8BFE\u7AOB\u8BF7\u8BBF\u95EE\uFF*A{
   
     0}\uFFOC\u8BB2\u5E08\uFF1A(1)

此时在资源信息中使用“{0}”表示第一个动态文本,使用“{1}”表示第二个动态文本,如果有需要也可以定义更多的动态文本占位符。

//	范例 4: 读取数据并且动态设置内容
package com.xiaoshan.demo;

import java.text.MessageFormat;
import java.util.ResourceBundle;

public class TestDemo{
   
     
	public static void main(String[] args) throws Exception{
   
     
		//访问的时候一定不要加上后缀,因为默认找到的后缀就是"*.properties"
		//此时的Messages.properties文件一定要放在CLASSPATH 路径下
		ResourceBundle rb = ResourceBundle.getBundle("com.xiaoshan.demo.Messages");
		System.out.println(MessageFormat.format(rb.getString("xiaoshan.info"),"https://lst66.blog.csdn.net","小山");  //设置两个占位符的内容
	}
}

程序执行结果:

更多信息请访问: https://lst66.blog.csdn.net,讲师:小山

此程序利用 MessageFormat 类为读取数据中的两个占位符设置了具体的内容。

3️⃣ 多资源读取

掌握了LocaleResourceBundle 类后,就可以利用这两个类的结合实现多资源文件的读取,这些资源文件会根据不同的语言环境(实质上是根据 Locale 对象内容) 读取不同的资源文件。假设要读取的资源信息有两种:中文资源 (com.xiaoshan.demo.Messages_zh_CN.properties)、 英文资源 (com.xiaoshan.demo.Messages_en_US.properties)。

即使定义了多个资源文件(资源文件格式:“文件名称 语言编码 国家编 码.properties”), 在使用 ResourceBundle类读取时依然只会输入文件名称,即只会使用 "com.xiaoshan.demo.Messages"这个名称,而具体的语言编码和国家编码都是由程序自己分辨的。

这样在进行资源文件定义时就有可能有两类资源:公共资源(没有设置语言与国家编码) 和具体的语言资源文件(设置了语言与国家编码)。这样在读取时会优先读取存在具体语言与国家编码的资源文件,如果读取不到则再读取公共资源。

不过在本次讲解中并没有将资源结构类考虑在内,这一种资源定义使用情况也较少,本书不再阐述。

# 范例 5: 定义中文资源文件——com.xiaoshan.demo.Messages_zh_CN.properties
#(注释内容)xiaoshan.info= 更多信息请访问:{
   
     0}
xiaoshan.info=\u66F4\u591A\u8BFE\u7AOB\u8BF7\u8BBF\u95EE\uFF1A{
   
     0}

# 范例 5: 定义英文(英语-美国)资源文件——com.xiaoshan.demo.Messages_en_US.properties
xiaoshan.info = More courses, please click:{
   
     0}

此时两个资源文件定义使用不同的语言进行内容的编写,但是其组成结构相同,都存在一个占位符数据。

国际化程序的实现是一个标准,而在此标准中最为重要的就是资源文件的结构必须相同,不能说一个资源文件内容中只有一个占位符,另外一个同样性质的资源文件内容中就定义有3个占位符,这样的做法是不合理的。

在前面使用JDK手工开发项目时,提示的信息都很晦涩,实际上这就是利用国际化程序实现的。所以对于国际化的操作本身也有其自身的缺点,这一点就需要开发者自己进行取舍 。

//	范例 5: 读取资源文件
package com.xiaoshan.demo;

import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;

public class TestDemo{
   
     
	public static void main(Stringl) args) throws Exception {
   
     
		Locale zhLoc = new Locale("zh","CN");	//中国—中文
		Locale enLoc = new Locale("en","US");	//英语—美国
		ResourceBundle zhRB = ResourceBundle.getBundle( "com.xiaoshan.demo.Messages", zhLoc);	//读取中文资源文件
		ResourceBundle enRB = ResourceBundle.getBundle( "com.xiaoshan.demo.Messages", enLoc);	//读取英文资源文件
		
		//读取资源内容,由于资源本身存在有一个占位符,所以需要设置相应的显示数据
		System.out.println(MessageFormat.format(zhRB.getString("xiaoshan.info"), "https://lst66.blog.csdn.net"));
		System.out.println(MessageFormat.format(enRB.getString("xiaoshan.info"), "https://lst66.blog.csdn.net");
	}
}

程序执行结果:

更多信息请访问: https://lst66.blog.csdn.net
More courses, please click: https://lst66.blog.csdn.net

此程序由于要读取两种不同语言的资源文件,所以准备了两个 Locale 类对象,这样通过 Locale 类对象取得的 ResourceBundle 对象就会自动加载指定语言以及国家的资源文件信息,从而进行内容的读取。

* 总结

在本文中,我们学习了如何使用Locale类来定义语言环境,利用ResourceBundle读取资源文件以及实现多资源读取的方法。国际化是一个重要的技术在今天全球化的世界中。它使得我们能够根据用户的语言和地区设置提供多语言的支持,确保应用程序能够更好地满足不同用户的需求。

通过使用Locale类,我们可以准确地指定语言环境,包括语言和地区信息。这使得我们能够根据用户的偏好设置正确加载适当的资源文件,并提供相应的本地化内容。另外,我们还了解到如何利用ResourceBundle读取资源文件。这使得我们能够轻松地管理和维护各种本地化的字符串、图像等资源。

同时,我们也讨论了多资源读取的方法。通过在资源文件中创建不同的语言和地区的变体,我们可以根据用户的语言偏好自动选择最接近的资源。这种灵活性和自动化机制,使得我们的应用程序能够更加智能地提供本地化的体验。

总的来说,国际化是一个关键的技术,为全球化的应用程序提供了强大的支持。通过使用Locale类定义语言环境、利用ResourceBundle读取资源文件以及实现多资源读取的方法,我们能够提供全球用户所需的本地化体验。这不仅增强了用户满意度,也提高了应用程序的竞争力。


[* ]nbsp_nbsp 2