Блог, который проверяет собственные переводы
В этом блоге 64 записи на одиннадцати языках: 704 строки и около 2,2 миллиона знаков. Ни одна запись не пропущена ни в одном языке — утверждение, которое что-то значит, только если что-то его обеспечивает.
Кое-что обеспечивает. Прежде чем переведённая строка будет записана, её сверяют с английским оригиналом, и строка, которая не проходит, не записывается вовсе — о ней сообщают и оставляют человеку.
Для чего нужна каждая проверка
Те же цели ссылок. Внутренний путь не должен меняться при переводе: /privacy остаётся /privacy на любом языке, а языковая приставка добавляется только при выводе. Переводчик — человек или нет — который услужливо переведёт путь, получит ссылку, ведущую в никуда.
Те же подстановки. Некоторые записи несут числа, которые подставляются при сборке страницы, чтобы не устареть. Перевод, потерявший одну из них, теряет число; тот, что выдумает лишнюю, ставит фигурную скобку посреди предложения.
То же число на каждый тег. Не просто сбалансированные теги — столько же, сколько в английском. Это та проверка, которая заслуживает своё место: потерянная строка таблицы, проглоченный пункт списка или пропавшая схема невидимы для любой другой проверки, потому что итог остаётся правильным HTML и читается безупречно.
Длина внутри полосы. От половины до двух с половиной раз английского. Языки действительно разной длины, поэтому полоса широкая; ловит она перевод, который оборвался на полпути.
Что она поймала и что поймала зря
Настоящая находка: французский перевод пришёл с четырьмя выделенными словами там, где в английском было три, потому что отрицание разметили двумя кусками. Ничто не выглядело неправильным. Число выглядело.
Две ложные тревоги, обе в один день, обе поучительные.
Первая: одна запись цитирует строку CSS, а CSS кончается на }}. Проверка скобок считала каждое {{ и каждое }}, поэтому любой перевод этой записи проваливался, хотя ничего сломано не было. }} без {{ не может быть разорванной подстановкой — подстановки начинаются с {{ — поэтому теперь считается только открывающая сторона.
Вторая: у <rect/> и <path/> нет закрывающего тега, поэтому проверка баланса вечно объявляет их несбалансированными. Пустые элементы теперь считаются, а не балансируются.
Обе стоили круга работы, и обе были проверкой, которая слишком строга, а не слишком слаба. Это лучшее направление, в котором можно ошибиться, но оно не бесплатно: проверку, которая кричит зря, ослабляет тот, кто спешит, и тогда её нет, когда она нужна.
Испытание, которое было важнее всего
Когда записи получили схемы, проверку тегов расширили, чтобы она их охватывала. Вместо того чтобы этому довериться, проверку проверили: из одного перевода нарочно удалили схему и запустили импортёр.
Он сообщил ровно о том, чего не хватало — о схеме, её десяти подписях, четырёх прямоугольниках, семи контурах — и отказался записывать строку. Схему вернули, и проверка снова прошла.
Это заняло две минуты. Проверка, которую ты никогда не видел проваленной, — это проверка, которую ты предполагаешь, а предполагать — ровно то, чего всё это существует, чтобы избежать.