我需要找到基于国家代码的语言。对于国家代码";US";,它应该返回";en";或";CN";应返回";zh";。我读了java.util.Locale
,它使用的是LanguageCode,而不是countryCode。此外,Locale.getAvailableLocales
在这里没有帮助,因为它为同一countryCode返回多种语言。还有什么有用的吗。我想避免在文件中初始化所有有用的区域设置,然后使用它。(因为每当我们必须使用新的区域设置时,它可能需要定期更新(
提前感谢
查看了其他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
您应该阅读java.util.ResourceBundle的javadoc。还要注意ResourceBundle属性文件的默认编码在java8和9之间发生了变化。
没有什么比一个国家的默认语言更好的了,尽管大多数国家只有一种(官方(语言。相反,只有少数几种语言在一个国家使用。但有几种语言确实有一种特定于某个国家的变体。
这就是设计java.util.Locale
的原因。区域设置不是"country"代码,而是主要的语言代码。但乍一看,大多数语言的国家变体似乎都是在这一类中定义的。
如果你真的想根据国家选择一种语言,你需要建立自己的地图,也许是这样的:
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
也许您在某个可以使用的地方找到了一个已经存在的数据库。