Localization is available as an add-on to our Growth / Enterprise plans. The main Help page on this topic may be more helpful for a typical workflow.
Workflow overview
- Download a translation file for your Experiences (or export from the Experience list).
- Translate the content into your target languages using your preferred translation tool or service.
- Rename the file to include the language code (e.g.,
translation-es.yaml,translation-fr.json). - Upload the translated file(s) via the API or from the Localization page.
- Publish the Experiences to make translations live.
Supported file formats
| Format | Extension | Best for |
|---|---|---|
| YAML | .yaml | Human-readable, easy to edit manually |
| JSON | .json | Machine-readable, easy to process programmatically |
How language targeting works
Chameleon determines the user’s language from thebrowser_l property (the browser’s Accept-Language header). The language.options array in the translation file shows all configured language codes for your account.
"default"is always the primary language (your original Experience content).- Language codes follow BCP 47 format (e.g.,
"es","fr","pt-BR").
Merge tags in translations
Translations fully support Handlebars merge tags. You can use merge tags in your translated content:Downloading Translation files
HTTP Request
| param | - | description | |
|---|---|---|---|
kind | string | optional | One of tour, survey, launcher, tooltip |
id | ID | optional | The ID of a Chameleon Experience |
format | string | required | One of yaml, json |
experiences | array<Object> | optional | Each member of this array has two keys kind and id examples |
experiences.$.kind | string | optional | One of tour, survey, launcher, tooltip |
experiences.$.id | string | optional | The ID of a Chameleon Experience |
HTTP Response
Downloading into .yaml
GET
Downloading into .json
GET
Example with mixed Experiences
POST
Request body
Uploading Translation files
Upload one or more translated files. Each file should be a renamed copy of the downloaded translation file with translated text values. Important: Thelanguage.code in the uploaded file must be changed to the target language code (e.g., "es", "fr"). If it remains "default", it will overwrite your primary language content.
HTTP Request
POST
| param | - | description | |
|---|---|---|---|
file | File | optional | A single file to process for translations |
files | array<File> | optional | Multiple files to process for translations |
Example: Translating a Tour to Spanish
Step 1: Download the translation file:language.code from "default" to "es":
Uploading multiple files at once
Upload translations for several languages in a single request:Translation file structure
The translation file contains a nested structure:| Level | Key | Description |
|---|---|---|
| Root | id | The translation set ID |
| Root | language.code | The language code ("default" for primary, or a BCP 47 code) |
| Root | language.options | All available language codes for the account |
| Root | experiences | Array of Experiences and their translatable content |
| Experience | id | The Experience ID |
| Experience | name | The Experience name (for reference only, not translated) |
| Experience | steps | Array of Steps with translatable fields |
| Step | id | The Step ID |
| Step | translations | Object containing translatable fields (title, body, dismiss_text, button text) |
Only thetextvalues withintranslationsshould be changed. Do not modifyidfields or the structure of the file.

