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. Формат: „ключ" = „стойност"; (с точка и запетая). 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 с огледално оформление.
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), анимации, менюта и дори цели оформления. За езици с различна дължина на думите (немският е с 30–40% по-дълъг от английския) използвайте локализирани dimens.xml с увеличена ширина на бутоните. За региони с различна цветова символика (бяло — траур в Китай) — локализирани colors.xml.
Тестване — превключете езика на устройството на целевия чрез Настройки → Система → Език. Проверете: всички низове са преведени, датите се форматират правилно, числата се показват с правилния разделител, изображенията съответстват на региона, оформлението не се „чупи" при дълги низове. За автоматизация използвайте Espresso с LocaleTestRule (Android Testing Library) — позволява стартиране на тестове с различни локализации без ръчно превключване на езика.
Културни особености — локализацията не се ограничава до превод на низове. Цветовата символика се различава: червено — късмет в Китай, опасност в САЩ, траур в Южна Африка. Бяло — чистота в Европа, траур в Китай. Икони с жестове: палец нагоре — позитив в САЩ, обида в Близкия изток. Изображения на хора: в арабските страни са неприемливи изображения на жени по бански. Религиозни символи: кръст, полумесец, Давидова звезда трябва да се използват само в подходящ контекст.
Правни изисквания — всяка държава има свои закони за цифровите продукти. GDPR (ЕС) — задължително съгласие за бисквитки и обработка на данни. 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 (TM — запазване на предварително преведени фрази) и 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 използваме хибриден подход: 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също