问题描述
我需要根据国家/地区代码查找语言。
对于国家代码“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
也许您在某处找到了可以使用的现有数据库。