为什么Android中的Locale.getDefault()。getLanguage()返回显示名称而不是语言代码?

时间:2012-01-05 18:04:32

标签: java android locale

根据Java参考,Locale.getLanguage()应该返回该语言的2个字母的小写ISO代码(例如en),而getDisplayLanguage()是获取可读的方法名称(例如English)。

那么Android中的以下代码如何:

Locale.getDefault().getLanguage()

返回EnglishEspañol而不是enes ????

我完全不解......

6 个答案:

答案 0 :(得分:13)

使用

  

getResources()。getConfiguration()。locale.getLanguage()

即使我认为您观察到的行为是值得报告的错误,它也会正常工作。

答案 1 :(得分:6)

我已经弄清楚了。之所以发生这种情况,是因为我之前调用了Locale.setDefault()并将其传递给Locale,而Locale又是通过错误地传递整个语言名称而创建的(我从偏好设置中选择了语言而错误地选择了条目的标签而不是的价值)。

就是这样,我做了:

String lang= //... here I assigned "English" while I thought
             //    I was assigning it "en"
Locale locale=new Locale(lang);
Locale.setDefault(locale);       // (*)

// and later
Locale.getLocale().getLanguage();   //returns "english"

因此,当我查询默认语言环境时,它实际上是我创建的语言环境,其语言代码错误地设置为“英语”。

但有一些有趣的事情:

  1. 行(*)实际上有效,实际上确实将语言环境更改为英语(或者当我使用“西班牙语”时更改为西班牙语),也就是说,setDefault()似乎接受“格式错误”的语言环境甚至理解它。但它没有解决它。
  2. 注意我错误地设置了区域设置时使用了大写英文,但最后它返回“english”全部小写。

答案 2 :(得分:4)

我不知道为什么会出现这个问题,但语言的另一个标准是ISO3代码。 您可以致电Locale.getDefault().getISO3Language(),它应该返回“eng”或“esp”。

答案 3 :(得分:1)

Android返回可读名称而不是代码。

Locale.getDefault()包含字符串。因此,如果你打电话给任何打印或日志,它将工作... 意思是Locale.getDefault()。toString()有你的语言环境代码。

答案 4 :(得分:0)

现在看起来已经修复了,在 Android Version 10 Emulated device Pixel XL API 29 上试过:

以下为我返回两个字母的语言代码。尝试使用英语、德语和阿拉伯语系统语言,分别返回“en”、“de”和“ar”。

Locale.getDefault().getLanguage();

此外,如问题 Locale.getDefault().getDisplayLanguage() 中所述,返回可读名称,例如德语

答案 5 :(得分:0)

在 kotlin 中试试这个

Locale.getDefault().toLanguageTag()

给予

en-US