- 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️⃣ 多资源读取
掌握了Locale
与 ResourceBundle
类后,就可以利用这两个类的结合实现多资源文件的读取,这些资源文件会根据不同的语言环境(实质上是根据 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