Translate a PO or POT file online, with plurals and context handled
Upload a .pot template or a partly translated .po file and get a .po back with every empty msgstr filled. msgid and msgctxt never change, comments and references stay, and plural entries get as many forms as the target language needs. The first strings are free without an account; the whole file, up to 5,000 strings, is $5, paid once.
- Empty and fuzzy entries are translated; entries you already translated are kept
- msgid_plural entries get msgstr[0], msgstr[1] … for the target language, with Plural-Forms in the header
- msgctxt, translator comments (#.) and references (#:) are sent as context and kept in the file
- php-format, c-format and python-format placeholders checked in every string
- Works for WordPress plugins and themes, Django, Python, PHP and C projects
{
"home.greeting": "Good morning, {name}Buenos días, {name}",
"home.nearby": "{count, plural, =0 {No trails near you yet} one {# trail near you} other {# trails near you}}{count, plural, =0 {Aún no hay rutas cerca de ti} one {# ruta cerca de ti} other {# rutas cerca de ti}}",
"trail.offline_done": "<b>{name}</b> is saved on this phone. You can use the map without a signal.<b>{name}</b> está guardado en este teléfono. Puedes usar el mapa sin señal.",
"trail.share_text": "I just finished {trail} with Trailbook! {km} km and {meters} m up. 🥾¡Acabo de terminar {trail} con Trailbook! {km} km y {meters} m de subida. 🥾",
"saved.empty": "You have not saved any trails yet.\nTap the heart on a trail to keep it here.Aún no has guardado ninguna ruta.\nToca el corazón en una ruta para guardarla aquí."
}
Yellow: placeholders and ICU plural syntax, checked in every string. Teal: tags, escapes and emoji, kept as written.
Same keys. Same placeholders. New language.
Only the values change. The file comes back with the same nesting and order, named es.json, and any string that loses a placeholder is asked again before it can reach your build.
Demo app made up for this page; the Spanish strings are real output from the tool, from an 85-string file.
From a POT template to a PO file
A .pot file is the list of strings a project needs translated, with every msgstr empty. Upload it, choose a language, and you get a .po with the header filled in: Language, a Plural-Forms line for that language, and UTF-8 as the charset. The file is named for the language, for example myplugin.pot becomes myplugin-de.po; rename it to what your project expects, such as myplugin-de_DE.po for WordPress, and compile it to .mo with your usual tool.
Plural forms and fuzzy entries
Languages count differently. English has two forms; Polish and Russian use three in gettext; Arabic uses six. For each plural entry the translator gets the target language's forms with example numbers ("form 1: 2, 3, 4, 22") and writes one string per form. If your .po already has a Plural-Forms header for the same language, that rule is used.
Entries marked fuzzy are translated again; the fuzzy flag and the old #| msgid lines are removed, and other flags such as php-format are kept. Obsolete #~ entries are left untouched.
How the tool works, what it costs and how your files are handled is on the Translate Localization Files page; prices for every tool are on the pricing page.
Last updated
Questions and answers
Will it overwrite my existing translations?
No. Entries that already have a msgstr and are not fuzzy are kept exactly as they are; only empty and fuzzy entries are translated.
Does it produce a .mo file?
No, it gives you the .po. Compile it with msgfmt, Poedit or your framework's command, for example wp i18n make-mo or compilemessages in Django.
Are printf placeholders safe?
Every %s, %d, %1$s and %(name)s in the msgid must be in the translation. A string that loses one is translated again; if it still fails, its msgstr stays as it was (empty, or fuzzy) and it is listed, so gettext falls back to the source text instead of showing a broken string.
How much does it cost?
The first strings are free. The whole file, up to 5,000 strings, is $5, paid once, with no subscription.