GNU gettext PO (Portable Object)

Most widely used format for translating libre software.

Contextual info stored in the file is supported by adjusting its headers or linking to corresponding source files.

Showing source string change

Weblate can extract previous source strings from the PO files if present and show the string difference for strings needing editing based on that. To include these, msgmerge has to be executed with --previous and the resulting PO file then contains lines such as:

#, fuzzy
#| msgid "previous-untranslated-string"
msgid "untranslated-string"
msgstr "translated-string"

PO file header

The header of the PO file is automatically maintained by Weblate. Optionally it can include Source string bug reporting address and Set “Language-Team” header.

The header comments also can be updated to contain author names using Contributors in comment.

Line wrapping

The line wrapping mostly matches GNU gettext behavior. Both the wrapping algorithm in the GNU gettext and the Unicode data the wrapping is based on evolve which might cause differences in some corner cases.

The wrapping width can be configured using the po_line_wrap parameter, see File format parameters.

Generating matching MO files

In case MO files are kept in the repository together with PO files, Generate MO files can be used to keep them up-to-date with PO files.

Updating PO files from the POT file

Update PO files to match POT (msgmerge) can be used to update PO files from the POT file, see Updating target-language files.

Monolingual gettext

Some projects decide to use gettext as monolingual formats—they code just the IDs in their source code and the string then needs to be translated to all languages, including English. This is supported, though you have to choose this file format explicitly when importing components into Weblate.

Example files

The bilingual gettext PO file typically looks like this:

#: weblate/media/js/bootstrap-datepicker.js:1421
msgid "Monday"
msgstr "Pondělí"

#: weblate/media/js/bootstrap-datepicker.js:1421
msgid "Tuesday"
msgstr "Úterý"

#: weblate/accounts/avatar.py:163
msgctxt "No known user"
msgid "None"
msgstr "Žádný"

The monolingual gettext PO file typically looks like this:

#: weblate/media/js/bootstrap-datepicker.js:1421
msgid "day-monday"
msgstr "Pondělí"

#: weblate/media/js/bootstrap-datepicker.js:1421
msgid "day-tuesday"
msgstr "Úterý"

#: weblate/accounts/avatar.py:163
msgid "none-user"
msgstr "Žádný"

While the base language file will be:

#: weblate/media/js/bootstrap-datepicker.js:1421
msgid "day-monday"
msgstr "Monday"

#: weblate/media/js/bootstrap-datepicker.js:1421
msgid "day-tuesday"
msgstr "Tuesday"

#: weblate/accounts/avatar.py:163
msgid "none-user"
msgstr "None"
Supported features

File extensions

.po, .pot

Linguality

Monolingual

Supports plural

Yes

Supports descriptions

Yes

Supports explanation

No

Supports context

Yes

Supports location

Yes

Supports flags

Yes

Additional states

Needs editing

API identifier

po-mono

Supports read-only strings

No

Supported features

File extensions

.po, .pot

Linguality

Bilingual

Supports plural

Yes

Supports descriptions

Yes

Supports explanation

No

Supports context

Yes

Supports location

Yes

Supports flags

Yes

Additional states

Needs editing

API identifier

po

Supports read-only strings

No

Weblate configuration

Typical Weblate Component configuration for bilingual gettext

File mask

po/*.po

Monolingual base language file

Empty

Template for new translations

po/messages.pot

File format

Gettext PO file

Typical Weblate Component configuration for monolingual gettext

File mask

po/*.po

Monolingual base language file

po/en.po

Template for new translations

po/messages.pot

File format

Gettext PO file (monolingual)

File format parameters

File format parameters with the pattern po_* can be used to configure the behavior of the gettext format.