Bonjour,
j'utilise des fichiers po pour des traductions je suis en cakephp 2.5.5
j'ai des fichiers default.po et des fichiers routes.po.
Probleme : quand je change de langue, les textes du fichier default.po sont bien changé, par contre ceux du fichier routes.po ne le sont pas.
Si j'utilise un navigateur français c'est le fichier app/Locale/ fra /LC_MESSAGES/routes.po qui est utilisé et n'est pas changé quand je change de langue.
Si j'utilise un navigateur anglais c'est le fichier app/Locale/ eng /LC_MESSAGES/routes.po qui est utilisé et n'est pas changé quand je change de langue.
Les fichier routes.po sont bien récupéré a un moment mais lors du changement de langue, il sont pas recharge contrairement au fichier default.po
function _setLanguage()
public function _setLanguage() {
//if the cookie was previously set, and Config.language has not been set
//write the Config.language with the value from the Cookie
if ($this->Cookie->read('lang') && !$this->Session->check('Config.language')) {
$this->Session->write('Config.language', $this->Cookie->read('lang'));
Configure::write('Config.language', $this->Session->read('Config.language'));
}
//if the user clicked the language URL
else if (isset($this->params'language']) && ($this->params'language'] != $this->Session->read('Config.language'))){
//then update the value in Session and the one in Cookie
$this->Session->write('Config.language', $this->params'language']);
$this->Cookie->write('lang', $this->params'language'], false, ZRT_FO_COOKIE.' days');
Configure::write('Config.language', $this->params'language']);
}
}
Changement de langue
echo $this->Html->link('change',array('language'=>$lang'Lang']'iso']),array('escape'=>false));
bootstrap.php
$browserLangs = explode(',',$_SERVER'HTTP_ACCEPT_LANGUAGE']);
$find = 'eng';
$browserLang=$browserLangs[0] ;
$lang = substr($browserLang,0,2);
switch($lang){
case 'fr':$find = 'fra';break;
case 'en':$find = 'eng';break;
case 'es':$find = 'spa';break;
case 'pt':$find = 'por';break;
case 'it':$find = 'ita';break;
case 'de':$find = 'deu';break;
}
Configure::write('Config.language', $find);
Si quelqu'un a une idée.
J'ai pense à tout mettre dans les fichier default.po mais je ne trouve pas cela très propre ...
Si je fais
echo __d('routes', 'texte_a_traduire');
Dans une vue ou dans un controller c'est ok, par contre la même chose dans le fichier Config/routes.php ce n'est pas traduit.
C'est dans le fichier Config/routes.php lui même que la bonne langue n'est pas récupérée.
J'ai compris je pense d'ou viens le problème.
C'est que le code suivant se trouve dans AppController qui s'exécute APRES la lecture du fichier Config/routes.php
Configure::write('Config.language', $this->Session->read('Config.language'));
Dans mon lien de changement de langue, je changeais la langue ainsi
echo $this->Html->link('change',array('language'=>$lang'Lang']'iso']),array('escape'=>false));
lors du rechargement la valeur Configure::read('Config.language') était changé dans AppController et non pas avant. Ce qui est trop tard pour le fichier Config/routes.php
Pour le changement de langue j'ai donc créé une fonction spécifique plutot qu'un simple changement de langue dans l'url
public function change($newlang){
$this->Session->write('Config.language', $newlang);
Configure::write('Config.language', $newlang); // sert à récupérer la bonne langue des la lecture du router et non plus seulement dans AppController
//return $this->redirect($url);
}
Maintenant je récupère la bonne langue au niveau du router
App::uses('CakeSession', 'Model/Datasource');
Configure::write('Config.language',CakeSession::read('Config.language'));
Il me reste juste maintenant à reconstruire l'url de la page courante ..
Merci
Bonsoir.
Pour commencer, je ne vois pas à quel moment dans le code que tu nous montre, à quel moment tu fais appel au fichier de traduction routes.
Car pour afficher la traduction d'une chaîne textuelle, il faut le préciser.
Par exemple, concernant la traduction pour les messages de validation dans les modèles, il faut préciser dans le modèle concerné :
public $validation = 'nom_de_fichier_de_traduction';
Au niveau des vues, il faut par exemple :
echo __d('nom_de_fichier_de_traduction', 'texte_a_traduire');