32 lines
859 B
Python
32 lines
859 B
Python
import gettext
|
|
from contextvars import ContextVar
|
|
|
|
from fastapi import Cookie, Header, Request
|
|
|
|
from gallery.util import root_path
|
|
|
|
_translation: ContextVar[gettext.GNUTranslations | gettext.NullTranslations] = ContextVar("translation")
|
|
|
|
|
|
async def set_language(
|
|
request: Request,
|
|
accept_language: str = Header("en"),
|
|
language: str | None = Cookie(None),
|
|
):
|
|
# Simplify the header (e.g., "en-US,en;q=0.9" -> "en")
|
|
lang = language or accept_language.split(",")[0].split("-")[0]
|
|
|
|
try:
|
|
t = gettext.translation("messages", localedir=root_path / "locales", languages=[lang])
|
|
except FileNotFoundError:
|
|
t = gettext.NullTranslations()
|
|
|
|
token = _translation.set(t)
|
|
request.state.language = lang
|
|
yield lang
|
|
_translation.reset(token)
|
|
|
|
|
|
def _(message: str) -> str:
|
|
return _translation.get().gettext(message)
|