Если мультиязычная форма отправляет неправильный текст, сравните видимую подпись и значение, реально ушедшее в запросе. Для выбора услуги передавайте стабильный код, а не переведённое название. Язык заявки фиксируйте в момент отправки: изменение 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 и потерять его из запроса. Другая — два поля с одним именем, когда обработчик выбирает неожиданное значение. Просмотрите фактический набор ключей в тестовом запросе. Не выгружайте в общедоступный журнал имя, телефон, сообщение и токены вместе с диагностикой языка.

Смена языка внутри незавершённой формы

  1. Открыть форму на первом языке и выбрать тестовую услугу.
  2. Сменить язык без отправки.
  3. Убедиться, что подпись обновилась, а код услуги не изменился.
  4. Отправить через тестовый обработчик и сравнить form_locale с экраном.
  5. Получить принятую запись и проверить исходный комментарий.

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

Язык страницы и язык заявки — не одно поле

W3C объясняет, что атрибут lang обозначает язык содержимого и помогает, в частности, средствам озвучивания. Это не механизм выбора шаблона CRM и не значение заявки само по себе. Источник сверён 11 октября 2026 года. Связывание языка интерфейса с контрактом отправки реализуется в вашем приложении.

Для менеджера можно хранить код услуги, исходный комментарий и язык формы. Если нужен текст на языке менеджера, создавайте отдельное представление по коду, не заменяя исходные данные. У автоматического перевода должен быть собственный статус и возможность увидеть оригинал; это особенно важно для неоднозначных описаний проблемы.

  • При прямом открытии языковой страницы форма получает нужный язык.
  • После ошибки проверки введённый текст не исчезает.
  • Неизвестный код не превращается в первую услугу списка.
  • Повторная обработка заявки не перечитывает текущую cookie пользователя.

Перед доработкой пришлите разработчику два обезличенных тестовых запроса и таблицу соответствия кодов услуг. Такой материал точнее скриншота «форма на английском»: он показывает, где именно смешались перевод подписи, значение поля и язык принятой записи.

Проверенные источники