Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 04-02-2008 02:36:23

dividy
Membre
Date d'inscription: 21-01-2008
Messages: 21

Zend_Form + Traduction Error Messages : Bout de code

Voici un petit bout de code que j'utilise dans mon controller form/register pour traduire les messages d'erreurs, c'est du vite fait :

Code:

<?php

                $t=$form->getElements();
                foreach ($t as $element) {
                    $validateurs=$element->getValidators();
                    $validateurs_noms=array_keys($validateurs);
                    for ($k=0;$k<count($validateurs_noms);$k++){
            
                        if ($validateurs_noms[$k]=='Zend_Validate_StringLength'){
                            $valobj=$element->getValidator($validateurs_noms[$k]);
                            $valobj->setMessages( array(
                                                    Zend_Validate_StringLength::TOO_SHORT => 'Les données saisies sont trop courtes',
                                                    Zend_Validate_StringLength::TOO_LONG  => 'Les données saisies sont trop trop longues'
                            ));            
                        }

                        if ($validateurs_noms[$k]=='Zend_Validate_Alnum'){
                            $valobj=$element->getValidator($validateurs_noms[$k]);
                            $valobj->setMessages( array(
                                                    Zend_Validate_Alnum::STRING_EMPTY  => 'Ce champ est requis',
                                                    Zend_Validate_Alnum::NOT_ALNUM     => 'Uniquement des chiffres et des lettres'
                            ));            
                        }

                                                if ($validateurs_noms[$k]=='Zend_Validate_Regex'){
                            $valobj=$element->getValidator($validateurs_noms[$k]);
                            $valobj->setMessages( array(
                                                    Zend_Validate_Regex::NOT_MATCH  => 'Les données ne correspondent pas au format demandé'
                            ));            
                        }

                                                if ($validateurs_noms[$k]=='Zend_Validate_InArray'){
                            $valobj=$element->getValidator($validateurs_noms[$k]);
                            $valobj->setMessages( array(
                                                    Zend_Validate_InArray::NOT_IN_ARRAY => 'Mauvais choix, veuillez recommencer'
                            ));            
                        }

                                                if ($validateurs_noms[$k]=='Zend_Validate_NotEmpty'){
                            $valobj=$element->getValidator($validateurs_noms[$k]);
                            $valobj->setMessages( array(
                                                    Zend_Validate_NotEmpty::IS_EMPTY => 'Le champ est vide, veuillez le remplir'
                            ));            
                        }

                                                if ($validateurs_noms[$k]=='Zend_Validate_EmailAddress'){
                            $valobj=$element->getValidator($validateurs_noms[$k]);
                            $valobj->setMessages( array(
                                                    Zend_Validate_EmailAddress::INVALID  => 'Adresse e-mail invalide, veuillez la vérifier',
                                                    Zend_Validate_EmailAddress::INVALID_HOSTNAME   => 'Adresse e-mail invalide, veuillez la vérifier',
                                                    Zend_Validate_EmailAddress::INVALID_LOCAL_PART    => 'Adresse e-mail invalide, veuillez la vérifier',
                                                    Zend_Validate_EmailAddress::INVALID_MX_RECORD     => 'Adresse e-mail invalide, veuillez la vérifier'
                            ));            
                        }


                    }
                }
?>

Edit Admin : mise en forme avec code et /code

Dernière modification par philippe (04-02-2008 09:30:43)


In Zend, I Trust

Hors ligne

 

#2 05-02-2008 11:28:24

dividy
Membre
Date d'inscription: 21-01-2008
Messages: 21

Re: Zend_Form + Traduction Error Messages : Bout de code

Merci Philippe pour le formatage smile

J'ai eu des news concernant le passage du translator au form pour la traduction de ses elements :

http://www.nabble.com/Zend_Form-and-val … 16154.html


Résumé :

As seen on Zend Framework Community smile a écrit:

-- Dividy <dividy@...> wrote
(on Monday, 04 February 2008, 09:42 AM -0800):
> Thanks for all your good advices. I tried everything you proposed some days
> ago and it didn't give any good results. That's why i have come with this
> solution.
>
> But please, if you could give me an example of line you'd put in a csv file,
> that would be great smile
>
> e.g. I tried using "isEmpty;The string is empty" in my en.csv file and then
> put the translation in my fr.csv file, but it didn't work smile

You had it right... but there was a problem in trunk... while validation
in the *elements* was getting properly translated, the form object was
not injecting the translator into the elements... oops!

Corrected now in svn trunk.


> Thanks in advance for your precious time.

And thank you for the issue reporting!

Dernière modification par dividy (05-02-2008 11:31:49)


In Zend, I Trust

Hors ligne

 

#3 05-02-2008 12:10:50

ALkyD
Membre
Lieu: Limoges
Date d'inscription: 11-07-2007
Messages: 69
Site web

Re: Zend_Form + Traduction Error Messages : Bout de code

Perso, j'ai fait une solution maison :
J'ai une sous-classe Form qui hérite de Zend_Form et qui a une méthode setValidatorMessages(array $messages) :

Code:

public function setValidatorMessages(array $messages)
    {
        $elements = $this->getElements();
        $i = 0;
        
        foreach ($elements as $el)
        {
            $validators = $el->getValidators();
            
            foreach ($validators as $v)
            {
                if (is_array($messages[$i]))
                    $v->setMessages($messages[$i]);
                else
                    $v->setMessage($messages[$i]);
                    
                $i++;
            }
        }
    }

Puis dans le formulaire en question :

Code:

// Construction du formulaire        
$login = new Zend_Form_Element_Text('txt_Login');
$login->setLabel('Pseudo :')
         ->addValidator(new Zend_Validate_NotEmpty());             // Validateur n°1
              
$pass = new Zend_Form_Element_Password('txt_Pass');
$pass->setLabel('Mot de passe :')
         ->addValidator(new Zend_Validate_NotEmpty())              // Validateur n°2
         ->addValidator(new Zend_Validate_StringLength(4, 8));   // Validateur n°3

$submit = new Zend_Form_Element_Submit('bt_Submit');
$submit->setValue('Se connecter');

$form = new Form();
$form->setMethod('post')
         ->addElement($login)
         ->addElement($pass)
         ->addElement($submit);
$form->setValidatorMessages(array(
          'Le pseudo est obligatoire.',         // Message pour le validateur n°1
          'Le mot de passe est obligatoire.' // Message pour le validateur n°2
          array(                                       // Messages pour le validateur n°3
               'Le mot de passe est trop court', 
               'Le mot de passe est trop long'
          )
));

Par rapport à Zend_Translate, je peux personnaliser chaque message d'erreur de chaque élément, et non de chaque type d'erreur.

Dernière modification par ALkyD (05-02-2008 12:12:06)

Hors ligne

 

#4 05-02-2008 13:31:52

dividy
Membre
Date d'inscription: 21-01-2008
Messages: 21

Re: Zend_Form + Traduction Error Messages : Bout de code

Ta solution me semble être la meilleure smile

Je lui en parle à l'instant dans le thread...


In Zend, I Trust

Hors ligne

 

#5 05-02-2008 14:25:20

dividy
Membre
Date d'inscription: 21-01-2008
Messages: 21

Re: Zend_Form + Traduction Error Messages : Bout de code

J'ai testé les fichiers du trunk, ça marche nickel en passant juste le translator au form. Sinon, j'attends toujours pour la réponse de Zend au sujet des messages d'erreur différents par champs.

Dernière modification par dividy (05-02-2008 14:27:40)


In Zend, I Trust

Hors ligne

 

#6 05-02-2008 16:04:08

ceone
Membre
Date d'inscription: 18-12-2007
Messages: 26

Re: Zend_Form + Traduction Error Messages : Bout de code

Salut,

A l'occasion, je serai ravi de voir ton test avec le translator wink

A+

Hors ligne

 

#7 05-02-2008 19:49:20

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Zend_Form + Traduction Error Messages : Bout de code

Merci Philippe pour le formatage

Je crois bien que c'était moi :p

Hors ligne

 

#8 05-02-2008 21:59:37

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Zend_Form + Traduction Error Messages : Bout de code

Perdu! cette fois c'était moi smile


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#9 05-02-2008 22:25:06

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Zend_Form + Traduction Error Messages : Bout de code

Bien vrai car moi je met les []
Masi bon en ce moment c'est souvent :\

Hors ligne

 

#10 07-02-2008 13:33:11

dividy
Membre
Date d'inscription: 21-01-2008
Messages: 21

Re: Zend_Form + Traduction Error Messages : Bout de code

Dernière modification par philippe (04-02-2008 09:30:43)

lol ... ahem smile



Sinon ceone, tu veux voir le test ? Ok, mais quel test du translator, peux-tu préciser ? (Merci)


In Zend, I Trust

Hors ligne

 

#11 07-02-2008 16:13:43

ceone
Membre
Date d'inscription: 18-12-2007
Messages: 26

Re: Zend_Form + Traduction Error Messages : Bout de code

Salut,

J'aimerai voir comment tu as utilisé le translator pour modifier les messages des validators, est ce que ça répond à ta question ?

Merci a+

Hors ligne

 

#12 07-02-2008 21:52:21

ceone
Membre
Date d'inscription: 18-12-2007
Messages: 26

Re: Zend_Form + Traduction Error Messages : Bout de code

Re salut,

J'ai trouvé un moyen d'utiliser le translator adapter pour traduire les messages d'erreur du validator de Zend_Form. Houla je rivalise avec Jean Claude Vandame !!!

En gros voici la démarche :

Code:

<?php
// créer un tableau de translation
// les clés sont des clés utilisées par les différents validators (il y en a d'autres)
$translations = array(
    'stringEmpty' => 'Ce champ est requis',
    'stringLengthTooShort' => "Les données saisies sont trop courtes",
    'stringLengthTooLong' => "Les données saisies sont trop longues",
    'notAlnum' => 'Uniquement des chiffres et des lettres',
    'emailAddressInvalid' => 'Adresse e-mail invalide, veuillez la vérifier',
}

// instancier un translator et le passer son adapter à notre objet Zend_Form
require_once 'Zend/Translate.php';
$translate = new Zend_Translate('array', $translations, 'fr');

$form->setTranslator($translate->getAdapter());

Voilà pour l'idée maintenant il reste le problème d'inclusion de variables dans les traductions, je n'ai pas trouvé comment faire je n'ai pas même regardé si cela est possible. Si un jour vous avez plus d'infos n'hésitez pas à poster.


A+

Hors ligne

 

#13 07-02-2008 23:53:53

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Zend_Form + Traduction Error Messages : Bout de code

Salut,

Juste pour dire qu'un message est arrivé dans la mailing list de Zend cet après midi concernant la traduction des messages.
En gros ils ont ajouté une fonctionnalité dans la version de développement qui permet d'ajouter un tranlator dans Zend_Form. Elle devrait arriver dès le ZF 1.5 (sachant que pour l'instant on est en 1.5 Previous Release et ça n'intègre pas encore ce développement).

Ci joint une copie du mail

Code:

I've seen a number of requests for translatable error messages with
Zend_Validate and Zend_Filter_Input, and it was a major goal for
Zend_Form. While the latter's support is mostly complete, one major
issue was allowing injecting validator values into the messages.

I discussed this with Darby and Thomas, and I've now got a solution
committed to subversion.

Zend_Validate_Abstract now has the following methods:

  * setTranslator(Zend_Translate $translator = null)
  * getTranslator()
  * static setDefaultTranslator(Zend_Translate $translator = null)
  * static getDefaultTranslator()

Additionally, internally _createMessage() now checks to see if a
translator is registered (either globally or locally); if so, and the
translator has a translation for the given error code, it will translate
the message *and* do variable substitution.

How does it work?

Let's say you use the 'StringLength' validator. You could then define 
custom translations for the two error conditions:

    stringLengthTooShort = "The string %value% must be longer than %min% characters"
    stringLengthTooLong  = "The string %value% must be shorter than %max% characters"

Create your translation object:

    $translator = new Zend_Translate(...);

Then, in the easiest method, set your validator globally:

    Zend_Validate_Abstract::setDefaultTranslator($translator);

And, when you validate:

    // in this case, using Zend_Filter_Input:
    if (!$input->isValid()) {
        // messages are translated!
        $messages = $input->getMessages();
    }

You can also attach a translator to a single validation class instance:

    $stringLength->setTranslator($translator);

though that usage is less useful.

Only messages that have message keys in your translations will be
translated; otherwise, the original message string (or any that you've
set) from the validation object will be used.

I will be retro-fitting Zend_Form to utilize this functionality shortly.
In the meantime, if you use Zend_Validate or Zend_Filter_Input, this
works out-of-the-box for those of you tracking current svn.

Please test!

-- Matthew Weier O'Phinney PHP Developer

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#14 08-02-2008 00:02:43

ceone
Membre
Date d'inscription: 18-12-2007
Messages: 26

Re: Zend_Form + Traduction Error Messages : Bout de code

Merci Philippe pour cette bonne nouvelle wink

Hors ligne

 

#15 08-02-2008 18:00:22

dividy
Membre
Date d'inscription: 21-01-2008
Messages: 21

Re: Zend_Form + Traduction Error Messages : Bout de code

LOL ... Je vois que vous n'avez pas été lire le topic sur le forum de Zend dont j'ai donné l'url dans ce topic smile
Ils expliquent qu'en fait il y avait un bug, ce bug est corrigé, il faut prendre les fichiers dans le trunk et ensuite il suffit de passer le translator au form et c'est automatique.. (si les lignes de traductions existent)

Zend a écrit:

You had it right... but there was a problem in trunk... while validation
in the *elements* was getting properly translated, the form object was
not injecting the translator into the elements... oops!

Corrected now in svn trunk.

Dernière modification par dividy (08-02-2008 18:03:01)


In Zend, I Trust

Hors ligne

 

#16 12-02-2008 15:15:21

ALkyD
Membre
Lieu: Limoges
Date d'inscription: 11-07-2007
Messages: 69
Site web

Re: Zend_Form + Traduction Error Messages : Bout de code

ceone a écrit:

Voilà pour l'idée maintenant il reste le problème d'inclusion de variables dans les traductions, je n'ai pas trouvé comment faire je n'ai pas même regardé si cela est possible. Si un jour vous avez plus d'infos n'hésitez pas à poster.

Tu as réussi / quelqu'un a réussi à parser les variables dans les traductions depuis ?

Hors ligne

 

#17 12-02-2008 18:17:08

ceone
Membre
Date d'inscription: 18-12-2007
Messages: 26

Re: Zend_Form + Traduction Error Messages : Bout de code

Salut ALkyD,

Non je n'ai pas réessayé depuis, je vais récupérer une version plus récente peut être que ça sera possible avec ?

A+

Hors ligne

 

#18 29-04-2009 20:35:58

citronbleu-v
Membre
Lieu: Béziers ou Arles
Date d'inscription: 03-02-2009
Messages: 79
Site web

Re: Zend_Form + Traduction Error Messages : Bout de code

Quelqu'un a par hasard un fichier csv avec toutes les traductions françaises des phrases de Zend_Validate ? smile

Merci en tout cas pour la solution,

aussi-non avec gettext cette solution n'est pas possible ? à moins peut être de faire un truc du genre :

Code:

<?php
require_once 'Zend/Translate.php';
$translateGettext = new Zend_Translate('gettext', './fichier/source', 'fr');

$translations = array(
    'stringEmpty' => $translateGettext->_('Ce champ est requis'),
    'stringLengthTooShort' => $translateGettext->_("Les données saisies sont trop courtes"),
    'stringLengthTooLong' =>  $translateGettext->_("Les données saisies sont trop longues"),
}

$translate = new Zend_Translate('array', $translations, 'fr');
$form->setTranslator($translate->getAdapter());

Dernière modification par citronbleu-v (29-04-2009 20:37:05)

Hors ligne

 

#19 30-04-2009 09:31:34

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: Zend_Form + Traduction Error Messages : Bout de code

Hello,

Il y a actuellement une proposal concernant la traduction de tous les messages générés par Zend Framework (message des exceptions, des validateurs).

Je ne peux pas donner de lien car le site est down mais c'est dans http://framework.zend.com/wiki/display/ZFPROP/Home

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages