V. Internationalisez a posteriori vos projets Delphi▲
V-A. Introduction▲
Vous avez développé votre application à l'aide de Delphi. Vous êtes content du résultat et vous voudriez en faire profiter un maximum de monde. Aussi, vous aimeriez bien traduire votre projet dans d'autres langues que le français.
Confronté à ce problème, j'ai commencé par lire la documentation de Delphi sur le sujet. Je suis tombé sur un écueil, à savoir que pour préparer mon projet à la traduction, je devais isoler toutes les chaînes de caractères à traduire en tant que resourcestring (plus de détails). N'ayant pas envie de faire ce travail, j'ai préféré développer ma propre solution logicielle de traduction a posteriori, qui ne nécessite pas cette préparation. Cette méthode fonctionne avec toutes les versions de Delphi (de 1 à 6, Standard, Pro, Ent.), pas encore avec Kylix. Il est à noter que si vous savez avant de commencer un projet qu'il devra être traduit en plusieurs langues, il existe d'autres méthodes plus adaptées fournies avec Delphi.
Le principe de mon utilitaire est de récupérer toutes les chaînes de texte d'un projet, y compris celles présentes dans le code source, puis de réaliser un nouveau projet avec les chaînes traduites. Vous aurez alors un projet et un exécutable distincts pour chaque langue.
V-B. Préparation▲
Les méthodes générales de préparation d'un projet sont présentées par ailleurs. Concernant mon utilitaire, même s'il n'est pas nécessaire d'extraire en resourcestring toutes les chaînes de caractères du code source, une certaine préparation du projet s'impose.
Il faut en particulier formater correctement les chaînes pour qu'un même message ne soit pas fractionné en plusieurs morceaux :
ShowMessage('Vous avez '
+IntToStr(I)+' éléments'
); // mauvais
ShowMessage(Format('Vous avez %d éléments'
,[i])); // bon
Dans le premier cas, vous aurez deux textes à traduire qui pourront éventuellement être séparés dans la liste à traduire. Au contraire, dans le second cas, avec la chaîne de format, vous n'avez qu'un seul texte plus compréhensible à traduire.
V-C. Extraction du texte▲
Nous pouvons maintenant rentrer dans le vif du sujet. Commencez par récupérer mon utilitaire (440 ko) et installez-le sur le même ordinateur que la version de Delphi qui a servi à développer votre projet. Vous devez maintenant extraire l'ensemble des mots et expressions utilisés dans votre projet. Ensuite, copiez les fichiers utiles (pas, dfm, xfm, dpr et res) de votre projet dans un nouveau dossier. NE TRAVAILLEZ JAMAIS SUR VOTRE PROJET ORIGINAL. Un autre programme personnel (ou un .bat:) peut vous aider pour cette tâche. En général, j'utilise la structure suivante pour traduire un projet en mettant la copie dans « traduction » :
Ensuite, démarrez l'utilitaire de traduction et choisissez votre projet avec la commande Projet|Ouvrir :
Commencez l'analyse de suite avec Projet|Analyser. L'utilitaire vous demande au passage la version de Delphi utilisée pour écrire le projet :
Vous devez disposer de la version correspondante à votre projet installée sur votre PC. Si vous indiquez une version trop vieille, vous risquez le plantage. Avec une version plus récente, vous ne pourrez relire votre projet qu'avec cette nouvelle version.
Vous avez alors dans la colonne de gauche une liste de mots ou expression :
Vous constatez qu'en plus des expressions qui vous intéressent, il y a du texte purement technique comme les noms des unités ou des polices. Ce texte se trouve principalement en début de liste, mais il y en a aussi un peu dispersé tout au long de la liste. Vous devez éliminer ce texte. Pour ceci, un simple clic droit sur les lignes correspondantes et vous choisissez l'option (unique) Exclure du menu contextuel. À la fin, vous devez obtenir une liste épurée :
Enregistrez cette liste avec Langue Source|Enregistrer ainsi que la liste des mots exclus avec Exclusion|Enregistrer :
À partir de maintenant, vous disposez d'un fichier texte contenant l'ensemble des mots et expressions à traduire.
V-D. Travail du traducteur▲
Il est temps de prendre contact avec le traducteur. Vous lui envoyez le fichier texte précédemment créé et vous lui demandez de le traduire en respectant les & des raccourcis et les %d des chaînes de format. Deux possibilités : soit il travaille avec le bloc-note de Windows :
Avantage, le bloc-note est disponible partout, en contrepartie, il y a risque de décalage entre les deux listes.
Soit vous lui envoyez mon utilitaire de traduction pour avoir les deux listes côte à côte :
Il ouvre la liste française avec Langue source|Ouvrir et il enregistre le résultat avec Langue étrangère|Enregistrer. Inconvénient, il faut aussi lui envoyer l'utilitaire de traduction.
À la fin, le traducteur vous renvoie la liste des mots traduits.
Vous pouvez préparer le travail du traducteur en traduisant au préalable les mots standards de Windows. Les listes correspondantes sont disponibles sur mon site. Vous devez, dans l'ordre, charger (ou générer) la liste des mots de la langue source, indiquez la liste des mots standards (Langue source|Mots standards), charger les mots standards de la langue étrangère (Langue étrangère|Mots standards) et réaliser la mise en correspondance avec Traduction|Mots standards. Et n'oubliez pas d'enregistrer la liste des mots étrangers ainsi générés :
V-E. Traduction du projet▲
Une fois que vous avez récupéré la liste des mots traduits, il vous faut traduire le projet lui-même. Vous reprenez l'utilitaire de traduction. Vous ouvrez la liste de mots locale (Langue source|Ouvrir), la liste de mots étrangère (Langue étrangère|Ouvrir) et le projet (Projet|Ouvrir). Vous n'avez plus qu'à réaliser la traduction avec Traduction|Réaliser… :
Vous devez dans un premier temps indiquer un nouveau répertoire où enregistrer le projet traduit, sans changer de nom. Ensuite, indiquez de nouveau la version de Delphi à utiliser. La traduction démarre :
Quand la fenêtre de progression disparaît, la traduction est terminée. Vous n'avez plus qu'à quitter l'utilitaire, ouvrir le nouveau projet dans Delphi et le recompiler. Voici le résultat :
C'est ti pas beau ? Comme vous pouvez le voir, je l'ai appliqué sur un projet relativement important (pour moi) avec 40 000 lignes de code et 35 fiches.
Il reste quelques détails à régler. Certains éléments n'ont pas été traduits comme les boutons Oui/Non dans les fenêtres MessageDlg. En effet, ces textes ne font pas partie de votre code, mais se trouvent dans une série de fichiers source de la VCL (ou la CLX) de Delphi. Ces fichiers sont consts.pas, bdeconst.pas, dbconsts.pas et oleconsts.pas. Ils sont systématiquement fournis avec Delphi, y compris en version Standard, au moins depuis D3. Vous devez traduire le ou les fichiers qui concernent votre projet (pas besoin de traduire bdeconst.pas si vous n'utilisez pas le BDE :)). La méthode est la même que pour un projet sauf que dans Projet|Ouvrir, vous sélectionnez Unités Delphi à la place de Projet Delphi. Et dans la liste des mots à traduire, ne traitez que ceux qui peuvent concerner votre projet. Le travail est déjà fait ici pour le français, l'allemand et l'anglais. Le contenu de certains boutons (obtenus par appel direct de l'API Windows) ne changera toujours pas. Il ne changera que lorsque vous utiliserez le projet avec Windows dans la langue visée. Enfin, mon utilitaire ne traduit pas les messages d'erreur correspondant aux exceptions non gérées par votre code. Alors, autant que possible, interceptez les exceptions avant. En plus, les messages abscons correspondants affolent généralement les utilisateurs.
Et si vous utilisez des InfoVersions, pensez à changer la Langue :
V-F. Mise à jour▲
Vous avez donc traduit votre projet dans une ou plusieurs langues, mais celui-ci continue d'évoluer. Vous devez mettre à jour les traductions. Le processus est similaire, mais commencez par charger l'ancienne liste de mots français et la liste des mots exclus. Ouvrez votre projet et analysez-le de nouveau. Les nouveaux mots sont ajoutés en bas de la liste :
La suite comme pour la première traduction.
V-G. Conclusion▲
En guise de conclusion, nous avons vu comment traduire un projet Delphi. Nous ne nous sommes pour le moment pas préoccupé de changement de police. Je vous invite à voir sur cette page la méthode pour traduire et tester une application en russe. Le principal inconvénient de mon utilitaire est qu'il génère un exe par langue. Il en découle deux inconvénients. D'une part, vous ne pouvez pas changer de langue durant l'exécution. D'autre part, vous devez faire autant de programmes d'installation que de langues, et quand vous apportez des modifications à votre projet, ça devient assez vite lourd à gérer. Pour terminer, vous pouvez retrouver l'ensemble des fichiers relatifs à la traduction, y compris les sources de l'utilitaire, sur mon site. Les marchés à l'export s'ouvrent en grand devant vous :)))