Catalog strategies#

The way flufl.i18n finds its catalog for an application is extensible. These are called strategies. flufl.i18n comes with a couple of fairly simple strategies. Usually one of the built-in strategies will be sufficient, but you can write your own strategies for finding your catalogs.

Python package strategies#

The PackageStrategy class locates catalog files from within an importable Python package’s directory. Inside the package directory, you still need the gettext standard filesystem layout of <code>/LC_MESSAGES/<application>.mo.

Note

As before these examples will use the faux xx language, and the faux messages module referred to in these examples contains the language code directories.

First import the Python package containing the message catalogs for these examples [1].

>>> import messages

By setting the $LANG environment variable, we can specify that the application translates into that language automatically.

>>> import os
>>> os.environ['LANG'] = 'xx'

Now we can instantiate a package strategy which finds its catalogs in this example’s messages Python package. The first argument is the application name, which must be unique among all registered strategies.

>>> from flufl.i18n import PackageStrategy
>>> strategy = PackageStrategy('flufl', messages)

Once you have the strategy you need, register it with the global registry. The registration process returns an application object which can be used to look up language codes.

>>> from flufl.i18n import registry
>>> application = registry.register(strategy)

The application object keeps track of a current translation context, and exports a method which you can bind to the underscore function in your module globals for convenient gettext usage.

>>> _ = application._

Now at run time, _() will always translate its string argument to the current catalog’s language.

>>> print(_('A test message'))
N grfg zrffntr

Simple strategy#

There is also a simpler strategy that uses both the $LANG environment variable, and the $LOCPATH environment variable to set things up.

>>> os.environ['LOCPATH'] = os.path.dirname(messages.__file__)

>>> from flufl.i18n import SimpleStrategy
>>> strategy = SimpleStrategy('flufl')
>>> application = registry.register(strategy)

>>> _ = application._
>>> print(_('A test message'))
N grfg zrffntr

Calling with zero arguments#

Strategies should be prepared to accept zero arguments when called, to produce a default translation (usually the gettext.NullTranslations).

>>> def get_gettext(strategy):
...     catalog = strategy()
...     return catalog.gettext

>>> print(get_gettext(
...     SimpleStrategy('example'))('A test message'))
A test message

>>> print(get_gettext(
...     PackageStrategy('example', messages))('A test message'))
A test message