Translations

All text in the source code must be written in English and come with a German translation using Django’s translation system. This means every user-visible string must be wrapped in a translation function such as _("...") or gettext("..."), and a corresponding German translation must be provided in the .po files under locale/de/.

Generating translation files

After adding or changing translatable strings, the translation files need to be regenerated. There are two ways to do this depending on your development setup.

Using the development Docker environment

If the development Docker environment is running, use:

make dev translate

Using uv

To run the translation step directly without Docker, use:

make uv translate

This requires the project dependencies to be installed first. See Alternative: Using uv without Docker for details.

After running either command, open the updated .po files and fill in the German translations for any newly added strings.

Fuzzy markers

Django’s makemessages command may mark some strings as fuzzy when it detects that an existing translation is close but not exact. Fuzzy translations are not used at runtime and must not remain in the committed .po files. Remove the #, fuzzy marker and verify the translation is correct before committing.

Continuous integration enforces that no fuzzy markers are present. See Continuous Integration for details.