Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 27-04-2010 14:18:13

gregoooo83
Nouveau membre
Date d'inscription: 27-04-2010
Messages: 4

Traduction des URLs

Bonjour à tous,

Je suis tout nouveau sur ZF et j'ai un problème que je n'arrive pas à résoudre malgré maintes recherches ...
Je voudrais en fait que mes URLs soient traduites dans d'autres langages, comme par exemple :


nomdomaine/fr/incription/nouveau

nomdomaine/en/register/new

... HELP !

Greg.

Hors ligne

 

#2 26-05-2010 10:11:08

martinsupiot
Membre
Lieu: Nantes
Date d'inscription: 20-03-2007
Messages: 52
Site web

Re: Traduction des URLs

Voilà le plugin que j'utilise pour avoir mes routes dans la langue de l'utilisateur

Code:

<?php 
class MBGLib_Controller_Plugin_Language extends Zend_Controller_Plugin_Abstract
{
    /** Liste des langues autorisées */
    protected $languages = array('en','fr');
    
    /** Langue par défaut */
    private $_lang = 'fr';
    
    /** Pays par défaut */
    private $_country = 'FR';
    
    /**
     * Charge les routes dans la bonne langue
     * 
     * (non-PHPdoc)
     * @see Controller/Plugin/Zend_Controller_Plugin_Abstract#routeStartup($request)
     */
    public function routeStartup(Zend_Controller_Request_Abstract $request) {
        
        // Si la langue n'est pas définie dans la requete
        if (substr($request->getRequestUri(), 0, -1) == $request->getBaseUrl()){

            $lang = $this->getBrowserLanguage();
            $request->setRequestUri($request->getRequestUri() . $lang . '/');
            $request->setParam('language', $lang);
        }
        
        // Traductions spécifiques pour les routes
        $translate = new Zend_Translate ('gettext', APPLICATION_PATH . '/languages/route', null, array('scan' => Zend_Translate::LOCALE_FILENAME));
        Zend_Controller_Router_Route::setDefaultTranslator($translate);
    }
    
    
    /**
     * Défini la langue du site en fonction de l'url et des préférences du navigateur
     * 
     * (non-PHPdoc)
     * @see Controller/Plugin/Zend_Controller_Plugin_Abstract#routeShutdown($request)
     */
    public function routeShutdown(Zend_Controller_Request_Abstract $request)
    {
        // Test de l'url et des préférences du navigateur si on ne la connait pas déjà
        if (!$lang = $request->getParam('language'))
        {
            $lang = $this->getBrowserLanguage();
        }
        
        // Récupération du pays dans les préférences du navigateur
        Zend_Registry::set('Zend_Country', $this->getBrowserCountry());
        
        // Création de la locale
        $locale = new Zend_Locale($lang);
        Zend_Registry::set('Zend_Locale', $locale);
        
        // Définition de la langue du contrôleur
        $route = Zend_Controller_Front::getInstance()->getRouter();
        $route->setGlobalParam('language', $locale->getLanguage());
        
        // Traductions pour les textes
        $translate = new Zend_Translate ('gettext', APPLICATION_PATH . '/languages', null, array('scan' => Zend_Translate::LOCALE_FILENAME));
        $translate->setLocale($locale);
        
        // Stockage dans le registre
        Zend_Registry::set('Zend_Translate', $translate);
        
        // On paramètre les modules avec la langue
        Zend_Validate_Abstract::setDefaultTranslator($translate);
        Zend_Form::setDefaultTranslator($translate);
    }
    
    /**
     * Retourne la langue du navigateur, ou la langue par défaut si l'autre n'est pas acceptée
     * 
     * @return string, La langue à appliquer 
     */
    public function getBrowserLanguage()
    {
        $langs = Zend_Locale::getBrowser();
        
        foreach ($langs as $lang => $pref) {
            
            if (in_array(substr($lang, 0, 2), $this->languages)) {
                
                return substr($lang, 0, 2);
                
            }
        }
        return $this->_lang;
    }
    
    
    /**
     * Retourne le pays du navigateur
     * 
     * @return string, Le pays du navigateur 
     */
    public function getBrowserCountry()
    {
        $countries = Zend_Locale::getBrowser();
        
        foreach ($countries as $country => $pref) {
            
            $position = strpos($country, '_');
            if($position !== false) {
                return substr($country, $position + 1);
            }
        }
        return $this->_country;
    }
}

Attention, il est très important de prendre un fichier de langue différent pour les routes afin de ne pas interférer avec les traductions du site !

Hors ligne

 

#3 04-02-2011 20:02:28

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: Traduction des URLs

Je me permet d'upper cette discussion : comment utiliser gettext avec la traduciton des routes ? Puisqu'il est impossible d'ajouter manuellement des chaînes aux fichiers .po, je ne vois pas comment faire pour scanner les chaînse de caractère.

Hors ligne

 

#4 07-02-2011 09:48:27

Ithier
Membre
Date d'inscription: 05-01-2010
Messages: 85

Re: Traduction des URLs

Perso pour les chaines qui ne sont pas récupérées par gettext automatiquement je créée un fichier php bidon avec des lignes translate:

Code:

<?php
translate ('chaine bidon');
...

Dernière modification par Ithier (07-02-2011 09:48:46)

Hors ligne

 

#5 20-04-2011 15:54:18

lacha07
Nouveau membre
Date d'inscription: 20-04-2011
Messages: 2

Re: Traduction des URLs

merci pour ce post tres utile
Parcontre sur mon site j ai un soucis

la structure de mes pages est /lang/controller/action
pour la page d'enregistrement j ai pour le francais et l anglais
/fr/enregistrement/privee
/en/register/private
je permet a chaque page de changer de langue.
pour changer de langue j ai donc juste a faire un

Code:

href="<?php echo $this->url(array('lang'=>'en')) ?>">

mais dans ce cas l 'url devinent /en/enregistrement/prive ce qui n existe pas
comment puis je indiquer a l 'urlHelper de traduire ma demande dans une langue

merci

Dernière modification par lacha07 (20-04-2011 15:57:16)

Hors ligne

 

#6 22-04-2011 09:30:37

lacha07
Nouveau membre
Date d'inscription: 20-04-2011
Messages: 2

Re: Traduction des URLs

Bonjour, après une lecture du code Zend et du helper url la solution est simple smile
Je définie ma règle de routage

Code:

$route = new Zend_Controller_Router_Route(':lang/:@controller/:@action/*',
array('controller'=>'category',
                'action' => 'index',
                'module'=>'default',
                'lang'=>$lang));

donc le contrôleur et l action sont traduit, c est ma règle par default.
Apres cela je défini mon traducteur spécific au url avec tous les langages disponible sur ma webapp:

Code:

$routesTranslator = new Zend_Translate(
             'array', $translationsroutefr,'fr');
    $routesTranslator->addTranslation($translationsroutede,'de');
    $routesTranslator->addTranslation($translationsrouteen,'en');
    $routesTranslator->addTranslation($translationsroutees,'es');
    $routesTranslator->addTranslation($translationsrouteit,'it');

donc pour ecrire un url j'utlise le url helper

Code:

$this->url(array("lang" => $langLink, "controller" =>"register", "action"=>"agency"))

en fonction de la locale du client j'aurais soit:
/fr/enregistrement/agence
/en/registration/agency
etc etc .
Par contre le problème etais de traduire l'url sur des lien permettant de changer de langue et la c'est tres simple (merci ZEND)

Code:

$this->url(array('lang'=>'it','@locale'=>'it'))

il faut juste spécifier la locale désiré avec le paramètre @locale.
Comme l application existe déjà, et donc est conséquente je ne vais pas changer tous les liens, sinon pour le paramètre :lang je me baserais sur la locale pour éviter les redondance.
Merci

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