Programmation.php : Gettext change de langue
Posté par eMerzh (Jabber id, page perso, ) le 09 février 2007
Hello à tous,
voilà je fais un petit site sur lequel je veux mettre une internationalisation en français, anglais et néerlandais.
j'ai donc tout au début de mon code quelque chose du style :
et j'ai dans mon arborescence un dossier
puis dans mon code j'ai des truc comme
et ça marche... mais seulement de temps en temps. je m'explique :
il arrive quand rechargeant une page ou en visitant le site, php change de locale comme ça paf parce qu'il l'a décidé.
je sais pas comment faire fonctionner cette chose à tous les coup :)
Help :D
merci
ps: je suis sous ubuntu edgy eft donc bien sur en UTF8
voilà je fais un petit site sur lequel je veux mettre une internationalisation en français, anglais et néerlandais.
j'ai donc tout au début de mon code quelque chose du style :
$language='en_US';
$this->language=$language;
$language.='.utf8';
putenv("LANG=$language");
setlocale(LC_ALL, $language);
$domain = $this->language;
bindtextdomain($domain,'/var/www/site/locale');
textdomain($domain);
et j'ai dans mon arborescence un dossier
/locale
|------en_US
|-----LC_MESSAGES
|----en_US.po
|----en_US.mo
|------fr_Fr
|-----LC_MESSAGES
|----fr_FR.po
|----fr_FR.mo
....
puis dans mon code j'ai des truc comme
echo _('Envoyer');
et ça marche... mais seulement de temps en temps. je m'explique :
il arrive quand rechargeant une page ou en visitant le site, php change de locale comme ça paf parce qu'il l'a décidé.
je sais pas comment faire fonctionner cette chose à tous les coup :)
Help :D
merci
ps: je suis sous ubuntu edgy eft donc bien sur en UTF8
> Lire le message (5 commentaires, moyenne: 2).
Vous avez demandé le commentaire #802813.



locale de la thread apache
Ça me rappelle un probleme que j'ai eu il y a assez longtemps...
Si je me souviens bien, ça vient de trois choses:
- on ne peut faire un bindtextdomain() / textdomain() qu'une seule fois dans un processus/thread (le 2eme n'a aucun effet)
- il s'applique au processus C qui l'heberge, à savoir la thread/processus Apache au dessus
- Apache a un pool de threads qu'il réutilise pour plusieurs pages, au bout d'un certain temps il les tue et en recrée.
Donc, la première page chargée va établir une bonne fois pour toute la localisation de la thread Apache correspondante; les autres pages qui seront gérée par cette thread garderont la localisation, même si elles en voulaient une autre.
Le problème c'est que je ne me souveniens pas de la solution que j'avais trouvé à l'époque... peut-être changer la conf d'apache pour que chaque sous-process meurt apres chaque page fournie ?...
[^]Re: locale de la thread apache
Finalement c'est plutot setlocale(), voir le gros warning sur http://fr2.php.net/setlocale qui décrit le probleme: un setlocale dans une thread apache va changer la locale du process et donc de toutes les autres threads.
Il doit y avoir une config Apache qui permette d'avoir des pools de vrais process forkés au lieu d'avoir des threads, pour que personne ne se marche sur les pieds.
[^]Re: locale de la thread apache
il me semble que tu peux localiser directement dans la conf d'apapche mais il va alors se baser sur l'adresse ip du visiteur
Apprendre par les autres, c'est bien.
Apprendre par soi-meme (RTFM, man, et notre ami google) c'est mieux