""" Nyilvános i18n API végpont a frontend számára. Autentikációt NEM igényel, mivel a fordítások nyilvánosak. """ import json import os from fastapi import APIRouter, HTTPException, Path from fastapi.responses import JSONResponse from typing import Dict, Any router = APIRouter() # A statikus JSON fájlok elérési útja LOCALES_DIR = os.path.join(os.path.dirname(__file__), "../../../static/locales") def load_locale(lang: str) -> Dict[str, Any]: """Betölti a nyelvi JSON fájlt, ha nem létezik, fallback angol.""" file_path = os.path.join(LOCALES_DIR, f"{lang}.json") fallback_path = os.path.join(LOCALES_DIR, "en.json") if not os.path.exists(file_path): # Ha a kért nyelv nem létezik, próbáljuk meg az angolt if lang != "en" and os.path.exists(fallback_path): file_path = fallback_path else: raise HTTPException(status_code=404, detail=f"Language '{lang}' not found") try: with open(file_path, "r", encoding="utf-8") as f: return json.load(f) except Exception as e: raise HTTPException(status_code=500, detail=f"Error loading translation file: {str(e)}") @router.get("/{lang}", response_model=Dict[str, Any]) async def get_translations( lang: str = Path(..., description="Nyelvkód, pl. 'hu', 'en', 'de'", min_length=2, max_length=5) ): """ Visszaadja a teljes fordításcsomagot a kért nyelvhez. - Ha a nyelv nem létezik, 404 hibát dob. - Ha a fájl sérült, 500 hibát dob. - A válasz egy JSON objektum, amelyben a kulcsok hierarchikusak. """ translations = load_locale(lang) return translations @router.get("/{lang}/{key:path}") async def get_translation_by_key( lang: str = Path(..., description="Nyelvkód"), key: str = Path(..., description="Pontokkal elválasztott kulcs, pl. 'AUTH.LOGIN.TITLE'") ): """ Visszaadja a fordításcsomag egy adott kulcsához tartozó értéket. - Ha a kulcs nem található, 404 hibát dob. - Támogatja a hierarchikus kulcsokat (pl. 'AUTH.LOGIN.TITLE'). """ translations = load_locale(lang) # Kulcs felbontása parts = key.split('.') current = translations for part in parts: if isinstance(current, dict) and part in current: current = current[part] else: raise HTTPException(status_code=404, detail=f"Translation key '{key}' not found for language '{lang}'") # Ha a current egy szótár, akkor azt adjuk vissza (részleges fa) # Ha sztring, akkor azt return {key: current}