ИНТЕРНАЦИОНАЛИЗАЦИЯ И ЛОКАЛИЗАЦИЯ

Перевод приложения на другие языки

справочник

Х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.
  • В открывшемся окне выберите для каких файлов необходимо создать базовую версию, на основе какого языка и для storyboard и xib файлов тип локализации (создание копии файла или с помощью .strings).

Изменение списка поддерживаемых языков

  • Открыть настройки проекта.
  • Открыть раздел Info.
  • В разделе Localization нажать кнопку + или -.
  • При нажатии + в выпадающем окне выбрать язык, после чего выбрать локализуемые файлы и тип локализации (для storyboard и xib).

Локализация определенного ресурса в составе проекта

  • Выделить ресурс (картинку, видео, storyboard …) в 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 на требуемые.

Добавить комментарий