Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 04-05-2009 09:09:11

lsteamgeo
Nouveau membre
Date d'inscription: 04-05-2009
Messages: 2

Détection de la langue utilisateur + cookie de sauvegarde

Bonjour à tous,

je débute avec Zend Framework et d'une manière générale avec la programmation MVC.

La première chose à laquelle je m'attaque c'est la détection de la langue "préférée" de l'utilisateur pour traduire le site Internet dans la langue souhaitée.

Je fais celà avec Zend_Locale et Zend_Translate. Le fonctionnement est le suivant :

Code:

SI l'internaute a sélectionné une langue FAIRE
    je récupère la valeur du paramètre "language" sélectionné par l'internaute
    je sauvegarde la valeur dans le cookie "lang"
    j'affecte la valeur du paramètre "language" à Zend_Locale
FIN SI
SINON SI cookie "lang" existe FAIRE 
   j'affecte la valeur du cookie "lang" à Zend_Locale
FIN SINON
SINON
   je détecte la langue par défaut du navigateur client que je sauvegarde dans le cookie "lang".
FIN SINON

Pourquoi j'utilise un cookie "lang" ?
Pour sauvegarder la sélection de l'internaute. Imaginons que l'internaute est un navigateur ayant comme langue par défaut l'Anglais mais qu'il souhaite consulter le site en Français.

Sans cookie, il serait obligé, à chaque nouvelle consultation du site, de re-sélectionner la langue FR puisque par défaut la langue qui s'affichera sera la langue du navigateur.

Avec le cookie, je peux récupérer la langue qu'il aura sélectionné lors de sa visite précédente. Dans le cas ci-dessus, la langue présente dans le cookie sera la langue FR, le site s'affichera donc en FR.

Comme je vous l'ai dit, je débute en Zend Framework, j'ai fait un petit bout de code pour détecter la langue qui doit s'afficher.

Pouvez-vous me dire si le code est correct? Il fonctionne mais je ne suis pas sur que mon code soit propre.

Merci pour vos commentaires.

index.php(bootstrap)

Code:

[...]
//************************ ROUTES ********************************
$router = new Zend_Controller_Router_Rewrite();
$router->addRoute(
    "default",
    new Zend_Controller_Router_Route(
       "/:language/:controller/:action/*",
        array(
            "language"      =>  "",
            "controller"    =>  "index",
            "action"        =>  "index"
        )
    )
);

//*********************** MVC ********************************
$frontController = Zend_Controller_Front::getInstance();

$frontController->setControllerDirectory($appPath . '/controllers');

//le plugin pour la détection de la langue et la traduction
$frontController->registerPlugin(new Controllers_Plugin_Language());
 
$frontController->setRouter($router);

try{
    $frontController->dispatch();
}catch(Exception $e){
    exit($e->getMessage());
}

Language.php(plugin)

Code:

class Controllers_Plugin_Language extends Zend_Controller_Plugin_Abstract
{
    public function routeShutdown(Zend_Controller_Request_Abstract $request)
    {
               $locale = new Zend_Locale();
        
        $options = array('delimiter' => ';');
        $translate = new Zend_Translate('csv','application/locale/fr_FR/traduction.csv','fr',$options);
        $translate->addTranslation('application/locale/en_UK/traduction.csv', 'en',$options);
        
                //récupération des paramètres
        $requestParams = $this->getRequest()->getParams();

        //récupération du cookie
        $requestCookie = $this->_request->getCookie('lang');
        
        if( isset($requestParams['language']) && $requestParams['language'] != ""  ) {
            $language = $requestParams['language'] ;
        } elseif ( $requestCookie!= "" ) {
            $language = $requestCookie ;
        } else {
            $language = false;
        }
        
        if ($language == false) {
            $language = ($translate->isAvailable($locale->getLanguage())) ? $locale->getLanguage() : 'en';
        }
        if (!$translate->isAvailable($language)) {
            throw new Zend_Controller_Action_Exception('This page dont exist',404);
        } else {
            $locale->setLocale($language);
            $translate->setLocale($locale);
            Zend_Form::setDefaultTranslator($translate);
            
                     //création du cookie avec une durée de vie de 1mois
                     setcookie('lang', $locale->getLanguage(), time()+60*60*24*30, '/');
            
            Zend_Registry::set('Zend_Locale', $locale);
            Zend_Registry::set('Zend_Translate', $translate);
        }    
    }
}

Il y a certainement une meilleure solution, si vous la connaissez merci de la faire partager.

LSteamGEO

Hors ligne

 

#2 04-05-2009 10:34:42

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Détection de la langue utilisateur + cookie de sauvegarde

non tu n'as pas besoin de cookie
dans ton applie quelque part tu as un enregistrement concernant l'utilisateur
lors qu'il sélectionne une langue tu mets à jour sa ficher utilisateur
à chaque connexion tu n'a qu'à lire la fiche utilisateur la mettre en session et utiliser la langue qui s'y trouve.

c'est simple à gérer (si pas en session mettre en session et c'est tout)
et en plus lorsque ton utilisateur change de navigateur de poste de travail il retrouve sa langue.

pour aller plus loin tu crée dans ta base une table User_Param constitué de trois champs
usr_id (l'id de l'utilisateur) upm_label nom du paramètre upm_value valeur du paramètre (varchar(255))

lorsque ton utilisateur lance l'appli si ses params nes sont pas en session tu fais

Code:

SELECT  upm_label AS 'param', upm_value AS 'value'
FROM User_Param
WHERE usr_id = ?

tu récupère ainsi tous les paramètre de ton utilisateur que tu mets en session.

tu peux ainsi ajouter des paramètre sans avoir à retoucher à ton code
par exemple le choix du thème du layout ou tout autre choix que l'utilisateur pourrait faire.

en utilisant la base et la session tu vas gagner deux choses par rapport au cookies
1) les paramètres suivent l'utilisateur partout quelque soit son navigateur ou sa machine
2) les paramètres restent sur le serveur il ne sont pas échangé en permanence entre le client et le serveur

pour ce qui est du choix de la langue par défaut lors de la première connexion tu peux regarder $this->_request et le header Accept-Language qui te donne la liste des langues préféré de ton utilisateur.
ça permet de proposer d'entrée une langue plus en adéquation avec les choix de l'utilisateur.

A+JYT

Hors ligne

 

#3 04-05-2009 11:06:38

lsteamgeo
Nouveau membre
Date d'inscription: 04-05-2009
Messages: 2

Re: Détection de la langue utilisateur + cookie de sauvegarde

Merci sekaijin,

Ta solution fonctionne mais il faut que l'internaute crée un compte utilisateur pour définir ses préférences.

Je ne souhaite pas obliger les internautes à créer un compte utilisateur c'est pour cette raison que j'utilise un cookie.

LSteamGEO.

Hors ligne

 

#4 04-05-2009 15:16:46

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Détection de la langue utilisateur + cookie de sauvegarde

effectivement

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages