Traduire complètement l’admin generator de Symfony

Si vous avez déjà essayé de traduire l’admin generator de Symfony vous avez probablement été confronté au problème : certaines chaînes ne peuvent pas être traduites car elles n’utilisent pas le système d’internationalisation (i18n) du framework. Ces chaînes sont présentes directement dans les widgets dédiés aux formulaires de filtrage. C’est le cas de is empty, yes or no ou encore de from […] to […].

En faisant une recherche rapide sur Internet, vous trouverez quelques solutions mais elles nécessitent de modifier tous les formulaires du projet. Sur un petit projet, 2-3 formulaires, cela peut être acceptable mais avec une soixantaine de formulaires cela peut vite devenir embêtant.

Je vous propose ici une solution/workaround que j’ai développé pour mes besoins afin de traduire ces fameuses chaînes. Elle fonctionne avec Symfony 1.2 et Doctrine 1.1 pour les formulaires actuels et futurs.

  1. Éditer le fichier lib/filter/doctrine/BaseFormFilterDoctrine.class.php
  2. Utiliser maintenant cette classe :

    abstract class BaseFormFilterDoctrine extends sfFormFilterDoctrine
    {
    	protected $booleanFieldChoices = array('' => 'yes or no', 1 => 'yes', 0 => 'no');
    
    	/**
    	 * @see sfForm
    	 */
    	public function __construct($defaults = array(), $options = array(), $CSRFSecret = null)
    	{
    		parent::__construct($defaults, $options, $CSRFSecret);
    		$this->fixI18N();
    	}
    
    	/**
    	 * @see sfForm
    	 */
    	public function setup()
    	{
    	}
    
    	protected function fixI18N()
    	{
    		foreach ($this->widgetSchema->getFields() as $field)
    		{
    			if ($field instanceof sfWidgetFormFilterInput)
    			{
    				$this->fixIsEmpty($field);
    			}
    			elseif ($field instanceof sfWidgetFormChoice
    			and $field->getOption('choices') == $this->booleanFieldChoices)
    			{
    				$field->setOption('choices', array_map(
    					array($this->widgetSchema->getFormFormatter(), 'translate'),
    					$field->getOption('choices')
    				));
    			}
    			elseif ($field instanceof sfWidgetFormFilterDate)
    			{
    				$this->fixIsEmpty($field);
    
    				$field->setOption(
    					'template',
    					$this->widgetSchema->getFormFormatter()->translate(
    						$field->getOption('template')
    					)
    				);
    			}
    		}
    	}
    
    	protected function fixIsEmpty(sfWidgetForm $field)
    	{
    		$field->setOption(
    			'empty_label',
    			$this->widgetSchema->getFormFormatter()->translate(
    				$field->getOption('empty_label')
    			)
    		);
    	}
    }
    
  3. Si vous aviez déjà personnalisé cette classe, n’oubliez de ré-appliquer vos modifications.
  4. Modifier le fichier apps/backend/i18n/fr/messages.xml (où backend est l’applicaton utilisant l’admin generator et messages le catalogue i18n) et ajouter :
          <trans -unit>
            <source>is empty</source>
            <target>est vide</target>
          </trans>
          <trans -unit>
            <source>yes or no</source>
            <target>oui ou non</target>
          </trans>
          <trans -unit>
            <source>yes</source>
            <target>oui</target>
          </trans>
          <trans -unit>
            <source>no</source>
            <target>non</target>
          </trans>
          <trans -unit>
            <source>< ![CDATA[from %from_date%<br />to %to_date%]]></source>
            <target>< ![CDATA[du %from_date%<br />au %to_date%]]></target>
          </trans>
    

    (attention aux espaces ajoutés par wordpress)

A noter cette solution corrige les formulaires de filtrage (filters), il existe également quelques chaînes hardcoded dans les widgets pour les formulaires « classiques ».

7 réponses sur “Traduire complètement l’admin generator de Symfony”

  1. Bonjour,

    Merci pour cet article.
    Attention cependant à la balise de fermeture.
    Il faut utiliser et non .

    Merci encore, cela fonctionne parfaitement !

    Pierre

  2. Re,

    Ah strip_tags quand tu nous tiens…
    Il faut donc corriger la balise fermante en :
    et non
    (et supprimer les espaces en début de balise)

    @+

  3. Bonjour,

    Je ne sais pas si c’est parce que c’est corrigé dans la 1.3, mais personnellement :

    is empty
    est vide

    Dans le message.xml

    Fonctionne très bien chez moi, sans modifier aucun autre fichier

  4. Bonjour,

    Je ne sais pas si c’est parce que c’est corrigé dans la 1.3, mais personnellement :

    is empty
    est vide

    Dans le message.xml

    Fonctionne très bien chez moi, sans modifier aucun autre fichier

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

:D :) :o :eek: :( :lol: :wink: :arrow: :idea: :?: :!: :evil: :p