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

时间:2015-06-24 12:12:37

标签: java multilingual

通过查看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都不同。换句话说,两个国家不共享相同的区域设置ID。我了解一个国家/地区可能有两个或更多区域设置。

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

谢谢!

1 个答案:

答案 0 :(得分:2)

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

Locale旨在表示用于显示翻译/格式化等的规则的组合。

区域设置使用语言,国家/地区和变体的组合进行标识。

所以:

  • en将是英文
  • en_US将成为美国英语口语的变体
  • en_US_WIN可能代表美国英语版本的Windows上运行的软件(例如,如果您的文本需要与Windows用户不同)。

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

您不应该将区域设置视为与国家/地区(或使用语言)进行一对一映射。

e.g。

  • fr_FR =在法国使用各种法语。
  • fr_CH =在瑞士使用各种法语。
  • de_CH =在瑞士使用的各种德语。

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

如果您对获取国家/地区或语言列表感兴趣,可以在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