XML zeschneiden, übersetzen, wieder zusammenkleben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Hallo Leute, ich habe eine XML zu übersetzen, die sieht ungefähr so aus:

Code: Alles auswählen

      <trans-unit id="79758" identifier="94740966b6ba0011f746c7ffd1b2ffb9">
        <source>! %1 mode is %2 %3</source>
        <target state="translated">! %1 模式是 %2 %3</target>
        <note>Context: QObject ../src/formatter.cpp:172</note>
      </trans-unit>
Davon habe ich über 10.000 Zeilen. Eigentlich geht es aber nur um den chinesichen Text im target-Tag.

Ich möchte also diesen ausschneiden und z.B. als Exceldatei zwischenspeichern, die dann übersetzt wird.

Vermutlich würde es für den nächsten Schritt Sinn ergeben, der Zeile noch die trans-unit id vorzustellen.

Als nächstes würde ich dann nämlich die Übersetzungen wieder in einer ähnlichen XML Datei benötigen.

Leider habe ich bisher kaum Erfahrung mit XML. Gibt es da leichte Techniken, die mir dabei helfen würden?

Bei meinen Recherchen fand ich nun das xml.etree.ElementTree welches erstmal vielversprechend aussieht.

Genaue Tests sind noch offen. Bis dato habe ich einen groben Ablauf entworfen. Scheint mir aber aufwändig?

Code: Alles auswählen

def read_source_file():
    """ Open a well defined source file, read it and return its content."""
    file_handler = None
    content = ""
    return content

def get_ids(content_handler):
    """ Return a list of IDs from a well defined XML content."""
    ids = []
    return ids

def get_texts(content_handler):
    """ Return a list of both ID and text content for each translation text."""
    texts = []
    return texts

def write_file(texts_to_write):
    """ Save both ID and texts to a simple file format ready for translation."""
    return

def read_translation_file():
    """ Open a well defined file with translations, read it and return its content."""
    return

def replace_translations(translated_texts):
    """ Carefully place the translations in the place indicated by their ID."""
    return

def save_new_file(xml_to_write):
    """ Save a well defined XML file with a new name to the place where it belongs."""
    return

def main():
    source_content = read_source_file()
    ids = get_ids(source_content)
    print(len(ids))
    print(len(set(ids)))
    return
    # are the IDs really unique ???
    texts = get_texts(source_content)
    write_file(texts)
    # pause here for actual translation ???
    translated_content = read_translation_file()
    updated_source_contents = replace_translations(translated_content) # ???
    save_new_file(updated_source_contents)

if __name__ == '__main__':
    main()
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Die vielen Funktionen machen zusammen mit Deiner Problembeschreibung nicht recht Sinn. IDs und Text würde man ja sofort in einer Funktion ermitteln, ungefähr so:

Code: Alles auswählen

def iter_id_with_text(elements):
    for element in elements.findall('trans-unit'):
        yield element.attrib['id'], element.findtext('target')
Was replace_translation oder save_new_file machen soll, hast Du nicht beschrieben.

Am besten übst Du erst einmal das Verarbeiten von XML-Dateien mit ElementTree. Als Tip: erst einmal im interaktiven Modus Sachen ausprobieren, die Du dann in ein Python-Skript kopieren kannst. Wenn ein Teil funktioniert, kannst Du ihn immer noch in sinnvolle Funktionen aufteilen.
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Kebap hat geschrieben: Montag 17. Juni 2019, 15:09 Als nächstes würde ich dann nämlich die Übersetzungen wieder in einer ähnlichen XML Datei benötigen
Das sind die beiden Funktionen, die du vermisst.

Im Grunde muss ich die übersetzten Texte nehmen und an die gleiche Stelle wieder einsetzen / den alten Text überschreiben.

Diese aktualisierte Datei dann unter einem neuen Namen abspeichern. Am Ende habe ich zwei Dateien: Original und übersetzt.

Danke für den Code-Schnipsel. Du hast natürlich Recht. Ich werde das üben. Dabei hilft mir das Beispiel bereits sehr.

Bin nur noch unsicher, ob ID überhaupt einzigartig ist und zur Zuordnung der übersetzten Texte in die Zieldatei taugt.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Antworten