Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
j'aimerai réaliser la traduction des labels de mon formulaire en utilisant l'outils Poedit.
J'arrive très bien à traduire les vues de mon projet de la manière suivante :
Dans le fichier module.config.php de mon module "Front" :
'service_manager' => array( 'factories' => array( 'MvcTranslator' => 'Zend\I18n\Translator\TranslatorServiceFactory', ), 'aliases' => array( 'translator' => 'MvcTranslator', ), ), 'translator' => array( 'locale' => 'fr_FR', 'translation_file_patterns' => array( array( 'type' => 'gettext', 'base_dir' => realpath(__DIR__ . '/../language'), 'pattern' => '%s.mo', 'text_domain' => 'front', ), ), ),
dans mon fichier Module.php
public function onBootstrap(MvcEvent $e) { $e->getApplication()->getServiceManager()->get('translator'); $eventManager = $e->getApplication()->getEventManager(); $moduleRouteListener = new ModuleRouteListener(); $moduleRouteListener->attach($eventManager); }
et enfin pour utiliser la traduction dans ma vue index.phtml :
echo $this->translate('front_index_titre','front');
Ceci marche nickel.
Seulement lorsque j'essaye un $this->translate dans mon formulaire ContactForm, cela me génère une erreur.
ContactForm.php :
<?php namespace Front\Form; use Zend\Form\Element; use Zend\Form\Form; class ContactForm extends Form { public function __construct($name = null) { parent::__construct('contact'); // On définit la méthode d'envoie du formulaire en POST $this->setAttribute('method', 'post'); $this->add(array( 'name' => 'nom', 'options' => array( 'label' => $this->translate('front_contact_form_nom', 'front') ), 'attributes' => array( 'class' => 'input', 'type' => 'text', 'required' => true, ), )); } }
Merci de votre aide !
Hors ligne
je n'utilise pas les translators donc je vais avoir du mal, mais je peu essayer
Quelle est l'erreur générée lorsque tu utilise ton translator dans ton formulaire?
dans ton module.php tu appel ton translator:
$e->getApplication()->getServiceManager()->get('translator'); ...
ne faut-il pas faire la même chose dans ton Form?
sinon tu peu créer un tableau des labels dans ton controlleurs, puis le passer en paramètre de ton formulaire quand tu le créé :
$tab_lang = array( 'nom' => $this->translate('front_contact_form_nom', 'front') , ....) $contactForm = new ContactForm($tab_lang);
avec la création de ton formulaire :
public function __construct($lang, $name = null) { ....
c'est moins propre, mais pour l'instant j'ai pas mieux
Hors ligne
non ce qu'il y a dans le bootstrap, je ne peux pas l'ajouter dans mon formulaire.
Sinon voici l'erreur que j'avais en mettant le translate dans mon formulaire :
Fatal error: Call to undefined method Front\Form\ContactForm::translate() in
T'as seconde solution devrait certainement marcher, mais c'est assez lourd comme méthode. Je ne préfere pas l'implémenter, mais plutôt trouver une meilleur solution.
Hors ligne
agree!
en fouillant un petit peu, j'ai vu que certaines personnes utilisaient la fonction onBootstrap différement:
#Application\Module.php public function onBootstrap(MvcEvent $e) { $translator = $e->getApplication()->getServiceManager()->get('translator'); ... AbstractValidator::setDefaultTranslator($translator); }
Je sais pas si ça te changera la donne, mais on sais jamais ^^
Sinon j'ai vu quelque chose d'un peu indélicat mais qui pourrait marcher :
A la place de translate il est possible d'utiliser: _('ma trade').
La démarche est d'ajouter la fonction dans ton index.php:
function _($str) { return $str; }
puis dans ton formulaire:
'label' => _('ton label'),
A prendre avec des pincettes cela dit.
Hors ligne
La première méthode ne fonctionne pas.
La seconde m'affiche bien ce qu'il y a dans 'label' => _('ton label'),
Mais lorsque je donne une traduction de "ton label" à Poedit, la traduction n'a pas lieu.
Car moi j'utilise un domaine de traduction (domaine = "front").
Il me faut une traduction du type ('chaine_a_traduire", "domaine").
Donc cette méthode ne correspond pas à mon cas
Hors ligne
roohhh.. t'es compliqué toi.. (^_^)
Ce bout de code à plus de chance de marcher je pense:
if (null !== ($translator = $this->getTranslator())) { $label = $translator->translate('ta_trad', 'ton_domaine') }
Dernière modification par flobrflo (03-03-2014 16:19:16)
Hors ligne
Résolution du problème pour ceux qui sont dans la même config :
ContactForm.php
<?php namespace Front\Form; use Zend\Form\Element; use Zend\Form\Form; use Zend\Captcha; use Zend\I18n\Translator\TranslatorAwareInterface; use Zend\I18n\Translator\Translator; class ContactForm extends Form implements TranslatorAwareInterface { private $_translator; private $_textDomain = 'front'; private $_translator_enabled = true; public function initialize() { // On définit la méthode d'envoie du formulaire en POST $this->setAttribute('method', 'post'); $this->add(array( 'name' => 'nom', 'options' => array( 'label' => $this->translate('front_contact_form_nom', 'front'), ), 'attributes' => array( 'class' => 'input', 'type' => 'text', 'required' => true, ), )); $this->add(array( 'type' => 'Zend\Form\Element\Captcha', 'name' => 'captcha', 'options' => array( 'label' => 'S\'il vous plait entrez le texte suivant', 'captcha' => array( 'class' => 'figlet', 'wordLen' => 6, 'timeout' => 300, ), ), 'attributes' => array( 'class' => 'input', 'required' => true, ), )); $this->add( array( 'name' => 'csrf', 'type' => 'Csrf', 'options' => array( 'csrf_options' => array( 'timeout' => 600 ) ) ) ); $this->add(array( 'name' => 'submit', // Nom du champ 'type' => 'Submit', // Type du champ 'attributes' => array( // On va définir quelques attributs 'value' => 'Envoyer', // comme la valeur 'id' => 'submit', // et l'id ), )); } public function translate($k) { if($this->_translator && $this->_translator_enabled) { return $this->_translator->translate($k, $this->_textDomain); } return $k . '(Non traduit)'; } public function setTranslator(Translator $translator = null, $textDomain = null) { if($translator) { $this->_translator = $translator; $this->_translator_enabled = true; } if($textDomain) { $this->_textDomain = $textDomain; } } public function getTranslator() { return $this->_translator; } public function hasTranslator() { return $this->_translator !== null; } public function setTranslatorEnabled($enabled = true) { $this->_translator_enabled = $enabled; } public function isTranslatorEnabled() { return $this->_translator_enabled; } public function setTranslatorTextDomain($textDomain = 'default') { $this->_textDomain = $textDomain; } public function getTranslatorTextDomain() { return $this->_textDomain; } }
Module.php :
public function getServiceConfig() { return array( 'factories' => array( 'Front\Form\ContactForm' => function($sm) { $result = new ContactForm; $result->setTranslator($sm->get('translator'),'front'); $result->initialize(); return $result; }, ), ); }
IndexController.php :
class IndexController extends AbstractActionController { private $_frontForm; private $_frontMailSender; private $_translator; private function _getFrontForm() { if(!$this->_frontForm) { $sm = $this->getServiceLocator(); $this->_frontForm = $sm->get('Front\Form\ContactForm'); } return $this->_frontForm; } public function contactAction() { $formContact = $this->_getFrontForm(); [...] } }
Il y a la possibilité de rendre tout ceci plus générique, en mettant les méthodes de translate($k) à getTranslatorTextDomain() dans une classe "AbstractForm" (attention ne pas oublié de mettre la classe en Abstract).
Ensuite vos formulaires n'ont plus qu'a étendre cette classe :
class ContactForm extends AbstractForm
Hors ligne
Salut, tu n'as pas besoin de mettre la fonction initialize, tu peux le faire directement dans la fonction init() comme préconisé et en utilisant la fabrique il va automatiquement injecter le translator et appeler la fonction init() !
Hors ligne
ah oui bien vue, merci
Hors ligne