From 5939879e23fa87452279be0c2eb56340a6a5582a Mon Sep 17 00:00:00 2001 From: mistangl Date: Mon, 15 Dec 2025 14:32:23 +0100 Subject: [PATCH] =?UTF-8?q?standardisiert:=20multilang=20und=20einefach=20?= =?UTF-8?q?Sprache=20enthalten=20beide=20translations=20und=20untranslated?= =?UTF-8?q?.=20Doku=20um=20das=20neue=20Feature=20erg=C3=A4nzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/translate.md | 115 ++++++++++++++++++++++++++++++++++++++++++++++- lib/translate.py | 23 +++++----- 2 files changed, 126 insertions(+), 12 deletions(-) diff --git a/doc/translate.md b/doc/translate.md index 7448322..387f1c3 100644 --- a/doc/translate.md +++ b/doc/translate.md @@ -115,7 +115,7 @@ bin\translate.bat --filename file.dxf --extract --translate CS --outname output. bin\translate.bat --filename file.dxf --extract --translate EN --export-type excel ``` -**Output-Format (JSON):** +**Output-Format für eine Sprache (JSON):** ```json { "translations": [ @@ -131,6 +131,119 @@ bin\translate.bat --filename file.dxf --extract --translate EN --export-type exc } ``` +### 2a. Mehrsprachige Text-Extraktion + +**NEU ab Version 2025:** Extrahiert und übersetzt Texte gleichzeitig in mehrere Sprachen mit hierarchischer JSON-Struktur. + +```bash +# Extraktion mit mehreren Sprachen (komma-separiert) +bin\translate.bat --filename file.dxf --extract --translate CS,EN --outname output.json + +# Drei Sprachen gleichzeitig +bin\translate.bat --filename file.dxf --extract --translate CS,EN,FR --export-type json + +# Mit Excel-Export (nur erste Sprache wird in Excel verwendet) +bin\translate.bat --filename file.dxf --extract --translate CS,EN --export-type excel,json +``` + +**Output-Format für mehrere Sprachen (hierarchische JSON-Struktur):** +```json +{ + "[CS]": { + "translations": [ + { + "source": "Betriebsbereit", + "target": "Provozní připravenost" + }, + { + "source": "Emergency stop", + "target": "Nouzové zastavení" + }, + { + "source": "Weight", + "target": "Hmotnost" + } + ], + "untranslated": [ + { + "source": "Custom text", + "target": "" + } + ] + }, + "[EN]": { + "translations": [ + { + "source": "Betriebsbereit", + "target": "Ready for operation" + }, + { + "source": "Emergency stop", + "target": "Emergency stop" + }, + { + "source": "Weight", + "target": "Weight" + } + ], + "untranslated": [ + { + "source": "Custom text", + "target": "" + } + ] + }, + "[FR]": { + "translations": [ + { + "source": "Betriebsbereit", + "target": "Prêt à fonctionner" + }, + { + "source": "Emergency stop", + "target": "Arrêt d'urgence" + } + ], + "untranslated": [ + { + "source": "Custom text", + "target": "" + }, + { + "source": "Weight", + "target": "" + } + ] + }, + "ignored": [ + "X=123.45", + "LAYER=0" + ] +} +``` + +**Struktur:** +- **`[LANG]`**: Sprachspezifische Sektion (z.B. `[CS]`, `[EN]`, `[FR]`) + - **`translations`**: Array mit erfolgreich übersetzten Texten + - **`untranslated`**: Array mit nicht übersetzten Texten (fehlende Übersetzung in Config) +- **`ignored`**: Array mit gefilterten Texten (einmal für alle Sprachen) + +**Vorteile:** +- Ein Durchlauf für alle Sprachen → schneller +- Konsistente Extraktion für alle Sprachen +- Übersicht über Übersetzungs-Abdeckung pro Sprache +- Einfache Identifikation fehlender Übersetzungen + +**Verarbeitung mehrsprachiger JSON-Dateien:** + +```bash +# Re-prozessiere mehrsprachige JSON mit zusätzlicher Sprache +bin\translate.bat --fromjson output.json --translate CS,EN,ES + +# DXF-zu-DXF mit mehrsprachiger JSON (verwendet erste Sprache) +bin\translate.bat --filename file.dxf --todxf file_cs.dxf --translate CS --translation-json multilang.json +``` + ### 3. DXF-zu-DXF Übersetzung Erstellt eine neue DXF-Datei mit übersetzten Texten in mehrsprachigen Attributen. diff --git a/lib/translate.py b/lib/translate.py index 32cc760..798147e 100644 --- a/lib/translate.py +++ b/lib/translate.py @@ -663,7 +663,7 @@ def load_translations_from_json(filename: Path, target_lang: str = None) -> dict Liest Übersetzungen aus einer JSON-Datei. Unterstützt beide Strukturen: - Alte Struktur: "translations": [{"source": "...", "target": "..."}, ...] - - Hierarchische Struktur: "[LANG]": {"translated": [...], ...} + - Hierarchische Struktur: "[LANG]": {"translations": [...], ...} Bei hierarchischer Struktur werden Übersetzungen aus allen Sprachen oder nur der angegebenen Sprache gelesen. Wenn mehrere Übersetzungen für denselben source existieren, wird die letzte verwendet (Sprache mit höherer Priorität). @@ -732,14 +732,15 @@ def load_translations_from_json(filename: Path, target_lang: str = None) -> dict print(f"WARNUNG: [{lang}] Block ist kein Object, überspringe") continue - # Lese aus translated Block - if 'translated' in lang_data: - translated = lang_data['translated'] - if not isinstance(translated, list): - print(f"WARNUNG: [{lang}][translated] ist kein Array, überspringe") + # Lese aus translations Block (oder translated für Rückwärtskompatibilität) + translations_key = 'translations' if 'translations' in lang_data else 'translated' + if translations_key in lang_data: + translations_list = lang_data[translations_key] + if not isinstance(translations_list, list): + print(f"WARNUNG: [{lang}][{translations_key}] ist kein Array, überspringe") continue - for idx, entry in enumerate(translated): + for idx, entry in enumerate(translations_list): if not isinstance(entry, dict): continue @@ -1106,8 +1107,8 @@ def write_texts_to_json(texts: list[str], ignored_texts: list[str], output_path: - "ignored": Liste von Strings für gefilterte/ignorierte Texte Bei mehreren Sprachen (hierarchische Struktur): - - "[EN]": {"translated": [...], "untranslated": [...]} - - "[FR]": {"translated": [...], "untranslated": [...]} + - "[EN]": {"translations": [...], "untranslated": [...]} + - "[FR]": {"translations": [...], "untranslated": [...]} - "ignored": Liste von Strings für gefilterte/ignorierte Texte Args: @@ -1145,7 +1146,7 @@ def write_texts_to_json(texts: list[str], ignored_texts: list[str], output_path: # Hierarchische Struktur: [LANG] als Schlüssel output_data[f"[{lang}]"] = { - "translated": translations, + "translations": translations, "untranslated": untranslated } @@ -1196,7 +1197,7 @@ def write_texts_to_json(texts: list[str], ignored_texts: list[str], output_path: for lang in translation_languages: if f"[{lang}]" in output_data: lang_data = output_data[f"[{lang}]"] - print(f" [{lang}] Übersetzungen: {len(lang_data['translated'])}, Nicht übersetzt: {len(lang_data['untranslated'])}") + print(f" [{lang}] Übersetzungen: {len(lang_data['translations'])}, Nicht übersetzt: {len(lang_data['untranslated'])}") else: # Alte Struktur if translation_dicts: