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
Away
  Reply
#2
Merci.
Je pense qu'il manque un # devant "On crée le namespace ::msgcat"
Retrouvez les dernières modifications de mes scripts TCL (versions Alpha/Bêta) ainsi que d'autres de mes réalisations sur ma page GitHub et les versions stables dans la section scripts de ce site  8-)
  Reply
#3
Bien vu, corrigé.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
  Reply
#4
Il y a toujours quelque chose que je trouve manquant dans TCL.

C'est un code plus proche du gettext (comme pour php par exemple) et fonctionnant de la même manière avec les catalogues.

Peut-être que c'est moi qui ne comprend pas, mais dans l'utilisation de gettext en PHP avec POEDIT par exemple, ca semble relativement plus simple que msgcat en TCL.

Ne pouvons pas avoir un équivalent qui faciliterai la chose?
Retrouvez les dernières modifications de mes scripts TCL (versions Alpha/Bêta) ainsi que d'autres de mes réalisations sur ma page GitHub et les versions stables dans la section scripts de ce site  8-)
  Reply
#5
Non, que ce soit en PHP ou en TCL, il n'y a pas grosse différence.
En PHP, tu crées un fichier de traduction par langue, avec un nommage précis, puis tu indiques globalement ta langue courante et l'endroit où se trouvent les fichiers, et le texte est traduit si:
- la chaine à traduire est bien encapsulée dans la fonction (gettext('ceci est ma chaîne') ou _('ceci est ma chaîne')),
- une traduction existe bel et bien.
Avec msgcat, c'est pareil, sauf que tu charges "à la main" la ou les traduction(s).

Je ne vois pas trop ce que tu entends par "catalogue", est-ce que tu fais référence à l'habitude de certains de mettre des m108, m33 plutôt que des textes clairs ? Ce n'est qu'une mauvaise utilisation de msgcat qui peut avoir un léger intérêt, mais qui impose à minima une traduction (les mXXX vers du langage compréhensible)
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
  Reply
#6
(10/09/2021, 16:32)CrazyCat Wrote: Je ne vois pas trop ce que tu entends par "catalogue", est-ce que tu fais référence à l'habitude de certains de mettre des m108, m33 plutôt que des textes clairs ? Ce n'est qu'une mauvaise utilisation de msgcat qui peut avoir un léger intérêt, mais qui impose à minima une traduction (les mXXX vers du langage compréhensible)
Non du tout, nous avions débattu sur ca, l'usage de la lange de base telle que des code na rien avoir ici.
Car la bonne pratique avais été expliqué.

Je vois surtout que msgcat est une fonction, et gettext une autre.
J'imagine que mon débat est plus quil existe msgcat en TCL et manque gettext en TCL ou un équivalent
Retrouvez les dernières modifications de mes scripts TCL (versions Alpha/Bêta) ainsi que d'autres de mes réalisations sur ma page GitHub et les versions stables dans la section scripts de ce site  8-)
  Reply
#7
Non, elles sont très proches.
D'ailleurs, l'utilitaire gettext possède une option pour transfomer un .mo en .msg pour tcl.

La seule grosse différence est sur le chargement du dictionnaire, encore que ::msgcat::mcload semble être la solution tcl au chargement automatique.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
  Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Alternative à getchanmode car celui-ci ne voit que les modes du RFC1459 MenzAgitat 5 5,026 28/03/2014, 10:28
Last Post: aliasangelius

Forum Jump:


Users browsing this thread: 1 Guest(s)