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.

Start translating

Free to begin · No card required

Featured on

  • Featured on Findly.tools
  • Featured on Wired Business
  • Featured on Twelve Tools
  • Find us on Firsto
  • Verified on DANG!
  • Launching soon on Smol Launch
  • Launched on Fazier
  • Featured on Startup Fame
  • Featured on LaunchBuff
In context

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

From our labs

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.

Chill, love

Here to help you translate

Memory
Import
Try:
Search
Scope
AI context
Manage TM settings
Showing matches for the selected block
71%

A key turned in the lock and the door swung open.

У замку повернувся ключ, і двері розчахнулися.

Chill, love — chapter 2you · last week
This doc55%

The knock came just before midnight.

Стукіт пролунав перед самою північчю.

Chill, loveyou · today
Auto-saved · just now
Interactive demo — click anything

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.

Localize the next campaign in the file it already lives in

Start translating

Free to begin · No card required