checklistslocalization

Чек-лист локализации: 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.