Bonsoir,

J'ai regardé plusieurs vidéos sur la façon de faire et j'y suis presque arrivé. Je voudrais utiliser la librairie gettext (php-gettext-1.0.11) dans mon site basé sur le tuto "Création d'un site de A à Z"

Donc j'ai fait un require_once de gettext.inc à la première ligne de mon fichier include.php (./core)

En suite dans le construc de controller.php (./core) j'ai inscrit ceci :

public $language = '';
        public $available_languages = array('fr_FR','en_US');
        function __construct($request = null){
            $supported_locales = $this->available_languages ;
            $encoding = 'UTF-8';
            $locale = (isset($_SESSION'lang']))? $_SESSION'lang'] : DEFAULT_LOCALE;
            $this->language = $locale;
            T_setlocale(LC_MESSAGES, $locale);
            $domain = $locale;
            bindtextdomain($domain, LOCALE_DIR);
            if(function_exists('bind_textdomain_codeset')) 
            bind_textdomain_codeset($domain, $encoding);
            textdomain($domain);
            $this->Session = new Session();
            $this->Form = new Form($this);
            if($request){
                $this->request = $request;
                require ROOT.DS.'config'.DS.'hook.php';
            }
        }

J'ai bien créé mes fichier .po et .mo dans le dossier (./webroot/locale/en_US/LC_MESSAGES/*.*) avec POEDIT

Si je fait un test de traduction dans une vue (./view/test.php) par exemple :

<?php echo _("je fais un test"); ?>

ce test fonctionne correctement et m'affiche bien la correspondance dans la langue voulue.

La ou je bloque c'est pour utiliser la traduction dans le controller, il me renvoie toujours la langue source comme aucun fichier de traduction n'était présent.

Je suis pas certain de m'y prendre correctement et c'est pourquoi je m'adresse à vous.

D'avance merci.

6 réponses


LesTutossUE4
Réponse acceptée

Tu as essayer d'initialisé ton programme dans la fonction voulu du controller plutôt que dans ton __construct ?

Msappdem
Auteur

Tout simplement merci !

J'ai modifié comme ceci :

public $language = '';
    public $available_languages = array('fr_FR','en_US');

    function __construct($request = null){
        $this->Session = new Session();
        $this->Form = new Form($this);
        if($request){
            $this->request = $request;
            require ROOT.DS.'config'.DS.'hook.php';
        }
    }

    public function translation(){
        $supported_locales = $this->available_languages ;
        $encoding = 'UTF-8';
        $locale = (isset($_SESSION'lang']))? $_SESSION'lang'] : DEFAULT_LOCALE;
        $this->language = $locale;
        T_setlocale(LC_MESSAGES, $locale);
        $domain = $locale;
        bindtextdomain($domain, LOCALE_DIR);
        if(function_exists('bind_textdomain_codeset'))
        bind_textdomain_codeset($domain, $encoding);
        textdomain($domain);
    }

et dans les actions de mes controller's j'appel : $this->translation(); en début.

Cela semble fonctionner. Je vais voir maintenant pour les modèles ce que je dois faire.

Msappdem
Auteur

Bonsoir,

Je galère avec mes modèles.
Je n'arrive pas à mettre en pratique la traduction pour ma fonction validate (./core/model.php)

Contenu d'un model :

<?php
    class Common extends Model{
        // public $table = 'temp';

        public $validate = array(
            // Adresse Email
            array('check_email' => array(
            'email_format' => array(
                'rule' => '[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})',
                'message' => 'Vérifier le format de l\'adresse email',
                'help' => array('Ex1' => 'xxx@xxx.xx','Ex2' => 'xxx.xxx@xxx.xxx','Max' => '255')
            )))
            );
    }
?>

Comme d'autres j'ai essayé de mettre : 'message' => _("texte")
mais ça me retourne une erreur.

J'ai regardé la doc de cakephp (bien que mon site ne l'utilise pas mais est basé dessus) mais je ne comprend pas comment et quoi modifier pour prendre en compte une traduction éventuelle.

Deuxième chose, j'utilise POEdit pour importer la langue d'origine (reconnue par la fonction _()), mais dans les models comme je ne peux pas utiliser cette fonction, comment faire pour les importer à mon catalogue ?

D'avance merci pour votre aide.

Msappdem
Auteur

je re précise que je n'utilise pas cakephp donc je n'ai pas la fonction behavior qui semble être la solution pour cakephp. J'utilise le tuto mvc de Grafikart.

Msappdem
Auteur

Je pense avoir trouvé la solution pour résoudre ce problème mais maintenant il faut le mettre en œuvre.

Il s'agirait de modifier la fonction validates (./core/Model.php)

public function validates($data){
            $form = $this->Form->controller->request->data->form; // Formulaire envoyé
            $value = $this->Form->controller->request->data; // Valeur d'un champ
            foreach($this->validate as $k => $v){
                if(is_array($v)){
                    foreach($v as $k => $v){
                        if($k == $form){
                            if(is_array($v)){
                                foreach($v as $k => $v){
                                    if(!isset($value->$k)){
                                        return false;
                                    }else{
                                        if($v'rule'] == 'notEmpty'){
                                            if(empty($value->$k)){
                                                return false;
                                            }
                                        }elseif(!preg_match('/^'.$v'rule'].'$/',$value->$k)){
                                            return false;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return true;
        }

et par exemple dans un modèle :

public $validate = array(
            // Adresse Email
            array('email' => array(
            'email' => array(
                'rule' => '[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})',
            )))
            );

donc après soumission du formulaire jusque la je sais savoir si oui ou non ce qui est envoyé correspond bien à ce que j’attends.

Maintenant c'est comment traiter les erreurs, actuellement j'ai fais une nouvelle fonction pour re-controler l'erreur mais cela ne me plait pas car je suis obligé de le faire champ par champ.

Auriez-vous une piste ?

Msappdem
Auteur

J'ai réglé mon problème en passant par la vue.