I18n du routing pour les modules d’admin Symfony
L'internationalisation d'une application (i18n) consiste à servir les pages dans la langue de l'utilisateur. Par défaut, les modules d'admin de Symfony gèrent l'i18n. Ainsi, il est simple de traduire ces modules. Dans cet article je vais vous expliquer :
- comment gérer plusieurs langues pour l'interface de vos modules d'administration en indiquant la langue dans l'URL
- et comment basculer en un clic d'une langue à une autre.
Cet article est écrit pour Symfony 1.4 avec l'admin-generator Doctrine. Nous utiliseront également le plugin sfLanguageSwitchPlugin.
1. Internationaliser les modules d'admin via l'URL
1.1. Les routes i18n
La première étape importante est d'activer i18n dans le fichier settings.yml de l'application :
all:
.settings:
# Enable internationalization
i18n: true
default_culture: fr
Le paramètre default_culture ne semble pas avoir d'incidence.
Dans les applications développées sous Symfony, la langue d'une page peut être indiquée dans l’URL via l’attribut :sf_culture. Une route localisée ressemble à cela :
map:
url: /:sf_culture/map/:id
requirements: { sf_culture: (?:en|es|fr) }
param: { module: map, action: view }
Le paramètre requirements décrit un pattern à respecter pour le champ :sf_culture. Le simple ajout du paramètre :sf_culture dans l'URL modifie automatiquement la langue de l'utilisateur. Il n'y a pas besoin de passer ce paramètre pour générer l'URL avec les url_for(...) et autres link_to(...).
1.2. Modification de sfDoctrineRoute
Pour prendre en compte ce paramètre dans les modules d’admin, j'ai créé des classes routing spécifiques. Deux fichiers dans le répertoire lib du projet ou de l'application (au choix) :
La classe sfI18NDoctrineRoute ajoute le paramètre :sf_culture aux routes.
/lib/routing/sfI18NDoctrineRoute.class.php
class sfI18NDoctrineRoute extends sfDoctrineRoute
{
/**
* @see sfRoute
*/
public function __construct($pattern, array $defaults = array(), array $requirements = array(), array $options = array())
{
// Add the culture prefix to admin routes
$pattern = '/:sf_culture' . $pattern;
parent::__construct($pattern, $defaults, $requirements, $options);
}
}
/lib/routing/sfI18NDoctrineRouteCollection.class.php
class sfI18NDoctrineRouteCollection extends sfObjectRouteCollection
{
protected $routeClass = 'sfI18NDoctrineRoute';
}
Maintenant que vos classes sont crées, il faut modifier vos routes. Cela donne par exemple :
my_class:
class: sfI18NDoctrineRouteCollection
options:
model: MyClass
module: my_class
prefix_path: /my_class
column: id
with_wildcard_routes: true
Essayer maintenant d'afficher votre module en modifiant le paramètre de langue :
http://localhost/app/fr/my_class http://localhost/app/hu/my_class
Notez bien qu'il n'est ici pas nécessaire d'ajouter les fichiers XLIFF de langue dans le répertoire i18n de l'application. Les fichiers du plugin Doctrine sont directement utilisés.
2. Installer le plugin sfLanguageSwitchPlugin
Si vous souhaitez afficher une barre de choix de la langue, rien de plus simple grâce au plugin sfLanguageSwitchPlugin qui vous fourni un composant dédié.
Téléchargez sfLanguageSwitchPlugin et installez-le comme décrit dans la notice.
/apps/backend/config/settings.yml
all:
.settings:
enabled_modules: [sfLanguageSwitch]
i18n: true
/apps/backend/config/app.yml
all:
# sfLanguageSwitchPlugin
sfLanguageSwitch:
flagPath: /sfLanguageSwitch/images/flag
availableLanguages:
en: { title: English }
ar: { title: العربية}
bg: { title: български език }
ca: { title: Català }
cs: { title: Česky }
de: { title: Deutch }
es: { title: Español }
fi: { title: Suomen kieli }
fr: { title: Français }
hr: { title: Hrvatski }
hu: { title: Magyar }
id: { title: Bahasa Indonesia }
it: { title: Italiano }
lt: { title: Lietuvių kalba }
lv: { title: Latviešu valoda }
nl: { title: Nederlands }
no: { title: Norsk }
pl: { title: Polski }
pt: { title: Português }
ro: { title: Română }
ru: { title: русский язык }
sk: { title: Slovenčina }
sl: { title: Slovenščina }
sv: { title: Svenska }
tr: { title: Türkçe }
(Wikipedia : Liste des codes langue)
Ajoutez maintenant le composant à votre layout :
/apps/backend/templates/layout.php
<body>
<?php include_component('sfLanguageSwitch', 'get'); ?>
<?php echo $sf_content ?>
</body>
Pour afficher sous forme de liste, juste un petit bout de code CSS :
/web/css/main.css
#lang li { display: inline; }
Si vous avez des remarques ou suggestions, n'hésitez pas ! Les commentaires sont là pour ça.
Aucun trackbacks pour l'instant
9 février 2010 - 09:37
Juste pour info, d’apres moi un simple :
my_class: class: sfDoctrineRouteCollection options: model: MyClass module: my_class prefix_path: /my_class column: /:sf_culture/:id with_wildcard_routes: truedevrait suffire, non ?
9 février 2010 - 16:40
Cela peut fonctionner, mais dans ce cas il faut modifier la classe sfDoctrineRouteCollection.
28 juillet 2010 - 08:52
kquimnnliblrfthkezco, Viagra, dVTdGws.