Вступление
Локализация — это процесс предоставления соответствующих ресурсов для вашего приложения на основе языковых настроек устройства.
Если ваше приложение предназначено для определенной локали, то локализация может не потребоваться. Если он нацелен на разные регионы, говорящие на разных языках, это может увеличить его охват и сделать его более удобным для людей, говорящих на других языках.
Ваше приложение должно предоставлять текст, аудиофайлы, числа, валюту и графику, которые соответствуют используемым языкам.
В иерархии Android файлы ресурсов размещаются в подкаталогах папки res
Чтобы квалифицировать ресурс, который будет использоваться в определенной локали, вы создаете дополнительные каталоги внутри res/
коды языка ISO 639–1 в конце имени каталога, за которыми может следовать двухбуквенный ISO 3166–1- код региона альфа – 2 (с префиксом «r»).
Включение классификатора региона нацеливает ресурсы еще более конкретно. Например, вместо использования ‘-es’, который является классификатором языка для испанского языка, вы можете предоставить различные ресурсы для España (-es-rES) и Estados Unidos (-es-rUS), представляющих испанский язык, на котором говорят в Испании и на латыни. Америка соответственно.
Когда пользователь запускает ваше приложение и язык устройства установлен на указанный вами язык, система Android загрузит ресурсы этого языка.
Пример приложения, которое поддерживает английский (как язык по умолчанию) и французский, можно увидеть в иерархии файлов ниже.
MyApp/
src/
MainActivity.java
res/
drawable/
background.png
drawable-fr/
background.png
layout/
activity_main.xml
values/
strings.xml
values-fr/
strings.xml
Вы можете предоставить языковые каталоги для любого каталога, который разрешен в папке res/
Имена подкаталогов привязаны к системе сборки Android, вы не можете указать свои собственные. Ну, вы можете, и приложение будет работать без ошибок, но любые ресурсы, которые вы включаете в этот подкаталог, будут игнорироваться.
Ресурсы также должны быть сохранены в подкаталоге res
Если вы сохраните в корневом каталоге, будут ошибки сборки. Для получения списка поддерживаемых подкаталогов res
проверьте документацию .
В приведенном выше примере показано приложение, которое имеет разные strings
Поскольку английский язык является языком по умолчанию, поддерживаемым приложением, нет необходимости включать ресурсы с расширением -en
Ресурсы по умолчанию
Вы должны предоставить ресурсы по умолчанию в ваших проектах. Это ресурсы, найденные в неквалифицированных каталогах ресурсов, например drawable/
values/
Важно предоставить ресурсы по умолчанию. Если ваше приложение не найдет ресурс, который соответствует конфигурации устройства, и нет ресурса по умолчанию, к которому он может обратиться, произойдет сбой.
В приведенной выше иерархии примеров у вас может возникнуть соблазн квалифицировать все ваши ресурсы и, таким образом, добавить классификатор английского языка в файлы, предназначенные для английских локалей, как показано ниже.
MyApp/
src/
MainActivity.java
res/
drawable-en/
background.png
drawable-fr/
background.png
layout/
activity_main.xml
values-en/
strings.xml
values-fr/
strings.xml
Это не очень хорошая идея. Когда приложение запускается на устройстве с языковым стандартом, который не поддерживается, приложение будет аварийно завершать работу.
Убедитесь, что ресурс по умолчанию определен для всех ресурсов. Ваши строковые файлы по умолчанию должны быть завершены. Локализованные файлы могут быть подмножеством строк по умолчанию, но по умолчанию должны содержать все из них.
Этот тип пропуска может остаться незамеченным, тем более что IDE не выделит его, и вы не увидите проблему при тестировании с устройством или эмулятором, который имеет поддерживаемые локали.
Тестирование для ресурсов по умолчанию
Вам следует проверить ресурсы по умолчанию, чтобы убедиться, что они все доступны в файлах по умолчанию.
Для этого просто измените локаль вашего устройства или эмулятора на локаль, не поддерживаемую вашим приложением. Если вы запустите приложение и получите сообщение об ошибке и кнопку «Принудительно закрыть», возможно, оно ищет ресурс, который недоступен в подкаталогах по умолчанию.
Приоритет квалификации
Поскольку Android позволяет указывать разные ресурсы для разных сценариев использования устройства, иногда используемая конфигурация может соответствовать нескольким альтернативным ресурсам.
Квалификаторы имеют разные приоритеты, которые используются для определения загруженного ресурса. Приоритет основан на порядке, указанном ниже.
- MCC (код страны мобильной связи) и MNC (код сети мобильной связи)
- Язык и регион
- Направление расположения
- Наименьшая ширина
- Доступная ширина
- Доступная высота
- Размер экрана
- Экран аспект
- Ориентация экрана
- Режим пользовательского интерфейса
- Ночной режим
- Плотность пикселей экрана (точек на дюйм)
- Тип сенсорного экрана
- Наличие клавиатуры
- Основной метод ввода текста
- Наличие навигационной клавиши
- Основной метод бесконтактной навигации
- Версия платформы (уровень API)
В качестве примера рассмотрим иерархию приложения ниже
MyApp/
src/
MainActivity.java
res/
values/
strings.xml
values-fr/
strings.xml
values-land
strings.xml
Приложение имеет альтернативные ресурсы для французского языка и для ландшафтного режима. Если у пользователя в качестве локали используется Франция и он переключает свой телефон в альбомный режим, поскольку язык имеет приоритет над ориентацией экрана, загружается файл res/values-fr/strings.xml
res/values-land/strings.xml
Понимание правил предшествования может сэкономить ваше время на отладку, задаваясь вопросом, почему ресурс не загружается, когда вы думаете, что он должен.
Подробнее о том, как Android находит наиболее подходящий ресурс, смотрите в документации .
Использование нескольких квалификаторов
Вы можете указать более одного спецификатора для каталога ресурсов. Это может пригодиться в таких случаях, как приведенный выше пример, когда вы можете использовать ресурсы, подходящие для нескольких сценариев.
В приведенном выше примере версия приложения по умолчанию имеет другой файл ресурсов для ландшафтного режима. Но когда в французской локали введен ландшафтный режим, нет французско-ландшафтного ресурса.
Спецификатор языка имеет приоритет над классификатором ориентации экрана, и поэтому система не будет учитывать строковые значения в values-land
Вы можете добавить ресурс french-and-landscape с помощью values-fr-land
При использовании нескольких классификаторов в каталогах вы должны располагать их в порядке их приоритета, иначе ресурсы будут игнорироваться. values-land-fr
Что стоит отметить
-
Помните, что разные языки имеют разную длину слов и предложений, некоторые языки читаются сверху вниз, другие — спереди назад. Одного перевода строковых литералов может быть недостаточно для локализации приложения. Вы должны учитывать эти языковые различия при работе над макетами. Вы можете создать разные макеты для каждого языка, который требует другого дисплея. Однако это усложняет поддержку вашего приложения. По возможности лучше использовать фрагменты для создания динамических и гибких пользовательских интерфейсов.
-
Если ваше приложение использует пользовательские шрифты, у вас должен быть запасной план для иностранных символов, который не поддерживается семейством шрифтов.
-
Не жестко кодируйте ресурсы. Не используйте строковые литералы в своем коде, вместо этого используйте
R.string
strings.xml
Не используйте пути изображения в вашем коде, вместо этого используйтеR.drawable
Это не только облегчает обслуживание, но и делает локализацию вашего приложения более легкой и менее подверженной ошибкам. -
Вы не можете создавать дополнительные подкаталоги в
res
Это ограничение может затруднить сортировку файлов ресурсов, особенно для больших проектов, где было бы лучше организовать многочисленные файлы в подкаталоги. Что вы можете сделать, так это принять решение об именовании файлов, которое подходит вам и вашей организации, чтобы упростить сортировку и поиск определенных файлов. -
Старайтесь не создавать больше файлов ресурсов, чем нужно. Если есть общие ресурсы, они должны быть разделены между локалями. Например, в
strings.xml
Для этих типов общих ресурсов оставьте их в своем каталоге по умолчанию и не копируйте их в свои конкретные каталоги. -
Локализация в значительной степени обрабатывается системой Android, но вы можете захотеть изменить что-то в коде в соответствии с локалью пользователя. Чтобы получить локаль, используйте объект
Context
String locale = context.getResources().getConfiguration().locale.getDisplayName();
Вывод
Локализация вашего приложения может значительно расширить рынок вашего приложения. Это особенно важно в тех странах, где возможны большие возможности, а английский (или язык по умолчанию для вашего приложения) широко не используется. Вы должны провести исследование своего целевого рынка, определить языки, которые вы хотите включить, и создать для них.
Если вы собираетесь создать приложение, которое будет поддерживать различные локали и языки, стоит проверить его с помощью контрольного списка локализации Android, прежде чем выпускать его, чтобы убедиться, что все в порядке.