Boneyard Tools

Gettext PO File Parser

Drop in a Gettext .po or .pot translation catalog to see its progress at a glance: a completion bar, the counts of translated, untranslated, and fuzzy strings, the target language pulled from the header, and a table of every source string next to its translation. The file is decoded and parsed entirely in your browser and never uploaded.

How to parse a PO file

  1. Drag a .po or .pot file onto the box, or click to browse for one.
  2. Read the progress bar and the translated, untranslated, and fuzzy counts.
  3. Scan the table to find empty translations or strings still marked fuzzy.

Examples

A partly finished French catalog

fr.po with a header, 320 messages, and a few fuzzy entries
Language: fr, 248 translated, 72 untranslated, 11 fuzzy, 77.5% complete

Frequently asked questions

Is my PO file uploaded anywhere?

No. The file is decoded and parsed entirely in your browser using JavaScript. Nothing is sent to a server, so your translation work and any private strings stay on your device.

How does it run without uploading the file?

Modern browsers can read a file you drop in and hand its bytes to in-page code. The parser runs there, reads the text as UTF-8, and renders the results locally. The file never touches the network.

How does it count translated versus untranslated strings?

Every entry except the header is checked. An entry counts as translated when it has a non-empty msgstr, or for plural entries when at least one msgstr form is filled. Entries with an empty translation are counted as untranslated.

What does the fuzzy count mean?

Gettext marks an entry with a #, fuzzy flag when its translation may be out of date and needs review. The parser reports how many entries are fuzzy. Fuzzy entries are still included in the total and in the translated count if they have text.

Where do the language and other header values come from?

The first entry with an empty msgid is the catalog header. Its msgstr holds Key: value lines such as Language and Plural-Forms, which the parser splits out and displays. The header is not counted as a translatable string.

Does it handle plurals and multi-line strings?

Yes. It reads msgid_plural with its indexed msgstr[0], msgstr[1] forms, concatenates adjacent quoted continuation lines into one string, and unescapes the usual sequences like \n, \t, \" and \\.

Related tools