collabrix/backend/app/services/translations.py
DGSoft 93b98cfb5c Initial commit: Team Chat System with Code Snippet Library
- Complete chat application similar to Microsoft Teams
- Code snippet library with syntax highlighting
- Real-time messaging with WebSockets
- File upload with Office integration
- Department-based permissions
- Dark/Light theme support
- Production deployment with SSL/Reverse Proxy
- Docker containerization
- PostgreSQL database with SQLModel ORM
2025-12-09 22:25:03 +01:00

118 lines
3.8 KiB
Python

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()