diff options
Diffstat (limited to 'doc/developer')
-rw-r--r-- | doc/developer/localize.rst | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/doc/developer/localize.rst b/doc/developer/localize.rst new file mode 100644 index 0000000..c345c3e --- /dev/null +++ b/doc/developer/localize.rst @@ -0,0 +1,134 @@ +Localizing Fietsboek +==================== + +Most of the localization in Fietsboek is done using the `gettext +<https://www.gnu.org/software/gettext/>`__ machinery to provide translated +messages. Additionally, `Babel <https://babel.pocoo.org/en/latest/>`__ is used +to provide localized number and date formatting. + +In addition to ``gettext``-based messages, some longer texts are also provided +as stand-alone files in their respective language directories. + +The ``gettext`` Machinery +------------------------- + +The ``gettext`` machinery depends on three files: + +The ``.pot`` files are the template files that contain all the messages that +need to be translated. They are generated by walking through the source code +and finding marked translation strings. + +The ``.po`` files are translations, initialized from the ``.pot`` template. For +every language, a ``.po`` file contains the translated messages and can be +edited by the translator. + +Finally, the ``.mo`` files are compiled versions of the ``.po`` files, intended +to be more efficient. + +Extracting Messages +------------------- + +.. note:: + + This section can be skipped if you only intend on creating a new + translation. It is only important if you introduce new features with new + messages to the code. + +If you introduce new messages in Fietsboek, it is important to regenerate the +``.pot`` template. Only then can translations for your messages be added. + +In order to do so, use the :program:`pybabel` binary: + +.. code:: bash + + .venv/bin/pybabel extract -F babel.cfg -o fietsboek/locale/fietslog.pot --input-dirs=fietsboek + +The :file:`Makefile` contains a shortcut for this command: + +.. code:: bash + + make babel-extract + +Creating a New Language +----------------------- + +If you want to add a translation for a language that does not yet exist, first +generate the ``.po`` file containing the messages using :program:`pybabel`: + +.. code:: bash + + # Replace LOCALE with the locale name, for example "nl" or "fr" + .venv/bin/pybabel init -d fietsboek/locale -l LOCALE -i fietsboek/locale/fietslog.pot + +Again, there is a shortcut in the :file:`Makefile`: + +.. code:: bash + + make babel-init LOCALE=nl + +This will create the directory :file:`fietsboek/locale/{language}`. + +Finally, you need to copy the non-gettext messages. This is best done by +copying over the english original texts: + +.. code:: bash + + # Replace nl with the locale that you just generated + cp -r fietsboek/locale/en/html fietsboek/locale/nl/ + +Updating a Language +------------------- + +When features and messages get added to Fietsboek, it is important to keep the +message catalogues up to date: + +.. code:: bash + + # Replace nl with the locale that you want to update + .venv/bin/pybabel update -d fietsboek/locale -l nl -i fietsboek/locale/fietslog.pot + +This ensures that every message from the template is also present in the +language's message catalogue, ready for translation. + +Alternatively, you can also use the shortcut again: + +.. code:: bash + + make babel-update LOCALE=nl + +Translating +----------- + +Once you have the ``.po`` file generated (either by initializing a new language +or by updating an existing one), it is time to actually translate messages. +This is done by editing the +:file:`fietsboek/locale/{language}/LC_MESSAGES/messages.po` file. This can be +done either by using a standard text editor, or by using a specialized tool +like :program:`poedit`. + +After translating the messages, the files in +:file:`fietsboek/locale/{language}/html` should also be translated. For this, a +text editor or a HTML editor can be used. + +Compiling the Messages +---------------------- + +To generate the machine readable message format, the message catalogue has to +be compiled: + +.. code:: bash + + # Replace nl with the locale that you want to compile + .venv/bin/pybabel compile -d fietsboek/locale -l nl -i fietsboek/locale/nl/LC_MESSAGES/messages.po + +Or using the shortcut: + +.. code:: bash + + make babel-compile LOCALE=nl + +Further Reading +--------------- + +* The Pyramid documentation: `Internationalization and Localization + <https://docs.pylonsproject.org/projects/pyramid/en/latest/narr/i18n.html>`__ |