This article covers building a project that serves customers in more than one language. It explains how you add languages, what each language keeps separately, how the response language is chosen for each conversation, and how voice works across languages.
A multilingual project answers in the languages you designed it for. Real-Time Translation is a different feature: it handles customers who write in a language the project does not support. On a voice project the two cannot be combined, because Real-Time Translation cannot be used alongside Text-to-Speech.
Adding languages
A project has one Primary Language, chosen when you create the project, and optional Additional Languages. See Creating a Project. You can add more languages later under Project Settings > General. The languages you can choose from are listed in Supported Languages.
📝 Note: The primary language cannot be changed after the project is created, and an additional language cannot be removed once added.
What each language keeps separately
| Item | Per language |
|---|---|
| Virtual agent | Each project language gets its own virtual agent. |
| System messages | Prompts > System Messages has one tab per project language. Write each language's messages on its own tab. |
| Survey flow | One survey flow per language. |
| Confirmation phrases | Kept per language. See Confirmation Phrases. |
How the response language is chosen
The system variable ResponseLanguage holds the language the project responds in. It starts each conversation as undefined, and while it is undefined the primary language is used.
| Situation | ResponseLanguage |
|---|---|
The incoming message's locale exactly matches a project language code, at the start of the conversation or on a later message while no Virtual Agent node is running |
Becomes that language |
locale is missing, or does not exactly match a project language |
Stays as it was |
| A Virtual Agent node is handling the conversation | Becomes that virtual agent's language |
Sending locale
To set the language from the first message, put locale on the activity sent to the project. The value must exactly match one of the project's language codes, such as en-US. A language the project does not have, or a code in a different form, leaves ResponseLanguage unchanged.
{ "text": "hello", "type": "message", "channelId": "TestChat", "conversation": { "id": "0123456" }, "locale": "en-US", "attachments": [], "channelData": { "ResponseType": "Text", "CustomActionData": null, "IsSynchronizer": false, "HasExternalAudioContent": false, "SrConfidence": null, "CustomProperties": {}, "EndUser": { "Name": null, "Phone": null, "Email": null, "Twitter": null } } }
Voice: one Text-to-Speech service per language
Every Text-to-Speech (TTS) integration has a required Language. A project can have several TTS integrations attached, but not two with the same language.
For each response, the TTS integration whose language matches ResponseLanguage speaks it. While ResponseLanguage is undefined, the primary-language integration is used. A TTS integration's language cannot be changed once it is attached to a project.
⚠️ Warning: If
ResponseLanguageis a language with no Text-to-Speech integration attached, responses in that language are sent without audio, so a voice caller hears nothing. Attach a TTS integration for every project language used on voice.
Not every provider can speak every language. Supported Languages lists the gaps for each TTS provider. For Microsoft, see Microsoft's language list.
📝 Note: A project's Speech Recognition integration must be in the project's primary language, so a project has one. To recognise several languages, that integration can use a multilingual model. See Supported Languages.
Branching by language: the Language Condition node
The Language Condition node sends the conversation down a different path for each language. You find it in the palette under Logical Operations. It appears only when the project has more than one language. It is available in main flows and subflows, and not in intent actions, SR fallback flows, surveys, post session flows or AI agent tool flows.
The node routes on ResponseLanguage:
- It has one output per project language, plus else for anything else, including
undefined. - Every output must be connected before you can publish the project.
- For Azerbaijani, Malay, Tagalog, Thai, Kiswahili and Indonesian, the output shows the language code instead of the language name.
Example: greet French customers in French
The project's primary language is en-US, and fr-FR is an additional language. The French version of your website sends "locale": "fr-FR" with the first message.
ResponseLanguagebecomesfr-FR.- A Language Condition node at the start of the main flow takes its French output, which leads to a French greeting.
- A customer whose messages carry no matching
localekeepsResponseLanguageatundefined, so they take else.
💡 Tip: Connect else to your primary-language path. It catches every conversation whose language was never set, and those conversations are already answered in the primary language.

