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 !

APPLICATION MULTILINGUE SANS DOULEUR


Information sur le tutorial

Catégorie :Tutoriaux Date de création : 05/09/2006 18:46:30 Vu : 7 940 fois

Note :
7 / 10 - par 3 personnes
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

Description

Comment créer une application multilingue sans vous damner. Basé sur six ans d'expérience.

Tutorial

PLANIFICATION

Premièrement-
Comme de bon codeurs/programmeurs/analystes, vous avez bien sûr, nommé tous vos contrôles aves des noms qui ont du sens (...riez pas dans le fond: j'ai vu de mes yeux vu quelqu'un (pas d'ici) nommer ses boutons 'Ici' et ses variables 'Arthur' et 'Maurice').
Utilisez la convention Polonaise racourcie.
Ex.: bouton OK sur forme 'frmMain' = frmMain_btnOK
Ces noms serviront de Id distinctifs pour chaque ligne de cette table. Ils doivent donc être uniques.

Je crois tout le monde a compris.

Deuxièmement-
Planifiez vos 'captions', surtout les captions qui sont en deux parties avec un rajout programmé au milieu. Ex.: "Le document " & strDocName & " sera enregistré à " & strClose/strSave/etc
En Francais, ca va. En Anglais aussi. En Allemand, ca va pas trop (basé sur mon expérience). En Polonais, je suis prêt à gager que non.

Troisièmement-
L'Anglais est très synthétique (court). Une phrase en Anglais va s'allonger de 40% en Francais. En Allemand, c'est pire.
Le bouton "OK" devient "Accepter" devient "Akzeptieren". Vous remarquerez l'allongement progressif.

Le résultat est que les boutons s'allongent, les labels aussi et tout ceci doit être mesuré d'avance.
Comme le traducteur vous aura remis des 'captions' traduites selon vos listes, ligne par ligne, vous choisirez donc la plus longue de chaque langue pour arranger vos contrôles.

La liste du traducteur peut ressembler à ceci

Contrôle                    Anglais        Français
frmMain                    "How To"    "Mais comment y fait"
frmMain_cmdOK        "OK"        "Accepter"
frmMain_cmdQuit        "Quit"        (A VENIR) :-)

Pour les contrôles ayant des textes génériques (OK, Cancel) une série de strings applicables à tout le projet peuvent être prévue.

PREPARATIONS

D'abord sauvegarder le projet à sa positon de dévelopement finale. Ceci est important car les opérations qui suivent vont créer à l'instant un document de type resource (*.RES).

Aller dans le menu "Add-ins", ouvrir le "Add-In Manager..."
Dans la liste du "Add-in manager" sélectionner le "VB 6 Resource editor"

Dans le "Project Explorer" cliquer-droit et sélectionner "Add...". Dans le menu pop-up, sélectionner le dernier item: "Resource File" (avec le RubikCube vert). Entrer le nom choisi. En cliquant OK, VB vous avertira que ce document n'existe pas, voulez-vous le créer? Dites oui.

Vous avez maintenant un dossier "Related Documents" dans votre "Project Explorer" dans lequel il y a "<NomChoisi>.RES"
Double-cliquer dessus. Un éditeur s'ouvre qui montre votre doc resource vide.

Sélectionner l'icône "Edit String Table" (elle ressemble à un sandwich de 'abc'): vous verrez une table avec une colonne Id (un Id pour chaque string) et un Id par défaut: '101'.
Par défault, une colonne est ajoutée dans le language de base du systême.

Pour changer de language, cliquer sur la tête de colonne et sélectionner un language différent dans la liste Combo.
Pour ajouter une autre langue, cliquer sur le 'sandwich' abc dans l'éditeur de la table.

Ajouter un module dans votre projet. Ce module servira à définir les correspondances Id - variables représentant les Ids.
Désolé, y a pas plus court.
Ex.:

Public Const CfrmMain                         As Long = 101   ' mettre ici le Id de la table
Public Const CfrmMain_cmdOK         As Long = 102
Public Const CfrmMain_cmdQuit         As Long = 103

Pour les 'captions' en deux morceaux, nommer chaque morceau avec des index qui se suivent.

Public Const CtxtSomeText_1         As Long = 106     ' "Le document ouvert ("
Public Const CtxtSomeText_2         As Long = 107    ' " ) sera traité."    

Un truc: collectionner les noms de tous les contrôles dans ce module. Vous n'aurez plus qu'a les transformer en Const d'un seul trait.

CODE

Je reproduit ici le code d'un mini-projet example.
------------------------------------------------
Option Explicit

Private blnFirstTime As Boolean

Private Sub cmdOpen_Click()
    ' le contrôle 'txtSomeText' ne recoit son texte que lors de l'ouverture d'un document
    txtSomeText.Text = LoadResString(CtxtSomeText_1) & _
                lblFileName.Caption & _
                LoadResString(CtxtSomeText_2)
End Sub

Private Sub Form_Load()
    'Ceci empèchera des actions à répétition.
    blnFirstTime = True
End Sub
Private Sub Form_Activate()
    If blnFirstTime Then
        LoadAllCaptions
    End If
End Sub

Private Sub LoadAllCaptions()
    frmMain.Caption = LoadResString(CfrmMain)
    lblFName.Caption = LoadResString(ClblFName)
    
    cmdOpen.Caption = LoadResString(CcmdOpen)
    cmdSave.Caption = LoadResString(CcmdSave)
    cmdQuit.Caption = LoadResString(CcmdQuit)
    
End Sub
-----------------------------------------

Bonne chance.

Tout ceci est distillé de six ans d'expérience sur une suite-application (style MS Office) multi-applications en trois langues.

signaler à un administrateur
Commentaire de econs le 07/09/2006 00:24:06 administrateur CS

Clair, bien présenté et pointant du doigt des choses importantes.
Bref, un tutoriel à lire !

signaler à un administrateur
Commentaire de nico1610 le 30/09/2006 20:53:15

il est vrai que l'on sens la personne qui à déjà fait ca pendant longtemps et qui sait de quoi elle parle.

Je n'ai pas grand chose à dire sur ce tuto, il est bien !!

J'ajouterai seulement que pour ma part quand le projet est un gros projet je trouve préférable de faire ca sous forme de fichier externe (type ini) car a ce moment là quand le projet commence a être connu, on peut laissé librement au autre le soin de modifier les langues. de plus si le gestionnaire de langue est bien fait (recherche de fichier dans un dossier) il trouvera ainsi toute nouvelle langue fraichement installé sans avoir eu besoin de modifier l'exe, ce qui est le cas pour ta solution !

Apres, c'est au programmeur de choisir entre une meilleur portabilité (mais là je pense qu'il faut alors arreté de codé en VB ;) ) ou dans une meilleur diversification de son programme.

signaler à un administrateur
Commentaire de interkira le 31/10/2006 16:43:34

Bonjour,

pareil que nico1610, la ressource vb n'est pas très intéressante car on doit obligatoirement écrire dans le source alors que réaliser des fichiers ini ex:
french.ini, english.ini.... et mettre une séléction de langue dans le programme
permet de créer autant de fichier langue que l'on veut sans devoir recompiler.

Exemple mes programmes (ConfigWindows et TrImage XP) sur mon site http://eric.chaudagne.free.fr/

le seul soucis est de trouver des traducteurs, à bon entendeur... ;)

Cordialement

signaler à un administrateur
Commentaire de bitshifter le 20/11/2006 21:20:51

Plutot que d'utiliser un dossier ini par langue, pourquoi ne pas utiliser une DLL qui serait redistribuée comme 'patch' (rustine?)
Mais ca rendrait le code d'appel autrement plus complexe...

signaler à un administrateur
Commentaire de jackso40 le 02/02/2008 01:58:28

Mais le problème avec ce système d'après ce que j'ai pu comprendre, c'est que l'utilisateur ne peut pas choisir sa langue... La langue est choisie automatique suivant la langue du systeme d'exploitation donc si mon os est en anglais, il va me charger mon programme en anglais...(???)
Si ce n'est pas correct, serait-il possible de me dire comment fait-on pour que l'utilisateur puisse choisir la langue?
Merci

signaler à un administrateur
Commentaire de nico1610 le 02/02/2008 15:57:57

Elas si tu fais comme le tuto, ca serra impossible.

Ensuite pour BitShifter, on parlais de mettre dans un dossier unique ("./language") les fichiers .ini (french.ini english.ini ...) qui aurai les bonne traductions, apres tu peux même faire un soft pour la conception des traductions.

signaler à un administrateur
Commentaire de Florent_maf le 07/02/2008 11:45:08

Bonjour ;
je suis en train de chercher partout comment utiliser un fichier de ressource à partir de VBA.
En l'occurence, je travaille VBA intégré à SolidWorks, un soft de CAO.
En terme de performance, je prefererai utiliser un fichier ".res" plutot qu'un vulgaire ".ini" en texte.

Si toutefois, l'utilisation d'un fichier ".res" n'est pas possible, je suis preneur pour une classe déjà toute faite pour l'importation d'un ".ini".

Merci pour vos conseils.

signaler à un administrateur
Commentaire de lillith212 le 20/03/2008 12:25:42

Bonjour, Un bon tutoriel en effet, cependant, je suis d'accord avec les remarques concernant l'externalisation. En effet, travaillant régulierement sur des programmes pouvant être utilisé un peu partout en Europe je ne peux modifier mon code source systematiquement. Or en passant par des fichiers de type ini, le code n'est pas modifié alors que je projet deviens completement multilangue...
Mais je répéte, c'est un bon tutoriel.
Merci

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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,856 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é.