Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 28-02-2014 15:09:40

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Traduire les labels d'un formulaire (avec PoEdit)

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" :

Code:

    '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

Code:

    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 :

Code:

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 :

Code:

<?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

 

#2 03-03-2014 09:18:10

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: Traduire les labels d'un formulaire (avec PoEdit)

je n'utilise pas les translators donc je vais avoir du mal, mais je peu essayer wink
Quelle est l'erreur générée lorsque tu utilise ton translator dans ton formulaire?

dans ton module.php tu appel ton translator:

Code:

$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éé :

Code:

$tab_lang = array( 'nom' => $this->translate('front_contact_form_nom', 'front') , ....)
$contactForm = new ContactForm($tab_lang);

avec la création de ton formulaire :

Code:

public function __construct($lang, $name = null)
{
....

c'est moins propre, mais pour l'instant j'ai pas mieux smile

Hors ligne

 

#3 03-03-2014 15:19:57

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: Traduire les labels d'un formulaire (avec PoEdit)

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 :

Code:

 
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

 

#4 03-03-2014 16:01:14

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: Traduire les labels d'un formulaire (avec PoEdit)

agree! wink

en fouillant un petit peu, j'ai vu que certaines personnes utilisaient la fonction onBootstrap différement:

Code:

#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:

Code:

function _($str) 
{ 
    return $str; 
}

puis dans ton formulaire:

Code:

'label' => _('ton label'),

A prendre avec des pincettes cela dit.

Hors ligne

 

#5 03-03-2014 16:11:10

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: Traduire les labels d'un formulaire (avec PoEdit)

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

 

#6 03-03-2014 16:18:39

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: Traduire les labels d'un formulaire (avec PoEdit)

roohhh.. t'es compliqué toi.. (^_^)

Ce bout de code à plus de chance de marcher je pense:

Code:

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

 

#7 03-03-2014 16:38:02

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: Traduire les labels d'un formulaire (avec PoEdit)

Résolution du problème pour ceux qui sont dans la même config :

ContactForm.php

Code:

<?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 :

Code:

    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 :

Code:

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 :

Code:

class ContactForm extends AbstractForm

Hors ligne

 

#8 04-03-2014 09:07:56

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Traduire les labels d'un formulaire (avec PoEdit)

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() wink !

Hors ligne

 

#9 04-03-2014 12:39:38

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: Traduire les labels d'un formulaire (avec PoEdit)

ah oui bien vue, merci smile

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