Translate email templates from Braze and Mailchimp
Email platforms disagree about where translations live, and that decision — not the file format — is what makes localizing a campaign awkward. Transept reads all three arrangements, so you upload the template you already have rather than reshaping it first.
Na této stránce
Which platform works which way?
Every email platform localizes in one of three ways. Finding your platform in this table tells you what to upload and what you get back.
- If your platform generates translations for you and you only want to review them, that is a different job — bring the finished text in as existing translations so your memory and glossary learn from it.
| How the platform works | Platforms | What you upload |
|---|---|---|
| A separate table of translations, keyed, sitting beside the template | Braze (CSV or API), Klaviyo (CSV) | The translations file — see strings files |
| One complete template per language | Iterable, Customer.io, Brevo | The template, once per language — plain HTML |
| Every language inside one template, chosen by a conditional | Mailchimp, Braze translation tags, any hand-rolled Liquid | The template itself — covered below |
How do I translate a Braze template?
Upload the template HTML. Every span Braze has tagged with {% translation %} becomes one string, keyed by that tag’s id, and everything outside a tag is left alone: untagged copy is text you told Braze not to localize, so translating it would put words in the file that Braze never varies.
What you export is the translation table, not a rewritten template. That is deliberate, and it is the part worth understanding: the text inside the tag is Braze’s default, what it sends to anyone whose locale you have no translation for. It has to stay in the source language. Translations belong in the CSV you upload to Braze alongside the template.
So the round-trip is: upload the template, translate, export Strings file (keyed) or the CSV, upload that to Braze. Your template never needs to change.
- Braze’s own limits are enforced at import, so you find out before the run rather than after: 200 translation tags per message, 2,000 characters of default text per tag, no nesting, and ids unique within the message.
- Tags inside an HTML attribute — a localized link target, for instance — are read like any other.
- Braze advises against opening its translation CSV in Excel, which mangles non-Latin characters. That warning applies to the file you upload back to Braze, whoever produced it.
How do I translate a template that holds every language at once?
Mailchimp has no multilingual campaign feature, so its templates carry every language inline and pick one with a conditional — *|IF:MC_LANGUAGE=es|* … *|ELSE:|* … *|END:IF|*. Hand-rolled Liquid templates do the same with {% if lang == "es" %}. Upload the template and Transept reads each conditional as one string, with each branch as that string’s translation for its language.
Every branch is translated as the standalone sentence it is, not as a variation on the default. This matters more than it sounds: the branch a returning customer reads and the branch a new one reads are usually different copy with different intent, and translating the whole conditional as one blob does both badly.
A language the template has never carried gets a new branch written into the file on export, placed before the default so the default stays the fallback. You upload one template and get one template back, now covering more languages.
- Conditionals that have nothing to do with language —
{% if vip %},*|IF:PURCHASES>0|*— are left completely alone, including their text. Only a test against Mailchimp’sMC_LANGUAGEor a Liquid variable that names a language counts. - A language conditional nested inside one of those is still found and translated.
- A new branch is labelled with the language code Transept uses. If your platform expects a different spelling for that language, rename it in the exported file.
What if my platform has no localization features at all?
Then the template is just an HTML file, and that is the easiest case. Upload it, translate the whole thing, and export one file per language — the layout, inline styles, and table scaffolding that email HTML depends on come back untouched, because the export writes translations into your original file rather than rebuilding it.
Use several languages to produce every locale from one upload in a single run.
How do personalization tags survive translation?
They are hidden from the AI before it sees the text and restored afterward, and every reply is counted against the source so nothing can go missing. This covers Liquid ({{first_name}}, {% if %}), Braze’s attribute syntax ({{${first_name}}}), Mailchimp merge tags (*|FNAME|*), and printf placeholders, with nothing to configure.
One thing inside a tag is translated, on purpose: the fallback text. In {{ first_name | default:"friend" }}, the word friend is what every recipient with no first name on file reads, often most of the send. That makes it copy, so it gets translated while the tag around it stays exactly as written.
What can’t be translated this way?
Two limits are worth knowing before you plan a campaign, because neither is visible in a preview:
- Mailchimp subject lines cannot vary by language. The subject is campaign metadata rather than template content, so no conditional reaches it. That limit belongs to Mailchimp; Transept cannot work around it. If you need per-language subjects there, you need per-language campaigns.
- Untagged text in a Braze template stays untranslated, because Braze itself will never localize it. If a paragraph should vary by language, wrap it in a translation tag in Braze first, then re-import.
- A preview shows one language, which is exactly why both of these go unnoticed. Check the exported file, not the preview, before a send.
Does Transept connect to Braze or Mailchimp directly?
No, and that is a deliberate choice. Platform APIs change, deprecate, and rate-limit on their own schedule, and an integration that breaks silently is worse than no integration. The file round-trip does the same work, keeps working, and leaves you holding a file you can inspect before anything reaches your audience.
I exported my Braze template after translating and it looks unchanged. Is that a bug?
No — that is correct. A Braze template holds only the default text, and the default must stay in the source language, because it is what Braze sends to anyone you have no translation for. Your translations are in the strings export: choose Strings file (keyed) or the CSV from the export menu, and upload that to Braze alongside your unchanged template.
What happens to a conditional that isn’t about language, like a VIP block?
It is left alone entirely — structure and text. Only a test against Mailchimp’s MC_LANGUAGE merge tag, or a Liquid variable whose name refers to language compared against a real language code, is treated as a language conditional. A language block nested inside a VIP block is still found and translated normally.
Can I add a language my template has never had a branch for?
Yes. Translate into it as you would any other language, and the export writes a new branch into the conditional, placed before the default branch so the default keeps working as the fallback. You get one template back covering more languages than the one you uploaded.
Which file do I upload — the template or the translations CSV?
Whichever one your platform gave you; both work. Upload the CSV if your platform keeps translations in a separate keyed table (Braze, Klaviyo), or the template if it holds languages inline or has no localization features at all. If you have both, the CSV is the more direct route — see strings files.
Stále si nevíte rady? Zeptejte se Literess v aplikaci, nebo napište na [email protected].