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 bin\translate.bat --filename file.dxf --extract --translate EN --export-type excel
``` ```
**Output-Format (JSON):** **Output-Format für eine Sprache (JSON):**
```json ```json
{ {
"translations": [ "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 ### 3. DXF-zu-DXF Übersetzung
Erstellt eine neue DXF-Datei mit übersetzten Texten in mehrsprachigen Attributen. 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. Liest Übersetzungen aus einer JSON-Datei.
Unterstützt beide Strukturen: Unterstützt beide Strukturen:
- Alte Struktur: "translations": [{"source": "...", "target": "..."}, ...] - 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. 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). 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") print(f"WARNUNG: [{lang}] Block ist kein Object, überspringe")
continue continue
# Lese aus translated Block # Lese aus translations Block (oder translated für Rückwärtskompatibilität)
if 'translated' in lang_data: translations_key = 'translations' if 'translations' in lang_data else 'translated'
translated = lang_data['translated'] if translations_key in lang_data:
if not isinstance(translated, list): translations_list = lang_data[translations_key]
print(f"WARNUNG: [{lang}][translated] ist kein Array, überspringe") if not isinstance(translations_list, list):
print(f"WARNUNG: [{lang}][{translations_key}] ist kein Array, überspringe")
continue continue
for idx, entry in enumerate(translated): for idx, entry in enumerate(translations_list):
if not isinstance(entry, dict): if not isinstance(entry, dict):
continue 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 - "ignored": Liste von Strings für gefilterte/ignorierte Texte
Bei mehreren Sprachen (hierarchische Struktur): Bei mehreren Sprachen (hierarchische Struktur):
- "[EN]": {"translated": [...], "untranslated": [...]} - "[EN]": {"translations": [...], "untranslated": [...]}
- "[FR]": {"translated": [...], "untranslated": [...]} - "[FR]": {"translations": [...], "untranslated": [...]}
- "ignored": Liste von Strings für gefilterte/ignorierte Texte - "ignored": Liste von Strings für gefilterte/ignorierte Texte
Args: 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 # Hierarchische Struktur: [LANG] als Schlüssel
output_data[f"[{lang}]"] = { output_data[f"[{lang}]"] = {
"translated": translations, "translations": translations,
"untranslated": untranslated "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: for lang in translation_languages:
if f"[{lang}]" in output_data: if f"[{lang}]" in output_data:
lang_data = output_data[f"[{lang}]"] 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: else:
# Alte Struktur # Alte Struktur
if translation_dicts: if translation_dicts: