feat: add language switching to admin and merchant frontends
Some checks failed
CI / ruff (push) Successful in 10s
CI / pytest (push) Failing after 46m27s
CI / validate (push) Successful in 23s
CI / dependency-scanning (push) Successful in 29s
CI / docs (push) Has been skipped
CI / deploy (push) Has been skipped

- Add cookie to ADMIN resolution chain (cookie → user_pref → "en")
- Add explicit MERCHANT resolution (cookie → user_pref → "fr")
- Add language selector dropdown to admin and merchant headers
- Add languageSelector() function to merchant init-alpine.js
- Add flag-icons CSS and i18n.js setup to merchant base template
- Add compact flag-based language selector to both login pages
- Make lang attribute dynamic on all base and login templates
- Pass current_language to login route template context
- Update architecture doc with ADMIN/MERCHANT resolution priorities

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-24 10:26:57 +01:00
parent 0389294b1a
commit 6c78827c7f
11 changed files with 219 additions and 17 deletions

View File

@@ -38,10 +38,11 @@ class LanguageMiddleware(BaseHTTPMiddleware):
Middleware to detect and set the request language.
Sets request.state.language based on context:
- Admin: Always English (for now)
- Store dashboard: User preference → Store dashboard_language → default
- Admin: Cookie → User preference → English
- Merchant: Cookie → User preference → Platform default
- Store dashboard: Cookie → User preference → Store dashboard_language → default
- Storefront: Customer preference → Cookie → Store storefront_language → browser → default
- API: Accept-Language header → default
- Platform: Cookie → Browser → Platform default
"""
async def dispatch(self, request: Request, call_next) -> Response:
@@ -61,9 +62,9 @@ class LanguageMiddleware(BaseHTTPMiddleware):
# Resolve language based on frontend type
if frontend_type == FrontendType.ADMIN:
# Admin dashboard: respect user's preferred language
# Admin dashboard: cookie → user preference → English default
user_preferred = self._get_user_language_from_token(request)
language = user_preferred or "en"
language = cookie_language or user_preferred or "en"
elif frontend_type == FrontendType.STORE:
# Store dashboard
@@ -90,6 +91,11 @@ class LanguageMiddleware(BaseHTTPMiddleware):
enabled_languages=enabled_languages,
)
elif frontend_type == FrontendType.MERCHANT:
# Merchant portal: cookie → user preference → platform default
user_preferred = self._get_user_language_from_token(request)
language = cookie_language or user_preferred or DEFAULT_LANGUAGE
elif frontend_type == FrontendType.PLATFORM:
# Platform marketing pages: Use cookie, browser, or default
language = cookie_language or browser_language or DEFAULT_LANGUAGE