— Developer Tools

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.

— Samples
Format PO (gettext)Language frEntries 5To do 3Valid
Live

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.

1

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.

2

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.

3

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.

4

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.

Worked Examples

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.

REF_001Translated and missing

“msgid "Save" msgstr "Enregistrer" msgid "Open" msgstr ""”

REF_002Fuzzy entry

“#, fuzzy msgid "Delete file" msgstr "Supprimer le fichier"”

REF_003Lost placeholder

“msgid "Hello, %s!" msgstr "Bonjour !"”

REF_004Plural form missing

“msgid "%d file" msgid_plural "%d files" msgstr[0] "%d fichier" msgstr[1] ""”

REF_005XLIFF 1.2, To do

“<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 &amp; Conditions</source></trans-unit></body></file></xliff>”

REF_006XLIFF 2.0, initial state

“<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>”

REF_007Duplicate msgid

“msgid "Save" msgstr "Enregistrer" msgid "Save" msgstr "Sauvegarder"”

REF_008Unclosed quote

“msgid "Save" msgstr "Enregistrer”

REF_009msgid without msgstr

“msgid "Close" msgid "Quit" msgstr "Quitter"”

REF_010Unclosed XLIFF tag

“<xliff version="1.2"><file><body><trans-unit id="a"><source>A</source></body></file></xliff>”

State Guide

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.

01 / MSGID

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?”

02 / THE

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?”

03 / MSGCTXT

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?”

04 / PLURAL

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?”

05 / THE

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?”

06 / OBSOLETE

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?”

07 / XLIFF

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?”

08 / XLIFF

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?”

09 / XLIFF

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?”

10 / PLACEHOLDERS

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.

Tip 01

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.

Tip 02

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.

Tip 03

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.

Tip 04

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.

Tip 05

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.

Tip 06

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.

Tip 07

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.

Tip 08

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.

Frequently Asked Questions