Meta description: Your .po files can be correct and still fail users. Learn what transcreation is and how to handle high-impact Django strings the right way.
You ship a locale update, run compilemessages, click through staging, and nothing is technically wrong. The strings are translated. Placeholders survived. HTML is intact.
Then you hit the landing page hero or the signup CTA, and it reads like a legal disclaimer wearing a hoodie.
That's usually the moment you need to answer what is transcreation, not as a marketing theory question, but as an engineering one. Most of your Django strings need accuracy and consistency. A small set needs something else.
What Is Transcreation (And What It Is Not)
A literal translation can be perfect for:
- Field labels: “Email address”
- System notices: “Password changed successfully”
- Admin actions: “Archive selected items”
It can fail badly for:
- Taglines: brand promise on a pricing page
- CTAs: the button that starts activation
- Onboarding copy: text trying to reassure or motivate a user
Academic research defines transcreation as an adaptation of a message for a target audience while preserving the original style, tone, and emotions, and notes that it is most common in persuasive contexts where the goal is to recreate audience response across cultures rather than reproduce words in The Journal of Specialised Translation.

The practical distinction
Translation asks, “How do we say this correctly in another language?”
Transcreation asks, “How do we make a user in another market feel and respond the way the original intended?”
That difference matters because your tooling, review process, and success criteria change with it.
Practical rule: If the string is supposed to persuade, reassure, excite, or shape brand perception, treat it differently from ordinary UI copy.
Translation, localization, and transcreation side by side
| Method | Primary Goal | Process | Best For |
|---|---|---|---|
| Machine translation | Produce a usable draft quickly | Model converts text with limited context | Large batches of routine UI copy |
| Translation | Preserve meaning accurately | Linguistic transfer from source to target | Docs, settings, transactional text |
| Localization | Adapt for regional conventions | Translation plus formats, conventions, and product context | Dates, currencies, legal labels, UX details |
| Transcreation | Recreate intent and audience response | Rewrite from a brief, with freedom to move away from source wording | CTAs, slogans, campaigns, emotional onboarding copy |
If you want a cleaner breakdown of where translation and localization split, this comparison of translation vs localization is useful background.
What transcreation is not
It isn't “make every string more creative.”
It also isn't “ignore the source text and write whatever sounds clever.” Good transcreation stays anchored to product truth, brand voice, and the job the copy needs to do. If your source says “Start your free trial,” a transcreated version can change tone and structure, but it still has to support the actual user action and the surrounding UX.
For Django teams, the practical takeaway is boring in the best way. Most strings should stay in your normal translation flow. Transcreation is a special-case path for the small set of strings where literal correctness still produces the wrong result.
When Your Django App Actually Needs Transcreation
Most apps don't need transcreation for 95 percent of their text. They need it for the strings users remember.
A settings page doesn't need it. Your homepage headline might. An invoice email subject usually doesn't. The onboarding message that tries to reduce signup hesitation might.

Strings worth pulling out of the bulk pipeline
Use transcreation when the text does one of these jobs:
- Sells: landing page headlines, pricing copy, upgrade prompts
- Pushes action: primary CTA buttons, email subject lines, ad-like banners
- Carries voice: onboarding nudges, empty-state copy, branded error messages
- Uses wordplay: slogans, idioms, puns, compressed campaign language
A useful test is failure cost. If a bad translation only sounds stiff, you can often fix it later. If it weakens conversion, trust, or first-run experience in a new market, don't send it through the same path as “Save changes.”
Why the extra effort can be worth it
In industry practice, transcreation is treated as a creative service and is often billed by the hour or by project rather than per word. Smartling also notes that emotionally driven campaigns can generate nearly 3× more organic impressions than rational ones, citing IPA research in its explanation of why transcreation differs from translation in this Smartling article.
That doesn't mean every app screen needs marketing copy polish. It means the handful of strings that drive acquisition or activation deserve a different budget and review bar.
If a string exists to persuade, reviewing it for correctness alone is the wrong QA target.
For a typical SaaS app, I'd isolate only the high-impact set:
- homepage hero
- pricing page headline
- trial signup CTA
- first-run onboarding prompt
- upgrade modal headline
Everything else can stay in the standard i18n lane unless review shows a problem.
A Developer-Friendly Transcreation Workflow
The usual reason teams skip transcreation is operational friction. It feels like leaving Git, leaving CI, and entering a side process nobody owns. You don't need to do that.
Industry guidance from the Institute of Translation and Interpreting frames transcreation as a blend of translation and copywriting that starts from a client brief, with the goal of producing a new persuasive text rather than an equivalent one in the ITI guidance on transcreation.

Step 1, write a brief in the repo
Put a TRANSLATING.md file in the project root. Treat it like a spec.
Include:
- Audience: who the string speaks to
- Intent: click, trust, complete signup, upgrade
- Tone: direct, calm, premium, playful
- Constraints: max length, banned wording, legal limits
- Product truth: what the feature really does
That file also works well as the home for glossary rules. If you need examples of how to structure terminology guidance, this page on the format of glossary is a solid reference.
Step 2, mark the strings in code
Don't make people guess which strings are special. Use context. Use comments. Make extraction deterministic.
For Python, pgettext() is the cleanest marker for “this is not normal UI copy.” For templates, use translator comments close to the string. Keep the convention documented so every developer marks the same kinds of content the same way.
Step 3, extract a transcreation subset
Run your normal message extraction. Then filter for entries with a specific context such as marketing_cta, hero_headline, or onboarding_voice.
Now you have two lanes:
- Bulk lane: routine
.poentries go through your normal translation flow - Creative lane: flagged entries go to a native-speaking copywriter, linguist, or local marketer
That split keeps your release process sane. Your app doesn't wait for every single string to receive high-touch treatment.
A visibility tool helps here. If you already track delivery state and review bottlenecks across teams, a workflow insights platform can make it easier to see when transcreated strings are the actual blocker versus when extraction or review ownership is the issue.
Here's the process in one view:
Step 4, merge the result back into Git
Transcreated output should come back as reviewable text, not screenshots in a chat thread.
Use PRs. Store comments. Keep the brief close to the strings. If a future release changes the source CTA, you want the diff, the old rationale, and the target-market decision history in one place.
That's the part most marketing-led transcreation workflows miss. Developers need repeatability more than ceremony.
Implementing the Workflow with Django's i18n Tools
You already have the hooks you need in Django. Start with contextual translation functions from the Django internationalization docs.

Mark high-impact strings with context
from django.utils.translation import gettext_lazy as _
from django.utils.translation import pgettext
PRODUCT_NAME = _("Translate reports faster")
HERO_HEADLINE = pgettext(
"marketing_slogan",
"Launch globally without sounding translated"
)
PRIMARY_CTA = pgettext(
"marketing_cta",
"Start your free trial"
)
When you run extraction, use the normal command:
python manage.py makemessages --locale=fr
Django will place contextual entries into your catalog under the expected path:
locale/fr/LC_MESSAGES/django.po
What the .po output looks like
#: app/marketing/copy.py:7
msgctxt "marketing_slogan"
msgid "Launch globally without sounding translated"
msgstr ""
#: app/marketing/copy.py:12
msgctxt "marketing_cta"
msgid "Start your free trial"
msgstr ""
#: app/templates/billing/summary.html:18
#, python-format
msgid "You have %(count)s invoice remaining."
msgid_plural "You have %(count)s invoices remaining."
msgstr[0] ""
msgstr[1] ""
That msgctxt value is your routing key. A script can parse the .po file, pull only marketing_* entries, and hand those off for transcreation.
Add translator context in templates
For template strings, keep context near the source:
{# Translators: Homepage hero CTA. Keep it short. Action-oriented. #}
<button>{% translate "Start your free trial" %}</button>
{# Translators: Onboarding reassurance copy. Tone should feel calm, not pushy. #}
<p>{% translate "You're a few steps away from your first live project." %}</p>
Don't hide intent in a separate spreadsheet. Put the note next to the string or it won't survive refactors.
A lot of machine translation failures in Django happen on short strings with weak context. “Run”, “Open”, “Charge”, and “Plan” can all go wrong depending on screen, locale, and part of speech. Context markers won't solve every issue, but they reduce ambiguity and make selective transcreation possible without adding a new platform.
Quality Assurance for Transcreated Strings
Standard translation QA asks whether the target text is accurate, grammatical, and complete. That's not enough here.
Transcreated strings need a different review question: does the copy achieve the effect described in the brief when a real user sees it in context?
What to review against
Give the reviewer more than a raw string list:
- The original brief: tone, target audience, desired action
- UI context: screenshot, staging URL, or component preview
- Character limits: button width, modal headline space, mobile constraints
- Product constraints: promises the copy can't make
For ordinary translation, linguistic review can catch most issues. For transcreation, you need a native-speaking reviewer who understands local persuasion and brand tone. That might be a marketer, copywriter, or experienced linguist with product context.
What passes and what fails
Pass/fail criteria should look like this:
- Pass: fits the screen, sounds native, matches the brief, supports the intended action
- Fail: technically correct but flat, too aggressive for the market, too vague, or inconsistent with product reality
That review still belongs in engineering workflow. Keep the feedback in Git or in a tracked review system. If your team keeps changing a CTA every sprint, you need history, not folklore.
A lot of teams blur “good translation” and “effective copy.” They aren't the same thing. If you want a broader view of where automated output is strong and where it still needs human review, this piece on quality of translation is worth reading.
The hardest part to automate isn't language transfer. It's judging whether a phrase lands with the intended audience.
That's why the best use of automation is not replacing review. It's removing routine translation work so humans can spend time on the handful of strings where judgment matters most.
Fitting Transcreation into Your Next Release
You don't need a new department for this. You need a shortlist and a rule.
For the next sprint, pick the few strings with the highest business impact. Usually that's your hero headline, primary CTA, onboarding nudge, and one upgrade prompt. Write a brief for them in TRANSLATING.md. Mark them with pgettext() or translator comments. Keep them out of the bulk pipeline and send them through native review with UI context.
Use the normal Django flow for the rest:
python manage.py makemessages --locale=fr
python manage.py compilemessages
Keep the creative lane narrow. That's what makes it sustainable.
The main win is operational. You stop treating all strings as equal. Your app can keep using automated translation for routine catalog updates, while the small set of persuasive strings gets the extra attention it needs.
If you want to automate the routine side of Django localization without leaving Git, TranslateBot is built for that workflow. It handles .po files and model fields, preserves placeholders and HTML, and fits neatly beside makemessages and compilemessages, so your team can spend review time on the strings that deserve transcreation instead of burning it on every label in the app.