Гайд з локалізації iOS та macOS застосунків в Xcode. Власний досвід і поради
Привіт! Мене звати Володимир Нуждін, і вже понад 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). Для використання цієї функції зробіть наступне:
- Виберіть ваш проєкт.
- Зайдіть в пункт меню Editor → Export For Localization і виберіть список мов на локалізацію.
- Збережіть файл.
Поздоровляю! Тепер у вас є папка з усіма рядковими ресурсами вашого проєкту, яку можна сміливо надсилати на переклад. Після модифікації даних файлом-перекладачем, ви зможете експортувати їх в декілька кліків за допомогою пункту меню 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» з англійської можна перекласти і як «книга», і як «бронювати»).
Насамкінець хочу сказати, що залишилось ще багато чого, про що варто розповісти. Тож якщо вам буде це корисно, напишу продовження і розберу деякі частини докладніше.
Готовий відповісти на будь-які ваші питання в коментарях!
3 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів