Почему Locale.getDefault(). GetLanguage() в Android возвращает отображаемое имя вместо кода языка?

Согласно Java-ссылке, Locale.getLanguage() должен возвращать Locale.getLanguage() ISO-код языка в нижнем регистре (например, en), а getDisplayLanguage() - метод получения читаемого имени (например, English).

Так как получается, что следующий код в Android:

Locale.getDefault().getLanguage()

возвращает English или Español вместо en и es????

Я полностью озадачен...

Ответ 1

Я понял это. Это произошло из-за того, что я ранее называл Locale.setDefault() и передал ему локаль, которая, в свою очередь, я создал, ошибочно передав ей все имя языка (я взял язык из настройки предпочтений, и я ошибочно выбрал метку записи от значения).

То есть, я сделал:

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"

Итак, когда я запросил языковой стандарт по умолчанию, на самом деле это был язык, который я создал, код языка которого я ошибочно настроил на "английский".

Есть несколько забавных вещей:

  • Линия (*) фактически работает и фактически меняет языковой стандарт на английский (или на испанский, когда я использовал "испанский язык" ), то есть setDefault(), похоже, принимает "искаженный" язык и даже понимает его. Но это не исправляет.
  • Примечание. Я использовал прописные буквы при неправильном настройке языка, но в конце он возвращает "английский" все строчные буквы.

Ответ 2

Используйте

GetResources(). GetConfiguration(). Locale.getLanguage()

и он будет работать нормально, даже если я рассмотрю ваше наблюдаемое поведение как ошибку, сообщающую об ошибке.

Ответ 3

Я не знаю, почему эта проблема возникает, но другим стандартом для языков является код ISO3. Вы можете вызвать Locale.getDefault().getISO3Language(), и он должен вернуть "eng" или "esp".

Ответ 4

Android возвращает читаемые имена вместо кодов.

Locale.getDefault() имеет строку. Поэтому, если вы вызываете какие-либо отпечатки или журналы, это будет работать... значение Locale.getDefault(). toString() имеет код вашей локали.