Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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 :
<?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)
Hors ligne
Merci Philippe pour le formatage
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
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![]()
>
> 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![]()
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)
Hors ligne
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) :
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 :
// 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
Ta solution me semble être la meilleure
Je lui en parle à l'instant dans le thread...
Hors ligne
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)
Hors ligne
Salut,
A l'occasion, je serai ravi de voir ton test avec le translator
A+
Hors ligne
Dernière modification par philippe (04-02-2008 09:30:43)
lol ... ahem
Sinon ceone, tu veux voir le test ? Ok, mais quel test du translator, peux-tu préciser ? (Merci)
Hors ligne
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
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 :
<?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
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
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
Hors ligne
Merci Philippe pour cette bonne nouvelle
Hors ligne
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
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)
Hors ligne
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
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
Quelqu'un a par hasard un fichier csv avec toutes les traductions françaises des phrases de Zend_Validate ?
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 :
<?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
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+
Hors ligne
Pages: 1