Search code examples
javaandroidlocale

Why does Locale.getDefault().getLanguage() in Android return the display name instead of the language code?


According to the Java reference, Locale.getLanguage() is supposed to return the 2-letters lowercase ISO code of the language (e.g. en), while getDisplayLanguage() is the method for obtaining the readable name (e.g. English).

So how comes that the following code in Android:

Locale.getDefault().getLanguage()

returns English or Español instead of en and es????

I'm completely puzzled...


Solution

  • I've figured it out. This happened because I had previously called Locale.setDefault() and passed it a Locale which in turn I had created by erroneously passing it the whole language name (I took the language from a preference setting and I mistakenly picked the label of the entry instead of the value).

    That is, I did:

    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"
    

    So when I queried for the default locale, it actually was the locale I had created whose language code I had erroneously set to "english".

    There are a couple of funny things, though:

    1. The line (*) actually works and actually does change the locale to English (or to Spanish when I used "Spanish"), that is, setDefault() seems to accept a "malformed" locale and even understands it. But it doesn't fix it.
    2. Note I used uppercase English when wrongly setting the locale, but at the end it returns "english" all lowercase.