Чек-лист локализации: 10 ловушек, которые ловятся за один проход
Локализация — не «прогнать тексты через переводчика». На 5+ языках всплывает дюжина классов багов, невидимых на английском. Компактный чек-лист, покрывающий 90% реальных проблем.
— Длина строк. Немецкий и финский в 1.5–2x длиннее английского — кнопки и заголовки рвутся. Проверяйте кнопку «Подтверждение» на немецком (Bestätigung) и финском (Vahvistus). Самые тяжёлые случаи: немецкие compounds (Geschwindigkeitsbegrenzung) и финская agglutination.
— Плюрализация. В русском 3 формы (1 яблоко, 2 яблока, 5 яблок), в польском 4, в арабском 6. Если в коде «{count} item(s)» — это баг. Используйте ICU MessageFormat / i18next / Polyglot.
— Форматы даты и числа. 1,000.50 (US) vs 1.000,50 (EU) vs 1 000,50 (FR). Дата 03/04/2026 — март или апрель? Используйте Intl.NumberFormat / Intl.DateTimeFormat, не локальные хардкоды.
— RTL (Right-to-Left). Арабский, иврит, персидский — UI должен зеркалиться: стрелки «назад», прогресс-бары, иконки в кнопках. Проверяйте все экраны в RTL-режиме (на iOS — Scheme → Application Language → Arabic).
— ⚠️ Турецкая «i»-проблема. В tr-TR локали "İSTANBUL".ToLower() возвращает "i̇stanbul", а "i".ToUpper() даёт "İ". Поиск по строкам и сравнения — отдельная коллекция багов. Используйте InvariantCulture для технических сравнений.
— Цветовая семантика. Красный = опасность в Европе, удача в Китае. Зелёный = успех или «дешёвая». Если кодируете смысл цветом — добавьте дублирующую текстовую/иконочную маркировку.
— Валюта. Не просто символ — порядок («$10» vs «10 €»), пробел, разделитель. Курс конвертации не должен меняться между добавлением в корзину и оплатой.
— Капитализация. В немецком все существительные с большой буквы. В испанском заголовки — sentence case, не Title Case. Заголовки экранов должны приходить из локали, а не из text.toUpperCase().
— Глоссарий. Если у игры есть консистентная терминология («бустер», «жизнь», «уровень») — она должна быть единая по всем экранам, push-уведомлениям, описанию в сторе. Заведите glossary.csv.
— Fallback chain. Если для текущего языка нет перевода — fallback в en. Никогда не показывайте ключ строки errors.network.timeout на UI.
Что встроить в QA-процесс
💡 Pseudo-localization в dev-сборках: Ĥéĺĺo Wörłd — мгновенно видно нелокализованные строки.
💡 Тестируйте на 2–3 «тяжёлых» языках (немецкий + русский + арабский) — покрывает большинство классов.
💡 Один regression-кейс на ловушку выше — 10–15 минут на язык на релиз.
Подробнее: W3C Internationalization Best Practices, Apple Localization Guide.