Почему Locale.getDefault (). GetLanguage () в Android возвращает отображаемое имя вместо языкового кода? - PullRequest
10 голосов
/ 05 января 2012

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

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

Locale.getDefault().getLanguage()

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

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

Ответы [ 4 ]

14 голосов
/ 05 января 2012

Использование

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

и все будет работать нормально, хотя я бы посчитал, что ваше наблюдаемое поведение заслуживает внимания.

7 голосов
/ 05 января 2012

Я понял это. Это произошло потому, что я ранее вызвал Locale.setDefault () и передал ему 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. Обратите внимание, что я использовал заглавные буквы английского языка при неправильной настройке локали, но в конце он возвращает «английский» все строчные буквы.
4 голосов
/ 05 января 2012

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

1 голос
/ 05 сентября 2013

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

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

...