Локализация. חתול מדען (хатуль мадан) — кот учёный
В статье, посвященной ресурсам, мы уже затрагивали эту тему с теоретической точки зрения. Разберем теперь практическую часть. Мы уже умеем пользоваться строковыми ресурсами и меняли строчки, например, Hello, World на Здравствуй, Мир! Но на самом деле это не совсем правильный подход. Для профессионально написанного приложения лучше использовать другой подход. А именно, локализацию.
Что это значит? Мы не будем менять строчку Hello, World, которая будет считаться строкой по умолчанию, а создадим новый локализованный ресурс. Это даст нам дополнительное преимущество, если пользователь запустит приложение на телефоне с английской локалью, то он увидит текст на знакомом ему языке. Если приложение запустит русский пользователь, то он увидит текст на русском языке. Согласитесь — очень удобно.
Напишем приложение, которое будет поддерживать английскую и русскую локализации. По умолчанию будет использоваться английская локализация. В этом случае, если на телефоне не будет найден нужный локализованный ресурс, то будет применяться английский вариант.
Чтобы не усложнять материал, воспользуемся стандартным приложением, который мы изучали в самом начале. Создадим новый проект «LocaleApp», но на этот раз мы не будем трогать файл strings.xml в каталоге res/values.
Для русской локализации необходимо создать новый подкаталог values-ru в том же каталоге res. Если вы планируете создавать локализацию только для русского языка, то название каталога не трудно запомнить и вы можете создать папку вручную через res | New | Directory. Но вряд ли вы запомните названия других папок. Поэтому покажу способ создания с помощью мастера студии.
Щёлкаем правой кнопкой мыши на папке res и выбираем New | Android resource directory. В диалоговом окне в левой части Available qualifiers: выбираем пункт Locale и переносим его в правую часть Chosen qualifiers: с помощью кнопки с двумя стрелками вправо. В появившейся третьей колонке выбираем нужные языки, например, русский. Вы увидите, что в поле Directory name автоматически появится нужное название папки. Дополнительно вы можете указать и регион в колонке Specific Region Only

В режиме Android вы можете не увидеть созданную папку, поэтому временно переключитесь в режим Project. Скопируйте файл res/values/strings.xml и вставьте его в новую папку. Можете вернуться в прежний режим. Если папка не пуста, то она уже видна.
Изменим его содержание.
Локализованное приложение Здравствуй, Мир!
В английской версии им соответствуют ресурсы
Locale Application Hello world!
Запустим приложение и увидим, что текст выводится на русском, если у вас на эмуляторе или реальном устройстве выбраны русские настройки.

Как перейти на американскую локаль? Идём в Настройки→Язык и клавиатура→Выбрать язык. Выбираем английский язык English (United States). Снова запускаем приложение в эмуляторе или на телефоне. Теперь наше приложение будет выглядеть так:

Ресурсы из каталога res/values считаются ресурсами по умолчанию. Они отображаются в том случае, когда система не найдёт ресурсы для текущей локали устройства. В нашем случае, при выборе любого языка, кроме русского будет использоваться res/values. Если мы захотим разделить англичан и американцев, тогда придётся создавать два каталога: res/values-en-rUK и res/values-en-rUS. Обратите внимание, что перед кодом второй части ставится буква ‘r’. Иными словами, мы определяем не только язык, но и регион.
Проведем несколько экспериментов. Удалим из файла res/values-ru/strings.xml строковый ресурс hello_world с текстом Здравствуй, Мир!. Сохраним изменения и запустим проект на устройстве с русским языком. Платформа заменила отсутствующий в локализации ресурс дефолтным английским.
Продолжим опыты и поступим наоборот — удалим теперь ресурс из файла res/values/strings.xml. На устройстве выберем какой-нибудь другой язык, например, итальянский. В этом случае вы увидите что-то непонятное, скорее всего вы получите сообщение об ошибке.
Отсюда можно сделать вывод, что вам необходимо следить за ресурсами по умолчанию. Старайтесь проконтролировать, чтобы ваше приложение всегда содержало все необходимые ресурсы по умолчанию, а уже потом можете начинать локализацию приложения. Для этого вам достаточно будет скопировать файл в новый подкаталог и отредактировать его.
На самом деле локализовать можно не только строковые ресурсы. В разных странах принято рисовать какой-нибудь объект в соответствии со своими традициями, например, изображение почтового ящика. В этом случае вы можете создать каталог /res/drawable-de, в котором будут находиться изображения, предназначенные для немцев.
В коде вы обращаетесь к нужным ресурсам следующим образом:
String hello = getResources().getString(R.string.hello_world); // или так TextView textView = new TextView(this); textView.setText(R.string.hello_world);
Система сама подставит нужную строку. Явно указать, что хочется использовать ресурс на конкретном языке, у вас не получится.
Спустя продолжительное время один из читателей подсказал, как всё-таки задействовать локальный ресурс. Объяснять код не буду, сами поймёте, когда наберётесь опыта.
Locale locale = new Locale("en"); Locale.setDefault(locale); Configuration configuration = new Configuration(); configuration.locale = locale; getBaseContext().getResources().updateConfiguration(configuration, null); // выводим английский текст на русской локали устройства setTitle(R.string.app_name);
Просмотр и создание локализованных строк в режиме дизайна
Чтобы увидеть, как меняется текст в различных локализованных версиях вашего приложения, необязательно запускать приложение в эмуляторе. Можно в студии на панели инструментов щёлкнуть на значке глобуса и выбрать из выпадающего списка нужный вам пункт (он появится после того, как вы создадите необходимые локализованные ресурсы), и все локализованные строчки сразу поменяются на экране активности.

Можно сразу создать локализованный файл через удобный мастер. Там же в меню есть пункт Edit Translations. , который выводит диалоговое окно со списком уже имеющихся строковых ресурсов из вашей программы (раньше). Вам нужно выбрать язык для перевода, а затем заполнить в таблице нужную колонку.

После того, как вы завершите перевод всех ресурсов, нажимаете на кнопку OK и у вас появится готовая папка с новым файлом strings.xml для выбранной локализации.
Сейчас в студии вместо диалогового окна выводится окно редактора, в котором можно редактировать текст.
Непереводимая игра слов с использованием местных идиоматических выражений
Если вы решили использовать локализацию на разных языках, то можете встретиться с одной проблемой. Предположим, вы перевели только несколько строковых ресурсов и в один прекрасный день решили выложить программу в магазин приложений. Android Studio при сборке подписанного приложения может заругаться, что вы перевели не все строки. Есть два способа обхода проблемы. Вы можете использовать атрибут translatable=»false», чтобы указать среде разработке, что данная строка не требует перевода:
StartActivity
В окне редактора это сделать проще через флажки в столбце Untranslatable.

Второй вариант — явно указать, что все строки в файле не нужно переводить с помощью tools:ignore=»MissingTranslation».
Есть ещё один вариант, когда непереводимые строки размещаются не в ресурсе strings.xml, а в другом файле под именем donottranslate.xml.
Когда вы исправите строковые ресурсы, то избавьтесь от ошибок через Project | Clean. и попытайтесь собрать приложение заново.
Поддержка письма справа налево
Арабы и некоторые другие народы используют непривычную для европейцев схему написания текстов справа налево. В Android 4.2 появилась поддержка данного режима. В блоге (англ.) Native RTL support in Android 4.2 рассказано о некоторых вещах по этой теме.
Теперь вы можете писать приложение для израильских военкоматов. Русские призывники в интервью офицерам душевного здоровья часто используют сочетание хатуль мадан (חתול מדען). Теперь вы знаете, как локализовать строки пушкинского стихотворения про кота учёного.
Несколько локалей
В Android 7.0 (API 24) пользователь может установить несколько локалей. В этом случае, если не будут найдены ресурсы для первой локали, то будут искаться ресурсы для второй локали. Таким образом, если француз знает два языка, например, французский и испанский, а в приложение не поддерживает французского, но поддерживает испанский, то пользователь увидит текст на испанском, а не на английском.
Но тут есть одна особенность, если вы в своём приложении используете библиотеку совместимости appcompat-v7. Она может показать текст на английском, если не найдет ресурсов для первой локали, игнорируя ресурсы второй локали. Чтобы избежать проблемы, добавьте в build.gradle модуля дополнительную настройку.
Локализация приложения Android
Вопросам локализации приложений уделено немало места на страницах нашего сайта. Наиболее значимая статья, связанная с фундаментальными основами локализации, рассказывает о региональных стандартах, форматах представления числовых, денежных и временных значениях в различных странах, ресурсных файлах и форматах сообщений. Поэтому, в этой статье будет рассмотрен только вопрос локализации интерфейса Android приложений. Здесь на примере мы должны увидеть процесс формирования и использования ресурсных файлов.
На странице описания табличной разметки TableLayout был создан файл table.xml, в котором уже подключались свойства ресурсного файла strings.xml. В этой статье мы продолжим эту тему и рассмотрим следующие вопросы локализации приложений в среде разработки Android Studio :
- создание ресурсных директорий;
- создание ресурсных файлов;
- локализация интерфейса;
- динамическое подключение ресурсных файлов.
Ресурсные директории
Для локализации интерфейса, первое, что нам необходимо выполнить, это создать ресурсные файлы, которые хранятся в определенных ресурсных директориях. Создадим такие директории для языков локализации «ru» и «en». Для этого выделяем проект p02Layout, открываем контексное меню правой клавишей мыши и выбираем пункт меню New / Android Resource Directory. В открывшемся диалоговом окне в списке Available qualifiers выбираем пункт Locale и переносим его в правую часть Chosen qualifiers нажатием на кнопку с изображением «двух стрелок вправо».

В результате предыдущего действия интерфейс окна изменится и появятся другие компоненты и списки. Теперь необходимо в списке Language выбрать нужный язык. Прокрутка списка для выбора русского языка не дала нужного результата. Русский язык не был найден и представленная на скриншоте строка не была обнаружена, несмотря на то, что в последнем списке (Specific Region Only:) страна «RU: Russia» присутствует. Но после ввода символов «ru» при активности (нахождении фокуса) списка Language, сразу же появилась нужная запись и поле фильтрации в верхней части списка. Возьмите это на вооружение при поиске требуемого языка локализации. Наименование директории values-ru было сформировано студией автоматически после выбора языка локализации. Следующим шагом точно также была добавлена директория для английского языка «en».

Примечание : в проекте ничего не изменилось; как была одна директория res/values, так к ней ничего и не добавилось. Это специфика Android Studio – ничего личного, только проект.
Но если посмотреть на структуру проекта со стороны проводника, то Вы сразу же увидите добавленные ресурсные директории values-en, values-ru. Так что особых тревог быть не должно; все делаем правильно и ничего не пропало.

Примечание :
1. При создании ресурсных директорий не был использован регион из списка Specific Region Only. Т.е. была выделена запись Any Region. Но если появится необходимость разделить англичан и американцев, то необходимо будет выделить дополнительно соответствующую запись и создать для английского языка две директории : res/values-en-rUK и res/values-en-rUS. Дополнительный символ обозначения региона к наименованию страны Studio добавит самостоятельно (. -rUK, . -rUS). Не забудьте, что в этом случае в объекте локализации Locale также должен быть учтен регион/страна.
2. Локализовать можно не только строковые ресурсы, но и изображения. Так, например, при использовании национальных флагов, следовало бы дополнительно создать соответствующие директории res/drawable-en, res/drawable-ru, в которых будут храниться изображения, ориентированные на определенные регионы.
Ресурсные файлы
После определения ресурсных директорий необходимо добавить ресурсные файлы. Для этого опять же выделяем проект, вызываем контекстное меню правой клавишей мыши и выбираем New / Android Resource File. В открывшемся диалоговом окне опять же выбираем Language и переносим его в список Chosen qualifiers, как это было сделано на предыдущем шаге. В списке Language вводим требуемый язык, в результате чего Studio определит директорию размещения файла (Directory name). Теперь необходимо ввести наименование файла (File name) и нажать ОК. Скриншот отображает состояние после выбора языка локалилизации и определения наименования файла ресурсов string.xml.

В результате создания ресурсных файлов в структуре проекта будут добавлены записи в раздел res/values/strings. Помним, что простой strings.xml используется по умолчанию, если в системе не будет найден ресурсный файл приложения для соответствующего объекта Locale.

Ресурсные файлы
После выполнения двух предыдущих шагов были созданы ресурсные директории с файлами string.xml. То есть в трех разных директориях (values, values-en, values-ru) хранятся три файла с одинаковыми наименованиями strings.xml. В этом суть отличия локализации приложений Android. Теперь необходимо определить содержимое файлов так, чтобы ключевые наименования у них были одинаковыми. Эти ключевые наименования будут использоваться для определения заголовков меток и кнопок.
Листинг файла values-ru/string.xml
p2Layout : авторизация Логин пароль Учетная запись OK Закрыть
Листинг файла values-en/string.xml
p2layout : authorization Login Password Account OK Close
Содержимое файла values/string.xml определим согласно англоязычного варианта локализации.
Локализация интерфейса
При локализации интерфейса необходимо к текстовым параметрам меток (android:text), полям ввода (android:hint) и кнопкам (android:text) подключить соответствующие ресурсные строки. Это можно сделать двумя способами.
Определение ресурсных значений в файле описания конфигурации
Простой способ связан с прямым определением соответствующих значений в файле описания интерфейса интерфейса. Для этого необходимо открыть файл table.xml, найти в описании компонент и связать его параметры с соответствующими ресурсными строками. Вот как это выглядит для метки и текстового поля определения учетной записи :
Текстовое значение метки tvLogin связали с ресурсной строкой «@string/lbl_login» (android:text), а подсказку текстового поля edLogin связали с «@string/hint_login» (android:hint).
Определение ресурсных значений в панели атрибутов компонента
Установить связь текстового значения компонента с ресурсным значением можно через интерфейс среды разработки Studio. Для этого необходимо выделить компонент и перейти к панели атрибутов. Здесь следует найти соответствующий параметр. На следующем скриншоте представлена выделенная строка текстового параметра компонента кнопки.

Сейчас у кнопки определено несвязанное текстовое значение Button. Можно в этой же строке ввести новое/необходимое значение; но можно и нажать на кнопку с изображением многоточия. В результате будет открыто окно выбора ресурсного значения. Здесь находим нужную строку в списке и нажимаем ОК.

Динамическое подключение ресурсных файлов
Для реализации динамического изменения локализуемых надписей интерфейса приложения проще всего в интерфейс добавить пару кнопок : одна из кнопок будет переводить интерфейс на русский язык, а другая – на английский. Конечно же, желательно, чтобы на кнопках были изображены соответствующие флаги. Но не будем сейчас усложнять задачу и ограничимся дополнительным размещением обычных кнопок. Вопрос использования изображений рассмотрен в отдельной статье Представления изображений в Android.

Полагаю, особого труда у Вас не составит самостоятельно поместить в таблицу две строки TableRow : одну для кнопок (btnEn, btnRu) и одну в качестве «разделителя». Ну и в заключении создадим метод changeLocale(Locale locale).
Теперь, когда интерфейс определен и ресурсные файлы подготовлены, осталось только разработать метод определения локализованных надписей интерфейса (changeLocale) и к кнопкам подключить соответствующие обработчики событий. Для этого откроем основной класс приложения MainActivity и внесем в него дполнительный код, представленный ниже :
import android.content.res.Configuration; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import java.util.Locale; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.table); Button ru_btn = (Button) findViewById(R.id.btnRu); ru_btn.setOnClickListener(new Button.OnClickListener() < public void onClick(View v) < System.out.println("ru_btn.click"); Locale locale = new Locale("ru"); changeLocale(locale); >>); Button en_btn = (Button) findViewById(R.id.btnEn); en_btn.setOnClickListener(new Button.OnClickListener() < public void onClick(View v) < System.out.println("en_btn.click"); Locale locale = new Locale("en"); changeLocale(locale); >>); > @SuppressWarnings("deprecation") private void changeLocale(Locale locale) < Locale.setDefault(locale); Configuration configuration = new Configuration(); configuration.setLocale(locale); getBaseContext().getResources() .updateConfiguration(configuration, getBaseContext() .getResources() .getDisplayMetrics()); setTitle(R.string.app_name); TextView tv = (TextView) findViewById(R.id.tvLogin); tv.setText(R.string.lbl_login); tv = (TextView) findViewById(R.id.tvPassword); tv.setText(R.string.lbl_password); EditText et = (EditText)findViewById(R.id.edLogin); et.setHint(R.string.hint_login); Button btn = (Button) findViewById(R.id.btnClose); btn.setText(R.string.btn_close); >>
В методе onCreate к кнопкам btnRu и btnEn подключены соответствующие обработчики событий. При нажатии на одну из кнопок в «консоль» выводится сообщение, формируется объект локализации и вызывается метод changeLocale. В методе changeLocale выполняется определение текущей Locale, после этого выполняется чтение соответствующего ресурсного файла и локализуются надписи интерфейса.
«Консоль» сообщений
Чтобы открыть консоль сообщений работающего приложения необходимо нажать вкладку Run, которая появляется после первого старта.

После старта Вы должны увидеть интерфейс приложения, представленный на следующем скриншоте. Нажатием на верхние кнопки текстовые строки интерфейса переводятся на соответствующий язык локализации.

Локализация даты и времени
Для проверки функционирования локализации даты и времени ниже представлен соответствующий метод. Здесь все тривиально просто. Обратите только внимание на импорт класса Calendar.
import android.icu.util.Calendar; private void printCurentDateTime() < // Получаем текущее время и дату: Date currentDate = Calendar.getInstance().getTime(); java.text.DateFormat dateFormat; dateFormat = android.text.format.DateFormat.getDateFormat(this); java.text.DateFormat timeFormat; timeFormat = android.text.format.DateFormat.getTimeFormat(this); // Форматируем строку текущей даты String formattedDate = dateFormat.format(currentDate); System.out.println("formattedTime : " + formattedDate); // Формируем строку текущего времени String formattedTime = timeFormat.format(currentDate); System.out.println("formattedTime : " + formattedTime); >
Вызвав printCurentDateTime из метода changeLocale в консоль будут выведены следующие сообщения о дате и времени для двух различных языков локализации :
I/System.out: ru_btn.click I/System.out: formattedTime : 07.12.2018 I/System.out: formattedTime : 9:56 I/zygote: Do partial code cache collection, code=52KB, data=61KB After code cache collection, code=51KB, data=60KB Increasing code cache capacity to 256KB I/System.out: en_btn.click I/System.out: formattedTime : 12/7/18 I/System.out: formattedTime : 9:56 AM
Как изменить язык в Android Stuido?
У врачей общепринятым языком общения является латынь, даже деревенский фельдшер выписывая диагноз не преминет написать DS или щегольнет словечком анамнез. И в этом есть глубокая правда жизни — диагноз выписанный врачом в России поймет доктор даже где-нибудь в Африке — сам лично был свидетелем, когда в богом забытой Камбодже местный коновал спокойно разобрал каракули московского коллеги.
У нас, у прогеров/кодеров/девелоперов таковым является английский язык, это может нравиться или не нравиться, но это факт против которого бесполезно протестовать.
Так что надо знать английский язык, хотя бы в мере достаточной для того, чтобы пользоваться Android Studio.
Если вам, все таки неймется — возьмите файл resources_en.jar , который лежит в каталоге lib Android Studio, распакуйте его и переведите несколько тысяч ресурсных строчек на русский язык, типа:
attempt.to.modify.read.only.document.error.message=Attempt to modify read-only document typing.in.editor.command.name=Typing errors.panel.go.to.errors.first.radio=Go to high priority problems only errors.panel.go.to.next.error.warning.radio=Go to next problem customize.highlighting.level.menu.item=Customize Highlighting Level move.caret.command.name=Move caret guarded.block.modification.attempt.error.message=Unable to perform an action since it changes read-only fragments of the current document guarded.block.modification.attempt.error.title=Guarded Block Modification Attempt close.editor.annotations.action.name=Close Annotations editor.annotations.action.group.name=Annotations move.cursor.command.name=Move Cursor paste.command.name=Paste move.selection.command.name=Move selection typing.command.name=Typing hector.import.popup.checkbox=Import &popup hector.highlighting.level.title=Highlighting Level hector.none.slider.label=None hector.syntax.slider.label=Syntax hector.inspections.slider.label=Inspections action.duplicate.block=&Duplicate Block action.duplicate.line=&Duplicate Line increase.editor.font=Increase Font Size decrease.editor.font=Decrease Font Size forced.soft.wrap.message=This document contains very long lines. Soft wraps were forcibly enabled to improve editor performance. forced.soft.wrap.hide.message=Hide notification forced.soft.wrap.dont.show.again.message=Don't show again editor.notification.default.action.name=Notification actions editor.notification.settings.option.name=Settings.
JetBrains в свое время портировали Intellij IDEA (читай ту же Android Studio) на японский, но потом отказались, сказав, что дескать выхлоп был никакой. Это не стоило потраченных на локализацию усилий — японские девелоперы отнюдь не кинулись покупать IDEA 🙂
Локализация в Android
В этом разделе описываются функции main локализации 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 управляют большинством содержимого в папках ресурсов, например:
- layout — содержит файлы макета AXML.
- drawable — содержит изображения и другие рисуемые ресурсы.
- values — содержит строки.
- raw — содержит файлы данных.
Большинство разработчиков уже знакомы с использованием суффиксов dpi в каталоге для рисования , чтобы предоставить несколько версий изображения, позволяя Android выбрать правильную версию для каждого устройства. Один и тот же механизм используется для перевода нескольких языков путем суффикса каталогов ресурсов с идентификаторами языка и языка и региональных параметров.

При указании языка es верхнего уровня требуется только два символа, однако при указании полного языкового стандарта формат имени каталога требует дефиса и нижнего регистра r для разделения двух частей, например pt-rBR или zh-rCN. Сравните это со значением, возвращенным в коде, который имеет символ подчеркивания (например pt_BR , ). Оба они отличаются от значения, которое использует класс .NET CultureInfo , которое имеет только дефис (например pt-BR , ). Помните об этих различиях при работе на разных платформах Xamarin.
формат файла Strings.xml
Каталог локализованных значений (например, values-es или values-pt-rBR) должен содержать файл с именемStrings.xml , который будет содержать переведенный текст для этого языкового стандарта.
Каждая переводимая строка представляет собой XML-элемент с идентификатором ресурса, указанным в качестве атрибута name , и переведенной строкой в качестве значения:
TaskyL10n
Необходимо выполнить экранирование в соответствии с обычными правилами XML, а атрибут name должен быть допустимым идентификатором ресурса Android (без пробелов или дефисов). Ниже приведен пример файла строк по умолчанию (на английском языке).
значения/Strings.xml
TaskyL10n Add Task Name Notes Done Cancel
Испанский каталог values-es содержит файл с тем же именем (Strings.xml), который содержит переводы:
values-es/Strings.xml
TaskyLeon agregar tarea Nombre Notas Completo Cancelar

При настройке файлов строк переведенные значения можно ссылаться как в макетах, так и в коде.
Файлы макета AXML
Чтобы ссылаться на локализованные строки в файлах макета @string/id , используйте синтаксис . В этом ФРАГМЕНТе XML из примера показаны text свойства, задающиеся с локализованными идентификаторами ресурсов (некоторые другие атрибуты были опущены):
Метод GetText
Чтобы получить переведенные строки в коде GetText , используйте метод и передайте идентификатор ресурса:
var cancelText = Resources.GetText (Resource.String.taskcancel);
Строки количества
Строковые ресурсы Android также позволяют создавать строки количества , которые позволяют переводчикам предоставлять различные переводы для разных объемов, например:
- «Осталось 1 задача».
- «Есть 2 задачи, которые еще предстоит сделать».
(вместо универсального «Осталось n задач»).
В Strings.xml
- There is %d task left.
- There are %d tasks still to do.
Чтобы отобразить полную строку, используйте GetQuantityString метод , передав идентификатор ресурса и отображаемое значение (которое передается дважды). Второй параметр используется Android для определения используемой quantity строки, третий параметр — это значение, фактически подставляемое в строку (оба параметра являются обязательными).
var translated = Resources.GetQuantityString ( Resource.Plurals.numberOfTasks, taskcount, taskcount);`
Допустимые quantity параметры:
Более подробно они описаны в документации по 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)]
Языки справа налево (RTL)
Android 4.2 и более поздней версии обеспечивает полную поддержку макетов RTL, подробно описанную в блоге Поддержка собственных RTL.
При использовании Android 4.2 (уровень API 17) и более поздней версии значения выравнивания можно указать с start помощью и end вместо left и right (например android:paddingStart , ). Кроме того, существуют новые API, такие как LayoutDirection , TextDirection и TextAlignment , которые помогают создавать экраны, которые адаптируются для чтения RTL.
На следующем снимке экрана показан локализованный пример Tasky на арабском языке:

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

Текст RTL локализуется с помощью Strings.xml файлов так же, как и текст LTR.
Тестирование
Обязательно тщательно протестируйте языковой стандарт по умолчанию. Приложение завершит работу, если по какой-либо причине не удается загрузить ресурсы по умолчанию (т. е. они отсутствуют).
Тестирование эмулятора
Инструкции по настройке определенного языкового стандарта для эмулятора ADB см. в разделе Google Testing on an Android Emulator ( Тестирование в эмуляторе Android ).
adb shell setprop persist.sys.locale fr-CA;stop;sleep 5;start
Тестирование устройств
Чтобы выполнить тестирование на устройстве, измените язык в приложении «Параметры «.
Запишите значки и расположение пунктов меню, чтобы можно было отменить изменения язык к исходному параметру.
Итоги
В этой статье рассматриваются основы локализации приложений Android с помощью встроенной обработки ресурсов. Дополнительные сведения о приложениях i18n и L10n для iOS, Android и кроссплатформенных приложений (включая Xamarin.Forms) см. в этом кроссплатформенном руководстве.
Связанные ссылки
- Tasky (локализовано в коде) (пример)
- Локализация Android с помощью ресурсов
- Обзор кроссплатформенной локализации
- Локализация Xamarin.Forms
- Локализация в iOS