Forms in two languages
One form can speak French and English. People get it in their language, every answer lands in the same place, and your reports don’t split in two.
How it works
Your form has a default language, with its text in place. The other language is a set of translated
strings saved with your draft and published with it. Each choice keeps one stored value, whatever
language someone reads it in, so sales stays sales whether they saw “Ventes” or “Sales”.
Two languages are included on every plan. French and English are available now.
What visitors get
On a hosted page, in a script embed and on a custom domain:
- The right language first. The page uses the address, such as
?locale=en-CA, then what the person chose before, then their browser’s language, then your default. - A language switch at the top of the form, in your form’s own colours, with each language named
in itself. You can hide it with
languageSwitch. - What they typed stays when they switch, on any step. Passwords never carry over.
- Status pages too. A closed or not-yet-open form says so in their language.
- Messages in their language, with your own messages translated and ours built in.
Add a language
Translating in the builder is on its way. For now, send your strings with the form’s definition through the API. See Translations for every string you can translate.
{
"settings": {
"behavior": { "language": "fr-CA", "languages": ["en-CA"] }
},
"translations": {
"en-CA": {
"strings": {
"form.label": "Contact us",
"fields.topic.label": "Department",
"fields.topic.choices.sales": "Sales"
}
}
}
}Turning a language on takes all its strings. A missing one is refused with FORM_LANGUAGE_INCOMPLETE, unless you ask for it with allowIncompleteLanguages. After that, the
language stays on. If you add a question later, it shows in your default language until you
translate it, and publishing tells you how many strings are missing.
A translation only holds text. It can’t change a question’s type, a rule or a choice’s value.
Choices
Each choice has a stored value and the words people read. Changing the words never changes the value, so conditions, delivery rules and past answers keep working. The builder shows the value in small text under each choice.
What you see
- Your notification stays in your default language, with the choice’s words, and a line saying which language the person used.
- The app and CSV show each choice’s words and the language. Check Stored values when you export to get the values instead.
- The confirmation email goes out in the person’s language. See Confirmation emails.
In an email template, {{fields.topic}} is the words, and {{raw.fields.topic}} is the stored value.
On your own form, in code
If your site has its own translations, keep them. Use your own labels with the stored values, and send the person’s language with each request, so the messages and the confirmation match:
{ "fields": { "email": "lea@example.com" }, "metadata": { "locale": "fr-CA" } }Formerie’s built-in messages come back in that language even when the form itself doesn’t offer it.
Codes never change, so your code can keep matching on them. GET .../schema?locale=fr-CA returns the
form in one language, with languages listing what’s offered.
Not available yet
- Translating in the builder.
- A
localeoption in the JavaScript SDK’s components. Until then, a form drawn by the SDK from its schema uses one form per language, ormetadata.localefor messages. - Languages other than French and English.