Обзор разрешения языка и локали

Начиная с Android 7.0 (уровень API 24), Android обеспечивает расширенную поддержку многоязычных пользователей, позволяя им выбирать несколько языков в настройках. Android предоставляет эту возможность, значительно расширяя количество поддерживаемых локалей и изменяя способ разрешения ресурсов системой.

Этот документ начинается с объяснения стратегии разрешения ресурсов в версиях Android ниже 7.0 (уровень API 24). Далее описывается улучшенная стратегия разрешения ресурсов в Android 7.0. Наконец, объясняется, как воспользоваться преимуществами расширенного количества языков для поддержки большего количества многоязычных пользователей.

Проблемы в решении языковых ресурсов

До Android 7.0 Android не всегда мог успешно сопоставить локали приложения и системы.

Например, предположим, что у вас следующая ситуация:

  • Языком вашего приложения по умолчанию является en_US (английский, США), а также испанские строки, локализованные в файлах ресурсов es_ES .
  • Устройство настроено на es_MX

Когда ваш Java-код ссылается на строки, система будет загружать строки из файла ресурсов по умолчанию ( en_US ), даже если в приложении есть ресурсы на испанском языке, локализованные под es_ES . Это связано с тем, что, когда система не может найти точное совпадение, она продолжает поиск ресурсов, удаляя код страны из локали. Наконец, если совпадение не найдено, система возвращается к значению по умолчанию, то есть en_US .

Система также по умолчанию будет использовать en_US если пользователь выберет язык, который приложение вообще не поддерживает, например французский. Например:

Таблица 1. Разрешение ресурсов без точного соответствия локали.

Пользовательские настройки Ресурсы приложений Разрешение ресурсов
fr_CH по умолчанию (ru)
де_DE
es_ES
fr_FR
it_IT
Попробуйте fr_CH => Не удалось
Попробуйте фр => Не удалось
Использовать по умолчанию (ru)

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

Улучшения в стратегии разрешения ресурсов

Android 7.0 (уровень API 24) обеспечивает более надежное разрешение ресурсов и автоматически находит лучшие резервные варианты. Однако для ускорения разрешения и улучшения удобства обслуживания следует хранить ресурсы на наиболее распространенном родительском диалекте. Например, если вы раньше хранили испанские ресурсы в каталоге values-es-rUS , переместите их в каталог values-b+es+419 , который содержит латиноамериканский испанский язык. Аналогично, если у вас есть строки ресурсов в каталоге с values-en-rGB , переименуйте этот каталог values-b+en+001 (международный английский), поскольку наиболее распространенным родительским элементом для строк en-GB является en-001 . Следующие примеры объясняют, почему эти методы повышают производительность и надежность разрешения ресурсов.

Примеры разрешения ресурсов

В версиях Android выше 7.0 случай, описанный в Таблице 1 , решается иначе:

Таблица 2. Улучшенная стратегия разрешения проблем, когда нет точного соответствия локали.

Пользовательские настройки Ресурсы приложений Разрешение ресурсов
  1. fr_CH
по умолчанию (ru)
де_DE
es_ES
fr_FR
it_IT
Попробуйте fr_CH => Не удалось
Попробуйте фр => Не удалось
Попробуйте дочерние элементы fr => fr_FR
Используйте fr_FR

Теперь пользователь получает французские ресурсы вместо английских. Этот пример также показывает, почему вам следует хранить французские строки в fr , а не fr_FR для Android 7.0 или выше. Здесь порядок действий заключается в сопоставлении с ближайшим родительским диалектом, что делает разрешение более быстрым и предсказуемым.

В дополнение к улучшенной логике разрешения, Android теперь предлагает на выбор больше языков пользователя. Давайте попробуем приведенный выше пример еще раз, указав итальянский в качестве дополнительного языка пользователя, но без поддержки приложения для французского языка.

Таблица 3. Разрешение ресурсов, когда приложение соответствует только второму предпочтительному языковому стандарту пользователя.

Пользовательские настройки Ресурсы приложений Разрешение ресурсов
  1. fr_CH
  2. зуд
по умолчанию (ru)
де_DE
es_ES
it_IT
Попробуйте fr_CH => Не удалось
Попробуйте фр => Не удалось
Попробуйте дети fr => Не удалось
Попробуйте_CH => Не удалось
Попробуйте => Не получится
Попробуйте дочерние элементы => it_IT
Используйте это_ИТ

Пользователь по-прежнему получает язык, который он понимает, хотя приложение не поддерживает французский язык.

Разработка приложения для поддержки дополнительных языков.

Android предоставляет инструменты, которые упрощают локализацию контента приложений и вовлечение пользователей на предпочитаемые ими языки. Мы рекомендуем использовать следующие методы для настройки вашего приложения, чтобы оно могло масштабироваться на разных языках и соглашениях по форматированию.

Укажите языки, которые поддерживает ваше приложение.

Чтобы гарантировать правильное разрешение языков, укажите языки, которые поддерживает ваше приложение, с помощью свойства resConfigs в файле build.gradle на уровне модуля.

В следующем примере кода показано, как использовать resConfigs для обозначения поддерживаемых языков. В этом примере приложение поддерживает английский и испанский языки.

классный

android {
    defaultConfig {
        ...
        resConfigs "en", "es"
    }
}

Котлин

android {
    defaultConfig {
        ...
        resConfigs("en", "es")
    }
}
Поскольку система сборки объединяет ресурсы вашего приложения и его зависимостей, вам необходимо указать поддерживаемые языки таким образом, чтобы гарантировать правильное получение настроек языка пользователя.

API списка локалей

Начиная с Android 7.0 (уровень API 24), Android предоставляет API LocaleList.getDefault() , который позволяет приложениям напрямую запрашивать список языков, указанных пользователем. Этот API позволяет создавать более сложное поведение приложения и более оптимизированное отображение контента. Например, поиск может отображать результаты на нескольких языках в зависимости от настроек пользователя. Браузерные приложения могут не предлагать перевод страниц на язык, который пользователь уже знает, а приложения для клавиатуры могут автоматически включать все подходящие раскладки.

Форматеры

Вплоть до Android 6.0 (уровень API 23) Android поддерживал только одну или две локали для многих распространенных языков (en, es, ar, fr, ru). Поскольку существовало всего несколько вариантов каждого языка, приложения могли сохранять некоторые числа и даты в виде жестко запрограммированных строк в файлах ресурсов. Однако из-за расширенного набора поддерживаемых языковых стандартов Android могут быть существенные различия в форматах дат, времени, валют и аналогичной информации даже в пределах одного языкового стандарта. Жесткое кодирование форматов может сбить с толку конечных пользователей. Поэтому при разработке для Android 7.0 или более поздних версий обязательно используйте средства форматирования вместо жесткого кодирования чисел и строк даты.

Например, Android 7.0 и выше включает поддержку 27 арабских языковых стандартов. Эти локали могут совместно использовать большинство ресурсов, но некоторые предпочитают цифры ASCII, а другие предпочитают собственные цифры. Например, если вы хотите создать предложение с цифровой переменной, например «Выберите 4-значный PIN-код», используйте средства форматирования, как показано ниже:

 format(locale, "Choose a %d-digit PIN", 4)