Création d’une base de données terminologique bilingue

Même si l’on n’est pas traducteur spécialisé en informatique, l’informaticien professionnel a très souvent besoin de se constituer des glossaires spécialisés bilingues et ceci pour deux raisons : premièrement, la littérature professionnelle est en très grande majorité en langue anglaise, qu’il s’agisse de magazines ou d’informations recueillies sur le Web et deuxièmement, les dictionnaires informatiques disponibles dans le commerce ne sont jamais assez spécialisés et ont toujours une longueur de retard.

Dans ces conditions, le traducteur spécialisé ou l’informaticien désireux de décrypter des articles en langue anglaise doit se forger ses propres outils et nous allons voir dans cet article que cela n’est pas très difficile et qu’il suffit juste d’un peu de patience et de méthode.

 

L’idée de créer une base terminologique bilingue spécialisée m’est venu lors de la traduction d’un ouvrage sur SQL Server. Tous les traducteurs ont besoin de documentation sur le domaine d’expertise sur lequel ils travaillent. Or il se trouve qu’aujourd’hui les documentations sont principalement au format électronique. L’ancien format des fichiers HLP a d’ailleurs été abandonné et Microsoft, Internet oblige, a popularisé un nouveau format de fichier dont l’extension est CHM et qui se lit avec le navigateur Internet Explorer. Le traducteur doit donc en grande partie travailler sur des fichiers d’aide électronique et quand cela est possible, il est préférable d’obtenir une copie de l’aide électronique du logiciel dans chaque langue, à savoir l’anglais et le français dans le cas qui nous intéresse. Or Microsoft a pris l’excellente habitude de fournir en libre téléchargement la plupart de ses documentations électroniques et lorsque tel n’est pas le cas, il est assez facile de les récupérer notamment grâce aux CD-ROM des versions limitées. Le travail du traducteur est donc grandement facilité car il possède l’exacte traduction d’un corpus qui est souvent imposant (plusieurs MO). Mais un problème pratique se pose assez vite quand on rencontre un terme inconnu : s’il est très facile avec les systèmes d’aide en ligne de rechercher toutes les occurrences de ce terme dans le fichier .CHM, la localisation de sa traduction dans le fichier .CHM en français n’est pas très rapide.

 

En effet, le seul moyen est de cliquer sur l’onglet Sommaire pour afficher l’arborescence afin de situer l’endroit exact de l’article qui contient l’occurrence du terme recherché puis de trouver l’article qui correspond dans le document en français. On perd donc énormément de temps dans ses allers et retours.

L’idéal serait d’avoir un programme qui synchronise la consultation de chaque document en anglais avec son équivalent en français et c’est ce que nous vous proposons.

  Où trouver les fichiers .CHM

1) en libre téléchargement sur le site de Microsoft

2) sur le CD-ROM d'installation du logiciel

mais écueil car ils sont dans un format compressé ; il faut donc d'abord les décompresser puis les décompiler ; pour cela, le plus simple est d'écrire une macro Word qui crée un fichier Batch.

Si l’on part du principe qu’un fichier .CHM n’est qu’un ensemble de fichiers HTML qui ont été compilés, l’idée est donc très simple : il faut décompiler le fichier .CHM pour récupérer tous les fichiers HTML qui le composent. Une fois ceci réalisé, il faut convertir les fichiers HTML en fichiers ASCII et stocker le contenu de tous les fichiers dans une base de données.

 

La décompilation des fichiers .CHM peut se faire avec l’outil de Microsoft, le HTML Help Workshop (disponible en libre téléchargement) ou bien avec d’autres outils freeware (notamment disponible à http://www.keyworks.net/keytools.htm).

Ainsi, avec un fichier .CHM de 11 MO, on obtient plus de 8000 fichiers HTML. L’étape suivante consiste à convertir ces fichiers au format ASCII et de très nombreux outils freeware existent sur le Web pour ce faire. On prendre bien soin de choisir un outil qui sachent manipuler les caractères accentués du français. Une fois ces opérations terminées, on se retrouve donc avec une série de fichiers ASCII en français et en anglais qui comportent le même nom (il s’agit le plus souvent d’un nom ésotérique du genre DTS_DSGN_28) et le plus simple est donc de leur donner une extension différente, ANG pour l’anglais et FRA pour le français.

expand ACCESS.CH_ ACCESS.CHM
expand ACCESSIB.CH_ ACCESSIB.CHM
expand ACC_DIS.CH_ ACC_DIS.CHM
expand ACLUI.CH_ ACLUI.CHM
expand ADDREMOV.CH_ ADDREMOV.CHM
expand ADMTOOLW.CH_ ADMTOOLW.CHM
expand APPS.CH_ APPS.CHM
expand ARTICLE.CH_ ARTICLE.CHM
expand ATM.CH_ ATM.CHM
expand AUDITW.CH_ AUDITW.CHM

 

hh -decompile c:\TRADWXP\BASEFR\HTML ACCESS.CHM
hh -decompile c:\TRADWXP\BASEFR\HTML ACCESSIB.CHM
hh -decompile c:\TRADWXP\BASEFR\HTML ACC_DIS.CHM
hh -decompile c:\TRADWXP\BASEFR\HTML ACLUI.CHM
hh -decompile c:\TRADWXP\BASEFR\HTML ADDREMOV.CHM
hh -decompile c:\TRADWXP\BASEFR\HTML ADMTOOLW.CHM
hh -decompile c:\TRADWXP\BASEFR\HTML APPS.CHM
hh -decompile c:\TRADWXP\BASEFR\HTML ARTICLE.CHM
hh -decompile c:\TRADWXP\BASEFR\HTML ATM.CHM
hh -decompile c:\TRADWXP\BASEFR\HTML AUDITW.CHM
hh -decompile c:\TRADWXP\BASEFR\HTML BCKG.CHM
hh -decompile c:\TRADWXP\BASEFR\HTML BLURBS.CHM
hh -decompile c:\TRADWXP\BASEFR\HTML BOOTCONP.CHM

Sub atest()
Const Lecture = 1, Ecriture = 2, Ajout = 3
Dim fs, fichier, i, numligne
For i = 1 To 3531
' on lit le nom du fichier dans la colonne 1
nomfichier1 = (ActiveDocument.Tables(1).Cell(Row:=i, Column:=1))
nomfichier1 = Left(nomfichier1, Len(nomfichier1) - 2)
' on supprime 2 caractères parasites à la fin
'MsgBox nomfichier1
' Traitement fichier US

nomfichier = "E:\ASCIIUS\" + nomfichier1
' on ouvre le fichier
Set fs = CreateObject("Scripting.FileSystemObject")
' on ouvre le fichier en lecture
Set fichier = fs.OpenTextFile(nomfichier, Lecture)
' on lit le fichier
ligne = fichier.ReadAll
'MsgBox ligne
fichier.Close
' on met la ligne dans la colonne 2
ActiveDocument.Tables(1).Cell(Row:=i, Column:=2).Select
Selection.TypeText Text:=ligne


' Traitement fichier français
nomfichier = "E:\ASCIIFR\" + nomfichier1
' on ouvre le fichier
Set fs = CreateObject("Scripting.FileSystemObject")
' on ouvre le fichier en lecture
Set fichier = fs.OpenTextFile(nomfichier, Lecture)
' on lit le fichier
ligne = fichier.ReadAll
fichier.Close
' on met la ligne dans la colonne 3
ActiveDocument.Tables(1).Cell(Row:=i, Column:=3).Select
Selection.TypeText Text:=ligne


Next i
End Sub
 

Pour terminer, on crée une base de données dont la structure est la suivante :

NOM_FICHIER_HTML                  Caractère             80

ANGLAIS                           Mémo

FRANÇAIS                          Mémo

 

Il faut ensuite remplir chaque champ avec le bon fichier et un programme de quelques lignes suffira amplement à cette tâche.

use wxp
go top
do while .not. reccount() < 3
nomfichier=ltrim(rtrim(fichier))
nomus = "E:\ASCIIUS\" + nomfichier
nomfr = "E:\ASCIIFR\" + nomfichier
append memo us from &nomus
append memo fr from &nomfr
skip
enddo
close all
 

Un simple formulaire d’interrogation viendra compléter notre application. Pour l’implémentation de ce programme, nous avons choisi la base de données Visual FoxPro car on obtient avec elle des temps de réponse très raisonnables sur des bases relativement importantes (le fichier qui abrite les champs mémo fait plus de 30 MO).

Le formulaire de recherche comprend une zone de texte où l’utilisateur tape sa requête et deux boutons, l’un pour lancer la recherche et l’autre pour la continuer. En effet, la recherche s’effectue grâce à l’opérateur $ qui permet de faire une recherche dans une chaîne de caractères ou un champ mémo. Ce mode de recherche est en général à proscrire sur de très grandes bases car il n’est guère optimisé, aucun index ne pouvant être consulté. Dans le cas présent, c’est le seul outil que nous avons à notre disposition et il faut donc nous en contenter. Notons cependant que FoxPro fait merveille et que la plupart des recherches sur les 8000 enregistrements dure moins de 10 secondes.

Une fois que l’utilisateur a tapé sa requête et cliqué sur le bouton Cherche, FoxPro balaye le champ Mémo en anglais et s’il trouve une correspondance, il affiche le champ mémo anglais et son équivalent en français en mettant en surbrillance la chaîne recherchée. A ce sujet, il faut employer le contrôle RichText car le contrôle standard fourni par FoxPro comporte un bug qui ne permet pas de mettre en surbrillance la chaîne recherchée. Bien évidemment, dans la mesure où ne connaît pas la traduction en français de la chaîne recherchée (c’est précisément l’objet de la requête), il est impossible de mettre en surbrillance un mot quelconque dans le champ mémo en français. Il faut alors empiriquement se fier à la position de la cage de l’ascenseur dans le mémo anglais pour se positionner dans le mémo français. Une méthode plus sophistiqué consisterait à calculer la distance entre le premier caractère du mémo anglais et la chaîne recherchée et à se positionner à la même distance accrue d’un facteur de 20 % (facteur d’expansion entre l’anglais et le français) dans le mémo français. Cette solution n’a pas été retenue dans le cadre de cet article mais elle est facilement envisageable. Vous trouverez ci dessous le code des deux boutons du formulaire et vous constaterez leur simplicité :

 

* Code du bouton cherche

chaine=upper(ltrim(rtrim(ThisForm.Text1.Value)))

locate for chaine $ upper(US)

texte=ThisForm.olecontrol2.Text

position=at(chaine,upper(texte))

if found()

ThisForm.olecontrol2.Refresh

ThisForm.olecontrol2.Find(chaine)

ThisForm.olecontrol1.Refresh

ThisForm.txtFichier.Refresh

else

? chr(7)

Titre = "Recherche sur l'aide en ligne SQL Server 7"

cMessageTexte = 'Chaîne recherchée introuvable dans le champ US'

nTypeDialogue = 0 + 16

nRéponse = MESSAGEBOX(cMessageTexte, nTypeDialogue, Titre)

endif

 

* Code du bouton continue

chaine=upper(ltrim(rtrim(ThisForm.Text1.Value)))

continue

texte=ThisForm.olecontrol2.Text

position=at(chaine,upper(texte))

if found()

ThisForm.olecontrol2.Refresh

ThisForm.olecontrol2.Find(chaine)

ThisForm.olecontrol1.Refresh

ThisForm.txtFichier.Refresh

else

? chr(7)

Titre = "Recherche sur l'aide en ligne SQL Server 7"

cMessageTexte = "Plus d'occurrence de la chaîne recherchée dans le champ US"

nTypeDialogue = 0 + 16

nRéponse = MESSAGEBOX(cMessageTexte, nTypeDialogue, Titre)

endif