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
- Drag a .po or .pot file onto the box, or click to browse for one.
- Read the progress bar and the translated, untranslated, and fuzzy counts.
- 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
File Type Identifier
Find out what a file really is from its magic bytes, not its extension. Detects images, audio, video, archives, fonts, and more in your browser. Private.
CSV File Inspector
Inspect a CSV file in your browser: detect the delimiter, encoding and BOM, count rows and columns, guess the header, and preview sample rows. Private.
Strings Extractor
Extract readable text from any binary file in your browser, like the Unix strings command. See each printable run with its byte offset, set a minimum length.
Base64 File Encoder
Encode any file to Base64 and a data URI in your browser. Drop a file to get the raw Base64 and a ready data: URI to copy. Nothing is uploaded.
CBOR Decoder
Decode a CBOR file (RFC 8949) to readable JSON in your browser. Handles integers, byte strings, arrays, maps, tags, and floats. Nothing is uploaded.
ELF Header Inspector
Drop a Linux or Unix binary to read its ELF header: 32 or 64-bit, endianness, file type, CPU architecture, OS ABI and entry point. Runs in your browser.