Хеш исходника

Память модуля о том, под какой текст сделан перевод. Пока хеш совпадает, перевод считается годным.

На этом держится вся очередь: именно сравнение хешей отвечает на вопрос «изменился ли оригинал с тех пор, как мы это перевели».

Правило, которое нельзя нарушать

Любая правка, меняющая то, как получается хеш, обязана выпускаться вместе с ремонтом.

Правок такого рода две разновидности, и вторая не выглядит опасной — поэтому её и пропускают:

  1. правка самого подсчёта хеша: нормализация, алгоритм;
  2. правка чтения значения, которое в этот хеш попадает.

Как на этом обожглись

В версии 6.13.0 чтение значения переключили с экранированного на сырое. Правка верная и нужная сама по себе. Но тем же чтением кормится подсчёт хеша.

Битрикс при чтении экранированного значения прогоняет его через свою обработку, и неразрывный пробел превращается в сущность. В русской типографике этот знак стоит почти в каждом заголовке.

Результат: все хеши, записанные до 6.13.0, перестали совпадать. Очередь честно доложила «ждёт перевода» по всему каталогу — то есть предложила оплатить повторный перевод того, что уже переведено. На боевом стенде это было 1411 строк состояния из 1655.

Заметить было некому: очередь выглядела работающей.

Как выпускать такую правку

  1. Прежнее правило вынести в отдельный метод и не удалять.
  2. Дописать его в список прежних правил, по которым идёт ремонт. Если правил стало несколько и они независимы — перечислить все сочетания.
  3. Прогнать разведку на копии боевой базы: она покажет, сколько строк затронуто.
  4. Выпускать вместе с ремонтом, а не «потом».

Ремонт устроен так, что ошибиться в опасную сторону не может: чинится только то, чьё расхождение объяснено прежним правилом целиком. Всё прочее остаётся нетронутым, и стереть законную жалобу очереди он не способен по устройству.

Что это значит для вас

Если после обновления модуля очередь вдруг показала на перевод весь каталог — не нажимайте «Перевести накопленное». Сначала разберитесь, почему.

Законный рост очереди после обновления возможен: например, полный пересчёт нашёл испорченные переводы, см. Сверка перевода с оригиналом. А вот «ждёт перевода» ровно по всем элементам разом — это признак разъехавшихся хешей, и лечится он ремонтом, а не оплатой.