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