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. |