Translate django.po, then read every line back before you ship
Upload locale/en/LC_MESSAGES/django.po — KAERIS translates all 46 languages, then reads each line back to you in your own language and flags the ones worth a second look. Catch the shaky ones before release, not after. msgid/msgstr pairs stay 1:1 and %(name)s interpolation stays exactly where makemessages put it.
Run makemessages, upload the .po
django-admin makemessages -l de creates the catalog; upload django.po, or run kaeris translate locale/en/LC_MESSAGES/django.po --langs de,fr,ja.
Pick target locales
46 languages, ready to slot into locale/<lang>/LC_MESSAGES/.
Ship
Move the output into locale/de/LC_MESSAGES/django.po and run django-admin compilemessages.
Before → after
# Generated by makemessages msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" msgid "Welcome back, %(name)s!" msgstr "Welcome back, %(name)s!" msgid "Save changes" msgstr "Save changes"
# Generated by KAERIS i18n Tool — de msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" msgid "Welcome back, %(name)s!" msgstr "Willkommen zurück, %(name)s!" msgid "Save changes" msgstr "Änderungen speichern"
KAERIS translates the msgid/msgstr message strings that make up a Django catalog — the bulk of what {% trans %}/gettext() render. msgid_plural/ngettext() entries are translated too: KAERIS expands the msgstr[N] slots to the target language's gettext plural rule (Russian 3 forms, Polish, Arabic 6…) and writes the matching Plural-Forms header, so gettext selects the right form at runtime.
%(name)s interpolation preserved
Python's named string-formatting tokens are treated as literal, non-translatable content, wherever they sit inside a message.
Real .po output
Correctly escaped msgid/msgstr pairs with a valid header — msgfmt/compilemessages compile it straight to .mo.
Multi-line messages supported
Long strings split across several "..." continuation lines by makemessages are reassembled and translated as one message.
One CLI command
kaeris translate locale/en/LC_MESSAGES/django.po --langs de,fr,ja — script it after every makemessages run.
%(name)s is treated as literal, never translated or reordered..po out, not a flattened JSON export.Beyond .po, KAERIS speaks all 11 formats — JSON, YAML, .strings, .po, ARB, Android XML, CSV (incl. Godot/Unity), XLIFF, .properties, .resx and Mozilla Fluent (.ftl) — same placeholder-safe engine across your whole stack.
Ship your Django app in every market
46 languages, %(name)s-safe, gettext-native. Free to start, no account required.
$ pip install kaeris $ kaeris translate locale/en/LC_MESSAGES/django.po --langs de,fr,ja