Translate django.po without breaking a single %(name)s
Upload locale/en/LC_MESSAGES/django.po, pick locales, and get back one .po per language — msgid/msgstr pairs translated 1:1, %(name)s Python interpolation left 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() plural-form entries are a separate catalog structure this pass doesn't rewrite yet — keep those in your source language for now, or translate each plural branch's msgstr[N] value by hand.
%(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.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