- Интернационализация
- Интернационализация - практика
- Локализация
- Локализация - практика
- Изменение локали при тестировании
Хcode имеет ряд технологий, которые позволяют создавать интернационализированные и локализованные приложения.
Интернационализация - это процесс, при котором в приложение добавляется поддержка различных форматов календаря, валют, времени, дат, чисел, часового пояса и т.д., а так же обеспечивается ввод и вывод текста на родном для пользователя языке.
Локализация - это процесс перевода строкового и иного (в том числе графического) контента на язык пользователя. Локализованное приложение подразумевает, что контент отображается на языке пользователя.
В процессе интернационализации используются специальные типы данных:
Locale- для работы с локалью.
Идентификаторы всех доступных локалей доступны по ссылке https://gist.github.com/jacobbubu/1836273.
Calendar- для работы с календарем.NumberFormatter- для форматирования числовых значений (включая валюту).DateFormatter- для форматирования дат.
и др.
Получение текущей локали
Locale.current // en_USПолучение требуемой локали
Locale.init(identifier: "ru_RU") // ru_RUПолучение массива доступных локалей
Locale.availableIdentifiersЧисло в текущей локали в указанном формате
let quantity = NumberFormatter.localizedString(from: 5000, number: .decimal) // 5,000Число в определенной локали
// создаем форматтер
var numFormatter = NumberFormatter()
// указываем стиль интернационализации чисел
numFormatter.numberStyle = .decimal
// указываем значение
let value: NSNumber = 5000
// проверяем текущую локаль
numFormatter.locale // en_US
numFormatter.string(from: value) // 5,000
// изменяем локаль
numFormatter.locale = Locale.init(identifier: "ru_RU")
numFormatter.string(from: value) // 5 000Вернуть сумму с идентификатором валюты в указанной локали
Итоговая сумма будет возвращена с учетом форматирования сумм указанной локали.
// исходное значение
let price: NSNumber = 149.95
// создаем форматтер
let formatter = NumberFormatter()
// настраиваем форматтер
formatter.numberStyle = .currency
formatter.currencyCode = "EUR"
formatter.locale = Locale.current // ru_EN
formatter.string(from: price) // "€149.95"
formatter.locale = Locale.init(identifier: "ru_RU")
formatter.string(from: price) // ""149,95 €""Дата в текущей локали в указанном формате
// в текущей локали
let date = DateFormatter.localizedString(from: Date(), dateStyle: .medium, timeStyle: .short)Дата в определенной локали и часовом поясе
// создаем форматтер
let dateFormatter = DateFormatter()
// настраиваем форматтер
dateFormatter.dateStyle = .full
dateFormatter.timeStyle = .medium
// указываем локаль
dateFormatter.locale = Locale.init(identifier: "ru")
// указываем часовой пояс
dateFormatter.timeZone = TimeZone(identifier: "GMT+6")
dateFormatter.string(from: Date()) // "воскресенье, 8 августа 2021 г. в 16:05:15"
// итоговое время на 3 часа больше московскогоЛокализация приложения достигается тем, что текстовый контент, предназначенный для пользователя, может быть отделен от графического представления приложения. Кроме того, для локализации различных ресурсов (картинки, видео, аудио, storyboard, xib и т.д.) составе проекта для каждого из поддерживаемых языков могут находиться их отдельные версии.
Предпочитаемые языки - список языков, добавленных пользователем в настройках устройства в разделе Основные - Язык и Регион.
Поддерживваемые языки - список языков, добавленных разработчиком при локализации приложения. Для каждого языка в составе проекта (на уровне файловой системы) создается собственная папка для хранения локализованных файлов, например en.lproj для английского, ru.lproj для русского и т.д.
Текущий язык приложения определяется путем поэлементного сопоставления предпочитаемых языков с поддерживаемыми. Как только находится первое совпадение, этот язык указывается в качестве текущего для приаложения. Помимо этого у пользователя есть возможность изменить язык приложения.
Development language - язык разработки. Основной язык, на котором изначально локализуется контент приложения.
Base internationalization - функция, позволяющая выделить из storyboard и xib файлов их текстовое содержимое и их сохранение в .strings файл отдельно для каждого языка. Это делается для того, чтобы не создавать отдельную копию storyboard и xib для каждого языка, а иметь одну base-версию файла, наполняемую из локализованного .strings файла. При активации данной функции в составе проекта создается папка Base.lproj.
Каждый файл проекта может быть локализован или не локализован. Если файл локализуется под определенный язык, то в соответсвующей данному языку папке (например ru.lproj для русского) создается отдельная копия данного файла.
Не локализованные файлы хранятся непосредственно в папке проекта и используются для любого языка.
Если для текущего языка нет локализованной версии, то используется версия файла из папки, соответствующей
Development language. При активации функцииBase internationalizationв этом случае загружается файл из папкиBase.lproj.
Одним из используемых при локализации механизмов являются файлы с раширением .strings. Данные файлы могут иметь локализованные под конкретные языки версии. В данных файлах содержатся элементы в следующем формате:
"key" = "value";где в каждой строке находится один элемент. key - это ключ, по которому будет производиться загрузка локализованного значения. value - это локализованное текстовое значение.
Если в файле
.strings, соответствующем текущему языку, нет определенного ключа, то используется значение из одноименного.strings-файла, соответствующегоDevelopment language. Если и там этог значение отсутствует, то в качестве локализованного текстового значения возвращается сам ключ.
- Открыть настройки проекта.
- Открыть раздел
Info. - В разделе
Localizationотметить пунктUse Base internationalization. - В открывшемся окне выберите для каких файлов необходимо создать базовую версию, на основе какого языка и для storyboard и xib файлов тип локализации (создание копии файла или с помощью
.strings).
- Открыть настройки проекта.
- Открыть раздел
Info. - В разделе
Localizationнажать кнопку+или-. - При нажатии
+в выпадающем окне выбрать язык, после чего выбрать локализуемые файлы и тип локализации (для storyboard и xib).
- Выделить ресурс (картинку, видео, storyboard ...) в
Project Navigator. - На панели
File Inspector(справа) нажать кнопкуLocalize.... - Выбрать языки, для которых будет производиться локализация.
После этого для данного ресурса будут созданы его локализованные версии, доступ к которым осуществляется через Project Navigator.
- Создайте файл
InfoPlist.strings. - Локализуйте созданный файл.
- В файле создайте элементы, ключи которых соответствуют локализуемым элементам файла
Info.plist, например:
"CFBundleDisplayName" = "Укажите тут локализованное название приложения";
"NSLocationWhenInUseUsageDescription" = "Локализованный запрос на доступ к локации";
- Создайте файл
Localizable.strings. - Локализуйте созданный файл.
- В файле создайте элементы с уникальными ключами, по которым в дальнейшем будут загруженны значения, например:
Файл Localizable.strings (en):
"hello_message" = "Hello!";
Файл Localizable.strings (ru):
"hello_message" = "Привет!";
Для их использования в коде вместо конкретной строки используйте NSLocalizedString.
NSLocalizedString("key", comment: "")Также вы можете использовать формат с подстановкой значений, когда в локализованное сообщение должен быть помещен дополнительный контент, одинаковый для всех языков.
С подстановкой значений
Localizable.strings:
"key %d" = "value %d";
Файл с исходным кодом:
String(format: NSLocalizedString("key %d", comment: ""), 12)
// в результате будет отображена строка "value 12"
// вы можете использовать и другие возможности String(format:_:)Вы можете изменить предпочитаемый язык и регион прямо в Xcode, чтобы протестировать работу приложения.
- Откройте настройки текущей схемы.
- Выберите пункт
Run. - Выберите вкладку
Options - Измените значения пунктов
Application LanguageиApplication Regionна требуемые.