mirror of
https://github.com/OHV-IT/collabrix.git
synced 2025-12-15 16:48:36 +01:00
- 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
118 lines
3.8 KiB
Python
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()
|