Django localization
Django · gettext .po · 46 languages · Free

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.

Translate your .po file → $ pip install kaeris
%(name)s interpolation preserved Real .po out, gettext-compatible Multi-line msgid/msgstr supported compilemessages-ready No account needed
Localize your Django app in 3 steps
1

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.

2

Pick target locales

46 languages, ready to slot into locale/<lang>/LC_MESSAGES/.

3

Ship

Move the output into locale/de/LC_MESSAGES/django.po and run django-admin compilemessages.

Real gettext .po, msgid and all

Before → after

locale/en/LC_MESSAGES/django.po
# 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"
locale/de/LC_MESSAGES/django.po
# 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.

Built for gettext

%(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.

Why KAERIS
Placeholder-safe%(name)s is treated as literal, never translated or reordered.
Format-native — real gettext .po out, not a flattened JSON export.
Verify-meaning QA — every string is back-translated to catch meaning drift before you ship.
No account needed — drag & drop free up to 10,000 characters, or use the CLI/API.

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
Translate your .po files now →