Tracking issue for P-039: make all user-facing UI text translatable via Django's i18n framework so the app can run in German or English without code changes.
Scaffold (done in #67)
Language switcher
Templates (~50 remaining)
Each template needs {% load i18n %} + {% trans %} / {% blocktrans %} on all UI strings, then English msgstr values in locale/en/LC_MESSAGES/django.po.
See inquiry_confirm_delete.html as the reference implementation.
Run ./dev.py i18n after wrapping each template to extract and compile strings.
Python-side (medium complexity)
Notes
- German is the primary language — DE strings stay as-is; EN needs translation in
.po files
.po source files are committed; .mo compiled files are gitignored (generated locally)
- Language switching uses a session cookie via
LocaleMiddleware — no URL prefix needed
Tracking issue for P-039: make all user-facing UI text translatable via Django's i18n framework so the app can run in German or English without code changes.
Scaffold (done in #67)
LocaleMiddleware,LANGUAGES,LOCALE_PATHSin settingsdjango.conf.urls.i18nwired upgettextin Dockerfilelocale/de/andlocale/en/directories{% load i18n %}+lang=attribute inbase.html./dev.py i18ncommandinquiry_confirm_delete.html— reference implementationLanguage switcher
Templates (~50 remaining)
Each template needs
{% load i18n %}+{% trans %}/{% blocktrans %}on all UI strings, then Englishmsgstrvalues inlocale/en/LC_MESSAGES/django.po.See
inquiry_confirm_delete.htmlas the reference implementation.Run
./dev.py i18nafter wrapping each template to extract and compile strings.Python-side (medium complexity)
messages.*()calls in views →_()wrappershelp_text→_()wrappersverbose_name/help_text→_()wrappers_()wrappersNotes
.pofiles.posource files are committed;.mocompiled files are gitignored (generated locally)LocaleMiddleware— no URL prefix needed