8.2.1 Locale类
一个Locale对象实例描述一个特定的地理、政治或文化上区域。下面介绍创建Locale对象实例的几种方法、Locale类的静态方法以及Locale类的其他方法。
1. 创建Locale对象实例的方法
Locale类在java.util包中。JDK提供了多种方式来创建Locale对象,其中包括使用Locale类的构造方法、Locale类中的常量以及getDefault方法。
(1)使用Locale类的构造方法创建Locale对象实例
Locale类的构造方法有三个重载形式,它们的定义如下:
public Locale(String language)
public Locale(String language, String country)
public Locale(String language, String country, String variant)
这三个重载形式的参数含义如下:
l language:该参数表示ISO语言代码,该语言代码必须是在ISO-639标准中定义的两个小写字母的代码。如“zh”表示中文,“en”表示英语。
2 country:该参数表示ISO国家代码,该国家代码必须是在ISO-3166标准中定义的两个大写字母的代码。如“CN”表示中国,“US”表示美国。
3 variant:该参数是预留给第三方软件开发商或浏览器使用的一个变量,可以用来进行更细的划分。如通过language和country参数可以精确到使用某种语言的国家或地区,而如果还想继续细分,就需要使用variant参数,例如,要划分某个地区的不同时代,可以将variant参数值设为“ERA1”、“ERA2”,如果要设置多个值,中间可以使用下画线将多个值分开,如“ERA1_EAST”、“ERA2_SOUTH”。
Locale对象并不会验证语言、国家代码的正确性,也不会进行任何国际化的操作。Locale对象只是封装了语言、国家以及其他相关的信息。关于验证和国际化的工作,将由其他的类来完成,但要为这些类提供Locale对象。
读者可以根据需要选择使用上面三个重载形式中的一个或多个来创建Locale对象。如只想对语言进行划分,可以使用第一种重载形式,代码如下:
Locale locale1 = new Locale("zh");
Locale locale2 = new Locale("en");
如果想再细分一下,如对语言和国家进行划分,可以使用第二种重载形式,代码如下:
Locale locale1 = new Locale("zh", "CN");
Locale locale2 = new Locale("en", "US");
其中“zh”、“en”为语言(language参数),“CN”、“US”为国家(country参数)。读者还可以通过如下的四种方法来查找相应的语言和国家代码:
l 从JDK1.5或JDK1.6帮助文档的国际化部分查找相应的语言和国家
JDK1.5帮助文档的国际化部分的地址如下:
http://java.sun.com/j2se/1.5.0/docs/guide/intl/locale.doc.html
JDK1.6帮助文档的国际化部分的地址如下:
http://java.sun.com/javase/6/docs/technotes/guides/intl/locale.doc.html
l 从ISO标准中查找相应的语言和国家代码
语言代码的ISO标准是ISO-639,地址如下:
http://www.w3.org/WAI/ER/IG/ert/iso639.htm
国家代码的ISO标签是ISO-3166,地址如下:
http://www.iso.org/iso/country_codes/iso_3166_code_lists/english_country_names_and_code_elements.htm
在Internet上有很多网站都提供了ISO-639和ISO-3166的详细内容,读者可以在www.google.com中自行查找这两个ISO标准的具体细节。
l 使用Locale类的静态方法获得语言和国家的代码
Locale类有两个静态方法:getISOLanguages和getISOCountries,其中getISOlanguages方法用来返回包含ISO-639标准定义的所有语言代码的String数组,getISOCountries方法用来返回包含ISO-3166标准定义的所有国家代码的String数组。
2 通过IE或Firefox浏览器查找相应的语言和国家代码
对于IE浏览器,读者可以单击【工具】>【Internet选项】菜单,打开【Internet选项】对话框,在【常规】页中单击【语言】按钮,打开【语言首选项】对话框,单击【添加】按钮,打开【添加语言】对话框,如图8.3所示。
图8.3 【添加语言】对话框
从图8.3所示的【添加语言】对话框中可以通过浏览“语言”列表的方式来查找相应的语言和国家代码。
对于Firefox浏览器,读者可以单击【工具】>【选项】菜单,打开【选项】对话框,进入【内容】页,单击【选择】按钮,打开【语言和字符编码】对话框,如图8.4所示。
图8.4 【语言和字符编码】对话框
从图8.4所示的【语言和字符编码】对话框下方的列表框中可以查找相应的语言和国家代码。
如果由于特殊要求或使用第三方软件,需要继续细分的话,可以使用Locale类的构造方法的第三种重载形式,代码如下:
Locale locale = new Locale("zh", "CN", "ERA_EAST");
对于第三种重载形式的variant参数的取值要根据具体的要求而定,一般需要第三个参数的软件都会有相应的取值说明。
(2)Locale类的常量
由于使用Locale类的构造方法创建Locale对象实例需要提供语言和国家代码,用起来比较麻烦,因此,Locale类提供了一些常量,可以通过这些常量创建比较常用的Locale对象实例。下面是Locale类的部分用于创建Locale对象实例的常量和语言、国家的对应关系:
l CHINESE,该常量相当于new Locale("zh")。
2 SIMPLIFIED_CHINESE:该常量相当于new Locale("zh", "CN")。也可以使用CHINA或PRC常量来代替SIMPLIFIED_CHINESE。
3 ENGLISH:该常量相当于new Locale("en")。
4 US:该常量相当于new Locale("en", "US")。
5 CANADA:该常量相当于new Locale("en", "CA")。
关于Locale类的其他用于创建Locale对象实例的常量的具体细节,读者可以直接查看Locale类的源代码。
(3)使用getDefault方法
getDefault方法是Locale类的静态方法。该方法返回代表操作系统当前设置的本地信息的Locale对象实例。可以通过图8.1所示的【区域和语言选项】对话框来设置操作系统当前的本地信息。除此之外,在JDK1.5和JDK1.6中可以通过两组Java虚拟机参数设置默认的本地信息。这两组Java虚拟机参数如下:
l user.language、user.country和user.variant
可以使用如下的命令来设置这三个Java虚拟机参数:
java -Duser.language=en -Duser.country=US -Duser.variant=EAST TestLocale
使用上面的命令运行TestLocale程序后,getLocale方法返回的Locale对象所表示的language、country和variant分别为“en”、“US”和“EAST”。
2 user.language和user.region
本组Java虚拟机参数中的user.language用来设置语言,而user.region参数可以用来设置国家和variant,如果user.region参数值中包含variant,则country和variant之间用下划线分隔。如下面的命令如示:
java -Duser.language=en -Duser.region=US_EAST TestLocale
除此之外,还可以通过Locale类的静态方法setDefault设置JDK的默认Locale对象实例。setDefault方法的定义如下:
public static synchronized void setDefault(Locale newLocale)
(4)使用getAvaliableLocales方法
getAvaliableLocales是Locale类的静态方法,该方法返回一个Locale对象数组。表示当前JDK版本支持的所有本地信息对应的Locale对象。除了Locale类有getAvaliableLocales方法外,一些和本地化相关的类也有getAvaliableLocales方法,如可以使用java.textDate.Format类和java.text.NumberFormat类中的getAvaliableLocales方法返回它们所支持的所有本地信息对应的Locale对象。
2. Locale类的其他方法
Locale类定义了一些方法来返回一个Locale对象所对应的本地信息,这些方法如下:
l getLanguage:该方法返回Locale对象的ISO-639语言代码。
2 getCountry:该方法返回Locale对象的ISO-3166国家代码。
3 getVariant:该方法返回Locale对象的variant代码。
4 getDisplayLanguage:该方法返回Locale对象要显示给用户的语言名称。
5 getDisplayCountry:该方法返回Locale对象要显示给用户的国家名称。
6 getDisplayVariant:该方法返回Locale对象要显示给用户的variant名称。
7 getDisplayName:该方法返回Locale对象的显示名称。
要注意的是,所有的getDisplayXxx方法都有两个重载形式。第一种重载形式根据操作系统当前设置的本地信息决定返回的信息。第二个重载形式需要传入一个Locale对象,并根据该Locale对象表示的本地信息决定返回的信息,如下面的代码所示:
// 表示中文的Locale对象
java.util.Locale locale1 = new java.util.Locale("zh");
// 表示英语的Locale对象
java.util.Locale locale2 = new java.util.Locale("en");
// 表示希腊语的Locale对象
java.util.Locale locale3 = new java.util.Locale("el");
// 表示朝鲜语的Locale对象
java.util.Locale locale4 = new java.util.Locale("ko");
// 将JDK的默认本地信息设为表示希腊语的Locale对象
java.util.Locale.setDefault(locale3);
// 分别以上面四种语言输出“希腊文”
String language1 = java.util.Locale.getDefault().getDisplayLanguage(locale1);
String language2 = java.util.Locale.getDefault().getDisplayLanguage(locale2);
String language3 = java.util.Locale.getDefault().getDisplayLanguage(locale3);
String language4 = java.util.Locale.getDefault().getDisplayLanguage(locale4);
System.out.println(language1);
System.out.println(language2);
System.out.println(language3);
System.out.println(language4);
上面的代码使用了四种语言(中文、英语、希腊语和朝鲜语)输出“希腊文”。输出信息如下:
希腊文
Greek
Ελληνικά
그리스어
通过getDisplayXxx方法的第二种重载形式并不能返回所有语言的相应信息,如果Locale对象所表示的本地信息没有和其对应的语言,则使用英语返回信息,如下面的代码所示:
// 表示阿拉伯语的Locale对象
java.util.Locale locale = new java.util.Locale("ar");
String language = java.util.Locale.getDefault().getDisplayLanguage(locale);
System.out.println(language);
由于JDK不支持将“中文”翻译成阿拉伯语,因此,上面的代码将输出如下的信息:
Chinese