Android работает на множестве устройств в разных регионах. Чтобы охватить как можно больше пользователей, убедитесь, что ваше приложение обрабатывает текст, аудиофайлы, числа, валюту и графику в соответствии с региональными стандартами.
На этой странице описаны рекомендации по локализации приложений для Android.
Вам потребуются рабочие знания Kotlin, а также понимание того, как загружаются ресурсы Android, как устроен жизненный цикл объекта activity и каковы общие принципы интернационализации и локализации.
Рекомендуем использовать фреймворк ресурсов Android, чтобы максимально отделить локализованные аспекты приложения от его основных функций.
- Поместите большую часть или все содержимое пользовательского интерфейса приложения в файлы ресурсов, как описано на этой странице и в обзоре ресурсов приложения.
- Поведение пользовательского интерфейса, с другой стороны, определяется вашим кодом на основе Kotlin. Например, если пользователи вводят данные, которые необходимо отформатировать или отсортировать по-разному в зависимости от региона, вы используете Kotlin для программной обработки данных. В этой статье не рассматривается локализация кода на основе Kotlin.
В этом руководстве рассматривается основная система локализации Android, используемая во всех приложениях Android. Чтобы узнать, как загрузить эти локализованные ресурсы в интерфейс Jetpack Compose, ознакомьтесь со статьей Ресурсы в Compose.
Краткое руководство по локализации строк в приложении можно найти в статье Как адаптировать приложение для разных языков и культур.
Обзор: переключение ресурсов в Android
Ресурсы – это текстовые строки, звуки, графика и другие статические данные, необходимые для работы приложения Android. Приложение может включать несколько наборов ресурсов, каждый из которых настроен для определенной конфигурации устройства. Когда пользователь запускает приложение, Android автоматически выбирает и загружает ресурсы, которые лучше всего подходят для устройства.
В этой статье рассказывается о локализации и региональных настройках. Полное описание переключения ресурсов и всех типов конфигураций, которые можно указать, например ориентации экрана или типа сенсорного экрана, приведено в статье Предоставление альтернативных ресурсов.
При написании приложения вы создаете ресурсы по умолчанию и альтернативные ресурсы, которые будут использоваться в приложении. Когда пользователь запускает приложение, система Android выбирает ресурсы для загрузки на основе региональных настроек устройства.
Чтобы создать ресурсы, поместите файлы в подкаталоги каталога res/ проекта.
Почему важны ресурсы по умолчанию
Если приложение запускается в регионе, для которого вы не предоставили локализованный текст, Android загружает строки по умолчанию из res/values/strings.xml. Если этот файл отсутствует или в нем нет нужной строки, приложение не запустится и покажет ошибку. В примере ниже показано, что может произойти, если текстовый файл по умолчанию неполный.
Пример
Код приложения на основе Kotlin ссылается только на две строки: text_a и text_b. В приложении есть локализованный файл ресурсов (res/values-en/strings.xml), в котором text_a и text_b определены на английском языке.
В приложении также есть файл ресурсов по умолчанию (res/values/strings.xml), в котором есть определение для text_a, но нет для text_b.
- Если запустить это приложение на устройстве, где выбран английский язык, оно будет работать без проблем, поскольку в файле
res/values-en/strings.xmlесть обе нужные строки. - Однако при запуске приложения на устройстве, где выбран другой язык, пользователь видит сообщение об ошибке и кнопку "Закрыть принудительно". Приложение не загружается.
Чтобы избежать этой ситуации, убедитесь, что файл res/values/strings.xml существует и в нем определены все необходимые строки. Это относится ко всем типам ресурсов, а не только к строкам. Вам нужно создать набор файлов ресурсов по умолчанию, содержащий все ресурсы, которые вызывает ваше приложение, например графические объекты, шрифты или цвета. Подробнее о тестировании ресурсов по умолчанию…
Используйте ресурсы для локализации
В этом разделе рассказывается, как создавать ресурсы по умолчанию и альтернативные ресурсы. Также в ней объясняется, как назначается приоритет ресурсов и как ссылаться на ресурсы в коде.
Создать ресурсы по умолчанию
Добавьте текст по умолчанию в файл res/values/strings.xml. Для этих строк используйте язык по умолчанию – тот, на котором говорит большинство пользователей вашего приложения.
Набор ресурсов по умолчанию также включает все графические объекты по умолчанию и может включать другие типы ресурсов, например значки или строки. Эти ресурсы помещаются в следующие каталоги:
res/drawable/– обязательный каталог, содержащий как минимум один графический файл со значком приложения в Google Play.res/xml/: обязательно, если у вас есть папкиres/xml-<qualifiers>.res/raw/: обязательно, если у вас есть папкиres/raw-<qualifiers>.
Как создать альтернативные ресурсы
Большая часть локализации приложения заключается в предоставлении альтернативного текста для разных языков. В некоторых случаях вы также предоставляете альтернативные графические, звуковые и другие ресурсы, зависящие от региона.
В приложении можно указать несколько каталогов res/<qualifiers>/, каждый из которых будет иметь разные квалификаторы. Чтобы создать альтернативный ресурс для другой локали, используйте модификатор, указывающий язык или комбинацию языка и региона. Название каталога ресурсов должно соответствовать схеме, описанной в разделе Предоставление альтернативных ресурсов. В противном случае приложение не будет скомпилировано.
Пример
Предположим, что язык приложения по умолчанию – английский. Вы хотите перевести весь текст на французский, а на японский – все, кроме названия приложения. В этом случае вы создаете три файла strings.xml, каждый из которых хранится в каталоге ресурсов для определенного региона:
res/values/strings.xml
Содержит английский текст для всех строк, используемых приложением, включая текст для строки с именемtitle.res/values-fr/strings.xml
Содержать текст на французском языке для всех строк, включаяtitle.res/values-ja/strings.xml
Содержать текст на японском языке для всех строк, кромеtitle.
Если ваш код на Kotlin ссылается на R.string.title, то во время выполнения происходит следующее:
- Если на устройстве выбран любой другой язык, Android загружает строку
titleиз файлаres/values/strings.xml. - Если на устройстве выбран французский язык, Android загружает
titleиз файлаres/values-fr/strings.xml.
Если на устройстве выбран японский язык, Android ищет title в файле res/values-ja/strings.xml. Но поскольку в этом файле нет такой строки, Android возвращается к значению по умолчанию и загружает title на английском языке из файла res/values/strings.xml.
Какие ресурсы имеют приоритет?
Если конфигурации устройства соответствует несколько файлов ресурсов, Android выбирает нужный файл по определенным правилам. Среди модификаторов, которые можно указать в названии каталога ресурсов, региональные настройки почти всегда имеют приоритет.
Пример
Предположим, что в приложении есть набор графических ресурсов по умолчанию и два других набора, каждый из которых оптимизирован для определенной конфигурации устройства:
res/drawable/
Содержит графические объекты по умолчанию.res/drawable-small-land-stylus/
Содержит графику, оптимизированную для использования с устройством, которое ожидает ввода со стилуса и имеет экран QVGA с низким разрешением в альбомной ориентации.res/drawable-ja/
Содержит графику, оптимизированную для использования с японским языком.
Если приложение запущено на устройстве, на котором выбран японский язык, Android загружает графику из папки res/drawable-ja/, даже если устройство поддерживает ввод с помощью стилуса и имеет экран QVGA с низким разрешением в альбомной ориентации.
Исключение. Единственные модификаторы, которые имеют приоритет над региональными настройками, – это код MCC и код мобильной сети.
Пример
Предположим, что у вас следующая ситуация:
- Код приложения вызывает
R.string.text_a. - Доступны два файла ресурсов:
res/values-mcc404/strings.xml, в том числеtext_aна языке приложения по умолчанию, в данном случае на английском.res/values-hi/strings.xml, в том числеtext_aна хинди.
- Устройство, на котором запускается приложение, имеет следующую конфигурацию:
- SIM-карта подключена к мобильной сети в Индии (MCC 404).
- Язык – хинди (
hi).
Android загружает text_a из res/values-mcc404/strings.xml (на английском языке), даже если на устройстве выбран хинди. Это связано с тем, что при выборе ресурсов Android предпочитает совпадение MCC совпадению языка.
Процесс выбора не всегда так прост, как в этих примерах. Более подробное описание этого процесса можно найти в статье Как Android находит наиболее подходящий ресурс. Все модификаторы описаны и перечислены в порядке приоритета в обзоре ресурсов приложения.
Как ссылаться на ресурсы в коде
В коде приложения на основе Kotlin вы ссылаетесь на ресурсы, используя синтаксис R.resource_type.resource_name или android.R.resource_type.resource_name.
Подробнее о том, как получить доступ к ресурсам приложения…
Управление строками для локализации
В этом разделе приведены рекомендации по управлению строками, связанными с локализацией.
Переместите все строки в файл strings.xml.
При создании приложений не задавайте строки в коде. Вместо этого объявите все строки как ресурсы в файле strings.xml по умолчанию. Это упростит их обновление и локализацию. Строки в файле strings.xml можно легко извлечь, перевести и интегрировать обратно в приложение с соответствующими квалификаторами, не внося никаких изменений в скомпилированный код.
Например, с помощью Compose вы можете загрузить строку следующим образом:
// In the res/values/strings.xml file // <string name="compose">Jetpack Compose</string> // In your Compose code Text( text = stringResource(R.string.compose) )
Если вы генерируете изображения с текстом, поместите эти строки в strings.xml и сгенерируйте изображения заново после перевода.
Следуйте рекомендациям Android по созданию строк интерфейса
При разработке интерфейса обращайте особое внимание на то, как вы общаетесь с пользователем. В целом, используйте лаконичный стиль, который является дружелюбным, но кратким, и используйте последовательный стиль во всех ваших пользовательских интерфейсах.
Обязательно прочитайте и соблюдайте рекомендации Material Design по стилю и выбору слов. Это делает приложение более привлекательным и помогает пользователям быстрее разобраться в интерфейсе.
Кроме того, по возможности всегда используйте стандартную терминологию Android, например для таких элементов интерфейса, как панель приложения, меню параметров, системная строка и уведомления. Правильное и единообразное использование терминов Android упрощает перевод и позволяет получить более качественный конечный продукт для пользователей.
Предоставляйте достаточный контекст для объявленных строк
При объявлении строк в файле strings.xml обязательно описывайте контекст, в котором они используются. Эта информация бесценна для переводчика и позволяет получить более качественный перевод. Это также помогает вам управлять
вашими строками более эффективно.
Пример:
<!-- The action for submitting a form. This text is on a button that can fit 30 chars --> <string name="login_submit_button">Sign in</string>
Рекомендуем указать следующую информацию:
- Для чего нужна эта строка? Когда и где он показывается пользователю?
- Где это находится в интерфейсе? Например, перевод текста на кнопках менее гибкий, чем в текстовых полях.
Как отметить части сообщения, которые не нужно переводить
Часто строки содержат текст, который не нужно переводить на другие языки. Это может быть фрагмент кода, плейсхолдер для значения, специальный символ или название. При подготовке строк к переводу найдите и отметьте текст, который должен остаться без изменений, чтобы переводчик не изменил его.
Чтобы отметить текст, который не нужно переводить, используйте тег-плейсхолдер <xliff:g>.
Вот пример тега, который указывает, что текст "%1$s" не нужно менять при переводе, чтобы не исказить смысл сообщения:
<string name="countdown"> <xliff:g id="time" example="5 days">%1$s</xliff:g> until holiday </string>
При объявлении тега-плейсхолдера добавьте атрибут ID, который объясняет, для чего предназначен плейсхолдер. Если ваше приложение позже заменяет значение-плейсхолдер, обязательно укажите пример атрибута, чтобы уточнить ожидаемое использование.
Вот ещё несколько примеров тегов-плейсхолдеров:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- Example placeholder for a special Unicode symbol --> <string name="star_rating">Check out our 5 <xliff:g id="star">\u2605</xliff:g> </string> <!-- Example placeholder for a URL --> <string name="app_homeurl"> Visit us at <xliff:g id="application_homepage">http://my/app/home.html</xliff:g> </string> <!-- Example placeholder for a name --> <string name="prod_name"> Learn more at <xliff:g id="prod_gamegroup">Game Group</xliff:g> </string> <!-- Example placeholder for a literal --> <string name="promo_message"> Please use the "<xliff:g id="promotion_code">ABCDEFG</xliff:g>" to get a discount. </string> ... </resources>
Контрольный список по локализации
Подробную информацию о локализации и распространении приложений для Android можно найти в статье Как перевести и локализовать приложение.
Советы по локализации
Ниже приведены советы по локализации приложения.
Разработайте приложение, которое будет работать в любом регионе
Не делайте предположений об устройстве, на котором пользователь запускает ваше приложение. Устройство может иметь аппаратное обеспечение, которое вы не ожидали, или оно может быть настроено на языковой стандарт, который вы не планировали или не можете протестировать. Разрабатывайте приложение так, чтобы оно работало нормально или корректно завершало работу независимо от того, на каком устройстве оно запущено.
Важно! Убедитесь, что в приложении есть полный набор ресурсов по умолчанию. Для этого добавьте папки res/drawable/ и res/values/, не указывая в их названиях дополнительные модификаторы. В этих папках должны содержаться все изображения и тексты, необходимые для работы приложения.
Если в приложении отсутствует хотя бы один ресурс по умолчанию, оно не будет работать на устройстве с неподдерживаемыми региональными настройками. Например, если в файле res/values/strings.xml по умолчанию отсутствует одна строка, необходимая приложению, то при запуске приложения в неподдерживаемом регионе и попытке загрузить res/values/strings.xml пользователь увидит сообщение об ошибке и кнопку "Закрыть принудительно".
Подробнее об этом рассказывается в разделе Проверка ресурсов по умолчанию.
Не создавайте лишние файлы ресурсов и текстовые строки
Вероятно, вам не нужно создавать альтернативные ресурсы для каждого региона. Например, логотип приложения, определенный в каталоге res/drawable/, может работать в любом регионе, и в этом случае нет необходимости создавать альтернативные графические файлы.
Кроме того, вам может не понадобиться создавать альтернативный текст для каждой строки. Рассмотрим следующий пример:
- Язык приложения по умолчанию – американский английский. Все строки, используемые приложением, определены в файле
res/values/strings.xmlна американском английском. - Для нескольких важных фраз вы хотите указать британское написание. Вы хотите, чтобы эти альтернативные строки использовались, когда ваше приложение запускается на устройстве в Великобритании.
Для этого создайте небольшой файл res/values-en-rGB/strings.xml, в который включите только те строки, которые должны отличаться в версии приложения для Великобритании. Для всех остальных строк приложение будет использовать значения по умолчанию, заданные в файле res/values/strings.xml.
Использовать LocalConfiguration для поиска региональных настроек вручную
Вы можете найти региональные настройки с помощью LocalConfiguration, доступного в Android, как показано в следующем примере:
val locale = LocalConfiguration.current.locales[0]
Чтобы заказать профессиональный
Сервис локализации приложений интегрирован в Play Console. Вы можете мгновенно узнать стоимость и разместить заказ в бюро переводов. Вы можете заказать перевод на один или несколько языков для строк интерфейса приложения, текста на странице в Google Play, названий покупок в приложении и текста рекламной кампании.
Как перевести интерфейс приложения с помощью Gemini
Вы можете использовать Gemini в Android Studio, чтобы переводить строковые ресурсы приложения прямо в проекте. Подробнее о том, как локализовать приложение…
Тестирование локализованных приложений
Протестируйте локализованное приложение на устройстве или в эмуляторе Android. В частности, убедитесь, что в приложение включены все необходимые ресурсы по умолчанию.
Тестирование на устройстве
Учитывайте, что устройство, на котором вы проводите тестирование, может значительно отличаться от устройств, доступных пользователям в других регионах. Региональные настройки, доступные на вашем устройстве, могут отличаться от доступных на других устройствах. Кроме того, разрешение и плотность экрана устройства могут различаться, что может повлиять на отображение строк и графических объектов в пользовательском интерфейсе.
Чтобы изменить региональные настройки или язык на устройстве, используйте приложение "Настройки".
Тестирование с помощью предварительного просмотра composable-функций
Прежде чем тестировать локализованный интерфейс на устройстве, вы можете воспользоваться предварительным просмотром composable-функций в Android Studio. Это позволит вам не развертывать приложение в эмуляторе. Чтобы посмотреть, как будет выглядеть интерфейс на разных языках, используйте аннотацию @Preview (например, @Preview(locale = "fr")). Вы также можете протестировать макеты с направлением письма справа налево, указав соответствующий регион, например @Preview(locale = "ar").
Тестирование в эмуляторе
Подробнее о том, как запускать приложения в Android Emulator…
Как создать и использовать специальный региональный параметр
"Специальная" локаль – это комбинация языка и региона, которая не поддерживается образом системы Android. Вы можете проверить, как ваше приложение работает в пользовательской локали, создав ее в эмуляторе. Это можно сделать двумя способами:
- Используйте приложение Custom Locale, которое доступно на вкладке приложений. Чтобы переключиться на созданный язык, нажмите на его название и удерживайте.
- Измените региональные настройки на пользовательские в оболочке
adb, как описано в следующем разделе.
Если вы выберете в эмуляторе язык, недоступный в образе системы Android, то система будет отображаться на языке по умолчанию. Однако ваше приложение локализовано правильно.
Как изменить региональные настройки эмулятора в оболочке adb
Чтобы изменить региональные настройки в эмуляторе с помощью оболочки adb, выполните следующие действия:
- Выберите регион, который хотите протестировать, и определите его языковой тег BCP-47, например
fr-CAдля канадского французского. - Запустите эмулятор.
- В командной строке на хост-компьютере выполните следующую команду:
adb shell
Если у вас подключено устройство, укажите, что вы хотите использовать эмулятор, добавив параметр-e:
adb -e shell - В командной строке
adb(#) выполните следующую команду:
setprop persist.sys.locale [BCP-47 language tag];stop;sleep 5;start
Замените разделы в скобках соответствующими кодами из шага 1.
Например, чтобы протестировать канадский французский, выполните следующие действия:
setprop persist.sys.locale fr-CA;stop;sleep 5;start
Эмулятор будет перезапущен. Когда снова появится главный экран, перезапустите приложение. Оно откроется с новыми региональными настройками.
Проверка ресурсов по умолчанию
Чтобы проверить, содержит ли приложение все необходимые строковые ресурсы, выполните следующие действия:
- Установите на эмуляторе или устройстве язык, который не поддерживается в вашем приложении. Например, если в приложении есть строки на французском языке в
res/values-fr/, но нет строк на испанском вres/values-es/, установите в эмуляторе испанский язык. Чтобы задать в эмуляторе неподдерживаемый региональный стандарт, можно использовать приложение Custom Locale. - Запустите приложение.
- Если в приложении появляется сообщение об ошибке и кнопка "Закрыть принудительно", возможно, оно ищет недоступную строку. Убедитесь, что в файле
res/values/strings.xmlесть определение для каждой строки, используемой в приложении.
Если тестирование прошло успешно, повторите его для других типов конфигураций. Например, если в приложении есть файл строк res/values-land/strings.xml, но нет файла res/values-port/strings.xml, установите на эмуляторе или устройстве книжную ориентацию и проверьте, работает ли приложение.
Дополнительные ресурсы
Дополнительную информацию о локализации можно найти в следующих ресурсах: