Files
mailadler/LOKALES_LLM_UEBERSETZUNG.md
2026-02-04 02:47:35 +01:00

18 KiB

Lokales LLM für Mail-Adler Übersetzungen

1. Warum lokales LLM statt API?

Kriterium API (GPT-4) Lokal (z.B. Ollama)
Kosten €0.03 pro 1K Tokens Kostenlos
Datenschutz Daten an OpenAI Lokal, privat
Geschwindigkeit ⚠️ Network-Latenz Sofort
Offline Internet erforderlich Funktioniert offline
Kontrolle OpenAI entscheidet Du kontrollierst
Konsistenz ⚠️ Variabel je Update Gleicher Modell
Dezentralisierung US-Firma Open-Source

2. Beste lokale LLM-Optionen für Deutsch

2.1 Vergleich

LLM Typ Speicher Geschwindigkeit Qualität Installation
Ollama Launcher 4-13GB Sehr schnell Sehr gut Einfach
LM Studio GUI 4-13GB Schnell Sehr gut Mittel
GPT4All GUI 3-7GB Schnell Gut Einfach
LocalAI Docker 4-13GB Schnell Gut ⚠️ Komplex
Hugging Face Lokal Variabel Langsam Gut ⚠️ Komplex

2.2 EMPFEHLUNG: Ollama

Warum Ollama?

  • Einfachste Installation (1 Klick)
  • Schnellste Performance
  • Beste Modell-Bibliothek
  • REST API (leicht zu integrieren)
  • Läuft auch auf macOS/Linux/Windows

3. Ollama Setup für Deutsch-Übersetzung

3.1 Installation

Windows 11:

# Download: https://ollama.ai/download
# → Ollama-0.1.26-windows.exe (ca. 200MB)

# Installation:
1. Doppelklick auf .exe
2. Admin-Passwort eingeben
3. "Ollama" startet automatisch (im Systemtray)
4. Terminal öffnen, testen:

ollama --version
# Output: ollama version 0.1.26

Linux (Ubuntu):

curl https://ollama.ai/install.sh | sh
ollama --version

macOS:

# Via Homebrew oder direkter Download
brew install ollama
ollama --version

3.2 Beste Modelle für Deutsch-Übersetzung

Option A: Mistral 7B (Empfohlen für Anfänger)

ollama pull mistral:7b
# Download: ~4.1GB
# Performance: ⚡⚡⚡ Sehr schnell (auf 8GB RAM)
# Qualität: ✅✅ Gut für Deutsch

Test:

ollama run mistral:7b

>>> Übersetze ins Englische:
>>> Eingang
The Inbox

Option B: Neural Chat (Intel - optimiert für Deutsch)

ollama pull neural-chat:7b
# Download: ~4.7GB
# Performance: ⚡⚡⚡ Schnell
# Qualität: ✅✅✅ Sehr gut für Deutsch

Option C: Orca 2 (Höhere Qualität, langsamer)

ollama pull orca-mini:13b
# Download: ~8.4GB
# Performance: ⚡⚡ Mittel
# Qualität: ✅✅✅ Sehr gut
# Empfohlen nur mit 16GB+ RAM

EMPFEHLUNG: Starte mit Mistral 7B (schnell & gut)

3.3 Ollama Server starten

# Terminal 1: Ollama Server im Hintergrund
ollama serve

# Output:
# 2025/02/03 14:30:00 "Listening on 127.0.0.1:11434"

# Bleibt laufen im Hintergrund
# Terminal 2+: Weitere Befehle
ollama run mistral:7b

4. Mail-Adler Translation Tool (Python)

4.1 Translation Manager Script

#!/usr/bin/env python3
# scripts/translate_manual.py

import requests
import json
import sys
from pathlib import Path
import argparse
from typing import Dict, List

class OllamaTranslator:
    def __init__(self, model: str = "mistral:7b", base_url: str = "http://localhost:11434"):
        self.model = model
        self.base_url = base_url
        self.cache = {}
    
    def translate_text(self, text: str, target_lang: str) -> str:
        """Übersetze Text mit lokalem LLM"""
        
        # Cache-Check
        cache_key = f"{text}::{target_lang}"
        if cache_key in self.cache:
            return self.cache[cache_key]
        
        # Prompt-Vorlage (siehe Punkt 5)
        prompt = f"""Du bist ein präziser Übersetzer für die Mail-Anwendung "Mail-Adler".

ANWEISUNG:
- Übersetze NUR das Wort/die Phrase
- KEINE Erklärung
- Kurz und prägnant
- Behalte Formatierung (.ts Datei)

SPRACHEN:
- Source: Deutsch
- Target: {self._get_lang_name(target_lang)}

TEXT ZUM ÜBERSETZEN:
{text}

ÜBERSETZUNG:"""

        try:
            response = requests.post(
                f"{self.base_url}/api/generate",
                json={
                    "model": self.model,
                    "prompt": prompt,
                    "stream": False,
                    "temperature": 0.3,  # Niedrig = konsistent
                },
                timeout=60
            )
            
            if response.status_code == 200:
                result = response.json()
                translation = result.get("response", "").strip()
                self.cache[cache_key] = translation
                return translation
            else:
                print(f"❌ Ollama Error: {response.status_code}")
                return text  # Fallback
                
        except requests.exceptions.ConnectionError:
            print("❌ Ollama nicht erreichbar!")
            print("   Starten Sie: ollama serve")
            return text
    
    def _get_lang_name(self, lang_code: str) -> str:
        """Konvertiere Lang-Code zu Name"""
        langs = {
            "en_US": "English (American)",
            "en_GB": "English (British)",
            "fr_FR": "French",
            "es_ES": "Spanish",
            "it_IT": "Italian",
            "nl_NL": "Dutch",
            "pl_PL": "Polish",
            "sv_SE": "Swedish"
        }
        return langs.get(lang_code, lang_code)
    
    def translate_ts_file(self, source_file: str, target_lang: str, output_file: str):
        """Übersetze komplette .ts Datei"""
        import xml.etree.ElementTree as ET
        
        print(f"\n📝 Übersetze {source_file}{target_lang}")
        print("=" * 60)
        
        tree = ET.parse(source_file)
        root = tree.getroot()
        
        # Namespace
        ns = {'ts': 'http://trolltech.com/TS'}
        ET.register_namespace('', 'http://trolltech.com/TS')
        
        translated_count = 0
        skipped_count = 0
        
        for context in root.findall('.//context', ns):
            context_name = context.find('.//name', ns)
            
            for message in context.findall('.//message', ns):
                source_elem = message.find('source', ns)
                translation_elem = message.find('translation', ns)
                
                if source_elem is not None and translation_elem is not None:
                    source_text = source_elem.text
                    
                    # Überspringe bereits übersetzte
                    if translation_elem.text and translation_elem.get('type') != 'unfinished':
                        skipped_count += 1
                        continue
                    
                    # Übersetze
                    print(f"DE: {source_text}")
                    translated = self.translate_text(source_text, target_lang)
                    print(f"{target_lang.split('_')[0].upper()}: {translated}")
                    
                    translation_elem.text = translated
                    translation_elem.set('type', 'finished')
                    translated_count += 1
                    print("-" * 60)
        
        # Speichern
        tree.write(output_file, encoding='UTF-8', xml_declaration=True)
        
        print(f"\n✅ Fertig!")
        print(f"   Übersetzt: {translated_count}")
        print(f"   Übersprungen: {skipped_count}")
        print(f"   Datei: {output_file}")

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Mail-Adler Translation Manager')
    
    parser.add_argument('--model', default='mistral:7b',
                        help='Ollama-Modell (default: mistral:7b)')
    parser.add_argument('--source', required=True,
                        help='Quell-.ts Datei (z.B. translations/mail-adler_de.ts)')
    parser.add_argument('--target', required=True,
                        help='Zielsprache (z.B. en_US, fr_FR, es_ES)')
    parser.add_argument('--output', required=True,
                        help='Ausgangs-.ts Datei')
    
    args = parser.parse_args()
    
    translator = OllamaTranslator(model=args.model)
    translator.translate_ts_file(args.source, args.target, args.output)

4.2 Verwendung des Scripts

# Terminal vorbereiten
# Terminal 1: Ollama Server
ollama serve

# Terminal 2: Übersetzung starten
cd /path/to/mail-adler

# Mistral 7B laden (beim ersten Mal)
ollama pull mistral:7b

# Englisch übersetzen
python3 scripts/translate_manual.py \
  --model mistral:7b \
  --source translations/mail-adler_de.ts \
  --target en_US \
  --output translations/mail-adler_en.ts

# Französisch übersetzen
python3 scripts/translate_manual.py \
  --model mistral:7b \
  --source translations/mail-adler_de.ts \
  --target fr_FR \
  --output translations/mail-adler_fr.ts

Output-Beispiel:

📝 Übersetze translations/mail-adler_de.ts → en_US
============================================================
DE: Eingang
EN: Inbox
------------------------------------------------------------
DE: Gesendet
EN: Sent
------------------------------------------------------------
DE: Papierkorb
EN: Trash
------------------------------------------------------------
...
✅ Fertig!
   Übersetzt: 247
   Übersprungen: 0
   Datei: translations/mail-adler_en.ts

5. Optimal Prompt-Vorlage für Übersetzungen

5.1 Template für Batch-Übersetzung (EMPFOHLEN)

Du bist ein präziser Übersetzer für die Mail-Anwendung "Mail-Adler".

RICHTLINIEN:
- Übersetze PRÄZISE und KONSISTENT
- Halte Formatierung bei
- Technische Begriffe korrekt (IMAP, SMTP, etc.)
- Kurze, prägnante Begriffe
- KEINE Erklärung, nur Übersetzung

GLOSSAR (Diese Begriffe immer gleich übersetzen):
- Inbox → Eingang (NICHT Postfach)
- Sent → Gesendet
- Drafts → Entwürfe (NICHT Konzepte)
- Trash → Papierkorb (NICHT Müllkorb)
- Spam → Spam (kein Übersetzung)
- Archive → Archiv
- Flagged → Markiert
- Read → Gelesen
- Unread → Ungelesen
- IMAP → IMAP (bleibt gleich)
- SMTP → SMTP (bleibt gleich)
- Encrypt → Verschlüsseln
- Decrypt → Entschlüsseln

SPRACHEN:
- Source: Deutsch
- Target: [SPRACHE HIER]

ZU ÜBERSETZENDE TEXTE:
[TEXT HIER]

AUSGABE-FORMAT:
Deutsch: [original]
[Zielsprache]: [Übersetzung]
---

5.2 Template für einzelne Wörter/Phrasen

Übersetze diesen Text aus der Mail-Anwendung "Mail-Adler" präzise ins [ZIELSPRACHE].

Text: "[TEXT]"

Antwort (nur Übersetzung):

5.3 Was ist besser: Batch vs. Single?

Ansatz Vorteile Nachteile
Batch (10-50 Strings) Konsistenz, Kontext ⚠️ Längere Verarbeitung
Single (1 Wort) Schnell, einfach Inkonsistenzen möglich

EMPFEHLUNG: Batch mit Glossar

  • Alle Strings einer Kategorie zusammen
  • Glossar definiert Fachbegriffe
  • → Maximale Konsistenz

6. Version-Management beim Übersetzen

6.1 Versionierung mit Sprach-Updates

Struktur:

Mail-Adler Versionen:
├─ v0.1.0-de    (Deutsch Release)
├─ v0.1.1-de+en (Deutsch + English hinzugefügt)
├─ v0.1.2-de+en+fr (+ Französisch)
└─ v0.2.0-de+en+fr+es (+ Spanisch, neue Features)

CMakeLists.txt:

# Version-Management mit Sprachen
set(MAIL_ADLER_VERSION_MAJOR 0)
set(MAIL_ADLER_VERSION_MINOR 1)
set(MAIL_ADLER_VERSION_PATCH 0)
set(MAIL_ADLER_LANGUAGES "de;en;fr;es")  # Aktive Sprachen

# Dynamische Versionsstring
string(REPLACE ";" "+" LANG_STRING "${MAIL_ADLER_LANGUAGES}")
set(MAIL_ADLER_VERSION_WITH_LANGS 
    "${MAIL_ADLER_VERSION_MAJOR}.${MAIL_ADLER_VERSION_MINOR}.${MAIL_ADLER_VERSION_PATCH}-${LANG_STRING}")

message(STATUS "Mail-Adler Version: ${MAIL_ADLER_VERSION_WITH_LANGS}")

6.2 Automated Release beim Sprach-Update

# scripts/release_with_translation.sh
#!/bin/bash

TARGET_LANG=$1  # z.B. "en_US", "fr_FR"

if [ -z "$TARGET_LANG" ]; then
    echo "Nutzung: ./scripts/release_with_translation.sh <lang>"
    echo "Beispiel: ./scripts/release_with_translation.sh fr_FR"
    exit 1
fi

echo "🌍 Mail-Adler Translation Release"
echo "=================================="

# 1. Übersetzung durchführen
echo "📝 Übersetze zu ${TARGET_LANG}..."
python3 scripts/translate_manual.py \
    --source translations/mail-adler_de.ts \
    --target ${TARGET_LANG} \
    --output translations/mail-adler_${TARGET_LANG%_*}.ts

# 2. Kompilieren
echo "🔨 Kompiliere Übersetzungen..."
lrelease translations/mail-adler_*.ts

# 3. Version erhöhen
echo "📌 Erhöhe Version..."
CURRENT_VERSION=$(grep "MAIL_ADLER_VERSION_PATCH" CMakeLists.txt | grep -oP '\d+')
NEW_VERSION=$((CURRENT_VERSION + 1))

sed -i "s/set(MAIL_ADLER_VERSION_PATCH ${CURRENT_VERSION})/set(MAIL_ADLER_VERSION_PATCH ${NEW_VERSION})/g" CMakeLists.txt

# 4. Sprachenliste updaten
echo "🌐 Update Sprachen-Liste..."
LANG_CODE=${TARGET_LANG%_*}
sed -i "s/set(MAIL_ADLER_LANGUAGES \"/set(MAIL_ADLER_LANGUAGES \"${LANG_CODE};/g" CMakeLists.txt

# 5. Git Commit
echo "📦 Erstelle Release-Commit..."
git add translations/ CMakeLists.txt
git commit -m "Release: Mail-Adler v0.1.${NEW_VERSION} + ${TARGET_LANG}"

# 6. Tag erstellen
git tag -a "v0.1.${NEW_VERSION}" -m "Mail-Adler Version 0.1.${NEW_VERSION} - ${TARGET_LANG} Translation"

echo "✅ Release fertig!"
echo "   Version: v0.1.${NEW_VERSION}"
echo "   Sprachen: ${LANG_CODE}"
echo ""
echo "Push mit: git push && git push --tags"

6.3 Automatisches Rollout (GitHub Actions)

# .github/workflows/translation-release.yml
name: Translation Release

on:
  push:
    paths:
      - 'translations/mail-adler_*.ts'
      - 'CMakeLists.txt'

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Build & Release
        run: |
          # Compile translations
          sudo apt-get install -y qt6-tools-dev
          lrelease translations/mail-adler_*.ts
          
          # Build
          mkdir build && cd build
          cmake .. -DCMAKE_BUILD_TYPE=Release -GNinja
          ninja
          
          # Test
          ninja test || true
      
      - name: Create GitHub Release
        uses: softprops/action-gh-release@v1
        with:
          files: |
            build/mail-adler_*
            translations/mail-adler_*.qm
          tag_name: ${{ github.ref }}

7. Workflow: Schritt-für-Schritt

7.1 Neue Strings hinzufügen (Entwickler)

# 1. Schreibe Code mit Deutsch-Strings
# src/ui/newfeature.cpp:
ui->label->setText(tr("Neue Funktion"));

# 2. Extrahiere Strings
cd mail-adler
lupdate src/ forms/ -ts translations/mail-adler_de.ts

# 3. Commit
git add translations/mail-adler_de.ts
git commit -m "Add new strings for new feature"

7.2 Übersetzen (Du selbst)

# 1. Ollama Server starten (im Hintergrund)
ollama serve &

# 2. Stelle sicher, dass Modell da ist
ollama pull mistral:7b

# 3. Übersetze zu allen Sprachen
./scripts/release_with_translation.sh en_US
./scripts/release_with_translation.sh fr_FR
./scripts/release_with_translation.sh es_ES

# 4. Review (optional, mit Sicht auf Ergebnisse)
# Öffne die .ts Dateien und prüfe Qualität

7.3 Automatisches Rollout

# 1. Push zu GitHub
git push origin main
git push origin --tags

# 2. GitHub Actions:
#    - Kompiliert Übersetzungen
#    - Baut Mail-Adler
#    - Erstellt Release mit .qm Dateien
#    - Auto-Rollout zu Website

# 3. Nutzer:
#    - Download neue Version
#    - Sprachauswahl in Einstellungen
#    - Automatischer Download .qm Datei

8. Kostenlose lokale LLM-Alternativen

Falls Ollama nicht reicht:

Tool Download RAM Deutsch Einfachheit
LM Studio https://lmstudio.ai 4-16GB Gut GUI
GPT4All https://gpt4all.io 3-8GB ⚠️ OK GUI
LocalAI https://localai.io 4-16GB Gut ⚠️ Docker
Hugging Face huggingface.co 2-32GB Variabel ⚠️ Code

LM Studio Alternative zu Ollama

# Download & Start: https://lmstudio.ai
# 1. GUI öffnen
# 2. "Mistral 7B" suchen & loaded
# 3. "Local Server" starten (Port 1234)

# Dann im Script anpassen:
python3 scripts/translate_manual.py \
  --model "mistral:7b" \
  --source translations/mail-adler_de.ts \
  --target en_US \
  --output translations/mail-adler_en.ts
  # (Funktioniert mit LM Studio auch - kompatible API)

9. Qualitätskontrolle

9.1 Übersetzte Strings prüfen

# Script zum Vergleichen
#!/bin/bash
# scripts/check_translations.sh

echo "Übersetzte Strings vs Original:"
grep "<translation" translations/mail-adler_en.ts | wc -l
grep "<source" translations/mail-adler_de.ts | wc -l

echo ""
echo "Unfertige Übersetzungen:"
grep '<translation type="unfinished"' translations/mail-adler_en.ts

9.2 Manuelle Review (vor Release)

Mail-Adler Übersetzungs-Checkliste:

English (Englisch):
- [ ] Alle 240+ Strings übersetzt
- [ ] Keine "Inbox" statt "Eingang" Pattern
- [ ] Fachbegriffe konsistent
- [ ] Keine Tippfehler
- [ ] UI-Test durchgespielt

Französisch:
- [ ] Alle 240+ Strings übersetzt
- [ ] Accents korrekt (é, è, ê, ë, etc.)
- [ ] Keine Inkonsisstences
- [ ] UI-Test

... (pro Sprache)

10. Zusammenfassung

Dein Workflow:

  1. Schreibe Code mit Deutsch-Strings
  2. Nutze Ollama lokal zum Übersetzen (kostenlos, schnell, privat)
  3. Script führt Batch-Übersetzung durch
  4. Version automatisch erhöht
  5. Automatisches Rollout via GitHub Actions
  6. Nutzer bekommen neue Sprach-Version

Vorteile:

  • 💰 Kostenlos (keine API)
  • 🔒 Privat (lokale Daten)
  • Schnell (kein Netzwerk-Overhead)
  • 🎯 Konsistent (Glossar + Batch)
  • 🚀 Automatisiert (GitHub Actions)
  • 🌍 Dezentralisiert (Open-Source)

Empfohlenes Setup:

# Einmalig
brew install ollama                    # oder Windows-Installer
ollama pull mistral:7b                 # ~4GB

# Bei jeder Übersetzung
ollama serve &                         # Hintergrund
python3 scripts/translate_manual.py \  # Batch-Übersetzen
  --target en_US \
  --source translations/mail-adler_de.ts \
  --output translations/mail-adler_en.ts
./scripts/release_with_translation.sh en_US  # Release