从 Java 中的国家/地区代码获取默认语言

问题描述

我需要根据国家/地区代码查找语言。 对于国家代码“US”,应返回“en”或“CN”应返回“zh”。我经历了 java.util.Locale,它适用于 LanguageCode 而不是 countryCode。此外,Locale.getAvailableLocales 在这里没有帮助,因为它为同一个国家/地区代码返回多种语言。有没有其他有用的东西。我想避免在文件中初始化所有有用的语言环境然后使用它。 (因为每当我们必须使用新的语言环境时,它可能需要定期更新)

提前致谢

查看其他 stackoverflow 问题,找不到答案,因此在此处发布新问题。

解决方法

您可以构建一个 HashMap 以将国家/地区代码映射到语言集,如下所示:

Locale[] locales = Locale.getAvailableLocales();
Map<String,HashSet<String>> countryLanguageMap = new HashMap<>();

for (Locale locale : locales) {
     String country = locale.getCountry(),language = locale.getLanguage();
     if(!country.isEmpty() && !language.isEmpty()) {
          if(countryLanguageMap.containsKey(country))
               countryLanguageMap.get(country).add(language);
          else
               countryLanguageMap.put(country,new HashSet<String>(Arrays.asList(language)));
     }
}

然后,获取国家代码的语言如下:

countryLanguageMap.get("US"); // [en,es]
,

这个问题没有正确答案。

有些国家/地区有多种官方语言。 比利时拥有三种民族语言:荷兰语、法语和德语。这些在该国北部、南部和东部地区使用。许多比利时网站的主页仅包含语言选择。几乎所有这些都允许您轻松切换语言。 加拿大有两种国家语言:英语和法语。两者都在新不伦瑞克省使用,魁北克主要使用法语,其余主要使用英语。 瑞士有四种民族语言:德语、法语、意大利语和罗曼什语。我什至不想解释这个。

有些语言因国家/地区而异。 比利时和法国都讲法语。他们用完全不同的词来描述同一件事。 “déjeuner”一词在法国表示午餐,在比利时表示早餐。

如果您正在尝试编写多语言 Java Web 应用程序,我建议您使用 ResourceBundle。您将从 Accept-Language http 标头中读取区域设置信息或直接询问用户。

# Messages.properties
# fallback,usually assumes English,United States.
breakfast = breakfast
lunch = lunch
supper = supper
# Messages_fr.properties
# fallback for French if country isn't France
breakfast = déjeuner
lunch = dȋner
supper = souper
# Messages_fr_FR.properties
# French if country is France
breakfast = petit-déjeuner
lunch = déjeuner
supper = dȋner

您应该阅读javadoc for java.util.ResourceBundle。 还要注意 default encoding for ResourceBundle property files has changed between java 8 and 9

,

没有什么比一个国家的默认语言更合适的了,尽管大多数国家只有一种(官方)语言。相反,只有一个国家使用少数几种语言。但是有几种语言确实有一个特定于一个国家的变体。

这就是设计 java.util.Locale 的原因。区域设置不是“国家/地区”代码,而主要是语言代码。但乍一看,似乎大多数国家/地区的语言变体都是在该类中定义的。

如果你真的想根据国家选择语言,你需要设置自己的地图,可能是这样的:

Map<String,Locale> languagesForCountries = new HashMap<>(); 

但要填补这一点,您需要一些手动工作:

languagesForCountries.put( "US",Locale.US );
languagesForCountries.put( "DE",Locale.GERMANY );
languagesForCountries.put( "BR",new Locale( "pt","BR" );
languagesForCountries.put( "AT",new Locale( "de","AT" );
… // and so on

也许您在某处找到了可以使用的现有数据库。