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

2022-09-04 05:54:51

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

那么,在Android中,以下代码是怎么来的:

Locale.getDefault().getLanguage()

返回 或 代替 和 ????EnglishEspañolenes

我完全困惑...


答案 1

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

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


答案 2

我已经想通了。发生这种情况是因为我以前调用了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"

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

不过,有几件有趣的事情:

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

推荐