Как просмотреть/выбрать установленные языки на Android?

Я хочу сделать небольшое приложение, которое одним или двумя щелчками будет переключать системный язык между двумя, тремя или более предпочтительными языками, выбранными заранее из «официального» списка языков, то есть того, который отображается в Быстрых настройках> Настройки > Язык и ввод > Язык.

Как получить этот список программно? Это список локалей, доступный из Locale.getAvailableLocales()? Должен ли я добраться до языков из локалей? Спасибо!

введите здесь описание изображения

РЕДАКТИРОВАТЬ. Это то, что я сделал до сих пор:

  private List<Model> getModel() {
    Locale[] locales = Locale.getAvailableLocales();
    List<Model> list = new ArrayList<Model>();
    for (int i=0; i<locales.length; i++) {
        list.add(get(locales[i].getDisplayLanguage()));
    }
    return list;
  }

  private Model get(String s) {
    return new Model(s);
  }

Я смотрю эти варианты сейчас:

Locale.getDefault().getLanguage()        ---> en     
Locale.getDefault().getISO3Language()    ---> eng
Locale.getDefault().getCountry()         ---> US
Locale.getDefault().getISO3Country()     ---> USA
Locale.getDefault().toString()           ---> en_US
Locale.getDefault().getDisplayLanguage() ---> English
Locale.getDefault().getDisplayCountry()  ---> United States
Locale.getDefault().getDisplayName()     ---> English (United States)

из здесь.

РЕДАКТИРОВАТЬ 2 - еще 2 изображения, показывающие конец списка языков, где находятся параметры для китайского языка.

введите здесь описание изображения

Это список из системы.

введите здесь описание изображения

Этот список был сделан с помощью следующего кода:

Locale[] locales = Locale.getAvailableLocales();
List<Model> list = new ArrayList<Model>();
for (int i=0; i<locales.length; i++) {
    list.add(get(locales[i].getDisplayLanguage()+"|"+
            locales[i].toString()+"|"+
            locales[i].getDisplayName()
            ));
}
return list;

Теперь должен быть способ добраться до первого списка из второго списка, возможно, получить доступ к каким-то скрытым системным файлам?

РЕДАКТИРОВАТЬ 3. Я добавил следующий код, и он без проблем показывает китайские, португальские и испанские специальные символы (UTF-8):

list.add(get("Português (Brasil)"));
list.add(get("English (US)"));
list.add(get("中国(简体)"));
list.add(get("Español (Venezuela)"));

Теперь, как мне перейти отсюда, чтобы фактически изменить язык системы (без открытия намерения/действия, как показано ниже?

Intent intent = new Intent(Settings.ACTION_LOCALE_SETTINGS);
startActivity(intent);

person Rodrigo    schedule 24.12.2014    source источник
comment
Что ты пытаешься сделать? Планируете ли вы изменить язык в своем приложении?   -  person ChuongPham    schedule 24.12.2014
comment
да. Я хотел бы уменьшить количество необходимых кликов.   -  person Rodrigo    schedule 24.12.2014
comment
Щелчки не будут проблемой. Однако проблема заключается в том, какие языки будет поддерживать ваше приложение. Помните, что если у вас есть список языков, из которых пользователь может выбирать, вы также должны создать необходимый каталог values в своем проекте Android, в котором будет храниться переведенный текст для языков, которые вы хотите поддерживать. Получение языков из Locale.getAvailableLocales() вызовет ошибки, если определенный язык не переведен или отсутствует в вашем приложении для Android. Поэтому, пожалуйста, отредактируйте свой пост и укажите, что именно вы хотите.   -  person ChuongPham    schedule 24.12.2014
comment
Спасибо. Я добавил первый абзац. Поскольку это для личного пользования, меня сейчас интересуют португальский, английский, испанский и китайский языки.   -  person Rodrigo    schedule 24.12.2014
comment
Мне неясно ваше недавнее редактирование в отношении ваших пользовательских/бизнес-требований, а не ваших технических требований, т.е. я знаю, что вы можете получить с помощью метода Locale.getAvailableLocales(), но я не знаю, что вы хотите сделать с точки зрения пользователя/бизнеса. В любом случае, я привел пример в своем ответе ниже. Надеюсь, это поможет объяснить ваши фактические пользовательские/бизнес-требования.   -  person ChuongPham    schedule 24.12.2014
comment
Если я выберу Bahasa Indonesia, многие вещи будут переведены на Bahasa Indonesia. Это полезно для изучения Bahasa Indonesia. Я хотел бы сделать это через свое приложение, просто чтобы сэкономить 8 или 9 кликов. И я буду знать, что система может многое сказать о Bahasa Indonesia, потому что она есть в списке на изображении. Я покажу еще 2 изображения, чтобы вы увидели различия в моем устройстве.   -  person Rodrigo    schedule 24.12.2014


Ответы (2)


Вот API для получения всех доступных локалей вашего устройства.

public static Locale[] getAvailableLocales ()

Для получения дополнительной информации перейдите по этой общедоступной ссылке: http://developer.android.com/reference/java/util/Locale.html#getAvailableLocales()

person Vikasdeep Singh    schedule 24.12.2014

Если вы планируете поддерживать все возможные комбинации языков, то Locale.getAvailableLocales() может вам подойти.

Если нет, то вам нужно будет самостоятельно указать список языков в своем приложении для Android. Например, если ваше приложение поддерживает каталонский, чешский, датский и немецкий языки (или многие разновидности разговорного немецкого языка), вам лучше заполнить ListView статическим списком строк:

public static final String[] LANGS = new String[] {"English (Australia)", "Català (Espanya)","Čeština (Česká Republika)","Dansk (Danmark)","Deutsch (Österreich)","Deutsch (Belgien)","Deutsch (Schweiz)","Deutsch (Deutschland)","Deutsch (Liechtenstein)","Deutsch (Luxemburg)"};

public static final String[] LANG_CODES = new String[] {"en_au", "ca_ES","cs_CZ","da_DK","de_AT","de_BE","de_CH","de_DE","de_LI","de_LU"};

И в вашем проекте Android у вас будут следующие values каталога для поддержки вышеуказанных языков:

/res/values (English)
/res/values-ca (Catalan)
/res/values-cs (Czech)
/res/values-da (Danish)
/res/values-de (German)
person ChuongPham    schedule 24.12.2014
comment
Мне не нужны статические списки. Я хочу программно получить названия языков точно так, как они отображаются на изображении, т.е. получить доступ к Быстрым настройкам › Настройки › Язык и ввод › Язык. Таким образом, пользователь выберет, какой из этих языков он/она хочет добавить в список для переключения. - person Rodrigo; 24.12.2014
comment
Как я уже говорил ранее, будете ли вы поддерживать все возможные комбинации разговорных языков (существует более 260 языков)? Если нет, то метод Locale.getAvailableLocales(), который эквивалентен получению языков из Быстрые настройки › Настройки › Язык и ввод › Язык, вам не поможет. Ваше приложение аварийно завершает работу, когда пользователь выбирает язык, для которого у вас нет соответствующего файла перевода (strings.xml) в вашем проекте Android. - person ChuongPham; 24.12.2014
comment
В моем меню Sony Xperia около 60 языков, и я могу выбрать любой из них, и язык системы изменится. Это все, что я хочу сделать. Список языков берется из какого-то файла внутри телефона. Разве это не с открытым исходным кодом? Как я не могу найти и скопировать список? Я соглашусь показать XXXX или ____ для всего, что мой проект не имеет надлежащих файлов. Но английский (США), индонезийский индонезийский? Думаю, я мог бы показать их. - person Rodrigo; 24.12.2014
comment
Оба списка выглядят очень по-разному. Locale.getAvailableLocales() дает мне гораздо больше возможностей. - person Rodrigo; 24.12.2014
comment
Вот почему я предлагаю вам не использовать метод Locale.getAvailableLocales(). Если да, но у вас нет перевода (strings.xml) для данного языка, то ваше приложение просто аварийно завершает работу или, что еще хуже, вы или ваши пользователи выбираете индонезийский язык, и вместо этого ваше приложение отображает английский язык (поскольку индонезийский язык не поддерживается в ваше приложение). В заводскую прошивку Android вашего Sony Xperia будут включены все переводы. Если нет, то ни Google, ни Sony плохо справляются с тестированием своих прошивок Android на предмет поддержки интернационализации (i18n). - person ChuongPham; 24.12.2014
comment
Другое дело: Android-устройство Sony Xperia, продаваемое в Южной Америке, будет иметь набор языков, отличный от того, который продается в Европе, Азии или даже в Северной Америке. Таким образом, полагаться на метод Locale.getAvailableLocales(), чтобы предоставить вашему приложению список поддерживаемых языков, — это ожидающая катастрофа. Пользователи, как правило, довольно быстро удаляют приложения, если они не работают так, как рекламируется. - person ChuongPham; 24.12.2014
comment
Итак, Locale.getAvailableLocales() - это не то, что я ищу. Вероятно, это какие-то системные файлы, но я действительно новичок в Android. Я добавил 2 изображения, чтобы показать, что я думал, что это может быть. - person Rodrigo; 24.12.2014
comment
Файлы интернационализации системы, настройка и извлечение ПЗУ (например, прошивки Android) выходят за рамки этого поста. Я бы не рекомендовал идти по этому пути новым разработчикам Android, так как процесс довольно сложный. Попробуйте реализовать мой ответ для языков, которые вы хотите поддерживать, и посмотрите, как у вас пойдет. Это один из способов понять, как работает интернационализация Android. - person ChuongPham; 24.12.2014
comment
Хорошо, я попытаюсь. Большое спасибо! - person Rodrigo; 24.12.2014
comment
Давайте продолжим обсуждение в чате. - person Rodrigo; 24.12.2014