Symfony ne proposant pas de système pour la gestion du langage selon la culture utilisée, j’ai cherché une solution viable. Je m’explique. Dans mon cas, un utilisateur reçoit une culture « fr_CH » pour permettre un formatage correct sur les nombres. Par contre, dans les urls du site, je désire y mettre uniquement la première partie « fr ». Je vous propose dans ce post de vous livrer ma solution. J’ai pour cela utilisé le système d’Event, qui au passage est vraiment un truc super. Je vous conseille vraiment de découvrir cette petite merveille.
Pour débuter, j’ai rajouté ces quelques lignes dans mon fichier myUser.class.php se trouvant dans le dossier lib de l’application:
class myUser extends sfGuardSecurityUser { public function initialize(sfEventDispatcher $dispatcher, sfStorage $storage, $options = array()) { $dispatcher->connect('user.change_culture', array($this, 'listenToChangeCultureEvent')); parent::initialize($dispatcher, $storage, $options); } public function listenToChangeCultureEvent(sfEvent $event) { $result = explode('_', $this->culture); $this->setLanguage($result[0]); } public function setLanguage($language) { $this->language = $language; } public function getLanguage() { return $this->language; } }
Comme vous pouvez le voir dans ce code, je me suis connecté à l’event « user.change_culture ». Avec cette fonction, je vais scinder les deux parties de la culture pour ne garder plus que le terme « fr ».
Je voulais ensuite avoir la possibilité d’accéder au paramètre « sf_language » dans mon fichier de routing. J’ai pour cela surchargé la méthode « listenToChangeCultureEvent » de la classe « sfPatternRouting ». J’ai créé un nouveau fichier nommé « mysfPatternRouting.class.php » dans mon dossier lib (toujours dans mon app) avec le code suivant:
class mysfPatternRouting extends sfPatternRouting { public function listenToChangeCultureEvent(sfEvent $event) { $result = explode('_', $event['culture']); $this->setDefaultParameter('sf_language', $result[0]); parent::listenToChangeCultureEvent($event); } }
Pour charger ma classe routing, j’ai également modifié le fichier factories.yml en activant cette partie.
all: ... routing: class: mysfPatternRouting param: load_configuration: true suffix: . default_module: default ...
J’ai remplacé le contenu du tag class par « mysfPatternRouting » (Valeur par défaut: sfPatternRouting).
Ensuite, il suffit de vider le cache de symfony pour qu’il charge la nouvelle classe
$ ./symfony cc
Dès maintenant, on aura accès au nouveau paramètre « sf_language » dans notre fichier de routing.yml. Voici un exemple
user_index: url: /:sf_language/user param: { module: user, action: index } requirements: - sf_language: (?:fr|en|de)
J’espère que cette solution vous sera utile dans vos prochains développements 😛