Skip to main content
The feature is only available for Novu Cloud users with Business or Enterprise plans.

Introduction

The Translation Management feature allows you to seamlessly adapt your workflows to different languages and automatically apply them based on your customers’ locales. It enhances engagement, personalizes the user experience, and allows you to expand your market reach. To understand how Translation Management works in Novu we need to review its main pillars:
  • Translation Groups
  • Translation Files
  • Localized Message Content
  • Subscribers locale

Translation Groups

Translation Group allows you to efficiently manage translations for diverse languages with shared business significance. For example, the Branding translation group can hold the content related to your company identity, while the Marketing translation group can exclusively house content related to your marketing campaigns. You aren’t obligated to divide your translation content, you can manage it all within a single translation group. To create the Translation Group navigate to the Translations page from the main navigation and click on the “Add group” button. Before creating your first Translation Group you’ll be prompted to specify the default locale for organization. This locale serves as a fallback option for localized messages in cases where the recipient hasn’t defined a specific locale. After selecting the default language, you can provide the essential details: the group name, group identifier, and select your target languages. The group identifier is an important value that you will later use in the editor to localize your messages. This is a similar concept that we use across the app to identify the main parts. After the group is created, you will land on the group details page on which you can see the list with the empty translations for the languages you choose.

Translations

Translations are JSON files that contain the content of your messages in a specific language. For example, if you created a Marketing translation group with two target languages English and German, then your translation JSON files might look like this: English (en.json):
{
  "welcome_message": "Welcome to our Marketing Campaign!",
  "learn_more": "Learn More",
  "special_offer": "Special Offer",
  "contact_us": "Contact Us"
}
German (de.json):
{
  "welcome_message": "Willkommen bei unserer Marketingkampagne!",
  "learn_more": "Mehr erfahren",
  "special_offer": "Sonderangebot",
  "contact_us": "Kontaktieren Sie uns"
}
To upload your translations click on the “Upload files” button located at the top of the Translation Group details page. Select the translation files and click “Open” button. With each uploaded translation file, you must indicate the language it references. Additionally, you can verify the correctness of the uploaded file by previewing its contents. Click on “Upload files” button. Congratulations you just uploaded the translation files and created the translation group! 🎉

Localized Message Content

To localize your message content, you need to use the translation variables in the editor. The variables allow you to reference the values from the translation files. It consists of the i18n handlebar helper and path to the translated value. Let’s take a look at the example: {{i18n "marketing.welcome_message"}}.
  • i18n is the handlebar helper that tells Novu that you would like to use the Translations
  • "marketing.welcome_message" is the path that is composed of the Translation Group identifier marketing and translation JSON file key welcome_message
i18n variables can be used in subject and preheader fields of the email step.

Subscribers Locale

The subscribers locale defines in which language the message should be delivered to that recipient. When the locale is not specified it will fallback to the default locale set for the organization. The locale format includes ISO language plus the region, for example de_DE language German and region Germany. To update the locale you can use Novu API or any of our SDKs, more information can be found here.
Language NameLocale
English (United States)en_US
Spanish (Spain)es_ES
German (Germany)de_DE
French (France)fr_FR
Chinese Simplifiedzh_CN
Portuguese (Portugal)pt_PT
Russian (Russia)ru_RU
Chinese Traditionalzh_TW
Persian (Afghanistan)fa_AF
Turkmen (Afghanistan)tk_AF
Albanian (Albania)sq_AL
Greek (Albania)el_AL
Arabic (Algeria)ar_DZ
English (American Samoa)en_AS
Samoan (American Samoa)sm_AS
Tongan (American Samoa)to_AS
Catalan (Andorra)ca_AD
Portuguese (Angola)pt_AO
Spanish (Argentina)es_AR
English (Argentina)en_AR
Italian (Argentina)it_AR
German (Argentina)de_AR
French (Argentina)fr_AR
Guaran­i (Argentina)gn_AR
Armenian (Armenia)hy_AM
Dutch (Aruba)nl_AW
Spanish (Aruba)es_AW
English (Aruba)en_AW
English (Australia)en_AU
German (Austria)de_AT
Croatian (Austria)hr_AT
Hungarian (Austria)hu_AT
Slovenian (Austria)sl_AT
Azerbaijani (Azerbaijan)az_AZ
Russian (Azerbaijan)ru_AZ
Armenian (Azerbaijan)hy_AZ
Arabic (Bahrain)ar_BH
English (Bahrain)en_BH
Persian (Bahrain)fa_BH
Urdu (Bahrain)ur_BH
Bengali (Bangladesh)bn_BD
English (Bangladesh)en_BD
English (Barbados)en_BB
Belarusian (Belarus)be_BY
Russian (Belarus)ru_BY
Dutch (Belgium)nl_BE
French (Belgium)fr_BE
German (Belgium)de_BE
English (Belize)en_BZ
Spanish (Belize)es_BZ
French (Benin)fr_BJ
English (Bermuda)en_BM
Portuguese (Bermuda)pt_BM
Dzongkha (Bhutan)dz_BT
Spanish (Bolivia)es_BO
Quechua (Bolivia)qu_BO
Aymara (Bolivia)ay_BO
Dutch (Caribbean Netherlands)nl_BQ
English (Caribbean Netherlands)en_BQ
Serbian (Bosnia and Herzegovina)sr_BA
English (Botswana)en_BW
Portuguese (Brazil)pt_BR
Spanish (Brazil)es_BR
English (Brazil)en_BR
French (Brazil)fr_BR
Malay (Brunei)ms_BN
Bulgarian (Bulgaria)bg_BG
French (Burkina Faso)fr_BF
French (Burundi)fr_BI
Rundi (Burundi)rn_BI
French (Cambodia)fr_KH
English (Cambodia)en_KH
French (Cameroon)fr_CM
English (Canada)en_CA
French (Canada)fr_CA
Inuktitut (Canada)iu_CA
French (Central African Republic)fr_CF
Sango (Central African Republic)sg_CF
Lingala (Central African Republic)ln_CF
Kongo (Central African Republic)kg_CF
French (Chad)fr_TD
Spanish (Chile)es_CL
Yue Chinese (Cantonese) (China)yue_CN
Uyghur, Uighur (China)ug_CN
Zhuang, Chuang (China)za_CN
Chinese Traditional (Hong Kong)zh_HK
Yue Chinese (Cantonese) (Hong Kong)yue_HK
English (Hong Kong)en_HK
Portuguese (Macau)pt_MO
English (Christmas Island)en_CX
English (Cocos (Keeling) Islands)en_CC
Spanish (Colombia)es_CO
Arabic (Comoros)ar_KM
French (Comoros)fr_KM
French (Congo - Brazzaville)fr_CG
Kongo (Congo - Brazzaville)kg_CG
Lingala (Congo - Brazzaville)ln_CG
Spanish (Costa Rica)es_CR
English (Costa Rica)en_CR
Croatian (Croatia)hr_HR
Serbian (Croatia)sr_HR
Dutch (Curaçao)nl_CW
Greek (Cyprus)el_CY
English (Cyprus)en_CY
Czech (Czechia)cs_CZ
Slovak (Czechia)sk_CZ
French (Côte d’Ivoire)fr_CI
French (Congo - Kinshasa)fr_CD
Lingala (Congo - Kinshasa)ln_CD
Kongo (Congo - Kinshasa)kg_CD
Swahili (Congo - Kinshasa)sw_CD
Danish (Denmark)da_DK
English (Denmark)en_DK
French (Djibouti)fr_DJ
Arabic (Djibouti)ar_DJ
Somali (Djibouti)so_DJ
Afar (Djibouti)aa_DJ
Spanish (Dominican Republic)es_DO
Spanish (Ecuador)es_EC
Arabic (Egypt)ar_EG
English (Egypt)en_EG
French (Egypt)fr_EG
Spanish (El Salvador)es_SV
Spanish (Equatorial Guinea)es_GQ
French (Equatorial Guinea)fr_GQ
Arabic (Eritrea)ar_ER
Tigrinya (Eritrea)ti_ER
Estonian (Estonia)et_EE
Russian (Estonia)ru_EE
Amharic (Ethiopia)am_ET
Oromo (Ethiopia)om_ET
Tigrinya (Ethiopia)ti_ET
Somali (Ethiopia)so_ET
Fijian (Fiji)fj_FJ
Finnish (Finland)fi_FI
Swedish (Finland)sv_FI
Breton (France)br_FR
Corsican (France)co_FR
Catalan (France)ca_FR
Basque (France)eu_FR
Occitan (France)oc_FR
French (French Guiana)fr_GF
Tahitian (French Polynesia)ty_PF
French (French Southern Territories)fr_TF
French (Gabon)fr_GA
Wolof (Gambia)wo_GM
Fulah (Gambia)ff_GM
Russian (Georgia)ru_GE
Armenian (Georgia)hy_GE
Azerbaijani (Georgia)az_GE
Akan (Ghana)ak_GH
Ewe (Ghana)ee_GH
Twi (Ghana)tw_GH
Spanish (Gibraltar)es_GI
Italian (Gibraltar)it_GI
Portuguese (Gibraltar)pt_GI
Greek (Greece)el_GR
English (Greece)en_GR
French (Greece)fr_GR
Kalaallisut (Greenland)kl_GL
English (Greenland)en_GL
French (Guadeloupe)fr_GP
English (Guam)en_GU
Spanish (Guatemala)es_GT
English (Guernsey)en_GG
French (Guinea)fr_GN
Portuguese (Guinea - Bissau)pt_GW
English (Guyana)en_GY
Italian (Vatican City)it_VA
French (Vatican City)fr_VA
Spanish (Honduras)es_HN
Hungarian (Hungary)hu_HU
Icelandic (Iceland)is_IS
English (Iceland)en_IS
German (Iceland)de_IS
Danish (Iceland)da_IS
Swedish (Iceland)sv_IS
Norwegian (Iceland)no_IS
English (India)en_IN
Hindi (India)hi_IN
Bengali (India)bn_IN
Telugu (India)te_IN
Marathi (India)mr_IN
Tamil (India)ta_IN
Urdu (India)ur_IN
Kannada (India)kn_IN
Malayalam (India)ml_IN
Odia (India)or_IN
Punjabi (India)pa_IN
Assamese (India)as_IN
Bihari (India)bh_IN
Kashmiri (India)ks_IN
Nepali (India)ne_IN
Sindhi (India)sd_IN
Konkani (India)kok_IN
Sanskrit (India)sa_IN
French (India)fr_IN
Indonesian (Indonesia)id_ID
English (Indonesia)en_ID
Dutch (Indonesia)nl_ID
Javanese (Indonesia)jv_ID
Persian (Iran)fa_IR
Arabic (Iraq)ar_IQ
Armenian (Iraq)hy_IQ
English (Ireland)en_IE
Irish (Ireland)ga_IE
English (Isle of Man)en_IM
Manx (Isle of Man)gv_IM
Hebrew (Israel)he_IL
English (Israel)en_IL
Italian (Italy)it_IT
Catalan (Italy)ca_IT
Corsican (Italy)co_IT
Slovenian (Italy)sl_IT
English (Jamaica)en_JM
Japanese (Japan)ja_JP
English (Jersey)en_JE
French (Jersey)fr_JE
Arabic (Jordan)ar_JO
English (Jordan)en_JO
Kazakh (Kazakhstan)kk_KZ
Russian (Kazakhstan)ru_KZ
Swahili (Kenya)sw_KE
Arabic (Kuwait)ar_KW
English (Kuwait)en_KW
Kyrgyz (Kyrgyzstan)ky_KG
Uzbek (Kyrgyzstan)uz_KG
Russian (Kyrgyzstan)ru_KG
Lao (Laos)lo_LA
French (Laos)fr_LA
English (Laos)en_LA
Latvian (Latvia)lv_LV
Russian (Latvia)ru_LV
Lithuanian (Latvia)lt_LV
Arabic (Lebanon)ar_LB
English (Lebanon)en_LB
Armenian (Lebanon)hy_LB
Southern Sotho (Lesotho)st_LS
Zulu (Lesotho)zu_LS
Xhosa (Lesotho)xh_LS
Arabic (Libya)ar_LY
Italian (Libya)it_LY
English (Libya)en_LY
German (Liechtenstein)de_LI
Lithuanian (Lithuania)lt_LT
Russian (Lithuania)ru_LT
Polish (Lithuania)pl_LT
Luxembourgish (Luxembourg)lb_LU
German (Luxembourg)de_LU
French (Luxembourg)fr_LU
French (Madagascar)fr_MG
Malagasy (Madagascar)mg_MG
Chichewa (Malawi)ny_MW
Sena (Malawi)swk_MW
Malay (Malaysia)ms_MY
English (Malaysia)en_MY
Tamil (Malaysia)ta_MY
Telugu (Malaysia)te_MY
Malayalam (Malaysia)ml_MY
Punjabi (Malaysia)pa_MY
Thai (Malaysia)th_MY
Divehi (Maldives)dv_MV
English (Maldives)en_MV
French (Mali)fr_ML
Bambara (Mali)bm_ML
English (Malta)en_MT
Marshallese (Marshall Islands)mh_MH
English (Marshall Islands)en_MH
French (Martinique)fr_MQ
French (Mauritania)fr_MR
Wolof (Mauritania)wo_MR
English (Mauritius)en_MU
French (Mauritius)fr_MU
French (Mayotte)fr_YT
Spanish (Mexico)es_MX
French (Monaco)fr_MC
English (Monaco)en_MC
Italian (Monaco)it_MC
Russian (Mongolia)ru_MN
Serbian (Montenegro)sr_ME
Hungarian (Montenegro)hu_ME
Albanian (Montenegro)sq_ME
Croatian (Montenegro)hr_ME
Arabic (Morocco)ar_MA
French (Morocco)fr_MA
Portuguese (Mozambique)pt_MZ
Burmese (Myanmar)my_MM
English (Namibia)en_NA
Afrikaans (Namibia)af_NA
German (Namibia)de_NA
Herero (Namibia)hz_NA
Nama (Namibia)naq_NA
Nauru (Nauru)na_NR
Nepali (Nepal)ne_NP
English (Nepal)en_NP
Dutch (Netherlands)nl_NL
Frisianfy_NL
English (New Zealand)en_NZ
Spanish (Nicaragua)es_NI
English (Nicaragua)en_NI
French (Niger)fr_NE
Hausa (Niger)ha_NE
Kanuri (Niger)kr_NE
Zarma (Niger)dje_NE
English (Nigeria)en_NG
Hausa (Nigeria)ha_NG
Yoruba (Nigeria)yo_NG
Igbo (Nigeria)ig_NG
Fulah (Nigeria)ff_NG
Filipino (Northern Mariana Islands)fil_MP
Tagalog (Northern Mariana Islands)tl_MP
English (Northern Mariana Islands)en_MP
Norwegian (Norway)no_NO
Norwegian Bokmål (Norway)nb_NO
Norwegian Nynorsk (Norway)nn_NO
Northern Sami (Norway)se_NO
Finnish (Norway)fi_NO
Arabic (Oman)ar_OM
English (Oman)en_OM
Urdu (Oman)ur_OM
Urdu (Pakistan)ur_PK
English (Pakistan)en_PK
Punjabi (Pakistan)pa_PK
Sindhi (Pakistan)sd_PK
Japanese (Palau)ja_PW
Filipino (Palau)fil_PW
Spanish (Panama)es_PA
English (Panama)en_PA
Hiri Motu (Papua New Guinea)ho_PG
Spanish (Paraguay)es_PY
Guarani (Paraguay)gn_PY
Spanish (Peru)es_PE
Quechua (Peru)qu_PE
Aymara (Peru)ay_PE
Tagalog (Philippines)tl_PH
English (Philippines)en_PH
Filipino (Philippines)fil_PH
Cebuano (Philippines)ceb_PH
Tausug (Philippines)tsg_PH
Polish (Poland)pl_PL
Spanish (Puerto Rico)es_PR
Arabic (Qatar)ar_QA
Spanish (Qatar)es_QA
Korean (Korea)ko_KR
English (South Korea)en_KR
Romanian (Moldova)ro_MD
Russian (Moldova)ru_MD
Turkish (Moldova)tr_MD
Romanian (Romania)ro_RO
Hungarian (Romania)hu_RO
Tatar (Russia)tt_RU
Komi (Russia)kv_RU
Chechen (Russia)ce_RU
Bashkir (Russia)ba_RU
Avaric (Russia)av_RU
Kinyarwanda (Rwanda)rw_RW
French (Rwanda)fr_RW
Swahili (Rwanda)sw_RW
French (Réunion)fr_RE
French (St. Barthélemy)fr_BL
French (St. Martin)fr_MF
French (St. Vincent & Grenadines)fr_VC
Samoan (Samoa)sm_WS
Portuguese (São Tomé and Príncipe)pt_ST
Arabic (Saudi Arabia)ar_SA
French (Senegal)fr_SN
Wolof (Senegal)wo_SN
Serbian (Serbia)sr_RS
Hungarian (Serbia)hu_RS
English (Singapore)en_SG
Malay (Singapore)ms_SG
Tamil (Singapore)ta_SG
Chinese Simplified (Singapore)zh_SG
Dutch (Sint Maarten)nl_SX
English (Sint Maarten)en_SX
Slovak (Slovakia)sk_SK
Hungarian (Slovakia)hu_SK
Slovenian (Slovenia)sl_SI
Somali (Somalia)so_SO
Italian (Somalia)it_SO
Zulu (South Africa)zu_ZA
Xhosa (South Africa)xh_ZA
Afrikaans (South Africa)af_ZA
Pedi (South Africa)nso_ZA
English (South Africa)en_ZA
Tswana (South Africa)tn_ZA
Southern Sotho (South Africa)st_ZA
Tsonga (South Africa)ts_ZA
Swati (South Africa)ss_ZA
Venda (South Africa)ve_ZA
South Ndebele (South Africa)nr_ZA
English (South Georgia & South Sandwich Islands)en_GS
English (South Sudan)en_SS
Catalan (Spain)ca_ES
Galician (Spain)gl_ES
Basque (Spain)eu_ES
Occitan (Spain)oc_ES
Sinhala (Sri Lanka)si_LK
Tamil (Sri Lanka)ta_LK
English (Sri Lanka)en_LK
Arabic (Sudan)ar_SD
English (Sudan)en_SD
English (Suriname)en_SR
Javanese (Suriname)jv_SR
Norwegian (Svalbard & Jan Mayen)no_SJ
Russian (Svalbard & Jan Mayen)ru_SJ
Swedish (Sweden)sv_SE
Northern Sami (Sweden)se_SE
German (Switzerland)de_CH
French (Switzerland)fr_CH
Italian (Switzerland)it_CH
Romansh (Switzerland)rm_CH
Arabic (Syria)ar_SY
Armenian (Syria)hy_SY
French (Syria)fr_SY
English (Syria)en_SY
Tajik (Tajikistan)tg_TJ
Russian (Tajikistan)ru_TJ
Thai (Thailand)th_TH
English (Thailand)en_TH
Albanian (North Macedonia)sq_MK
Turkish (North Macedonia)tr_MK
Serbian (North Macedonia)sr_MK
Indonesian (Timor-Leste)id_TL
English (Timor-Leste)en_TL
French (Togo)fr_TG
Ewe (Togo)ee_TG
Hausa (Togo)ha_TG
Tongan (Tonga)to_TO
English (Trinidad and Tobago)en_TT
French (Trinidad & Tobago)fr_TT
Spanish (Trinidad & Tobago)es_TT
Arabic (Tunisia)ar_TN
French (Tunisia)fr_TN
Turkish (Turkey)tr_TR
Azerbaijani (Turkey)az_TR
Avaric (Turkey)av_TR
Turkmen (Turkmenistan)tk_TM
Russian (Turkmenistan)ru_TM
Uzbek (Turkmenistan)uz_TM
English (Tuvalu)en_TV
Samoan (Tuvalu)sm_TV
Ganda (Uganda)lg_UG
Swahili (Uganda)sw_UG
Arabic (Uganda)ar_UG
Ukrainian (Ukraine)uk_UA
Russian (Ukraine)ru_UA
Polish (Ukraine)pl_UA
Hungarian (Ukraine)hu_UA
Arabic (United Arab Emirates)ar_AE
Persian (United Arab Emirates)fa_AE
English (United Arab Emirates)en_AE
Hindi (United Arab Emirates)hi_AE
Urdu (United Arab Emirates)ur_AE
English (United Kingdom)en_GB
Welsh (United Kingdom)cy_GB
Scottish Gaelic (UK)gd_GB
Swahili (Tanzania)sw_TZ
English (Tanzania)en_TZ
Arabic (Tanzania)ar_TZ
English (U.S. Minor Outlying Islands)en_UM
English (U.S. Virgin Islands)en_VI
Spanish (United States)es_US
Hawaiian (US)haw_US
French (US)fr_US
Spanish (Uruguay)es_UY
Uzbek (Uzbekistan)uz_UZ
Russian (Uzbekistan)ru_UZ
Tajik (Uzbekistan)tg_UZ
Bislama (Vanuatu)bi_VU
Spanish (Venezuela)es_VE
Vietnamese (Vietnam)vi_VN
English (Vietnam)en_VN
French (Vietnam)fr_VN
Arabic (Western Sahara)ar_EH
Arabic (Yemen)ar_YE
Bemba (Zambia)bem_ZM
Chichewa (Zambia)ny_ZM
English (Zimbabwe)en_ZW
Shona (Zimbabwe)sn_ZW
South Ndebele (Zimbabwe)nr_ZW
North Ndebele (Zimbabwe)nd_ZW

Editor Examples

Variables

It is possible to include variables in your translation strings, they should be wrapped in double curly brackets. Their value could be set as a string or as a variable - either a system variable or a variable sent through the payload.
{
  "withVariables": "Welcome {{name}} to {{organization}}"
}
In the editor:
{{i18n "welcome.withVariables" name=subscriber.firstName organization="Novu"}}

Context

By providing a context you can differ translations. Eg. useful to provide gender specific translations. For example:
{
  "friend": "A friend",
  "friend_male": "A boyfriend",
  "friend_female": "A girlfriend"
}
In the editor:
{{i18n "welcome.friend" context="male"}}
Will result in the message A boyfriend. Not adding any context will output A friend.

Plurals

To distinguish between plural translation options.
{
  "keyWithCount": "{{count}} item",
  "keyWithCount_plural": "{{count}} items"
}
In the editor:
{{i18n "welcome.keyWithCount" count=7}}
Will result in 7 items

Date formats

To control date formats, do as follows:
{
  "date": "Current date: {{date, dd/MM/yyyy}}",
  "try_date": "Current date: {{date, MM/dd/yyyy}}",
  "intlDateTime": "On the {{date, HH:yyyy}}"
}
In the editor:
Date can be a string or a variable you send in the payload as { date: new Date() }
{{i18n "welcome.date" date="12-06-2023"}}
{{i18n "welcome.try_date" date=date}}
{{i18n "welcome.intlDateTime" date=date}}
I