Msgcat

From Base de connaissances eggdrops & TCL
Jump to: navigation, search

msgcat - catalogue de messages.

Syntaxe

::msgcat::mc src-string
 ::msgcat::mclocale ''?newLocale?''
 ::msgcat::mcpreferences
 ::msgcat::mcload dirname
 ::msgcat::mcset locale src-string ''?translate-string?''
 ::msgcat::mcunknown locale src-string

Description

Le package msgcat fournit un ensemble de fonctions qui peuvent être utilisées pour gérer des interfaces utilisateur multi-linguales. Les chaînes de texte sont définies dans un "catalogue de messages" qui est indépendant de l'application, et qui peut être edité ou localisé sans modifier le code source de l'application. Les nouvelles langues ou locales sont fournies en ajoutant un nouveau fichier au catalogue de messages.

L'usage du catalogue de messages est optionnel pour quelconque application ou package, mais est encouragé si l'application ou package souhaite être prêt pour les applications multi-langues.

Commandes

  • ::msgcat::mc src-string ?arg arg ...? Renvoie une traduction de src-string en accord avec la locale de l'utilisateur courant. Si des arguments supplémentaire après src-string sont donnés, la commande format est utilisée pour substituer les arguments supplémentaires dans la traduction de src-string ::msgcat::mc recherchera les messages définis dans le namespace courant pour une traduction de src-string; si aucun n'est trouvé, il recherchera dans le parent du namespace courant, et ainsi de suite jusqu'a ce qu'il atteigne le namespace global. Si aucune chaîne de traduction n'existe, ::msgcat::mcunknown est appelé et la chaîne renvoyée par ::msgcat::mcunknown est renvoyée. ::msgcat::mc est la fonction principale utilisée pour localiser une application. Au lieu d'utiliser une chaîne Anglaise directement, une application peut passer la chaîne Anglaise au travers de ::msgcat::mc et utiliser le résultat. Si une application est écrite pour une seule langue de cette façon, il est facile d'ajouter un support pour des langues supplémentaires plus tard simplement en définissant une nouvelle entrée de catalogue de messages.
  • ::msgcat::mclocale ?newLocale? Cette fonction fixe locale à newLocale Si newLocale est omise, la locale courante est renvoyée, autrement la locale courante est fixée à newLocale. La locale initiale est par défaut la locale spécifiée dans l'environnement utilisateur. Voir SPECIFICATIONS LOCALE ET SUBLOCALE ci-dessous pour une description du format chaîne locale.
  • ::msgcat::mcpreferences Renvoie une liste ordonnée des locales preférées des utilisateurs, basée sur la spécification de langue de l'utilisateur. La liste est ordonnée de la preference la plus spécifique à la moins spécifique. Si l'utilisateur a spécifié LANG=en_US_funky, cette fonction retournera {en_US_funky en_US en}.
  • ::msgcat::mcload dirname Recherche dans le répertoire spécifié les fichiers qui correspondent au spécifications de langue renvoyées par ::msgcat::mcpreferences. Chaque fichier trouvé est "sourcé". L'extension de fichier est ".msg". Le nombre de fichiers message qui satisfont la spécification et ont été chargés est renvoyé.
  • ::msgcat::mcset locale src-string ?translate-string? Fixe la traduction de src-string en translate-string dans la locale spécifiée Si translate-string n'est pas spécifiée, src-string est utilisé pour les deux La fonction retourne translate-string.
  • ::msgcat::mcunknown locale src-string Cette routine est appelée par ::msgcat::mc dans le cas où une traduction de src-string n'est pas définie dans la locale courante L'action par défaut est de renvoyer src-string Cette fonction peut être redéfinie par les applications, par exemple pour mettre dans un journal de message d'erreurs chaque chaîne inconnue. La fonction::msgcat::mcunknown est appelée dans le même contexte de pile que l'appel de ::msgcat::mc La valeur de retour de ::msgcat::mcunknown est utilisée comme la valeur de retour de l'appel de ::msgcat::mc.

Spécifications locales et sublocales

La locale est spécifiée par une chaîne locale. La chaîne locale consiste en un code de langue, un code optionnel de pays, et un code optionnel spécifique au système, chacun séparés par "_". Les codes de pays et de langue sont spécifié dans les standards ISO-639 et ISO-3166. Par exemple, la locale "en" spécifie Anglais et "en_US" spécifie Anglais U.S..

Sous unix/linux, la locale prend la valeur par défaut de env(LANG) à l'instant où le package msgcat est chargé. Sous Windows, la locale prend la valeur système en utilisant la base de registre. Sous Mac OS X rien n'étant prévu vous devez utiliser récupérer la langue de Mac OS X.

Dans tous les cas, si rien n'est défini par le système la locale prend la valeur par défaut de "C".

Quand une locale est spécifiée par les utilisateurs, une recherche "meilleure correspondance" est effectuée pendant la traduction de la chaîne Par exemple, si un utilisateur spécifie en_UK_Funky, les locales "en_UK_Funky", "en_UK", et "en" sont recherchées dans l'ordre jusqu'a ce qu'une chaîne de traduction correspondante soit trouvée Si aucune chaîne traduction n'est disponible, alors ::msgcat::unknown est appelé

Namespaces et catalogues de messages

Les chaînes stockées dans le catalogue de messages sont stockées relativement au namespace auquel elles ont été ajoutées Ceci permet à de multiple packages d'utiliser les même chaînes sans craindre de collisions avec d'autre packages Cela permet aussi à le chaîne source d'être plus courte et moins sujette aux fautes de frappes.

Par exemple, l'exécution du code

# mcset en hello "hello from ::"
    namespace eval foo {mcset en hello "hello from ::foo"}
    puts [[mc hello]]
    namespace eval foo {puts [[mc hello]]}

affichera

hello from ::
    hello from ::foo

Quand il cherche la traduction d'un message, le catalogue de messages recherchera en premier dans le namespace courant, ensuite le parent du namespace courant, et ainsi de suite jusqu'a ce que le namespace global soit atteint Ceci permet aux namespaces enfants d'hériter les messages de leurs namespace parents.

Par exemple, l'exécution du code

mcset en m2 ":: message2"
    mcset en m3 ":: message3"
    namespace eval ::foo {
        mcset en m2 "::foo message2"
        mcset en m3 "::foo message3"
    }
    namespace eval ::foo::bar {
        mcset en m3 "::foo::bar message3"
    }
    puts "[[mc m1]]; [[mc m2]]; [[mc m3]]"
    namespace eval ::foo {puts "[[mc m1]]; [[mc m2]]; [[mc m3]]"}
    namespace eval ::foo::bar {puts "[[mc m1]]; [[mc m2]]; [[mc m3]]"}

affichera

:: message1; :: message2; :: message3
    :: message1; ::foo message2; ::foo message3
    :: message1; ::foo message2; ::foo::bar message3

Codes de position pour Format et Scan

Il est possible qu'un message chaîne utilisé comme argument à format ait des paramètres dépendants de la position qui auraient besoin d'être repositionnés. Par exemple, il pourra être syntaxiquement désirable de réarranger la structure de cette phrase à la traduction.

format "Nous produisons %d unités sur le site %s" $num $city
format "Sur le site %s nous produisons %d unités" $city $num

Ceci peut être géré en utilisant les paramètres positionels:

format " Nous produisons %1\$d unités sur le site %2\$s" $num $city
format " Sur le site %2\$s nous produisons %1\$d unités" $num $city

De même, les paramètres positionels peuvent être utilisés avec scan pour extraire des valeurs à partir de chaînes internationalisées

Fonction utile

Cette petite procédure permet de charger un fichier de traduction simple:

proc i18n {msgfile {lang {}} } {
	if {$lang == ""} {set lang [string range [::msgcat::mclocale] 0 1] }
	if { [catch {open $msgfile r} fmsg] } {
		putlog "Could not open $msgfile for reading\n$fmsg"
	} else {
		putlog "Loading $lang file from $msgfile"
		while {[gets $fmsg ligne] >= 0} {
			lappend ll $ligne
		}
		close $fmsg
		::msgcat::mcmset $lang [join $ll]
		unset ll
	}
}