## Summary Implement full internationalization infrastructure after the groundwork laid in #19. ## Design doc `docs/plans/2026-03-22-style-guide-design.md` (deferred section) ## Scope - Babel/gettext setup (`pybabel extract`, `.pot`/`.po` files) - `_()` wrapper in templates and Python route handlers - Jinja2 `format_date` / `format_number` filters (via `babel.dates`, `babel.numbers`) - Language switcher UI in topbar - Locale middleware (detect from `Accept-Language` header, fallback to `en`) - Migrate CSS to logical properties fully (started in #19 for new CSS only) - `lang`/`dir` attributes on `<html>` made dynamic ## Prerequisites - #19 (style guide groundwork — string externalization patterns, logical properties in new CSS, `lang`/`dir` documented)
Summary
Implement full internationalization infrastructure after the groundwork laid in #19.
Design doc
docs/plans/2026-03-22-style-guide-design.md(deferred section)Scope
pybabel extract,.pot/.pofiles)_()wrapper in templates and Python route handlersformat_date/format_numberfilters (viababel.dates,babel.numbers)Accept-Languageheader, fallback toen)lang/dirattributes on<html>made dynamicPrerequisites
lang/dirdocumented)