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.
Télécharger le zip
salut frop01c'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?
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 --- String1 --- Bonjour2 --- Good Morning3 --- Votre message4 --- Your messageDans un module on déclare Global Pays as Byteensuite 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 =1il ne reste qu'à faire :LoadResString (1+Pays)LoadResString (3+Pays)Bonne continuation !!
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 : Bonjour1001 : Welcome2001 : ...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
De plus travaillant sur l'internalisation d'application, il faut également gérer les notions de font+charset (pour la japanisation par exemple)
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 !
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.dllOn se déconnecte par FreeLibraryEt on lit un message par LoadStringDe 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
D'accord avec frop01.
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 :pJe précise aussi que l'idée 1 dll / langue est très pratique et à étudier sérieusement :)Vlad
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.
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(
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.
Et cest laquelle la premiere langue par défaut ?La premiere table ajoutée ?On peut la changer ? Comment ?
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).
Merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
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. :-((++
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.
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=1784) 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 ...
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.
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 ;)
Tout a fait DrJo45, un exemple de code serait un excellent support...Nous attendons ton code avec patience...++Jock
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
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...
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...
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...
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
cool
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...
Si besoin d'un coup de main ou d'explications supplémentaires, demandez-moi !
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éeAlors, regardez mon tuto avec exemple:http://www.vbfrance.com/code.aspx?ID=7993
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 !
Hello sarl_adcEn 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.
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 ;-)
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 ..
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
Bonjour tout le mondeEn 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 1000et leurs équivalents arabes a partir de 2000je 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 trucsLe 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 VB6Mais 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 colonneSi quelqu'un connait une solution, j'en serai ravimerci
pour ecrire l'arabe sous VB6selectioné font du label ou textbox dans la case script changer occidental en arabe c tousM.Fetha
Se souvenir du profil
Mot de passe oublié ? / Activation de compteCréer un compte
1 903 587 membres 141 nouveaux aujourd'hui 16 195 membres club