Localization (локализация, l10n) — адаптация контента мобильного приложения под язык, регион и культурные особенности целевой аудитории. В отличие от интернационализации (i18n), где код готовится к переводу, локализация — это сам процесс перевода строк, форматирования дат, чисел и валют, выбора изображений и учёта локальных норм. На iOS переводы хранятся в Localizable.strings (папки .lproj для каждого языка), на Android — в values-ru, values-de и других директориях ресурсов. Подробнее — в руководстве Android по локализации.
Главное
Localization (сокращённо 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. Формат: «key» = «value»; (c точкой с запятой). Apple использует Base Internationalization: Storyboard и XIB создаются один раз (Base.lproj), а строки интерфейса экспортируются в Localizable.strings для каждого языка. Это избавляет от создания копий XIB для каждой локали.
// en.lproj/Localizable.strings
// "settings.title" = "Settings";
// "profile.greeting" = "Hello, %@!";
// "items.count" = "%d item(s)";
// 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 с зеркальным layout.
InfoPlist.strings — файл для локализации названия приложения (CFBundleDisplayName), разрешений камеры/микрофона (NSCameraUsageDescription) и других значений из Info.plist. Создаётся в .lproj: ru.lproj/InfoPlist.strings. Формат: CFBundleDisplayName = «Моё приложение»; NSCameraUsageDescription = «Приложению нужен доступ к камере для съёмки фото»;. Без локализации InfoPlist.strings системные диалоги будут на английском.
Android ресурсы для локализации организованы через квалификаторы (qualifiers) в именах директорий. Для русского языка — 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), анимации, меню и даже целые layout. Для языков с разной длиной слов (немецкий на 30–40% длиннее английского) используйте локализованные dimens.xml с увеличенной шириной кнопок. Для регионов с другой цветовой символикой (белый — траур в Китае) — локализованные colors.xml.
Тестирование — переключите язык устройства на целевой через Настройки → Система → Язык. Проверьте: все строки переведены, даты форматируются корректно, числа отображаются с правильным разделителем, изображения соответствуют региону, макет не «ломается» при длинных строках. Для автоматизации используйте Espresso с LocaleTestRule (Android Testing Library) — он позволяет запускать тесты с разными локалями без переключения языка вручную.
Культурные особенности — локализация не ограничивается переводом строк. Цветовая символика различается: красный — удача в Китае, опасность в США, траур в ЮАР. Белый — чистота в Европе, траур в Китае. Иконки с жестами: большой палец вверх — позитив в США, оскорбление на Ближнем Востоке. Изображения людей: в арабских странах недопустимы изображения женщин в купальниках. Религиозные символы: крест, полумесяц, звезда Давида должны использоваться только в соответствующем контексте.
Юридические требования — каждая страна имеет свои законы о цифровых продуктах. GDPR (ЕС) — обязательное согласие на cookies и обработку данных. 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 (немецкий). Формат: «key» = «value»;. Для плюралов — 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также