Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Dans mon appli je fais apparaître des infobulles en Javascript. Le problème est que je ne bénéficie pas du Zend_Translate et donc mes messages ne peuvent pas être traduit
Ya t-il une technique pour un tel problème ?
Je voudrai éviter les requêtes Ajax, ce serait un peu lourd pour de simples infobulles...
Sinon un moyen serait de passer des variables PHP vers JS ?.. mais comment ?
Je vois pas trop comment m'y prendre
Merci pour votre aide !
Hors ligne
Oui j'utilise un fichier qui contient tout les textes de tous mes objets JS ce fichier existe en autant de langue.
l'application n'envoie jamais un message clair au client c'est toujours une clef.
Le javascript va ainsi avec la clef utiliser le message approprié.
je travail sur une appli full ajax et dans ce cadre ZF ne donne aucun texte à afficher autre que des données de travail c'est le javascript qui connait tous les messages.
pour me faciliter la vie ce fichier contient une définition d'un objet JSON lui même organisé en objet en fonction des composants.
{ AdminPanel : { title: "Administration Générale", loadError: "Impossible de charger les données d'administration", errors : { insert: "L'enregistrement n'a pu être ajouté", duplicate: "un enregistrement avec le même identifiant existe déjà" ...
A+JYT
Hors ligne
Bonjour,
C'est marrant, j'ai tendance à faire l'inverse
Le javascript fait un appel 'ajax' avec une clé et c'est le php qui lui réponds avec le message approprié.
Hors ligne
pour moi le contrôleur dit quoi afficher et la vue dit comment
donc lorsque le serveur dit FILE_NOT_FOUND il dit quoi et la vue elle affiche "Le fichier est indisponible" ou "Le fichier demandé est introuvable" ou encore "ce fichier n'existe pas" qui est bien plusieurs façon d'exprimer l'indisponibilité du fichier et c'est donc bien du comment qu'il s'agit.
c'est un principe de séparation des couche c'est à la vue de donner des message claire à l'utilisateur le contrôleur se contente lui de dire de quoi il retourne.
de plus c'est plus facile à gérer ainsi lorsque le client demande
Customer/save/ -> post data ['nom'='test' .....]
le serveur lui réponds
{'succes' = true, 'customerId' = 523}
ou en cas d'erreur
{'succes' = false, 'error' = 'DUPLICATE_ENTRY'}
ainsi pour afficher le message approprié in suffit de faire
this.notify(this.saveError, this.errors[response.error]);
alors que si c'est le serveur qui le fait il faut soit qu'il connaisse la langue du client soit lui demander pour chaque texte à afficher de faire la traduction.
traduire toute l'interface revient donc soit à générer le javascript côté serveur et donc ne plus bénéficier du cache car les partie qui change dans le code sont variables. soit faire un code javascript statique et pour chaque texte apeler le serveur pour faire la traduction.
si c'est le javascript qui porte la traduction
le code js est statique les fichiers de langues sont statiques il n'y a pas d'interrogation du serveur pour les traduction.
A+JYT
Hors ligne
sekaijin ,
Je comprends ton point de vue et d'un point de vue perf réseau il est surement meilleur (moins de trafic entre le client et le serveur).
Comme j'utilise xajax pour gérer mon ajax, j'ai tendance a raisonner de facon à ce que la vue fasse le moins de traitement possible et à déléguer au max au serveur :
- pour des raison de perf coté client (parfois sur une petite machine un écran bourré d'ajax, ou traitement d'affichage peut devenir tres tres lent)
- il m'arrive souvent de générer des partie de vue (en fonctionnant avec le mvc Zend) coté serveur que j'envoie au client pour remplacer le html de div (div.innerhtml). Ma séparation des couches est donc intacte coté serveur (j'appelle une action, et j'ai une vue associe dont je capture le body dans lo'bjet response pour l'envoyer au client).Donc mes message sont générés coté serveur.
- S'il y a énormément de messages et de langues ,ça me gène de devoir envoyer tous les messages au client pour être traité par du javascript, (imaginons le cas extrême d'avoir un fichier de messages pour 50 langues par exemple OK c'est très extrême ).
voila.
Dernière modification par ichevc02 (10-11-2008 17:20:12)
Hors ligne
Je rapelle que PHP permet de renoyé n'importe quoi au client, pas forcément du HTML..
Hors ligne
non je ne fonctionne pas du tout comme ça ma vue ZF fournis un page qui contient des référence à des javascript statiques.
ZF donne la langue à charger je ne charge donc qu'un seul fichier de langue qui contient tous les massage nécessaire à cette page. uniquement dans la langue en question.
c'est très rapide car il n'y a qu'un fichier statique chargé pour la langue il n'y a pas de traitement coté client juste un déréférencement.
le serveur fournis des données à la vue dont la langue. la vue charge des js statique dont le fichier de langue correspondant et le client fait ensuite les appels ajax.
de ce fait jamais la traduction du site ne passe par un quelconque mécanique autre que la lecture d'un attribut js dans un objet.
pour changer de langue il suffit de changer le fichier de langue.
<!-- App Intrametrics --> <script type="text/javascript"> Ext.app.baseUrl = '<?echo $this->baseUrl ?>/'; Ext.app.user = <?echo $this->userJson ?>; </script> <script type="text/javascript" src="<?echo $this->baseUrl ?>/public/scripts/core/core.js"></script> <script type="text/javascript" src="<?echo $this->baseUrl ?>/public/scripts/locale/core.<?echo $this->locale ?>.js"></script>
Voilà en gros ma vue.
A+JYT
Dernière modification par sekaijin (10-11-2008 19:10:31)
Hors ligne
Moi j'ai un contrôleur nommé Translate :
<?php class TranslateController extends Zend_Controller_Action { public function indexAction() { $this->_helper->layout->disableLayout(); $this->_response->setRawHeader('Content-type: application/json'); } }
et une vue qui contient ça :
Translate = <?php $translate = Zend_Registry::get('Zend_Translate'); echo json_encode(array( 'users' => $translate->_('Utilisateurs'), [..] )); ?> ;
Ce script JS est chargé grâce à la balise suivante :
<script type="text/javascript" src="/monapp/translate"></script>
et on peut utiliser les chaînes traduite de la façon suivante dans le Javascript :
alert(Translate.users);
L'avantage c'est que je peux utiliser PoEdit pour traduire mes chaines.
J'ai choisi de tout mettre dans un gros fichier car c'est plus efficace que d'utiliser plusieurs fichiers séparés. Sur le serveur de prod, je vais mettre en place une copie statique du fichier pour chaque langue.
Hors ligne
Voilà une belle façon d'utiliser PHP comme je l'ai dit plus haut.
Merci mdelanno
Hors ligne
ichevc02 a écrit:
- S'il y a énormément de messages et de langues ,ça me gène de devoir envoyer tous les messages au client pour être traité par du javascript, (imaginons le cas extrême d'avoir un fichier de messages pour 50 langues par exemple OK c'est très extrême
).
C'est un faux problème, tu peux faire un fichier par langue et ne faire charger au client que celui dont il a besoin.
Hors ligne
pour ma part j'ai un controller qui gère ce genre de chose, il me sort un fichier javascript.
et dans mes pages je fait appel a ce script distant
src="http://monsite.com/moncontroller/monactionquiOUTPUTduJavascript"
monactionquiOUTPUTduJavascript:
$JS ="var TEXT = {"; $tab_messages = $JS_Translate->getMessages(); foreach($tab_messages as $K=>$V) { $JS.= $K.': "'.trim($V).'",'; } $JS.= "locale: '".Zend_Registry::get('locale')->getLanguage()."'"; $JS.= "}"; $this->_Cache->save($JS, $cacheId); die(header("Content-Type: text/javascript").$JS);
NOTE: $JS_Translate est un objet du type Zend_Translate que je charge en fonction de la locale
dans mon cas je charge "Translations/fr/javascript.csv"
ou chaque paire key/value deviens une paire
dans mon objet javascript:
alert( TEXT.key ) // affiche value
si ce n'est pas clair a comprendre pardonnez moi, il est 5h du mat :p
NB: je met en cache la sortie de cette action pour des questions de perf
Dernière modification par lethak (17-11-2008 05:09:57)
Hors ligne
lethak a écrit:
pour ma part j'ai un controller qui gère ce genre de chose, il me sort un fichier javascript.
et dans mes pages je fait appel a ce script distant
src="http://monsite.com/moncontroller/monactionquiOUTPUTduJavascript"
monactionquiOUTPUTduJavascript:Code:
$JS ="var TEXT = {"; $tab_messages = $JS_Translate->getMessages(); foreach($tab_messages as $K=>$V) { $JS.= $K.': "'.trim($V).'",'; } $JS.= "locale: '".Zend_Registry::get('locale')->getLanguage()."'"; $JS.= "}"; $this->_Cache->save($JS, $cacheId); die(header("Content-Type: text/javascript").$JS);NOTE: $JS_Translate est un objet du type Zend_Translate que je charge en fonction de la locale
dans mon cas je charge "Translations/fr/javascript.csv"
ou chaque paire key/value deviens une paire
dans mon objet javascript:
alert( TEXT.key ) // affiche value
si ce n'est pas clair a comprendre pardonnez moi, il est 5h du mat :p
NB: je met en cache la sortie de cette action pour des questions de perf
c'est bien compliqué pour pas grands chose
$tab_messages = $JS_Translate->getMessages(); foreach($tab_messages as $K=>$V) { $tab_messages[$K] = trim($V); } $tab_messages['locale'] = Zend_Registry::get('locale')->getLanguage(); $JS.= Zend_Json_Encode($tab_messages); $this->_Cache->save($JS, $cacheId);
par contre le die n'est pas très bon mieux vaut un set noviewrenderer et un print ou un echo
A+JYT
Hors ligne
on est d'accord sekaijin, mais j'ai d'autres impératifs avec lesquels je doit composer sur ce projet
par contre oui je vais corriger ça pour le die() merci
Hors ligne
Pages: 1