Astuces de recherche...
Home
- Accueil & nouveautés
- Les newsgroups VB
- Téléchargements
- L'équipe
- Nous contacter
- Liens
Rubriques
- Toutes les questions
- Affichage & graphismes
- Algorithmique
- API
- Base de registre
- Bases de données
- Contrôles
- Date & heure
- Déploiement
- Divers
- Erreurs & problèmes
- Fichiers & dossiers
- Généralités
- Impression
- Internet & mails
- Math
- Multimédia
- Réseaux
- Structures de données
- Texte & strings
- VB .Net
- VB Script
- VBA
- Windows

Question 113

Comment créer une application multilingue ?

Diverses solutions sont possibles afin d'avoir une interface multilingue, c'est-à-dire des menus, des messages, ... qui peuvent être affichés en plusieurs langues.

La première consiste à stocker toutes les chaînes de caractères dans un simple fichier texte, dans le format qui vous convient le mieux. Exemple :

; Header
001, "Français"
002, "Pierre Alexis"
003, #10/23/2003#

; File menu
101, "&Fichier"
102, "&Ouvrir..."
103, "&Quitter"

; Messages
201, "Voulez-vous vraiment quitter ce programme ?"
202, "Une erreur inattendue s'est produite."

Il ne reste maintenant plus qu'à lire votre fichier avec les instructions de lecture/écriture de VB et de "remplir" les captions des contrôles de votre interface graphique. Pour lier un contrôle à une chaîne de caractères, vous pouvez par exemple vous servir de sa propriété caption dans laquelle vous stockerez la clé de la chaîne correspondante. Ainsi pour le menu "Fichier", vous mettrez comme caption "101".

Mais attention à la performance ! Car avec cette méthode, vous risquez de parcourir inutilement de nombreuses fois le fichier. En effet, dans votre programme, vous allez parcourir tous vos contrôles, et pour chacun d'eux vous allez parcourir le fichier texte jusqu'à trouver le chaîne correspondante. Ainsi pour le premier contrôle, dans le pire des cas, c'est-à-dire si la chaîne se trouve en dernière position, vous allez parcourir tout le fichier texte. Pour le deuxième contrôle, dans le pire des cas, c'est-à-dire si la chaîne se trouve elle aussi à la fin, vous aller à nouveau parcourir tout le fichier. Ce qui n'est pas très performant. Il serait bien plus judicieux de parcourir une et une seule fois le fichier et de remplir votre interface graphique au fur et à mesure de la lecture. Pour ce faire, une solution serait de, par exemple, stocker comme clé, non pas un nombre, mais le nom du contrôle correspondant. Ainsi il suffit de parcourir une seule fois le fichier texte et d'écrire comme code :

Me.Controls(CurrentKey).Caption = CurrentCaption

où CurrentKey et CurrentCaption représente respectivement la clé et la chaîne de caractères que l'on vient d'extraire du fichier texte. Bien sûr cette technique est encore à améliorer, car elle pose un problème pour, par exemple, nommer les boutons d'une barre d'outils (qui ne sont pas des contrôles à part entière, mais en quelques sortes des sous contrôles).

Notez que l'avantage de cette solution est que la propriété caption reste libre. Vous pouvez donc l'employer pour mettre les textes par défaut au cas ou aucun fichier langue n'est installé.

L'idéal serait de choisir comme structure pour votre fichier le format ini. En effet dans ce cas il n'est plus besoin de gérer soi-même la lecture et l'écriture du fichier car il existe des API prévues à cet effet (cfr. question 32 : Comment lire et écrire dans un fichier .INI ?). En format ini, notre fichier pourrait par exemple ressembler à ceci :

[Header]
Language=English
Version=2.0
Author=Pierre Alexis
Date=07.07.2003

[Controls]
mnuFile=&Fichier
mnuFileOpen=&Ouvrir...
mnuFileExit=&Quitter

[Messages]
error=Une erreur inattendue s'est produite.

Pour plus de clarté, je vous conseille de renommer votre fichier avec une extension ".lng" (comme par exemple "english.lng") et de placer vos fichiers langues dans un sous-dossier "Languages"  de votre programme. Ainsi pour connaître la liste des langues disponibles, vous n'avez qu'à énumérer les fichiers *.lng contenus dans ce dossier.

Un avantage de cette solution, est que, s'il venait l'envie à un utilisateur multilingue de traduire votre fichier en une nouvelle langue, il pourrait le faire très facilement.

Une autre solution pour gérer une interface multilingue est d'employer les fichiers ressources. Un fichier ressource est tout simplement un fichier qui contient des... ressources ! Oui mais qu'est-ce qu'une ressource ? Cela peut-être de tout : un string, une image, des données binaires, une icône, etc.. Et à chaque ressource est attribuée un ID numérique permettant de l'identifier.
Vous trouverez dans Visual Basic un éditeur de ressources qui permet d'ajouter des ressources à votre application. Celui-ci se présente sous la forme d'un complément qu'il vous faudra charger. Pour ce faire, cliquer sur le menu "Compléments/Gestionnaire de compléments". Dans la liste des compléments disponibles, choisissez "Éditeur de ressources VB 6". Ensuite cochez la case "Charger/Déchargez". Vous pouvez maintenant ouvrir l'éditeur de ressources en cliquant sur le menu "Outils/Éditeur de ressources" ou bien en cliquant sur l'icône correspondante.
Pour ajouter vos chaînes de caractères, cliquez maintenant sur le bouton "Modifier les tables des chaînes...". Une nouvelle fenêtre apparaît dans laquelle vous pouvez ajouter vos chaînes de caractères.

Par après, pour charger une ressource lors de l'exécution de votre programme, il vous faudra employer la fonction LoadResString. Par exemple pour charger et afficher la ressource texte n°101, vous écrirez :

MsgBox LoadResString(101)

Revenons maintenant à notre gestion multilingue. En regardant de plus près l'éditeur de ressources, vous constaterez qu'il est possible d'ajouter de nouvelles tables de chaînes et donc de nouvelles langues. En d'autres mots, en plus de la colonne "ID" et "Français", vous pouvez ajouter de nouvelles colonnes, comme "Anglais", "Néerlandais", etc... Malheureusement Visual Basic ne permet pas de récupérer les chaînes de caractères des autres langues. VB ne tient compte que de la première colonne. (néanmoins parfois il choisit comme colonne celle qui correspond à la langue définie dans les paramètres régionaux, mais cela ne marche pas toujours).

Donc c'est râpé, me direz-vous, pas moyen d'employer les ressources pourtant si pratiques pour gérer plusieurs langues. Et bien si, il existe une solution. Elle consiste à employer des DLL satellites. C'est-à-dire que l'on va créer, pour chaque langue, une DLL contenant un fichier ressources. On aura donc dans un dossier par exemple : français.dll, english.dll, etc.. Cette technique est expliquée en détail dans la fiche suivante : 188659 - HOWTO: Use a Satellite DLL for Localization Purposes.

Une dernière solution à mentionner, car elle revient souvent sur les forums, est l'emploi d'une base de données pour stocker les chaînes de caractères. Mais il s'agit d'une très mauvaise solution, très lente, très peu performante et totalement inadaptée. Comme dirait certains, c'est comme employer un missile sol-air pour abattre un lapin.

Enfin, en ce qui concerne l'installation, pour la mettre en plusieurs langues, il faudra employer l'IPDK (International Package and Deployment Kit) disponible à cette adresse : IPDK Download & Installation Instructions.

Date de publication : 26 janvier 2003
Dernière modification : 27 janvier 2003
Rubriques : Déploiement, Généralités
Mots-clés : multilingue, langues, ressources, DLL, satellites