Х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
Одним из используемых при локализации механизмов являются файлы с раширением .strings
. Данные файлы могут иметь локализованные под конкретные языки версии. В данных файлах содержатся элементы в следующем формате:
"key" = "value";
где в каждой строке находится один элемент. key
— это ключ, по которому будет производиться загрузка локализованного значения. value
— это локализованное текстовое значение.
Если в файле
.strings
, соответствующем текущему языку, нет определенного ключа, то используется значение из одноименного.strings
-файла, соответствующегоDevelopment language
. Если и там этог значение отсутствует, то в качестве локализованного текстового значения возвращается сам ключ.
Base internationalization
Info
.Localization
отметить пункт Use Base internationalization
..strings
).Info
.Localization
нажать кнопку +
или -
.+
в выпадающем окне выбрать язык, после чего выбрать локализуемые файлы и тип локализации (для storyboard и xib).Project Navigator
.File Inspector
(справа) нажать кнопку Localize...
.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
на требуемые.