Toter Code und Funktionen entfernt
This commit is contained in:
+75
-27
@@ -517,10 +517,10 @@ def load_ignore_patterns(cfg_path: Path) -> tuple[list[str], list[str]]:
|
||||
return wildcard_patterns, regex_patterns
|
||||
|
||||
|
||||
def translate_text(text: str, multi: dict[str, str], trigramme: dict[str, str], bigramme: dict[str, str], single: dict[str, str]) -> str:
|
||||
def translate_text(text: str, multi: dict[str, str], trigramme: dict[str, str], bigramme: dict[str, str], single: dict[str, str], transfer_terms: set[str] | None = None) -> str:
|
||||
"""
|
||||
Übersetzt einen Text durch Ersetzen von Multi-Phrasen, Trigrammen, Bigrammen und Einzelwörtern.
|
||||
Ersetzungen erfolgen in dieser Reihenfolge: Multi → Trigramme → Bigramme → Einzelwörter.
|
||||
Ersetzungen erfolgen in dieser Reihenfolge: Transfer → Multi → Trigramme → Bigramme → Einzelwörter.
|
||||
|
||||
Bei Einzelwörtern werden auch Satzzeichen und eingebettete Wörter berücksichtigt:
|
||||
- "Weight:" wird zu "Hmotnost:" (Doppelpunkt bleibt erhalten)
|
||||
@@ -529,16 +529,23 @@ def translate_text(text: str, multi: dict[str, str], trigramme: dict[str, str],
|
||||
(alle Wörter in einem Token werden durchsucht, Trennzeichen bleiben erhalten)
|
||||
Bindestriche im Wort (wie "Sub-distributor") bleiben Teil des Kern-Worts.
|
||||
|
||||
Transfer-Begriffe werden 1:1 übernommen (ohne Übersetzung) wenn der Text exakt übereinstimmt.
|
||||
|
||||
Args:
|
||||
text: Zu übersetzender Text
|
||||
multi: Dictionary mit Multi-Wort-Phrasen (4+ Wörter)
|
||||
trigramme: Dictionary mit Drei-Wort-Phrasen
|
||||
bigramme: Dictionary mit Zwei-Wort-Phrasen
|
||||
single: Dictionary mit Einzelwörtern
|
||||
transfer_terms: Set mit Begriffen die 1:1 übernommen werden (aus [transfer] Sektion)
|
||||
|
||||
Returns:
|
||||
Übersetzter Text (leer wenn keine Übersetzung gefunden wurde)
|
||||
"""
|
||||
# 0. Prüfe Transfer-Begriffe (exakte Übereinstimmung, 1:1 Übernahme)
|
||||
if transfer_terms is not None and text in transfer_terms:
|
||||
return text
|
||||
|
||||
translated_text = text
|
||||
has_translation = False
|
||||
|
||||
@@ -1668,7 +1675,8 @@ def _retranslate_language_block(
|
||||
trigramme: dict[str, str],
|
||||
bigramme: dict[str, str],
|
||||
single: dict[str, str],
|
||||
label: str) -> tuple[int, int, int]:
|
||||
label: str,
|
||||
transfer_terms: set[str] | None = None) -> tuple[int, int, int, int]:
|
||||
"""
|
||||
Verarbeitet einen einzelnen Sprach-Block einer JSON-Übersetzungsdatei in-place.
|
||||
|
||||
@@ -1687,6 +1695,8 @@ def _retranslate_language_block(
|
||||
Einträge mit bereits gesetztem target (manuell befüllt) werden
|
||||
ebenfalls direkt nach translations_list übernommen.
|
||||
|
||||
Schritt 3 – Transfer-Begriffe werden 1:1 übernommen (ohne Übersetzung).
|
||||
|
||||
Args:
|
||||
translations_list: Liste der bereits übersetzten Einträge (in-place verändert)
|
||||
untranslated_list: Liste der noch nicht übersetzten Einträge (in-place verändert)
|
||||
@@ -1695,13 +1705,15 @@ def _retranslate_language_block(
|
||||
bigramme: Bigramme-Dict
|
||||
single: Einzelwörter-Dict
|
||||
label: Bezeichnung für Warnmeldungen, z.B. "[CS]"
|
||||
transfer_terms: Set mit Begriffen die 1:1 übernommen werden (aus [transfer] Sektion)
|
||||
|
||||
Returns:
|
||||
Tuple (aktualisiert, unveraendert, neu_aus_untranslated)
|
||||
Tuple (aktualisiert, unveraendert, neu_aus_untranslated, transferred)
|
||||
"""
|
||||
updated = 0
|
||||
unchanged = 0
|
||||
newly = 0
|
||||
transferred = 0
|
||||
|
||||
# Schritt 0: Deduplizierung – erstes Vorkommen je source wird behalten
|
||||
deduped_t, seen_t = _dedup_source_list(
|
||||
@@ -1718,7 +1730,7 @@ def _retranslate_language_block(
|
||||
continue
|
||||
source = entry['source']
|
||||
old_target = entry.get('target', '')
|
||||
new_target = translate_text(source, multi, trigramme, bigramme, single)
|
||||
new_target = translate_text(source, multi, trigramme, bigramme, single, transfer_terms)
|
||||
if new_target:
|
||||
if new_target != old_target:
|
||||
entry['target'] = new_target
|
||||
@@ -1743,18 +1755,23 @@ def _retranslate_language_block(
|
||||
newly += 1
|
||||
continue
|
||||
source = entry['source']
|
||||
new_target = translate_text(source, multi, trigramme, bigramme, single)
|
||||
new_target = translate_text(source, multi, trigramme, bigramme, single, transfer_terms)
|
||||
if new_target:
|
||||
translations_list.append({"source": source, "target": new_target})
|
||||
untranslated_list.remove(entry)
|
||||
newly += 1
|
||||
# Prüfe ob es ein Transfer-Begriff war
|
||||
if transfer_terms and source in transfer_terms:
|
||||
transferred += 1
|
||||
else:
|
||||
newly += 1
|
||||
|
||||
return updated, unchanged, newly
|
||||
return updated, unchanged, newly, transferred
|
||||
|
||||
|
||||
def _retranslate_legacy(data: dict,
|
||||
translation_languages: list[str],
|
||||
translation_dicts_all: dict[str, tuple]) -> dict:
|
||||
translation_dicts_all: dict[str, tuple],
|
||||
transfer_terms_all: dict[str, set[str]] | None = None) -> dict:
|
||||
"""
|
||||
Verarbeitet eine Legacy-Flat-JSON-Struktur und konvertiert sie ins Multilang-Format.
|
||||
|
||||
@@ -1762,6 +1779,7 @@ def _retranslate_legacy(data: dict,
|
||||
data: Geladene JSON-Daten (flache Struktur mit 'translations'/'untranslated')
|
||||
translation_languages: Sprachen in der Reihenfolge der Verarbeitung
|
||||
translation_dicts_all: Dict mit {LANG: (multi, trigramme, bigramme, single), ...}
|
||||
transfer_terms_all: Dict mit {LANG: set[transfer_terms], ...} (aus [transfer] Sektion)
|
||||
|
||||
Returns:
|
||||
Konvertierte Daten im Multilang-Format
|
||||
@@ -1778,11 +1796,13 @@ def _retranslate_legacy(data: dict,
|
||||
|
||||
lang = translation_languages[0]
|
||||
multi, trigramme, bigramme, single = translation_dicts_all[lang]
|
||||
transfer_terms = transfer_terms_all.get(lang, set()) if transfer_terms_all else set()
|
||||
|
||||
updated, unchanged, newly = _retranslate_language_block(
|
||||
updated, unchanged, newly, transferred = _retranslate_language_block(
|
||||
data['translations'], data['untranslated'],
|
||||
multi, trigramme, bigramme, single,
|
||||
f"[{lang}]"
|
||||
f"[{lang}]",
|
||||
transfer_terms
|
||||
)
|
||||
|
||||
print(f"\nRe-Übersetzung abgeschlossen (alte Struktur → wird zu multilang konvertiert, Sprache: {lang}):")
|
||||
@@ -1790,6 +1810,8 @@ def _retranslate_legacy(data: dict,
|
||||
print(f" Unverändert: {unchanged}")
|
||||
if newly:
|
||||
print(f" Neu aus 'untranslated' übersetzt/verschoben: {newly}")
|
||||
if transferred:
|
||||
print(f" Transfer-Begriffe (1:1): {transferred}")
|
||||
|
||||
# Legacy → Multilang konvertieren: flache Struktur in [LANG]-Block einpacken
|
||||
return {
|
||||
@@ -1804,7 +1826,8 @@ def _retranslate_legacy(data: dict,
|
||||
def _retranslate_multilang(data: dict,
|
||||
existing_languages: list[str],
|
||||
translation_languages: list[str],
|
||||
translation_dicts_all: dict[str, tuple]) -> None:
|
||||
translation_dicts_all: dict[str, tuple],
|
||||
transfer_terms_all: dict[str, set[str]] | None = None) -> None:
|
||||
"""
|
||||
Verarbeitet eine Multilang-JSON-Struktur in-place.
|
||||
|
||||
@@ -1813,12 +1836,14 @@ def _retranslate_multilang(data: dict,
|
||||
existing_languages: Sprachen die bereits in der Datei vorhanden sind
|
||||
translation_languages: Sprachen in der Reihenfolge der Verarbeitung
|
||||
translation_dicts_all: Dict mit {LANG: (multi, trigramme, bigramme, single), ...}
|
||||
transfer_terms_all: Dict mit {LANG: set[transfer_terms], ...} (aus [transfer] Sektion)
|
||||
"""
|
||||
print(f"Erkannte mehrsprachige Struktur mit Sprachen: {', '.join(existing_languages)}")
|
||||
|
||||
total_updated = 0
|
||||
total_unchanged = 0
|
||||
total_newly = 0
|
||||
total_transferred = 0
|
||||
new_block_count = 0
|
||||
|
||||
for lang in translation_languages:
|
||||
@@ -1844,30 +1869,38 @@ def _retranslate_multilang(data: dict,
|
||||
continue
|
||||
|
||||
multi, trigramme, bigramme, single = translation_dicts_all[lang]
|
||||
updated, unchanged, newly = _retranslate_language_block(
|
||||
transfer_terms = transfer_terms_all.get(lang, set()) if transfer_terms_all else set()
|
||||
updated, unchanged, newly, transferred = _retranslate_language_block(
|
||||
lang_data['translations'], lang_data['untranslated'],
|
||||
multi, trigramme, bigramme, single,
|
||||
f"[{lang}]"
|
||||
f"[{lang}]",
|
||||
transfer_terms
|
||||
)
|
||||
total_updated += updated + newly
|
||||
total_unchanged += unchanged
|
||||
total_newly += newly
|
||||
total_transferred += transferred
|
||||
|
||||
print(f" [{lang}] Aktualisiert: {updated}, Unverändert: {unchanged}", end="")
|
||||
if newly:
|
||||
print(f", Neu aus 'untranslated': {newly}", end="")
|
||||
if transferred:
|
||||
print(f", Transfer-Begriffe (1:1): {transferred}", end="")
|
||||
print()
|
||||
|
||||
print(f"\nRe-Übersetzung abgeschlossen (mehrsprachige Struktur):")
|
||||
print(f" Gesamt aktualisiert: {total_updated}")
|
||||
print(f" Gesamt unverändert: {total_unchanged}")
|
||||
if total_transferred:
|
||||
print(f" Gesamt Transfer-Begriffe (1:1): {total_transferred}")
|
||||
if new_block_count:
|
||||
print(f" Neue Sprach-Blöcke erstellt: {new_block_count}")
|
||||
|
||||
|
||||
def retranslate_json_file(json_path: Path,
|
||||
translation_dicts_all: dict[str, tuple],
|
||||
translation_languages: list[str]):
|
||||
translation_languages: list[str],
|
||||
transfer_terms_all: dict[str, set[str]] | None = None):
|
||||
"""
|
||||
Re-übersetzt eine JSON-Datei mit neuen Übersetzungs-Configs.
|
||||
Überschreibt die ursprüngliche JSON-Datei mit den aktualisierten Übersetzungen.
|
||||
@@ -1894,9 +1927,9 @@ def retranslate_json_file(json_path: Path,
|
||||
structure_type, existing_languages = detect_json_structure(data)
|
||||
|
||||
if structure_type == "legacy":
|
||||
data = _retranslate_legacy(data, translation_languages, translation_dicts_all)
|
||||
data = _retranslate_legacy(data, translation_languages, translation_dicts_all, transfer_terms_all)
|
||||
elif structure_type == "multilang":
|
||||
_retranslate_multilang(data, existing_languages, translation_languages, translation_dicts_all)
|
||||
_retranslate_multilang(data, existing_languages, translation_languages, translation_dicts_all, transfer_terms_all)
|
||||
else:
|
||||
print(f"FEHLER: JSON-Datei hat unbekannte Struktur")
|
||||
sys.exit(1)
|
||||
@@ -2004,7 +2037,8 @@ def retranslate_txt_file(txt_path: Path,
|
||||
translation_dicts_all: dict[str, tuple],
|
||||
translation_languages: list[str],
|
||||
wildcard_patterns: list[str] | None = None,
|
||||
regex_patterns: list[str] | None = None) -> None:
|
||||
regex_patterns: list[str] | None = None,
|
||||
transfer_terms_all: dict[str, set[str]] | None = None) -> None:
|
||||
"""
|
||||
Re-übersetzt eine Textdatei im Format von write_texts_to_text.
|
||||
Überschreibt die ursprüngliche Datei mit aktualisierten Inhalten.
|
||||
@@ -2015,6 +2049,7 @@ def retranslate_txt_file(txt_path: Path,
|
||||
2. Einträge aus untranslated werden gegen die Ignore-Pattern geprüft:
|
||||
- Treffer → ignored (neu erkannte Pattern seit dem letzten Extrakt)
|
||||
- Kein Treffer → auto-übersetzen; Erfolg → translations, sonst bleibt in untranslated.
|
||||
3. Transfer-Begriffe werden 1:1 übernommen (ohne Übersetzung).
|
||||
|
||||
Arbeitet immer mit der ersten Sprache aus translation_languages.
|
||||
|
||||
@@ -2024,6 +2059,7 @@ def retranslate_txt_file(txt_path: Path,
|
||||
translation_languages: Liste der Sprachen (nur die erste wird verwendet)
|
||||
wildcard_patterns: Wildcard-Muster zum Filtern (aus translator.cfg)
|
||||
regex_patterns: Regex-Muster zum Filtern (aus translator.cfg)
|
||||
transfer_terms_all: Dict mit {LANG: set[transfer_terms], ...} (aus [transfer] Sektion)
|
||||
"""
|
||||
if not translation_languages or translation_languages[0] not in translation_dicts_all:
|
||||
print(f"FEHLER: Keine Übersetzungs-Config für Re-Übersetzung verfügbar")
|
||||
@@ -2034,6 +2070,7 @@ def retranslate_txt_file(txt_path: Path,
|
||||
|
||||
lang = translation_languages[0]
|
||||
multi, trigramme, bigramme, single = translation_dicts_all[lang]
|
||||
transfer_terms = transfer_terms_all.get(lang, set()) if transfer_terms_all else set()
|
||||
|
||||
existing_translations, untranslated, ignored = _parse_txt_sections(txt_path)
|
||||
|
||||
@@ -2048,7 +2085,7 @@ def retranslate_txt_file(txt_path: Path,
|
||||
|
||||
# Schritt 1: Bestehende Übersetzungen neu übersetzen
|
||||
for source, old_target in existing_translations:
|
||||
new_target = translate_text(source, multi, trigramme, bigramme, single)
|
||||
new_target = translate_text(source, multi, trigramme, bigramme, single, transfer_terms)
|
||||
if new_target:
|
||||
new_translations.append((source, new_target))
|
||||
if new_target != old_target:
|
||||
@@ -2064,16 +2101,21 @@ def retranslate_txt_file(txt_path: Path,
|
||||
still_untranslated: list[str] = list(moved_to_untranslated)
|
||||
newly = 0
|
||||
newly_ignored = 0
|
||||
transferred = 0
|
||||
for text in untranslated:
|
||||
# Neu hinzugefügte Ignore-Pattern prüfen
|
||||
if should_ignore_text(text, wildcard_patterns, regex_patterns):
|
||||
ignored.append(text)
|
||||
newly_ignored += 1
|
||||
continue
|
||||
new_target = translate_text(text, multi, trigramme, bigramme, single)
|
||||
new_target = translate_text(text, multi, trigramme, bigramme, single, transfer_terms)
|
||||
if new_target:
|
||||
new_translations.append((text, new_target))
|
||||
newly += 1
|
||||
# Prüfe ob es ein Transfer-Begriff war
|
||||
if transfer_terms and text in transfer_terms:
|
||||
transferred += 1
|
||||
else:
|
||||
newly += 1
|
||||
else:
|
||||
still_untranslated.append(text)
|
||||
|
||||
@@ -2098,6 +2140,8 @@ def retranslate_txt_file(txt_path: Path,
|
||||
print(f" Unverändert: {unchanged}")
|
||||
if newly:
|
||||
print(f" Neu übersetzt: {newly}")
|
||||
if transferred:
|
||||
print(f" Transfer-Begriffe (1:1): {transferred}")
|
||||
if newly_ignored:
|
||||
print(f" Neu ignoriert (Pattern): {newly_ignored}")
|
||||
if moved_to_untranslated:
|
||||
@@ -2112,7 +2156,8 @@ def _run_retranslate_txt(
|
||||
translation_dicts_all: dict,
|
||||
translation_languages: list,
|
||||
wildcard_patterns: list,
|
||||
regex_patterns: list) -> None:
|
||||
regex_patterns: list,
|
||||
transfer_terms_all: dict) -> None:
|
||||
"""Workflow: Re-Übersetzung einer bestehenden TXT-Datei (--retranslate-txt)."""
|
||||
print("=== Re-Übersetzung TXT-Datei ===\n")
|
||||
|
||||
@@ -2127,7 +2172,7 @@ def _run_retranslate_txt(
|
||||
print(f"Sprache: {translation_languages[0]}")
|
||||
|
||||
retranslate_txt_file(txt_file, translation_dicts_all, translation_languages,
|
||||
wildcard_patterns, regex_patterns)
|
||||
wildcard_patterns, regex_patterns, transfer_terms_all)
|
||||
|
||||
print("\nVerarbeitung erfolgreich abgeschlossen.")
|
||||
sys.exit(0)
|
||||
@@ -2227,7 +2272,8 @@ def _run_retranslate(
|
||||
args,
|
||||
work_dir: Path,
|
||||
translation_dicts_all: dict,
|
||||
translation_languages: list) -> None:
|
||||
translation_languages: list,
|
||||
transfer_terms_all: dict) -> None:
|
||||
"""Workflow: Re-Übersetzung einer bestehenden JSON-Datei (--retranslate-json)."""
|
||||
print("=== Re-Übersetzung JSON-Datei ===\n")
|
||||
|
||||
@@ -2241,7 +2287,7 @@ def _run_retranslate(
|
||||
print(f"JSON-Datei: {json_file}")
|
||||
print(f"Sprachen: {', '.join(translation_languages)}")
|
||||
|
||||
retranslate_json_file(json_file, translation_dicts_all, translation_languages)
|
||||
retranslate_json_file(json_file, translation_dicts_all, translation_languages, transfer_terms_all)
|
||||
|
||||
print("\nVerarbeitung erfolgreich abgeschlossen.")
|
||||
sys.exit(0)
|
||||
@@ -2451,10 +2497,12 @@ def main() -> None:
|
||||
|
||||
# Übersetzungs-Configs laden: {LANG: (multi, trigramme, bigramme, single), ...}
|
||||
translation_dicts_all = {}
|
||||
transfer_terms_all = {}
|
||||
if translation_languages:
|
||||
translation_dir = check_environment_var('PROJECT_TRANSLATION')
|
||||
for lang in translation_languages:
|
||||
translation_dicts_all[lang] = load_translation_config(lang, translation_dir)
|
||||
transfer_terms_all[lang] = load_transfer_terms(lang, translation_dir)
|
||||
|
||||
# Für backwards compatibility: bei genau einer Sprache flaches Dict bereitstellen
|
||||
translation_dicts = translation_dicts_all.get(translation_languages[0]) if len(translation_languages) == 1 else None
|
||||
@@ -2464,11 +2512,11 @@ def main() -> None:
|
||||
|
||||
# Workflow delegieren
|
||||
if args.retranslate_json:
|
||||
_run_retranslate(args, work_dir, translation_dicts_all, translation_languages)
|
||||
_run_retranslate(args, work_dir, translation_dicts_all, translation_languages, transfer_terms_all)
|
||||
|
||||
if args.retranslate_txt:
|
||||
_run_retranslate_txt(args, work_dir, translation_dicts_all, translation_languages,
|
||||
wildcard_patterns, regex_patterns)
|
||||
wildcard_patterns, regex_patterns, transfer_terms_all)
|
||||
|
||||
if args.todxf:
|
||||
_run_todxf(args, work_dir, translation_languages, wildcard_patterns, regex_patterns,
|
||||
|
||||
Reference in New Issue
Block a user