PO File Support

The PO file support can read and write PO and POT files. It reads them into Catalog objects and also writes catalogs out.

babel.messages.pofile.read_po(fileobj: IO[AnyStr], locale: str | Locale | None = None, domain: str | None = None, ignore_obsolete: bool = False, charset: str | None = None, abort_invalid: bool = False) Catalog

Read messages from a gettext PO (portable object) file from the given file-like object and return a Catalog.

>>> from datetime import datetime
>>> from io import StringIO
>>> buf = StringIO('''
... #: main.py:1
... #, fuzzy, python-format
... msgid "foo %(name)s"
... msgstr "quux %(name)s"
...
... # A user comment
... #. An auto comment
... #: main.py:3
... msgid "bar"
... msgid_plural "baz"
... msgstr[0] "bar"
... msgstr[1] "baaz"
... ''')
>>> catalog = read_po(buf)
>>> catalog.revision_date = datetime(2007, 4, 1)
>>> for message in catalog:
...     if message.id:
...         print((message.id, message.string))
...         print(' ', (message.locations, sorted(list(message.flags))))
...         print(' ', (message.user_comments, message.auto_comments))
(u'foo %(name)s', u'quux %(name)s')
  ([(u'main.py', 1)], [u'fuzzy', u'python-format'])
  ([], [])
((u'bar', u'baz'), (u'bar', u'baaz'))
  ([(u'main.py', 3)], [])
  ([u'A user comment'], [u'An auto comment'])

New in version 1.0: Added support for explicit charset argument.

Parameters:
  • fileobj – the file-like object to read the PO file from

  • locale – the locale identifier or Locale object, or None if the catalog is not bound to a locale (which basically means it’s a template)

  • domain – the message domain

  • ignore_obsolete – whether to ignore obsolete messages in the input

  • charset – the character set of the catalog.

  • abort_invalid – abort read if po file is invalid

babel.messages.pofile.write_po(fileobj: SupportsWrite[bytes], catalog: Catalog, width: int = 76, no_location: bool = False, omit_header: bool = False, sort_output: bool = False, sort_by_file: bool = False, ignore_obsolete: bool = False, include_previous: bool = False, include_lineno: bool = True) None

Write a gettext PO (portable object) template file for a given message catalog to the provided file-like object.

>>> catalog = Catalog()
>>> catalog.add(u'foo %(name)s', locations=[('main.py', 1)],
...             flags=('fuzzy',))
<Message...>
>>> catalog.add((u'bar', u'baz'), locations=[('main.py', 3)])
<Message...>
>>> from io import BytesIO
>>> buf = BytesIO()
>>> write_po(buf, catalog, omit_header=True)
>>> print(buf.getvalue().decode("utf8"))
#: main.py:1
#, fuzzy, python-format
msgid "foo %(name)s"
msgstr ""

#: main.py:3
msgid "bar"
msgid_plural "baz"
msgstr[0] ""
msgstr[1] ""

Parameters:
  • fileobj – the file-like object to write to

  • catalog – the Catalog instance

  • width – the maximum line width for the generated output; use None, 0, or a negative number to completely disable line wrapping

  • no_location – do not emit a location comment for every message

  • omit_header – do not include the msgid "" entry at the top of the output

  • sort_output – whether to sort the messages in the output by msgid

  • sort_by_file – whether to sort the messages in the output by their locations

  • ignore_obsolete – whether to ignore obsolete messages and not include them in the output; by default they are included as comments

  • include_previous – include the old msgid as a comment when updating the catalog

  • include_lineno – include line number in the location comment