stage_2023/utilitaire_python/textes_à_tmx_(xml_etree_Ele...

146 lines
4.1 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
from pathlib import Path
import xml.etree.ElementTree as et
# Définir les constantes
# Valeurs à saisir via une interface graphique dans la version finale.
CORPUSPATH = Path(Path().cwd()/'fichiers_texte')
SOURCE_LANG = 'fr'
def get_languages_and_files(corpuspath):
'''Récupérer les fichiers et leur langues.'''
textfiles = corpuspath.glob('*.txt')
languages_and_files = {l.stem.rsplit('_')[1]:l for l in textfiles}
return languages_and_files
def read_content_by_language(languages_and_files):
'''Lire le contenu du fichier pour chacune des langues'''
# Créer une liste de language avec la langue source en tête
languages = list(languages_and_files.keys())
languages.insert(0,languages.pop(languages.index(SOURCE_LANG)))
# Lire le contenu du fichier correspondant à chacune des langues
contents = []
for language in languages:
with open(languages_and_files[language], 'r', encoding='utf8') as text:
contents.append(text.read().splitlines())
return (languages, contents)
def prepare_units(contents):
'''Jumeler les phrases correspondantes dans chacune des langues.'''
units = zip(*contents)
return units
def create_tmx_document():
'''Créer la structure de base de la TMX.'''
# Créer l'élément racine
tmx = et.Element('tmx', {'version': '1.4'})
# Définir les attributs de l'élément <header>
tmxheader = {'creationtool':'Utilitaire stage 2023',
'creationtoolversion': '0.3', 'datatype': 'plaintext',
'segtype': 'sentence', 'adminlang': 'en-US',
'srclang': SOURCE_LANG, 'o-tmf': 'text files'}
# Créer les éléments <header> et <body>
header = et.SubElement(tmx, 'header', tmxheader)
body = et.SubElement(tmx, 'body')
return tmx
def make_tu(languages, unit):
'''Créer un élément <tu> contenant les <tuv> et <seg> pour toutes les langues d'un segment.'''
tu = et.Element('tu')
for l, language in enumerate(languages):
# Définir et ajouter l'élément <tuv>
tuv = et.SubElement(tu, 'tuv', {'xml:lang': language})
# Définir et ajouter l'élément <seg>
seg = et.SubElement(tuv, 'seg')
seg.text = unit[l]
return tu
def build_final_tree(tmx):
'''Créer l'arbre XML au complet pour la TMX.'''
# Créer l'arbre
tmxtree = et.ElementTree(tmx)
return tmxtree
def save_tmx(basename, tmxtree):
'''Définir le chemin et le nom complet du fichier TMX, et le sauvegarder.'''
# Définir le chemin et nom du fichier.
tmxext = '.tmx'
tmxname = basename + '_xml_etree' + tmxext
tmxpath = Path(CORPUSPATH.parent/'sortie_xml_etree')
# Créer le chemin s'il n'existe pas.
if not tmxpath.exists():
tmxpath.mkdir(parents=True, exist_ok=True)
tmxfile = Path(tmxpath/tmxname)
## Écrire le fichier
# Écrire la déclaration et le doctype dans le fichier
# Solution adaptée de la réponse suivante sur Stack Overflow :
# https://stackoverflow.com/a/8868551/8123921
xmldoc = '<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE tmx SYSTEM "tmx14.dtd">\n'
# Écrire le fichier
with open(tmxfile, 'wb') as tree:
tree.write(xmldoc.encode('utf-8'))
et.indent(tmxtree)
tmxtree.write(tree, 'utf-8')
if __name__ == '__main__':
# Récupérer les langues et le contenu des fichiers
languages_and_files = get_languages_and_files(CORPUSPATH)
languages, contents = read_content_by_language(languages_and_files)
# Définir le nom de base du fichier
basename = languages_and_files[SOURCE_LANG].stem.strip('_'+SOURCE_LANG)
# Créer un document TMX
tmx = create_tmx_document()
# Jumeler les unités de traduction
units = prepare_units(contents)
# Créer les éléments `<tu>` avec les `<tuv>` contenant le texte des
# segments pour chacune des langues.
for unit in units:
tu = make_tu(languages, unit)
tmx[1].append(tu)
# Compléter l'arbre XML
tmxtree = build_final_tree(tmx)
# Sauvegarder le fichier TMX
save_tmx(basename, tmxtree)