Back to blog

What Is The Definition Of Translation?

2026-05-05 11 min read
What Is The Definition Of Translation?

Meta description: What is the definition of translation for Django teams? Learn how to translate .po files without breaking placeholders, HTML, or your Git workflow.

You run python manage.py makemessages, open locale/fr/LC_MESSAGES/django.po, and hit a wall of msgstr "".

That’s the point where “what is the definition of translation” stops being academic. In a Django app, translation isn’t just turning English into French, German, or Japanese. You need output that keeps placeholders intact, survives code review, and doesn’t turn your next deploy into a bug hunt.

If a translated string reads well but drops %(name)s, breaks an HTML tag, or drifts from your product terminology, it failed. It’s not a translation problem anymore. It’s a production problem.

Your .po File is Ready So Now What

A fresh .po file looks innocent until it doesn’t:

python manage.py makemessages -l fr

Then you open:

locale/fr/LC_MESSAGES/django.po

And you see this:

#: billing/views.py:18
#, python-format
msgid "Hello %(name)s, your trial ends in %(days)s days."
msgstr ""

#: templates/account/login.html:12
msgid "Sign in"
msgstr ""

#: templates/account/login.html:19
msgid "<strong>Password</strong> is required."
msgstr ""

A cartoon person sitting on a stack of .po files, wondering what to do with a django.po file.

A non-developer answer is “translate the text.” A developer answer is stricter. You need to preserve meaning, grammar, placeholders, HTML, plural rules, and consistency with the rest of the app.

That’s why translation in software feels different from translation in general writing. Your strings are part content, part interface, part executable contract.

What you’re actually trying to produce

When you fill msgstr, you’re not just writing another sentence. You’re producing an artifact your app will load at runtime.

A usable translation has to be:

Practical rule: If the translated string can’t pass code review, it isn’t ready for users either.

What usually goes wrong

Teams rarely get blocked on theory. They get blocked on workflow.

You start with good intentions, then end up with one of these:

Workflow What breaks
Copy-paste into a generic translator Placeholders and HTML get damaged
Email .po files to a contractor Feedback loops get slow and context gets lost
Use a portal outside Git Changes become harder to review and audit
Translate everything manually The release slips, or strings stay untranslated

That’s the context for the rest of the discussion. In Django, the definition of translation only matters if it maps to how you ship code.

The Formal Definition of Translation and Its Limits

The formal definition is still useful. In automated systems, translation is the transformation of text from a source language into semantically equivalent and grammatically correct text in a target language. In statistical machine translation, that was modeled as p(e|f), the probability that a target string is the correct translation of a source string, as described in the Canadian NRC overview of statistical machine translation.

That definition is clean. It’s also incomplete for software.

Translation, localization, and transcreation are not the same job

For Django teams, it helps to separate three different concerns:

If you want a tighter vocabulary for these terms, TranslateBot’s glossary of translation and localization terms is a decent reference.

Here’s the practical split:

Term What you change Django example
Translation Words and phrasing msgid "Sign in" to a locale-specific msgstr
Localization Product behavior and presentation Date formats, locale-specific copy, regional payment labels
Transcreation Tone and persuasive intent Homepage headline or ad copy rewritten for a market

Why the formal definition breaks down in code

A generic definition assumes text is just text. Your .po file proves otherwise.

Consider this string:

msgid "Hello %(name)s, your invoice is ready."
msgstr ""

A linguistically strong translation that removes %(name)s is wrong. A natural-sounding translation that wraps the wrong part of an HTML string is wrong. A polished translation that ignores product terminology is wrong.

Translation in software has two targets. Meaning for the user, structure for the program.

That’s the missing half in most public definitions. For a Django app, translation sits inside internationalization and localization, but it still has to obey technical constraints that ordinary prose doesn’t.

A Practical Comparison of Translation Methods

You have three common ways to get strings translated. None is universally best. The right one depends on what you’re translating, how often strings change, and how much process your team can tolerate.

A comparison chart outlining the pros and cons of human, machine, and crowdsourcing translation methods.

Human translators

Human translators still win when nuance is the product.

That includes:

What doesn’t work well is using a fully manual process for fast-moving product strings. Sending .po files around by email gets old fast, especially when labels change every sprint.

Traditional TMS platforms

A translation management system gives you workflow, review states, and a shared portal. That can be a good fit when multiple stakeholders need to coordinate.

The trade-off is workflow gravity. Your strings leave the repo, translators work in another interface, and engineering often gets opaque updates back. For some teams, that’s fine. For small Django teams, it often feels heavier than the problem.

AI translation APIs

Modern AI-based translation is the fastest option for high-volume UI strings and support copy. It’s a direct descendant of older machine translation work. Statistical machine translation used large bilingual corpora and Bayes’ theorem to find the most probable target string, and it dominated the field by the early 2000s before newer model families took over, as outlined in this history of SMT and machine translation research.

The practical upside is obvious. You can translate changed strings quickly and keep the process near your codebase.

The quality trade-offs are also obvious:

If you’re already thinking about AI in build pipelines and code-adjacent workflows, Wezebo's insights on AI development are useful background reading.

For a broader taxonomy of translation categories, including where software work sits, this overview of different types of translation is handy.

Side-by-side trade-offs

Method Speed Workflow fit for Django Typical strengths Typical failure mode
Human translation Slower Weak unless tightly integrated Nuance, tone, domain judgment Bottlenecks and file handoffs
TMS Moderate Mixed, depends on your team Review workflow, collaboration Portal overhead, opaque updates
AI translation API Fast Strong with CLI and Git Volume, iteration speed, low friction Context loss, terminology inconsistency

Use humans when words are the product. Use automation when release cadence is the problem.

How Translation Applies to Django and PO Files

In Django, translation becomes concrete inside the .po file. That’s where the abstract idea of preserving meaning meets the less glamorous job of preserving syntax.

A conceptual hand-drawn diagram illustrating the Django application translation process between msgid and msgstr fields.

A .po file is not just text

Django extracts translatable strings with tools like makemessages. The result contains more than visible copy.

You’ll see context, plural forms, and formatting markers that your app depends on:

#: app/views.py:41
#, python-format
msgid "Hello %(name)s"
msgstr "Bonjour %(name)s"

#: app/templates/orders.html:12
msgid "%(count)s item"
msgid_plural "%(count)s items"
msgstr[0] "%(count)s article"
msgstr[1] "%(count)s articles"

#: app/forms.py:27
msgctxt "button label"
msgid "Save"
msgstr "Enregistrer"

#: templates/account/reset.html:9
msgid "<strong>Password</strong> is required."
msgstr "<strong>Le mot de passe</strong> est requis."

Those pieces aren’t decoration. They define how the string behaves in the app.

Structural integrity is part of the translation

In software localization, 60-70% of rework comes from context corruption rather than plain mistranslation, including broken placeholder syntax like %(name)s, inconsistent terminology, and lost domain intent, according to Phrase’s discussion of translation failure modes in software.

That tracks with what most Django teams see in practice. A string can be linguistically acceptable and still be unusable.

The safe mental model is:

For a deeper walkthrough of the file format itself, this guide to the gettext .po file format is worth bookmarking.

Django-specific examples that bite teams

A few patterns cause repeated trouble:

Pattern Why it’s risky What good output looks like
Short labels No context for tense or register Use msgctxt where needed
Plurals Language rules differ sharply Keep plural blocks valid for the locale
Interpolated strings Runtime breakage if placeholders change Preserve every placeholder exactly
Embedded HTML Broken markup or unsafe rendering Keep tags intact and in valid order

Later in the workflow, visual review helps. If your team also handles multimedia localization, ShortsNinja's top localization tools is a useful roundup of adjacent tooling, especially when translated UI and translated media need to stay consistent.

A quick video primer helps if you’re explaining this to teammates who are not well-versed in gettext yet:

A correct translation that crashes at runtime is still incorrect.

Common Translation Challenges and Quality Checks

Most translation defects in Django projects are boring. That’s good news, because boring defects are testable.

Short strings without context

“Save”, “Open”, “Close”, “Back”, “Home”. These are notorious because one English word can map to different parts of speech or different levels of formality.

What works:

What doesn’t work is assuming the model or translator can infer every UI state from one isolated token.

Placeholders and formatting

Technical translation needs subject matter expertise. Translators working with .po files have to understand placeholders like %(name)s, and weak handling here causes terminology inconsistency and CI/CD breakage, as discussed in this technical translation analysis from Stoquart.

You can catch most of that with mechanical checks.

msgid "Welcome back, %(name)s."
msgstr "Bon retour, %(name)s."

Good.

msgid "Welcome back, %(name)s."
msgstr "Bon retour."

Bad. It reads fine and still breaks the contract.

Plurals, gender, and locale-specific grammar

Plural forms are where “good enough” falls apart quickly.

A language may need different forms depending on the count, and UI strings often hide agreement problems until you render them with real values. Gendered languages add another layer when labels refer to users, owners, or actors without enough context.

Use a review checklist that includes:

Review habit: test translated screens with realistic data, not lorem ipsum and not empty state screenshots.

Fuzzy entries and drift across releases

Another trap is carrying old translations forward after the English source changed. Django marks some entries as fuzzy, and teams ignore them until support tickets arrive.

A professional workflow treats translation quality as a series of verifiable checks, not a vague feeling.

python manage.py compilemessages

If compile fails, that’s a structural problem. If compile passes, you’re not done. You still need a product review for tone, context, and terminology.

Building a Modern Translation Workflow in Git

For most Django teams, the best workflow is the one that stays close to the repo.

You extract strings, translate only what changed, commit the .po updates, review the diff, then compile before deploy. That keeps translation where the rest of your engineering process already lives.

The Git-first loop

A practical flow looks like this:

python manage.py makemessages -l fr
python manage.py translate --locale fr
python manage.py compilemessages

Then:

Modern DevOps pushes translation toward deterministic, auditable workflows. In Git-based teams, outputs need to be reviewable diffs, and the process needs to be reproducible so the same command yields the same artifact trail, as noted in the Wikipedia discussion of translation and evolving workflow expectations.

Why portal-first workflows keep fighting engineering teams

Portals aren’t automatically bad. They’re just often a mismatch for small teams shipping from GitHub or GitLab every day.

When translation happens outside the repo, you lose:

If your team is still choosing where that workflow should live, this GitHub vs GitLab comparison from Toolradar is a useful side read because the translation process usually ends up following the conventions of your primary platform.

What to run before your next deploy

Keep it lean:

  1. Extract new strings.
  2. Translate changed or untranslated entries.
  3. Review locale diffs in the pull request.
  4. Compile messages in CI.
  5. Spot check key screens in the target locale.

That’s the developer answer to what is the definition of translation. It’s not just language transfer. In a Django codebase, it’s meaning plus structure, inside a workflow your team can repeat without surprises.


If you want that workflow without a translation portal, TranslateBot is built for it. It runs as a Django management command, writes directly to your .po files, preserves placeholders and HTML, and keeps the whole process in Git where your team can review it.

Stop editing .po files manually

TranslateBot automates Django translations with AI. One command, all your languages, pennies per translation.