Private gettext release preflight

PO / POT Translation Catalogue QA & Diff

Check gettext syntax, headers, plural rules, indexed translations, format placeholders, fuzzy and untranslated entries, obsolete records, and key drift. Compare a translation against a POT template or another catalogue without uploading either file.

Catalogue inputs

Open the catalogue to release

No current file selected.

No reference file selected.

Each file is limited to 24 MiB. UTF-8, BOM-marked UTF-16, US-ASCII, Windows-1252, ISO-8859-1/2, Windows-1250, and KOI8-R are decoded locally using header evidence. The current filename distinguishes an intentionally empty .pot template from an untranslated .po.

Paste or choose the current catalogue.

Private by design: catalogue text, translations, filenames, headers, comparison data, and reports stay in this browser tab. Nothing is uploaded or fetched.

What this gettext catalogue audit checks

The bounded parser reads translator, extracted, reference, flag, previous-source, and obsolete comments; contexts; singular and plural IDs; indexed translations; and continued C-style strings. It checks duplicate keys, required header evidence, declared charset, fuzzy and untranslated states, plural-form indexes, obsolete records, and flagged printf, Python mapping, Python/C# brace, Java, and common template placeholders. A POT filename is treated as a source template, so deliberately empty template translations do not become false release warnings.

How the catalogue diff works

Keys are matched by the exact pair of msgctxt and msgid. A reference POT therefore exposes strings that the current PO is missing and stale current-only keys; an older PO exposes additions and removals. Shared rows separately report plural-source, flag, reference, and translation changes. Previous #| msgid evidence links likely source renames, but the tool never assumes that two unmatched strings mean the same thing.

Plural and placeholder safety

The Plural-Forms expression is parsed with a small C-like expression grammar and sampled from zero through 200 plus larger values; it is never passed to eval. Every result must be an integer within the declared nplurals range, and translated plural entries must supply each required index. Placeholder checks are driven by gettext format flags, because ordinary percent signs and braces are not automatically program arguments.

Release and conformance boundary

This is a structural release-QA assistant, not complete GNU gettext or linguistic conformance testing. It does not compile MO files, invoke msgfmt or msgmerge, rewrite or merge catalogues, validate every language tag or date convention, interpret every programming-language format dialect, judge translation quality, or prove application compatibility. Run the project’s actual gettext toolchain and tests before release.

Frequently asked questions

Which file belongs in the reference box?

For release coverage, use the current POT template as the reference and the translated PO as current. To review translator changes, use the newer PO as current and the older PO as reference.

Are obsolete entries release failures?

No. They are counted as stale catalogue history, but are not active keys and do not affect coverage. You may still remove them with trusted gettext tooling if your project policy requires it.

Why can a valid catalogue still show warnings?

Fuzzy entries, untranslated PO keys, missing useful metadata, and source-placeholder differences need human review even when the file is parseable. The report separates those warnings from structural errors.

Authoritative gettext references

The GNU gettext PO Files guide defines catalogue entries, flags, headers, contexts, and obsolete records. The plural translation guide explains indexed translations and the Plural-Forms header. GNU’s complete gettext manual documents the release tools and format checks that should follow this browser preflight.

Audit XLIFF packages · Audit TMX memories · Browse localization tools