Localization (локалізація, l10n) — адаптація контенту мобільного додатка під мову, регіон та культурні особливості цільової аудиторії. На відміну від інтернаціоналізації (i18n), де код готується до перекладу, локалізація — це сам процес перекладу рядків, форматування дат, чисел та валют, вибору зображень та врахування місцевих норм. На iOS переклади зберігаються в Localizable.strings (папки .lproj для кожної мови), на Android — в values-ru, values-de та інших каталогах ресурсів. Докладніше — в посібнику Android з локалізації.
Головне
Локалізація (скорочено l10n — 10 букв між «l» і «n») — це процес адаптації додатка під конкретну мову та регіон. Якщо i18n — архітектурний фундамент, то l10n — наповнення. i18n робить переклад можливим, l10n виконує його. Локалізація включає: переклад усіх текстів інтерфейсу, адаптацію форматів дат та чисел, заміну зображень з культурно чутливим контентом, коригування юридичних текстів (політика конфіденційності, EULA), налаштування платіжних систем під регіон та тестування на цільових пристроях.
Бізнес-рентабельність — локалізація безпосередньо впливає на конверсію. За даними CSA Research (2023), 76% користувачів надають перевагу покупкам в додатках рідною мовою, а 40% ніколи не купують іноземною. Локалізація на японську для ритейл-додатка збільшує конверсію в середньому на 150% (Google, 2022). Локалізовані додатки отримують в 2–3 рази більше органічних встановлень в регіональних App Store та Google Play завдяки регіональному ASO (ключові слова цільовою мовою).
i18n vs l10n — дві сторони одного процесу. i18n: винесення рядків в ресурси, підтримка RTL, форматування чисел. Робиться одноразово розробниками. l10n: переклад рядків, адаптація контенту, локальне тестування. Робиться багаторазово перекладачами та QA для кожної локалі. В IT Sectr ми закладаємо 20–30% часу спринту на локалізацію для кожної нової мови — це включає переклад, ревю, тестування на пристроях та виправлення багів.
Localizable.strings — основний файл для зберігання перекладів в iOS. Кожна локаль має свою папку .lproj: en.lproj/Localizable.strings, ru.lproj/Localizable.strings, de.lproj/Localizable.strings. Формат: «ключ» = «переклад»; (з крапкою з комою). Apple використовує Base Internationalization: Storyboard та XIB створюються одноразово (Base.lproj), а рядки інтерфейсу експортуються в Localizable.strings для кожної мови. Це позбавляє необхідності створювати копії XIB для кожної локалі.
// en.lproj/Localizable.strings
// "settings.title" = "Налаштування";
// "profile.greeting" = "Вітаємо, %@!";
// "items.count" = "%d шт.";
// ru.lproj/Localizable.strings
// "settings.title" = "Налаштування";
// "profile.greeting" = "Вітаємо, %@!";
// "items.count" = "%d шт.";
// Завантаження рядка за ключем
navigationItem.title = NSLocalizedString(
"settings.title",
comment: "Заголовок екрану налаштувань"
)
// Рядок з параметром
let name = "Анна"
greetingLabel.text = String.localizedStringWithFormat(
NSLocalizedString("profile.greeting", comment: ""), name
)
// XLIFF-імпорт (Xcode → Editor → Import Localizations)
// Автоматично оновлює .lproj файли після роботи перекладача
Base Internationalization — підхід Apple, при якому інтерфейс (Storyboard, XIB) створюється одноразово в Base.lproj. При додаванні мови Xcode експортує рядки з Base в XLIFF-файл. Перекладач перекладає XLIFF. Після імпорту Xcode створює .lproj з перекладеними рядками. Перевага: не потрібно дублювати XIB для кожної мови. Обмеження: для RTL-мов (арабська, іврит) може знадобитися окремий XIB з дзеркальним макетом.
InfoPlist.strings — файл для локалізації назви додатка (CFBundleDisplayName), дозволів камери/мікрофона (NSCameraUsageDescription) та інших значень з Info.plist. Створюється в .lproj: ru.lproj/InfoPlist.strings. Формат: CFBundleDisplayName = «Мій додаток»; NSCameraUsageDescription = «Додатку потрібен доступ до камери для знімання фото»;. Без локалізації InfoPlist.strings системні діалоги будуть англійською.
Ресурси Android для локалізації організовані через кваліфікатори в назвах каталогів. Для російської — res/values-ru/, для німецької — res/values-de/, для бразильської португальської — res/values-pt-rBR/. Android підтримує понад 160 локалей. Система автоматично обирає ресурси на основі мови пристрою (Locale.getDefault()). Якщо точної локалі немає — підставляються ресурси з values/ (базова локаль, звичайно en).
// res/values/strings.xml (базовий — англійська)
<string name="settings_title">Settings</string>
<string name="greeting">Hello, %s!</string>
// res/values-ru/strings.xml (російська)
<string name="settings_title">Налаштування</string>
<string name="greeting">Вітаємо, %s!</string>
// res/values-de/strings.xml (німецька)
<string name="settings_title">Einstellungen</string>
<string name="greeting">Hallo, %s!</string>
// Kotlin — єдиний код для всіх мов
textView.text = getString(R.string.settings_title)
// Рядок з параметром
val greeting = getString(R.string.greeting, userName)
// Локалізовані зображення
// res/drawable-ru/flag.png — прапор для російської версії
// res/drawable/flag.png — прапор за замовчуванням
// Локалізація макетів (для RTL-мов)
// res/layout-ar/activity_main.xml — арабська версія
Локалізація не тільки рядків — Android дозволяє локалізувати зображення (res/drawable-ru/), кольори (res/values-ru/colors.xml), розміри (res/values-ru/dimens.xml), анімації, меню та навіть цілі макети. Для мов з різною довжиною слів (німецька на 30–40% довша за англійську) використовуйте локалізовані dimens.xml з збільшеною шириною кнопок. Для регіонів з іншою кольоровою символікою (білий — жалоба в Китаї) — локалізовані colors.xml.
Тестування — перемкніть мову пристрою на цільову через Налаштування → Система → Мова. Перевірте: усі рядки перекладено, дати форматуються коректно, числа відображаються з правильним роздільником, зображення відповідають регіону, макет не «ламається» при довгих рядках. Для автоматизації використовуйте Espresso з LocaleTestRule (Android Testing Library) — він дозволяє запускати тести з різними локалями без перемикання мови вручну.
Культурні особливості — локалізація не обмежується перекладом рядків. Кольорова символіка різниться: червоний — удача в Китаї, небезпека в США, жалоба в Південній Африці. Білий — чистота в Європі, жалоба в Китаї. Іконки з жестами: більший палец вгору — позитив в США, образа на Близькому Сході. Зображення людей: в арабських країнах недопустимі зображення жінок в купальниках. Релігійні символи: хрест, півмісяц, зірка Давіда повинні використовуватися тільки в відповідному контексті.
Юридичні вимоги — кожна країна має свої закони про цифрові продукти. GDPR (ЄС) — обов’язкова згода на cookie та обробку даних. CCPA (Каліфорнія) — право на видалення даних. Закон про персональні дані (Росія, 152-ФЗ) — зберігання даних на серверах РФ. LGPD (Бразилія) — аналог GDPR. Платежі: в Китаї потрібні Alipay/WeChat Pay, в Індії — UPI, в Бразилії — Boleto та PIX. Налаштуйте платіжний шлюз під регіон до запуску локалізації.
| Аспект | США | Китай | ОАЕ | Німеччина |
|---|---|---|---|---|
| Платіжна система | Apple Pay, Картки | Alipay, WeChat Pay | Картки, Apple Pay | PayPal, Giropay |
| Кольори бренду | Будь-які | Червоний — удача | Зелений — іслам | Чорний/Жовтий |
| Соцмережі | Instagram, X | WeChat, Douyin | WhatsApp, X | WhatsApp, X |
| Дата | MM/dd/yyyy | yyyy/MM/dd | dd/MM/yyyy | dd.MM.yyyy |
| Закон про дані | CCPA | PIPL | PDPL | GDPR |
Приклади та контент — адаптуйте приклади під регіон. Для німецької локалізації використовуйте метричну систему (кг, км), для американської — імперську (lb, mi). Номери телефонів, поштові індекси, адреси — форматуються по-різному. Валютні приклади: ¥1000 в Японії, $9.99 в США, 999 ₽ в Росії. Зображення їжі, одягу, інтер’єрів повинні відповідати регіональним стандартам. В IT Sectr ми рекомендуємо наймати локальних консультантів для перевірки культурної адаптації.
Інструменти локалізації — професійні платформи автоматизують процес: Lokalise, Crowdin, POEditor, Smartling, Phrase. Вони інтегруються з репозиторієм, автоматично імпортують нові рядки, відстежують зміни (Delta updates — перекладаються лише змінені рядки), надають Translation Memory (ТМ — збереження раніше перекладених фраз) та Glossary (глосарій термінів). Середня вартість професійного перекладу: $0.08–0.15 за слово (залежить від мови).
Процес — (1) Розробник додає i18n-ключі в код, пушить в репозиторій. (2) CI/CD (GitHub Actions / GitLab CI) автоматично відправляє нові ключі в платформу локалізації. (3) Перекладачі отримують сповіщення, перекладають та зберігають. (4) Перекладені файли автоматично створюють PR в репозиторій. (5) QA перевіряє локалізацію на пристроях. (6) Реліз. Цикл для однієї локалі: 2–5 робочих днів (залежно від обсягу). Для 10 локалей: 5–15 днів при паралельній роботі перекладачів.
Machine Translation + Human Review — сучасний стандарт. Нейромережевий переклад (DeepL, Google Translate, GPT-4) дає якість 80–90% для популярних мовних пар. Людина-перекладач перевіряє: термінологію, контекст (слова можуть мати різні значення на різних екранах), культурну адаптацію. В IT Sectr ми використовуємо hybrid approach: ML-переклад + ревю носієм мови. Для критичних рядків (юридичні, платіжні) — тільки професійний переклад. Економія: до 60% вартості при збереженні якості.
Часто задавані питання
Інтернаціоналізація — підготовка коду до перекладу (винесення рядків, RTL, форматування). Локалізація — сам переклад та культурна адаптація. i18n робить розробник один раз, l10n — перекладач для кожної мови. i18n без l10n — додаток готовий до перекладу, але не перекладений. l10n без i18n — потрібно переписувати код для кожної мови.
В файлах Localizable.strings всередині папок .lproj. Для кожної мови: en.lproj (англійська), ru.lproj (російська), de.lproj (німецька). Формат: «ключ» = «переклад»;. Для множини — Localizable.stringsdict. Налаштування додатка (CFBundleDisplayName) — в InfoPlist.strings. Xcode керує .lproj через Base Internationalization.
values-ru — каталог ресурсів Android для російської мови. Містить strings.xml з перекладами. Аналогічно для інших мов: values-de (німецька), values-fr (французька). Android обирає ресурси на основі системної мови. Якщо values-ru не знайдено — використовує values/ (базова мова, звичайно англійська).
Завжди використовуйте Locale API. iOS: DateFormatter.locale = Locale(identifier: locale). Android: DateFormat.getDateInstance(DateFormat.SHORT, locale). Росія: 31.12.2024. США: 12/31/2024. Японія: 2024/12/31. Ніколи не задавайте фіксований формат — в кожній країні свої стандарти. Для введення дат використовуйте UIDatePicker / DatePicker.
Для глобального охоплення достатньо 10–15 мов: англійська, іспанська, французька, німецька, японська, китайська, корейська, португальська, російська, італійська, арабська. Для регіонального — 1–2 мови. Кожна додаткова локаль збільшує органічні встановлення на 5–15% в відповідному регіоні. App Store вимагає щонайменше англійську локалізацію.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також