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 #803002.



Oups
oups j'ai oublier de donner mes locales :
bmaron@marcel:/var/www/site/locale$ locale -a
C
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US
en_US.utf8
en_ZA.utf8
en_ZW.utf8
fr_BE.utf8
fr_CA.utf8
fr_CH.utf8
fr_FR.utf8
fr_LU.utf8
nl_BE.utf8
nl_NL.utf8
POSIX
[^]Re: Oups
Si tu utilise du modèle objet (et que tu fais pas de la vrai vrai localisation, juste en,fr,nl), pourquoi ne par faire un peu plus simple ?
define('LANG_DEFAULT', 'fr');
A ta classe tu ajoute :
public $locale = array();
public $lang = LANG_DEFAULT;
Au constructeur tu ajoute une fonction qui récupère le meilleur choix de langue en fonction des langues du navigateurs.
Et une fonction getText($text) comme ça :
//Generate md5 of text
$md5 = md5($text);
//Check if result is already on cache
if (!empty($this->locale[$md5]))
//Return cache value
return $this->locale[$md5];
//The request
$req = 'SELECT `tranlated` '.
'FROM `machin_locale` '.
'WHERE `lang` = \''.$this->lang.'\' '.
'AND `key` = \''.$this->db->escape($text).'\' '.
'LIMIT 0,1;';
//Get the result
$res = $this->db->getOne($req);
//Check if error happen
if (PEAR::isError($res))
{
//Trigger the notice (don't translate that message, else you will get infinite loop!)
trigger_error($res->getMessage(), E_USER_NOTICE);
//Return
return;
}
//Check if $res is empty
if (empty($res))
{
//Trigger the notice (don't translate that message, else you will get infinite loop!)
trigger_error('Localized text in lang: '.$this->lang.' for: \''.$text.'\' is not avaible', E_USER_NOTICE);
//Return not localized text
return $text;
}
//Else
else
{
//Store in cache
$this->locale[$md5] = $res;
//Return localized text
return $res;
}
Bon après je suis sans ressources, alors pour un don de quelques euros je te passe la classe complète et l'explication qui va avec de pourquoi j'ai laissé tomber le système de traduction gettext.
site perso : http://rapsys.free.fr/