from typing import Dict, List from sqlmodel import Session, select from datetime import datetime from app.models import Language, Translation DEFAULT_LANGUAGES: List[Dict[str, object]] = [ {"code": "de", "name": "Deutsch", "is_default": True}, {"code": "en", "name": "English", "is_default": False}, ] TRANSLATION_BLUEPRINT: List[Dict[str, object]] = [ { "key": "layout.header.title", "label": "App Titel", "description": "Titel im Kopfbereich der Anwendung.", "defaults": {"de": "Team Chat", "en": "Team Chat"}, }, { "key": "layout.nav.chat", "label": "Navigation Chat", "description": "Link zur Chat-Übersicht in der Navigation.", "defaults": {"de": "Chat", "en": "Chat"}, }, { "key": "layout.nav.snippets", "label": "Navigation Snippets", "description": "Link zur Snippet-Bibliothek in der Navigation.", "defaults": {"de": "Snippets", "en": "Snippets"}, }, { "key": "layout.nav.admin", "label": "Navigation Admin", "description": "Link zum Adminbereich in der Navigation.", "defaults": {"de": "Admin", "en": "Admin"}, }, { "key": "login.title", "label": "Login Titel", "description": "Überschrift des Login-Formulars.", "defaults": {"de": "Anmeldung", "en": "Login"}, }, ] def ensure_default_languages(session: Session) -> List[Language]: """Ensure default languages exist and return current list.""" existing = session.exec(select(Language)).all() if not existing: for language_data in DEFAULT_LANGUAGES: session.add(Language(**language_data)) session.commit() existing = session.exec(select(Language)).all() return existing def ensure_translation_entries(session: Session) -> None: """Ensure translation entries exist for all languages and blueprint keys.""" languages = ensure_default_languages(session) has_changes = False for blueprint in TRANSLATION_BLUEPRINT: defaults: Dict[str, str] = blueprint.get("defaults", {}) # type: ignore[assignment] for language in languages: stmt = select(Translation).where( Translation.key == blueprint["key"], Translation.language_id == language.id, ) translation = session.exec(stmt).first() if translation: continue value = defaults.get(language.code, "") session.add( Translation( key=blueprint["key"], value=value, language_id=language.id, ) ) has_changes = True if has_changes: session.commit() def ensure_translations_for_language(session: Session, language: Language) -> None: """Create translation entries for a newly added language.""" defaults_by_key = {bp["key"]: bp.get("defaults", {}) for bp in TRANSLATION_BLUEPRINT} has_changes = False for key, defaults in defaults_by_key.items(): stmt = select(Translation).where( Translation.key == key, Translation.language_id == language.id, ) translation = session.exec(stmt).first() if translation: continue value = defaults.get(language.code, "") if isinstance(defaults, dict) else "" session.add( Translation( key=key, value=value, language_id=language.id, ) ) has_changes = True if has_changes: session.commit() def get_translation_blueprint() -> List[Dict[str, object]]: return TRANSLATION_BLUEPRINT def update_translation_timestamp(translation: Translation) -> None: translation.updated_at = datetime.utcnow()