Add i18n support to the blog web UI with 4 languages (en/ru/fr/de),
80 translation keys, automatic Accept-Language detection, persistent
locale cookie, and a language switcher dropdown in the header.
- Infrastructure: TranslationService, translation dicts, convenience _()
- Presentation: locale middleware, /web/lang/{locale} switcher route
- Templates: all 9 templates use {{ _(key, current_locale) }}
- Tests: 26 tests across TranslationService, locale detection helpers
- Docs: TEST_MODEL.md and FEATURE_INFRASTRUCTURE.md updated with TC-UNIT-811-821
Error handlers had a separate Jinja2Templates instance without the _
global function, causing UndefinedError when rendering base.html
(which now calls {{ _(key, current_locale) }}).
- Register _() from translator module as Jinja2 global on error_handlers templates
- Add current_locale to get_template_context() from request.state.locale
pi3c
merged commit 391ecaa4b0 into dev2026-05-10 14:19:08 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Add i18n support to the blog web UI with 4 languages (en/ru/fr/de), 80 translation keys, automatic Accept-Language detection, persistent locale cookie, and a language switcher dropdown in the header. - Infrastructure: TranslationService, translation dicts, convenience _() - Presentation: locale middleware, /web/lang/{locale} switcher route - Templates: all 9 templates use {{ _(key, current_locale) }} - Tests: 26 tests across TranslationService, locale detection helpers - Docs: TEST_MODEL.md and FEATURE_INFRASTRUCTURE.md updated with TC-UNIT-811-821Error handlers had a separate Jinja2Templates instance without the _ global function, causing UndefinedError when rendering base.html (which now calls {{ _(key, current_locale) }}). - Register _() from translator module as Jinja2 global on error_handlers templates - Add current_locale to get_template_context() from request.state.locale