feat(i18n): add English localization with per-user language preference and navbar toggle

This commit is contained in:
2026-07-06 22:07:05 +08:00
parent 172e33e121
commit f448a900f5
17 changed files with 539 additions and 418 deletions

View File

@@ -22,6 +22,7 @@ from random import choice
from string import ascii_letters, digits
from app.models import InviteCode, Postcard, Profile, User
from app.i18n import t as _t
router = APIRouter(tags=["web"])
templates = Jinja2Templates(directory=str(Path(__file__).resolve().parent.parent / "templates"))
@@ -66,6 +67,13 @@ def _strftime(dt: datetime, fmt: str) -> str:
templates.env.filters["strftime"] = _strftime
def _translate_filter(key: str, lang: str = "zh") -> str:
return _t(key, lang)
templates.env.filters["t"] = _translate_filter
def _redirect(url: str) -> RedirectResponse:
return RedirectResponse(url, status_code=303)
@@ -353,6 +361,19 @@ def change_password(
)
@router.post("/settings/language")
def change_language(
request: Request,
language: str = Form(...),
user: User = Depends(get_current_user_web),
db: Session = Depends(get_db),
):
if language in ("zh", "en"):
user.language = language
db.commit()
return _redirect(request.headers.get("referer", "/settings"))
# ---------- Auth ----------
@router.get("/logout")
@@ -798,4 +819,5 @@ def public_showcase(request: Request, username: str, db: Session = Depends(get_d
return templates.TemplateResponse("showcase.html", {
"request": request, "profile_user": user, "mode": user.showcase_mode,
"profile_groups": profile_groups, "sent_all": sent_all, "received_all": received_all,
"lang": user.language,
})