Як отримати поточний 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()
це досить безпечна ставка, просто не використовуйте її для обробки (як кажуть документи).