import json from pathlib import Path from webapp.auth import SUPPORTED_UI_LANGUAGES, normalize_translation_language from webapp.config import ConfigFileError TRANSLATIONS_DIR = Path(__file__).resolve().parent / "translations" TRANSLATION_CATALOG_FILE = TRANSLATIONS_DIR / "catalog.json" def load_translations(language: str) -> dict: normalized = normalize_translation_language(language) catalog = load_translation_catalog() merged: dict[str, object] = {} for key, translations in catalog.items(): if not isinstance(translations, dict): continue english_value = translations.get("en") localized_value = translations.get(normalized) if localized_value not in (None, ""): merged[key] = localized_value elif english_value is not None: merged[key] = english_value return merged def load_translation_catalog() -> dict: if not TRANSLATION_CATALOG_FILE.exists(): return {} try: payload = json.loads(TRANSLATION_CATALOG_FILE.read_text(encoding="utf-8")) except json.JSONDecodeError as error: detail = f"Invalid JSON: {error.msg}" if "Invalid control character" in error.msg: detail += " JSON strings cannot contain raw line breaks; use \\n instead." raise ConfigFileError(TRANSLATION_CATALOG_FILE, detail) from error return payload if isinstance(payload, dict) else {} def language_options() -> list[dict[str, str]]: return [{"code": code, "label_key": f"ui_language.{code}"} for code in SUPPORTED_UI_LANGUAGES]