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 .
Supported Translations Locales
Language Name Locale English (United States) en_US Spanish (Spain) es_ES German (Germany) de_DE French (France) fr_FR Chinese Simplified zh_CN Portuguese (Portugal) pt_PT Russian (Russia) ru_RU Chinese Traditional zh_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 Guarani (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 Frisian fy_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
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 }}