创建语言环境

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

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

Version Note:

Java SE 7 发行版中添加了Locale.Builder类和forLanguageTag方法。

LocaleBuilder Class

Locale.BuilderUtil 类可用于构造符合 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 Constructors

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 标准,则可以使用forLanguageTag(String)工厂方法,该方法是 Java SE 7 发行版中引入的。例如:

Locale aLocale = Locale.forLanguageTag("en-US");
Locale bLocale = Locale.forLanguageTag("ja-JP-u-ca-japanese");

Locale Constants

为方便起见,Locale类为某些语言和国家/地区提供了constants。例如:

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");

Codes

以下各节讨论语言代码以及可选的脚本,区域和变体代码。

Language Code

语言代码是符合 ISO 639 标准的两个或三个小写字母。您可以在http://www.loc.gov/standards/iso639-2/php/code_list.php找到 ISO 639 代码的完整列表。

下表列出了一些语言代码。

samples 语言代码

Language CodeDescription
deGerman
enEnglish
frFrench
ruRussian
jaJapanese
jvJavanese
koKorean
zhChinese

Script Code

脚本代码以大写字母开头,后跟三个小写字母,并符合 ISO 15924 标准。您可以在http://unicode.org/iso15924/iso15924-codes.html找到 ISO 15924 代码的完整列表。

下表列出了一些脚本代码。

示例脚本代码

Script CodeDescription
ArabArabic
CyrlCyrillic
KanaKatakana
LatnLatin

有三种方法可检索Locale的脚本信息:

  • getScript() –返回Locale对象的 4 个字母的脚本代码。如果没有为语言环境定义脚本,则返回一个空字符串。

  • getDisplayScript() –返回适合显示给用户的语言环境脚本的名称。如果可能,该名称将被本地化为默认语言环境。因此,例如,如果脚本代码为“ Latn”,则对于英语语言环境,返回的 diplay 脚本名称将为字符串“ Latin”。

  • getDisplayScript(Locale) –如果可能的话,返回指定的Locale本地化的显示名称。

Region Code

地区(国家/地区)代码由符合 ISO 3166 标准的两个或三个大写字母或符合 UN M.49 标准的三个数字组成。可以在http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html找到代码的副本。

下表包含几个示例国家和地区代码。

samples 地区代码

A-2 CodeA-3 CodeNumeric CodeDescription
AUAUS036Australia
BRBRA076Brazil
CACAN124Canada
CNCHN156China
DEDEU276Germany
FRFRA250France
ININD356India
RURUS643Russian Federation
USUSA840United States

Variant Code

可选的variant代码可用于进一步区分Locale。例如,变体代码可用于指示区域代码未涵盖的辩证差异。

Version Note:

在 Java SE 7 发行版之前,有时会使用变体代码来识别并非特定于语言或地区的差异。例如,它可能已被用来识别 Windows 或 UNIX 等计算平台之间的差异。根据 IETF BCP 47 标准,不建议使用此方法。

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

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

例如,Java SE 使用变体代码来支持泰语。按照约定,用于thth_TH语言环境的NumberFormat对象将使用常见的阿拉伯数字形状或阿拉伯数字来格式化泰文数字。但是,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";
}

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

Sample ThaiDigits.java 的屏幕截图