Translate a Django App into English
To translate a Django app into English, you translate the <code>locale/en/LC_MESSAGES/django.po</code> file produced by <code>makemessages</code>, then compile it with <code>compilemessages</code>. Manuce fills in the English <code>msgstr</code> values without touching the <code>msgid</code> lines, checks <code>%(name)s</code> and <code>{name}</code> placeholders, and returns the same file with a report.
What it costs
For the language files of a Django app totalling about 3,000 words, into English:
To understand, internal use.
Ready to send, by the technical specialist.
Cross-checked. For documents that commit you.
Price for one language, original layout included. VAT not applicable — article 293 B of the French General Tax Code (CGI). The exact quote, based on your file's word count, is shown before you pay.
What gets translated in a Django project
Strings wrapped in gettext, gettext_lazy, ngettext, or the {% translate %} and {% blocktranslate %} template tags are extracted by makemessages into a gettext file. Each entry pairs a msgid (the string exactly as written in your code) with a msgstr (its translation). Only the msgstr is written in English; the msgid acts as the key and must stay byte-for-byte identical, or Django will no longer find the translation.
On the English side you may have two files:
django.pofor Python code and templates (models, forms,verbose_name, flash messages, emails);djangojs.po, generated withmakemessages -d djangojs, for strings served through the JavaScript catalogue.
This page assumes your source strings are in another language, such as French, German or Spanish, for example _("Ihr Warenkorb ist leer"). If your msgids are already in English, Django displays them as they are when no translation exists, and an English file is only needed to adjust wording or spelling.
Into English: plurals, placeholders and punctuation
- Plurals: English has two CLDR categories, one and other, and zero takes the plural (0 orders), unlike French, where zero is singular. Source languages with three or four forms, such as Polish or Russian, collapse to two. The English file header must read
Plural-Forms: nplurals=2; plural=(n != 1);, and eachmsgid_pluralentry needs exactly two forms,msgstr[0]andmsgstr[1]. - Word order: a German
%(count)s Dateien von %(user)s gelöschtnaturally becomes%(user)s deleted %(count)s files. Named placeholders can move freely; two anonymous%sin one string lock the order. Name them before extraction. - Punctuation: French non-breaking spaces before
:and?go, as do « » or „ “ quotation marks; Spanish opening¿is dropped.¿Olvidaste tu contraseña?becomesForgotten your password?. - Length: English usually runs 10 to 15% shorter than French, and often shorter than German. Admin columns and buttons gain room, but keep labels clear:
Save, not a cryptic abbreviation.
British or American English: a choice Django makes visible
Pick the variant before running makemessages, because it sets the locale folder. makemessages -l en_GB creates locale/en_GB/LC_MESSAGES/, matching en-gb in your LANGUAGES setting. With -l en, Django applies its generic English formats, which lean American.
- Spelling: colour or color, organise or organize, cancelled or canceled, licence as a noun in the UK.
- Dates and numbers: keep them out of your strings. With
Delivered on %(date)s, Django formats the date for the active locale (05/03/2025 in the UK, 03/05/2025 in the US). A date hard-coded inside a msgid will not be converted. - Vocabulary: postcode or ZIP code, mobile or cell phone, VAT or sales tax, depending on your market.
Check the spelling you get on the free excerpt, which shows a passage of your file translated at the chosen level before you pay.
What Manuce returns, and what it does not do
You upload your django.po (or djangojs.po) and get back the same file, in the same format, ready to drop into locale/. Indentation, entry order, quotation marks, comments (#: references, #. translator notes), line endings, encoding and any BOM are preserved; only the values change.
%(name)sand{name}placeholders are checked: every translated value is compared with its source, placeholders and tags included. If a mismatch persists, the source value is kept and the report says so.- Not translated: keys, empty values, URLs, email addresses, numbers, colours, date formats, identifiers, and anything marked as non-translatable.
- The report lists strings translated and strings left as they were, with the reason.
Manuce does not run makemessages or compilemessages, does not produce the .mo file, does not mark strings in your code and does not edit settings.py. It does not provide certified (sworn) translation either, which an interface rarely needs. For a customer-facing app, the Professional level, handled by the domain specialist, is the sensible choice.
Preparing the file and checking it afterwards
Before uploading:
- Re-run
makemessages -l en_GB(or-l en) so the file matches your current code and obsolete entries are marked#~. - Add context where a word is ambiguous:
pgettext("verb", "Archiv")versuspgettext("noun", "Archiv")tells Archive the action from Archive the place, which matters for labels such as Order or Book. - Replace multiple
%swith named placeholders.
After delivery:
- Check the
LanguageandPlural-Formsheaders. - Remove any leftover
#, fuzzyflags:compilemessagesskips fuzzy entries by default, so they would stay in the source language. - Compile, then view a page with a counter at 0, 1 and 2 to test plurals.
- Read the report and deal with any strings left in the source language.
In practice
- Run makemessages -l en_GB (or -l en) and take the generated django.po.
- Upload the file to Manuce and review the quote and the free excerpt.
- Download the translated django.po and its report, then put it back in locale/.
- Check the Plural-Forms header, clear fuzzy flags and run compilemessages.
- Test the English interface, especially plurals and long admin labels.
Frequently asked questions
Do I translate the msgid or the msgstr?
Only the msgstr. The msgid is the key linking the string in your code to its translation, and changing it breaks that link. Manuce leaves msgids untouched and only changes the values.
Is the compiled .mo file included?
No. Manuce returns the translated .po file, which you compile in your project with compilemessages. Clear any fuzzy flags first, as fuzzy entries are skipped by default.
What happens if a placeholder like %(user)s goes missing?
Every translated value is compared with its source, placeholders and tags included. If the mismatch persists, the source value is kept so nothing breaks at runtime, and the report names the string concerned.
Should I use en or en_GB?
Use en_GB if you want British spelling and UK date formats; Django maps it to the en-gb language code. Plain en gives generic English formats closer to US conventions. Decide before running makemessages, since it sets the folder name.
Can djangojs.po be translated as well?
Yes, it is a gettext file in the same format as django.po. Upload it the same way; it comes back unchanged in structure, with placeholders checked and its own report.
The specialist in charge
This subject goes to Dédale, the technical specialist. See how it works.
The same file, into another language
Into English, other files
See also
Try it on your own file, free
A sample of your file translated at the level you choose, before any payment. You judge, then you decide.