146 lines
4.1 KiB
Python
146 lines
4.1 KiB
Python
# -*- 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)
|