XLIFF_PATH="{{user_path}}"if [ ! -f "$XLIFF_PATH" ]; thenecho"❌ Datei nicht gefunden: $XLIFF_PATH"exit 1
fi# XML validierenif ! xmllint --noout "$XLIFF_PATH" 2>/dev/null; thenecho"❌ Ungültiges XML in: $XLIFF_PATH"exit 1
fi
Trans-units extrahieren die Übersetzung brauchen:
# XLIFF 1.2: <trans-unit> mit leerem/fehlendem <target># XLIFF 2.0: <unit>/<segment> mit leerem/fehlendem <target># Für XLIFF 1.2:
UNITS_TO_TRANSLATE=$(xmllint --xpath "//trans-unit[not(target) or target='']""$XLIFF_PATH" 2>/dev/null)
# Bei --force: alle Unitsif [ "$FORCE" = "true" ]; then
UNITS_TO_TRANSLATE=$(xmllint --xpath "//trans-unit""$XLIFF_PATH" 2>/dev/null)
fi
Source-Texte sammeln:
# Alle source-Texte extrahieren
SOURCES=$(xmllint --xpath "//trans-unit/source/text()""$XLIFF_PATH" 2>/dev/null)
# Als Array für Batch-Übersetzungreadarray -t SOURCE_ARRAY <<< "$SOURCES"
Batch-Übersetzung via API:
# DeepL unterstützt mehrere Texte in einem Request# Baue JSON-Array für text Parameter
TRANSLATIONS=()
for SOURCE in"${SOURCE_ARRAY[@]}"; do
RESPONSE=$(curl -s -X POST "$DEEPL_API_URL/translate" \
-H "Authorization: DeepL-Auth-Key $DEEPL_API_KEY" \
--data-urlencode "text=$SOURCE" \
--data-urlencode "target_lang=$TARGET_LANG")
TRANSLATED=$(echo"$RESPONSE" | jq -r '.translations[0].text')
TRANSLATIONS+=("$TRANSLATED")
done
Bei --dry-run: Nur anzeigen:
if [ "$DRY_RUN" = "true" ]; thenecho"📋 Würde übersetzen:"echo""for i in"${!SOURCE_ARRAY[@]}"; doecho" Source: ${SOURCE_ARRAY[$i]}"echo" Target: ${TRANSLATIONS[$i]}"echo""doneecho"Gesamt: ${#SOURCE_ARRAY[@]} Einheiten"exit 0
fi
XLIFF-Datei aktualisieren:
Da XML-Manipulation in Bash komplex ist, verwende Python wenn verfügbar:
import xml.etree.ElementTree as ET
tree = ET.parse(xliff_path)
root = tree.getroot()
# Namespace handling für XLIFF
ns = {'xliff': 'urn:oasis:names:tc:xliff:document:1.2'}
for i, unit inenumerate(root.findall('.//xliff:trans-unit', ns)):
target = unit.find('xliff:target', ns)
if target isNone:
target = ET.SubElement(unit, 'target')
if force ornot target.text:
target.text = translations[i]
tree.write(output_path, encoding='utf-8', xml_declaration=True)
Fallback für reines Bash (einfachere Variante mit sed):
# Backup erstellencp"$XLIFF_PATH""${XLIFF_PATH}.bak"# Für jede Übersetzungfor i in"${!SOURCE_ARRAY[@]}"; do
SOURCE="${SOURCE_ARRAY[$i]}"
TARGET="${TRANSLATIONS[$i]}"# Escape für sed
SOURCE_ESC=$(printf'%s\n'"$SOURCE" | sed 's/[[\.*^$()+?{|]/\\&/g')
TARGET_ESC=$(printf'%s\n'"$TARGET" | sed 's/[&/\]/\\&/g')
# Leeres target füllen
sed -i ''"s|<source>$SOURCE_ESC</source>\s*<target></target>|<source>$SOURCE_ESC</source><target>$TARGET_ESC</target>|g""$XLIFF_PATH"# Fehlendes target einfügen
sed -i ''"s|<source>$SOURCE_ESC</source>\s*</trans-unit>|<source>$SOURCE_ESC</source><target>$TARGET_ESC</target></trans-unit>|g""$XLIFF_PATH"done