Если мультиязычная форма отправляет неправильный текст, сравните видимую подпись и значение, реально ушедшее в запросе. Для выбора услуги передавайте стабильный код, а не переведённое название. Язык заявки фиксируйте в момент отправки: изменение cookie после этого не должно менять уже принятую запись.
Начните с одной тестовой услуги и двух языков. Пользовательский свободный текст оставляйте в исходном виде; перевод интерфейса не разрешает автоматически переписывать слова клиента. Особенно внимательно проверяйте форму, открытую до переключения языка: её скрытые значения и обработчики могут остаться от предыдущего состояния.
Подпись — для человека, код — для обработки
Условный контракт заявки:
service_code: installation
form_locale: en
form_revision: 12
message: <исходный текст пользователя>
Подпись услуги выбирается по service_code и form_locale.Названия полей условные. Сервер должен принимать известные коды и поддерживаемые языки, а неизвестное значение отклонять или обрабатывать по заранее заданному правилу. Не доверяйте скрытому полю как подтверждению цены, доступа или права на услугу. Код отвечает на вопрос «что выбрано», язык — «на каком интерфейсе оформляли».
| Элемент | На экране | В принятой заявке |
|---|---|---|
| Услуга | Переведённая подпись | Стабильный service_code |
| Язык формы | Текущий интерфейс | Явный form_locale |
| Комментарий | Введённые слова | Исходный текст |
| Ошибка проверки | Локализованное сообщение | Стабильный код ошибки |
Что на самом деле собирает FormData
MDN описывает, что new FormData(form) собирает текущие значения элементов по их name; элементы без имени и отключённые поля в набор не входят. Поэтому изменение видимой подписи не гарантирует изменение отправляемого значения. Документация проверена 11 октября 2026 года. Если приложение вручную собирает JSON, проверьте его сборщик отдельно.
Частая ловушка — временно отключить поле языка перед созданием FormData и потерять его из запроса. Другая — два поля с одним именем, когда обработчик выбирает неожиданное значение. Просмотрите фактический набор ключей в тестовом запросе. Не выгружайте в общедоступный журнал имя, телефон, сообщение и токены вместе с диагностикой языка.
Смена языка внутри незавершённой формы
- Открыть форму на первом языке и выбрать тестовую услугу.
- Сменить язык без отправки.
- Убедиться, что подпись обновилась, а код услуги не изменился.
- Отправить через тестовый обработчик и сравнить form_locale с экраном.
- Получить принятую запись и проверить исходный комментарий.
Решите заранее, что делать с незавершённой формой: сохранять ввод при смене языка или предлагать начать заново. Скрытое стирание текста недопустимо. При сохранении ввода обновите словари ошибок и подписи, но не меняйте выбранную услугу только потому, что порядок вариантов в другом языке отличается. Выбор по индексу списка здесь ненадёжен.
Язык страницы и язык заявки — не одно поле
W3C объясняет, что атрибут lang обозначает язык содержимого и помогает, в частности, средствам озвучивания. Это не механизм выбора шаблона CRM и не значение заявки само по себе. Источник сверён 11 октября 2026 года. Связывание языка интерфейса с контрактом отправки реализуется в вашем приложении.
Для менеджера можно хранить код услуги, исходный комментарий и язык формы. Если нужен текст на языке менеджера, создавайте отдельное представление по коду, не заменяя исходные данные. У автоматического перевода должен быть собственный статус и возможность увидеть оригинал; это особенно важно для неоднозначных описаний проблемы.
- При прямом открытии языковой страницы форма получает нужный язык.
- После ошибки проверки введённый текст не исчезает.
- Неизвестный код не превращается в первую услугу списка.
- Повторная обработка заявки не перечитывает текущую cookie пользователя.
Перед доработкой пришлите разработчику два обезличенных тестовых запроса и таблицу соответствия кодов услуг. Такой материал точнее скриншота «форма на английском»: он показывает, где именно смешались перевод подписи, значение поля и язык принятой записи.