Files
max/max/translations.py
T
finnandClaude Opus 5.5 4a159006aa Log structured fields through a logger adapter
app.logger.info("message", key=value) appends the keyword arguments as
JSON encoded fields, so callers no longer format the values themselves.
All log calls use fixed messages and put variable values into fields.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 13:58:44 +00:00

96 lines
2.9 KiB
Python

import json
import os
import re
from flask import g, has_request_context
from max.exceptions import LanguageNotSet
ACCEPT_LANGUAGE_HEADER_REGEX = re.compile(r"([a-zA-Z]{2,3})(-[a-zA-Z\-]+)?")
def t(*args, **kwargs):
return TranslationHandler.translate(*args, **kwargs)
class TranslationHandler:
translations = {}
language_available = {"en": True}
always_reload_translations = False
@classmethod
def init(cls, app):
cls.app = app
cls.always_reload_translations = app.debug
app.context_processor(lambda: dict(t=t, language=cls.get_assured_language()))
@classmethod
def is_language_available(cls, language):
if language not in cls.language_available:
cls.language_available[language] = os.path.exists(
cls.get_language_filepath(language)
)
return cls.language_available[language]
@classmethod
def get_language(cls):
"""The language of the current request, None if it was not set"""
if not has_request_context():
return None
return g.get("language")
@classmethod
def get_assured_language(cls):
"""The language of the current request, which must be set"""
language = cls.get_language()
if language is None:
raise LanguageNotSet()
return language
@classmethod
def set_language(cls, language):
if not cls.is_language_available(language):
cls.app.logger.info("Unknown language, default to en", language=language)
language = "en"
g.language = language
if language != "en" and (
cls.always_reload_translations or language not in cls.translations
):
cls.translations[language] = json.load(
open(cls.get_language_filepath(language), "r")
)
@classmethod
def translate(cls, string, **interpolation):
language = cls.get_assured_language()
if language == "en":
return string.format(**interpolation)
if string not in cls.translations[language]:
cls.app.logger.warning(
"Unknown translation", language=language, string=string
)
return string.format(**interpolation)
return cls.translations[language][string].format(**interpolation)
@classmethod
def parse_language_header(cls, header):
if not header:
return None
if "*" in header:
return None
languages = [match[0] for match in ACCEPT_LANGUAGE_HEADER_REGEX.findall(header)]
# take the first matching one
for language in languages:
if cls.is_language_available(language):
return language
return None
@classmethod
def get_language_filepath(cls, language):
return os.path.join(cls.app.root_path, f"private_static/i18n/{language}.json")