Гайд з локалізації iOS та macOS застосунків в Xcode. Власний досвід і поради

Усі статті, обговорення, новини про Mobile — в одному місці. Підписуйтеся на телеграм-канал!

Привіт! Мене звати Володимир Нуждін, і вже понад 5 років я займаюсь розробкою iOS і macOS програм в команді Nektony.

Два роки тому ми вирішили локалізувати наші застосунки на інші мови. У цій статті я спробую коротко згадати всі інструменти, які допомогли мені в цій нелегкій справі. До кожного пункту я додав посилання, якими користувався, і де ви зможете отримати більше інформації.

Трохи передмови

Взагалі пошук будь-якого питання починається із запиту в Google. Але якщо зазвичай ви одразу отримуєте всю необхідну документацію і покрокову інструкцію за вашим запитом, у випадку з локалізацією все було не так.

  • Інформація мала старий і зовсім незручний формат для читання.
  • Було не так і легко знайти цю інформацію. Я використовував запит «site:developer.apple.com internationalization».
  • До речі, цей текст в заголовку мав зауваження: «Important: This document is no longer being updated. For the latest information about Apple SDKs, visit the documentation website».

Форматери даних

Порада № 1 — використовуйте форматери даних. Ось посилання на них. Починаючи розробляти, я не знав про їхнє існування, але згодом почув про них у лекції на WWDC. Вони мають великий асортимент налаштувань і стилів. Ви явно знайдете для себе щось актуальне, якщо раніше їх активно не використовували.

Якщо бажаєте самим створювати рядкові уявлення даних варто зайти в System Preferences/Language & Region/Advanced та переглянути всі налаштування. Але коли я їх переглянув, це геть відбило в мене бажання «писати велосипеди».

Зараз я завжди в першу чергу шукаю відповідний форматер. За останній рік не було випадку, щоб я не зміг знайти потрібний мені.

Як додати підтримку нової мови в XCode

На скриншоті нижче можна побачити, що все дуже легко. Але зверніть увагу на те, що мову можна додавати лише до проєкту, а не до одного з таргетів.

У модальному вікні, що з’явиться, ставте галочки тільки поряд з тими файлами, які плануєте локалізувати.

Імпорт/ Експорт файлів локалізацій в XCode

У реальному застосунку у вас буде багато файлів локалізацій: «xib», «strings», «stringsdict», «plist» тощо. Єдине обмеження — це ваша фантазія. Найскладніше було збирати ці файли в один архів, відправляти перекладачам, а після перекладу, розкласти тексти за проєкт. Те ще задоволення 🤪!

На щастя, Apple надає дуже зручний інструмент для роботи з локалізацією рядкових ресурсів: Імпорт/ Експорт файлів xliff (розповідь на WWDC). Для використання цієї функції зробіть наступне:

  1. Виберіть ваш проєкт.
  2. Зайдіть в пункт меню Editor → Export For Localization і виберіть список мов на локалізацію.
  3. Збережіть файл.

Поздоровляю! Тепер у вас є папка з усіма рядковими ресурсами вашого проєкту, яку можна сміливо надсилати на переклад. Після модифікації даних файлом-перекладачем, ви зможете експортувати їх в декілька кліків за допомогою пункту меню Editor → Import Localizations.

Як локалізувати файл в XCode

1) Виберіть файл у дереві проєкту.

2) В панелі утиліт виберіть першу вкладку.

3) Натисніть кнопку «Localize...».

4) Виберіть потрібну мову і натисніть на «Localize».

5) У дереві проєкту з’являться файли локалізації.

Як швидко перемикнути мову під час тестування в XCode

1) Натисніть на таргет біля кнопок «Build and Run» & «Stop».

2) Виберіть «Edit Scheme».

3) Натисніть «Run».

4) Натисніть «Options» у шапці правої частини вікна.

5) Далі виберіть бажану мову і закрийте вікно «Edit Scheme».

Наступний запуск програми вже буде з вибраною мовою.

Зверніть увагу, що внизу випадного списку є два додаткові пункти. Це псевдомови. Вони можуть допомогти вам у тестуванні.

  • Right to Left Pseudolanguage.
  • Double Length Pseudolanguage.

Autolayout

Якщо ви з якихось причин все ще використовуєте явне завдання координат, вам буде важко. Спробуйте звести явне завдання координат до мінімуму. Autolayout — ваш найкращий помічник у цьому питанні!

На що треба звернути увагу:

  • Уникайте вказівки явних розмірів елементам зі змінним контентом (кнопки, написи тощо.)
  • Перевірте ретельно «content hugging and content compression resistance priorities».
  • Якщо у вас є прогалини у розумінні основних принципів розміщення NSLayoutConstraint, то краще закрийте їх, а потім розпочніть роботу з локалізації.
  • Визначтеся, які елементи у вашому застосунку можуть бути багаторядковими, а які — ні.
  • Виставте всім написам NSLineBreakMode.
  • Не розраховуйте на те, що текст буде меншим за певну величину — це неправильно взагалі. На практиці ви з цим зіткнетеся. Тож переконайтеся, що елемент обмежений з усіх боків. І навіть маленька кнопка в лівій частині екрана має обмеження праворуч (це не дасть їй вилізти за межі екрана та налізти на інший елемент).
  • Будьте обережні з Content Compression Resistance > 500 на Mac. Такі елементи можуть розширювати NSWindow, на яких лежать. При необхідності такого розширення ставте обмеження розміру у вигляді нерівності. Це рідкісний випадок, коли значення доведеться підбирати інтуїтивно.
  • Більшість мов відносяться до left-to-right languages, але частина мов, таких як арабська та іврит відносяться до right-to-left languages. Для підтримки цих мов вибирайте leading замість left та trailing замість right.
  • У деяких випадках вам доведеться змінювати встановлені обмеження (NSLayoutConstraint), залежно від поточної мови.

Порядок слів може змінюватися під час перекладу

При формуванні терміну, використовуючи, скажімо, [NSString stringWithFormat:], ви можете в специфікаторі задавати номер аргументу, який слід вставити.

Swift.print("\(String(format: "%@ %@",     "s1", "s2"))")
Swift.print("\(String(format: "%1$@ %2$@", "s1", "s2"))")
Swift.print("\(String(format: "%2$@ %1$@", "s1", "s2"))")
Swift.print("\(String(format: "%1$@ %1$@", "s1", "s2"))")
Swift.print("\(String(format: "%1$@ %2$@ %3$@", "s1", "s2", "s3"))")
Swift.print("\(String(format: "%1$@ %3$@", "s1", "s2", "s3"))")//(**)

/*
 Output:
 s1 s2
 s1 s2
 s2 s1
 s1 s1
 s1 s2 s3
 s1 s2
 */

Локалізація NSAttributedString

Іноді доводиться локалізувати не лише звичайні рядки, а й атрибутні. Для цього можна використовувати Atributika.

let b = Style("b").font(.boldSystemFont(ofSize: 20)).foregroundColor(.red)
label.attributedText = "Hello <b>World</b>!!!".style(tags: b).attributedString

Objective-C Analyzer дозволяє знайти частину не локалізованого контенту.

1) Зайдіть в налаштування проєкту.
2) Виставіть прапор «Missing Localizability» в YES.

3) У меню XCode виберіть «Product/Analyze».
4) З’явиться Warning аналайзер.

5) Натиснувши на нього, ви побачите причину.

6) Підправте код і перезапустіть аналайзер. Попередження повинно буде зникнути.

Додаткові нотатки стосовно локалізації продуктів в Xcode

  • У Xcode 10 при імпорті/ експорті ви працюєте не просто з xliff-файлом, а з пакетом, що містить всі локалізовані ресурси, в який також входить і описаний у моїй статті xliff, зображення, ксибки тощо.
  • Можна локалізувати ксибку, не використовуючи жодного коду.
  • Можна, прописавши в коді NSLocalizedString, простим викликом скрипту витягнути всі тексти/ коментарі в файли strings з відповідною назвою.
  • Використовуючи Stringsdict, можна описати всі форми множинних чисел.
  • Локалізувати варто не тільки тексти. Одне зображення може бути звичним для вас, але зовсім не очевидним людям з іншої частини земної кулі.
  • Один і той же текст англійською мовою може мати різні переклади в залежності від контексту, з чого випливає дві речі: коментарі вкрай важливі і не варто скорочувати кількість перекладів, об’єднуючи за ключами (наприклад слово «book» з англійської можна перекласти і як «книга», і як «бронювати»).

Насамкінець хочу сказати, що залишилось ще багато чого, про що варто розповісти. Тож якщо вам буде це корисно, напишу продовження і розберу деякі частини докладніше.

Готовий відповісти на будь-які ваші питання в коментарях!

👍ПодобаєтьсяСподобалось11
До обраногоВ обраному9
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

а чому Хcode10?
а чому ви не користуєтесь SwiftGen або іншими схожим софтом?

Ще треба додати про нюанси з картинками. При підтримці RTL, змінюються положення картинок на кнопках, «в іншу сторону» мають дивитися кастомні картинки навігації ...

Плюс зовсім не озвучена тема зміни мови без перезапуску застосунку.
Також часто треба не передавати стрінги на переклад, а вже приходять стрінги з перекладами (звʼязка Figma + Ditto або шось подібне)

Для автоматизації передачі файлів (надсилання перекладачам та розкладання текстів за проєктом) можу рекомендувати український продукт — Crowdin.

Для розробників мобільних додатків Crowdin пропонує:

1. Підтримку різних форматів файлів.
2. Автоматичне оновлення перекладів.
3. Інструменти для співпраці з командою перекладачів та розробниками.
4. Фічі для зручного контролю якості перекладу.

Підписатись на коментарі