Это не те дроиды, которых вы ищете

У 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.

Резюме

  1. Внимательно подумайте, что лучше всего подходит для вас при использовании заголовков Accept-Language. (или что-то в этом роде, где может потребоваться единая локализация)
  2. Средства выбора языка в приложении могут быть реализованы с помощью библиотеки поддержки AndroidX для обратной совместимости со всеми версиями Android. Приятное дополнение, но добавляет накладные расходы на и без того запутанную проблему.
  3. Поведение может различаться в зависимости от версии API, локали системы и языковых настроек для каждого приложения.

Что, если?

Вместо этого можно использовать механизм разрешения ресурсов Android.

Язык/регион может быть объявлен произвольно в виде строк в соответствующих файлах strings.xml для каждой конфигурации.

Однако это может привести к другим осложнениям. Локаль приложения теперь «привязана» к ресурсам.

Какой регион все-таки установить в папке en? Сколько конфигураций ресурсов теперь должно поддерживать приложение? Нужен ли регион?

В зависимости от сложности вашего варианта использования этой простой вещи может быть достаточно.

Проблемы с библиотекой поддержки AndroidX

  • AppCompatDelegate.getApplicationLocales() не вернет ничего (пустой список), если локаль приложения не была установлена ​​вручную.
  • Поскольку этот метод обращается к действию за кулисами для определения локали, его следует вызывать только после Activity#onCreate . Например, вызов этого по адресу Application#onCreate всегда ничего не вернет.

В любом случае

Надеюсь, вы нашли это несколько полезным.

@ твиттер

Позже.