Skip to content

Translating Contact Form 7 Forms

On this page

A Contact Form 7 form is not part of the page that shows it. The page only holds a reference to
the form – a shortcode, a block, or a page-builder widget that lets you pick a form – and the form
itself (its labels, placeholders, options, button and messages) is stored separately. That is why
translating a page leaves its form in the original language.

The plugin translates each form once, as its own item. The translated form is then shown in every
place it is embedded, whatever embeds it: the [contact-form-7] shortcode, the block, or a widget
from Elementor, your theme or an add-on.

Translating forms by hand is part of the free version. Translating them automatically with AI
requires PRO.

Turn it on under LATW Multilingual → Settings → Translation → Other objects, with
Contact Form 7: form labels, placeholders, options, buttons and messages (Strings → Contact Form
7)
. The option is shown
only while Contact Form 7 is active, and is on by default.

#Translating a form

Go to LATW Multilingual → Strings and set the Type filter to Contact Form 7. Each form
is one row. Click its name to open it, or click the pencil next to a single language in the
Languages column.

The form is split into short pieces of text, each in its own field:

  • Form text – labels and any other text you wrote around the fields.
  • Placeholder / default text – the quoted text inside a field, for example "Name*" in
    [text* your-name placeholder "Name*"].
  • Option – each choice of a drop-down, checkbox or radio field.
  • Checkbox text – the text of an acceptance checkbox ([acceptance]…[/acceptance]).
  • Button label – the text of the submit button.
  • The messages – “Thank you for your message…”, validation errors and the rest – each labeled
    as in Contact Form 7’s Messages tab.

Leave a field empty and the original is used for that language.

With PRO, tick the forms on the Strings page and use Translate Selected, or the
Translate button on a single row, like any other string.

#What is never changed

Only text is ever translated. The structure of the form is rebuilt from the original each time, so
a translation cannot break it:

  • Field names stay as they are (your-name, terms) – your mail template and any integration
    that reads the submitted data keep working.
  • Field types and options stay as they are (text*, class:…, placeholder, akismet:…).
  • The mail is not translated. You keep receiving submissions in the language the form was
    built in.

A visitor sees and picks the option in their own language, but the mail you receive contains the
original option
. If your form offers Consulenza and Assistenza, a visitor on the English
site picks Consulting, and your mail still says Consulenza. Filters and automations that react
to a particular option keep working in every language.

This uses Contact Form 7’s own “pipes” feature ("Consulting|Consulenza"). If an option in your
form already uses a pipe, the part after | is kept exactly as you wrote it.

#After you edit the form

Every time you save the form in Contact Form 7, the plugin checks which texts changed. On the
Strings page the form then shows as partly translated in each language.

A text you changed is shown in the original language until it is translated again – the old
translation is never shown for the new text. Adding or removing a field has the same effect on the
texts that come after it in the form. Open the form on the Strings page (or translate it again with
AI) to bring the language up to date. Editing a form does not trigger an automatic translation.

#What this does not do

  • One form for all languages. You cannot add a field or an option in one language only. The
    translation covers the text, not the structure.
  • The mail and auto-reply are not translated (see above).
  • Additional Settings of the form are not translated.
  • Only published forms are listed on the Strings page.
  • Texts printed by the page, not by the form – a title or description a theme widget shows
    above the form – belong to the page. For a widget from your theme or an add-on see
    Translating Custom Elementor Widgets.

#Troubleshooting

The form is translated, but after sending it the visitor gets “Undefined value was submitted
through this field”.
The form is sent in the background, and the plugin recognises the
visitor’s language from the address of the page the form was sent from. A security or privacy
plugin that removes that information from requests makes the form arrive in the original language,
so a translated option is not recognised. Check whether such a plugin strips the Referer header.

One label stays in the original language. Open the form on the Strings page. If the field is
empty for that language, it was never translated. If it shows as outdated, you edited that text in
Contact Form 7 after it was translated.

#Developer reference

  • Object type cf7_form, object ID = the form’s post ID, fields form:N (the N-th piece of text
    in the form template, in document order) and messages:<key>.
  • Read layer: the wpcf7_contact_form_properties filter. Only form and messages are replaced.
  • A form:N translation is served only while its stored source hash matches the current text of
    piece N, so an edited form never shows a translation next to the wrong field.
  • Setting key: translate_cf7 in the latwm_ai_settings option.