Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Autres composants
Autres composants Forum de support sur les autres composants de Zend Framework.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/02/2011, 10h55   #1
Rédacteur
 
Avatar de Bakura
 
Homme Michaël
Étudiant
Inscription : septembre 2005
Messages : 1 367
Détails du profil
Informations personnelles :
Nom : Homme Michaël
Âge : 22
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2005
Messages : 1 367
Points : 2 701
Points : 2 701
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 :
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 ?
Bakura est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 11h14   #2
Membre expérimenté
 
Avatar de manuscle
 
Homme Emmanuel Belair
Développeur informatique
Inscription : septembre 2004
Messages : 463
Détails du profil
Informations personnelles :
Nom : Homme Emmanuel Belair
Âge : 32
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : septembre 2004
Messages : 463
Points : 597
Points : 597
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 :
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 :
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!
manuscle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 11h37   #3
Rédacteur
 
Avatar de Bakura
 
Homme Michaël
Étudiant
Inscription : septembre 2005
Messages : 1 367
Détails du profil
Informations personnelles :
Nom : Homme Michaël
Âge : 22
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2005
Messages : 1 367
Points : 2 701
Points : 2 701
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).
Bakura est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 11h45   #4
Membre expérimenté
 
Avatar de manuscle
 
Homme Emmanuel Belair
Développeur informatique
Inscription : septembre 2004
Messages : 463
Détails du profil
Informations personnelles :
Nom : Homme Emmanuel Belair
Âge : 32
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : septembre 2004
Messages : 463
Points : 597
Points : 597
Bootstrap:
Code :
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 :
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 :
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!
manuscle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 11h59   #5
Rédacteur
 
Avatar de Bakura
 
Homme Michaël
Étudiant
Inscription : septembre 2005
Messages : 1 367
Détails du profil
Informations personnelles :
Nom : Homme Michaël
Âge : 22
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2005
Messages : 1 367
Points : 2 701
Points : 2 701
Code :
		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.
Bakura est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 12h26   #6
Membre expérimenté
 
Avatar de manuscle
 
Homme Emmanuel Belair
Développeur informatique
Inscription : septembre 2004
Messages : 463
Détails du profil
Informations personnelles :
Nom : Homme Emmanuel Belair
Âge : 32
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : septembre 2004
Messages : 463
Points : 597
Points : 597
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!
manuscle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 12h32   #7
Rédacteur
 
Avatar de Bakura
 
Homme Michaël
Étudiant
Inscription : septembre 2005
Messages : 1 367
Détails du profil
Informations personnelles :
Nom : Homme Michaël
Âge : 22
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2005
Messages : 1 367
Points : 2 701
Points : 2 701
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.
Bakura est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 14h04   #8
Membre expérimenté
 
Avatar de manuscle
 
Homme Emmanuel Belair
Développeur informatique
Inscription : septembre 2004
Messages : 463
Détails du profil
Informations personnelles :
Nom : Homme Emmanuel Belair
Âge : 32
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : septembre 2004
Messages : 463
Points : 597
Points : 597
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!
manuscle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 15h41   #9
Rédacteur
 
Avatar de Bakura
 
Homme Michaël
Étudiant
Inscription : septembre 2005
Messages : 1 367
Détails du profil
Informations personnelles :
Nom : Homme Michaël
Âge : 22
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2005
Messages : 1 367
Points : 2 701
Points : 2 701
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 .
Bakura est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h41.


 
 
 
 
Partenaires

Hébergement Web