Локализация в Android

В этом документе представлены функции локализации пакета SDK для Android и способы доступа к ним с помощью Xamarin.

Возможности на платформе Android

В этом разделе описаны основные функции локализации Android. Перейдите к следующему разделу , чтобы просмотреть конкретный код и примеры.

Локаль

Пользователи выбирают свой язык в Параметры > язык и входные данные. Этот выбор определяет язык, отображаемый и региональные параметры (например, для форматирования дат и чисел).

Текущий языковой стандарт можно запрашивать с помощью текущего контекста Resources:

var lang = Resources.Configuration.Locale; // eg. "es_ES"

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

Распространенные примеры:

  • en_USдля английского (США)
  • es_ES для испанского (Испания)
  • ja_JP для японского (Япония)
  • zh_CN для китайского (Китай)
  • zh_TW для китайского (Тайвань)
  • pt_PT для португальского (Португалия)
  • pt_BR для португальского (Бразилия)

LOCALE_CHANGED

Android создает android.intent.action.LOCALE_CHANGED , когда пользователь изменяет выбор языка.

Действия могут обработать это, задав android:configChanges атрибут действия следующим образом:

[Activity (Label = "@string/app_name", MainLauncher = true, Icon="@drawable/launcher",
    ConfigurationChanges = ConfigChanges.Locale | ConfigChanges.ScreenSize | ConfigChanges.Orientation)]

Основы интернационализации в Android

Стратегия локализации Android состоит из следующих ключевых частей:

  • Папки ресурсов, содержащие локализованные строки, изображения и другие ресурсы.

  • GetText метод, используемый для получения локализованных строк в коде

  • @string/id в файлах AXML для автоматического размещения локализованных строк в макетах.

Папки ресурсов

Приложения Android управляют большинством содержимого в папках ресурсов, например:

  • макет — содержит файлы макета AXML.
  • Рисуемый — содержит изображения и другие рисуемые ресурсы.
  • значения — содержат строки.
  • raw — содержит файлы данных.

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

Screenshot of Resources/drawable and Resources/values folders for multiple cultural identifiers

Примечание.

При указании языка верхнего уровня, например es только двух символов, однако при указании полного языкового стандарта для имени каталога требуется дефис и строчный r для разделения двух частей, например pt-rBR или zh-rCN. Сравните это со значением, возвращаемым в коде, который имеет подчеркивание (например, pt_BR). Оба из них отличаются от значения класса .NETCultureInfo, который имеет только дефис (например, тире). pt-BR Имейте в виду эти различия при работе на разных платформах Xamarin.

формат файла Strings.xml

Каталог локализованных значений (например. Значения-es или values-pt-rBR) должны содержать файл с именем Strings.xml , который будет содержать переведенный текст для этого языкового стандарта.

Каждая переведенная строка представляет собой XML-элемент с идентификатором ресурса, указанным в качестве name атрибута, и преобразованной строкой в качестве значения:

<string name="app_name">TaskyL10n</string>

Необходимо выполнить обход в соответствии с обычными правилами XML, и name он должен быть допустимым идентификатором ресурса Android (без пробелов или дефисов). Ниже приведен пример файла строк по умолчанию (английский) для примера:

значения/Strings.xml

<resources>
    <string name="app_name">TaskyL10n</string>
    <string name="taskadd">Add Task</string>
    <string name="taskname">Name</string>
    <string name="tasknotes">Notes</string>
    <string name="taskdone">Done</string>
    <string name="taskcancel">Cancel</string>
</resources>

Значения испанского каталога содержат файл с тем же именем (Strings.xml), который содержит переводы:

значения-es/Strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">TaskyLeon</string>
    <string name="taskadd">agregar tarea</string>
    <string name="taskname">Nombre</string>
    <string name="tasknotes">Notas</string>
    <string name="taskdone">Completo</string>
    <string name="taskcancel">Cancelar</string>
</resources>

Screenshot of multiple values folders, each containing a Strings.xml file

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

Файлы макета AXML

Чтобы ссылаться на локализованные строки в файлах макета, используйте @string/id синтаксис. Этот фрагмент XML из примера показывает text свойства, заданные с локализованными идентификаторами ресурсов (некоторые другие атрибуты были опущены):

<TextView
    android:id="@+id/NameLabel"
    android:text="@string/taskname"
    ... />
<CheckBox
    android:id="@+id/chkDone"
    android:text="@string/taskdone"
    ... />

Метод GetText

Чтобы получить переведенные строки в коде GetText , используйте метод и передайте идентификатор ресурса:

var cancelText = Resources.GetText (Resource.String.taskcancel);

Строки количества

Ресурсы строк Android также позволяют создавать строки количества, которые позволяют переводчикам предоставлять различные переводы для различных количеств, например:

  • "Существует 1 задача слева".
  • "Есть 2 задачи по-прежнему делать".

(вместо универсального элемента "Есть n задач слева").

В Strings.xml

<plurals name="numberOfTasks">
   <!--
      As a developer, you should always supply "one" and "other"
      strings. Your translators will know which strings are actually
      needed for their language.
    -->
   <item quantity="one">There is %d task left.</item>
   <item quantity="other">There are %d tasks still to do.</item>
 </plurals>

Чтобы отобразить полную строку, используйте GetQuantityString метод, передав идентификатор ресурса и отображаемое значение (которое передается дважды). Второй параметр используется Android для определения используемойquantity строки, третий параметр — это значение, которое фактически заменено в строку (оба являются обязательными).

var translated = Resources.GetQuantityString (
                    Resource.Plurals.numberOfTasks, taskcount, taskcount);`

Допустимые quantity параметры:

  • zero
  • один
  • two
  • few
  • количеством
  • иное

Они подробно описаны в документах Android. Если для данного языка не требуется специальная обработка, эти quantity строки будут игнорироваться (например, используется one только английский язык и other; указание zero строки не будет иметь эффекта, она не будет использоваться).

изображения;

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

Затем изображения, относящиеся к языковому стандарту, должны размещаться в квалифицированных папках, таких как drawable-es или drawable-ja (описатели dpi также могут быть добавлены).

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

Screenshot of multiple drawable folders, each containing one or more localized .png files

Другие типы ресурсов

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

Android 4.2 представила поддержку языков справа налево (RTL), если задать параметр android:supportsRtl="true"приложения. Квалификатор "ldrtl" ресурсов можно включить в имя каталога, чтобы содержать пользовательские макеты, предназначенные для отображения RTL.

Дополнительные сведения об именовании каталогов ресурсов и резервном копировании см. в документации Android для предоставления альтернативных ресурсов.

Название приложения

Имя приложения легко локализовать с помощью @string/id элемента в действии MainLauncher :

[Activity (Label = "@string/app_name", MainLauncher = true, Icon="@drawable/launcher",
    ConfigurationChanges =  ConfigChanges.Orientation | ConfigChanges.Locale)]

Языки справа налево (RTL)

Android 4.2 и более поздней версии обеспечивают полную поддержку макетов RTL, подробно описанных в блоге о поддержке собственного RTL.

При использовании Android 4.2 (уровень API 17) и более новых значений выравнивания можно указать и start вместо left него endright (напримерandroid:paddingStart). Существуют также новые API, такие как LayoutDirection, TextDirectionи TextAlignment помочь создать экраны, которые адаптируются для средств чтения RTL.

На следующем снимке экрана показан локализованный пример задачи на арабском языке:

Screenshot of Tasky app in Arabic

На следующем снимке экрана показан локализованный пример задачи на иврите:

Screenshot of Tasky app in Hebrew

Текст RTL локализован с помощью Strings.xml файлов так же, как и текст LTR.

Тестирование

Обязательно тщательно протестируйте языковой стандарт по умолчанию. Приложение завершится сбоем, если ресурсы по умолчанию не могут быть загружены по какой-то причине (т. е. отсутствуют).

Тестирование эмулятора

Ознакомьтесь с разделом "Тестирование Google в эмуляторе Android" для инструкций по настройке эмулятора на определенный языковой стандарт с помощью оболочки ADB.

adb shell setprop persist.sys.locale fr-CA;stop;sleep 5;start

Тестирование устройств

Чтобы протестировать устройство, измените язык в приложении Параметры.

Совет

Запишите значки и расположение элементов меню, чтобы можно было отменить изменения язык исходному параметру.

Итоги

В этой статье рассматриваются основы локализации приложений Android с помощью встроенной обработки ресурсов. Дополнительные сведения о приложениях i18n и L10n для iOS, Android и кроссплатформенных приложений (включая Xamarin.Forms) см. в этом кроссплатформенной руководстве.