Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
有几种方法可以创建 Locale 对象。无论使用何种技术,创建都可以像指定语言代码一样简单。但是,你可以通过设置区域(也称为“国家/地区”)和变体代码来进一步区分语言环境。如果你使用的是 JDK 7 或更高版本,则还可以指定脚本代码和 Unicode 语言环境扩展。
创建 Locale 对象的四种方法是:
Locale.Builder 类和 forLanguageTag 方法。
LocaleBuilder 类Locale.Builder 实用程序类可用于构造符合 IETF BCP 47 语法的 Locale 对象。例如,要指定法语和加拿大的国家/地区,可以调用 Locale.Builder 构造函数,然后按如下方式链接 setter 方法:
Locale aLocale = new Locale.Builder().setLanguage("fr").setRegion("CA").build();
下一个示例为美国和英国的英语创建 Locale 对象:
Locale bLocale = new Locale.Builder().setLanguage("en").setRegion("US").build();
Locale cLocale = new Locale.Builder().setLanguage("en").setRegion("GB").build();
最后一个示例为俄语创建 Locale 对象:
Locale dLocale = new Locale.Builder().setLanguage("ru").setScript("Cyrl").build();
Locale 构造函数Locale 类中有三个构造函数可用于创建 Locale 对象:
Locale(String language)Locale(String language, String country)Locale(String language, String country, String variant)以下示例为加拿大的法语,美国和英国的英语以及俄语创建 Locale 对象。
aLocale = new Locale("fr", "CA");
bLocale = new Locale("en", "US");
cLocale = new Locale("en", "GB");
dLocale = new Locale("ru");
在 JDK 7 之前的版本中,无法在 Locale 对象上设置脚本代码。
forLanguageTag 工厂方法如果你的语言标记字符串符合 IETF BCP 47 标准,则可以使用 Java SE 7 发行版中引入的 forLanguageTag(String) 工厂方法。例如:
Locale aLocale = Locale.forLanguageTag("en-US");
Locale bLocale = Locale.forLanguageTag("ja-JP-u-ca-japanese");
Locale 常量为方便起见,Locale 类为某些语言和国家/地区提供了 常量。例如:
cLocale = Locale.JAPAN; dLocale = Locale.CANADA_FRENCH;
指定语言常量时,Locale 的区域部分未定义。接下来的三个语句创建等效的 Locale 对象:
j1Locale = Locale.JAPANESE;
j2Locale = new Locale.Builder().setLanguage("ja").build();
j3Locale = new Locale("ja");
由以下三个语句创建的 Locale 对象也是等效的:
j4Locale = Locale.JAPAN;
j5Locale = new Locale.Builder().setLanguage("ja").setRegion("JP").build();
j6Locale = new Locale("ja", "JP");
以下部分讨论语言代码和可选脚本,区域和变体代码。
语言代码是符合 ISO 639 标准的两个或三个小写字母。你可以在 http://www.loc.gov/standards/iso639-2/php/code_list.php 找到 ISO 639 代码的完整列表。
下表列出了一些语言代码。
| 语言代码 | 描述 | 
|---|---|
| de | German | 
| en | English | 
| fr | French | 
| ru | Russian | 
| ja | Japanese | 
| jv | Javanese | 
| ko | Korean | 
| zh | Chinese | 
脚本代码以大写字母开头,后跟三个小写字母,符合 ISO 15924 标准。你可以在 http://unicode.org/iso15924/iso15924-codes.html 找到 ISO 15924 代码的完整列表。
下表列出了一些脚本代码。
| 脚本代码 | 描述 | 
|---|---|
| Arab | Arabic | 
| Cyrl | Cyrillic | 
| Kana | Katakana | 
| Latn | Latin | 
获取 Locale 的脚本信息有三种方法:
getScript()返回 Locale 对象的 4 个字母的脚本代码。如果没有为语言环境定义脚本,则返回空字符串。getDisplayScript()返回适合显示给用户的语言环境脚本的名称。如果可能,将为默认语言环境本地化名称。因此,例如,如果脚本代码是“Latin”,则返回的显示脚本名称将是英语语言环境的字符串“Latin”。getDisplayScript(Locale)如果可能,返回本地化的指定 Locale 的显示名称。区域(国家/地区)代码包含符合 ISO 3166 标准的两个或三个大写字母,或符合 UN M.49 标准的三个数字。可以在 http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html 找到代码的副本。
下表包含几个示例国家和地区代码。
| A-2 Code | A-3 Code | Numeric Code | 描述 | 
|---|---|---|---|
| AU | AUS | 036 | Australia | 
| BR | BRA | 076 | Brazil | 
| CA | CAN | 124 | Canada | 
| CN | CHN | 156 | China | 
| DE | DEU | 276 | Germany | 
| FR | FRA | 250 | France | 
| IN | IND | 356 | India | 
| RU | RUS | 643 | Russian Federation | 
| US | USA | 840 | United States | 
可选的 variant 代码可用于进一步区分 Locale。例如,变体代码可用于指示区域代码未涵盖的辩证差异。
从符合 IETF BCP 47 标准的 Java SE 7 版本开始,变体代码专门用于指示定义语言或其方言的其他变体。IETF BCP 47 标准对变体子标签强加了语法限制。你可以在 http://www.iana.org/assignments/language-subtag-registry 上查看变体代码列表(搜索 variant)。
例如,Java SE 使用变体代码来支持泰语。按照规范,NumberFormat 对象用于 th 和 th_TH 语言环境的将使用常见的阿拉伯数字形状,或阿拉伯数字来格式化泰语数字。但是,th_TH_TH 语言环境的 NumberFormat 使用泰国数字形状。ThaiDigits.java 的片段演示了这一点:
String outputString = new String();
Locale[] thaiLocale = {
             new Locale("th"),
             new Locale("th", "TH"),
             new Locale("th", "TH", "TH")
         };
for (Locale locale : thaiLocale) {
    NumberFormat nf = NumberFormat.getNumberInstance(locale);
    outputString = outputString + locale.toString() + ": ";
    outputString = outputString + nf.format(573.34) + "\n";
}
以下是此示例的屏幕截图:
