docs/platform/workflow/advanced-features/translations.mdx
Novu supports multi-language translations for workflows, allowing notifications to dynamically adapt to each of your subscriber's preferred language. You can enable, configure, and manage translations across your notification workflows from the Novu dashboard.
<Note> The translations feature is in `beta` and available on `Team` and `Enterprise` [plans](https://novu.co/pricing). </Note>Each workflow can support multiple locales. Novu automatically selects the correct translation based on the subscriber’s locale.
<Warning> Novu currently supports locale codes in `language_REGION` format only, for example, `en_US`, `fr_FR`. Language-only locale codes such as `en` are not supported. </Warning>Benefits:
Manage translations from the translation page in the Novu dashboard. Set a default language and add target languages as needed.
To use translations for a workflow, you need to enable them on the workflow level.
en_US or en_GBfr_FR, es_ES, ja_JPYou can configure the default and targeted locales on the translation page.
<video autoPlay loop muted playsInline src="/images/platform/workflow/translations/translations-default-and-target-locale.mp4" />A translation group contains all language variants for a workflow identified by a unique workflow ID.
You can:
en_USEach locale supports JSON-based translation files. For example, the en_US.json file contains the default translations for the workflow. You can update the translation JSON files using the JSON editor on the translation page.
{
"in-app": {
"title": "Welcome to Novu!",
"message": "Hi {{subscriber.firstName}}, let's get started!"
},
"email": {
"subject": "Get Started",
"body": "Thank you for joining us, {{subscriber.fullName}}"
}
}
You can update translations by editing the JSON files in the editor on the translations page or by exporting and re-uploading them.
<video autoPlay loop muted playsInline src="/images/platform/workflow/translations/translations_locale_content_edit.mp4" />If you prefer to create/update translations in a JSON file outside the Novu dashboard, you can do so by exporting and importing them.
en_US, now click on the Import translation(s) button to upload the translation JSON file.
Translation changes in default locale such as en_US will mark other locales as Outdated, needs update
Master JSON file is a JSON file that contains the default locale's translations keys of all the workflows where translations are enabled. You can import or export this file from the translations page. Below is an example of a master JSON file:
{
"workflows": {
"events-publish": {
"key": "value"
},
"events-update": {
"subject": "A new update",
"content": "{{payload.eventName}} event has been updated"
}
}
}
In Email or In-App editors, use {{t.key}} to insert a translatable string. If the key already exists for the locale, it appears in the suggestions list.
Clicking Add to Translations automatically adds a new key to default locale.
Example:
{{t.subject}} → "Let's get you started"
{{t.product.details.description}}
Use the Preview Context to:
fr_FR or ru_RUAny edit to the default locale will invalidate others. You’ll see a warning: Outdated, needs update. Re-export the default, update translated files, and re-upload.
A translation group can be disabled by clicking on the three dots and selecting Disable & delete translations. This action is irreversible and removes all associated translation data.
Translations feature in layouts works the same as in email steps. You can use {{t.key}} to insert a translatable string. If the key already exists for the locale, it appears in the suggestions list. To use translations in layouts, you need to enable translations in the layout settings. Checkout the below example video on how to use translations in layouts.
The Novu CLI can download translation files from Novu Cloud to your machine, or upload local JSON files back to your workspace. This is useful for version control, bulk edits, and CI workflows.
Use npx novu (or a globally installed novu binary) with your Novu secret key and API URL to pull or push translations.
novu translations pull downloads all translation files from Novu Cloud into a local directory (default: ./translations).
# Pull to the default directory (./translations)
npx novu translations pull -s YOUR_SECRET_KEY
# Pull to a custom directory
npx novu translations pull -s YOUR_SECRET_KEY -d ./my-translations
# Use the EU API endpoint
npx novu translations pull -s YOUR_SECRET_KEY -a https://eu.api.novu.co
| Option | Description |
|---|---|
-s, --secret-key <key> | Your Novu secret key (required unless set via env) |
-a, --api-url <url> | Novu API base URL (default: https://api.novu.co) |
-d, --directory <path> | Output directory (default: ./translations) |
novu translations push uploads translation JSON files from a local directory to Novu Cloud (default directory: ./translations).
# Push from the default directory (./translations)
npx novu translations push -s YOUR_SECRET_KEY
# Push from a custom directory
npx novu translations push -s YOUR_SECRET_KEY -d ./my-translations
# Use the EU API endpoint
npx novu translations push -s YOUR_SECRET_KEY -a https://eu.api.novu.co
| Option | Description |
|---|---|
-s, --secret-key <key> | Your Novu secret key (required unless set via env) |
-a, --api-url <url> | Novu API base URL (default: https://api.novu.co) |
-d, --directory <path> | Directory containing locale JSON files (default: ./translations) |
Files should use locale codes in the language_REGION form and contain valid JSON, for example:
translations/
├── en_US.json
├── fr_FR.json
├── es_ES.json
└── de_DE.json
Example content:
{
"workflows": {
"welcome": {
"subject": "Welcome to our platform!",
"body": "Thank you for joining us."
}
}
}
This matches the same language_REGION.json naming rules used when importing via the dashboard.
You can avoid repeating flags by setting:
export NOVU_SECRET_KEY="your_secret_key_here"
export NOVU_API_URL="https://api.novu.co" # or https://eu.api.novu.co for EU
npx novu translations pull
npx novu translations push
jq) before pushing.language_REGION format before sending them to Novu.