Rechercher dans ce blog

Chargement...

mercredi 18 novembre 2009

Symfony : changer de langue manuellement avec un menu déroulant

Autoriser l'internationalisation
i18n doit être autorisé pour notre application Symfony et les Helpers adéquats activés.
On modifie pour cela /apps/frontend/config/settings.yml :

all:
  .settings:
    i18n: on
    standard_helpers: [Partial, Cache, I18N]

Installer le plugin sfFormExtraPlugin :
php symfony plugin:install sfFormExtraPlugin
php symfony cc

nota : on l'installe également sur le serveur distant pour éviter un transfert long des classes ajoutées.
nota 2 : il faut que PEAR soit installé pour que plugin:install fonctionne.
 

Créer le composant language
Le composant est une sorte de template partiel.

On génère d'abord un module "language"
php symfony generate:module frontend language

Cette commande ne génère pas de fichier composants. Créer manuellement ce fichier "components.class.php" dans le répertoire "actions" généré. On crée donc une Classe de Composants :

class languageComponents extends sfComponents
{
    public function executeLanguage(sfWebRequest $request)
    {
        $this->form = new sfFormLanguage(
            $this->getUser(),
            # poss. 1 : écrire les langues dans ce fichier
            #array('languages'=> array('en', 'fr','de','it'))
            # poss. 2 : centraliser les langues dans le fichier de config  /apps/config/app.yml
            array('languages'=> array_keys(sfConfig::get('app_langues_interface',array())))
        );
    }
}

On choisit ici de centraliser les langues. Le fichier app.yml est écrit ainsi :

all:
  # langues proposées sur l'interface web
  langues:
    interface:
      en: en
      fr: fr
      #de: de
     #it: it

 On inclut le composant créé dans le template général :  /apps/frontend/templates/layout.php

<?php include_component('language','language') ?>
En premier argument : le nom du module où se trouve le composant.
En second composant ; l'action à appeler dans la classe des composants.
Troisième paramètres facultatif : hash de couples variable/valeur nécessaires au bon fonctionnement du composant..

A ce stade :
- Le Composant "language" instancie la Classe sfFormLanguage - avec ses paramètres - puis transmet l'objet $form à son template
Il faut donc :
- créer le template correspondant : /apps/frontend/modules/language/templates/_language.php

<form action="<?php echo url_for('@change_language') ?>">
    <?php echo $form ?>
    <input type="submit" value="ok">
</form>
- créer la nouvelle route dans /apps/frontend/config/routing.yml :

change_language:
  url: /change_language
  param: { module: language, action: changeLanguage }

Cette nouvelle route dirige vers une action (ChangeLanguage), on crée donc cette action dans /apps/frontend/modules/language/actions/actions.class.php :

 public function executeChangeLanguage(sfWebRequest $request)
 {
     $form = new sfFormLanguage(
        $this->getUser(),
        array('languages'=> array_keys(sfConfig::get('app_langues_interface',array())))
        );
    $form->process($request);
   
    return $this->redirect('@localized_homepage');

 }
Ce fichier ressemble étrangement à notre Classe de Composants, à la différence que le form validé redirige vers une page (= route '@localized_homepage' à créer dans le fichier 'routing'.) tandis que la Classe de Composants affichait un template.

La route '@localized_homepage' :

localized_homepage:
  url: /:sf_culture/
  param : { module: homepage, action : index }
  requirements:
    sf_culture: (?:fr|en)

On s'interessera , dans un autre post, à modifier ce changement de language :
- utilisation de petits drapeaux (vs menu déroulant)
- redirection vers la page quittée (vs homepage localisée

0 commentaires: