standardisiert: multilang und einefach Sprache enthalten beide translations und untranslated. Doku um das neue Feature ergänzt

This commit is contained in:
2025-12-15 14:32:23 +01:00
parent 60ba962faa
commit 5939879e23
2 changed files with 126 additions and 12 deletions
+114 -1
View File
@@ -115,7 +115,7 @@ bin\translate.bat --filename file.dxf --extract --translate CS --outname output.
bin\translate.bat --filename file.dxf --extract --translate EN --export-type excel
```
**Output-Format (JSON):**
**Output-Format für eine Sprache (JSON):**
```json
{
"translations": [
@@ -131,6 +131,119 @@ bin\translate.bat --filename file.dxf --extract --translate EN --export-type exc
}
```
### 2a. Mehrsprachige Text-Extraktion
**NEU ab Version 2025:** Extrahiert und übersetzt Texte gleichzeitig in mehrere Sprachen mit hierarchischer JSON-Struktur.
```bash
# Extraktion mit mehreren Sprachen (komma-separiert)
bin\translate.bat --filename file.dxf --extract --translate CS,EN --outname output.json
# Drei Sprachen gleichzeitig
bin\translate.bat --filename file.dxf --extract --translate CS,EN,FR --export-type json
# Mit Excel-Export (nur erste Sprache wird in Excel verwendet)
bin\translate.bat --filename file.dxf --extract --translate CS,EN --export-type excel,json
```
**Output-Format für mehrere Sprachen (hierarchische JSON-Struktur):**
```json
{
"[CS]": {
"translations": [
{
"source": "Betriebsbereit",
"target": "Provozní připravenost"
},
{
"source": "Emergency stop",
"target": "Nouzové zastavení"
},
{
"source": "Weight",
"target": "Hmotnost"
}
],
"untranslated": [
{
"source": "Custom text",
"target": ""
}
]
},
"[EN]": {
"translations": [
{
"source": "Betriebsbereit",
"target": "Ready for operation"
},
{
"source": "Emergency stop",
"target": "Emergency stop"
},
{
"source": "Weight",
"target": "Weight"
}
],
"untranslated": [
{
"source": "Custom text",
"target": ""
}
]
},
"[FR]": {
"translations": [
{
"source": "Betriebsbereit",
"target": "Prêt à fonctionner"
},
{
"source": "Emergency stop",
"target": "Arrêt d'urgence"
}
],
"untranslated": [
{
"source": "Custom text",
"target": ""
},
{
"source": "Weight",
"target": ""
}
]
},
"ignored": [
"X=123.45",
"LAYER=0"
]
}
```
**Struktur:**
- **`[LANG]`**: Sprachspezifische Sektion (z.B. `[CS]`, `[EN]`, `[FR]`)
- **`translations`**: Array mit erfolgreich übersetzten Texten
- **`untranslated`**: Array mit nicht übersetzten Texten (fehlende Übersetzung in Config)
- **`ignored`**: Array mit gefilterten Texten (einmal für alle Sprachen)
**Vorteile:**
- Ein Durchlauf für alle Sprachen → schneller
- Konsistente Extraktion für alle Sprachen
- Übersicht über Übersetzungs-Abdeckung pro Sprache
- Einfache Identifikation fehlender Übersetzungen
**Verarbeitung mehrsprachiger JSON-Dateien:**
```bash
# Re-prozessiere mehrsprachige JSON mit zusätzlicher Sprache
bin\translate.bat --fromjson output.json --translate CS,EN,ES
# DXF-zu-DXF mit mehrsprachiger JSON (verwendet erste Sprache)
bin\translate.bat --filename file.dxf --todxf file_cs.dxf --translate CS --translation-json multilang.json
```
### 3. DXF-zu-DXF Übersetzung
Erstellt eine neue DXF-Datei mit übersetzten Texten in mehrsprachigen Attributen.
+12 -11
View File
@@ -663,7 +663,7 @@ def load_translations_from_json(filename: Path, target_lang: str = None) -> dict
Liest Übersetzungen aus einer JSON-Datei.
Unterstützt beide Strukturen:
- Alte Struktur: "translations": [{"source": "...", "target": "..."}, ...]
- Hierarchische Struktur: "[LANG]": {"translated": [...], ...}
- Hierarchische Struktur: "[LANG]": {"translations": [...], ...}
Bei hierarchischer Struktur werden Übersetzungen aus allen Sprachen oder nur der angegebenen Sprache gelesen.
Wenn mehrere Übersetzungen für denselben source existieren, wird die letzte verwendet (Sprache mit höherer Priorität).
@@ -732,14 +732,15 @@ def load_translations_from_json(filename: Path, target_lang: str = None) -> dict
print(f"WARNUNG: [{lang}] Block ist kein Object, überspringe")
continue
# Lese aus translated Block
if 'translated' in lang_data:
translated = lang_data['translated']
if not isinstance(translated, list):
print(f"WARNUNG: [{lang}][translated] ist kein Array, überspringe")
# Lese aus translations Block (oder translated für Rückwärtskompatibilität)
translations_key = 'translations' if 'translations' in lang_data else 'translated'
if translations_key in lang_data:
translations_list = lang_data[translations_key]
if not isinstance(translations_list, list):
print(f"WARNUNG: [{lang}][{translations_key}] ist kein Array, überspringe")
continue
for idx, entry in enumerate(translated):
for idx, entry in enumerate(translations_list):
if not isinstance(entry, dict):
continue
@@ -1106,8 +1107,8 @@ def write_texts_to_json(texts: list[str], ignored_texts: list[str], output_path:
- "ignored": Liste von Strings für gefilterte/ignorierte Texte
Bei mehreren Sprachen (hierarchische Struktur):
- "[EN]": {"translated": [...], "untranslated": [...]}
- "[FR]": {"translated": [...], "untranslated": [...]}
- "[EN]": {"translations": [...], "untranslated": [...]}
- "[FR]": {"translations": [...], "untranslated": [...]}
- "ignored": Liste von Strings für gefilterte/ignorierte Texte
Args:
@@ -1145,7 +1146,7 @@ def write_texts_to_json(texts: list[str], ignored_texts: list[str], output_path:
# Hierarchische Struktur: [LANG] als Schlüssel
output_data[f"[{lang}]"] = {
"translated": translations,
"translations": translations,
"untranslated": untranslated
}
@@ -1196,7 +1197,7 @@ def write_texts_to_json(texts: list[str], ignored_texts: list[str], output_path:
for lang in translation_languages:
if f"[{lang}]" in output_data:
lang_data = output_data[f"[{lang}]"]
print(f" [{lang}] Übersetzungen: {len(lang_data['translated'])}, Nicht übersetzt: {len(lang_data['untranslated'])}")
print(f" [{lang}] Übersetzungen: {len(lang_data['translations'])}, Nicht übersetzt: {len(lang_data['untranslated'])}")
else:
# Alte Struktur
if translation_dicts: