standardisiert: multilang und einefach Sprache enthalten beide translations und untranslated. Doku um das neue Feature ergänzt
This commit is contained in:
+114
-1
@@ -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
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user