Django
Django · gettext .po · 46 languages · Free

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.

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

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.
Honest flat pricing — no per-seat, no per-language multiplier. See plans

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