Korrektur: Translated und untranslated müssen neu angeschaut werden
This commit is contained in:
+112
-48
@@ -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}")
|
||||||
|
|||||||
Reference in New Issue
Block a user