Free PO and XLIFF Editor
Paste a translation file to see what’s done, what needs review and which translations dropped a placeholder, entry by entry.
What is a PO and XLIFF Editor?
PO and XLIFF are the two most common file formats for software translations. PO is gettext’s plain-text catalog and XLIFF is the OASIS XML standard. This editor reads either one and shows every entry with its source, translation and state.
PO files are read following the GNU gettext manual, including context, plural forms, fuzzy flags and obsolete entries. XLIFF 1.2 and 2.0 are parsed as XML, with target and segment states mapped to the same four states. Every translation is also checked for printf and brace placeholders the source has and the translation lost.
Key Features
Coverage at a Glance
The first line of the report gives translated entries out of the total, with a percentage, plus how many need review, are missing or have placeholder problems.
A To Do List in One Click
Switch to To do and only unfinished entries remain: missing, fuzzy, needs-review and placeholder mismatches. Send that list back to a translator or work through it yourself.
Placeholder Checks
A translation that drops %s, %1$d or a named brace placeholder gets flagged before it crashes your app. Reordered positional placeholders still pass.
Errors by Line Number
Unclosed quotes, duplicate msgids, a msgstr without a msgid and plural mix-ups are reported with the line they start on, the problems msgfmt would refuse to compile.
Unreleased Text Stays Private
The catalog is read inside the browser tab. Product copy that hasn’t launched yet and client documents aren’t uploaded.
Perfect for everyone
- Developers shipping localized apps
- Localization managers checking deliveries
- Translators reviewing their own files
- WordPress
- Django and Angular teams working with catalogs
How to Use the PO and XLIFF Editor
Paste the catalog, choose All entries or To do, and read the report.
Paste a PO or XLIFF File
Paste a .po or .pot file, or an XLIFF document, into the source box, or open it from your computer. The format is detected automatically, and the Format and Language stats confirm what was read.
Choose All Entries or To Do
All entries lists every string with its state. To do keeps only the entries that still need work, which is usually what you want before a release.
Read the Coverage and the Table
The report opens with a coverage line, then one line per entry with its state, source and translation. The table adds the msgctxt or unit id and, for PO, the line number.
Fix the File and Copy It Back
Edit translations or fix errors in the source box and the report updates instantly. When it’s clean, copy the text back into your file.
Translation Files, Checked
Each catalog below went through the editor in the mode on its chip, and the answer is the exact report it produced, errors included. See if you can spot the problem first.
“msgid "Save" msgstr "Enregistrer" msgid "Open" msgstr ""”
“#, fuzzy msgid "Delete file" msgstr "Supprimer le fichier"”
“msgid "Hello, %s!" msgstr "Bonjour !"”
“msgid "%d file" msgid_plural "%d files" msgstr[0] "%d fichier" msgstr[1] ""”
“<xliff version="1.2"><file source-language="en" target-language="de"><body><trans-unit id="save"><source>Save</source><target state="translated">Speichern</target></trans-unit><trans-unit id="terms"><source>Terms & Conditions</source></trans-unit></body></file></xliff>”
“<xliff version="2.0" srcLang="en" trgLang="ja"><file id="f"><unit id="cancel"><segment state="initial"><source>Cancel</source><target>キャンセル</target></segment></unit></file></xliff>”
“msgid "Save" msgstr "Enregistrer" msgid "Save" msgstr "Sauvegarder"”
“msgid "Save" msgstr "Enregistrer”
“msgid "Close" msgid "Quit" msgstr "Quitter"”
“<xliff version="1.2"><file><body><trans-unit id="a"><source>A</source></body></file></xliff>”
How Each Format Marks Progress
PO and XLIFF record whether a string is done in different ways. These are the markers the editor reads, and what each one means for your release.
msgid and msgstr
Each PO entry pairs the source text, msgid, with its translation, msgstr. An empty msgstr means untranslated, and gettext falls back to the source text.
“What does an app show for an empty msgstr?”
The fuzzy Flag
msgmerge marks a guessed translation fuzzy when the source text changed. msgfmt skips fuzzy entries by default, so users still see the source.
“Does msgfmt compile fuzzy entries by default?”
msgctxt for Identical Text
Context separates two uses of the same words, such as Open in a menu and Open describing a status. Without it, both share one translation.
“Can two entries share a msgid?”
Plural Forms
msgid_plural adds a plural source, and numbered msgstr lines hold one translation per plural form. The header’s Plural-Forms line says how many the language needs.
“How many plural forms does Polish use in gettext?”
The Header Entry
The first entry has an empty msgid and holds metadata such as Language, Content-Type and Plural-Forms. It isn’t a string to translate.
“Which entry carries the Language line?”
Obsolete Entries
msgmerge comments out strings removed from the code by starting their lines with #~. They’re kept for reuse but never compiled.
“Are obsolete entries compiled into the .mo file?”
XLIFF 1.2 Target States
Each trans-unit holds a source and an optional target, whose state attribute tracks progress. Values such as needs-review-translation mean someone should check it.
“Which states mark a finished XLIFF 1.2 target?”
XLIFF 1.2 approved
The approved attribute on a trans-unit records sign-off. When it says yes, this editor treats a review state as done.
“What does approved set to yes mean?”
XLIFF 2.0 Segments
Version 2.0 replaced trans-unit with unit and segment, and moved state onto the segment. Its four values are initial, translated, reviewed and final.
“Which XLIFF 2.0 state means unfinished?”
Placeholders Must Survive
Placeholders such as %s and %1$d are filled in by code at run time, so a translation must keep every one. Their order may change, which is why positional numbering exists.
“Is %2$d %1$s a valid translation of %1$s %2$d?”
Where PO and XLIFF Files Come From
Knowing which tool wrote a catalog tells you what it expects back.
gettext in C, PHP and Python
xgettext extracts strings into a .pot template, msginit and msgmerge create and update .po files, and msgfmt compiles them into binary .mo files.
WordPress Themes and Plugins
WordPress projects ship a .pot template, and translators deliver a .po and .mo pair per locale or translate on translate.wordpress.org.
Django and Flask
Django’s makemessages and Flask-Babel’s pybabel extract write one PO file per language, and compilemessages or pybabel compile turns them into .mo files.
Angular and Xcode
Angular’s ng extract-i18n writes XLIFF 1.2 or 2.0, and Xcode exports XLIFF for localization. Both expect the translated file back in the same format.
Translation Management Systems
Crowdin, Phrase, Lokalise and Weblate import and export both formats, so a catalog often makes a round trip through one of them.
Translator Desktop Tools
Translators working in Trados, memoQ or OmegaT receive XLIFF and return it with targets and states filled in. Checking states before import catches half-finished work.
Translation File Mistakes
These are the problems that make it into releases most often.
Fuzzy Means Not Shipped
A fuzzy translation looks finished in the file, but msgfmt leaves it out, so users see English. Review it and remove the flag.
Placeholders Get Dropped
Translators sometimes delete %s or a named placeholder while rewording, which garbles or crashes the screen. Check the Placeholder mismatch count before each release.
Unescaped Quotes Break PO Strings
Inside a PO string, a quote mark needs a backslash before it and a line break is written as backslash n. An unescaped quote ends the string early and breaks the file.
Duplicate msgids Stop Compilation
Two entries with the same msgid and no msgctxt make msgfmt fail. Merge them, or add a context to tell them apart.
Plural Counts Differ by Language
English has two plural forms, Japanese one and Arabic six. Copying an English plural block into an Arabic catalog leaves four forms missing.
The Header Language Must Match
A fr.po whose header says Language: de misleads tools that rely on it for plural rules. Set Language to the catalog’s real locale.
Leave Inline XLIFF Codes Alone
Codes such as x and ph mark tags and variables in the source. Deleting or renumbering them in a target breaks the rebuilt document.
Keep the File in UTF-8
PO headers declare a charset in Content-Type and XLIFF in its XML declaration. A Latin-1 file pasted as UTF-8 shows garbled accents, so convert it first.
When to Check a Translation File
Before it ships, and whenever one comes back from a translator.
Checking a Translator’s Delivery
Paste the returned file to see how much is translated, what still needs review and whether any placeholder went missing.
Finding What’s Left Before Release
Switch to To do for a list of every missing, fuzzy or mismatched entry, ready to send back or fix yourself.
Debugging a Broken PO File
When msgfmt or a build step rejects a catalog, the error here names the line and the cause: an unclosed quote, a duplicate msgid or a plural mix-up.
Reviewing an Angular or Xcode Export
Open an exported XLIFF to see each unit’s source, target and state before sending it out or importing it back.
Tracking Translation Progress
The coverage line gives a percentage you can paste into a status update or a release checklist.
Spot-Checking a Language You Don’t Speak
Even without reading the language, you can spot empty targets, untouched English and missing placeholders straight away.
Comparing a Catalog After msgmerge
Paste the old and the updated file in turn to see which entries became fuzzy or missing once new source strings arrived.