conseils pour msgcat

 

Miko

Tcl/tk permet de créer des programmes facilement portables, c'est bien, mais ces programmes peuvent être facilement internationaux, c'est encore mieux!!! La commande msgcat vient à votre secours. Pour l'utiliser quelques précautions s'imposent:

 package require msgcat

previent l'interpréteur que vous allez utiliser

 msgcat ::msgcat::mcload ./msgs

indique à msgcat ou trouver les fichiers de messages qui effectueront la traduction. Vous devrez ensuite faire appel à la commande

 ::msgcat::mc

chaque fois que vous voudrez utiliser une chaîne de caractères à internationaliser, par exemple:

 puts [::msgcat::mc "See you!!!"]

Pour que cette chaîne soit traduite, il ne manque plus que deux choses: définir une variable d'environnement "LANG" et lui donner la valeur "fr" (pour français...) ou "it" (pour italien...) créer un ou des fichiers de messages, exemple en français :

 ::msgcat::mcset fr "See you!!!" "Salut!!!"

(baptiser le fichier fr.msg et le mettre dans le répertoire donné en paramètre à la commande ::msgcat::mcload) ou en italien :

 ::msgcat::mcset it "See you!!!" "Ciao!!!"

La commande

 puts [::msgcat::mc "See you!!!"]

donnera si la variable LANG=fr Salut!!! et si la variable LANG=it Ciao!!!

Vous pouvez utiliser ce principe pour toute utilisation de chaîne de caractères: menus, titre de fenêtre, contenu de boite de dialogue, fenêtres d'aide, etc...

Bonnes traductions!!!


La façon naturelle d'internationaliser un code Tcl/Tk est le package msgcat. Il est bien fait et pratique.

Mais j'ai une petite réticence avec l'ordre mcload qui charge un fichier de messages. En fait ce fichier est "sourcé" ce qui crée une porte d'entrée dans votre script, de plus le mélange entre les commandes Tcl et les messages alourdi le fichier. J'utilise une procédure qui recherche un fichier appelé fr.msg pour les ordinateurs configurés en français (ou de.msg en allemand, es.msg en espagnol, ...) et charge les messages. Ces fichiers sont plus simples car ils ne contiennent que les messages originaux et leur traduction, un par ligne.

 #==========================================#
 # Load international messages              #
 #==========================================#
 # msgdir : directory where message file are
 #          file name example fr.msg de.msg nl.msg es.msg
 proc IntlMsg {msgdir {lang {}} } {
 package require msgcat
     if {$lang == ""} {set lang [string range [::msgcat::mclocale] 0 1] }
     set msgfile [file join $msgdir $lang.msg]
     if { [catch {open $msgfile r} fmsg] } {
         puts stderr "Could not open $msgfile for reading\n$fmsg"
     } else {
         while {[gets $fmsg ligne] >= 0} {
             lappend ll $ligne
         }
         close $fmsg
         ::msgcat::::mcmset $lang [join $ll]
         unset ll
     }
 }

Exemple du contenu d'un fichier fr.msg

 "About"                    "A propos"
 "File"                     "Fichier"
 "Run"                      "Execute"
 "Read configuration"       "Lire config"
 "Read"                     "Lire"
 "Help"                     "Aide"
 "Save as"                  "Enregistre sous"
 "Close"                    "Fermer"
 "Exit"                     "Quitter"

MP: msgcat magic [1] dans le wiki anglophone permet vérifier que l'on a pas oublié de traduire un message. Même si son ergonomie pourrait être améliorée.