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') ?>">- créer la nouvelle route dans /apps/frontend/config/routing.yml :
<?php echo $form ?>
<input type="submit" value="ok">
</form>
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)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.
{
$form = new sfFormLanguage(
$this->getUser(),
array('languages'=> array_keys(sfConfig::get('app_langues_interface',array())))
);
$form->process($request);
return $this->redirect('@localized_homepage');
}
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:
Enregistrer un commentaire