从java中的国家代码获取默认语言

5uzkadbs  于 2021-06-29  发布在  Java
关注(0)|答案(3)|浏览(545)

我需要找到基于国家代码的语言。对于国家代码“us”,应返回“en”,或“cn”应返回“zh”。我通过了 java.util.Locale ,它在languagecode而不是countrycode上工作。也, Locale.getAvailableLocales 在这里没有帮助,因为它为相同的countrycode返回多种语言。还有什么有用的吗。我希望避免初始化文件中所有有用的区域设置,然后使用它(因为每当我们需要使用新的区域设置时,它可能需要定期更新)
提前谢谢
查看其他stackoverflow问题,找不到答案,因此在此处发布了一个新问题。

fnx2tebb

fnx2tebb1#

没有什么比一个国家的默认语言更好的了,尽管大多数国家只有一种(官方)语言。相反,只有一个国家讲的语言很少。但有几种语言确实有一个特定于一个国家的变体。
这就是设计的原因 java.util.Locale 就像设计的那样。区域设置不是“国家”代码,主要是语言代码。但乍一看,似乎大多数语言的国家变体都是在这个类中定义的。
如果你真的想根据国家选择一种语言,你需要建立你自己的Map,也许像这样:

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

也许您可以在某个地方找到一个已经存在的数据库。

mefy6pfw

mefy6pfw2#

这个问题没有正确答案。
有些国家有多种官方语言。比利时有三种民族语言:荷兰语、法语和德语。这些语言在该国的北部、南部和东部地区都有。很多比利时网站的主页只有一种语言可供选择。几乎所有这些都允许您轻松地切换语言。加拿大有两种国家语言:英语和法语。这两种语言都在新不伦瑞克省使用,魁北克省主要使用法语,其余主要使用英语。瑞士有四种民族语言:德语、法语、意大利语和罗马语。我甚至不想解释这个。
有些语言在国家之间是不同的。比利时和法国都讲法语。他们用完全不同的词来描述同一件事。“d”字é在法国是午餐,在比利时是早餐。
如果您试图编写一个多语言的javaweb应用程序,我建议您使用 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。还要注意,resourcebundle属性文件的默认编码在Java8和Java9之间发生了变化。

xa9qqrwz

xa9qqrwz3#

你可以建立一个 HashMap 要将国家代码Map到语言集,请执行以下操作:

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]

相关问题