Application multilingue sans douleur

PLANIFICATION

Premièrement
Comme de bon codeurs/programmeurs/analystes, vous avez bien sûr, nommé tous vos contrôles avec 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 raccourcie.
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, ça ne 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 Français. 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.

PRÉPARATIONS

D'abord sauvegarder le projet à sa positon de développement 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".

Cliquer dessus. Un éditeur s'ouvre qui montre votre doc ressource 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éfaut, une colonne est ajoutée dans le langage de base du système.

Pour changer de langage, cliquer sur la tête de colonne et sélectionner un langage 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.

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'à les transformer en Const d'un seul trait.

CODE

Je reproduit ici le code d'un mini-projet exemple.

Option Explicit

Private blnFirstTime As Boolean

Private Sub cmdOpen_Click()
    ' le contrôle 'txtSomeText' ne reçoit 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.

Ce document intitulé « Application multilingue sans douleur » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.