Android получает текущую локаль, а не по умолчанию
Как я могу получить текущий пользовательский язык в Android?
Я могу получить значение по умолчанию, но это может быть неверно не верно?
В принципе, я хочу, чтобы код из двух букв был из текущего языкового стандарта. Не по умолчанию. Нет Locale.current()
Ответы
Ответ 1
По умолчанию Locale
создается статически во время выполнения для вашего прикладного процесса из параметров системного свойства, поэтому он будет отображать Locale
, выбранный на этом устройстве , когда приложение было запущено. Как правило, это нормально, но это означает, что если пользователь изменит свои настройки Locale
в настройках после запуска вашего прикладного процесса, значение getDefaultLocale()
, вероятно, не будет немедленно обновлено.
Если вам нужно каким-то образом уловить такие события в вашем приложении, вы можете вместо этого попробовать получить Locale
, доступные из ресурса Configuration
, т.е.
Locale current = getResources().getConfiguration().locale;
Вы можете обнаружить, что это значение обновляется быстрее после изменения настроек, если это необходимо для вашего приложения.
Ответ 2
Обновление Android N (Api level 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;
}
}
Ответ 3
Если вы используете библиотеку поддержки Android, вы можете использовать ConfigurationCompat
вместо метода @Makalele, чтобы избавиться от предупреждений об устаревании:
Locale current = ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);
или в Котлине:
val currentLocale = ConfigurationCompat.getLocales(resources.configuration)[0]
Ответ 4
Из getDefault
документация:
Возвращает предпочитаемый пользователем язык. Это может быть переопределено для этого процесса с помощью setDefault (Locale).
Также из Locale
docs:
Локаль по умолчанию подходит для задач, связанных с представлением данных пользователю.
Похоже, вы должны просто использовать его.
Ответ 5
private Locale getLocale(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;
}
}