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;
        }
    }