IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Internationaliser un projet Delphi


précédentsommairesuivant

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… :

Image non disponible

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 :

Image non disponible

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 :

Image non disponible

répondez Oui. Pour terminer, vous avez le droit à quelques statistiques.
De retour dans Delphi, vous voici avec une library (DLL) par langue :

Image non disponible

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 :

Image non disponible

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 :

Image non disponible

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 :

Image non disponible

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 :

Image non disponible

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 :

 
Sélectionnez
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)

 
Sélectionnez
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;
 
Sélectionnez
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 :

Image non disponible

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.


précédentsommairesuivant
Note concernant la génération de DLL de ressource en français : si vous générez cette DLL, alors elle sera automatiquement utilisée lorsque vous démarrez votre projet à la place des ressources par défaut. Et si vous modifiez l'interface de votre projet, vous êtes obligé de régénérer cette DLL pour voir apparaître les modifications à l'exécution. À l'opposé, si vous ne créez pas cette DLL, vous ne pourrez pas revenir vers le français en changeant dynamiquement de langue. Je conseille de ne générer la DLL en français qu'une fois le projet terminé ou pour réaliser des essais spécifiques à cette DLL. Dans le second cas, je suggère de retirer le français de la liste des langues et de supprimer la DLL une fois les essais terminés. S

Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.