### NAME POFile - Perl 6 module for manipulating data in PO files. ### SYNOPSIS use POFile; my $po = POFile.load('foo.po'); say $po.obsolete-messages; # list of obsolete messages say $result[0]; # POFile::Entry object at 0 index say $result{'Splash text'}; # POFile::Entry object with msgid `Splash text` for @$po -> $item { say $item.reference; # 'finddialog.cpp:38' say $item.msgstr; # msgstr value $item.msgstr = update($item.msgstr); # Do some update } $po.save('foo-updated.po'); ### DESCRIPTION The `.po` file as a whole is represented by the `POFile` class, which holds a `POFile::Entry` object per entry in the PO file. ##### POFile::Entry `POFile::Entry` represents a single record in PO file, and has its fields as attributes: `msgid`, `msgid-plural`, `msgstr`, `msgctxt`, `reference` (reference comment), `extracted` (extracted comment), `comment` (translator comment), `format-style`, `fuzzy-msgid`, `fuzzy-msgctxt`. All these attributes are set read/write. You can create a single `POFile::Entry` object from a `Str` using the `POFile::Entry.parse($str)` method. The `msgid` and `msgstr` accessors always provided unquoted values; the methods `msgid-quoted` and `msgstr-quoted` are present to provide access to the quoted messages. The value of `msgstr` attribute might be either `Str` or `Array`, and is based on value of `msgid-plural` attribute: with $po.msgid-plural { say $po.msgid; # Singular form say $_; # Plural form for $po.msgstr -> $form { say $form; # Every plural form of end language } } You can serialize an entry with `Str` method or its `~` shortcut: my $po-entry = $po[1]; # Get second entry say ~$po-entry; # Serialized 1 say $po-entry.Str; # Serialized 2 Note that _no line wrapping_ is done by the module. ##### POFile `POFile` provides access to `POFile::Entry` objects using either index (position in original file) or key (msgid value). It must be noted that this module provides hash-like access by msgid, which might not be unique. Please consider that _only array access_ is stable in this case. Use hash access you know _for sure_ there are no items with the same `msgid`, yet different `msgctxt`. `POFile` also contains all obsolete messages, which can be accessed using `obsolete-messages` attribute. You can create from scratch a new `POFile` object and populate it with entries, as well as delete entries by id or by key: my $po = POFile.new; $result.push(POFile::Entry.parse(...)); $result.push(POFile::Entry.parse(...)); $po[0]:delete; $po{'my msgid'}:delete; As well as `POFile::Entry`, you can serialize a `POFile` object calling `Str` method on it. ##### Escaping Additionally, two routines are available to escape and unescape strings accordingly to rules described for PO format. use POFile :quoting; say po-unquote(「\t\"\\\n」); # 「\t"\\n」 <- unquoting say po-quote(「\t"\\n\」); # 「\t\"\\\n\\」 <- quoting