gettext .po
gettext · .po / .pot · 46 languages · Free

Translate your .po files, with the plurals actually correct

Drop in your django.po or messages.pot. KAERIS translates all 46 languages, writes the correct Plural-Forms for each target (Russian gets 3 forms, Arabic 6, Chinese 1), keeps msgctxt entries distinct, and reads every string back so you catch meaning drift before it ships.

Translate your file → $ pip install kaeris
Correct Plural-Forms per language msgctxt kept distinct %s / %(name)s preserved Header round-trips No account needed
What breaks in gettext .po — and how KAERIS handles it

Plurals that compile

English has 2 plural forms; Russian and Polish have 3, Arabic has 6. Most tools copy the source's 2 slots and produce a .po that msgfmt rejects. KAERIS writes the right nplurals and formula for the target and expands the msgstr slots to match.

Context that doesn't collide

Two msgid "Open" with different msgctxt are different strings. KAERIS keys them separately so one never silently overwrites the other.

Headers you keep

Project-Id-Version, Language-Team and your X- headers survive the round-trip — only Language and Plural-Forms are rewritten for the target.

Real gettext .po, round-tripped

Before → after

messages.po (en)
msgid "one file"
msgid_plural "%d files"
msgstr[0] "one file"
msgstr[1] "%d files"
messages.po (ru)
"Plural-Forms: nplurals=3; …"
msgid "one file"
msgstr[0] "%d файл"
msgstr[1] "%d файла"
msgstr[2] "%d файлов"
From file to shipped in 3 steps
1

Drop your .po file

Upload it as-is, or run pip install kaeris and translate from your terminal or CI.

2

Pick languages & verify

Choose from 46 languages. Leave read-back on to catch meaning drift, lost placeholders and overflow.

3

Ship the .po back

Download one .po per language, structure intact — or let the GitHub Action open a PR when new keys land.

Translate your .po now

Free, no account. Read every line back in your own language.

Drop your .po file →

See the read-back benchmark · CLI & GitHub Action