Translate a Django app into German
To translate a Django app into German, you translate locale/de/LC_MESSAGES/django.po, generated by makemessages, then rebuild it with compilemessages. Manuce returns that same file with its structure untouched, %(name)s and {name} placeholders checked, and a report of any strings left as they were.
What it costs
For the language files of a Django app totalling about 3,000 words, into German:
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.
The file you translate: locale/de/LC_MESSAGES/django.po
Everything starts with python manage.py makemessages -l de. Django scans your templates and Python code, collects strings marked with gettext, gettext_lazy, {% translate %} or {% blocktranslate %}, and writes locale/de/LC_MESSAGES/django.po. Each entry pairs a msgid (your source text, whatever language it is in) with a msgstr that will hold the German.
The good news for word count: the admin site and Django’s bundled apps (django.contrib.auth, form validation messages and so on) already ship with German translations. Your django.po only holds your strings: model verbose_name labels, view messages, template copy, transactional emails.
If your front end uses translated JavaScript, those strings live in a separate catalogue, djangojs.po, produced by makemessages -d djangojs -l de. Check for it before you ask for a quote, so you do not find untranslated buttons after release.
What German does to your Django strings
- Length. German typically runs 20 to 35 % longer than English, and short labels can double: “Account settings” becomes
Kontoeinstellungen, “Forgot password?” becomesPasswort vergessen?. Leave room in buttons, tabs andlist_displaycolumns; a German compound will not wrap on its own. - Capitalised nouns. Every noun takes a capital, mid-sentence included:
Ihre Bestellung wurde versandt. Avoid forcing case with CSS such astext-transform: lowercase, which turns correct German into misspelt German. - Register. Business software addresses users formally with
Sie, capitalised, as isIhr:Bitte melden Sie sich an. If your brand uses the informaldu, say so before ordering; it has to be consistent across the whole file. - Word order. Verbs often move to the end, so placeholders move too: “Delete %(count)s files” becomes
%(count)s Dateien löschen. This is why named placeholders matter; makemessages already warns about multiple anonymous%s. - Plurals. German has two forms, one and other, with zero taking the plural:
0 Dateien. Withngettext,msgstr[0]is singular andmsgstr[1]plural. If your source language has more forms or treats zero as singular, do not copy its logic. - Punctuation. No space before colons or question marks, and quotation marks shown to users are
„…“.
What Manuce returns, and what it does not do
You get back the same django.po, ready to drop into locale/de/LC_MESSAGES/: indentation, entry order, quotes, comments, line endings, encoding and BOM are preserved; only the translated text changes.
%(name)sand{name}placeholders are checked: every translated string is compared with its source, placeholders and tags included. If a mismatch persists, the source string is kept and the report says so, rather than shipping a renamed variable that breaks rendering.- Not translated: URLs, email addresses, numbers, colours, date formats, identifiers and anything you have marked as non-translatable.
- The report lists translated strings and those left unchanged, with the reason.
- The quote counts the words of the text to translate, tags excluded.
Manuce does not run compilemessages, does not touch your templates or CSS, and does not check how strings look on screen: an overlong German label is yours to catch. For German terms and conditions required by an authority, note that Manuce does not provide sworn or certified translation. For a public-facing app, the Professional level is the one intended for text ready to ship.
Prepare the catalogue and check after delivery
Before uploading:
- Run
makemessages -l deagain so the catalogue is current. - Check the header:
"Plural-Forms: nplurals=2; plural=(n != 1);\n"is the expected rule for German. - Give ambiguous words context with
pgettext: “Order” as a purchase isBestellung, “Order” as sorting isReihenfolge; “May” the month isMai, “may” the verb is not. Themsgctxtand#.comments fromTranslators:notes help settle such cases.
After delivery:
- Read the report and deal with any strings left in the source language.
- Remove leftover
#, fuzzyflags from earlier runs: by default, compilemessages skips those entries. - Run
compilemessages -l de; GNU gettext tools must be installed. - Browse the app with
deactive, focusing on the narrowest buttons, menus and admin columns.
In practice
- Generate the catalogue with makemessages -l de (plus -d djangojs if needed).
- Upload locale/de/LC_MESSAGES/django.po for an instant quote and a free one-paragraph sample.
- Download the translated django.po and the report of strings left unchanged.
- Rebuild with compilemessages -l de and check long labels on screen.
Frequently asked questions
Do I need to translate the Django admin myself?
No. The admin and Django’s bundled apps already include German translations, active as soon as the language is de. Your django.po only contains your project’s own strings, which keeps the volume down.
Sie or du: which register should my app use?
Formal Sie is the norm for business tools, customer service and most shops. Informal du appears in consumer apps with a casual tone. Decide before translation and keep it consistent throughout the file, emails included.
What happens if a %(name)s placeholder comes out wrong?
Every translated string is checked against its source, placeholders and tags included. If the mismatch persists, the source string is kept and flagged in the report, so compilemessages and rendering do not break.
Should I send the .mo file?
No, send the .po. The .mo is a compiled file that you regenerate yourself with compilemessages from the translated django.po.
How do ngettext plurals work in German?
German has two forms, singular and plural, with the rule plural=(n != 1), so zero takes the plural. Make sure your file’s Plural-Forms header matches this rule before uploading.
The specialist in charge
This subject goes to Dédale, the technical specialist. See how it works.
The same file, into another language
Into German, 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.