Pour compléter mon article précédent De la culture au language, j’ai réalisé un filtre permettant de faire une re-direction sur la page d’accueil selon le langage du navigateur web. Si ce langage n’est pas disponible, le navigateur sera automatiquement redirigé vers la langue par défaut.
Nous allons commencer par définir quelques paramètres dans le fichier app.yml du dossier config:
all:
language:
homepage_route: home_language
allowed:
fr: fr_CH
de: de_CH
en: en_US
Nous allons également définir la route par défaut inscrite dans le paramètre « homepage_route »:
home_language:
url: /:sf_language
param: { module: main, action: index }
Nous poursuivons par la mise en place du filtre. Ajoutons le fichier nommé « languageFilter.class.php » dans le dossier lib de votre application:
class languageFilter extends sfFilter
{
public function execute($filterChain)
{
// Execute this filter only once
if ($this->isFirstCall())
{
$is_correct_url = true;
$context = $this->getContext();
$language = $context->getRequest()->getParameter('sf_language');
$language_allowed = sfConfig::get('app_language_allowed');
// Si la langue n'est pas dans l'url
if($language == NULL)
{
// Récupération de la langue préférée du navigateur
$language = substr($context->getRequest()->getPreferredCulture(), 0, 2);
// Nous contrôlons si cette langue est dans la liste des langues valident
// Si ce n'est pas le cas, nous prenons la langue par défaut
if(!array_key_exists($language, $language_allowed))
{
$language = substr(sfConfig::get('sf_default_culture'), 0, 2);
}
$is_correct_url = false;
}
// Si la langue n'est pas définie comme active
// Nous redirigeons sur la page erreur 404
if(!array_key_exists($language, $language_allowed))
{
$module = sfConfig::get('sf_error_404_module', 'default');
$action = sfConfig::get('sf_error_404_action', 'error404');
$context->getController()->forward($module, $action);
exit;
}
else
{
// Nous récupérons la culture valide selon le code de langue
$user_culture = $language_allowed[$language];
// Si la culture est différente de la culture de session
// Nous la changeons
if($user_culture != $context->getUser()->getCulture())
{
$context->getUser()->setCulture($user_culture);
}
// Nous renseignons la valeur meta de la langue
$context->getResponse()->addHttpMeta('content-language', $language);
// Nous effectuons la redirection
$actionname = $context->getActionName();
if($is_correct_url == false && $actionname != 'error404')
{
$context->getController()->redirect(
sfConfig::get('app_language_homepage_route'));
}
}
}
// Execute next filter
$filterChain->execute();
}
}
Il nous suffit maintenant d’activer ce filtre en ajoutant ces lignes dans le fichier filters.yml du dossier config:
rendering: ~
security: ~
# insert your own filters here
language:
class: languageFilter
cache: ~
common: ~
execution: ~
Dès à présent, si votre navigateur est en langue française, si vous tapez « http://monsite.com », vous allez être redirigé vers l’adresse « http://monsite.com/fr ». Dans le cas d’une langue non reconnue, vous obtiendrez une erreur 404.
Avec ce filtre, nous avons une solution robuste pour gérer correctement notre langue.
Bonne découverte.