Як отримати поточний Locale користувача в Android?
Я можу отримати за замовчуванням, але це може бути не правильним?
В основному я хочу, щоб двомовний код мови з поточної мови. Не за замовчуванням. НемаєLocale.current()
Як отримати поточний Locale користувача в Android?
Я можу отримати за замовчуванням, але це може бути не правильним?
В основному я хочу, щоб двомовний код мови з поточної мови. Не за замовчуванням. НемаєLocale.current()
Відповіді:
За замовчуванням Localeпобудовано статично під час виконання вашого додатка з налаштувань системних властивостей, тому він буде представляти Localeвибраний на цьому пристрої під час запуску програми . Як правило, це нормально, але це означає, що якщо користувач змінить свої Localeналаштування після запуску вашого додатка, значення, getDefaultLocale()ймовірно, не буде одразу оновлено.
Якщо вам потрібно чомусь захопити подібні події у вашій програмі, ви можете замість цього спробувати отримати Localeдоступне від ресурсу Configurationоб’єкт, тобто
Locale current = getResources().getConfiguration().locale;
Ви можете виявити, що це значення оновлюється швидше після зміни налаштувань, якщо це необхідно для вашої програми.
Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
locale This field was deprecated in API level 24. Do not set or read this directly. Use getLocales() and setLocales(LocaleList). If only the primary locale is needed, getLocales().get(0) is now the preferred accessor.
Оновлення Android N (рівень Api 24) (без попереджень):
Locale getCurrentLocale(Context context){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
return context.getResources().getConfiguration().getLocales().get(0);
} else{
//noinspection deprecation
return context.getResources().getConfiguration().locale;
}
}
LocaleList.getDefault().get(0);оскільки це поверне Локали, відсортовані за бажаною мовою.
ConfigurationCompat, якConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
Якщо ви користуєтеся бібліотекою підтримки Android, ConfigurationCompatзамість методу @ Makalele ви можете позбутися попереджень про депресацію:
Locale current = ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);
або в Котліні:
val currentLocale = ConfigurationCompat.getLocales(resources.configuration)[0]
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
З getDefaultросійської документації:
Повертає бажаний локальний користувач. Це можливо було замінено для цього процесу за допомогою setDefault (Locale).
Також із Localeдокументів:
Мова за замовчуванням підходить для завдань, що передбачають представлення даних користувачеві.
Здається, ви повинні просто використовувати його.
Locale.setDefault(), вона буде викликана, коли я зміню мову пристрою хоча б назад на Android 5.0 (це настільки, наскільки я тестував)
Усі відповіді вище - не працюють. Тому я поставлю сюди функцію, яка працює на 4 та 9 андроїд
private String getCurrentLanguage(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
return LocaleList.getDefault().get(0).getLanguage();
} else{
return Locale.getDefault().getLanguage();
}
}
LocaleListCompat.getDefault()якщо ви використовуєте AndroidX.
Згідно з офіційною документацією, ConfigurationCompat застарілий у бібліотеках підтримки
Ви можете розглянути можливість використання
LocaleListCompat.getDefault()[0].toLanguageTag() 0-а позиція буде кращим для користувача мовою
Отримати локаль за замовчуванням на 0-й позиції було б
LocaleListCompat.getAdjustedDefault()
default()це досить безпечна ставка, просто не використовуйте її для обробки (як кажуть документи).