Translating XML with CDATA using OpenAI GPT-4 and maintaining CDATA structure

234 Views Asked by At

I'm using OpenAI GPT-4 to translate XML content from English to French, and I'm facing an issue with preserving the CDATA structure in the translated XML. The XML contains strings with CDATA sections, and I want the translated output to maintain the CDATA structure.

Here's a simplified example of the input XML:

<resources>
    <string name="app_name">RoomThermometer</string>
    <string name="instructions" formatted="false">
        <![CDATA[
        <b>How it works? </b><br />
        The thermometer app is using your phone temperature sensors to measure room temperature.<br /><br />
        <b>Why this thermometer is the best one?</b><br />
        We use AI-powered algorithm to get the most accurate measure by ± 3°C. The more you use the thermometer, the more accurate it is!<br /><br />
        <b>How to get the best room temperature measure?</b><br />
        You want to prevent the phone from overheating, follow the next steps:<br />
        <b>1-</b> take your case off<br />
        <b>2-</b> Your phone is charging or just charged, let it cool down<br />
        <b>3-</b> Turn off unnecessary apps running in the background<br />
        ]]>
    </string>
</resources>

The current Python script uses OpenAI GPT-4 to translate the text, but the CDATA structure is not maintained in the output. The result looks like this:

<resources>
    <string name="app_name">Thermomètre de Chambre</string>
    <string name="instructions" formatted="false">
        '&lt;b&gt;Comment ça marche?&lt;/b&gt;&lt;br/&gt;
        L'application de thermomètre utilise les capteurs de température de votre téléphone pour mesurer la température ambiante.&lt;br/&gt;&lt;br/&gt;
        &lt;b&gt;Pourquoi ce thermomètre est le meilleur?&lt;/b&gt;&lt;br/&gt;
        Nous utilisons un algorithme alimenté par l'IA pour obtenir la mesure la plus précise à ± 3°C. Plus vous utilisez le thermomètre, plus il est précis!&lt;br/&gt;&lt;br/&gt;
        &lt;b&gt;Comment obtenir la meilleure mesure de température ambiante?&lt;/b&gt;&lt;br/&gt;
        Vous voulez éviter que le téléphone ne surchauffe, suivez les étapes suivantes:&lt;br/&gt;
        &lt;b&gt;1-&lt;/b&gt; retirez votre coque&lt;br/&gt;
        &lt;b&gt;2-&lt;/b&gt; Votre téléphone est en charge ou vient d'être chargé, laissez-le refroidir&lt;br/&gt;
        &lt;b&gt;3-&lt;/b&gt; Arrêtez l'application inutile qui fonctionne en arrière-plan&lt;br/&gt;'
    </string>
</resources>

However, I want the translated output to preserve the CDATA structure, like this:

<resources>
    <string name="app_name">Thermomètre de Chambre</string>
    <string name="instructions" formatted="false">
        <![CDATA[
        <b>Comment ça fonctionne ? </b><br />
        L'application thermomètre utilise les capteurs de température de votre téléphone pour mesurer la température de la pièce.<br /><br />
        <b>Pourquoi ce thermomètre est le meilleur ?</b><br />
        Nous utilisons un algorithme alimenté par l'IA pour obtenir la mesure la plus précise à ± 3°C. Plus vous utilisez le thermomètre, plus il est précis !<br /><br />
        <b>Comment obtenir la meilleure mesure de la température de la pièce ?</b><br />
        Vous voulez empêcher le téléphone de surchauffer, suivez les étapes suivantes :<br />
        <b>1-</b> retirez votre étui<br />
        <b>2-</b> Votre téléphone est en train de charger ou vient de se charger, laissez-le refroidir<br />
        <b>3-</b> Fermez les applications inutiles qui tournent en arrière-plan<br />
        ]]>
    </string>
</resources>

I think that the problem is in this function:


def translate_xml_file(xml_file_path, target_language="French"):
    # Parse the XML file
    tree = ET.parse(xml_file_path)
    root = tree.getroot()

    # Iterate over each 'string' element
    for string_element in root.iter('string'):
        # Check if the element contains text
        if string_element.text:
            string_text = string_element.text.strip()

            # Check if the text is within a CDATA section
            if string_text.startswith("<![CDATA[") and string_text.endswith("]]>"):
                # Extract the content from CDATA
                cdata_content = string_text[9:-3]

                # Translate the content
                translated_cdata_content = translate_string(cdata_content, target_language)

                # Manually wrap with CDATA and set back to element
                string_element.text = "<![CDATA[" + translated_cdata_content + "]]>"
            else:
                # Translate normal text
                translated_text = translate_string(string_text, target_language)
                string_element.text = translated_text

    return tree

If you need the whole code, I will share it! I am not sharing it, because it is too long!

How can I modify the existing script to achieve this? Any insights or code examples would be greatly appreciated.

Additional Information:

I'm using OpenAI GPT-4 for translation. The script is written in Python. The target language is French. I want the translated text to be wrapped in CDATA just like the original structure. Thank you in advance!

0

There are 0 best solutions below