Превращает строки интерфейса в узнаваемо «чужие», но читаемые: за один прогон видно захардкоженные строки, будущее переполнение и обрезку. Подстановки не трогает. Всё считается в браузере.
Файл локализации никуда не уходит — преобразование идёт в браузере
Всё, что осталось обычным текстом, мимо системы локализации не проходит. Это находит то, чего не найдёт ни поиск по строкам, ни ревью: подписи в сторонних компонентах, тексты ошибок и подсказки, зашитые в код.
Будущее переполнение
Длина
+30 % · +60 %
Текст удлиняется искусственно, и контейнер ломается заранее — до того, как перевод заказан. Тридцать процентов покрывают типичный европейский язык, шестьдесят — тяжёлый случай вроде немецкого.
Обрезка и склейка
Границы
[ … ] ← маркеры
Маркеры начала и конца пропали — значит строку обрезали по длине или собрали конкатенацией из кусков. И то и другое ломается на первом же языке с другим порядком слов.
Проблемы кодировки
Шрифт
Ŝéţţîñĝŝ → ??????
Диакритика отображается прямоугольниками или знаками вопроса — значит шрифт не содержит нужных знаков или где-то потерялась кодировка. На латинице без диакритики этого не видно вовсе.
04
Защищённые конструкции
Формат
Пример
Где встречается
{0}, {1}
Файл {0} из {1}
.NET, Java
{name}, {{count}}
Привет, {name}
i18next, Vue, Handlebars
ICU MessageFormat
{count, plural, one {# файл} other {# файлов}}
Полная поддержка вложенности
%s, %d, %1$s
Найдено %d совпадений
C, PHP, Python
%(name)s
Привет, %(name)s
Python
<b>, <a href=…>
Читайте <a href="/help">справку</a>
Разметка внутри строк
, &
1 299 ₽
HTML-сущности
[[link]]
См. [[Главная]]
Вики-разметка
Разбор устроен токенизацией: строка делится на защищённые и преобразуемые куски до любых замен. Замена по регулярке рано или поздно съедает содержимое подстановки — и файл локализации перестаёт работать.
05
Частые вопросы
Техника, при которой строки интерфейса преобразуются в узнаваемо «чужой», но всё ещё читаемый вид: «Settings» становится «[!!! Ŝéţţîñĝŝ ᐊᐊᐊᐊ !!!]». Одним прогоном проверяется то, что иначе всплывает только после отправки на перевод. Применяется в Microsoft, Chrome и Firefox; в рунете инструмента почти нет.
Прогоните файл локализации через псевдолокализацию и откройте приложение. Всё, что осталось обычным текстом, мимо системы локализации не проходит — значит зашито в код. Способ работает без единой правки в исходниках и находит именно то, что не найдёт ни поиск по строкам, ни ревью: забытые подписи, тексты ошибок и подсказки из библиотек.
Перевод даёт настоящий текст на другом языке и требует переводчика, времени и денег. Псевдолокализация ничего не переводит: она искажает исходный текст механически, чтобы проверить готовность интерфейса к любому переводу. Делается за секунду и до того, как перевод заказан — в этом весь смысл.
Тридцать процентов покрывают типичный европейский перевод, шестьдесят — тяжёлый случай вроде немецкого с составными словами. Начните со среднего уровня: он ловит переполнение кнопок, пунктов меню и заголовков таблиц, то есть самые узкие места интерфейса. Тяжёлый берут, когда интерфейс уже прошёл средний и нужен запас на будущее. Процент здесь задаётся вручную, поэтому можно подобрать под конкретный язык: для финского и венгерского разумно брать больше европейского среднего.
Нет, и это главное требование к нему. Строка разбирается на защищённые и преобразуемые куски до любых замен: `{name}`, `{count, plural, …}`, `%s`, `%1$s`, `<b>`, ` ` и `[[link]]` доходят до результата байт в байт. Замена по регулярке рано или поздно съедает содержимое подстановки — здесь её нет.
Нет. Преобразование выполняется целиком в браузере, обращения к сети не происходит ни при вставке текста, ни при копировании результата. Файл локализации не покидает вкладку — это важнее, чем кажется: в строках интерфейса регулярно попадаются внутренние названия проектов, имена клиентов и подписи ещё не запущенных функций, которые незачем отправлять на чужой сервер ради проверки вёрстки.