teljes backend_mentés
This commit is contained in:
71
backend/app/api/v1/endpoints/translations.py
Normal file
71
backend/app/api/v1/endpoints/translations.py
Normal file
@@ -0,0 +1,71 @@
|
||||
"""
|
||||
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}
|
||||
Reference in New Issue
Block a user