IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres composants PHP Discussion :

[Zend_Translate] Récupérer locale


Sujet :

Autres composants PHP

  1. #1
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut [Zend_Translate] Récupérer locale
    Bonjour,

    J'ai développé un plugin de controlleur pour pouvoir détecter la langue (stockée dans l'URL) et l'utiliser pour traduire tout le site (les routes, le texte et le texte affiché par Zend_Navigation).

    Comme je comprends la doc, Zend_Translate est censé récupérer Zend_Locale comme locale à utiliser. Mon plugin effectue quelque chose dans routeStartup, donc avant la traduction de la route (ou n'importe quelle traduction). Logiquement, si je change la locale contenue dans le registre (enregistrée avec la clé Zend_Locale), cette locale sera automatiquement utilsiée par tous les Zend_Translate et je n'aurais donc pas besoin de modifier manuellement la locale de mes différents Zend_Translate.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public function routeStartup(Zend_Controller_Request_Abstract $request)
            {
                $locale = Zend_Registry::get('Zend_Locale');
                $translate = Zend_Registry::get('Zend_Translate');
     
                // Trouve une nouvelle locale
                $locale->setLocale(quelqueChose);
     
                Zend_Controller_Front::getInstance()->getRouter()->setGlobalParam('lang', $locale->getLanguage());
     
                //Zend_Controller_Router_Route::getDefaultTranslator()->setLocale($locale);
                //$translate->setLocale($locale);
            }
    Les deux dernières lignes, normalemenet, ne devrait pas avoir besoin d'être appelées puisque, par défaut, les Zend_Translate devraient utiliser l'objet Zend_Locale stockée dans le registre (et la modification est répercutée automatiquement). Or, je suis obligé de mettre à jour la locale, pourquoi ?

  2. #2
    Membre éclairé Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Points : 663
    Points
    663
    Par défaut
    Salut,

    En fait Zend_Translate va par defaut récupérer la locale par de defaut définie dans Zend_Locale, il te suffit juste de définir la locale par defaut dans ton plugin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $locale->setDefault($langLocale);
    Personnellement je stocke la locale en session, comme ça pas besoin de la fournir dans l'url, voici le plugin que j'utilise pour gérer la locale dans tout le site:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    <?php
    /**
     * Detection de la langue utilisateur
     * via les languages dispo dans la base de donnée
     */
    class Admin_Plugin_Language extends Zend_Controller_Plugin_Abstract
    {
    	private $_session;
     
    	private $_locale;
     
    	public function routeStartup(Zend_Controller_Request_Abstract $request)
    	{
    		$this->_session = Zend_Registry::get('session');
    		$this->_locale  = Zend_Registry::get('Zend_Locale');
     
    		$langTable = Ez_Controller::loadTable('Admin_Model_DbTable_Languages');
    		$languages = $langTable->getCachedLanguages();
     
    		if (!isset($this->_session->language)) {
    			$langLocale = null;
     
    			foreach ($languages as $language) {
    				// Langue courante detectée -> enregistrement en session
    				if ($this->_locale->getLanguage() == $language->language) {
    					$this->_session->language = $language;
    					$langLocale = $language->language;
    				}				
    			}
     
    			/**
    			 * La langue locale n'existe pas en base, elle n'a donc pas encore été traduite
    			 * On attribue la langue par defaut du fichier de config
    			 * Si par hazard la langue n'existe pas, on leve une exception
    			 */
    			if (!$langLocale) {
    				$config = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getOptions();
    				$langLocale = $config['resources']['locale']['default'];
    				if (!$langLocale) {
    					throw new Ez_Exception('"defaultlanguage" parameter is not set in config.ini');
    				}
    			}
     
    		} else {
    			// La langue existe en session
    			$langLocale = $this->_session->language->language;
    		}
     
    		/**
    		 * Parametrage des composants 
    		 * nécessitant la langue actuelle
    		 */
    		$this->_locale->setDefault($langLocale);
    		Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('translate')->setLocale($langLocale);
    	}
     
    	public function routeShutdown(Zend_Controller_Request_Abstract $request)
    	{
    		/**
    		 * Parametrage de la langue de traduction par defaut pour le traducteur
    		 */
    		if (!isset($this->_session->translatorLanguage)) {
    			$this->_session->translatorLanguage = $this->_session->language->language;
    		}
    		/**
    		 * Si l'action est 'translate' et qu'on détecte le parametre 'lg'
    		 * l'utilisateur souhaite changer la langue dans laquelle il veut traduire quelque chose
    		 */
    		if ($request->getActionName() == 'translateall' 
    		    && $request->getParam('lg')) {
     
    		    	$this->_session->translatorLanguage = $request->getParam('lg');
    		}
    	}
    }
    EDIT : La méthode routeShutdown est facultative, je m'en sers juste pour retenir la langue de traduction choisie par le traducteur...
    Les idiots sont ceux qui ne posent jamais de question!

  3. #3
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Mmmhh bizarre que ça marche chez toi, j'ai essayé il me faut toujours les deux lignes.

    Ou définis-tu ton (ou tes) Zend_Translate ? Je peux voir ton fichier de configuration et ton bootstrap ?

    Sinon je préfère garder la langue dans l'url car mes pages sont différentes suivant la langue (en terme de contenu).

  4. #4
    Membre éclairé Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Points : 663
    Points
    663
    Par défaut
    Bootstrap:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
        protected function _initTranslate()
        {
            $translate = new Zend_Translate('gettext',
                                            APPLICATION_PATH . '/languages',
                                            null,
                                            array('scan' => Zend_Translate::LOCALE_FILENAME,
                                                  'logUntranslated' => false)
                                            );
     
            // Traducteur par defaut pour les classes suivantes
            Zend_Validate_Abstract::setDefaultTranslator($translate);
            Zend_Form::setDefaultTranslator($translate);
            return $translate;
        }
    Dans application.ini je défini juste un paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ; Language par defaut de l'application
    resources.locale.default = "fr"
    resources.locale.force = true
    En fait j'ai pas vu mais dans mon plugin j'ajoute la locale a Zend_Translate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('translate')->setLocale($langLocale);
    C'est que ça fait un bail que j'ai pas touché ce fichier ^^
    Les idiots sont ceux qui ne posent jamais de question!

  5. #5
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('translate')->setLocale($langLocale);
    Voilà ! Ayant deux instances de Zend_Translate (un pour le texte normal, la navigation), et un pour les routes (pour éviter les conflits, about devant être traduit a-propos et non a propos, par exemple), je dois appeler la fonction setLocale deux fois. C'est pas génant en soi, mais je comprends pas pourquoi ça ne fonctionne pas.

    Pour moi (et d'après la doc), chaque fois qu'une instance de Zend_Translate veut traduire un message, il doit récupérer la locale à partir du registre, pour peu qu'on l'ait enregistré en suivant la convention du framework (donc sous le nom de Zend_Locale), et donc pour peu qu'on l'ait mis à jour dans la fonction routeStartup, c'est bien cette locale mise à jour qui devrait être utilisée. Or ce n'est pas le cas. J'ai regardé un peu le code source des différents composants et ça semble être le cas pourtant, mais ça ne marche pas comme je le comprends.

  6. #6
    Membre éclairé Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Points : 663
    Points
    663
    Par défaut
    Le problème c'est que Zend_Locale et Zend_Translate s'inisialisent dans le bootstrap. A ce moment tu n'a pas encore détecté la langue, mais Zend_Translate lui a deja defini sa langue de trad.... via l'init de Zend_Locale

    En fait dans le plugin tu es obligé de dire à Zend_Translate d'utiliser la nouvelle locale détectée dans l'url.
    Et ce n'est pas parce que tu défini une nouvelle locale dans zend_locale que ça va automatiquement changer le parametre dans zend_translate vu que chaque composant du ZF est indépendant
    Les idiots sont ceux qui ne posent jamais de question!

  7. #7
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    D'accord. Mais les différents composants ne pourraient pas, à l'appel de la fonction translate, récupérer non pas la locale qu'il a créé à l'initialisation, mais récupérer celle stockée dans Zend_Translate ? Et pas seulement à la création. Ainsi un changement de la locale à un endroit du code se répercuterait sur tous les composants l'utilisant, sans avoir besoin de le changer.

  8. #8
    Membre éclairé Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Points : 663
    Points
    663
    Par défaut
    Je vois pas trop l'intérêt..... en tout cas dans la réalité je n'ai jamais eu besoin de changer la locale de tout mes composant en plein milieu d'exécution d'un dispatch.
    Les idiots sont ceux qui ne posent jamais de question!

  9. #9
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Disons qu'il y a une relation quand même entre la locale et la traduction. Quand ta locale est fr, tu t'attends à ce que le texte soit en français. Enfin bon, c'est pas comme si c'était ultra gênant non plus, ça fait que deux lignes de code en plus .

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/01/2007, 19h30
  2. Réponses: 1
    Dernier message: 19/01/2006, 16h23
  3. Réponses: 2
    Dernier message: 26/12/2005, 00h38
  4. Récupérer le nom de partage d'une ressource locale
    Par bib34690 dans le forum Langage
    Réponses: 4
    Dernier message: 12/10/2005, 16h10
  5. Récupérer le nom de la machine locale
    Par Jflgb dans le forum C++Builder
    Réponses: 5
    Dernier message: 15/05/2003, 09h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo