default()довольно безопасная ставка, просто не используйте ее для обработки (как говорят в документации).
A - C
@ A - C использовать его для обработки?
CQM
Да, посмотрите, что написано в документах : некоторые локали будут использовать «,» в качестве десятичной точки и «.» для группировки цифр. поэтому такие вещи, как parseInt () могут потерпеть неудачу. Обратите внимание, что они все еще рекомендуют использовать default(), но не для вещей, которые могут сломать код.
A - C
Ответы:
487
Значение по умолчанию Localeсоздается статически во время выполнения процесса приложения из параметров системных свойств, поэтому оно будет отображать Localeвыбранное на этом устройстве при запуске приложения . Как правило, это нормально, но это означает, что если пользователь изменит свои Localeнастройки после запуска процесса приложения, значение, getDefaultLocale()вероятно, не будет немедленно обновлено.
Если по какой-то причине вам нужно перехватывать подобные события в вашем приложении, вы можете вместо этого попытаться получить Localeдоступное из Configurationобъекта ресурса , т.е.
Locale current = getResources().getConfiguration().locale;
Вы можете обнаружить, что это значение обновляется быстрее после изменения настроек, если это необходимо для вашего приложения.
Кто-нибудь проверял, что языковой стандарт по умолчанию не изменяется в приложении при его изменении в системе? Я думаю, что это одно из тех «изменений конфигурации», которые делают действия уничтоженными и воссозданными
Михал К
11
Я проверял это, выводя оба, пока продолжал менять локаль; В результате получается то же самое. Таким образом, Locale.getDefault () можно безопасно использовать, поскольку он немедленно обновляется. Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
Алессио
58
Это было объявлено устаревшим в классе Configuration, см. Последние документы для этого совета: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.
MrBigglesworth
7
почему они просто не добавляют метод getFirstLocale (), чтобы избежать этого странного getLocales (). get (0)?
user3290180
1
Что делать, если вы хотите поддерживать более старые и новые версии API?
Иван
179
Обновление Android N (Api level 24) (без предупреждений):
Есть ли что-то в библиотеке поддержки, чтобы избежать if-else?
Федерико Понци
8
@TargetApi (Build.VERSION_CODES.N) не требуется в вашем коде, если вы включаете код if и запасной вариант
Патрик Фавр
@FedericoPonzi no ResourceCompat, по-видимому, не имеет метода для локали по состоянию на 25.0.1
Патрик Фавр
2
Это может не работать, если у пользователя установлено несколько языков. Вы должны использовать, так LocaleList.getDefault().get(0);как это вернет локали, отсортированные по предпочитаемому языку.
Кудрявый
21
@FedericoPonzi @ for3st Я нашел это в ConfigurationCompat, какConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
yuval
63
Если вы используете библиотеку поддержки Android, вы можете использовать ConfigurationCompatвместо метода @ Makalele избавление от предупреждений об устаревании:
Locale current =ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);
или в Котлине:
val currentLocale =ConfigurationCompat.getLocales(resources.configuration)[0]
этот ответ неправильный, получил локаль по умолчанию, но если пользователь изменил его на лету, он показывает неверно. следующий ответ правильный
user170317
согласен, неправильный ответ. В моем случае я искал способ не использовать getResources (), что означает, что мне нужен контекст. Моя проблема заключалась в том, что у вспомогательного класса не было контекста, но, думаю, мне придется передать его. Если у вас есть приложение, которое позволяет людям менять их локаль и изменять строки представлений, числовые форматы и т. Д., То вам нужно использовать ответ
Devunwired
Работа для меня Если я устанавливаю точку останова на Locale.setDefault(), она вызывается, когда я меняю язык устройства, по крайней мере, обратно на Android 5.0 (насколько я тестировал)
cambuncsive
6
Все ответы выше - не работают. Поэтому я поставлю здесь функцию, которая работает на 4 и 9 Android
Один из немногих ответов, который возвращает предпочтительное для пользователя направление языка на уровне устройства. Вы также можете использовать, LocaleListCompat.getDefault()если вы используете AndroidX.
default()
довольно безопасная ставка, просто не используйте ее для обработки (как говорят в документации).default()
, но не для вещей, которые могут сломать код.Ответы:
Значение по умолчанию
Locale
создается статически во время выполнения процесса приложения из параметров системных свойств, поэтому оно будет отображатьLocale
выбранное на этом устройстве при запуске приложения . Как правило, это нормально, но это означает, что если пользователь изменит своиLocale
настройки после запуска процесса приложения, значение,getDefaultLocale()
вероятно, не будет немедленно обновлено.Если по какой-то причине вам нужно перехватывать подобные события в вашем приложении, вы можете вместо этого попытаться получить
Locale
доступное изConfiguration
объекта ресурса , т.е.Вы можете обнаружить, что это значение обновляется быстрее после изменения настроек, если это необходимо для вашего приложения.
источник
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 level 24) (без предупреждений):
источник
LocaleList.getDefault().get(0);
как это вернет локали, отсортированные по предпочитаемому языку.ConfigurationCompat
, какConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
Если вы используете библиотеку поддержки Android, вы можете использовать
ConfigurationCompat
вместо метода @ Makalele избавление от предупреждений об устаревании:или в Котлине:
источник
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
Из
getDefault
документации:Также из
Locale
документов:Похоже, вы должны просто использовать его.
источник
Locale.setDefault()
, она вызывается, когда я меняю язык устройства, по крайней мере, обратно на Android 5.0 (насколько я тестировал)Все ответы выше - не работают. Поэтому я поставлю здесь функцию, которая работает на 4 и 9 Android
источник
LocaleListCompat.getDefault()
если вы используете AndroidX.Я использовал это:
источник
Согласно официальной документации, ConfigurationCompat устарела в библиотеках поддержки
Вы можете рассмотреть возможность использования
LocaleListCompat.getDefault()[0].toLanguageTag()
0-ая позиция будет предпочтительной для пользователя локальюЧтобы получить локаль по умолчанию в 0-й позиции было бы
LocaleListCompat.getAdjustedDefault()
источник