Магазин запустили в Германии, и за неделю поддержка приносит три обращения: подпись уехала за край кнопки, и половина кнопки не нажимается; покупатель ждал посылку 4 марта, а привезли 3 апреля — в письме стояло «03.04.2026»; в корзине написано «Найдено 1 товаров».
Перевод везде безупречный. Сломалось то, что вокруг него: вёрстка по длине русских слов, дата по русскому шаблону, фраза из трёх склеенных кусков. Проверка того, что продукт остаётся правильным в каждой языковой версии, и называется локализационным тестированием.
Код один, данные одни — меняется только локаль. Вместе с ней меняются длина строки, разделитель в дате, символ валюты и его место. Немецкая подпись кнопки длиннее русской на треть, и в вёрстке, размеченной по русскому тексту, она уже не помещается.
Интернационализация готовит, локализация применяет
От того, какое из двух похожих слов вы назовёте, зависит, кому уйдёт баг.
Продукт, где надписи набраны прямо в коде, перевести нельзя в принципе: переводчику некуда положить перевод. Подготовка — надписи в словари, даты и деньги в библиотеки, знающие правила стран — называется интернационализацией (i18n) и делается разработчиками один раз. Локализация (l10n) идёт потом для каждого языка и страны: перевод, форматы, валюта, картинки, письма. Её и проверяет тестировщик.
Ключевое слово — локаль, язык вместе с регионом: у en-US и en-GB расходится дата, у de-DE и de-CH — разделители в числе, поэтому в баг-репорте пишут de-DE, а не «немецкая версия». Отсюда правило адресата: строка не переводится ни на одном языке — незакрытая интернационализация, задача разработчику; переводится, но кривая на конкретном языке — локализация.
Ключ, словарь и три вида непереведённого текста
Прежде чем заводить баг на непереведённый кусок, надо понять, откуда он взялся.
После интернационализации в коде нет надписей — вместо них ключи вроде cart.button.pay, а рядом словари, по одному на язык. Отсюда три симптома, и чинят их разные люди: вместо русского показан английский — перевода для этой локали нет, задача переводчику; на кнопке написан сам ключ — записи нет в словаре, задача разработчику; текст одинаков во всех локалях — строку вшили в код мимо словаря, и это самая частая причина.
Вшитые строки прячутся там, куда редко доходят руки: ошибки с сервера, письма, надписи внутри картинок, чеки. Главный экран переводят первым — значит, искать надо на редких: пустое состояние, ошибка пароля, страница «ничего не найдено».
Склейка из кусков и множественные формы
«Найдено 1 товаров» — не ошибка перевода: оба слова правильные. Фразу собрали из трёх частей — «Найдено », число и « товаров», — а русский язык так не работает.
Форм слова при числе в языках разное количество: в английском две, в русском три (1 товар, 2 товара, 5 товаров), в арабском шесть, в японском и китайском одна на все случаи. Правило сложнее, чем «посмотреть на последнюю цифру»: 11, 12, 13 и 14 требуют «товаров». Поэтому набор чисел для проверки всегда один: 0, 1, 2, 5, 11, 21, 101, 111 — и ноль отдельно, на нём ждём «Ничего не найдено». Библиотека выберет форму сама, если ей дали шаблон «Найдено {count} товара» со всеми вариантами.
Та же склейка ломает род: подставили в шаблон название сущности — получили «Ваш подписка отменён».
Даты, числа и деньги
Запись 03.04.2026 не значит ничего сама по себе — смысл ей придаёт читатель. В России и Германии это 3 апреля, а американец ждёт 04/03/2026 и прочитает первую запись как 4 марта: приложение не соврало, а покупатель приехал не в тот день. Порядок частей меняется от страны к стране — день-месяц-год, месяц-день-год, год-месяц-день в Японии и в технической записи 2026-04-03.
У чисел меняются ролями разделители дробной части и тысяч: 1 299,00 в России, 1.299,00 в Германии, 1,299.00 в США. Запись 1,299 — тысяча с лишним для американца и чуть больше единицы для немца: разница в тысячу раз без предупреждения.
Ошибка в цене самая дорогая. Символ и его место — часть формата: 1 299,00 ₽ стоит после числа через пробел, $1,299.00 — перед и вплотную. Знаков после запятой не всегда два: у иены их ноль, у кувейтского динара три, и округление до двух врёт целым странам. Налог разный: в Евросоюзе цену по закону показывают с НДС в каталоге, в США его добавляют на кассе — «в каталоге 1 299, на кассе 1 411» для американца нормально, для немца нарушение. Сумму сверяют сразу в трёх местах: на экране, в письме и в чеке.
Длина перевода, зеркальная вёрстка и формы
Кнопку нарисовали под «Оплатить» — восемь букв. В Германии то же действие подписывается «Zahlungspflichtig bestellen», двадцать семь: закон требует прямо сказать про обязанность оплатить. Ширина кнопки прежняя, и правая часть подписи вылезла наружу и перестала нажиматься.
Немецкая строка длиннее русской примерно на треть, а коротким подписям хуже всех: запаса нет, и они раздуваются вдвое. Поэтому проверяют самый длинный перевод из существующих, сразу на узком экране и при масштабе 200 %: локализация и доступность ломают вёрстку одинаково. Остальное про вёрстку — в кроссбраузерном и мобильном тестировании.
Арабская и ивритская версии зеркалят разметку целиком — блоки, отступы, порядок колонок, стрелки, — но не числа, телефоны и логотипы; хрупче всего смешанный текст, где в арабской фразе с латинским названием точка уезжает не на ту сторону. А форму заказа ломает страновая привязка полей: шесть цифр индекса против британского SW1A 1AA и его полного отсутствия в ОАЭ, обязательное отчество, которого у европейцев нет. Проверяют это настоящим адресом целевой страны.
Часовые пояса, сортировка и регистр
Заказ оформили 3 апреля в 01:30 по Москве, а в отчёте за 3 апреля его нет. К переводу это отношения не имеет: сервер хранит время в единой шкале UTC, Москва впереди на три часа — значит, 01:30 третьего это 22:30 второго. Поэтому проверяют границу суток, 23:50 и 00:10, а не удобный полдень, и переход на летнее время, который в Европе есть, а в России нет: ночь в 23 или 25 часов ломает расчёт «ровно через сутки». Пояс меняют в панели датчиков DevTools и повторяют сценарий.
Сортировка ломается так же, без единой ошибки в переводе: компьютер сравнивает буквы по номерам в таблице символов, а не по алфавиту, «ё» стоит после «я» — и «Ёлкин» уезжает в конец списка, после «Яковлевой». Правильный порядок задаёт язык: немецкое ä идёт рядом с a, шведское — после z. Регистр — ловушка того же рода: в турецком заглавная от i это İ, и код, приводящий введённое к верхнему регистру перед сравнением, превращает id в İD. Ломается не надпись, а вход и поиск.
Как проверять язык, которого не знаешь
Качество перевода проверяет носитель языка. Ваша работа — всё остальное, и для неё язык не нужен.
Самый сильный приём — псевдолокализация: «язык», в котором текст не переводят, а портят по правилам — буквы заменяют на похожие с диакритикой, строку удлиняют примерно на треть и обрамляют скобками: [!!! Оплатить заказ !!!]. Дальше просто: что осталось обычными буквами без скобок — вшито в код, что обрезалось или вылезло — не переживёт немецкий.
Второй приём — словарь ключей: в файле перевода видны пустые значения и строки, где потерялась подстановка {count}, то есть число не покажется вовсе.
Порядок проверки задаёт цена ошибки: деньги, даты решений, главные кнопки, формы ввода, письма и чеки. В баг-репорте локаль пишут точно: «в de-DE подпись кнопки оплаты шире контейнера, правая часть не нажимается; в ru-RU той же сборки проблемы нет».
Коротко
- Интернационализацию делают разработчики один раз, локализацию проверяет тестировщик: строка, не переводящаяся нигде, — проблема первой.
- Локаль — язык плюс регион, и в баг-репорте её пишут целиком:
de-DE, а не «немецкая версия». - Английский вместо русского — потерянный перевод, сам ключ — нет записи в словаре, одинаковый текст везде — вшитая строка.
- Форм слова при числе в русском три, в английском две, в арабском шесть; набор чисел — 0, 1, 2, 5, 11, 21, 101, 111.
03.04.2026и04/03/2026— один день; у иены нет копеек, у динара три знака; в ЕС цену показывают с НДС, в США налог добавляют на кассе.- Немецкая строка длиннее русской на треть: проверяют самый длинный перевод на узком экране. Пояса и сортировка врут без единой ошибки в переводе.
Что почитать дальше
- Кроссбраузерное и мобильное тестирование — вёрстка, которая ломается от узкого экрана и масштаба.
- Нефункциональные виды тестирования на практике — соседи локализации: удобство, доступность, совместимость.
- Чек-листы и тестовые данные — как превратить набор локалей, чисел и адресов в список.
- Как писать баг-репорт — чтобы «кривая кнопка в немецкой версии» стала задачей с адресатом.