Gettext PO/POT localization with AI

GNU gettext .po and .pot catalogs with msgctxt, plurals and translator comments.

.po.potformat: gettext-poone file per locale

What it is

Gettext is the standard for C, Python (Django, Babel), PHP (WordPress), Ruby and many Linux projects. A .pot template holds the source; one .po per locale holds translations.

Example

locale/es/LC_MESSAGES/messages.po
#. Shown after a successful upload#: app/views.py:42msgctxt "upload"msgid "Saved %(count)d file"msgid_plural "Saved %(count)d files"msgstr[0] ""msgstr[1] ""

How Glossa handles it

Plurals
msgid_plural entries become plural entries; each msgstr[n] index is mapped to the CLDR plural category it stands for in that locale, so translations land in the right slot.
Comments and context
Extracted (#.) and translator (#) comments become context; references (#:) are kept.
Placeholders
Python %(name)s, printf %d and brace {name} placeholders are protected.
Round trip
msgctxt is part of the key, so the same msgid with different contexts stays separate and never dedupes by accident.

Translate it from the command line

Push the source-language file; strings are deduplicated against the rest of your workspace and queued for translation. Pull writes locale/es/LC_MESSAGES/messages.po back in the same format.

npx @meterapp/glossa loginnpx @meterapp/glossa push locale/es/LC_MESSAGES/messages.po --project appnpx @meterapp/glossa pull --project app --locale es,de,ja

Or ask an agent over MCP: “Push locale/es/LC_MESSAGES/messages.po to Glossa and pull Spanish.” It calls push_file and pull_file. See the CLI and MCP guides.

Other formats

Moving from Crowdin? Read the comparison.

Push your first file

Glossa is free for one app. Sign in, push a translation file, and pull it back in every language.