feat: add page shell, preferences and translations

Base layout with top bar, role-based menu, profile menu and phone layout; theme, language and German form of address kept in cookies; German formal, German informal and English text; Fluent avatar bundled in the image by a Node build stage; placeholder pages for the Publisher and Admin groups.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N3t4WL7bd9bdHHNjEsxzqC
This commit is contained in:
2026-10-17 21:05:40 +02:00
co-authored by Claude Sonnet 5.5
parent 3c69c2a156
commit 0dc079a8ac
34 changed files with 2132 additions and 24 deletions
+18
View File
@@ -1,5 +1,7 @@
from pathlib import Path
from types import SimpleNamespace
import polib
import pytest
from portal.adapters import registry
@@ -36,3 +38,19 @@ def adapters():
registry.install(fakes.directory, fakes.idp)
yield fakes
registry.install()
@pytest.fixture(scope="session", autouse=True)
def compiled_messages():
"""The image compiles the catalogues with gettext; tests compile their own copy."""
for po_file in (Path(__file__).resolve().parent.parent / "locale").glob("*/LC_MESSAGES/*.po"):
polib.pofile(str(po_file)).save_as_mofile(str(po_file.with_suffix(".mo")))
@pytest.fixture(autouse=True)
def plain_static_files(settings):
"""No collectstatic in tests, so use storage without a manifest."""
settings.STORAGES = {
**settings.STORAGES,
"staticfiles": {"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage"},
}