Локализация в Android
В этом документе представлены функции локализации пакета SDK для Android и способы доступа к ним с помощью Xamarin.
В этом разделе описаны основные функции локализации 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
для португальского (Бразилия)
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 состоит из следующих ключевых частей:
Папки ресурсов, содержащие локализованные строки, изображения и другие ресурсы.
GetText
метод, используемый для получения локализованных строк в коде@string/id
в файлах AXML для автоматического размещения локализованных строк в макетах.
Приложения Android управляют большинством содержимого в папках ресурсов, например:
- макет — содержит файлы макета AXML.
- Рисуемый — содержит изображения и другие рисуемые ресурсы.
- значения — содержат строки.
- raw — содержит файлы данных.
Большинство разработчиков уже знакомы с использованием суффиксов dpi в рисуемом каталоге для предоставления нескольких версий образа, позволяя Android выбрать правильную версию для каждого устройства. Один и тот же механизм используется для предоставления нескольких переводов языка путем суффиксирования каталогов ресурсов с идентификаторами языка и языка и региональных параметров.
Ескерім
При указании языка верхнего уровня, например es
только двух символов, однако при указании полного языкового стандарта для имени каталога требуется дефис и строчный r для разделения двух частей, например pt-rBR или zh-rCN. Сравните это со значением, возвращаемым в коде, который имеет подчеркивание (например, pt_BR
). Оба из них отличаются от значения класса .NETCultureInfo
, который имеет только дефис (например, тире). pt-BR
Имейте в виду эти различия при работе на разных платформах Xamarin.
Каталог локализованных значений (например. Значения-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>
При настройке файлов строк преобразованные значения можно ссылаться как на макеты, так и в коде.
Чтобы ссылаться на локализованные строки в файлах макета, используйте @string/id
синтаксис. Этот фрагмент XML из примера показывает text
свойства, заданные с локализованными идентификаторами ресурсов (некоторые другие атрибуты были опущены):
<TextView
android:id="@+id/NameLabel"
android:text="@string/taskname"
... />
<CheckBox
android:id="@+id/chkDone"
android:text="@string/taskdone"
... />
Чтобы получить переведенные строки в коде 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, содержит локализованные копии в других каталогах.
Вы также можете предоставить другие типы альтернативных, языковых ресурсов, включая макеты, анимации и необработанные файлы. Это означает, что можно указать определенный макет экрана для одного или нескольких целевых языков, например, можно создать макет специально для немецкого языка, который позволяет использовать очень длинные текстовые метки.
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)]
Android 4.2 и более поздней версии обеспечивают полную поддержку макетов RTL, подробно описанных в блоге о поддержке собственного RTL.
При использовании Android 4.2 (уровень API 17) и более новых значений выравнивания можно указать и start
вместо left
него end
right
(напримерandroid:paddingStart
). Существуют также новые API, такие как LayoutDirection
, TextDirection
и TextAlignment
помочь создать экраны, которые адаптируются для средств чтения RTL.
На следующем снимке экрана показан локализованный пример задачи на арабском языке:
На следующем снимке экрана показан локализованный пример задачи на иврите:
Текст 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) см. в этом кроссплатформенной руководстве.