Language Packs

Fietsboek allows language files to be distributed as third-party-packages, such that you can localize Fietsboek without needing to add the files to the main repository. This way, language packs can be updated independently of Fietsboek, and packs can be provided for languages that are not “officially supported”.

The basic concept behind language packs is the same as in normal localization, except that the files are in a different Python package. If you are familiar with the gettext machinery, you can simply create a Python package that has a locale/ folder in the same structure as Fietsboek’s.

In the following guide, we will create an example language pack for Dutch ("nl").

Preqrequisites

In order to create a translation package, you need access to the source code of Fietsboek and Babel. The easiest way to get both is to clone the git repository, and use a virtual environment to install babel:

git clone https://gitlab.com/dunj3/fietsboek.git
FB_PATH=$PWD/fietsboek/fietsboek
virtualenv /tmp/babel
/tmp/babel/pip install Babel
BABEL=/tmp/babel/bin/pybabel

Creating a Package

Language packs are normal Python packages, as such, you can use any tool you’d like to create a pack — as long as you make sure to include the package data. In our example, we will use Poetry, as that is what Fietsboek itself uses.

To create a basic package, we will pick a path in which to create our pack: ~/fb-i18n-nl and create the basic structure:

PACK_PATH=~/fb-i18n-nl
mkdir -p $PACK_PATH/fb_i18n_nl
touch $PACK_PATH/fb_i18n_nl/__init__.py
mkdir $PACK_PATH/fb_i18n_nl/locale

And the content of $PACK_PATH/pyproject.toml:

[tool.poetry]
name = "fb-i18n-nl"
version = "0.1.0"
description = ""
authors = ["Jan Modaal <jan.modaal@example.com>"]
packages = [{include = "fb_i18n_nl"}]

[tool.poetry.dependencies]
python = "^3.7"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

Note

You can also use poetry new to create the basic package, just make sure to remove the unnecessary files.

Initializing the Language

This is the same process as for built-in languages, except that you need to adjust the paths:

$BABEL init -d $PACK_PATH/fb_i18n_nl/locale -l nl -i $FB_PATH/locale/fietslog.pot

You can also copy over the English HTML files, which makes it easier to translate them:

cp -rv $FB_PATH/locale/en/html $PACK_PATH/fb_i18n_nl/locale/nl

Don’t forget to adjust the locale/.../DISPLAY_NAME file to give your language pack the correct human-readable representation.

Translating & Compiling

Update the messages.po file in $PACK_PATH/fb_i18n_nl/locale/nl/LC_MESSAGES/messages.po, as well as the HTML files in $PACK_PATH/fb_18n_nl/locale/nl/html.

Once the messages have been translated, you can compile the resulting file:

$BABEL compile -d $PACK_PATH/fb_i18n_nl/locale -l nl -i $PACK_PATH/fb_i18n_nl/locale/nl/LC_MESSAGES/messages.po

Installing the Language Pack

You can install the language pack like a normal Python package:

pip install $PACK_PATH

And enable it in your settings:

fietsboek.language_packs =
    fb_i18n_nl

available_locales = en nl

Automation

If you are fine with the following default values, then you can use the provided justfile with just to automate most of the boring processes:

  • Poetry will be used

  • The pack will be saved in language-packs/fietsboek-i18n-LOCALE

  • The module name will be fietsboek_i18n_LOCALE

just create-language-pack nl
just update-language-pack nl
just compile-language-pack nl