Mise en forme de code: pensez à utiliser les balises [ tcl ] et [ /tcl ] (sans les espaces bien sûr) autour de vos codes tcl afin d'avoir un meilleur rendu et une coloration syntaxique. x


Alternative à msgcat
#1
Lightbulb 
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 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.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
  Répondre
#2
Merci.
Je pense qu'il manque un # devant "On crée le namespace ::msgcat"
  Répondre
#3
Bien vu, corrigé.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
  Répondre


Sujets apparemment similaires...
Sujet Auteur Réponses Affichages Dernier message
  Alternative à getchanmode car celui-ci ne voit que les modes du RFC1459 MenzAgitat 5 4,714 28/03/2014, 10:28
Dernier message: aliasangelius

Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)