Это не те дроиды, которых вы ищете
У Android любопытный способ обработки локали.
С введением языковых настроек для каждого приложения все стало еще сложнее.
Этот пост не будет углубляться в объяснение закоулков локализации. Для этого существуют более качественные сообщения в блогах (и актуальная документация по Android).
Теория достаточно скучна, давайте посмотрим на реальный пример.
Конфигурация
Ограничьте языковые ресурсы.
Папки ресурсов должны выглядеть примерно так.
Давайте поэкспериментируем
- Android 11
Используется конфигурация ресурсов по умолчанию. (es-ES неподдерживается)
Locale.getDefault()
возвращает системныйязык.
Усиливать
Добавьте дополнительный системный язык: en-AU
.
Так как en-AU
поддерживается, Locale.getDefault()
будет совпадать с текущей конфигурацией ресурса.
Настройка локали с языковыми настройками для каждого приложения
Во-первых, используйте compat метод:
Давайте остановимся и рассмотрим, чего следует ожидать:
- Конфигурация ресурсов
it
поддерживается в файлеbuild.gradle
. - Его следует использовать, так как это запасной вариант для
it-IT
. - Помните, что мы работаем на Android 11 (языки для каждого приложения поддерживаются через системные настройки Android 13 и выше, а не ранее).
А как насчет Андроид 13+?
Та же установка, что и выше.
Установите it-IT
через AppCompatDelete.setApplicationLocales.
Locale.getDefault
теперь соответствует языковому стандарту приложения, в отличие от API ‹13.
Резюме
- Внимательно подумайте, что лучше всего подходит для вас при использовании заголовков
Accept-Language
. (или что-то в этом роде, где может потребоваться единая локализация) - Средства выбора языка в приложении могут быть реализованы с помощью библиотеки поддержки AndroidX для обратной совместимости со всеми версиями Android. Приятное дополнение, но добавляет накладные расходы на и без того запутанную проблему.
- Поведение может различаться в зависимости от версии API, локали системы и языковых настроек для каждого приложения.
Что, если?
Вместо этого можно использовать механизм разрешения ресурсов Android.
Язык/регион может быть объявлен произвольно в виде строк в соответствующих файлах strings.xml
для каждой конфигурации.
Однако это может привести к другим осложнениям. Локаль приложения теперь «привязана» к ресурсам.
Какой регион все-таки установить в папке en
? Сколько конфигураций ресурсов теперь должно поддерживать приложение? Нужен ли регион?
В зависимости от сложности вашего варианта использования этой простой вещи может быть достаточно.
Проблемы с библиотекой поддержки AndroidX
- AppCompatDelegate.getApplicationLocales() не вернет ничего (пустой список), если локаль приложения не была установлена вручную.
- Поскольку этот метод обращается к действию за кулисами для определения локали, его следует вызывать только после
Activity#onCreate
. Например, вызов этого по адресуApplication#onCreate
всегда ничего не вернет.
В любом случае
Надеюсь, вы нашли это несколько полезным.
@ твиттер
Позже.