Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 09-11-2008 01:39:28

jon301
Nouveau membre
Date d'inscription: 12-10-2008
Messages: 4

[Zend_Translate] Traduction de messages coté client (JS)

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 sad

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 sad


Merci pour votre aide !

Hors ligne

 

#2 09-11-2008 14:05:15

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

Re: [Zend_Translate] Traduction de messages coté client (JS)

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.

Code:

{
    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

 

#3 10-11-2008 11:31:05

ichevc02
Membre
Date d'inscription: 25-07-2007
Messages: 127

Re: [Zend_Translate] Traduction de messages coté client (JS)

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

 

#4 10-11-2008 14:10:10

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

Re: [Zend_Translate] Traduction de messages coté client (JS)

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

Code:

{'succes' = true, 'customerId' = 523}

ou en cas d'erreur

Code:

{'succes' = false, 'error' = 'DUPLICATE_ENTRY'}

ainsi pour afficher le message approprié in suffit de faire

Code:

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

 

#5 10-11-2008 17:17:32

ichevc02
Membre
Date d'inscription: 25-07-2007
Messages: 127

Re: [Zend_Translate] Traduction de messages coté client (JS)

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 wink ).


voila.

Dernière modification par ichevc02 (10-11-2008 17:20:12)

Hors ligne

 

#6 10-11-2008 18:30:30

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Zend_Translate] Traduction de messages coté client (JS)

Je rapelle que PHP permet de renoyé n'importe quoi au client, pas forcément du HTML..


----
Gruiiik !

Hors ligne

 

#7 10-11-2008 19:05:24

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

Re: [Zend_Translate] Traduction de messages coté client (JS)

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.

Code:

            <!-- 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

 

#8 13-11-2008 08:22:06

mdelanno
Membre
Lieu: Nord
Date d'inscription: 26-08-2007
Messages: 90
Site web

Re: [Zend_Translate] Traduction de messages coté client (JS)

Moi j'ai un contrôleur nommé Translate :

Code:

<?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 :

Code:

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 :

Code:

<script type="text/javascript" src="/monapp/translate"></script>

et on peut utiliser les chaînes traduite de la façon suivante dans le Javascript :

Code:

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

 

#9 13-11-2008 09:36:24

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Zend_Translate] Traduction de messages coté client (JS)

Voilà une belle façon d'utiliser PHP comme je l'ai dit plus haut.
Merci mdelanno


----
Gruiiik !

Hors ligne

 

#10 13-11-2008 13:53:48

Nikkau
Membre
Date d'inscription: 25-03-2008
Messages: 52

Re: [Zend_Translate] Traduction de messages coté client (JS)

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 wink ).

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

 

#11 17-11-2008 05:07:34

lethak
Membre
Lieu: France
Date d'inscription: 05-04-2008
Messages: 168

Re: [Zend_Translate] Traduction de messages coté client (JS)

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

Dernière modification par lethak (17-11-2008 05:09:57)


IT Dev @Twitter

Hors ligne

 

#12 17-11-2008 07:33:42

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

Re: [Zend_Translate] Traduction de messages coté client (JS)

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

Code:

$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

 

#13 17-11-2008 18:17:56

lethak
Membre
Lieu: France
Date d'inscription: 05-04-2008
Messages: 168

Re: [Zend_Translate] Traduction de messages coté client (JS)

on est d'accord sekaijin, mais j'ai d'autres impératifs avec lesquels je doit composer sur ce projet hmm

par contre oui je vais corriger ça pour le die() merci smile


IT Dev @Twitter

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