Merge branch 'main' of http://gitea.schoenenberger.de/mistangl/kabellaengen
This commit is contained in:
+83
-18
@@ -342,6 +342,49 @@ def load_translation_config(translation_lang: str, translation_dir: Path) -> tup
|
|||||||
return multi, trigramme, bigramme, single
|
return multi, trigramme, bigramme, single
|
||||||
|
|
||||||
|
|
||||||
|
def load_transfer_terms(translation_lang: str, translation_dir: Path) -> set[str]:
|
||||||
|
"""
|
||||||
|
Lädt die Transfer-Begriffe aus einer Übersetzungs-Config-Datei (Abschnitt [transfer]).
|
||||||
|
|
||||||
|
Transfer-Begriffe werden beim Übersetzen von Symbol-Attributen (Block-Inserts) ohne
|
||||||
|
Übersetzung direkt in das Ziel-Attribut übernommen. Für TEXT/MTEXT-Objekte gilt
|
||||||
|
diese Regel nicht.
|
||||||
|
|
||||||
|
Einträge im Abschnitt [transfer] stehen einzeln pro Zeile (ohne Wert/Gleichheitszeichen).
|
||||||
|
|
||||||
|
Args:
|
||||||
|
translation_lang: Sprach-Code (z.B. "CS", "EN", "FR")
|
||||||
|
translation_dir: Verzeichnis mit Übersetzungs-Configs (aus PROJECT_TRANSLATION)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Set mit den Transfer-Begriffen (Groß-/Kleinschreibung wie in der Config)
|
||||||
|
"""
|
||||||
|
config_file = translation_dir / f"{translation_lang}.cfg"
|
||||||
|
|
||||||
|
if not config_file.exists():
|
||||||
|
return set()
|
||||||
|
|
||||||
|
config = RawConfigParser(allow_no_value=True)
|
||||||
|
config.optionxform = str
|
||||||
|
try:
|
||||||
|
config.read(config_file, encoding='utf-8')
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Warnung: Fehler beim Lesen der Transfer-Begriffe aus {config_file}: {e}")
|
||||||
|
return set()
|
||||||
|
|
||||||
|
transfer: set[str] = set()
|
||||||
|
if config.has_section('transfer'):
|
||||||
|
for key in config['transfer']:
|
||||||
|
term = key.strip()
|
||||||
|
if term and not term.startswith('#'):
|
||||||
|
transfer.add(term)
|
||||||
|
|
||||||
|
if transfer:
|
||||||
|
print(f" Transfer-Begriffe ({translation_lang}): {len(transfer)} ({', '.join(sorted(transfer))})")
|
||||||
|
|
||||||
|
return transfer
|
||||||
|
|
||||||
|
|
||||||
def load_symbol_attribute_mapping(cfg_path: Path) -> dict[str, str]:
|
def load_symbol_attribute_mapping(cfg_path: Path) -> dict[str, str]:
|
||||||
"""
|
"""
|
||||||
Liest die Zuordnung von Sprachcodes zu Symbol-Attributnamen aus der translator.cfg Datei.
|
Liest die Zuordnung von Sprachcodes zu Symbol-Attributnamen aus der translator.cfg Datei.
|
||||||
@@ -1084,7 +1127,8 @@ def translate_block_attribute(entity,
|
|||||||
required_attributes: set[str],
|
required_attributes: set[str],
|
||||||
text_source_attr: str,
|
text_source_attr: str,
|
||||||
text_target_attr: str,
|
text_target_attr: str,
|
||||||
target_layer: str | None = None) -> tuple[int, int, int]:
|
target_layer: str | None = None,
|
||||||
|
transfer_terms: set[str] | None = None) -> tuple[int, int, int, int]:
|
||||||
"""
|
"""
|
||||||
Übersetzt Text-Attribute eines einzelnen Block-Inserts (INSERT entity).
|
Übersetzt Text-Attribute eines einzelnen Block-Inserts (INSERT entity).
|
||||||
|
|
||||||
@@ -1098,12 +1142,13 @@ def translate_block_attribute(entity,
|
|||||||
text_source_attr: Quell-Attributname (z.B. "TEXT-D", "TEXT-EN")
|
text_source_attr: Quell-Attributname (z.B. "TEXT-D", "TEXT-EN")
|
||||||
text_target_attr: Ziel-Attributname (z.B. "TEXT-EN", "TEXT-CS")
|
text_target_attr: Ziel-Attributname (z.B. "TEXT-EN", "TEXT-CS")
|
||||||
target_layer: Ziel-Layername für das Ziel-Attribut (aus [symbol_layer])
|
target_layer: Ziel-Layername für das Ziel-Attribut (aus [symbol_layer])
|
||||||
|
transfer_terms: Begriffe die ohne Übersetzung direkt übernommen werden (aus [transfer])
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Tuple mit (translated_count, skipped_count, ignored_count) für diesen Block
|
Tuple mit (translated_count, skipped_count, ignored_count, transferred_count) für diesen Block
|
||||||
"""
|
"""
|
||||||
if not entity.has_attrib:
|
if not entity.has_attrib:
|
||||||
return 0, 0, 0
|
return 0, 0, 0, 0
|
||||||
|
|
||||||
# Sammle alle vorhandenen Attribute des Blocks
|
# Sammle alle vorhandenen Attribute des Blocks
|
||||||
block_attributes = {}
|
block_attributes = {}
|
||||||
@@ -1119,25 +1164,30 @@ def translate_block_attribute(entity,
|
|||||||
|
|
||||||
# Prüfe ob Block alle erforderlichen Attribute hat
|
# Prüfe ob Block alle erforderlichen Attribute hat
|
||||||
if not (required_attributes.issubset(block_attributes.keys()) and text_source_attrib):
|
if not (required_attributes.issubset(block_attributes.keys()) and text_source_attrib):
|
||||||
return 0, 0, 0
|
return 0, 0, 0, 0
|
||||||
|
|
||||||
original_text = text_source_attrib.dxf.text.strip() if text_source_attrib.dxf.text else None
|
original_text = text_source_attrib.dxf.text.strip() if text_source_attrib.dxf.text else None
|
||||||
|
|
||||||
if not original_text:
|
if not original_text:
|
||||||
return 0, 0, 0
|
return 0, 0, 0, 0
|
||||||
|
|
||||||
# Prüfe ob Text ignoriert werden soll
|
# Prüfe ob Text ignoriert werden soll
|
||||||
if should_ignore_text(original_text, wildcard_patterns, regex_patterns):
|
if should_ignore_text(original_text, wildcard_patterns, regex_patterns):
|
||||||
return 0, 0, 1
|
return 0, 0, 1, 0
|
||||||
|
|
||||||
# Suche Übersetzung
|
# Bestimme Zieltext: Transfer (1:1 übernehmen) oder Übersetzung
|
||||||
if original_text not in translations:
|
is_transfer = transfer_terms is not None and original_text in transfer_terms
|
||||||
return 0, 1, 0
|
if is_transfer:
|
||||||
|
target_text = original_text
|
||||||
|
elif original_text in translations:
|
||||||
|
target_text = translations[original_text]
|
||||||
|
else:
|
||||||
|
return 0, 1, 0, 0
|
||||||
|
|
||||||
# Schreibe Übersetzung in Ziel-Attribut
|
# Schreibe Zieltext in Ziel-Attribut
|
||||||
if text_target_attrib:
|
if text_target_attrib:
|
||||||
# Ziel-Attribut existiert bereits, aktualisiere es
|
# Ziel-Attribut existiert bereits, aktualisiere es
|
||||||
text_target_attrib.dxf.text = translations[original_text]
|
text_target_attrib.dxf.text = target_text
|
||||||
# Layer ggf. anpassen
|
# Layer ggf. anpassen
|
||||||
if target_layer:
|
if target_layer:
|
||||||
text_target_attrib.dxf.layer = target_layer
|
text_target_attrib.dxf.layer = target_layer
|
||||||
@@ -1148,7 +1198,7 @@ def translate_block_attribute(entity,
|
|||||||
# Ziel-Attribut existiert nicht, erstelle es basierend auf Quell-Attribut
|
# Ziel-Attribut existiert nicht, erstelle es basierend auf Quell-Attribut
|
||||||
new_attrib = entity.add_attrib(
|
new_attrib = entity.add_attrib(
|
||||||
tag=text_target_attr,
|
tag=text_target_attr,
|
||||||
text=translations[original_text],
|
text=target_text,
|
||||||
insert=text_source_attrib.dxf.insert,
|
insert=text_source_attrib.dxf.insert,
|
||||||
)
|
)
|
||||||
# Kopiere weitere Eigenschaften
|
# Kopiere weitere Eigenschaften
|
||||||
@@ -1166,7 +1216,9 @@ def translate_block_attribute(entity,
|
|||||||
elif text_source_attrib.dxf.hasattr('layer'):
|
elif text_source_attrib.dxf.hasattr('layer'):
|
||||||
new_attrib.dxf.layer = text_source_attrib.dxf.layer
|
new_attrib.dxf.layer = text_source_attrib.dxf.layer
|
||||||
|
|
||||||
return 1, 0, 0
|
if is_transfer:
|
||||||
|
return 0, 0, 0, 1
|
||||||
|
return 1, 0, 0, 0
|
||||||
|
|
||||||
|
|
||||||
def translate_dxf_texts(input_dxf: Path,
|
def translate_dxf_texts(input_dxf: Path,
|
||||||
@@ -1176,7 +1228,8 @@ def translate_dxf_texts(input_dxf: Path,
|
|||||||
regex_patterns: list[str],
|
regex_patterns: list[str],
|
||||||
text_source_attr: str = 'TEXT-D',
|
text_source_attr: str = 'TEXT-D',
|
||||||
text_target_attr: str = 'TEXT-CS',
|
text_target_attr: str = 'TEXT-CS',
|
||||||
target_layer: str | None = None):
|
target_layer: str | None = None,
|
||||||
|
transfer_terms: set[str] | None = None):
|
||||||
"""
|
"""
|
||||||
Übersetzt alle TEXT, MTEXT Objekte und Text-Attribute in Blöcken einer DXF-Datei.
|
Übersetzt alle TEXT, MTEXT Objekte und Text-Attribute in Blöcken einer DXF-Datei.
|
||||||
|
|
||||||
@@ -1184,6 +1237,7 @@ def translate_dxf_texts(input_dxf: Path,
|
|||||||
- Liest die Übersetzung aus dem Quell-Attribut (z.B. TEXT-D)
|
- Liest die Übersetzung aus dem Quell-Attribut (z.B. TEXT-D)
|
||||||
- Schreibt die Übersetzung in das Ziel-Attribut (z.B. TEXT-EN, TEXT-CS) (erstellt das Attribut falls nicht vorhanden)
|
- Schreibt die Übersetzung in das Ziel-Attribut (z.B. TEXT-EN, TEXT-CS) (erstellt das Attribut falls nicht vorhanden)
|
||||||
- Das Quell-Attribut bleibt unverändert (Original wird bewahrt)
|
- Das Quell-Attribut bleibt unverändert (Original wird bewahrt)
|
||||||
|
- Begriffe aus transfer_terms werden ohne Übersetzung direkt übernommen (nur bei Block-Attributen)
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
input_dxf: Pfad zur Quell-DXF
|
input_dxf: Pfad zur Quell-DXF
|
||||||
@@ -1193,6 +1247,7 @@ def translate_dxf_texts(input_dxf: Path,
|
|||||||
regex_patterns: Regex-Muster zum Filtern
|
regex_patterns: Regex-Muster zum Filtern
|
||||||
text_source_attr: Quell-Attributname für Texte in Blöcken (z.B. "TEXT-D", "TEXT-EN"). Standard: "TEXT-D"
|
text_source_attr: Quell-Attributname für Texte in Blöcken (z.B. "TEXT-D", "TEXT-EN"). Standard: "TEXT-D"
|
||||||
text_target_attr: Ziel-Attributname für Übersetzungen in Blöcken (z.B. "TEXT-EN", "TEXT-CS"). Standard: "TEXT-CS"
|
text_target_attr: Ziel-Attributname für Übersetzungen in Blöcken (z.B. "TEXT-EN", "TEXT-CS"). Standard: "TEXT-CS"
|
||||||
|
transfer_terms: Begriffe die in Symbol-Attributen ohne Übersetzung übernommen werden (aus [transfer])
|
||||||
"""
|
"""
|
||||||
# Attribute die ein Block haben muss, damit das Text-Attribut übersetzt wird
|
# Attribute die ein Block haben muss, damit das Text-Attribut übersetzt wird
|
||||||
required_attributes = {'IO', 'ID', 'VERW', 'BEZEICHNUNG', 'KENNZEICHNUNG', text_source_attr}
|
required_attributes = {'IO', 'ID', 'VERW', 'BEZEICHNUNG', 'KENNZEICHNUNG', text_source_attr}
|
||||||
@@ -1210,6 +1265,7 @@ def translate_dxf_texts(input_dxf: Path,
|
|||||||
block_translated = 0
|
block_translated = 0
|
||||||
block_skipped = 0
|
block_skipped = 0
|
||||||
block_ignored = 0
|
block_ignored = 0
|
||||||
|
block_transferred = 0
|
||||||
|
|
||||||
# Übersetze TEXT Objekte
|
# Übersetze TEXT Objekte
|
||||||
for entity in msp.query('TEXT'):
|
for entity in msp.query('TEXT'):
|
||||||
@@ -1247,7 +1303,7 @@ def translate_dxf_texts(input_dxf: Path,
|
|||||||
|
|
||||||
# Übersetze Text-Attribute in Blöcken
|
# Übersetze Text-Attribute in Blöcken
|
||||||
for entity in msp.query('INSERT'):
|
for entity in msp.query('INSERT'):
|
||||||
translated, skipped, ignored = translate_block_attribute(
|
translated, skipped, ignored, transferred = translate_block_attribute(
|
||||||
entity,
|
entity,
|
||||||
doc,
|
doc,
|
||||||
translations,
|
translations,
|
||||||
@@ -1257,10 +1313,12 @@ def translate_dxf_texts(input_dxf: Path,
|
|||||||
text_source_attr,
|
text_source_attr,
|
||||||
text_target_attr,
|
text_target_attr,
|
||||||
target_layer,
|
target_layer,
|
||||||
|
transfer_terms,
|
||||||
)
|
)
|
||||||
block_translated += translated
|
block_translated += translated
|
||||||
block_skipped += skipped
|
block_skipped += skipped
|
||||||
block_ignored += ignored
|
block_ignored += ignored
|
||||||
|
block_transferred += transferred
|
||||||
|
|
||||||
# Speichere neue DXF
|
# Speichere neue DXF
|
||||||
doc.saveas(output_dxf)
|
doc.saveas(output_dxf)
|
||||||
@@ -1272,9 +1330,9 @@ def translate_dxf_texts(input_dxf: Path,
|
|||||||
print(f"\nDXF-Übersetzung abgeschlossen:")
|
print(f"\nDXF-Übersetzung abgeschlossen:")
|
||||||
print(f" TEXT übersetzt: {text_translated}, übersprungen: {text_skipped}, ignoriert: {text_ignored}")
|
print(f" TEXT übersetzt: {text_translated}, übersprungen: {text_skipped}, ignoriert: {text_ignored}")
|
||||||
print(f" MTEXT übersetzt: {mtext_translated}, übersprungen: {mtext_skipped}, ignoriert: {mtext_ignored}")
|
print(f" MTEXT übersetzt: {mtext_translated}, übersprungen: {mtext_skipped}, ignoriert: {mtext_ignored}")
|
||||||
print(f" {text_target_attr} (Blöcke) erstellt/aktualisiert: {block_translated}, übersprungen: {block_skipped}, ignoriert: {block_ignored}")
|
print(f" {text_target_attr} (Blöcke) erstellt/aktualisiert: {block_translated}, übersprungen: {block_skipped}, ignoriert: {block_ignored}, übernommen (transfer): {block_transferred}")
|
||||||
print(f" Gesamt: {translated_count} übersetzt, {skipped_count} übersprungen, {ignored_count} ignoriert")
|
print(f" Gesamt: {translated_count} übersetzt, {block_transferred} übernommen, {skipped_count} übersprungen, {ignored_count} ignoriert")
|
||||||
print(f" Hinweis: Übersetzungen in Blöcken wurden in {text_target_attr} geschrieben, TEXT-D bleibt unverändert")
|
print(f" Hinweis: Übersetzungen in Blöcken wurden in {text_target_attr} geschrieben, {text_source_attr} bleibt unverändert")
|
||||||
print(f" Ausgabe-Datei: {output_dxf}")
|
print(f" Ausgabe-Datei: {output_dxf}")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -1978,6 +2036,12 @@ def _run_todxf(
|
|||||||
target_lang = translation_languages[0] if translation_languages else None
|
target_lang = translation_languages[0] if translation_languages else None
|
||||||
translations = load_translations_from_json(translation_json, target_lang)
|
translations = load_translations_from_json(translation_json, target_lang)
|
||||||
|
|
||||||
|
# Transfer-Begriffe aus der Sprachkonfiguration laden (nur für Symbol-Attribute)
|
||||||
|
transfer_terms: set[str] | None = None
|
||||||
|
if target_lang:
|
||||||
|
translation_dir = check_environment_var('PROJECT_TRANSLATION')
|
||||||
|
transfer_terms = load_transfer_terms(target_lang, translation_dir)
|
||||||
|
|
||||||
output_dxf_name = args.todxf
|
output_dxf_name = args.todxf
|
||||||
if not output_dxf_name.lower().endswith(('.dxf', '.dwg')):
|
if not output_dxf_name.lower().endswith(('.dxf', '.dwg')):
|
||||||
output_dxf_name += '.dxf'
|
output_dxf_name += '.dxf'
|
||||||
@@ -1994,6 +2058,7 @@ def _run_todxf(
|
|||||||
source_attr_name,
|
source_attr_name,
|
||||||
target_attr_name,
|
target_attr_name,
|
||||||
target_layer_name,
|
target_layer_name,
|
||||||
|
transfer_terms,
|
||||||
)
|
)
|
||||||
|
|
||||||
print("\nVerarbeitung erfolgreich abgeschlossen.")
|
print("\nVerarbeitung erfolgreich abgeschlossen.")
|
||||||
|
|||||||
+6
-1
@@ -261,4 +261,9 @@ LDT=TS
|
|||||||
DRUCKTASTER=Tlačítko
|
DRUCKTASTER=Tlačítko
|
||||||
DT=TL
|
DT=TL
|
||||||
LEUCHTMELDER=Signální svítidlo
|
LEUCHTMELDER=Signální svítidlo
|
||||||
LM=SS
|
LM=SS
|
||||||
|
|
||||||
|
[transfer]
|
||||||
|
RESET
|
||||||
|
reset
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user