Korrektur: Translated und untranslated müssen neu angeschaut werden

This commit is contained in:
2026-02-10 15:44:16 +01:00
parent beb84c0bf9
commit 5cbd290a16
+112 -48
View File
@@ -1279,28 +1279,59 @@ def write_texts_to_json(texts: list[str], ignored_texts: list[str], output_path:
""" """
Schreibt die Texte in eine JSON-Datei. Schreibt die Texte in eine JSON-Datei.
Bei einer Sprache (alte Struktur): Immer wenn Übersetzungssprachen angegeben sind (auch nur eine), wird die
- "translations": Liste von {source, target} für übersetzte Texte hierarchische Struktur verwendet:
- "untranslated": Liste von {source, target: ""} für nicht übersetzte Texte - "[CS]": {"translations": [...], "untranslated": [...]}
- "[EN]": {"translations": [...], "untranslated": [...]}
- "ignored": Liste von Strings für gefilterte/ignorierte Texte - "ignored": Liste von Strings für gefilterte/ignorierte Texte
Bei mehreren Sprachen (hierarchische Struktur): Existiert die Ausgabedatei bereits und enthält sie Sprachblöcke, werden
- "[EN]": {"translations": [...], "untranslated": [...]} diese ERHALTEN und nur die neu angegebenen Sprachen aktualisiert. So können
- "[FR]": {"translations": [...], "untranslated": [...]} CS- und EN-Übersetzungen schrittweise in dieselbe Datei geschrieben werden.
- "ignored": Liste von Strings für gefilterte/ignorierte Texte
Nur ohne --translate wird die flache Struktur verwendet:
- "translations": [...]
- "untranslated": [...]
- "ignored": [...]
Args: Args:
texts: Liste der akzeptierten Texte texts: Liste der akzeptierten Texte
ignored_texts: Liste der ignorierten Texte ignored_texts: Liste der ignorierten Texte
output_path: Pfad zur Ausgabe-JSON-Datei output_path: Pfad zur Ausgabe-JSON-Datei
translation_dicts: Optional: Tuple mit (Multi, Trigramme, Bigramme, Single) für eine Sprache (backwards compatibility) translation_dicts: Optional: Tuple für eine Sprache (für Excel/Text-Ausgabe, hier ignoriert)
translation_dicts_all: Optional: Dict mit {LANG: (multi, trigramme, bigramme, single)} für mehrere Sprachen translation_dicts_all: Optional: Dict mit {LANG: (multi, trigramme, bigramme, single)}
translation_languages: Optional: Liste der Sprachen in der Reihenfolge der Verarbeitung translation_languages: Optional: Liste der Sprachen in der Reihenfolge der Verarbeitung
""" """
output_data = {} output_data = {}
# Mehrsprachige hierarchische Struktur # Hierarchische Struktur: immer wenn mindestens eine Übersetzungssprache angegeben
if translation_dicts_all and translation_languages and len(translation_languages) > 1: if translation_dicts_all and translation_languages:
# Lade bestehende Sprachblöcke aus vorhandener Datei (Merge-Unterstützung)
existing_lang_blocks = {}
if output_path.exists():
try:
with open(output_path, 'r', encoding='utf-8') as f:
existing = json.load(f)
if isinstance(existing, dict):
for key, value in existing.items():
if key.startswith('[') and key.endswith(']') and len(key) > 2:
existing_lang_blocks[key] = value
if existing_lang_blocks:
preserved = [k for k in existing_lang_blocks
if k not in {f"[{lang}]" for lang in translation_languages}]
if preserved:
print(f" Bestehende Sprachblöcke übernommen: {', '.join(preserved)}")
except Exception:
pass # Fehler beim Laden → einfach neu schreiben
# Übernehme Sprachblöcke, die NICHT neu generiert werden
new_lang_keys = {f"[{lang}]" for lang in translation_languages}
for key, value in existing_lang_blocks.items():
if key not in new_lang_keys:
output_data[key] = value
# Generiere neue/aktualisierte Sprachblöcke
for lang in translation_languages: for lang in translation_languages:
if lang not in translation_dicts_all: if lang not in translation_dicts_all:
continue continue
@@ -1311,18 +1342,11 @@ def write_texts_to_json(texts: list[str], ignored_texts: list[str], output_path:
for text in texts: for text in texts:
translated = translate_text(text, multi, trigramme, bigramme, single) translated = translate_text(text, multi, trigramme, bigramme, single)
if translated: # Übersetzung vorhanden if translated:
translations.append({ translations.append({"source": text, "target": translated})
"source": text, else:
"target": translated untranslated.append({"source": text, "target": ""})
})
else: # Keine Übersetzung vorhanden
untranslated.append({
"source": text,
"target": ""
})
# Hierarchische Struktur: [LANG] als Schlüssel
output_data[f"[{lang}]"] = { output_data[f"[{lang}]"] = {
"translations": translations, "translations": translations,
"untranslated": untranslated "untranslated": untranslated
@@ -1331,10 +1355,8 @@ def write_texts_to_json(texts: list[str], ignored_texts: list[str], output_path:
# Ignorierte Texte am Ende (ohne Sprachzuordnung) # Ignorierte Texte am Ende (ohne Sprachzuordnung)
output_data["ignored"] = ignored_texts output_data["ignored"] = ignored_texts
# Alte Struktur (eine Sprache oder keine Übersetzung) # Flache Struktur: ohne Übersetzungssprachen
else: else:
# Block 1: Übersetzte Texte (als Liste von Dicts mit source/target)
# Block 2: Nicht übersetzte Texte (als Liste von Dicts mit source und leerem target)
if translation_dicts: if translation_dicts:
multi, trigramme, bigramme, single = translation_dicts multi, trigramme, bigramme, single = translation_dicts
translations = [] translations = []
@@ -1342,16 +1364,10 @@ def write_texts_to_json(texts: list[str], ignored_texts: list[str], output_path:
for text in texts: for text in texts:
translated = translate_text(text, multi, trigramme, bigramme, single) translated = translate_text(text, multi, trigramme, bigramme, single)
if translated: # Übersetzung vorhanden if translated:
translations.append({ translations.append({"source": text, "target": translated})
"source": text, else:
"target": translated untranslated.append({"source": text, "target": ""})
})
else: # Keine Übersetzung vorhanden
untranslated.append({
"source": text,
"target": ""
})
output_data["translations"] = translations output_data["translations"] = translations
output_data["untranslated"] = untranslated output_data["untranslated"] = untranslated
@@ -1360,7 +1376,6 @@ def write_texts_to_json(texts: list[str], ignored_texts: list[str], output_path:
output_data["translations"] = [] output_data["translations"] = []
output_data["untranslated"] = [{"source": text, "target": ""} for text in texts] output_data["untranslated"] = [{"source": text, "target": ""} for text in texts]
# Block 3: Ignorierte Texte (als Liste)
output_data["ignored"] = ignored_texts output_data["ignored"] = ignored_texts
try: try:
@@ -1370,14 +1385,16 @@ def write_texts_to_json(texts: list[str], ignored_texts: list[str], output_path:
print(f"JSON-Datei erfolgreich erstellt: {output_path}") print(f"JSON-Datei erfolgreich erstellt: {output_path}")
# Ausgabe-Statistiken # Ausgabe-Statistiken
if translation_dicts_all and translation_languages and len(translation_languages) > 1: if translation_dicts_all and translation_languages:
# Mehrsprachige Struktur # Alle Sprachblöcke in der Ausgabedatei anzeigen (inkl. übernommene)
for lang in translation_languages: for key in output_data:
if f"[{lang}]" in output_data: if key.startswith('[') and key.endswith(']') and len(key) > 2:
lang_data = output_data[f"[{lang}]"] lang_data = output_data[key]
print(f" [{lang}] Übersetzungen: {len(lang_data['translations'])}, Nicht übersetzt: {len(lang_data['untranslated'])}") lang = key[1:-1]
marker = "" if lang in translation_languages else " (übernommen)"
print(f" [{lang}]{marker} Übersetzungen: {len(lang_data['translations'])}, "
f"Nicht übersetzt: {len(lang_data['untranslated'])}")
else: else:
# Alte Struktur
if translation_dicts: if translation_dicts:
print(f" Übersetzungen: {len(output_data['translations'])}") print(f" Übersetzungen: {len(output_data['translations'])}")
print(f" Nicht übersetzte Texte: {len(output_data['untranslated'])}") print(f" Nicht übersetzte Texte: {len(output_data['untranslated'])}")
@@ -1520,8 +1537,8 @@ def retranslate_json_file(json_path: Path,
multi, trigramme, bigramme, single = translation_dicts_all[translation_languages[0]] multi, trigramme, bigramme, single = translation_dicts_all[translation_languages[0]]
# Re-übersetze alle Einträge # Re-übersetze alle Einträge in translations
for entry in translations_list: for entry in translations_list[:]: # Kopie für sicheres Entfernen
if not isinstance(entry, dict) or 'source' not in entry: if not isinstance(entry, dict) or 'source' not in entry:
continue continue
@@ -1548,9 +1565,32 @@ def retranslate_json_file(json_path: Path,
translations_list.remove(entry) translations_list.remove(entry)
print(f" WARNUNG: Übersetzung für '{source}' nicht mehr verfügbar, verschoben zu 'untranslated'") print(f" WARNUNG: Übersetzung für '{source}' nicht mehr verfügbar, verschoben zu 'untranslated'")
# Versuche auch Einträge aus untranslated zu auto-übersetzen und nach translations verschieben
untranslated_list = data.get('untranslated', [])
newly_translated = 0
for entry in untranslated_list[:]: # Kopie für sicheres Entfernen
if not isinstance(entry, dict) or 'source' not in entry:
continue
if entry.get('target', ''):
# Manuell befüllter Eintrag bereits übersetzt, in translations verschieben
translations_list.append(entry)
untranslated_list.remove(entry)
newly_translated += 1
updated_count += 1
continue
source = entry['source']
new_target = translate_text(source, multi, trigramme, bigramme, single)
if new_target:
translations_list.append({"source": source, "target": new_target})
untranslated_list.remove(entry)
newly_translated += 1
updated_count += 1
print(f"\nRe-Übersetzung abgeschlossen (alte Struktur, Sprache: {translation_languages[0]}):") print(f"\nRe-Übersetzung abgeschlossen (alte Struktur, Sprache: {translation_languages[0]}):")
print(f" Aktualisiert: {updated_count}") print(f" Aktualisiert (translations): {updated_count - newly_translated}")
print(f" Unverändert: {unchanged_count}") print(f" Unverändert: {unchanged_count}")
if newly_translated:
print(f" Neu aus 'untranslated' übersetzt/verschoben: {newly_translated}")
elif structure_type == "multilang": elif structure_type == "multilang":
# Hierarchische mehrsprachige Struktur # Hierarchische mehrsprachige Struktur
@@ -1595,7 +1635,7 @@ def retranslate_json_file(json_path: Path,
lang_updated = 0 lang_updated = 0
lang_unchanged = 0 lang_unchanged = 0
# Re-übersetze alle Einträge für diese Sprache # Re-übersetze alle Einträge in translations
for entry in translations_list[:]: # Kopie der Liste für sicheres Entfernen for entry in translations_list[:]: # Kopie der Liste für sicheres Entfernen
if not isinstance(entry, dict) or 'source' not in entry: if not isinstance(entry, dict) or 'source' not in entry:
continue continue
@@ -1621,10 +1661,34 @@ def retranslate_json_file(json_path: Path,
translations_list.remove(entry) translations_list.remove(entry)
print(f" WARNUNG: [{lang}] Übersetzung für '{source}' nicht mehr verfügbar, verschoben zu 'untranslated'") print(f" WARNUNG: [{lang}] Übersetzung für '{source}' nicht mehr verfügbar, verschoben zu 'untranslated'")
# Versuche auch Einträge aus untranslated zu auto-übersetzen und nach translations verschieben
untranslated_list = lang_data['untranslated']
lang_newly = 0
for entry in untranslated_list[:]: # Kopie für sicheres Entfernen
if not isinstance(entry, dict) or 'source' not in entry:
continue
if entry.get('target', ''):
# Manuell befüllter Eintrag bereits übersetzt, in translations verschieben
translations_list.append(entry)
untranslated_list.remove(entry)
lang_newly += 1
lang_updated += 1
continue
source = entry['source']
new_target = translate_text(source, multi, trigramme, bigramme, single)
if new_target:
translations_list.append({"source": source, "target": new_target})
untranslated_list.remove(entry)
lang_newly += 1
lang_updated += 1
updated_count += lang_updated updated_count += lang_updated
unchanged_count += lang_unchanged unchanged_count += lang_unchanged
print(f" [{lang}] Aktualisiert: {lang_updated}, Unverändert: {lang_unchanged}") print(f" [{lang}] Aktualisiert: {lang_updated - lang_newly}, Unverändert: {lang_unchanged}", end="")
if lang_newly:
print(f", Neu aus 'untranslated': {lang_newly}", end="")
print()
print(f"\nRe-Übersetzung abgeschlossen (mehrsprachige Struktur):") print(f"\nRe-Übersetzung abgeschlossen (mehrsprachige Struktur):")
print(f" Gesamt aktualisiert: {updated_count}") print(f" Gesamt aktualisiert: {updated_count}")