国际化是指程序运行时,可根据客户端氢气来自的国家/地区、语言的不同而显示不同的界面。

        引入国际化的目的为了提供自适应、更友好的用户界面,并不需要改变程序的逻辑功能,国际化的单词时Internationalization,简称(I18N).

        Java程序的国际化主要通过如下三个类完成

        1、java.util.ResourceBundle:用于加载国家、语言资源包;

        2、java.util.Locale:用于封装特定的国家/区域、语言环境;

        3、java.text.MessageFormat:用于格式化带占位符的字符串。

        资源文件的内容是很多key-value对,其中key是程序使用的部分,而value则是程序界面的显示字符串。

        资源文件的命名可以有以下三种形式:

        xxx_language_country.properties

        xxx_language.properties

        xxx.properties

        其中xxx是资源文件的基本名,用户可以随意指定;而language和country都不可随意变化,必须是Java所支持的语言和国家。

import java.util.Locale;

/**
* 获取Java所支持的国家和语言
*/
public static void method(){
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所支持的国家/语言环境

国际化与格式化_后端

 下面简述使用资源文件实现程序国际化的步奏

1、创建资源文件mess.properties,文件内容为

hello=你好!
msg=你好,{0}!今天是{1}

2、创建资源文件mess_en_US.properties,文件内容为

hello=Welcome You!
msg=Hello,{0}!Today is {1}

3、使用Java提供的工具native2ascii,生成资源文件mess_zh_CN.properties

        对于包含非西欧字符的资源文件,Java提供了一个工具来处理,native2asii,这个工具在%JAVA_HOME%/bin路径下,该工具的使用语法格式为:

        native2ascii 源资源文件 目的资源文件

在命令窗口输入如下命令:native2ascii mess.properties mess_zh_CN.properties

        通过以上命令,就生成一个mess_zh_CN.properties文件,该文件才是程序需要的资源文件,该文件看上去包含很多乱码,其实是非西欧字符的Unicode编码方式。因此你也可以不使用native2ascii工具,使用在线的Unicode转码工具,将需要的内容转成Unicode编码,写入创建的资源文件即可。但是需要注意的是汉字转Unicode可以使用在线转换工具,如果是非汉字,非西欧字符呢,因此,合理的操作方式还是使用native2ascii工具。这里之所有是使用native2ascii工具生成mee_zh_CN.propertie资源文件,是因为en_US本就是西欧字符,程序是可以读出来的,我们使用native2ascii工具的目的是针对非西欧字符。

        生成的mess_zh_CN.properties内容如下

hello=\u4f60\u597d\uff01
msg=\u4f60\u597d\uff0c{0}!\u4eca\u5929\u662f{1}

4、使用程序取得信息

import java.util.Locale;
import java.util.ResourceBundle;

public static void method(){
//取得系统默认的国家/语言环境
Locale myLocale = Locale.getDefault(Locale.Category.FORMAT);
//根据指定的国家/语言环境加载资源文件
ResourceBundle bundle = ResourceBundle.getBundle("mess",myLocale);
//打印从资源文件中取得的消息
System.out.println(bundle.getString("hello"));
}

        Java程序国际化的关键类是ResourceBundle,它有一个静态方法getBundle(String xxx,Locale locale)。该方法将根据Locale加载资源文件。

5、使用MessageFormat处理包含占位符的字符串

        如上所示msg中使用占位符的。这种情况可以使用MessageFormat来处理。MessageFormat类包含一个静态方法format(String pattern,Object... values),该方法返回后面的多个参数值填充前面的pattern字符串,其中pattern字符串不是正则表达式,而是一个带占位符的字符串。以上述资源文件中的msg为例,代码如下,注意理解最后System.out.println(MessageFormat.format(msg,"smile",new Date()));

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

public static void method(String[] args){
//定义一个Locale变量
Locale currentLocale = null;
//如果运行程序指定了两个参数
if (args.length == 2){
//使用运行程序的两个参数构造Locale实例
currentLocale = new Locale(args[0],args[1]);
}else {
//否则直接使用系统默认的Locale
currentLocale = Locale.getDefault(Locale.Category.FORMAT);
}
//根据Locale加载语言资源
ResourceBundle bundle = ResourceBundle.getBundle("mess",currentLocale);
//取得已加载的语言资源文件中msg对应消息
String msg = bundle.getString("msg");
//使用MessageFormat为带占位符的字符串传入参数
System.out.println(MessageFormat.format(msg,"smile",new Date()));
}