Skip to content

Command line utilities to modify Free Pascal and Lazarus .po translation files

License

Notifications You must be signed in to change notification settings

sigmdel/poutils

Repository files navigation

Free Pascal / Lazarus Po Files Utilities

Eleven command line utilities to modify PO translation files (.po extension) used by Free Pascal and Lazarus.

These tools are similar to utilities available from the generic GNU/Gettext used in the Translation Project and from Delphi specific versions (dxgettext and Gnu GetText Tools for Delphi). The difference is that the tools available here are adapted to the .po dialect used in Free Pascal / Lazarus. More on that here: On Translating Free Pascal/Lazarus Programs (ou Traduction de programmes Free Pascal/Lazarus).

Besides being tailored to handle Free Pascal / Lazarus generated PO files, the utilities differ from those provided by the GNU gettext project by their style. Each utility does a single task which cannot be modified by command line switches. Indeed, aside from file names, the utilities accept no command line switches or options. Consequently when a GNU gettext equivalent utility is given in the list below, the equivalency is only partial and it may be necessary to provide additional filters or scripts to perform the exact same action as the poxxxx utility.

It should be possible to compile the utilities for any of the Free Pascal supported targets. They have been used mostly in Linux, but some tests have been done in Windows.

Version 0.2 (June 2, 2021)

The utilities should now handle extracted and translator comments, all format flags and previous context fields which can be found in PO files generated with the GNU gettext system but which are not in PO files generated by Lazarus as far as the author knows. Translator comments added to a PO file with a translation utility such as poedit should no longer be lost if the PO file is processed with these programs. In any case, an effort has been made to avoid losing any work. In practice, this means that any file about to be overwritten is renamed and thus a backup remains available.

Warning:

The author offers no guarantee of any sort with regard to these tools.


Utilities

1. poclean

Removes any entry in a .po file that has the same reference, msgid and msgstr as an other entry.

usage:
    poclean source[.po] [output[.po]]

Purpose: Obviously, this is meant to remove redundant entries. Normally duplicates would never be created by the Lazarus gettext implementation. Use poscrub for a more aggressive action.

GNU gettext equivalent utility: msguniq.

2. pocopy

Copies all msgid to msgstr in a .po file.

usage:
    pocopy source[.po] [output[.po]]

The header entry will not be modified.

Purpose: Use this to create a translation back to the original language:

pocopy myapp.po myapp.en.po

Then it will be possible to switch back to the original language at run-time in myapp if another translation had been previously loaded.

GNU gettext equivalent utilities: msgen, msginit.

3. pofill

Fills any empty msgstr field in a .po file with the content of the corresponding msgid.

usage:
    pofill sourcefile[.po] [outputfile[.po]]

Purpose: Useful when creating a regional version of the original language, say en_GB from an implicit en template. Just copy the template to myapp.en_GB.po, translate the few msgid that would be different in the UK to the corresponding msgstr and then use the utility to fill in all the other msgstr.

GNU gettext equivalent utilities: msgfilter, msgexec.

4. poginore

Removes all entries found from a source .po file whose reference is found in a remove .po file.

usage:
    poignore source[.po] remove[.po] [output[.po]]

Purpose: The template generated by the Lazarus gettext implementation can contain entries, such as captions that will be overwritten at run-time or technical terms that do not require translations. The same could be accomplished by adding the entry reference in the Excluded box in the i18n Project Options in the Lazarus IDE.

5. poinfo

Provides information about a .po file.

usage:
    poinfo source[.po]

The utility displays the following data.

  1. Errors while reading the source file. The error checking is by no means exhaustive.
  2. Summary statistics.
  3. All entries that have a duplicate reference (which should never be allowed), a duplicate msgid, and a duplicate msgstr. Empty msgstr fields are not considered duplicates.

Example output:

$ ./poinfo bad
    1  Error: Missing leading " quote in msgstr in line 17
    2  Error: Entry 3 (stringres.mssconnected) does not have a msgstr in line 19
    ...
    8  Error: Entry 12 (stringres.smessagesent) does not have a msgstr in line 61
    9  Error: Reference empty in line 66

Source: bad`.po`
Errors: 0
Entries: 75 plus a header
Ambiguous entries: 1
Missing references: 0
Duplicate references: 2
Empty msgids: 0
Duplicate msgids: 5
Empty msgstrs: 0
Duplicate msgstrs: 5
Fuzzys: 0
prevmsgids: 0

Entry 6 () has a duplicate reference
    ... 
Entry 47 (tbrokereditform.label2.caption) has a duplicate msgstr

6. pomerge

Merges two .po files.

usage:
    pomerge source[.po] more[.po] [output[.po]]

The output .po file is constructed as follows.

  • All entries in source are copied to output.
  • All entries in more with a reference not in source are added to output.
  • If an entry in more has a reference that is also in source then the possible conflict is resolved as follows:
    • if the msgid and msgstr of both entries are the same, the entry is not added to output and it is removed from more (there is no conflict).
    • if there is a difference inmsgid or msgstr, the entry is not added to output and if is kept in more (there is a conflict).
  • At the end, all remaining entries in more are saved under the name more.po.conflicts.

GNU gettext equivalent utility: msgmerge.

7. poscrub

Removes any entry in a .po file that has the same reference, msgid and msgstr as an other entry. Also removes all fuzzy flags and all prevmsgid fields.

usage:
    poscrub source[.po] [output[.po]]

Use poclean for a less aggressive action.

8. posort

Sorts a .po file by reference.

usage:
    posort source[.po]  [output[.po]]

It is not mandatory to sort entries alphabetically, but the Lazarus IDE does generate sorted .po files.

9. postrip

Removes all translated strings in a .po file.

usage:
    postrip source[.po] [output[.po]]

The header entry in the output .po file will be

msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"

no matter if the source file had a header entry or not.

Purpose: Generate a template from a good translation.

10. poswap

Exchanges all msgid and msgstr in a .po file.

usage:
    podswap source[.po] [output[.po]]

If the msgstr field in an entry is empty, then the msgid field will not be changed.

The header entry will not be altered.

11. poupdate

Updates empty msgstr in a .po file from translations found in another .po file.

usage:
    poupdate source[.po] translations[.po] [output[.po]]

About

Command line utilities to modify Free Pascal and Lazarus .po translation files

Resources

License

Stars

Watchers

Forks

Languages