文档

Java™ 教程-Java Tutorials 中文版
创建语言环境
Trail: Internationalization
Lesson: Setting the Locale

创建语言环境

有几种方法可以创建 Locale 对象。无论使用何种技术,创建都可以像指定语言代码一样简单。但是,你可以通过设置区域(也称为“国家/地区”)和变体代码来进一步区分语言环境。如果你使用的是 JDK 7 或更高版本,则还可以指定脚本代码和 Unicode 语言环境扩展。

创建 Locale 对象的四种方法是:


版本说明: 在 Java SE 7 发行版中添加了 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 对象。

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 的脚本信息有三种方法:

区域代码

区域(国家/地区)代码包含符合 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。例如,变体代码可用于指示区域代码未涵盖的辩证差异。


版本说明: 在 Java SE 7 发行版之前,变体代码有时用于识别不是特定于语言或区域的差异。例如,它可能已被用于识别计算平台之间的差异,例如 Windows 或 UNIX。根据 IETF BCP 47 标准,不鼓励这种使用。

要定义与你的环境相关的非语言特定变体,请使用扩展机制,如 BCP 47 Extensions 中所述。

从符合 IETF BCP 47 标准的 Java SE 7 版本开始,变体代码专门用于指示定义语言或其方言的其他变体。IETF BCP 47 标准对变体子标签强加了语法限制。你可以在 http://www.iana.org/assignments/language-subtag-registry 上查看变体代码列表(搜索 variant)。

例如,Java SE 使用变体代码来支持泰语。按照规范,NumberFormat 对象用于 thth_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";
}

以下是此示例的屏幕截图:

ThaiDigits.java 示例的屏幕截图

Previous page: Setting the Locale
Next page: BCP 47 Extensions