En travaillant sur le moyen de rendre un script multilingue, je me suis confronté à un petit souci: que se passe-t-il si le package msgcat n'est pas présent ?
La réponse est évidente: le recréer (ou du moins un fake) pour ne pas bloquer le fonctionnement. Il n'y a qu'un seul prérequis: il faut que les chaines initiales soient dans une langue définie et pas de simples références.
Je m'explique: si le code est
Par contre, si le code est
Le code avec ses explications:
En fait, ::msgcat::mc fonctionne exactement comme format, donc ce petit hack permet de garder la compatibilité du script, il ne fait que perdre la partie traduction.
Il serait possible de la récupérer avec un petit système d'intialisation d'un tableau d'équivalences de chaînes, mais ce serait "bouffer de la mémoire" pour rien.
La réponse est évidente: le recréer (ou du moins un fake) pour ne pas bloquer le fonctionnement. Il n'y a qu'un seul prérequis: il faut que les chaines initiales soient dans une langue définie et pas de simples références.
Je m'explique: si le code est
putserv "PRIVMSG $nick: [::msgcat::mc txt1]"
, en cas d'absence de msgcat, l'utilisateur ne recevra que "txt1".Par contre, si le code est
putserv "PRIVMSG $nick [::msgcat::mc "Hello world"]"
, l'utilisateur recevra "Hello world" (quelle que soit la langue choisie vu qu'il ne pourra pas faire de ::msgcat::mclocale
).Le code avec ses explications:
tcl
if {![catch {package require msgcat}] && $::language != "english"} {
# on vérifie si msgcat est présent et si $::language (ajouté dans eggdrop 1.9) n'est pas la langue par défaut du script
# Inutile de charger les variables de langue si c'est pour ne pas traduire
set lfile "${path}trad.[string tolower ${::language}].msg"
# Sélection du fichier de traduction, dans mon cas il s'appelle trad.french.msg
if {[file exists $lfile]} {
i18n $lfile [::tcl::string::map {"english" "en" "french" "fr"} [string tolower ${::language}]]
# i18n est une fonction pour charger le contenu du fichier
# en utilisant un nommage standardisé (fr_FR.msg) on aurait pu faire ::msgcat::mcload ${path}
}
} else {
# Oups, on a pas le package !
namespace eval ::msgcat {
# On crée le namespace ::msgcat
proc mc {text {str ""} args} { return [format $text $str $args] }
# on crée la procédure ::msgcat::mc qui va en fait appeler format
}
}
En fait, ::msgcat::mc fonctionne exactement comme format, donc ce petit hack permet de garder la compatibilité du script, il ne fait que perdre la partie traduction.
Il serait possible de la récupérer avec un petit système d'intialisation d'un tableau d'équivalences de chaînes, mais ce serait "bouffer de la mémoire" pour rien.