2014-12-24 3 views
2

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

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

enter image description here

EDIT - Это то, что я сделал до сих пор:

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) 

из here.

EDIT 2 - еще 2 изображения, показывающие конец списка языков, где находятся варианты для китайцев.

enter image description here

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

enter image description here

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

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; 

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

EDIT 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); 
+1

Что вы пытаетесь сделать? Планируете ли вы изменить язык в своем приложении? – ChuongPham

+0

Да. Я хотел бы уменьшить количество необходимых кликов. – Rodrigo

+0

Клики не будут проблемой. Проблема, однако, в том, какие языки поддерживаются вашим приложением. Помните, что если у вас есть список языков, из которых пользователь может выбрать, вы также должны создать необходимый каталог 'values' в своем проекте Android, который содержит переведенный текст для языков, которые вы хотите поддерживать. Получение языков из 'Locale.getAvailableLocales()' приведет к ошибкам, если конкретный язык не был переведен или отсутствует в приложении для Android. Итак, отредактируйте свой пост и опишите, что вы хотите точно. – ChuongPham

ответ

2

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

public static Locale[] getAvailableLocales() 

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

+0

Спасибо. Пожалуйста, посмотрите мое редактирование. – Rodrigo

1

Если планируется поддерживать все возможные комбинации языков там, то 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) 
+0

Мне не нужны статические списки. Я хочу программно получить имена языков точно так, как они появляются на изображении, то есть получить доступ к быстрым настройкам> Настройки> Язык и ввод> Язык. Таким образом, пользователь выберет, какой из этих языков он или она захочет включить в список для переключения. – Rodrigo

+0

Как я уже говорил, поддержите ли вы все возможные сочетания разговорных языков (более 260 языков)? Если нет, то использование метода 'Locale.getAvailableLocales()', что эквивалентно получению языков из ** Быстрых настроек> Настройки> Язык и ввод> Язык **, не поможет. Ваше приложение выйдет из строя, когда пользователь выберет язык, для которого у вас нет соответствующего файла перевода ('strings.xml') в вашем проекте Android. – ChuongPham

+0

У меня есть около 60 языков в моем меню Sony Xperia, и я могу выбрать любой из них и изменить системный язык. Это все, что я хочу сделать. Список языков поступает из некоторого файла внутри телефона. Разве это не open-source? Как я не могу найти и скопировать список? Я соглашусь выставить XXXX или ____ для чего-либо, у моего проекта нет соответствующих файлов. Но «английский (США)», «Bahasa Indonesia»? Думаю, я смогу показать их. – Rodrigo

Смежные вопросы