Быстрый способ локализации iOS приложения на Swift
Всем привет. Сегодня мы продемонстрируем новичкам в мобильной разработке, как очень легко и просто, с помощью .storyboard и .string файлов, можно локализовать свое iOS приложение.
Код с примерами написан на языке программирования Swift. При написании статьи использовался Xcode версии 12.1.
Перед началом
Для демонстрации нами был создан тестовый проект. В роли интерфейса мы выбрали Storyboard. Данный способ поможет локализовать проекты, написанные с помощью фреймворка Uikit. Хотя, даже если проект написан на SwiftUI, вы все равно можете воспользоваться информацией из статьи, просто подключение String-файлов локализации, возможно, будет реализовано иначе.
Наш тестовый проект имеет один экран в Main.storyboard, который связан с ViewController.swift. Естественно, если у Вас несколько экранов, в которых хочется что-то локализовать, то под каждый нужно будет создать собственный ViewController и связать его с конкретными экраном в storyboard файле. Это нужно для локализации через .string файлы.
Приступаем к локализации iOS приложения
Допустим, мы хотим локализовать наш заголовок и описание. А также контекстное меню.
Контекстное меню – это небольшое всплывающее окно, которое появляется, когда мы выделяем какой-нибудь текст (вырезать, копировать, вставить). Думаю, все ни раз сталкивались с таким контекстным меню в своем iPhone.
Забежим вперед и сразу раскроем карты: контекстное меню локализуется автоматически под все доступные языки внутри операционной системы iOS. Нужно только включить эту опцию в настройках в Xcode.
Подготовка
В данный момент, судя по скриншоту выше, у нас текст заголовка и описания хранится прямо в Main.storyboard. Для начала нам нужно заполнить текстовое значение наших лейблов через код. Это обязательно для локализации через String файлы.
Поэтому давайте объявим соответствующие переменные во ViewController и свяжем с объектами на экране в Main.storyboard.
А после статично заполним их каким-нибудь текстом. Естественно, это временно. Ну и проверим результат в эмуляции.
Как видим, все получилось. Теперь переходим непосредственно к локализации. Но перед этим давайте закомментируем этот код, чтобы пока не мешался.
Добавляем локализацию
Нам нужно перейти в Info раздел проекта. Поэтому нажимаем на имя проекта слева в углу. Далее, как показано на скриншоте, “переключаем” экран с режима target на project.
Здесь, в разделе Localization, жмем на плюс.
Чтобы не покрывать все скриншотами, объясним на словах. После нажатия на плюс перед вами появится список из возможных языков. Выберите русский язык. Далее Xcode спросит вас, для каких storyboard файлов нужно создать зависимости. Здесь выбор зависит от того, какие экраны и в каких storyboard файлах хочется локализовать контент. В нашем случае снимаем галочки со всего, кроме Main.storyboard.
После всех действий у Вас в разделе Localization появится новый язык, а также Xcode создаст локализационный файл внутри Main.storyboard (он как подкатегория выглядит).
Внутри у него будет следующее содержимое, как на скриншоте ниже.
Считайте это все огромным массивом “ключ – значение”. Слева ключ (уникальный ID элемента), по которому приложение будет получать значение, справа – обычный локализованный текст. За локализацию тут отвечает storyboard, он сам все будет делать “магическим образом”.
Давайте изменим содержимое файла на что-нибудь на русском языке. Теперь, чтобы проверить нашу работу, нужно запустить приложение, перед этим поставив в настройках Xcode русский язык, как язык системы.
Для этого, нажмите в Xcode Edit Scheme.
После, в разделе Option, установите русский язык.
Есть еще способ, чуть-чуть странный, но рабочий. Запустите эмуляцию какого-нибудь iPhone, сверните свое приложение, перейдите в настройки iPhone и смените язык на русский. Перезапустите эмуляцию (главное эмулированное устройство не меняйте).
В итоге Вас будет ждать приятный сюрприз.
Контекстное меню (про которое говорил в начале статьи) будет локализовано автоматически после добавления нового языка в Xcode.
Работаем с NSLocalizedString
Но что будет, если элемент не создан с помощью .storyboard файла? Как его локализовать? Например, уведомление перед использованием Face/Touch ID.
Здесь приходят на помощь .string файлы. Давайте создадим такой в нашем проекте и назовем его Localizable, это обязательно.
Автор статьи сначала пошел по пути самодеятельности и назвал файл как хотел, а потом 10 минут не мог понять, почему ничего не работает. Поэтому будьте внимательны!
Далее открываем File Inspector и нажимаем Localize.
После проставляем галочки у русского и английского языка.
Теперь переходим в русский .string файл (он появился внутри Localizable.string) и там пишем следующее:
"title" = "Заголовок NS";
"description" = "Описание NS";
После дублируем тоже самое в английский .string файл, но русское содержимое меняем на английское.
После возвращаемся во ViewController. Раскомментируем участок кода и заменим наш статичный текст в элементах на вызов класса локализации:
NSLocalizedString("", comment: "")
В первый аргумент функции мы добавляем сам ключ элемента из .string файла, который хотим вызвать. Второй аргумент (comment) несет в себе только лишь смысловую нагрузку для того, кто будет переводить ваше приложение в дальнейшем. В целом можете оставить его пустым.
Если по ключу не будет найдено значение (ключа не существует в .string файле), то функция вернет просто первый аргумент в виде строки.
Теперь запускаем эмулятор и проверяем.
Поздравляем, у Вас все получилось.
Пару советов
Если хотите локализовать изображения, то, с помощью .string файла, Вам нужно лишь менять название элемента, которое вы цепляете из Assets с помощью UIImage(named:“”).
Так как некоторые иностранные слова могут быть в два, а то и три, раза больше (привет финский и немецкий), установите авторегулирование размера шрифта у конкретных элементов.
Спасибо за внимание, надеемся данная статья была Вам полезна. Если вдруг что-то не получилось или в статье есть ошибка – смело оставляйте комментарии. В случае недопонимания мы постараемся помочь. А в случае с ошибкой модератор призовет программиста-автора и заставит исправить грязное недоразумение.
Оставьте комментарий