Gettext *.PO file parser for PHP.

4.2.2 2017-09-15 10:55 UTC


Latest Stable Version Total Downloads License Build Status Code Coverage Scrutinizer Quality Score ![Gitter]( Chat.svg)

PoParser is a personal project to fulfill a need I got: parse Gettext Portable files (*.po files) and edit its content using PHP.

PoParser will allow you to read PO Data from any source (files and strings built-in), update it and store back to a file (or get the compiled string).

It supports following parsing features:

  • header section.
  • msgid, both single and multiline.
  • msgstr, both single and multiline.
  • msgctxt (Message context).
  • msgid_plural (plurals forms).
  • #, keys (flags).
  • keys (translator comments).

  • #. keys (Comments extracted from source code).
  • #: keys (references).
  • #| keys (previously untranslated), both single and multiline.
  • #~ keys (old entries), both single and multiline.


// Parse a po file
$fileHandler = new Sepia\FileHandler('es.po');

$poParser = new Sepia\PoParser($fileHandler);
$entries  = $poParser->parse();
// $entries contains every entry in es.po file.

// Update entries
$msgid = 'Press this button to save';
$entries[$msgid]['msgstr'] = 'Pulsa este botón para guardar';
$poParser->setEntry($msgid, $entries[$msgid]);
// You can also change translator comments, code comments, flags...


v5.0 (WIP)

  • Classes are now fluid.
  • Namespaces reorganized.
  • Removed fuzzy index in favour of flags.
  • Display line number on parsing errors instead of line content.
  • Adds compatibility with #~| entries.
  • parseString() and parseFile() converted to factory methods.
  • Removed method updateEntry() in favour of setEntry().


  • More PHPDocs fixes
  • Strict comparisons used where safe.
  • Fix example for writeFile.
  • Support for EOL line formatting.


  • Support multiline for plural entries (thanks @Ben-Ho)


  • Add function to add plural and context to existing entry (thanks @Ben-Ho)
  • Add ability to change msg id of entry (thanks @wildex)


  • Fixes with multi-flags entries (thanks @gnouet)


  • Constructor now accepts options to define separator used in multiline msgid entries.
  • New method getOptions().


  • new methods parseString() and parseFile() replace the old parse()`
  • new method writeFile() replaces the old write().
  • new method compile() which takes all parsed entries and coverts back to a PO formatted string.

See whole changelog


See v4 documentation


Tests are done using PHPUnit. To execute tests, from command line type:

php vendor/bin/phpunit

Install via composer

Edit your composer.json file to include the following:

    "require": {
        "sepia/po-parser": "dev-master"