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,jaOr 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
Xcode String CatalogFlutter ARBJSON (key/value, i18next)YAML (Rails i18n)Apple .stringsApple .stringsdictAndroid strings.xmlXLIFF 1.2 / 2.0Java .properties.NET RESXCSV / TSV (multi-locale)
Moving from Crowdin? Read the comparison.