模块 java.base
 java.util

类 Locale

java.lang.Object
java.util.Locale
所有已实现的接口:
Serializable , Cloneable

public final class Locale extends Object implements Cloneable , Serializable
Locale 对象表示特定的地理、政治或文化区域。需要 Locale 执行其任务的操作称为 locale-sensitive,并使用 Locale 为用户定制信息。例如,显示数字是一种区域设置敏感操作——数字的格式应根据用户所在国家、地区或文化的习惯和惯例。

Locale 类实现 IETF BCP 47,它由 RFC 4647“语言标签的匹配”RFC 5646 “识别语言的标签” 组成,支持 LDML(UTS#35,“Unicode 区域设置数据标记语言”)BCP 47 兼容扩展,用于区域设置数据交换。

Locale 对象在逻辑上由以下描述的字段组成。

语言
ISO 639 alpha-2 或 alpha-3 语言代码,或最多 8 个字母的注册语言子标签(用于将来的增强)。当一种语言同时具有 alpha-2 代码和 alpha-3 代码时,必须使用 alpha-2 代码。您可以在 IANA 语言子标签注册表中找到有效语言代码的完整列表(搜索“类型:语言”)。语言字段不区分大小写,但 Locale 始终规范化为小写。
格式正确的语言值具有 [a-zA-Z]{2,8} 形式。请注意,这不是完整的 BCP47 语言生成,因为它不包括 extlang。不需要它们,因为现代三字母语言代码取代了它们。
示例:“en”(英语)、“ja”(日语)、“kok”(孔卡尼语)
脚本
ISO 15924 alpha-4 脚本代码。您可以在 IANA 语言子标签注册表中找到有效脚本代码的完整列表(搜索“类型:脚本”)。脚本字段不区分大小写,但 Locale 始终规范化为标题大小写(第一个字母大写,其余字母小写)。
格式正确的脚本值的格式为 [a-zA-Z]{4}
示例:“Latn”(拉丁文)、“Cyrl”(西里尔文)
国家(地区)
ISO 3166 alpha-2 国家代码或 UN M.49 numeric-3 地区代码。您可以在 IANA 语言子标签注册表中找到有效国家和地区代码的完整列表(搜索“类型:地区”)。国家(地区)字段不区分大小写,但Locale总是规范化为大写。
格式正确的国家/地区值的格式为 [a-zA-Z]{2} | [0-9]{3}
示例:“US”(美国)、“FR”(法国)、“029”(加勒比海)
variant
用于指示 Locale 变体的任意值。如果有两个或多个变体值,每个变体值都表示自己的语义,则这些值应按重要性排序,最重要的在前,并用下划线('_')分隔。变体字段区分大小写。
注意:IETF BCP 47 对变体子标签进行语法限制。此外,BCP 47 子标签严格用于指示定义语言或其方言的其他变体,这些变体未被任何语言、脚本和区域子标签的组合所涵盖。您可以在 IANA 语言子标签注册表中找到有效变体代码的完整列表(搜索“类型:变体”)。

然而,Locale 中的变体字段在历史上一直用于任何类型的变体,而不仅仅是语言变体。例如,Java SE 运行时环境中可用的一些受支持变体表示替代文化行为,例如日历类型或数字脚本。在 BCP 47 中,这种不识别语言的信息由扩展子标签或私人使用子标签支持。

格式正确的变体值的形式为 SUBTAG (('_'|'-') SUBTAG)* where SUBTAG = [0-9][0-9a-zA-Z]{3} | [0-9a-zA-Z]{5,8} 。 (注意:BCP 47 只使用连字符('-')作为分隔符,这样比较宽松)。
示例:“polyton”(希腊语 Polytonic)、“POSIX”
扩展名
从单个字符键到字符串值的映射,指示除语言识别之外的扩展。 Locale 中的扩展实现了 BCP 47 扩展子标签和专用子标签的语义和语法。扩展不区分大小写,但 Locale 将所有扩展键和值规范化为小写。请注意,扩展名不能有空值。
格式正确的键是集合 [0-9a-zA-Z] 中的单个字符。格式正确的值的格式为 SUBTAG ('-' SUBTAG)*,其中对于键 'x' 为 SUBTAG = [0-9a-zA-Z]{1,8},对于其他键为 SUBTAG = [0-9a-zA-Z]{2,8}(即,'x' 允许单字符子标签)。
示例:key="u"/value="ca-japanese"(日本日历),key="x"/value="java-1-7"
笔记:尽管 BCP 47 要求在 IANA 语言子标签注册表中注册字段值,但 Locale 类不提供任何验证功能。 Builder 仅检查单个字段是否满足语法要求(格式正确),但不验证值本身。有关详细信息,请参阅 Locale.Builder

Unicode locale/语言扩展

UTS#35,“Unicode Locale Data Markup Language”定义了可选的属性和关键字来重写或改进与区域相关的默认行为。关键字由一对键和类型表示。例如,“nu-thai”表示应该使用泰国本地数字(值:“thai”)来格式化数字(key:“nu”)。

使用扩展键“u”(UNICODE_LOCALE_EXTENSION )将关键字映射到 BCP 47 扩展值。上面的例子“nu-thai”变成了扩展名“u-nu-thai”。

因此,当 Locale 对象包含 Unicode locale属性和关键字时,getExtension(UNICODE_LOCALE_EXTENSION) 将返回表示此信息的字符串,例如“nu-thai”。 Locale 类还提供了 getUnicodeLocaleAttributes() getUnicodeLocaleKeys() getUnicodeLocaleType(java.lang.String) ,它们允许您直接访问 Unicode locale属性和键/类型对。当表示为字符串时,Unicode Locale Extension 按字母顺序列出属性,然后是键/类型序列,其中键按字母顺序列出(在定义类型时,包含键类型的子标签的顺序是固定的)

格式正确的区域设置键的格式为 [0-9a-zA-Z]{2} 。格式正确的locale类型具有 "" | [0-9a-zA-Z]{3,8} ('-' [0-9a-zA-Z]{3,8})* 形式(它可以是空的,或者是一系列长度为 3-8 个字母数字的子标签)。格式正确的locale属性具有 [0-9a-zA-Z]{3,8} 形式(它是与locale类型子标签具有相同形式的单个子标签)。

Unicode locale扩展指定locale敏感服务中的可选行为。尽管 LDML 规范定义了各种键和值,但 Java 运行时环境中实际的locale敏感服务实现可能不支持任何特定的 Unicode locale属性或键/类型对。

创建locale

创建 Locale 对象有多种不同的方法。

建设者

使用 Locale.Builder 您可以构造一个符合 BCP 47 语法的 Locale 对象。

构造方法

Locale 类提供了三个构造函数:

   Locale(String language) 
   Locale(String language, String country) 
   Locale(String language, String country, String variant) 
 
这些构造函数允许您创建具有语言、国家/地区和变体的 Locale 对象,但不能指定脚本或扩展名。

工厂方法

方法 forLanguageTag(java.lang.String) 为格式良好的 BCP 47 语言标记创建一个 Locale 对象。

Locale 常量

Locale 类提供了许多方便的常量,您可以使用它们为常用区域设置创建 Locale 对象。例如,以下代码为美国创建一个 Locale 对象:

   Locale.US
 

locale匹配

如果一个应用程序或系统是国际化的,并为多个locale提供本地化资源,它有时需要找到一个或多个符合每个用户特定偏好的locale(或语言标签)。请注意,在此locale匹配文档中,术语“语言标签”可与“locale”互换使用。

为了将用户的首选区域设置与一组语言标签进行匹配,RFC 4647 语言标签匹配 定义了两种机制:过滤和查找。 Filtering 用于获取所有匹配的语言环境,而 lookup 用于选择最佳匹配的语言环境。匹配不区分大小写。以下各节描述了这些匹配机制。

用户的偏好称为Language Priority List,并表示为语言范围列表。在句法上有两种类型的语言范围:基本和扩展。有关详细信息,请参阅 Locale.LanguageRange

过滤

过滤操作返回所有匹配的语言标签。它在 RFC 4647 中定义如下:“在过滤中,每个语言范围代表可接受匹配的最不具体的语言标签(即子标签数量最少的语言标签)。匹配集中的所有语言标签标签的子标签数量将等于或大于语言范围。语言范围内的每个非通配符子标签都将出现在每个匹配的语言标签中。”

有两种类型的过滤:针对基本语言范围的过滤(称为“基本过滤”)和针对扩展语言范围的过滤(称为“扩展过滤”)。它们可能会根据给定语言优先级列表中包含何种语言范围而返回不同的结果。 Locale.FilteringMode 是指定如何进行过滤的参数。

Lookup

查找操作返回最匹配的语言标签。它在 RFC 4647 中定义如下:“与过滤相比,每个语言范围代表可接受匹配的最具体的标签。根据用户的优先级,找到的第一个匹配标签被认为是最接近的匹配项,并且是项目回。”

例如,如果语言优先级列表包含两个语言范围,"zh-Hant-TW""en-US",按优先顺序排列,查找方法会逐步搜索下面的语言标签,以找到最匹配的语言标签。

  1. zh-Hant-TW
  2. zh-Hant
  3. zh
  4. en-US
  5. en
 
如果存在与上述语言范围完全匹配的语言标签,则返回该语言标签。

"*" 为特殊语言范围,查找时忽略。

如果由于子标签 '*' 包含在语言范围内而导致多个语言标签匹配,则 Iterator Collection 语言标签上返回的第一个匹配语言标签将被视为最佳匹配语言标签。

Locale的使用

创建Locale后,您可以查询它以获取有关其自身的信息。使用 getCountry 获取国家(或地区)代码,使用 getLanguage 获取语言代码。您可以使用 getDisplayCountry 获取适合向用户显示的国家/地区名称。同样,您可以使用getDisplayLanguage来获取适合向用户显示的语言的名称。有趣的是, getDisplayXXX 方法本身是区域设置敏感的,并且有两个版本:一种使用默认的 DISPLAY 区域设置,另一种使用指定为参数的区域设置。

Java 平台提供了许多执行区域设置敏感操作的类。例如,NumberFormat 类以区域设置敏感的方式格式化数字、货币和百分比。 NumberFormat 等类有几个方便的方法来创建该类型的默认对象。例如,NumberFormat 类提供了这三种用于创建默认 NumberFormat 对象的便捷方法:

   NumberFormat.getInstance()
   NumberFormat.getCurrencyInstance()
   NumberFormat.getPercentInstance()
 
这些方法中的每一种都有两种变体;一个有明确的locale,一个没有;后者使用默认的 FORMAT locale:
   NumberFormat.getInstance(myLocale)
   NumberFormat.getCurrencyInstance(myLocale)
   NumberFormat.getPercentInstance(myLocale)
 
Locale 是用于识别您想要获取的对象类型 (NumberFormat) 的机制。locale是 just 一种识别对象的机制, not 是对象本身的容器。

兼容性

为了保持与现有用法的兼容性,Locale 的构造函数保留了 Java 运行时环境版本 1.7 之前的行为。 toString 方法基本上也是如此。因此 Locale 对象可以继续按原样使用。特别是,将 toString 的输出解析为语言、国家/地区和变体字段的客户端可以继续这样做(尽管强烈建议不要这样做),尽管如果存在脚本或扩展,变体字段将包含附加信息。

此外,BCP 47 强加了 Locale 的构造函数没有强加的语法限制。这意味着某些 Locales 和 BCP 47 语言标签之间的转换不能在不丢失信息的情况下进行。因此 toLanguageTag 不能表示其语言、国家或变体不符合 BCP 47 的locale的状态。

由于这些问题,建议客户远离构建不符合要求的locale,而改用 forLanguageTagLocale.Builder API。需要完整locale的字符串表示的客户端可以始终依赖 toLanguageTag 来达到此目的。

特别案例

出于兼容性原因,两个不符合要求的locale被视为特殊情况。这些都是ja_JP_JP th_TH_TH .这些在 BCP 47 中格式错误,因为变体太短。为了便于迁移到 BCP 47,在施工期间对这些进行了特殊处理。这两种情况(并且只有这些)导致构造方法生成扩展,所有其他值的行为与 Java 7 之前的行为完全相同。

Java 已使用 ja_JP_JP 来表示在日本与日本皇历一起使用的日语。现在可以使用 Unicode locale扩展来表示,方法是指定 Unicode locale键 ca(表示“日历”)和类型 japanese。当使用参数“ja”、“JP”、“JP”调用 Locale 构造函数时,会自动添加扩展名“u-ca-japanese”。

Java 已使用 th_TH_TH 来表示泰国使用的泰语以及泰语数字。这现在也可以使用 Unicode locale扩展来表示,方法是指定 Unicode locale键 nu(表示“数字”)和值 thai。当使用参数“th”、“TH”、“TH”调用 Locale 构造函数时,会自动添加扩展名“u-nu-thai”。

连载

在序列化期间,writeObject 将所有字段写入输出流,包括扩展。

在反序列化期间,readResolve 添加扩展,如 特别案例 中所述,仅针对两种情况 th_TH_TH 和 ja_JP_JP。

遗留语言代码

Locale 的构造函数总是将三种语言代码转换为它们早期的过时形式:he 映射到 iwyi 映射到 jiid 映射到 in。自 Java SE 17 以来,情况不再如此。每种语言都映射到它的新形式; iw 映射到 heji 映射到 yiin 映射到 id

对于向后兼容行为,系统属性 java.locale.useOldISOCodes 将行为恢复到 Java SE 17 之前的行为。如果系统属性设置为 true ,则这三种当前语言代码将映射到它们的向后兼容形式。该属性仅在 Java 运行时启动时读取,随后对 System.setProperty() 的调用将无效。

1.7 中添加的 API 在新旧语言代码之间进行映射,维护 Locale 内部的映射代码(以便 getLanguagetoString 反映映射代码,这取决于 java.locale.useOldISOCodes 系统属性),但使用 BCP 47 中的新代码语言标记 API(以便 toLanguageTag 反映新的 API)。这保留了locale之间的等价性,无论使用哪种代码或 API 来构造它们。 Java 的默认资源包查找机制也实现了这种map,因此可以使用任一约定来命名资源,请参阅 ResourceBundle.Control

三字母语言/国家(地区)代码

Locale 构造方法总是指定语言和国家参数的长度为两个字符,尽管实际上它们接受任何长度。规范现已放宽,允许两到八个字符的语言代码和两到三个字符的国家(地区)代码,特别是 IANA 语言子标签注册表中指定的三字母语言代码和三位区域代码.为了兼容性,实现仍然没有施加长度限制。

自从:
1.1
参见:
  • 字段详细信息

    • ENGLISH

      public static final Locale  ENGLISH
      有用的语言常量。
    • FRENCH

      public static final Locale  FRENCH
      有用的语言常量。
    • GERMAN

      public static final Locale  GERMAN
      有用的语言常量。
    • ITALIAN

      public static final Locale  ITALIAN
      有用的语言常量。
    • JAPANESE

      public static final Locale  JAPANESE
      有用的语言常量。
    • KOREAN

      public static final Locale  KOREAN
      有用的语言常量。
    • CHINESE

      public static final Locale  CHINESE
      有用的语言常量。
    • SIMPLIFIED_CHINESE

      public static final Locale  SIMPLIFIED_CHINESE
      有用的语言常量。
    • TRADITIONAL_CHINESE

      public static final Locale  TRADITIONAL_CHINESE
      有用的语言常量。
    • FRANCE

      public static final Locale  FRANCE
      对国家/地区有用的常量。
    • GERMANY

      public static final Locale  GERMANY
      对国家/地区有用的常量。
    • ITALY

      public static final Locale  ITALY
      对国家/地区有用的常量。
    • JAPAN

      public static final Locale  JAPAN
      对国家/地区有用的常量。
    • KOREA

      public static final Locale  KOREA
      对国家/地区有用的常量。
    • UK

      public static final Locale  UK
      对国家/地区有用的常量。
    • US

      public static final Locale  US
      对国家/地区有用的常量。
    • CANADA

      public static final Locale  CANADA
      对国家/地区有用的常量。
    • CANADA_FRENCH

      public static final Locale  CANADA_FRENCH
      对国家/地区有用的常量。
    • ROOT

      public static final Locale  ROOT
      根区域设置的有用常量。根locale是其语言、国家和变体为空 ("") 字符串的locale。这被视为所有locale的基本locale,并用作locale敏感操作的语言/国家中性locale。
      自从:
      1.6
    • CHINA

      public static final Locale  CHINA
      对国家/地区有用的常量。
    • PRC

      public static final Locale  PRC
      对国家/地区有用的常量。
    • TAIWAN

      public static final Locale  TAIWAN
      对国家/地区有用的常量。
    • PRIVATE_USE_EXTENSION

      public static final char PRIVATE_USE_EXTENSION
      私人使用扩展('x')的密钥。
      自从:
      1.7
      参见:
    • UNICODE_LOCALE_EXTENSION

      public static final char UNICODE_LOCALE_EXTENSION
      Unicode 区域设置扩展('u')的键。
      自从:
      1.7
      参见:
  • 构造方法详细信息

    • Locale

      public Locale(String  language, String  country, String  variant)
      从语言、国家和变体构建locale。此构造方法将语言值规范化为小写,将国家/地区值规范化为大写。
      实现注意事项:
      • 过时的 ISO 639 代码(“iw”、“ji”和“in”)映射到它们的当前形式。有关详细信息,请参阅 遗留语言代码
      • 出于向后兼容的原因,此构造方法不对输入进行任何语法检查。
      • 这两种情况 ("ja", "JP", "JP") 和 ("th", "TH", "TH") 被特殊处理,请参阅 特别案例 了解更多信息。
      参数:
      language - ISO 639 alpha-2 或 alpha-3 语言代码,或长度最多为 8 个字符的语言子标签。请参阅有关有效语言值的 Locale 类描述。
      country - ISO 3166 alpha-2 国家代码或 UN M.49 numeric-3 区号。请参阅有关有效国家/地区值的 Locale 类描述。
      variant - 用于指示 Locale 变体的任意值。有关详细信息,请参阅 Locale 类描述。
      抛出:
      NullPointerException - 如果任何参数为空则抛出。
    • Locale

      public Locale(String  language, String  country)
      从语言和国家构建locale。此构造方法将语言值规范化为小写,将国家/地区值规范化为大写。
      实现注意事项:
      • 过时的 ISO 639 代码(“iw”、“ji”和“in”)映射到它们的当前形式。有关详细信息,请参阅 遗留语言代码
      • 出于向后兼容的原因,此构造方法不对输入进行任何语法检查。
      参数:
      language - ISO 639 alpha-2 或 alpha-3 语言代码,或长度最多为 8 个字符的语言子标签。请参阅有关有效语言值的 Locale 类描述。
      country - ISO 3166 alpha-2 国家代码或 UN M.49 numeric-3 区号。请参阅有关有效国家/地区值的 Locale 类描述。
      抛出:
      NullPointerException - 如果任一参数为空则抛出。
    • Locale

      public Locale(String  language)
      从语言代码构建locale。此构造方法将语言值规范化为小写。
      实现注意事项:
      • 过时的 ISO 639 代码(“iw”、“ji”和“in”)映射到它们的当前形式。有关详细信息,请参阅 遗留语言代码
      • 出于向后兼容的原因,此构造方法不对输入进行任何语法检查。
      参数:
      language - ISO 639 alpha-2 或 alpha-3 语言代码,或长度最多为 8 个字符的语言子标签。请参阅有关有效语言值的 Locale 类描述。
      抛出:
      NullPointerException - 如果参数为空则抛出。
      自从:
      1.4
  • 方法详情

    • getDefault

      public static Locale  getDefault()
      获取此 Java 虚拟机实例的默认locale的当前值。

      Java 虚拟机在启动期间根据主机环境设置默认locale。如果没有明确指定locale,它会被许多locale敏感的方法使用。可以使用setDefault 方法更改它。

      返回:
      此 Java 虚拟机实例的默认locale
    • getDefault

      public static Locale  getDefault(Locale.Category  category)
      获取此 Java 虚拟机实例的指定类别的默认locale的当前值。

      Java 虚拟机在启动期间根据主机环境设置默认locale。如果没有明确指定locale,它会被许多locale敏感的方法使用。可以使用 setDefault(Locale.Category, Locale) 方法更改它。

      参数:
      category - 指定类别以获取默认locale
      返回:
      此 Java 虚拟机实例的指定类别的默认locale
      抛出:
      NullPointerException - 如果类别为空
      自从:
      1.7
      参见:
    • setDefault

      public static void setDefault(Locale  newLocale)
      设置此 Java 虚拟机实例的默认locale。这不会影响主机区域设置。

      如果有安全管理器,则在更改默认区域设置之前,将使用 PropertyPermission("user.language", "write") 权限调用其 checkPermission 方法。

      Java 虚拟机在启动期间根据主机环境设置默认locale。如果没有明确指定locale,它会被许多locale敏感的方法使用。

      由于更改默认locale可能会影响许多不同的功能区域,因此仅当调用者准备重新初始化在同一 Java 虚拟机中运行的locale敏感代码时才应使用此方法。

      通过使用此方法设置默认区域设置,每个类别的所有默认区域设置也将设置为指定的默认区域设置。

      参数:
      newLocale - 新的默认locale
      抛出:
      SecurityException - 如果安全管理器存在且其 checkPermission 方法不允许该操作。
      NullPointerException - 如果 newLocale 为空
      参见:
    • setDefault

      public static void setDefault(Locale.Category  category, Locale  newLocale)
      为此 Java 虚拟机实例设置指定类别的默认locale。这不会影响主机区域设置。

      如果有安全管理器,则在更改默认locale之前,将使用 PropertyPermission("user.language", "write") 权限调用其 checkPermission 方法。

      Java 虚拟机在启动期间根据主机环境设置默认locale。如果没有明确指定locale,它会被许多locale敏感的方法使用。

      由于更改默认locale可能会影响许多不同的功能区域,因此仅当调用者准备重新初始化在同一 Java 虚拟机中运行的locale敏感代码时才应使用此方法。

      参数:
      category - 指定类别设置默认locale
      newLocale - 新的默认locale
      抛出:
      SecurityException - 如果安全管理器存在并且其 checkPermission 方法不允许该操作。
      NullPointerException - 如果类别和/或 newLocale 为空
      自从:
      1.7
      参见:
    • getAvailableLocales

      public static Locale [] getAvailableLocales()
      返回所有已安装区域设置的数组。返回的数组表示 Java 运行时环境和已安装的 LocaleServiceProvider 实现支持的语言环境的联合。它必须至少包含一个等于 Locale.US Locale 实例。
      返回:
      一组已安装的locale。
    • getISOCountries

      public static String [] getISOCountries()
      返回 ISO 3166 中定义的所有 2 字母国家/地区代码的列表。可用于创建区域设置。此方法相当于 getISOCountries(Locale.IsoCountryCode type) type Locale.IsoCountryCode.PART1_ALPHA2

      笔记:Locale 类还支持其他国家(地区)代码,例如 3 字母数字 UN M.49 区号。因此,此方法返回的列表不包含可用于创建区域设置的所有有效代码。

      请注意,此方法不会返回过时的 2 字母国家/地区代码。可以从 getISOCountries(Locale.IsoCountryCode type) type Locale.IsoCountryCode.PART3 中检索为这些过时代码指定国家代码的 ISO3166-3 代码。

      返回:
      一组 ISO 3166 两个字母的国家/地区代码。
    • getISOCountries

      public static Set <String > getISOCountries(Locale.IsoCountryCode  type)
      返回指定类型的 Set ISO3166 国家/地区代码。
      参数:
      type - Locale.IsoCountryCode 指定的 ISO 代码类型。
      返回:
      a Set 指定类型的 ISO 国家代码。
      抛出:
      NullPointerException - 如果类型为空
      自从:
      9
      参见:
    • getISOLanguages

      public static String [] getISOLanguages()
      返回 ISO 639 中定义的所有 2 字母语言代码的列表。可用于创建locale。

      笔记:

      • ISO 639 不是一个稳定的标准——一些语言的代码已经改变。此函数返回的列表包括代码已更改的语言的新代码和旧代码。
      • Locale 类还支持长度最多为 8 个字符的语言代码。因此,此方法返回的列表不包含可用于创建区域设置的所有有效代码。
      返回:
      一组 ISO 639 双字母语言代码。
    • getLanguage

      public String  getLanguage()
      返回此 Locale 的语言代码。
      实现注意事项:
      此方法返回过时的 ISO 639 代码(“iw”、“ji”和“in”)的新形式。有关详细信息,请参阅 遗留语言代码
      返回:
      语言代码,如果未定义则为空字符串。
      参见:
    • getScript

      public String  getScript()
      返回此locale的脚本,它应该是空字符串或 ISO 15924 4 字母脚本代码。第一个字母大写,其余字母小写,例如“Latn”、 “Cyrl”。
      返回:
      脚本代码,如果未定义则为空字符串。
      自从:
      1.7
      参见:
    • getCountry

      public String  getCountry()
      返回此区域设置的国家/地区代码,它应该是空字符串、大写 ISO 3166 2 字母代码或 UN M.49 3 位代码。
      返回:
      国家/地区代码,如果未定义则为空字符串。
      参见:
    • getVariant

      public String  getVariant()
      返回此locale的变体代码。
      返回:
      变体代码,如果未定义则为空字符串。
      参见:
    • hasExtensions

      public boolean hasExtensions()
      如果这个 Locale 有任何 扩展名 则返回 true
      返回:
      true 如果这个 Locale 有任何扩展
      自从:
      1.8
    • stripExtensions

      public Locale  stripExtensions()
      返回此 Locale 的副本,不带 扩展名。如果此 Locale 没有扩展名,则返回此 Locale
      返回:
      Locale 的副本,没有扩展名,或者 this 如果 this 没有扩展名
      自从:
      1.8
    • getExtension

      public String  getExtension(char key)
      返回与指定键关联的扩展(或私人使用)值,如果没有与该键关联的扩展,则返回 null。要格式正确,密钥必须是 [0-9A-Za-z] 之一。键不区分大小写,因此例如 'z' 和 'Z' 代表相同的扩展名。
      参数:
      key - 扩展密钥
      返回:
      扩展名,如果此locale未定义指定键的扩展名,则为 null。
      抛出:
      IllegalArgumentException - 如果密钥格式不正确
      自从:
      1.7
      参见:
    • getExtensionKeys

      public Set <Character > getExtensionKeys()
      返回与此locale关联的扩展键集,如果没有扩展,则返回空集。返回的集合是不可修改的。键都是小写的。
      返回:
      扩展键集,如果此locale没有扩展名,则为空集。
      自从:
      1.7
    • getUnicodeLocaleAttributes

      public Set <String > getUnicodeLocaleAttributes()
      返回与此locale关联的 unicode locale属性集,如果没有属性,则返回空集。返回的集合是不可修改的。
      返回:
      属性集。
      自从:
      1.7
    • getUnicodeLocaleType

      public String  getUnicodeLocaleType(String  key)
      返回与此locale的指定 Unicode locale键关联的 Unicode locale类型。返回没有类型定义的键的空字符串。如果未定义键,则返回 null。键不区分大小写。密钥必须是两个字母数字字符 ([0-9a-zA-Z]),否则将抛出 IllegalArgumentException。
      参数:
      key - Unicode locale键
      返回:
      与键关联的 Unicode locale类型,如果locale未定义键,则为 null。
      抛出:
      IllegalArgumentException - 如果密钥格式不正确
      NullPointerException - 如果 key 为空
      自从:
      1.7
    • getUnicodeLocaleKeys

      public Set <String > getUnicodeLocaleKeys()
      返回此locale定义的 Unicode locale键集,如果此locale没有,则返回空集。返回的集合是不可变的。键都是小写的。
      返回:
      Unicode locale键集,如果此locale没有 Unicode locale关键字,则为空集。
      自从:
      1.7
    • toString

      public final String  toString()
      返回此 Locale 对象的字符串表示形式,由语言、国家/地区、变体、脚本和扩展组成,如下所示:
      语言+“_”+国家+“_”+(变体+“_#”|“#”)+脚本+“_”+扩展
      语言始终为小写,国家/地区始终为大写,文字始终为标题,扩展名始终为小写。扩展和私人使用的子标签将按照 toLanguageTag() 中解释的规范顺序排列。

      当locale既没有脚本也没有扩展时,结果与 Java 6 及之前的版本相同。

      如果缺少语言和国家字段,此函数将返回空字符串,即使存在变体、脚本或扩展字段(您不能只有一个变体的locale,变体必须伴随一个很好的-形成的语言或国家代码)。

      如果存在脚本或扩展名并且缺少变体,则在“#”之前不添加下划线。

      此行为旨在支持调试并与以前使用的 toString 兼容,仅需要语言、国家/地区和变体字段。要将 Locale 表示为 String 以用于交换目的,请使用 toLanguageTag()

      示例:

      • en
      • de_DE
      • _GB
      • en_US_WIN
      • de__POSIX
      • zh_CN_#Hans
      • zh_TW_#Hant_x-java
      • th_TH_TH_#u-nu-thai
      重写:
      toString 在类 Object
      返回:
      Locale 的字符串表示形式,用于调试。
      参见:
    • toLanguageTag

      public String  toLanguageTag()
      返回表示此locale的格式正确的 IETF BCP 47 语言标记。

      如果此 Locale 具有不满足 IETF BCP 47 语言标记语法要求的语言、国家或变体,则此方法将按如下所述处理这些字段:

      语言:如果 language 为空,或者不是 良构的(例如“a”或“e2”),它将作为“und”(未确定)发出。

      国家:如果国家不是 良构的(例如“12”或“美国”),它将被省略。

      变体:如果变体良构的 ,每个子段(由“-”或“_”分隔)作为子标签发出。否则:

      • 如果所有子段都匹配 [0-9a-zA-Z]{1,8}(例如“WIN”或“Oracle_JDK_Standard_Edition”),则第一个格式错误的子段和所有后续子段将附加到专用子标签。第一个附加的子标签将是“lvariant”,然后是按顺序排列的子段,用连字符分隔。例如,“x-lvariant-WIN”、“Oracle-x-lvariant-JDK-Standard-Edition”。
      • 如果任何子段与 [0-9a-zA-Z]{1,8} 不匹配,变体将被截断,有问题的子段和所有后续子段将被忽略。如果余数不为空,它将像上面那样作为私人使用子标签发出(即使余数证明是格式正确的)。例如,“Solaris_isjustthecoolestthing”作为“x-lvariant-Solaris”发出,而不是“solaris”。

      特殊转换:Java 支持一些旧的locale表示,包括已弃用的 ISO 语言代码,以实现兼容性。此方法执行以下转换:

      • 已弃用的 ISO 语言代码“iw”、“ji”和“in”分别转换为“he”、“yi”和“id”。
      • 具有语言“no”、国家/地区“NO”和变体“NY”的locale(代表 Norwegian Nynorsk(挪威))被转换为语言标签“nn-NO”。

      笔记:尽管此方法创建的语言标记格式正确(满足 IETF BCP 47 规范定义的语法要求),但它不一定是有效的 BCP 47 语言标记。例如,

        new Locale("xx", "YY").toLanguageTag();
      将返回“xx-YY”,但语言子标签“xx”和地区子标签“YY”无效,因为它们未在 IANA 语言子标签注册表中注册。
      返回:
      代表locale的 BCP47 语言标签
      自从:
      1.7
      参见:
    • forLanguageTag

      public static Locale  forLanguageTag(String  languageTag)
      返回指定 IETF BCP 47 语言标记字符串的locale。

      如果指定的语言标签包含任何格式错误的子标签,第一个这样的子标签和所有后续的子标签将被忽略。与在这种情况下抛出异常的 Locale.Builder.setLanguageTag(java.lang.String) 进行比较。

      下列转换执行:

      • 语言代码“und”映射到语言“”。
      • 语言代码“iw”、“ji”和“in”分别映射到“he”、“yi”和“id”。 (这与在 Locale 的构造函数中完成的规范化相同。)请参阅 遗留语言代码 了解更多信息。
      • 以“lvariant”为前缀的私人使用子标签部分(如果有)被删除并附加到结果区域设置中的变体字段(没有大小写规范化)。如果它随后为空,则丢弃私有使用子标签:
           Locale loc;
           loc = Locale.forLanguageTag("en-US-x-lvariant-POSIX");
           loc.getVariant(); // returns "POSIX"
           loc.getExtension('x'); // returns null
        
           loc = Locale.forLanguageTag("de-POSIX-x-URP-lvariant-Abc-Def");
           loc.getVariant(); // returns "POSIX_Abc_Def"
           loc.getExtension('x'); // returns "urp"
         
      • 当 languageTag 参数包含一个 extlang 子标签时,第一个这样的子标签被用作语言,并且忽略主要语言子标签和其他 extlang 子标签:
           Locale.forLanguageTag("ar-aao").getLanguage(); // returns "aao"
           Locale.forLanguageTag("en-abc-def-us").toString(); // returns "abc_US"
         
      • 除了保持不变的变体标签外,大小写都已标准化。语言标准化为小写,文字标准化为标题,国家标准化为大写,扩展标准化为小写。
      • 如果在处理之后,locale将完全匹配 ja_JP_JP 或 th_TH_TH 而没有扩展名,则添加适当的扩展名,就像调用构造函数一样:
          Locale.forLanguageTag("ja-JP-x-lvariant-JP").toLanguageTag();
          // returns "ja-JP-u-ca-japanese-x-lvariant-JP"
          Locale.forLanguageTag("th-TH-x-lvariant-TH").toLanguageTag();
          // returns "th-TH-u-nu-thai-x-lvariant-TH"
         

      这实现了 BCP47 的“语言标签”生产,因此支持遗留(常规和不规则,在 BCP47 中称为“类型:祖父”)以及私人使用的语言标签。独立的私人使用标签表示为空语言和扩展名“x-whatever”,而遗留标签将转换为它们存在的规范替代品。

      具有规范替换的旧标签如下:

      具有规范替换的旧标签
      遗留标签 现代替代品
      艺术逻辑 杰博
      我-ami 阿米
      i-bnn bnn
      我学
      i-克林贡语 tlh
      i-勒克斯 lb
      纳瓦霍语 nv
      我-pwn pwn
      爱涛 tao
      i-tay tay
      伊津 tsu
      禁书 注意事项
      无宁 nn
      sgn-BE-FR sfb
      sgn-BE-NL vgt
      sgn-中国-德国 sgg
      国语 厘米
      客家人
      zh-min-nan
      志祥 hsn

      没有现代替代品的旧标签将按如下方式转换:

      没有现代替代品的旧标签
      遗留标签 转换为
      高卢语 xtg-x-cel-高卢语
      英译英 en-GB-x-oed
      我默认 en-x-i-default
      i-enochian und xi enochian
      我-明哥 see-x-i-mingo
      zh-min 南新之民

      有关所有遗留标签的列表,请参阅 IANA 语言子标签注册表(搜索“类型:祖父”)。

      笔记: 不能保证 toLanguageTagforLanguageTag 会往返。

      参数:
      languageTag - 语言标签
      返回:
      最能代表语言标签的locale。
      抛出:
      NullPointerException - 如果 languageTagnull
      自从:
      1.7
      参见:
    • getISO3Language

      public String  getISO3Language() throws MissingResourceException
      返回此区域设置语言的三个字母缩写。如果语言匹配 ISO 639-1 两字母代码,则返回相应的 ISO 639-2/T 三字母小写代码。可以在线找到 ISO 639-2 语言代码,请参阅“语言名称表示代码第 2 部分:Alpha-3 代码”。如果locale指定三字母语言,则按原样返回该语言。如果locale未指定语言,则返回空字符串。
      返回:
      此locale语言的三个字母缩写。
      抛出:
      MissingResourceException - 如果三字母语言缩写不适用于此locale,则抛出 MissingResourceException。
    • getISO3Country

      public String  getISO3Country() throws MissingResourceException
      返回此locale所在国家/地区的三个字母的缩写。如果国家/地区匹配 ISO 3166-1 alpha-2 代码,则返回相应的 ISO 3166-1 alpha-3 大写代码。如果locale未指定国家/地区,则这将为空字符串。

      可以在线找到 ISO 3166-1 代码。

      返回:
      此locale所在国家/地区的三个字母缩写。
      抛出:
      MissingResourceException - 如果三字母国家/地区缩写不适用于此locale,则抛出 MissingResourceException。
    • getDisplayLanguage

      public final String  getDisplayLanguage()
      返回适合向用户显示的区域设置语言的名称。如果可能,返回的名称将针对默认的 DISPLAY locale进行本地化。例如,如果locale是 fr_FR 而默认的 DISPLAY locale是 en_US,getDisplayLanguage() 将返回“French”;如果locale是 en_US 而默认的 DISPLAY locale是 fr_FR,getDisplayLanguage() 将返回“anglais”。如果返回的名称无法针对默认的 DISPLAY locale进行本地化(例如,我们没有克罗地亚语的日语名称),则此函数会返回英文名称,并使用 ISO 代码作为最后的手段值。如果locale未指定语言,则此函数返回空字符串。
      返回:
      显示语言的名称。
    • getDisplayLanguage

      public String  getDisplayLanguage(Locale  inLocale)
      返回适合向用户显示的区域设置语言的名称。如果可能,返回的名称将根据 inLocale 进行本地化。例如,如果locale是 fr_FR 而 inLocale 是 en_US,getDisplayLanguage() 将返回“French”;如果locale是 en_US 而 inLocale 是 fr_FR,getDisplayLanguage() 将返回“anglais”。如果根据 inLocale 无法对返回的名称进行本地化(例如,我们没有克罗地亚语的日文名称),则此函数会求助于英文名称,最后求助于 ISO 代码作为最后的手段值。如果locale未指定语言,则此函数返回空字符串。
      参数:
      inLocale - 检索显示语言的locale。
      返回:
      适用于给定locale的显示语言的名称。
      抛出:
      NullPointerException - 如果 inLocalenull
    • getDisplayScript

      public String  getDisplayScript()
      返回适合向用户显示的区域设置脚本的名称。如果可能,该名称将针对默认的 DISPLAY locale进行本地化。如果此locale未指定脚本代码,则返回空字符串。
      返回:
      当前默认 DISPLAY locale的脚本代码的显示名称
      自从:
      1.7
    • getDisplayScript

      public String  getDisplayScript(Locale  inLocale)
      返回适合向用户显示的区域设置脚本的名称。如果可能,该名称将针对给定的locale进行本地化。如果此locale未指定脚本代码,则返回空字符串。
      参数:
      inLocale - 检索显示脚本的locale。
      返回:
      当前默认 DISPLAY locale的脚本代码的显示名称
      抛出:
      NullPointerException - 如果 inLocalenull
      自从:
      1.7
    • getDisplayCountry

      public final String  getDisplayCountry()
      返回适合向用户显示的区域设置国家名称。如果可能,返回的名称将针对默认的 DISPLAY locale进行本地化。例如,如果locale是 fr_FR 而默认的 DISPLAY locale是 en_US,getDisplayCountry() 将返回“France”;如果locale是 en_US 而默认的 DISPLAY locale是 fr_FR,getDisplayCountry() 将返回“Etats-Unis”。如果返回的名称无法针对默认的 DISPLAY locale进行本地化(例如,我们没有克罗地亚的日语名称),则此函数会返回英文名称,并使用 ISO 代码作为最后的手段值。如果locale未指定国家/地区,则此函数返回空字符串。
      返回:
      适用于locale的国家名称。
    • getDisplayCountry

      public String  getDisplayCountry(Locale  inLocale)
      返回适合向用户显示的区域设置国家名称。如果可能,返回的名称将根据 inLocale 进行本地化。例如,如果locale是 fr_FR,inLocale 是 en_US,getDisplayCountry() 将返回“France”;如果locale是 en_US 并且 inLocale 是 fr_FR,getDisplayCountry() 将返回“Etats-Unis”。如果返回的名称不能根据 inLocale 进行本地化。 (比如,我们没有克罗地亚的日文名称),此函数求助于英文名称,最后求助于 ISO 代码作为最后的手段值。如果locale未指定国家/地区,则此函数返回空字符串。
      参数:
      inLocale - 检索显示国家/地区的locale。
      返回:
      适用于给定locale的国家名称。
      抛出:
      NullPointerException - 如果 inLocalenull
    • getDisplayVariant

      public final String  getDisplayVariant()
      返回适合向用户显示的区域设置变体代码的名称。如果可能,该名称将针对默认的 DISPLAY locale进行本地化。如果locale未指定变体代码,则此函数返回空字符串。
      返回:
      适用于区域设置的显示变体代码的名称。
    • getDisplayVariant

      public String  getDisplayVariant(Locale  inLocale)
      返回适合向用户显示的区域设置变体代码的名称。如果可能,该名称将针对 inLocale 进行本地化。如果locale未指定变体代码,则此函数返回空字符串。
      参数:
      inLocale - 要为其检索显示变体代码的locale。
      返回:
      适用于给定locale的显示变体代码的名称。
      抛出:
      NullPointerException - 如果 inLocalenull
    • getDisplayName

      public final String  getDisplayName()
      返回适合向用户显示的区域设置名称。这将由 getDisplayLanguage()、getDisplayScript()、getDisplayCountry()、getDisplayVariant() 和可选的 Unicode 扩展 返回的值组合成一个字符串。非空值按顺序使用,第二个和后续名称在括号中。例如:
      语言(脚本、国家、变体(、扩展名)*)
      语言(国家(,扩展名)*)
      语言(变体(,扩展名)*)
      脚本(国家(,扩展名)*)
      国家(扩展名)*
      取决于locale中指定的字段。上面括号中的字段分隔符表示为逗号字符,可能会根据locale进行本地化。如果语言、脚本、国家和变体字段都是空的,则此函数返回空字符串。
      返回:
      适合显示的locale的名称。
    • getDisplayName

      public String  getDisplayName(Locale  inLocale)
      返回适合向用户显示的区域设置的名称。这将是 getDisplayLanguage()、getDisplayScript()、getDisplayCountry()、getDisplayVariant() 和可选 Unicode 扩展 组装成单个字符串的返回值。非空值按顺序使用,第二个和后续名称放在括号中。例如:
      语言(脚本、国家、变体(、扩展名)*)
      语言(国家(,扩展名)*)
      语言(变体(,扩展名)*)
      脚本(国家(,扩展名)*)
      国家(扩展名)*
      取决于locale中指定的字段。上面括号中的字段分隔符表示为逗号字符,可能会根据locale进行本地化。如果语言、脚本、国家和变体字段都是空的,则此函数返回空字符串。
      参数:
      inLocale - 要为其检索显示名称的locale。
      返回:
      适合显示的locale的名称。
      抛出:
      NullPointerException - 如果 inLocalenull
    • clone

      public Object  clone()
      重写可克隆。
      重写:
      clone 在类 Object
      返回:
      此实例的克隆。
      参见:
    • hashCode

      public int hashCode()
      重写哈希码。由于 Locales 通常用于哈希表,因此缓存值以提高速度。
      重写:
      hashCode 在类 Object
      返回:
      此对象的哈希码值。
      参见:
    • equals

      public boolean equals(Object  obj)
      如果此 Locale 等于另一个对象,则返回 true。 Locale 被视为与具有相同语言、脚本、国家/地区、变体和扩展名的另一个 Locale 相等,但与所有其他对象不相等。
      重写:
      equals 在类 Object
      参数:
      obj - 要比较的参考对象。
      返回:
      如果此 Locale 等于指定对象,则为 true。
      参见:
    • filter

      public static List <Locale > filter(List <Locale.LanguageRange > priorityList, Collection <Locale > locales, Locale.FilteringMode  mode)
      使用 RFC 4647 中定义的过滤机制返回匹配 Locale 实例的列表。对给定 locales 的此过滤操作确保仅返回唯一匹配的区域设置。
      参数:
      priorityList - 用户的语言优先级列表,其中每个语言标签根据优先级或权重降序排列
      locales - Locale 用于匹配的实例
      mode - 过滤模式
      返回:
      Locale 匹配语言标签的实例列表,根据优先级或权重降序排列,如果没有匹配项,则为空列表。该列表是可修改的。
      抛出:
      NullPointerException - 如果 priorityListlocalesnull
      IllegalArgumentException - 如果在指定 Locale.FilteringMode.REJECT_EXTENDED_RANGES 时给定列表中包含一个或多个扩展语言范围
      自从:
      1.8
    • filter

      public static List <Locale > filter(List <Locale.LanguageRange > priorityList, Collection <Locale > locales)
      使用 RFC 4647 中定义的过滤机制返回匹配 Locale 实例的列表。当 modeLocale.FilteringMode.AUTOSELECT_FILTERING 时,这等效于 filter(List, Collection, FilteringMode) 。对给定 locales 的此过滤操作可确保仅返回唯一匹配的locale。
      参数:
      priorityList - 用户的语言优先级列表,其中每个语言标签根据优先级或权重降序排列
      locales - Locale 用于匹配的实例
      返回:
      Locale 匹配语言标签的实例列表,根据优先级或权重降序排列,如果没有匹配项,则为空列表。该列表是可修改的。
      抛出:
      NullPointerException - 如果 priorityListlocalesnull
      自从:
      1.8
    • filterTags

      public static List <String > filterTags(List <Locale.LanguageRange > priorityList, Collection <String > tags, Locale.FilteringMode  mode)
      使用 RFC 4647 中定义的基本过滤机制返回匹配语言标签列表。给定 tags 上的此过滤操作确保仅返回唯一匹配标签并保留大小写。如果有大小写不同的重复匹配标签,则返回保留大小写的第一个匹配标签。例如,如果在给定的 tags 中首先检查“de-ch”是否匹配,则从重复的匹配标签“de-ch”和“de-CH”中返回“de-ch”。请注意,如果给定的 tags 是无序的 Collection ,则重复标签中返回的匹配标签可能会发生变化,具体取决于 Collection 的实现。
      参数:
      priorityList - 用户的语言优先级列表,其中每个语言标签根据优先级或权重降序排列
      tags - 语言标签
      mode - 过滤模式
      返回:
      根据优先级或权重降序排列的匹配语言标签列表,如果没有匹配项,则为空列表。该列表是可修改的。
      抛出:
      NullPointerException - 如果 priorityListtagsnull
      IllegalArgumentException - 如果在指定 Locale.FilteringMode.REJECT_EXTENDED_RANGES 时给定列表中包含一个或多个扩展语言范围
      自从:
      1.8
    • filterTags

      public static List <String > filterTags(List <Locale.LanguageRange > priorityList, Collection <String > tags)
      使用 RFC 4647 中定义的基本过滤机制返回匹配语言标签的列表。当 modeLocale.FilteringMode.AUTOSELECT_FILTERING 时,这等效于 filterTags(List, Collection, FilteringMode) 。给定 tags 上的此过滤操作可确保仅返回保留大小写的唯一匹配标签。如果有大小写不同的重复匹配标签,则返回保留大小写的第一个匹配标签。例如,如果在给定的 tags 中首先检查“de-ch”是否匹配,则从重复的匹配标签“de-ch”和“de-CH”中返回“de-ch”。请注意,如果给定的 tags 是无序的 Collection ,则重复标签中返回的匹配标签可能会发生变化,具体取决于 Collection 的实现。
      参数:
      priorityList - 用户的语言优先级列表,其中每个语言标签根据优先级或权重降序排列
      tags - 语言标签
      返回:
      根据优先级或权重降序排列的匹配语言标签列表,如果没有匹配项,则为空列表。该列表是可修改的。
      抛出:
      NullPointerException - 如果 priorityListtagsnull
      自从:
      1.8
    • lookup

      public static Locale  lookup(List <Locale.LanguageRange > priorityList, Collection <Locale > locales)
      使用 RFC 4647 中定义的查找机制返回最匹配语言标记的 Locale 实例。
      参数:
      priorityList - 用户的语言优先级列表,其中每个语言标签根据优先级或权重降序排列
      locales - Locale 用于匹配的实例
      返回:
      根据优先级或权重选择的最佳匹配 Locale 实例,如果没有匹配,则为 null
      抛出:
      NullPointerException - 如果 priorityListtagsnull
      自从:
      1.8
    • lookupTag

      public static String  lookupTag(List <Locale.LanguageRange > priorityList, Collection <String > tags)
      使用 RFC 4647 中定义的查找机制返回最匹配的语言标记。此对给定 tags 的查找操作可确保返回保留大小写的第一个匹配标记。
      参数:
      priorityList - 用户的语言优先级列表,其中每个语言标签根据优先级或权重降序排列
      tags - 用于匹配的语言 tangs
      返回:
      根据优先级或权重选择的最佳匹配语言标签,如果没有匹配项,则为 null
      抛出:
      NullPointerException - 如果 priorityListtagsnull
      自从:
      1.8