Основные понятия и реализация Jetpack Compose
Android работает на множестве устройств в разных регионах. Чтобы охватить как можно больше пользователей, убедитесь, что ваше приложение обрабатывает текст, аудиофайлы, числа, валюту и графику в соответствии с региональными стандартами.
В этой статье приведены рекомендации по локализации приложений Android.
Вам потребуются рабочие знания Kotlin или Java, а также понимание того, как загружаются ресурсы Android, как объявляются элементы пользовательского интерфейса в XML, как работает жизненный цикл объекта activity и каковы общие принципы интернационализации и локализации.
Рекомендуем использовать фреймворк ресурсов Android, чтобы максимально отделить локализованные аспекты приложения от его основных функций.
- Поместите большую часть или все содержимое пользовательского интерфейса приложения в файлы ресурсов, как описано на этой странице и в обзоре ресурсов приложения.
- Поведение пользовательского интерфейса определяется кодом на Kotlin или Java. Например, если пользователи вводят данные, которые необходимо форматировать или сортировать по-разному в зависимости от региональных настроек, то для программной обработки данных вы используете язык программирования Kotlin или Java. В этой статье не рассматривается локализация кода на основе Kotlin или Java.
Краткое руководство по локализации строк в приложении можно найти в статье Как адаптировать приложение для разных языков и культур.
Используйте ресурсы для локализации
В этом разделе рассказывается, как создавать ресурсы по умолчанию и альтернативные ресурсы. Также в ней объясняется, как назначается приоритет ресурсов и как ссылаться на ресурсы в коде.
Создать ресурсы по умолчанию
Добавьте текст по умолчанию в файл res/values/strings.xml. Для этих строк используйте язык по умолчанию – тот, на котором говорит большинство пользователей вашего приложения.
Набор ресурсов по умолчанию также включает в себя все графические объекты и макеты по умолчанию и может включать другие типы ресурсов, например анимацию. Эти ресурсы помещаются в следующие каталоги:
res/drawable/– обязательный каталог, содержащий как минимум один графический файл со значком приложения в Google Play.res/layout/– обязательный каталог, содержащий XML-файл, который определяет макет по умолчанию.res/anim/: обязательно, если у вас есть папкиres/anim-<qualifiers>.res/xml/: обязательно, если у вас есть папкиres/xml-<qualifiers>.res/raw/: обязательно, если у вас есть папкиres/raw-<qualifiers>.
Совет. Проверьте в коде все ссылки на ресурсы Android. Убедитесь, что для каждого из них определен ресурс по умолчанию. Также убедитесь, что файл строк по умолчанию содержит все строки. В локализованном файле строк может быть только часть строк, но в файле строк по умолчанию должны быть все строки.
Советы по локализации
Ниже приведены советы по локализации приложения.
Создание гибкого макета
Если вам нужно изменить макет для определенного языка, вы можете создать альтернативный макет для этого языка, например res/layout-de/main.xml для макета на немецком языке. Однако это может усложнить
обслуживание вашего приложения. Лучше создать один
макет, который будет более гибким.
Другая типичная ситуация – язык, требующий чего-то другого в своем макете. Например, в форме обратной связи может быть два поля для имени, если приложение работает на японском языке, и три – если на другом. Это можно сделать двумя способами:
- Создайте один макет с полем, которое можно программно включать или отключать в зависимости от языка.
- Включите в основной макет другой макет, содержащий изменяемое поле. Для второй раскладки можно задать разные конфигурации для разных языков.
Используйте объект Context в Android для поиска региональных настроек вручную
Вы можете найти региональные настройки с помощью объекта Context, который доступен в Android, как показано в примере ниже.
Kotlin
val primaryLocale: Locale = context.resources.configuration.locales[0] val locale: String = primaryLocale.displayName
Java
Locale primaryLocale = context.getResources().getConfiguration().getLocales().get(0); String locale = primaryLocale.getDisplayName();