Skip to main content
A multi-language survey is one survey with one set of questions, logic and results, carrying a translation for every language you support. You do not duplicate the survey per language, and you do not split your results across several summaries. How a respondent ends up in a given language depends on the survey type: That difference is deliberate: a link is a public URL that must always render something, while an app survey is targeted at a known user, and showing them a survey in a language they did not ask for is worse than not showing it at all. See App and website surveys for the full rule.

Add languages to your workspace

Languages live on the workspace, so every survey in it can use the same list.
1

Open the Survey Languages settings

Go to your workspace settings and open Survey Languages:Survey Languages settings in the workspace
2

Add a language

Click Edit languages, then Add language, and pick the language from the dropdown. The Identifier is filled in for you — it is the language’s BCP-47 tag, such as de-DE or ar-EG.Adding a language to the workspaceOptionally set an Alias: an alternate name you can use instead of the identifier in link survey URLs and in the SDK. It is worth setting when your app already works in tags of its own, such as en_us. A bare two-letter code like de is rejected — it names a language of its own in the picker, so allowing it as another language’s alias would make the two ambiguous. Click Save changes when you are done.
The language itself and its identifier are fixed once the language is created — only the alias stays editable. A language that is still used by a survey cannot be removed; Formbricks lists the surveys that hold it so you can remove it there first.

Activate translations for a survey

1

Open the Language tab

Open the survey editor and switch to the Language tab.
2

Turn on Activate translations

Enable Activate translations and pick the survey’s default language. The default language is the one your existing content is already written in.The Language tab of the survey editor
Choosing the default language is a one-way decision. To change it later you have to switch Activate translations off, which deletes every translation on the survey.
3

Make languages visible

Every workspace language shows up as a row with its Code, a Translated progress bar, and a Visible toggle. Turn Visible on for each language respondents should be able to answer in.A visible language must carry a translation for every required field before the survey can be published, and before further changes to an already-published survey can be saved. A draft saves either way, so you can stop mid-translation and come back. If a live survey blocks you, switch the unfinished language back to invisible — the translations you already entered are kept.
The Translated bar counts every translatable string on the survey — headlines, descriptions, choices, placeholders, button labels and ending cards. While a visible language is incomplete, the Language tab carries an amber warning icon so you can see it from any other tab.

Translate your survey content

Once a language is switched on, click its row — or ⋮ → Manage translations — to open the translations editor for that language. It lists every translatable string side by side: the default language on the left, the target language on the right. The Manage translations modal with the Translate with AI button

Translate with AI

Translate with AI fills in every empty field for the language you have open, in one pass — headlines, descriptions, choices, button labels and all. Strings you have already translated are left untouched, so you can run it again after adding a question and it will only fill the gap.
1

Open the language you want to fill

Open Manage translations for that language. The button is active as long as there is at least one empty field left to fill.
2

Click Translate with AI

The translations appear in the right-hand column, formatting and rich text included.
3

Review, then save

Read the result before you keep it — tone and product terms are the two things worth a second look — edit anything you want to change, and click Save. That hands the translations back to the editor; they are only stored once you save or publish the survey itself.
Translate with AI is an Enterprise feature. It needs Smart functionality (AI) enabled for your organization and a configured AI instance — see AI Features. Without it, the button is disabled and its tooltip says which of the two is missing.

Translate by hand

Type your translations straight into the right-hand column of the same editor. Two things help on a long survey:
  • Missing first re-sorts the list so untranslated strings come first. Show in order puts it back into survey order.
  • The ID column tells you where a string lives — 1.1 is the first element of the first block, W is the welcome card — so you can find it again in the editor.

Let respondents switch language

Turn on Show language switch in the Language tab to put a language picker in the survey itself, on every card, so respondents can change language at any point instead of only at the start. It needs at least two visible languages. The language switch in a running survey Languages are listed by their own name — Deutsch, العربية — rather than translated into the current language, so a respondent can find their own language even if they cannot read the one on screen.
A link survey renders in whatever language the lang URL parameter asks for:
You do not have to build that URL by hand. Open Share survey and use the language picker next to the survey URL — Formbricks appends the parameter for you, so you can copy one link per language: Choosing a language for the survey link in the share modal lang accepts the language’s identifier (de-DE) or its alias, and matching is case-insensitive. Formbricks resolves it in a fixed order: an exact identifier first, then an alias, then a canonical match. That last pass is what makes a shortened or legacy code work — ?lang=de reaches de-DE, and an old ?lang=pt link still reaches a language since stored as pt-BR. Without a lang parameter — or with one that names a language the survey does not have, or one that is not visible — the survey opens in its default language.
In Share survey → Link settings you can also set the link preview title and description per language, so a survey shared in a German-speaking channel previews in German. The preview image is one image for the whole survey — it is not per-language.

App and website surveys

For app and website surveys, the language comes from the user’s language attribute, which you set through the SDK:
Call setLanguage() whenever your app’s language changes — for example right after the user switches it in your own settings — and Formbricks will use the new value for every survey it shows from then on. setLanguage() accepts a language’s identifier or its alias, case-insensitively. Unlike the lang URL parameter, it does not fall back to a canonical match — see the note below.

What happens when a translation is missing

For a survey with more than one language, Formbricks resolves the user’s language attribute like this: The last row is deliberate: a targeted survey is skipped rather than shown in a language the user did not ask for. A survey with only one language, or with translations switched off entirely, is exempt — it ignores the language attribute and is shown to a matching user whatever their language is set to.
The value you pass has to match a language’s identifier or its alias exactly — Formbricks does not widen a bare code to a region-tagged one here, the way the lang parameter does. With a survey language stored as ar-EG, setLanguage("ar") matches nothing and the survey is skipped, while ?lang=ar on a link survey still resolves. Pass the identifier exactly as Survey Languages shows it; a bare code cannot be papered over with an alias, because ar is rejected as one.

Right-to-left languages

Right-to-left languages need no configuration. When the active language is an RTL one — Arabic, Hebrew, Persian or Urdu — the whole survey mirrors itself: text alignment, progress bar, rating scales, button placement and the language switch. A survey rendered in Arabic, right to left

Built-in interface translations

Beyond the content you translate yourself, every survey ships with a set of built-in interface strings that Formbricks localizes automatically — so respondents see them in their own language without any extra work from you. These include:
  • Default navigation and action buttons (Back, Next, Finish)
  • Form validation messages (e.g. “Please fill out this field”, “Please enter a valid email address”)
  • File-upload prompts and states
  • Offline, retry, and “sending responses” notices
  • Attribution and helper labels like “Powered by” and “Required”
These built-in strings are currently provided in 23 languages: Formbricks matches the survey’s active language to the closest available bundle — for example, de-AT and de both use the German bundle, and pt-PT uses pt-BR. Writing script is preserved when matching, so zh-Hant and zh-TW resolve to the Traditional Chinese bundle rather than the Simplified one. If a language has no matching bundle, your translated survey content is still shown as usual, but these built-in interface strings fall back to English.
Don’t see your language? These interface translations live in the open-source @formbricks/surveys package. You can add a new one by contributing a locale file on GitHub.

Analyzing multi-language responses

Every response records the language it was answered in, so you can:
  • Filter responses by Language on the summary and responses pages
  • See the language of a single response on its response card
Choice answers are stored in the language the respondent used, and the summary maps them back to the default-language choice — so one bar per choice, counted across all languages, rather than one bar per language.
Need help? Reach out in Github Discussions