OVH Cloud OVH Cloud

perl et gettext

6 réponses
Avatar
ecureuil
bonjour,

J'aimerais utiliser gettext pour internationaliser les messages dans
certains mails que j'envoie.

j'ai utilisé perl et gettext avec des cgi.

Là, ce n'ai pas le même contexte! Pas de cgi...

Un utilisateur spécifique reçoit des mails qui sont traités via un pgm
spécifique.
Ce pgm analyse le mail, fait des traitements et renvoie un mail à la
personne qui a envoyé le mail.

Ce sont les messages de ce mail de retour que j'aimerais mettre dans la
langue de la personne qui a envoyé le mail.
J'ai une bd de tous les utilisateurs qui sont autorisés à envoyer ce type de
messages.
Je pourrais ajouter la langue de chaque utilisateur dans cette bd...
Mais après comment traiter cela?

Il y a peut-être une meilleur solution pour internationaliser les
messages...

merci
anne

6 réponses

Avatar
Paul Gaborit
À (at) Sun, 18 Jun 2006 02:40:08 +0200,
"ecureuil" écrivait (wrote):
J'aimerais utiliser gettext pour internationaliser les messages dans
certains mails que j'envoie.
[...]

J'ai une bd de tous les utilisateurs qui sont autorisés à envoyer ce type de
messages.
Je pourrais ajouter la langue de chaque utilisateur dans cette bd...
Mais après comment traiter cela?


Il "suffit" de changer le 'locale' courant pour que gettext (qu'on
utilise généralement via le module Locale::TextDomain) récupère les
messages dans la langue correcte (dans la mesure où le fichier de
messages associé à cette langue existe bien).

Il y a peut-être une meilleur solution pour internationaliser les
messages...


L'idéal, c'est le module Locale::Maketext. Ce module a été créé en
réponse aux besoins non-couverts par gettext et l'argumentaire
développé tient très bien la route. Seul petit défaut : à ma
connaissance, cette technique n'est utilisable qu'en Perl puisqu'il
n'existe pas (encore?) d'implémentation dans d'autres langages.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
ecureuil
"Paul Gaborit" a écrit dans le message de
news:
|
| À (at) Sun, 18 Jun 2006 02:40:08 +0200,
| "ecureuil" écrivait (wrote):
| > J'aimerais utiliser gettext pour internationaliser les messages dans
| > certains mails que j'envoie.
| [...]
| > J'ai une bd de tous les utilisateurs qui sont autorisés à envoyer ce
type de
| > messages.
| > Je pourrais ajouter la langue de chaque utilisateur dans cette bd...
| > Mais après comment traiter cela?
|
| Il "suffit" de changer le 'locale' courant pour que gettext (qu'on
| utilise généralement via le module Locale::TextDomain) récupère les
| messages dans la langue correcte (dans la mesure où le fichier de
| messages associé à cette langue existe bien).

J'ai fait des essais cela à l'air de fonctionner...
J'ai des messages qui vont être pour le demandeur et d'autres pour
l'administrateur...
Le demandeur et l'administrateur non pas forcément la même langue.
Est-ce possible dans le même programme de gérer 2 langues avecc gettext?

|
| > Il y a peut-être une meilleur solution pour internationaliser les
| > messages...
|
| L'idéal, c'est le module Locale::Maketext. Ce module a été créé en
| réponse aux besoins non-couverts par gettext et l'argumentaire
| développé tient très bien la route. Seul petit défaut : à ma
| connaissance, cette technique n'est utilisable qu'en Perl puisqu'il
| n'existe pas (encore?) d'implémentation dans d'autres langages.
|
J'ai commencé de regarder Maketext... pas trouvé beaucoup d'infos pour
l'utiliser...

anne
Avatar
Paul Gaborit
À (at) Tue, 20 Jun 2006 01:52:40 +0200,
"ecureuil" écrivait (wrote):
Est-ce possible dans le même programme de gérer 2 langues avecc gettext?


Oui. Là encore, tout passe par la valeur de 'locale' courante.

J'ai commencé de regarder Maketext... pas trouvé beaucoup d'infos pour
l'utiliser...


Il faut lire la documentation des modules Locale::Maketext et
Locale::Maketext::TPJ13 (qui n'est pas vraiment un module mais juste
un article du TPJ sous forme POD). Vous pouvez aussi jeter un oeil à
Locale::Maketext:Gettext pour réunir « le meilleur et le pire des deux
mondes » (c'est l'auteur qui le dit). Le tout est accessible en ligne
via 'perldoc' si vous installez ces modules chez vous... sinon, via
search.cpan.org.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
ecureuil
"Paul Gaborit" a écrit dans le message de
news:
|
| À (at) Tue, 20 Jun 2006 01:52:40 +0200,
| "ecureuil" écrivait (wrote):
| > Est-ce possible dans le même programme de gérer 2 langues avecc gettext?
|
| Oui. Là encore, tout passe par la valeur de 'locale' courante.
|

Dans mon programme, j'ai des messages pour l'administrateur et d'autres pour
le demandeur.
L'administrateur et le demandeur n'ont pas forcement la même langue.

Je n'arrive pas à trouver d'infos pour gérer les messages dans la langue de
l'administrateur et les messages dans la langue du demandeur.

Je me suis fait un petit programme d'essai :
----------------------------------------
#!/usr/bin/perl

use strict;
use POSIX;
use Locale::gettext;

my $Debug = 1;

my $fic_lang_traduc = "/home/e-smith/files/users/zoro/home/faxvm/locale/";
my $lib_name = "faxvm";

my $http_lang_util = shift;
my $http_lang_admin = $ENV{LANG};

$http_lang_util =~ s/^fr*/fr_FR/g;
$http_lang_util =~ s/^en*/en_GB/g;

$http_lang_admin =~ s/^fr*/fr_FR/g;
$http_lang_admin =~ s/^en*/en_GB/g;

setlocale(LC_MESSAGES, "$http_lang_util");
bindtextdomain("$lib_name", "$fic_lang_traduc");
textdomain("$lib_name");

# set gettext stufs :
sub _ {
return gettext($_[0]);
}

my $repfax = "/tmp/repfax";

my $mes_info=_("Informations Message!");
my $mes_info1 =_("Temporary Directory: ");

print "util $mes_infon";
printf "util %s %snn", $mes_info1, $repfax ;

if ($Debug) {
print "admin $mes_infon";
printf "admin %s %sn", $mes_info1, $repfax ;
}
------------------------------------

J'aimerais que tous les messages qui sont avec if ($Debug) soit dans la
langue de administrateur et les autres dans la langue du demandeur.

Si vous avez des solutions, je ne trouve pas pour l'instant la façon de
gérer cela avec gettext.

merci
anne
Avatar
Paul Gaborit
À (at) Tue, 20 Jun 2006 14:45:04 +0200,
"ecureuil" écrivait (wrote):
Dans mon programme, j'ai des messages pour l'administrateur et d'autres pour
le demandeur.
[...]

setlocale(LC_MESSAGES, "$http_lang_util");


C'est cet appel qui indique à 'gettext' la langue qu'il doit utiliser.

bindtextdomain("$lib_name", "$fic_lang_traduc");
textdomain("$lib_name");

# set gettext stufs :
sub _ {
return gettext($_[0]);
}

my $repfax = "/tmp/repfax";

my $mes_info=_("Informations Message!");
my $mes_info1 =_("Temporary Directory: ");


Les chaînes $mes_info et $mes_info1 sont déjà traduites (via l'appel à
'gettext').

print "util $mes_infon";
printf "util %s %snn", $mes_info1, $repfax ;

if ($Debug) {


setlocale(LC_MESSAGES, "$http_lang_admin");
my $mes_info=_("Informations Message!");
my $mes_info1 =_("Temporary Directory: ");

Comme ça $mes_info et $mes_info1 passent à nouveau via un appel à
'gettext' mais avec le 'locale' de l'admin et non de l'utilisateur.

print "admin $mes_infon";
printf "admin %s %sn", $mes_info1, $repfax ;
}
------------------------------------

J'aimerais que tous les messages qui sont avec if ($Debug) soit dans la
langue de administrateur et les autres dans la langue du demandeur.


En fait, le principe consiste à retarder le plus possible l'appel à
'gettext' pour qu'on utiliser toujours le 'locale' courant (qui change
selon qu'on s'adresse à l'un ou l'autre). Ne vous inquiétez pas des
performances : 'gettext' maintient un cache interne de tous les
messages.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
ecureuil
"Paul Gaborit" a écrit dans le message de
news:
|
| À (at) Tue, 20 Jun 2006 14:45:04 +0200,
| "ecureuil" écrivait (wrote):
| > Dans mon programme, j'ai des messages pour l'administrateur et d'autres
pour
| > le demandeur.
| [...]
| > setlocale(LC_MESSAGES, "$http_lang_util");
|
| C'est cet appel qui indique à 'gettext' la langue qu'il doit utiliser.
|
| > bindtextdomain("$lib_name", "$fic_lang_traduc");
| > textdomain("$lib_name");
| >
| > # set gettext stufs :
| > sub _ {
| > return gettext($_[0]);
| > }
| >
| > my $repfax = "/tmp/repfax";
| >
| > my $mes_info=_("Informations Message!");
| > my $mes_info1 =_("Temporary Directory: ");
|
| Les chaînes $mes_info et $mes_info1 sont déjà traduites (via l'appel à
| 'gettext').
|
| > print "util $mes_infon";
| > printf "util %s %snn", $mes_info1, $repfax ;
| >
| > if ($Debug) {
|
| setlocale(LC_MESSAGES, "$http_lang_admin");
| my $mes_info=_("Informations Message!");
| my $mes_info1 =_("Temporary Directory: ");
|
| Comme ça $mes_info et $mes_info1 passent à nouveau via un appel à
| 'gettext' mais avec le 'locale' de l'admin et non de l'utilisateur.
|
| > print "admin $mes_infon";
| > printf "admin %s %sn", $mes_info1, $repfax ;
| > }
| > ------------------------------------
| >
| > J'aimerais que tous les messages qui sont avec if ($Debug) soit dans la
| > langue de administrateur et les autres dans la langue du demandeur.
|
| En fait, le principe consiste à retarder le plus possible l'appel à
| 'gettext' pour qu'on utiliser toujours le 'locale' courant (qui change
| selon qu'on s'adresse à l'un ou l'autre). Ne vous inquiétez pas des
| performances : 'gettext' maintient un cache interne de tous les
| messages.
|

merci
testé!
C'est ok

J'ai fait 2 tests... je ne sais pas ce qui est le mieux

Je nomme mes variables différemment si admin ou demandeur
et je mets tout ce qui concerne la traduction au même endroit
----------------------------
my $mes_info="Informations Message!";
my $mes_info1 ="Temporary Directory: ";

setlocale(LC_MESSAGES, "$http_lang_util");
my $mes_info_util =_("$mes_info");
my $mes_info1_util =_("$mes_info1");
setlocale(LC_MESSAGES, "$http_lang_admin");
my $mes_info_admin =_("$mes_info");
my $mes_info1_admin =_("$mes_info1");
----------------------------

Je déclare mes variables de traduction
et à chaque demande, j'appelle le bon locale
----------------------------
my $mes_info="Informations Message!";
my $mes_info1 ="Temporary Directory: ";
...
setlocale(LC_MESSAGES, "$http_lang_util");
printf "util %sn", _("$mes_info");
printf "util %s %snn", _("$mes_info1"), $repfax ;
...
if ($Debug) {
setlocale(LC_MESSAGES, "$http_lang_admin");
printf "admin %sn", _("$mes_info");
printf "admin %s %snn", _("$mes_info1") , $repfax ;
}
----------------------------

anne