Java 每个国家/地区的区域设置 ID 是否不同?

Are Java Locale IDs different for each country?

通过查看 Oracle 中与西班牙语相关的语言环境 ID

http://www.oracle.com/technetwork/java/javase/javase7locales-334809.html

Spanish Argentina   es_AR
Spanish Bolivia es_BO
Spanish Chile   es_CL
Spanish Colombia    es_CO
Spanish Costa Rica  es_CR
Spanish Dominican Republic  es_DO
Spanish Ecuador es_EC
Spanish El Salvador es_SV
Spanish Guatemala   es_GT
Spanish Honduras    es_HN
Spanish Mexico  es_MX
Spanish Nicaragua   es_NI
Spanish Panama  es_PA
Spanish Paraguay    es_PY
Spanish Peru    es_PE
Spanish Puerto Rico es_PR
Spanish Spain   es_ES
Spanish United States   es_US
Spanish Uruguay es_UY
Spanish Venezuela   es_VE

我觉得 Java 每个国家/地区的区域设置 ID 都不同。换句话说,两个国家不共享相同的 Locale ID。我了解一个国家/地区可能有两个或多个语言环境。

我的理解对吗?我找不到明确的描述来支持我的理解。

谢谢!

Locale 可能包含国家/地区代码,但它们并非用于识别国家/地区。

一个Locale意在表示显示translations/formatting/etc.

的规则组合

语言环境由语言、国家和变体的组合来标识。

所以:

  • en 将是英语
  • en_US 是美国英语的变体
  • en_US_WIN 可能代表 Windows 上软件 运行 版本的美式英语(例如,如果您的文本需要针对 Windows 用户而有所不同) .

语言和国家/地区部分基于 ISO 标准。但是 Locale 并没有真正限制你对变体部分的操作。

您不应将区域设置视为与国家(或语言)的一对一映射。

例如

  • fr_FR = 法国的法语种类繁多。
  • fr_CH = 瑞士法语的多样性。
  • de_CH = 瑞士德语的多样性。

许多使用区域设置的系统都会遵循根据需要回退到更通用的区域设置的做法。例如ResourceBundle 可用于根据消息密钥查找适当的文本翻译。如果您告诉它在 Locale en_US_WIN 中查找消息但没有找到,它将尝试使用 Locale en_US 然后 en 然后返回到 'root' 语言环境。这意味着如果美国和英国的英语翻译对某事使用相同的文本,那么他们的翻译只需要记录一次。这也意味着,如果代码不知道一种语言,它可以回退到默认语言(存储在根语言环境的文件中)。

如果您有兴趣获取国家或语言列表,Locale 上有静态方法可以帮助您。

Locale.getISOCountries();  // Returns list of ISO country codes
Locale.getISOLanguages();  // Returns list of ISO language codes

还有一些方法可以获取人类可读的语言名称:

Locale.ENGLISH.getDisplayLanguage(Locale.GERMAN); //Englisch
Locale.GERMAN.getDisplayLanguage(Locale.ENGLISH); //German
Locale.ENGLISH.getDisplayLanguage(Locale.English); //English
Locale.GERMAN.getDisplayLanguage(Locale.GERMAN); //Deutsch

以及人类可读的国家名称:

Locale.US.getDisplayCountry(Locale.ENGLISH); //United States
Locale.GERMANY.getDisplayCountry(Locale.ENGLISH); //Germany

Locale.US.getDisplayCountry(Locale.GERMAN); //Vereinigte Staaten von Amerika
Locale.GERMANY.getDisplayCountry(Locale.GERMAN); //Deutschland