Traduire ses URL avec Zend_Controller_Router_Route

Je n'aime pas mélanger le Français et l'Anglais dans mon code. Mes noms de variables, mes noms de table, mes noms de contrôleur et d'actions sont donc toujours systématiquement en anglais. Le problème avec cette approche, c'est que du coup mes URL sont également en anglais. Sur un de mes sites par exemple, je projette d'ajouter une rubrique Trucs et astuces. Je vais donc nommer mon contrôleur TipsAndTricks, ce qui va me donner l'URL suivante : /tips-and-tricks.

Ce n'est pas très explicite pour les internautes non anglophiles. Il faudrait que l'URL soit en français : /trucs-et-astuces.

Ce n'est pas non plus optimal du point de vue de l'optimisation pour les moteurs de recherche (SEO Search Engine Optimization). Même si les mots clés dans la partie chemin de l'URL ne semble pas avoir d'impact sur le référencement (seul les mots clés dans le nom de domaine sont pris en compte), lorsque l'URL est directement utilisée comme texte pour le lien, les mots clés qui la composent semblent être pris en compte par les moteurs de recherche. J'emploie le conditionnel car le SEO est loin d'être une science exacte et les moteurs de recherche modifient en permanence leurs algorithme d'indexation.

Il faut noter également que l'URL est affichée sur les pages de résultat avec les mots clés en gras. Cela peut attirer l'œil de l'utilisateur et donc pourrait améliorer votre taux de clic (même ma grand-mère s'en est rendu compte ;-)).

Mise en surbrillance des mots clés dans l'URL sur les pages de recheche

Heureusement mon framework préféré est capable de traduire ses URL. Pour cela, il faut créer une route avec des arobases sur les paramètres à traduire et un objet Zend_Translate :

<?php
// Dans application/Bootstrap
protected function _initRouter()
{
    
$router Zend_Controller_Front::getInstance()->getRouter();

    
// Récupère les traductions
    
$translations = include(APPLICATION_PATH '/configs/translated-routes.php');

    
// Crée l'objet Zend_Translate qui va assurer la traduction 
    
$routesTranslator = new Zend_Translate(
        array(
            
'adapter' => 'array',
            
'content' => $translations,
            
'locale'  => 'fr'
        
)
    );

    
// Crée la route qui va être traduite. Notez la présence 
    // de l'arobase qui signifie que le nom du contrôleur va
    // être traduit.
    
$translatedRoute = new Zend_Controller_Router_Route(
        
':@controller/:action/*',
        array(
            
'action'     => 'index',
            
'controller' => 'index',
            
'module'     => 'default'
        
)
    );
    
$router->addRoute('translated'$translatedRoute);           

    
// Définit le traducteur par défaut pour toutes les routes
    
Zend_Controller_Router_Route::setDefaultTranslator($routesTranslator);

    return 
$router;
}
?>

J'ai choisi un adaptateur de traduction de type Array car c'est le plus simple à mettre en place et que le nombre de chaînes à traduire est limité. Les traductions sont placées dans un fichier séparé nommé translated-routes.php :


<?php
return array(
    
'download' => 'telechargement',
    
'tips-and-tricks' => 'trucs-et-astuces'
);
?>

Une fois que ces éléments ont été mis en place, les routes seront traduite lors de leur assemblage. Exemple avec Zend_View_Helper_Url :

<?php
// Affiche /trucs-et-astuces (si appelé dans un script de vue)
echo $this->url(array('controller' => 'tips-and-tricks'));
?>

Dans l'autre sens, l'URL /trucs-et-astuces sera automatiquement associée au contrôleur TipsAndTricks au moment du routage.

Etiquettes:

Commentaires

Excellent, c'est ce que j'utilise sur un projet en production et ca marche très bien.
Attention cependant à bien utiliser un fichier de traduction différent du reste pour éviter les collisions avec les traductions des textes.

Explication : on peut avoir plusieurs chaines de traduction qui définissent le même mot. Ainsi si un titre de la page est écrit avec la chaine : 'tips-and-tricks-title' et à pour valeur 'trucs-et-astuces', la traduction de 'trucs-et-astuces' aura deux chaines associées : Le nom du contrôleur et le titre de la page. Si la mauvaise est utilisée, on ne trouvera jamais le bon contrôleur ;-)

Pour l'implémentation, j'utilise un plugin qui détecte la locale à utiliser et affiche les routes dans la langue adaptée.

Ajouter un commentaire