> For the complete documentation index, see [llms.txt](https://help.usejimo.com/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.usejimo.com/docs/build/multiple-languages.md).

# Multiple Languages

How Jimo shows an experience in each user's language, how smart translate works, and what happens when a translation is missing or out of date.

One experience can carry several languages: each user sees the copy in their language, and everyone else sees the base copy. You write the base copy once, then translate it with smart translate or by hand.

## How Jimo picks the language

An experience has a **base copy**, the language you wrote it in, plus any number of translations.

#### Browser language by default

Jimo shows the translation that matches the user's browser language. If the experience has no translation in that language, the user sees the base copy.

#### Forcing the language from your app

{% hint style="warning" icon="user-gear" %}

### What if my app stores the language in the user data?

Some apps store the user's language in the user profile (a `locale` or `preferred_language` field in your backend, for example) rather than relying on the browser language. In that case, push that value to Jimo so translations follow the user's preference whatever the browser settings.

The recommended setup is to **push the language code with the SDK**, with the [force language](/docs/for-developers/for-developers/sdk-methods.md#force-language) method. Pass the [language code](#languages-available) (`fr`, `en`, `pt`, for example) from your user data at init, or whenever the user changes language.

1. Read the user's language preference from your user data or app state.
2. Pass the matching language code to the SDK (see the [full list](#languages-available)).
3. Jimo then shows the matching translation in every experience the user sees, and ignores the browser language.

This is useful when your product lets users pick their interface language independently from their browser, or when translations must follow the user across devices.
{% endhint %}

#### Languages available

You can translate into 34 languages. Pass the code below to the SDK when you force a language.

<details>

<summary>See the 34 languages</summary>

| Flag | Language              | Code      |
| :--: | --------------------- | --------- |
| 🇦🇱 | Albanian              | `sq`      |
| 🇸🇦 | Arabic                | `ar`      |
| 🇧🇬 | Bulgarian             | `bg`      |
| 🇨🇳 | Chinese (Simplified)  | `zh`      |
| 🇹🇼 | Chinese (Traditional) | `zh-hant` |
| 🇨🇿 | Czech                 | `cs`      |
| 🇩🇰 | Danish                | `da`      |
| 🇳🇱 | Dutch                 | `nl`      |
| 🇬🇧 | English               | `en`      |
| 🇫🇮 | Finnish               | `fi`      |
| 🇫🇷 | French                | `fr`      |
| 🇩🇪 | German                | `de`      |
| 🇬🇷 | Greek                 | `el`      |
| 🇮🇱 | Hebrew                | `he`      |
| 🇭🇺 | Hungarian             | `hu`      |
| 🇮🇩 | Indonesian            | `id`      |
| 🇮🇹 | Italian               | `it`      |
| 🇯🇵 | Japanese              | `ja`      |
| 🇱🇦 | Laotian               | `lo`      |
| 🇳🇴 | Norwegian             | `no`      |
| 🇳🇴 | Norwegian Bokmål      | `nb`      |
| 🇳🇴 | Norwegian Nynorsk     | `nn`      |
| 🇵🇱 | Polish                | `pl`      |
| 🇵🇹 | Portuguese            | `pt`      |
| 🇷🇴 | Romanian              | `ro`      |
| 🇷🇺 | Russian               | `ru`      |
| 🇷🇸 | Serbian               | `sr`      |
| 🇸🇰 | Slovak                | `sk`      |
| 🇪🇸 | Spanish               | `es`      |
| 🇸🇪 | Swedish               | `sv`      |
| 🇹🇭 | Thai                  | `th`      |
| 🇹🇷 | Turkish               | `tr`      |
| 🇺🇦 | Ukrainian             | `uk`      |
| 🇻🇳 | Vietnamese            | `vi`      |

</details>

If you need another language, contact Jimo support.

## Translate an experience

<figure><img src="https://2794860263-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKzAcDWQbK1gKbpra7bkb%2Fuploads%2FvtDiqhcPoa3hU0q8hgEJ%2FC-03-translation-flow.png?alt=media" alt="Smart translate turns the base copy into French and German and keeps the formatting. When the base copy is edited or a step is added, the translations stay unchanged with no warning. Two ways back: overwrite all, which loses manual fixes, or fill missing, where edited sentences stay out of date."><figcaption></figcaption></figure>

### Add a language

In the builder, click the **Translation** icon in the side menu: the panel lists the content of every step. Click **Add a language** and pick the languages you need, then write each one by hand or fill it with **Smart translate**.

<figure><img src="https://2794860263-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKzAcDWQbK1gKbpra7bkb%2Fuploads%2FRe33nWaGDu03dDOlPdfO%2FC-s09-builder-translation-panel.png?alt=media&amp;token=0a0735c6-c37c-4a9b-acfd-0e9122d0065a" alt="Translation panel of a tour on the French tab, with four markers: A on Smart translate, B on the Default, German and French tabs, C on Add a language, D on the translated title field, next to the French step in the canvas"><figcaption></figcaption></figure>

* **A (Smart translate)**: generates the translations from your base copy with AI, for every step and every block. Quick to produce every language at once.
* **B (Language tabs)**: **Default** is your base copy, each other tab is a language. Pick the one you work on; the trash icon next to a language removes it.
* **C (Add a language)**: adds a language to the experience.
* **D (Translation editor)**: every translated field of every step (title, paragraph, labels, buttons). The canvas shows the step in the language you picked, so you see exactly where each text appears and can adapt it to the language.

### Smart translate

Smart translate writes a language for every step and every block of the experience in one go, and keeps the formatting (bold, italic, links). It works on every experience type (tours, modals, surveys, banners, hints, checklists, Resource Centers, posts), draft or published. On a published experience, new translations reach your users within minutes.

### Fix a wording by hand

In the **Translation** tab, pick the language and edit any field. Your fix only changes that field, in that language.

## When translations go out of date

This is the part that surprises most teams.

#### Editing the base copy does not update translations

When you change the base copy, every translation keeps its old wording, and nothing flags it as outdated. A French user keeps reading the previous sentence until you translate again.

#### Adding a step or a block leaves gaps

A step or block added after the translation has no copy in the other languages yet. Users of those languages see the base copy for those fields only, and the translated copy everywhere else: the experience mixes two languages until you fill the gap.

#### Two ways to catch up

Translate the language again. From an AI assistant, smart translate offers two ways to do it:

| You changed               | Use                           | What it does                                                  | What you lose                                  |
| ------------------------- | ----------------------------- | ------------------------------------------------------------- | ---------------------------------------------- |
| Added steps or blocks     | Translate missing fields only | Translates the empty fields, keeps every existing translation | Nothing, but edited sentences stay out of date |
| Edited existing sentences | Translate again and overwrite | Regenerates every field of that language                      | Your manual fixes in that language             |

The order that keeps the most work: **finish the base copy, translate, then fix wordings by hand.** Every later edit to the base copy means translating again.

{% hint style="warning" %}
After every edit to the base copy of a translated experience, go through each language before you publish the change.
{% endhint %}

## Edge cases

#### A language slug in the URL

{% hint style="success" icon="file-brackets-curly" %}

### What if my website uses a language slug in the URL?

Some websites carry the language in the URL (`yoursite.com/fr/pricing` and `yoursite.com/en/pricing`, for example) rather than relying on the browser language. The built-in translation may not be the best fit there: the browser language does not tell you which page the user is on.

The recommended workaround is to **duplicate the experience per language** and set **Where** on each copy, so each version shows only on its URL pattern.

1. Build your experience in the default language.
2. Duplicate it once per language you need.
3. Translate the content of each copy.
4. On each copy, set **Where** to the matching URL pattern (`/fr/*` for the French version, `/en/*` for the English one).

See [Where](/docs/publish/target-specific-urls-domains-where.md) for the full URL targeting setup.
{% endhint %}

#### Elements whose text changes with the language

A step pinned to an element by its text only matches in one language. Pin it with a stable CSS selector instead. See [Targeting on dynamic apps](/docs/build/positioning/targeting-on-dynamic-apps.md#element-text).

## From your assistant

With the [Jimo MCP](/docs/integrations/mcp.md) connected, an AI assistant can translate, fix and check languages:

> Translate the tour "Onboarding" into French and German, then show me the French copy step by step.

Asked without languages, the assistant first proposes the ones your project already uses. Translating costs one unit per language written. It can fix a plain-text title, body or button label in one language; a field with formatting is kept for the builder, so the formatting is not lost. More prompts in [What to ask](/docs/integrations/mcp/what-to-ask.md).

## Verify

Set your browser to one of the translated languages (or force the language with the SDK) and open the experience in [Preview](/docs/build/preview.md). Every step should be in that language. A sentence in the base language means a field was added or edited after the translation.

## Go further

* [Where](/docs/publish/target-specific-urls-domains-where.md): one experience per language when your URLs carry the language.
* [Targeting on dynamic apps](/docs/build/positioning/targeting-on-dynamic-apps.md): selectors that survive a translated interface.
* [Jimo MCP](/docs/integrations/mcp.md): translations from an AI assistant.

**Next page:** [Positioning](/docs/build/positioning.md)
