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 ».

Catégories : DéveloppementPHP

7 commentaires

chtipepere · 7 octobre 2009 à 10:37

Bonjour,

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

Merci encore, cela fonctionne parfaitement !

Pierre

chtipepere · 7 octobre 2009 à 10:39

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)

@+

Chtipepere · 7 octobre 2009 à 10:39

Bon

    Fabien · 12 octobre 2009 à 09:33

    Effectivement il faut mettre </trans-unit> au lieu de </trans>

Esya · 31 décembre 2009 à 15:36

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

Adrianna · 26 juin 2010 à 15:37

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

    Fabien · 13 septembre 2010 à 22:32

    J’ai proposé un patch pour corriger ces problèmes de traduction depuis.
    Ce que je décris dans mon billet n’est donc plus nécessaire avec symfony 1.3/1.4 ;)

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

Articles similaires

Développement

Installer et utiliser NodeJS et le module Less sur Mac OS X

Connaissez-vous LESS ? Il s’agit d’une sur-couche de CSS apportant son lot d’améliorations pour faciliter l’écriture de feuille de styles. LESS vous permettra par exemple de définir des fonctions ou des variables que vous pourrez Lire la suite…

Développement

Installer Apache 2, MySQL 5 et PHP 5.3 sur Mac OS 10.7 Lion avec MacPort

Bien que Apache et PHP soient pré-installés sur Mac OS X, j’évite depuis plusieurs années de les utiliser. Au départ pour un problème de compilation d’une extension PHP, aujourd’hui pour ne plus être dépendant d’Apple Lire la suite…

Développement

Utiliser l’extension Taggable de Doctrine avec Symfony 1.3/1.4

Jusqu’à symfony 1.2, si vous vouliez ajouter facilement de nouvelles fonctionnalités au framework PHP5 il fallait se diriger vers son importante base de plugins. Avec symfony 1.3 et 1.4, bien sûr vous pouvez toujours compter Lire la suite…