【问题标题】:Getting default language from country code in Java从Java中的国家代码获取默认语言
【发布时间】:2020-12-31 23:22:03
【问题描述】:

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

提前致谢

查看了其他 stackoverflow 问题,找不到答案,因此在这里发布了一个新问题。

【问题讨论】:

  • 有些国家有多种语言。
  • 一个国家没有通用的“默认语言”。即使是美国也没有官方语言,你也可以选择西班牙语。

标签: java collections locale


【解决方案1】:

您可以构建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]

【讨论】:

  • 建议:HashSet languageSet = countryLanguageMap.getOrDefault(country, null); if (languageSet == null) { countryLanguageMap.put(country, new HashSet(Collections.singletonList(language))); } else { languageSet.add(language); }
  • 好招!虽然它会让你像 419 这样的国家......
  • 这如何解决要求每个国家/地区使用默认语言的问题(在许多国家/地区不存在)?
【解决方案2】:

这个问题没有正确答案。

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

某些语言在国家/地区之间是不同的。 比利时和法国都说法语。他们用完全不同的词来描述同一件事。 “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。

【讨论】:

  • 我不太确定语言差异是否因为一个词的含义是早餐和午餐而在另一个词中很重要。想想美国的四餐:早餐、午餐、晚餐和晚餐。
  • 没错,我的例子有缺陷。英国和我们共享一种语言,但他们的日期写法不同。 2021 年 1 月 2 日可以是 2 月 1 日或 1 月 2 日。一楼比美国低一层。 1,234 在美国比在欧洲大,因为小数点分隔符不同。 “裤子”一词在美国和英国的解释不同。然后是颜色和颜色。或电梯和电梯。这些小事加起来。
  • 是的,两个国家被一种共同的语言分开。 -- B. 肖。
【解决方案3】:

一个国家没有默认语言,尽管大多数国家只有一种(官方)语言。相反,只有一个国家只使用几种语言。但有几种语言确实有一个特定于一个国家/地区的变体。

这就是设计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

也许你在某个地方找到了一个已经存在的数据库供你使用。

【讨论】:

  • 关于“大多数国家只有一种(官方)语言”的说法,我统计了60多个国家拥有多种官方语言,剩下的25个以上的单一官方语言国家通常都有次要区域语言正在使用。这是根据List of official languages by country and territory 的维基百科页面。所以尝试定义默认语言在很多地方都是个问题。
  • @BasilBourque - 我以为我说过......虽然我很惊讶“大多数”国家的差距实际上是如此之小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
相关资源
最近更新 更多