Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Cherche Aide pour un petit Script
#1
Lightbulb 
Hello

Comme j'ai commencé a l'expliqué ici je suis en train de traduire des produits du projet OpenKNX fait par des allemand.

On a donc 2 type de chose a traduire, un fichier XML, puis des fichiers texte qui contiennent l'aide interactive dans ETS.

Dans le fichier XML on par exemple ceci : 
<Enumeration Text="Präsenzmelder" Value="2" Id="M-00FA_A-A012-32-0000_PT-ModuleSelector_EN-2" />
<ParameterSeparator Id="M-00FA_A-A012-32-0000_PS-212" Text="In der gesamten Applikation wird vom Präsenzmelder gesprochen. Ob sich die Applikation als Präsenz- oder als Bewegungsmelder verhält, wird von der verwendeten Hardware (Präsenz-Sensor) bestimmt." />[/code]

Pour le moment j'ai fais du Recherche et Remplace dans Notepad++ pour valider le concept et pour voir si ca fonctionne ensuite dans ETS, comme je ne regénère pas une nouvelle version d'application il faut ruser un peu, mais bon ca marche et le problème est pas là.

Je souhaiterais automatiser la traduction, faire une petite application ou un script qui fasse le boulot : 
L'idée serait de rechercher toute les occurence d'une chaine de caractère avec les guillemets et de la remplacer par une autre
Le script devrait parcourir un fichier CSV qui contiendrait le dico de conversion :
Exemple :
Code :
original,change to
"Präsenzmelder","Détecteur de présence"
"Ja","Oui"

Pourquoi je précise avec les guillemets, car un même mot peu etre utilisé dans plusieurs context, seul ou dans une phrase ou dans un groupe de mot :
Exemple ici :
"In der gesamten Applikation wird vom Präsenzmelder gesprochen. Ob sich die Applikation als Präsenz- oder als Bewegungsmelder verhält, wird von der verwendeten Hardware (Präsenz-Sensor) bestimmt."
si on remplace d'abord Präsenzmelder et que l'on recherche ensuite l'occurence de la phrase complete elle ne sera plus trouvé et on ne pourra pas la traduire par ca :
"Dans toute l'application, on parle de détecteur de présence. C'est le matériel utilisé (capteur de présence) qui détermine si l'application se comporte comme un détecteur de présence ou comme un détecteur de mouvement"

J'ai trouvé un script python qui fonctionne mais sans les guillemets, je pense pas que ce soit bien compliqué pour qq maitrisant la prog, donc si qq a une solution, ce serait sympa
Code :
import lxml.html   # check https://pypi.org/project/lxml/
from csv import reader
from os.path import exists
import glob


def update_xml(path: str) -> None:
    with open('./convertions.csv', 'r') as convertions, open(path, 'r') as annotation:  # noqa: E501
        tree = lxml.html.fromstring(annotation.read())
        csv_reader = reader(convertions)

        for idx, row in enumerate(csv_reader, start=1):
            if idx == 1:
                continue

            original, change_to = row

            tags = tree.xpath(f".//name[text()='{original}']")

            for tag in tags:
                tag.text = change_to

                print(f'Changed class {original} to {change_to} in {path}')

    with open(path, 'wb') as annotation:
        new_content = lxml.html.tostring(tree)

        if new_content.strip():
            annotation.write(new_content)

    print(f'Processing on {path} done')


if __name__ == '__main__':
    for xml_file in glob.glob('*.xml'):
        if exists(xml_file):
            update_xml(path=xml_file)
KNX Partner Base / Avancé

Ma boite de MP est pleine, merci de créer un post si vous avez une question, cela profitera a tout le monde.
Répondre
#2
Bonjour à tous,

Pas 100% sûr que ça résolve tout sans avoir de fichier à tester, mais un problème est que le lecteur de csv choisi est "trop" malin : vu que les guillemets sont utilisés en python pour définir les chaînes de caractère, il interprète la chaîne de caractère "Ja" écrite dans le fichier comme la chaîne de caractères Ja (sans les guillemets). Pour éviter cette conversion automatique, il faut changer les options de l'objet 'reader':

Code :
csv_reader = reader(convertions,quotechar=None)

Je ne sais en revanche pas comment ça se comportera dans la suite du script.

A disposition au besoin,
Répondre
#3
copilot ou gemini ou chatgpt peut te faire ça facilement non ?
Répondre
#4
c'est vrai Babychou. Je suis allé sur chatgpt et voile ce qu'il a pondu. Va savoir si xa peut l'aider

Voici un script Python amélioré qui prend en charge la traduction en respectant les guillemets et l'ordre des remplacements pour éviter les conflits de traduction. Il parcourt un fichier XML et remplace les valeurs selon un dictionnaire de traduction fourni dans un fichier CSV.

Fonctionnalités du script :
  • Recherche et remplacement des valeurs entre guillemets.
  • Utilisation d'un dictionnaire de conversion provenant d'un fichier CSV.
  • Respect de l'ordre des remplacements pour éviter les conflits.

Script Python :
Code :
import xml.etree.ElementTree as ET
import csv

# Charger le dictionnaire de conversion depuis un fichier CSV
def load_translations(csv_file):
   translations = {}
   with open(csv_file, mode='r', encoding='utf-8') as file:
       reader = csv.reader(file)
       next(reader)  # Ignorer l'en-tête
       for row in reader:
           if len(row) == 2:
               original, translation = row
               translations[original.strip('"')] = translation.strip('"')
   return translations

# Appliquer la traduction au fichier XML
def translate_xml(xml_file, translations, output_file):
   tree = ET.parse(xml_file)
   root = tree.getroot()

   for elem in root.iter():
       if elem.text:
           for original, translation in sorted(translations.items(), key=lambda x: -len(x[0])):
               if f'"{original}"' in elem.text:
                   elem.text = elem.text.replace(f'"{original}"', f'"{translation}"')

   tree.write(output_file, encoding='utf-8', xml_declaration=True)

# Fichiers d'entrée et sortie
csv_file = "convertions.csv"
xml_file = "input.xml"
output_file = "translated.xml"

# Charger les traductions et appliquer au XML
translations = load_translations(csv_file)
translate_xml(xml_file, translations, output_file)

print("Traduction terminée. Le fichier traduit est enregistré sous 'translated.xml'.")

Explication :
  1. Lecture du fichier CSV : Il charge les paires "original, traduction" et les stocke dans un dictionnaire.
  2. Parcours du fichier XML : Il parcourt tous les éléments et remplace les chaînes contenues entre guillemets.
  3. Respect de l'ordre des remplacements : Les traductions sont triées de la plus longue à la plus courte pour éviter que des mots courts ne cassent des phrases complètes.
  4. Export du fichier XML traduit.

Exemple d'utilisation :
Si
Code :
convertions.csv
contient :
Code :
original,change to
"Präsenzmelder","Détecteur de présence"
"Ja","Oui"
"In der gesamten Applikation wird vom Präsenzmelder gesprochen.","Dans toute l'application, on parle de détecteur de présence."
Alors
Code :
input.xml
:
Code :
<Enumeration Text="Präsenzmelder" Value="2" />
<ParameterSeparator Text="In der gesamten Applikation wird vom Präsenzmelder gesprochen." />
Donnera
Code :
translated.xml
:
Code :
<Enumeration Text="Détecteur de présence" Value="2" />
<ParameterSeparator Text="Dans toute l'application, on parle de détecteur de présence." />

? Améliorations possibles :
  • Gérer plusieurs fichiers XML en entrée.
  • Ajouter une interface graphique pour sélectionner les fichiers.
  • Intégrer une API de traduction automatique.
Si tu veux des améliorations ou des ajustements, dis-moi ! ?
Répondre
#5
Citation :Si tu veux des améliorations ou des ajustements, dis-moi ! ?

Heu.. Dis le à ChatGPT plutôt non  Confused
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 2 visiteur(s)