Prorammbeschreibung aktualisiert. Duplikate werden aus den zu übersetzenden Texten entfernt.

This commit is contained in:
2026-02-10 16:48:01 +01:00
parent 46e2d8663b
commit 002b5e0bf1
+121 -9
View File
@@ -13,15 +13,72 @@ from utils import check_environment_var
"""
Dieses Programm:
- liest eine DXF Datei und sammelt alle TEXT und MTEXT Objekte
ODER liest Texte aus einer TXT Datei (ein Text pro Zeile)
ODER liest den 'untranslated' Block aus einer JSON Datei
ODER übersetzt TEXT/MTEXT direkt in einer DXF und erstellt neue übersetzte DXF
- filtert die Texte basierend auf Mustern in translator.cfg
- übersetzt optional Texte mit Trigrammen, Bigrammen und Einzelwörtern aus translation/<LANG>.cfg
- schreibt die Ergebnisse in eine Excel-, JSON- oder Text-Datei
- speichert die Ausgabedatei im PROJECT_WORK Verzeichnis
translate.py Texte aus DXF extrahieren, übersetzen und DXF-Dateien neu beschriften.
Alle Ausgabedateien landen im PROJECT_WORK Verzeichnis.
Die Übersetzungs-Configs liegen in PROJECT_TRANSLATION/<LANG>.cfg (z.B. CS.cfg, EN.cfg).
Beim Laden einer Config werden Selbstübersetzungen entfernt und Übersetzungsketten gemeldet.
───────────────────────────────────────────────────────────────────────────────
SCHRITT 1 Texte aus DXF extrahieren und Roh-JSON erzeugen
───────────────────────────────────────────────────────────────────────────────
-e --extract -f myfile.dxf [-t json,excel,text] [-o output]
Liest alle TEXT/MTEXT-Objekte und Symbol-Attribute aus einer DXF/DWG-Datei,
filtert sie über translator.cfg und schreibt eine JSON-Datei mit drei Blöcken:
"translations": [] (leer keine Sprache angegeben)
"untranslated": [...] (alle gefilterten Texte)
"ignored": [...] (herausgefilterte Texte)
Optional: zusätzliche Ausgabe als Excel oder Text (-t excel,json,text).
───────────────────────────────────────────────────────────────────────────────
SCHRITT 2a JSON auto-übersetzen (Drop auf tr2dxf_CS.bat / tr2dxf_EN.bat)
───────────────────────────────────────────────────────────────────────────────
--retranslate-json myfile_texts.json --translate CS[,EN,...]
Liest eine bestehende JSON-Datei (Legacy-Flat oder Multilang), übersetzt
alle Texte aus 'untranslated' automatisch und verschiebt Treffer nach
'translations'. Bestehende Übersetzungen werden mit der aktuellen Config
aktualisiert. Duplikate zwischen und innerhalb der Listen werden bereinigt.
Ausgabe immer im Multilang-Format: "[CS]": { "translations": [...], ... }
Legacy-Dateien werden dabei automatisch ins Multilang-Format konvertiert.
───────────────────────────────────────────────────────────────────────────────
SCHRITT 2b Mehrere Sprachen gleichzeitig extrahieren und übersetzen
───────────────────────────────────────────────────────────────────────────────
-e --extract -f myfile.dxf --translate CS,EN [-t json] [-o output]
Wie Schritt 1, aber mit sofortiger Auto-Übersetzung in eine oder mehrere
Sprachen. Ausgabe direkt im Multilang-Format. Wird die Ausgabedatei erneut
mit einer weiteren Sprache erzeugt, bleiben bestehende Sprachblöcke erhalten
(Merge): z.B. erst --translate CS, dann --translate EN → Datei enthält [CS] + [EN].
───────────────────────────────────────────────────────────────────────────────
SCHRITT 3 Übersetzte DXF erzeugen (Drop auf tr2dxf_CS.bat / tr2dxf_EN.bat)
───────────────────────────────────────────────────────────────────────────────
-f myfile.dxf --todxf myfile_CS.dxf --translate CS
[-f myfile.dxf --todxf myfile_CS.dxf --translation-json custom_texts.json]
Liest die Übersetzungstabelle aus <filename>_texts.json (oder --translation-json),
übersetzt TEXT/MTEXT-Objekte und Symbol-Attribute direkt in der DXF-Datei
und schreibt eine neue DXF mit den Zielsprachen-Texten.
───────────────────────────────────────────────────────────────────────────────
WEITERE EINGABEQUELLEN
───────────────────────────────────────────────────────────────────────────────
--fromtxt FILE.txt Texte aus TXT-Datei lesen (ein Text pro Zeile)
--fromjson FILE.json Nur 'untranslated'-Block aus JSON lesen und
neu übersetzen (schreibt neue Ausgabedatei)
───────────────────────────────────────────────────────────────────────────────
GEMEINSAME OPTIONEN
───────────────────────────────────────────────────────────────────────────────
--translate LANG[,LANG2,...] Zielsprache(n), z.B. CS oder EN,CS,FR
-t / --export-type TYPE[,TYPE] Ausgabeformat(e): json (Standard), excel, text
-o / --outname NAME Ausgabedateiname (ohne Pfad)
--lang_source LANG Quellsprache für Symbol-Attribute (Standard: DE)
--translation-json FILE.json Übersetzungs-JSON für --todxf (Standard: <name>_texts.json)
-d / --debug Debug-Ausgabe für Pattern-Matching
"""
@@ -1489,6 +1546,47 @@ def write_texts_to_text(texts: list[str], ignored_texts: list[str], output_path:
sys.exit(1)
def _dedup_source_list(
entry_list: list,
seen_from_other: set[str],
label: str,
list_name: str,
other_name: str) -> tuple[list, set[str]]:
"""
Bereinigt eine Liste von {source, target}-Einträgen um Duplikate.
Das erste Vorkommen je source wird behalten.
Zwei Fälle werden gemeldet:
- source bereits in seen_from_other → Cross-Duplikat mit der anderen Liste
- source bereits in dieser Liste → internes Duplikat
Args:
entry_list: Zu prüfende Liste
seen_from_other: Sources aus der Gegenliste (für Cross-Duplikat-Check)
label: Block-Bezeichnung für Warnmeldungen, z.B. "[CS]"
list_name: Name dieser Liste, z.B. "'translations'"
other_name: Name der Gegenliste, z.B. "'untranslated'"
Returns:
Tuple (bereinigte Liste, set der in dieser Liste gesehenen sources)
"""
seen: set[str] = set()
result = []
for entry in entry_list:
if not isinstance(entry, dict):
continue
source = entry.get('source', '')
if source in seen_from_other:
print(f" WARNUNG: {label} '{source}' aus {list_name} entfernt "
f"(bereits in {other_name})")
elif source in seen:
print(f" WARNUNG: {label} Duplikat in {list_name} entfernt: '{source}'")
else:
seen.add(source)
result.append(entry)
return result, seen
def _retranslate_language_block(
translations_list: list,
untranslated_list: list,
@@ -1500,6 +1598,11 @@ def _retranslate_language_block(
"""
Verarbeitet einen einzelnen Sprach-Block einer JSON-Übersetzungsdatei in-place.
Schritt 0 Deduplizierung beider Listen (via _dedup_source_list):
Doppelte source-Einträge werden entfernt (erstes Vorkommen wird behalten).
Einträge, deren source bereits in translations_list vorkommt, werden aus
untranslated_list entfernt.
Schritt 1 Re-übersetze bestehende Einträge in translations_list:
Jeder Eintrag wird mit der aktuellen Config neu übersetzt.
Wird keine Übersetzung mehr gefunden, wandert der Eintrag nach untranslated_list.
@@ -1526,6 +1629,15 @@ def _retranslate_language_block(
unchanged = 0
newly = 0
# Schritt 0: Deduplizierung erstes Vorkommen je source wird behalten
deduped_t, seen_t = _dedup_source_list(
translations_list, set(), label, "'translations'", "'untranslated'")
translations_list[:] = deduped_t
deduped_u, _ = _dedup_source_list(
untranslated_list, seen_t, label, "'untranslated'", "'translations'")
untranslated_list[:] = deduped_u
# Schritt 1: Re-übersetze bestehende translations-Einträge
for entry in translations_list[:]: # Kopie für sicheres Entfernen
if not isinstance(entry, dict) or 'source' not in entry: