Android
Интернационализация и локализация (I18N и L10N)
Поиск…
Вступление
Интернационализация (i18n) и локализация (L10n) используются для адаптации программного обеспечения в соответствии с различиями в языках, региональных различиях и целевой аудитории.
Интернационализация: процесс планирования будущей локализации, т. Е. Гибкость разработки программного обеспечения в той мере, в какой он может корректировать и адаптироваться к будущим усилиям по локализации.
Локализация: процесс адаптации программного обеспечения к определенному региону / стране / рынку (локали).
замечания
Чтобы протестировать устройство для локализации, устройство или эмулятор можно перезагрузить в определенной локали, используя adb
следующим образом:
- Запустите adb с помощью команды:
adb shell
- Выполните следующую команду в командной строке adb:
setprop persist.sys.locale [BCP-47 language tag];stop;sleep 5;start
где [тег языка BCP-47] - это код, специфичный для языка, как описано здесь: коды BCP47
например, для проверки японской локализации в приложении, используйте команду: setprop persist.sys.locale ja-JP;stop;sleep 5;start
Планирование локализации: включить поддержку RTL в манифесте
Поддержка RTL (справа налево) является важной частью планирования для i18n и L10n. В отличие от английского языка, который написан слева направо, многие языки, такие как арабский, японский, иврит и т. Д., Написаны справа налево. Чтобы обратиться к более глобальной аудитории, рекомендуется планировать свои макеты для поддержки этого языка с самого начала проекта, так что добавление локализации стало проще позже.
Поддержка RTL может быть включена в Android-приложении, добавив тег supportsRtl
в AndroidManifest
, например:
<application
...
android:supportsRtl="true"
...>
...
</application>
Планирование локализации: добавление поддержки RTL в макетах
Начиная SDK 17 (Android 4.2), поддержка RTL была добавлена в макеты Android и является важной частью локализации. Вперёд, left/right
нотация в макетах должна быть заменена нотой start/end
. Если, однако, ваш проект имеет значение minSdk
меньше 17
, то в макетах следует использовать как left/right
и start/end
нотация.
Для относительных макетов следует использовать alignParentStart
и alignParentEnd
, например:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"/>
</RelativeLayout>
Для определения гравитации и макета гравитации следует использовать аналогичные обозначения, например:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left|start"
android:gravity="left|start"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|end"
android:gravity="right|end"/>
Также должны быть указаны прокладки и поля, например:
<include layout="@layout/notification"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:paddingLeft="128dp"
android:paddingStart="128dp"
android:layout_toLeftOf="@id/cancel_action"
android:layout_toStartOf="@id/cancel_action"/>
<include layout="@layout/notification2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginRight="12dp"
android:layout_marginEnd="12dp"
android:paddingRight="128dp"
android:paddingEnd="128dp"
android:layout_toRightOf="@id/cancel_action"
android:layout_toEndOf="@id/cancel_action"/>
Планирование локализации: тестовые макеты для RTL
Чтобы проверить, совместимы ли макеты, RTL, выполните следующие действия:
Перейдите в Настройки -> Параметры разработчика -> Рисование -> Форматирование форматирования RTL
Включение этой опции заставит устройство использовать RTL-локаторы, и вы можете легко проверить все части приложения для поддержки RTL. Обратите внимание: вам не нужно добавлять новую локальную / языковую поддержку до этого момента.
Кодирование для локализации: создание строк и ресурсов по умолчанию
Первым шагом для кодирования для локализации является создание ресурсов по умолчанию. Этот шаг настолько скрыт, что многие разработчики даже не думают об этом. Однако создание ресурсов по умолчанию важно, потому что, если устройство работает в неподдерживаемой локали, оно будет загружать все свои ресурсы из папок по умолчанию. Если даже один из ресурсов отсутствует в папках по умолчанию, приложение просто выйдет из строя.
По умолчанию набор строк должен быть помещен в следующую папку в указанном месте:
res/values/strings.xml
Этот файл должен содержать строки на языке, на котором ожидается, что большинство пользователей приложения будут говорить.
Кроме того, ресурсы по умолчанию для приложения должны быть размещены в следующих папках и местоположениях:
res/drawable/
res/layout/
Если вашему приложению нужны папки, такие как anim
или xml
, ресурсы по умолчанию должны быть добавлены в следующие папки и местоположения:
res/anim/
res/xml/
res/raw/
Кодирование для локализации: предоставление альтернативных строк
Чтобы обеспечить переводы на других языках (локалях), нам необходимо создать strings.xml
в отдельной папке по следующему соглашению:
res/values-<locale>/strings.xml
Пример для этого приведен ниже:
В этом примере у нас есть английские строки по умолчанию в файле res/values/strings.xml
, французские переводы представлены в папке res/values-fr/strings.xml
а переводы японского языка указаны в папке res/values-ja/strings.xml
Другие переводы для других мест можно также добавить в приложение.
Полный список кодов локали можно найти здесь: коды ISO 639
Непереводимые строки:
У вашего проекта могут быть определенные строки, которые не должны быть переведены. Строки, которые используются как ключи для SharedPreferences или строк, которые используются в качестве символов, попадают в эту категорию. Эти строки должны храниться только в файле strings.xml
по умолчанию и должны быть помечены атрибутом translatable="false"
. например
<string name="pref_widget_display_label_hot">Hot News</string>
<string name="pref_widget_display_key" translatable="false">widget_display</string>
<string name="pref_widget_display_hot" translatable="false">0</string>
Этот атрибут важен, потому что переводы часто выполняются специалистами, которые двуязычны. Это позволило бы этим лицам участвовать в переводах для определения строк, которые не должны быть переведены, что экономит время и деньги.
Кодирование для локализации: предоставление альтернативных макетов
Создание языковых макетов часто не требуется, если вы указали правильную нотацию start/end
, как описано в предыдущем примере. Однако могут быть ситуации, когда макеты по умолчанию могут работать некорректно для определенных языков. Иногда макеты слева направо не могут переводить для языков RTL. В таких случаях необходимо обеспечить правильные раскладки.
Чтобы обеспечить полную оптимизацию для макетов RTL, мы можем использовать полностью отдельные файлы макета, используя ldrtl
ресурса ldrtl
( ldrtl
означает layout-direction-right-to-left}). Например, мы можем сохранить ваши файлы макета по умолчанию в res/layout/
и наши оптимизированные RTL макеты в res/layout-ldrtl/
.
ldrtl
подходит для ресурса с возможностью ldrtl
, так что вы можете предоставить графику, ориентированную в направлении, соответствующем направлению чтения.
Вот отличный пост, который описывает приоритет макетов ldrtl
: языковые макеты