II. Traduction de projet en utilisant l'Expert DLL de ressources▲
Dans cette partie, je vais présenter la traduction d'un projet avec D5 Pro (ou supérieur). Je suppose que vous avez mis en œuvre les recommandations concernant la préparation d'un projet. En complément de cette partie, une page présente les apports de l'ITE (environnement de traduction intégré) dans le processus de traduction. Les points suivants sont abordés.
II-A. générer les DLL de ressources▲
Votre projet est prêt à être traduit. Et Delphi vous fournit l'assistant pour ceci, à savoir l'Expert DLL de ressources. Cet outil va réunir toutes vos ressources dans une DLL et générer autant de DLL que vous voulez de langues. Le programme n'aura alors plus qu'à charger la bonne DLL pour afficher la langue voulue.
Après avoir ouvert votre projet dans Delphi, vous accédez à cet assistant par le menu Nouveau… :
Vous avancez dans l'Expert en général sans rien changer et en appuyant uniquement sur le bouton Suivant. Vous arrivez au choix des langues :
Dans un premier temps, je vous déconseille de sélectionner la langue utilisée pour le développement, le français dans mon cas. Vous continuez ensuite jusqu'à la fin de l'assistant sans rien changer. À la question :
répondez Oui. Pour terminer, vous avez le droit à quelques statistiques.
De retour dans Delphi, vous voici avec une library (DLL) par langue :
En fait vos données sont organisées en groupe de projet. Avec Voir Gestionnaire de projet (Ctrl+Alt+F11), vous avez plus de détails :
II-B. Traduire l'interface▲
Vous devez maintenant traduire chaque projet en langue étrangère. Commencez par les Form et autres fenêtres. Avec la commande Ouvrir du menu contextuel, vous activez la forme dans l'EDI. Vous n'avez plus qu'à utiliser l'inspecteur d'objets pour modifier toutes les propriétés qui le nécessitent. La première à traduire est évidemment Caption, mais vous pouvez en modifier d'autres. Pour afficher la liste des propriétés que vous êtes autorisé à modifier, cliquez avec le bouton droit de la souris sur l'inspecteur d'objet et choisissez l'option Voir|Localisable comme suit :
Vous constatez alors que vous pouvez, par exemple, changer la largeur d'un composant qui serait trop étroit pour le texte qu'il doit contenir.
II-C. Traduire les chaînes de ressources▲
Ensuite passez au fichier ressource, toujours avec Ouvrir avec une surprise :
En plus de vos ressources à vous (vos resourcestring), il y a un tas d'autres chaînes qui peuvent apparaître dans vos applications. Nous voyons dans l'exemple ci-dessus les chaînes relatives aux fenêtres créées lors d'appels à la fonction MessageDlg. Pour un simple projet, il faut déjà compter 170 chaînes, nombre qui augmentera si vous utilisez le BDE par exemple. Pour un premier essai, je vous conseille de ne traduire que vos chaînes de ressources personnelles, mais à terme, il faudra traduire toutes les chaînes susceptibles d'être utilisées dans votre application.
Quand vous avez fini vos traductions, sauvegarder l'ensemble et recompilez-le avec la commande Compiler tous les projets :
II-D. Changer de langue à l'exécution▲
Avec le gestionnaire de projets, retournez sur le projet principal (sinon, vous restez sur la dernière langue de la liste) et exécutez votre projet. Vous constatez que rien n'a changé. D'ailleurs, nous n'avons jamais indiqué qu'il fallait changer quelque chose. En fait, au démarrage de l'application, celle-ci regarde la langue définie dans Windows et recherche s'il existe une DLL de ressources correspondantes. Si votre projet est en français avec Windows en français, votre application utilise le français. Par contre, si vous utilisez Windows en anglais, votre application doit utiliser l'anglais au démarrage. Vous avez donc détection et utilisation automatique de la langue de l'utilisateur. Ceci peut être gênant si l'utilisateur veut travailler avec une autre langue que celle de Windows. La méthode pour contourner ce problème est de changer dynamiquement de langue à l'exécution. Un exemple est présenté dans la démonstration de richedit fournie avec Delphi (dossier /demos/richedit). Pour mettre cette technique en œuvre dans votre projet, vous devez récupérer l'unité Reinit.pas de l'exemple de Delphi et l'inclure dans votre projet (ou mettre son chemin dans les options de recherche). Ensuite, pour passer en allemand standard, utilisez le code suivant :
uses
Reinit;
const
GERMAN = (SUBLANG_GERMAN shl
10
) or
LANG_GERMAN;
procedure
TForm1.Button1Click(Sender: TObject);
begin
if
LoadNewResourceModule(GERMAN) <> 0
then
ReinitializeForms;
end
;
Cette fois, l'essai est concluant et vous pouvez basculer votre application dans la langue que vous désirez. La première difficulté est de revenir en français si vous n'avez pas créé la DLL de ressources correspondantes (voir note). Le second problème est qu'il faut rajouter un bout de code à chaque fois que vous ajoutez une langue à votre projet. J'ai donc mis au point une autre technique qui liste automatiquement toutes les langues disponibles dans une ComboBox et vous n'avez plus qu'à faire votre choix : (1)
unit
uchoix; // unité de la fenêtre de choix de langue
...
procedure
TChoix_langue.FormShow(Sender: TObject);
var
Les_Langues : TLanguages;
I : integer
;
Racine : TFileName;
begin
inherited
;
ComboBox.Items.Clear;
Racine:=Application.ExeName;
// récupération de toutes les langues installées sur Windows
Les_Langues:=Languages;
for
I:=0
to
Les_Langues.Count-1
do
begin
// on regarde si la DLL correspondant à une langue existe
if
FileExists(ChangeFileExt(Racine,'.'
+Les_Langues.Ext[I])) then
// si oui, on l'ajoute à la liste des langues disponibles
ComboBox.Items.AddObject(Les_Langues.Name[I],TObject(StrToInt(Les_Langues.ID[I])));
end
;
ComboBox.ItemIndex:=0
;
end
;
procedure
TForm1.Choisir1Click(Sender: TObject);
var
I : integer
;
begin
if
Choix_Langue.ShowModal=mrOk then
begin
I:=integer
(Choix_Langue.ComboBox.Items.Objects[Choix_Langue.ComboBox.ItemIndex]);
if
LoadNewResourceModule(I) <> 0
then
ReinitializeForms;
end
;
end
;
On remarque au passage que l'ID de la langue est stocké dans le champ Objects des Items de la ComBox. Nous avons ainsi un moyen rapide, élégant et qui s'adapte aux évolutions de votre projet :
II-E. conclusion▲
Je vous mets le code source (101 ko) d'un projet illustrant la traduction d'un projet avec changement dynamique de la langue.
Dans cette partie, nous avons vu la manière de traduire dans Delphi une application dans plusieurs langues et la méthode pour changer dynamiquement de langue à l'affichage. Parmi les inconvénients, il est nécessaire de disposer de Delphi pour réaliser la traduction et il faut à chaque projet traduire l'ensemble des mots, y compris les plus courants, comme ceux qui sont présents dans les ressources par défaut. Dans la partie suivante, nous allons voir l'utilité de l'ITE qui permet réellement de gérer la traduction.