Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

VOTRE PROGRAMME EN MULTI - LANGUES (MOYEN TRÈS TRÈS SIMPLE EN VB6)


Information sur la source

Description

Prévoyez plusieurs langues pour votre programme dès le départ du développement.

Un moyen très simple pour que votre programme soit un en multi-langue . Seulement en utilisant LoasResString (id)

 

Source

  • Pour tester le programme dans le zip:
  • Si votre système est configuré sur l’emplacement régional Français (France) et que vous lancez le programme alors le menu ainsi que le bouton et le message s’affiche en français.
  • Allez dans le Menu de Windows Démarrer / Paramètres / Panneau de configuration/ Options régionales/Vos paramètres régionaux (emplacement) . Et sélectionnez la langue Anglais (Etats Unis) ensuite relancez le programme.
Pour tester le programme dans le zip:

Si votre système est configuré sur l’emplacement régional Français (France) et que vous lancez le programme alors le menu ainsi que le bouton et le message s’affiche en français.
Allez dans le Menu de Windows Démarrer / Paramètres / Panneau de configuration/ Options régionales/Vos paramètres régionaux (emplacement) . Et sélectionnez la langue Anglais (Etats Unis) ensuite relancez le programme.

Conclusion

Chargement Ressource VB6

- Allez dans le menu Compléments / Gestionnaire de compléments...
- Sélectionnez Editeur de ressources VB6 dans la liste.
- Cochez la case à cocher Chargé/Déchargé pour le charger dans le menu
- Cochez Chargez au démarrage si vous voulez qu'il s'ajoute automatiquement dans le menu au démarrage du VB6
- Cliquez sur OK

Vous trouverez l'éditeur ressource dans le menu Outils.

Utilisation Ressource VB6

- Cliquez sur l'icône "abc" pour faire apparaître la fenêtre "Modifier les tables de chaînes.
- dans la première ligne l'id est automatiquement ajouté (101) qui est modifiable par la suite.
- dans la deuxième colonne de la même ligne, on peut saisir notre texte en français comme l'indique l'entête de la colonne (ex Bonjour).
- directement de la même colonne cliquez sur l'icône "abc" pour ajouter une nouvelle table de chaîne.
- une liste déroulante apparaît dans l'entête de la nouvelle colonne pour sélectionné une langue spécifique à cette colonne.
- choissiez ex : Anglais (Royaume Uni)
- ensuite dans la deuxième colonne de la première ligne tapez votre texte en anglais (ex : Good morning)
- lorsque vous avez terminer votre saisi fermer cette fenêtre et cliquez sur l'icône sauvegarder (disquette) pour enregistrer les données dans un fichier ressource .res.
- Vous allez trouvez votre fichier inséré automatiquement à votre projet dans documents associés.

Utilisation du fichier dans votre programme.

Très simplement la fonction LoadResString ( id ) renvoie la chaîne correspondante à "id"
de la colonne français si les options régionaux (emplacement) de votre système est configuré sur Français (France)
et si vous modifiez les options régionaux de votre système sur Anglais (Royaume uni), la fonction LoadResString renvoi
automatiquement la chaîne de la table correspondante (càd 2ème colonne) Car LoadResString vérifie
d'abord le LCID (Local Identifier).

Maintenant préparez vous ...

A vos claviers.


Bonne chance .

Je suis là pour répondre à vos questions, idées, suggestions, mêmes vos critiques.

NB : Merci de m'avertir s'il y a des fautes d'orthographes.

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de glycocalix le 30/09/2004 16:27:50

salut frop01
c'est une méthode possible mais qui ne permet pas à l'utilisateur de configurer la langue de son logiciel sans avoir à changer celle de son systeme. Il est par contre possible de le faire en utilisant toujours cette méthode, avec une seule colonne mais en utilisant une décalage dans les id par exemple si l'appli possède deux langues anglais français et deux mots (soyons fou) on peut mettre 0-hello 1-good bye 3-bonjour 4-au_revoir dans ce cas on instancie une variable au lancement de l'appli qui indique le décalage à utiliser dans les index.
par contre, je cherche la technique API à utiliser pour pouvoir stocker les différentes langues dans des DLL, sait tu comment faire?

signaler à un administrateur
Commentaire de frop01 le 30/09/2004 16:57:29

Si tu veux que l'utilisateur choisisse la langue de son choix indépendemment du système : c'est possible en utilisant la méthode suivant :

id --- String
1  --- Bonjour
2  --- Good Morning
3  --- Votre message
4  --- Your message

Dans un module on déclare Global Pays as Byte

ensuite dans le programme tu donnes la possiblité à l'utilisateur de choisir soit la langue française ou anglaise dans une combox.
Si on choisi le francais alors Pays=0 sinon Pays =1

il ne reste qu'à faire :

LoadResString (1+Pays)
LoadResString (3+Pays)

Bonne continuation !!

signaler à un administrateur
Commentaire de guilleto le 01/10/2004 09:17:50

Bonjour !

Ceci est une méthode vraiment simple en effet, mais qui ne prends pas en compte plusieurs éléments :
* Si vous avez un grand nombre de langues il ne faudra pas se tromper de ligne.
Solution :
1 : Bonjour
1001 : Welcome
2001 : ...
etc.

LoadResString (1+Pays*1000)

Les langues sont par bloc !
C'est plus lisible !

* Et si ton programme va en Russie ???
Comment fais-tu pour le cyrillique ??

Réponse : tu ne peux pas avec un LoadResString !!

Donc il te faudra avoir recours à un fichier externe de type Excel ou mieux encore Access !!

Cordialement,

Olivier

signaler à un administrateur
Commentaire de bidoch78 le 01/10/2004 11:42:37

De plus travaillant sur l'internalisation d'application, il faut également gérer les notions de font+charset (pour la japanisation par exemple)

signaler à un administrateur
Commentaire de frop01 le 01/10/2004 12:26:13

Salut,

Oui c'est exact. il ya 36 facons pour gérer son appli en multi-langues et la méthode de guilleto semble correcte.

Si on veut gérer un grand nombre de langues dans notre programme notamment la langue arabe il faudrait plus que les méthodes qu'on a sité.

Oui mais la méthode avec LoadResString reste un moyen facile pour une application qui va gérer trois ou quatre langues (Francais, Anglais , Allemand, Espagnol par exemple) et même si on possède un programme vieux de deux ans qui est en vente on peut facilement le converrtir en multilangue sans trop de code et de dégats (pour accroitre sa chance de vente.)

N'est ce pas vrai ?

Bonne journée !

signaler à un administrateur
Commentaire de marcA le 01/10/2004 12:36:31

Bonjour,

Il est aussi possible de créer un fichier res par langue, puis de compiler chaque fichier res en une dll.
Par exemple Lng1.dll ....

Par après on se connecte à la dll par l'api
LoadLibraryEx (lors du choix de la langue ou du login de l'utilisateur)
Par exemple l'utilisateur veut utiliser la langue Espagnol, alors le programme lit la DLL espagnole (par exemple LNG50.dll
On se déconnecte par
FreeLibrary

Et on lit un message par
LoadString
De cette manière, si on veut ajouter une langue, on ajoute juste une dll au programme et si l'utilisateur choisit cette langue, on utilise juste la nouvelle DLL

signaler à un administrateur
Commentaire de bidoch78 le 01/10/2004 13:07:12

D'accord avec frop01.

signaler à un administrateur
Commentaire de vlad2i le 03/10/2004 17:04:49

Juste une remarque perso, cette méthode ne marche que pour assez peu de langues (allez, le français, l'anglais, l'italien, l'espagnol et et l'allemand peut etre ...) car limité à ASCII (et vi, il en reste 150 langues , telles que russe, arabe, tchèque, slovène ... qui ne marchent qu'en UNICODE)

Mais vous etes po obligé, évidemment :p

Je précise aussi que l'idée 1 dll / langue est très pratique et à étudier sérieusement :)

Vlad

signaler à un administrateur
Commentaire de DrJo45 le 04/10/2004 09:35:26

La méthode avec les dll est de loin la plus efficace. L'utilisation de LoadLibrary est un peu lourde, on peut faire tout bonnement un dll Active X par langue qui expose une fonction qui renverra le texte en fonction de son ID. On instanciera l'objet par CreateObject(ProgID) où ProgID est composé du titre de la dll et du nom de la classe exposée séparés par un point.
Pour ce qui est des langues slaves, arabes etc il faut savoir que les ressources sont en UNICODE !! et donc qu'on peut créer des ressources valides pour ces langues. (Créer un fichier . rc et compiler la ressource avec le compilateur de ressource RC. Les textes sont à définir avec ID, L"\x0000...."  où 0000 est à remplace par les codes hexa du caractère unicode.
Ex: 108 L"\x0059\x0065\x0073" pour "Yes" en anglais)
Pour utiliser ces textes unicode, étudier en détail la fonction StrConv() (Placer les résultats dans un tableau de bytes pour voir comment ça marche.), savoir obtenir un LCID et définir un charset à placer dans le Charset de la fonte utilisée dans le controle où on place le texte.

signaler à un administrateur
Commentaire de olid le 04/10/2004 14:20:35

Une question importante pour mon projet YMP...

Jai modifié le setup1.vbp de l'assistant d'installation de VB6 pour quil y est 2 tables de ressources: francais et anglais.

Mais, que ce passe til si l'utilisateur est italien ?
Quelle table de ressources va etre utilisée ?
Peut-on influencer la table à utiliser qd aucune ne convient ?
Si une table est incompléte, va til utiliser une autre pour les traductions manquantes ?

NB: Voyez ma source de traduction par .ini... On l'a bocoup améliorée depuis 1 an, mais pô le temps de la re-publier :o(

signaler à un administrateur
Commentaire de frop01 le 04/10/2004 14:58:29

Ben l'italien n'a qu'à apprendre le francais et puis voila ;)

Non sérieux, le programme va prendre en charge par défaut la première langue par défaut du ressource.

signaler à un administrateur
Commentaire de olid le 04/10/2004 15:59:08

Et cest laquelle la premiere langue par défaut ?
La premiere table ajoutée ?
On peut la changer ? Comment ?

signaler à un administrateur
Commentaire de frop01 le 04/10/2004 16:10:53

c'est la table ou il n'y pas de spécification de la langue :

Voisci un exemple de structure de .res:
- Projet1.RES
    -- Table de chaines
           --- Table de chaines (1)
           --- Table de chaines (Italien (Italie)) (2)
           --- Table de chaines (Anglais (Royame Uni)) (3)

Donc dans le cas ou la langue paramètrée dans le systeme ne figure pas dans cette liste il prend le (1).

signaler à un administrateur
Commentaire de olid le 04/10/2004 19:10:35

Merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

signaler à un administrateur
Commentaire de jockos le 18/10/2004 16:25:06

DrJo45, ok pour récupérer des messages en langue unicode (Arabe, Chinois, ...).

Mais après, il y a encore une autre étape, c'est l'affichage. Même en utilisant une Font Unicode comme "MS Arial Unicode" par exemple dans ton contrôle (Label par exemple), tu verras des ???????? à l'affichage.

Pourquoi ?
Car les contrôles standards VB ne savent afficher que de l'ANSI même si il y a une police UNICODE de spécifié.

Il faut donc utiliser le composant Microsoft Font 2.0 qui redéfinit les contrôles VB de bases (Label, TextBox, Button, OptionButton, ...) avec un affichage UNICODE possible.

Cependant, en ce qui concerne le titre des fenêtres ou un Menu VB, c'est IMPOSSIBLE d'afficher des messages arabes, chinois ou autre... Pour ces contrôle de base, seul l'ANSI est possible. :-((

++

signaler à un administrateur
Commentaire de bidoch78 le 18/10/2004 16:30:40

jockos, moi je peux te confirmer qu'en utilisant les controles standard VB style "Label", ca fonctionne tres bien sur les postes mais configurer en Japonais.

signaler à un administrateur
Commentaire de DrJo45 le 18/10/2004 17:01:11

En Effet bidoch78, avec W2000, on peut mettre son systeme dans la page de code ANSI qu'on veut à condition de le redémarer.... et ça marche.
Mais on peut aussi en restant dans son bon vieux français :
En fait, les controles standard permettent d'afficher les textes dans un des jeux de caractères chargés dans le systeme (cf panneau de config, option régionales). On ne peut par contre pas mélanger des jeux de caractères dans un controle (Ex : de l'arabe et du russe dans le meme caption)
Pour les faire afficher, j'ai mis du temps à comprendre, mais voilà :
Il suffit de définir correctement le 'Charset' de la fonte du controle et de convertir la chaine unicode en ANSI pour la page de code correspondante avant de la mettre dedans.
En pratique :
1) récupérer le codepageAnsi de la langue à afficher (API : GetLocaleInfo(LOCALE_DEFAUTANSICODEPAGE,...)) (Ex: 1256 pour l'arabe)
2) en déduire le Charset correspondant (Ex: 178 pour l'arabe)
3) Indiquer au controle qu'on utilise ce jeu : label.Font.Charset=178
4) Convertir le texte Unicode en ANSI code page 1256  mais comme vb est bizarre il faut le mettre dans une chaine unicode locale !! (LCID est l'ID de locale d'un pays parlant Arabe. exemple: Arabie saoudite : 1025
  label.caption=StrConv(StrConv(Texte, vbFromUnicode, LCId),vbunicode)
et si votre systeme permet l'affichage de ces polices, alors c'est OK.
Si vous le souhaitez, je pourrais poster un exemple de code, mais ça ne me semblait pas interresser grand monde ...
  

signaler à un administrateur
Commentaire de bidoch78 le 18/10/2004 17:07:56

Moi je suis interessé, car on a été obligé de developper nos propres controles (à base d'API) un peu chiant au niveau de la maintenance. Si tu postes pas ton code, pourrais-tu me faire suivre ca via un mail.

Merci.

signaler à un administrateur
Commentaire de frop01 le 18/10/2004 17:27:37

Si SI DrJo45 ! c'est très intéressant pour pas mal de vbistes!

Est-il possible de poster un exemple sur vbfrance.

Merci bcp ;)

signaler à un administrateur
Commentaire de jockos le 18/10/2004 18:38:00

Tout a fait DrJo45, un exemple de code serait un excellent support...

Nous attendons ton code avec patience...

++

Jock

signaler à un administrateur
Commentaire de olid le 18/10/2004 19:37:39

Je cherche un moyen de récupérer le referrer (codes langues/pays) de InternetExplorer... Ca me serait plus facile à interpreter pour selectionner automatiquement mon fichier de traduction lors de la premiere utilisation.

Merci d'avance ;op

signaler à un administrateur
Commentaire de jockos le 19/10/2004 10:00:58

DrJo45, le problème qui se pose toujours, c'est pour les contrôles VB qui n'ont pas de propriétés Font (on ne peut donc pas spécifié le bon CharSet).

Par exemple :
    - le titre des fenêtre (Caption d'un Form)
    - le Menu VB
    - ...

As-tu trouver une alternative pour ce genre de "contrôles" ?

Merci...

signaler à un administrateur
Commentaire de DrJo45 le 19/10/2004 16:58:39

Je dois avouer que je n'ai jamais eu à mettre un titre de fenêtre qui ne soit pas dans la page de code que l'utilisateur a défini dans Windows !
Mais je constate qu'il y a bien une propriété font pour les feuilles donc ça devrait être possible.
Pour les menus, je dois dire que ça fait bien longtemps que je n'utilise plus cela mais le controle ActiveBar2 d'Infragistics qui a une propriété fonte.
Excusez moi si je suis un peu lent à poster le code, mais j'y travaille dès que j'ai 5 minutes...

signaler à un administrateur
Commentaire de jockos le 19/10/2004 17:19:05

Prend ton temps, c'est déjà très gentil de ta part de préparer et de poster ton code... on attendra... ;-)

Pour les fenêtres, excuse moi, je n'ai pas précisé, je parlais des fenêtres MDI (fenêtres principales d'une appli multi-feuilles). Mais sinon, pour les fenêtres filles, il y a effectivement une propriété Font, donc comme tu dis, ça dois être possible...

signaler à un administrateur
Commentaire de DrJo45 le 20/10/2004 10:37:38

Je viens de poster le code: Exemple d'affichage dans toutes les langues. J'ai fait simple.

Jockos:  j'ai essayé de mettre de l'arabe dans le caption d'une forme et malgré le bon charset, ça ne marche pas. Mais en effet, on ne peut pas modifier l'affichage des captions de fenêtre en changeant la police de la feuille !! Pour cela, je pense qu'il faudrait passer par les windowshook pour controler l'affichage de la fenêtre par dessus windows.
Si tu trouve la solution, n'hésite pas à me le dire

signaler à un administrateur
Commentaire de bidoch78 le 20/10/2004 11:23:58

cool

signaler à un administrateur
Commentaire de sarl_adc le 21/01/2005 09:24:53

Hmmm... J'ai traduis un logiciel (30 000 mots quand même), et avec les méthodes de fichiers de ressources, c'est pas mal mais j'imagine pas le temps que j'aurais mis à répertorier chaque champ, à créer une ligne dans la ressource avec chaque mot en français et chaque  mot dans une autre langue !!

Ce que j'ai fait peut être une alternative au fichier de ressources (surement un peu plus lent, mais négligeable sur nos ordinateurs récents).


Méthode :
-------------
- J'ai créé une fonction qui répertorie tous les captions, ToolTipText et autres données "texte" de tous les champs de chaque formulaire.

-Avec une 1ère fonction (à ne lancer qu'1 fois), je vais parcourir chaque Form et insérer une table ayant le nom de la Form courant, dans une base de données Access. Ensuite je vais créer une ligne de 2 colonnes pour chaque mot à traduire (Une pour le français, l'autre pour l'autre langue).

- Après ça, à chaque ouverture de formulaire, je vais appeler une fonction qui va lire dans la table associée au formulaire chaque ligne et modifier mes éléments à l'écran.


J'ai des formulaires de + de 500 mots (Infos bulle comprises) et ça prends 0.5s au chargement grand maximum sur mon XP2000+.

L'avantage est que c'est complètement évolutif et très facile à mettre en place lors de la création d'un nouveau formulaire !
C'est aussi très pratique dans le sens ou avec un formulaire de "traduction", on peut aller traduire les mots un par un par la suite, voire même laisser l'utilisateur les traduire lui-même.

Mon logiciel est diffusé en France et en Italie depuis 1 an et ce système de traduction fonctionne à merveille !
Bien sûr, je le conseille seulement pour ceux qui n'ont pas intégré de traduction dès le début du développement ou pour ceux qui ont énormément de mots à traduire...

signaler à un administrateur
Commentaire de sarl_adc le 21/01/2005 09:27:41

Si besoin d'un coup de main ou d'explications supplémentaires, demandez-moi !

signaler à un administrateur
Commentaire de olid le 21/01/2005 13:07:39

Si tu donnais une source, çà serait plus parlant :o|

Pour ceux qui cherche un systeme comme ci-dessous:
- Utilisation dun fichier INI par langue
- Remplacement ou insertion de mot dans une expression à la volée (pour mettre une valeur ou un mot personnalisé)
- Mise en memoire cache des expressions souvent affichée

Alors, regardez mon tuto avec exemple:
http://www.vbfrance.com/code.aspx?ID=7993

signaler à un administrateur
Commentaire de sarl_adc le 21/01/2005 13:59:37

Il faudra que je mette la source un de ces 4. Là pas trop le temps donc... ;-)

Mais déjà j'ai donnée l'idée. Ca pourra toujours aider !

signaler à un administrateur
Commentaire de DrJo45 le 03/02/2005 10:42:17

Hello sarl_adc
En effet, tu as raison, écrire du code en allant le mettre dans une ressource, ce n'est pas pratique et pas facile à débogger. Pour ma part, je gère cela en définissant une procédure privée dans chaque source avec un nom fixé et contenant un select case pour obtenir des textes utilisés dans le source dans la langue de développement. Un programme, comme celui que tu décris, complète ces textes avec ceux définis dans les captions, tooltiptextes etc... des controles de la feuille (si la source est une feuille) en plaçant dans le tag la référence du texte (n° de module et n° de texte).
Ensuite, tous ces textes sont exportés dans une base données pour traduction. Un dernier programme permet de créer les ressources à partir de la base de données, ressources qui seront lues au chargement de la feuille ou dans la procédure fixée si la langue n'est pas la langue de base.
On gère comme cela un programme de plus de 15000 textes traduits en 9 langues.

signaler à un administrateur
Commentaire de sarl_adc le 04/02/2005 09:26:41

DrJo45 : Je ne savais pas qu'on pouvait générer des ressources directement à partir d'une base, je pensais qu'il fallait les saisir manuellement.

Mais ton idée est pas mal c'est vrai. Dans mon application je ne pense pas changer, c'est développé, c'est trop tard ;-)

signaler à un administrateur
Commentaire de PatriR le 19/07/2005 17:44:53

Bonjour.

Dans tout ce qui a été dit sur ce thème, il n'est pas précisé quel os est utilisé.

Or j'observe un truc très bizarre, avec un fichier ressource constitué de plusieurs tables de chaînes (et non d'une table avec textes imbriqués, ou blocs de textes successifs selon les langues) : l'appli VB6 (SP6) compilée n'a pas le même comportement :
1) l'appli affiche comme attendu les textes et messages dans la langue correspondant à l'option régionale de langue sélectionnée sous 2000 (SP4) ;
2) l'appli affiche systématiquement les messages et textes dans la langue de la première colonne du fichier ressource sous XP(SP2), indépendamment de l'option de langue ...

Encore plus étrange : sous XP (SP2), ce problème ne survient pas si l'appli est exécutée en deboggage !!!

Étonnant, n'est-il pas ?

Quelqu'un a déjà eu ça et l'a résolu ?? est ce un bug ? est-ce un problème d'option VB/Windows ?

Certes il y a les deux autres solutions évoquées dans les messages précédents, mais d'une part mon fichier ressource est énorme, et d'autre part le nombre des LoadResString qu'il va falloir aller modifier me rebute ..


signaler à un administrateur
Commentaire de prmars le 05/04/2006 15:55:50

j'ai lu et réessayer le code mais pas de résultat. surtout lorsque je veut afficher un message avec la clause Msgbox le message s'affiche tout en entier avec des caractères bizarres.
j'attends avec patience votre code

signaler à un administrateur
Commentaire de phpamateur le 13/07/2006 06:13:07

Bonjour tout le monde
En fait j'ai travaillé sur un programme en deux langues arabe et français, la solution que j'ai fait et que je répértorier tous les mots dans ficher de ressource avec un déclage de 1000 entre les deux langues le français commence a partir de l'id 1000
et leurs  équivalents arabes a partir de 2000
je me suit servi des ID entre 0 et 999 pour faire enregistrer la taille la taille des polices le charset et pas mal d'autre trucs

Le choix de la langue se fait au démarrage du programme et a chaque chargement d'une feuille j'appel la fonction LoadResStrings dans laquelle j'ai ajouter d'autre controles non pris en compte en standard VB6
Mais le probleme que j ai rencontré c est au niveau des controles de type grille car on peut pas définir une proprièté tag pour chaque colonne
Si quelqu'un connait une solution, j'en serai ravi
merci

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 1,607 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.