Translate
Email translation and localization templates and string files alike
Your campaign copy lives in two shapes: an HTML template with inline styles, tracking pixels and twelve links, and a keyed string table your ESP exports as CSV. Transept takes either one, protects every Liquid tag and merge tag through the translation, respects the character limits on your subject lines, and hands the file back in the shape it arrived in.
Free to begin · No card required
Email is the one surface where localization breaks in two directions at once. A transactional template has nested tables, inline styles, conditional comments for Outlook, tracking pixels, and dropped links. The same campaign’s copy also lives in your ESP as a keyed string table, where every row carries an ID that must never change and a subject line that has about forty-five characters before the inbox cuts it off. Most teams paste the HTML into a chat model, get back something that looks right, and find out later that the tracking pixel is gone and the unsubscribe link points somewhere else — or they hand a translator a spreadsheet with no context and no character counts and get back copy that overflows the button. Transept handles both shapes natively: the HTML is parsed into a tree and only its text nodes are translated, and the string table stays a string table, keys and limits intact, exported in the format it arrived in.
How does the copy get translated and everything else left alone?
Whatever your platform hands you, the job is the same: translate the words, touch nothing else. A template has to render identically in the new language, and a string table has to come back with the same keys in the same rows. Transept treats each as what it is rather than flattening both into plain text.
Bring the email in either shape
Paste an HTML template, or import the string table your ESP exports: a Braze or Klaviyo translation CSV, a gettext `.po` file, XLIFF. Keys, context notes and character limits come along with the rows.
Tokens are masked before a model sees them
Liquid tags, Braze `{{$attribute}}` tags, Handlebars, merge tags and printf placeholders are hidden from the translator and restored after. The reply is checked against the tokens that went in; a mismatch is repaired or retried, never shipped.
Review with the limits in front of you
A rendered template sits next to its source. A string table opens as a grid of key, source and translation, with a live counter on every row that came with a character limit, so an overflowing subject line is obvious before it sends.
Export in the shape it arrived in
Translated HTML goes back into your ESP unchanged. An imported file comes back as that same file with the language columns filled, so it uploads where it came from without reshaping anything by hand.
Who is this for? Anyone shipping campaigns
Lifecycle & transactional emails
Welcome series, password resets, receipts. Localize the copy without rebuilding the template or touching the logic.
Marketing campaigns in an ESP
Export the translation file from Braze, Klaviyo or Iterable, fill every language, upload it back. Same campaign, twelve languages, sent on time.
Landing pages
Localize the page that runs the campaign, keeping CTA copy, hero structure, and embedded scripts where they were.
Three closing braces
Braze writes every personalization tag with three closing braces. Almost every Liquid parser stops at the first two and leaves a stray brace loose in the translatable text, where a model moves it or drops it. Ours did that too, until we tested against Braze’s own syntax and fixed it.
What each ESP actually does— Don’t take our word for it —
The editor, in miniature
A working slice of the real thing — Literess, glossary, styleguide, workflows, and the translation memory are all live. Click around.

Here to help you translate
A key turned in the lock and the door swung open.
У замку повернувся ключ, і двері розчахнулися.
The knock came just before midnight.
Стукіт пролунав перед самою північчю.
FAQ
- Adapting a campaign to another language and market: the body copy, the subject line and preheader, the fallback text behind every personalization tag, and the formatting conventions of the target locale. It differs from plain translation because an email carries template syntax that must survive unchanged and constraints, like subject-line length, that the translation has to respect.
- HTML templates, and the keyed string tables ESPs and software teams work in: CSV (the shape Braze and Klaviyo export), gettext `.po`, and XLIFF. A CSV can carry a column per language, a context note and a character limit per row, and all of that is read.
- No. The parser treats `style` attributes, `data-*` attributes, hidden tracking pixels, and conditional comments as opaque, so they pass through unchanged. Only the human-readable text gets translated.
- They are kept, not redone. A filled language cell, a non-empty `msgstr`, a populated XLIFF target: each counts as a finished translation, costs nothing, and seeds your translation memory so it steers the rows that still need work.
- Link text is translated; the `href` is not. A "Read more →" becomes "Lire la suite →" and the URL it points at stays exactly the same.
- You control it. Pin CTA text in your glossary so it gets a single deliberate translation, or steer regenerations with a direction like "shorter" or "more urgent". Where the file gives a character limit, the counter tells you whether it still fits.
- It’s software, not a done-for-you service. If you’ve been pricing email translation services, the difference is that you keep the work in-house: paste your HTML template, translate it with the links, inline styles, and images preserved, and paste the localized version back into your ESP — in minutes, at a fraction of an agency’s per-email rate. You bring the languages (or your reviewer does); Transept does the markup-safe translation.
- Yes, by file rather than by direct integration. Whichever way your platform hands you the copy, Transept reads it: paste or upload the HTML template, or import the string table your ESP exports — a Braze or Klaviyo translation CSV, a gettext PO file, XLIFF. The export gives you the same file back with the translations filled in, so it goes straight back where it came from. Direct API integrations are not built yet; the file round-trip is what we support today.
- They are masked before the text reaches a model, so it never sees them as words, and restored afterward. That covers Liquid `{% if %}` logic and `{{ }}` output, Braze’s `{{$attribute}}` form, Handlebars, Django tags, Mailchimp merge tags, and printf placeholders like `%s` and `%1$s`. Every reply is checked against the tokens that went in, and a block whose tokens do not match is repaired or retried rather than shipped.
- If your file carries them, yes. A character limit on a row becomes a live counter next to the translation, so an overflowing subject line or a CTA that no longer fits is visible while you review rather than after you send. It matters more than it sounds: German runs roughly 1.5 to 2 times the width of English, so labels that fit in the source routinely do not fit in the target.
- Yes — any HTML export works. Inline styles, classes, IDs, data attributes — all preserved. Test once with a sample page; once you trust the round-trip, scale to whole campaigns.
- Static text inside dynamic blocks translates normally and the logic itself passes through untouched. Each branch of a conditional is treated as its own piece of copy, which is the right unit anyway: the gold-member line and the join-Gold line are different sentences, and a translator handed both at once does a worse job on each than one handed them separately with context.
- No. A file with a column per language imports as one document per language, grouped together, with any cells already filled kept as finished translations rather than re-translated. Translate the gaps in a single run across the whole group, then export once: the original file comes back with every language column populated.
- The structure is preserved exactly, so Outlook-specific quirks (conditional comments, table-based layouts, inline styles) survive. Always send a test through Litmus or your own Outlook account before a campaign goes live — that’s a general email QA step, not specific to translation.
Keep reading around this capability
- FeatureBatch translation without the spreadsheet→A 30-file launch kit into 12 languages used to mean a spreadsheet, a project manager, and a week. With batch translation, it’s a queue you…
- FeatureA glossary the AI actually follows→Character names, product terms, branded phrases, client-specific vocabulary. Build a glossary once — manually, by upload, or seeded from a…
- Use caseLocalize a landing page, CTA and all→Import the page or paste the HTML. Translate with CTA copy pinned, product terms enforced, and a marketing styleguide steering the tone.…
- Use caseLocalize the launch kit, all of it→Email, landing page, FAQ, release notes, social posts — the assets that make a launch. Run them through Transept as one bundle with a…
Localize the next campaign in the file it already lives in
Start translatingFree to begin · No card required

