1. Java国际化简介
Java既然作为一个跨平台的语言就必然要在各种不同的语言环境中使用, 为了解决这个问题Java给我们提供了一个工具类ResourceBundle, 帮助我们实现Java的国际化, 核心的思想就是, 对不同的语言提供一个不同的资源文件。
Java国际化主要通过3个类完成
- java.util.ResourceBundle:用于加载一个资源包。
- java.util.Locale:对应一个特定的国家/区域、语言环境。
- java.text.MessageFormat:用于将消息格式化。
国际化资源文件
为实现程序的国际化,必须提供程序所需要的资源文件。资源文件的内容由key-value对组成。
定义资源文件的规范
如果我们将缺省的资源文件的文件名取名为message.properties,那么相应的其他语言的资源文件名就是message_语言代码_国家代码.properties。例如:我们的语言汉语的语言代码是zh,国家代码是CN,所以简体中文的资源文件名就是:message_zh_CN.properties,英语的语言代码是en,美国的国家代码是US,所以美国英语的资源文件就是: message_en_US.properties。
资源文件的命名可以有3种格式: 1、message_language_country.properties
2、message_language.properties
3、message_properties
Locale类可获取各国区域环境(如:Locale.ENGLISH、Locale.CHINESE,这些常量返回一个Locale实例),也可以获取当前系统所使用的区域语言环境。
ResourceBundle类可根据指定参数获取相应的资源,常用方法如下
ResourceBundle.getBundle(message)//获取当前系统所使用的区域环境获得指定资源文件
ResourceBundle.getBundle(message,locale)//根据指定的区域获取对应的资源文件
若资源文件包含非西方字符,则需要用JDK自带的工具来处理:native2ascii。
语言环境
在 Java 语言中,语言环境(locale)仅仅是一个标识符,而不是一组本地化的属性。java.util.Locale 类的一个实例表示一个特定的地理政治区域,使用表示语言、区域以及国家或地区的参数创建。每个与语言环境相关的类都维护着它自己的一组本地化属性,并且确定如何对含有 Locale 参数的方法请求做出响应。
Java支持的语言和国家
若要获取Java所支持的语言和国家,可调用Locale类的getAvailableLocale方法获取,该方法返回一个Locale数组,该数组里包含了java所支持的语言和国家。java代码如下:
public static void main(String[] args) {
Locale[] localeList = Locale.getAvailableLocales();
for (int i = 0; i < localeList.length; i++) {
System.out.println(localeList[i].getDisplayCountry() + "="
+ localeList[i].getCountry() + " "
+ localeList[i].getDisplayLanguage() + "="
+ localeList[i].getLanguage());
}
}
JAVA国际化流程
ResourceBundle根据Locale加载资源文件 -> 返回一个ResourceBundle实例 -> ResourceBundle调用 getString()返回指定key对应的字符串。
带占位符的消息
若要输出的消息中必须包含动态的内容,这些内容必须是从程序中获取的,可利用带占位符的国际化资源文件来实现。
MessageFormat.format()
import java.text.MessageFormat;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;
/**
* 演示Java的国际化
*
* @author Abu
*
*/
public class ParamFormat {
/**
* @param args
*/
public static void main(String[] args) {
// 测试美国英语的资源文件
testDefault();
// 测试缺省的资源文件
testCustom();
}
public static void testDefault() {
// 获得缺省的系统区域
Locale locale = Locale.getDefault();
// 获得资源文件
ResourceBundle rb = ResourceBundle.getBundle("message", locale);
// 获得相应的key值
String greeting = rb.getString("greeting");
String userInfo = rb.getString("userinfo");
String name = "liky";
int age = 18;
Date birth = new Date();
// 格式化参数,注意是一个Object的数组,这意味着可以将任何类型的对象来格式化模板.
Object[] params = { name, age, birth };
// 格式化参数,返回格式后的字符串
String result = MessageFormat.format(userInfo, params);
System.err.println(greeting + result);
}
public static void testCustom() {
// 设置定制的语言国家代码
Locale locale = new Locale("en_US");
// 获得资源文件
ResourceBundle rb = ResourceBundle.getBundle("message", locale);
// 获得相应的key值
String greeting = rb.getString("greeting");
String userInfo = rb.getString("userinfo");
String name = "liky";
int age = 18;
Date birth = new Date();
// 格式化参数,注意是一个Object的数组,这意味着可以将任何类型的对象来格式化模板.
Object[] params = { name, age, birth };
// 格式化参数,返回格式后的字符串
String result = MessageFormat.format(userInfo, params);
System.err.println(greeting + result);
}
}
在 src 目录下创建两个文件:
1、message.properties
greeting=\u4f60\u597d\uff0c
userinfo=\u540d\u5b57\uff1a{0}\uff0c\u5e74\u9f84\uff1a{1}\uff0c\u751f\u65e5\uff1a{2}\u3002
2、message_en_US.properties
greeting=Hello,
userinfo=name: {0}, age: {1}, birthday: {2}.
打印结果:
你好,名字:liky,年龄:18,生日:13-2-23 下午4:26。
Hello, name: liky, age: 18, birthday: 13-2-23 下午4:26.