1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 21829 -->
4 <sect1 id="zend.translate.using">
5 <title>Utiliser les adaptateurs de traduction</title>
7 <para>L'étape suivante est d'utiliser l'adaptateur dans votre code.</para>
9 <example id="zend.translate.using.example1">
10 <title>Exemple de code PHP monolingue</title>
12 <programlisting language="php"><![CDATA[
15 print "Ceci la ligne une\n";
16 print "Aujourd'hui nous sommes le " . date("d/m/Y") . "\n";
18 print "Correction de la langue ceci est la ligne deux\n";
23 L'exemple ci-dessus montre l'affichage sans le support de traduction. Vous écrivez
24 probablement votre code dans votre langue maternelle. Généralement vous devez traduire non
25 seulement l'affichage, mais également les messages d'erreur et les messages de log.
29 La prochaine étape est d'inclure <classname>Zend_Translate</classname> dans votre code
30 existant. Naturellement il est beaucoup plus facile si vous écrivez dès le début votre code
31 en utilisant <classname>Zend_Translate</classname> au lieu de modifier votre code
35 <example id="zend.translate.using.example2">
36 <title>Exemple de code PHP multilingue</title>
38 <programlisting language="php"><![CDATA[
39 $translate = new Zend_Translate(
41 'adapter' => 'gettext',
42 'content' => '/my/path/source-de.mo',
46 $translate->addTranslation(
48 'content' => '/path/to/translation/fr-source.mo',
53 print $translate->_("Exemple")."\n";
55 print $translate->_("Ceci la ligne une")."\n";
56 printf($translate->_("Aujourd'hui nous sommes le %1\$s") . "\n",
60 $translate->setLocale('fr');
61 print $translate->_("Correction de la langue ceci est la ligne deux") . "\n";
66 Maintenant regardons plus attentivement ce qui a été fait et la façon d'intégrer
67 <classname>Zend_Translate</classname> dans votre code.
71 Créer un nouvel objet de traduction et définir l'adaptateur de base : <programlisting
73 $translate = new Zend_Translate(
75 'adapter' => 'gettext',
76 'content' => '/path/to/translation/source-de.mo',
80 ]]></programlisting> Dans cet exemple nous avons décidé d'utiliser <emphasis>l'adaptateur
81 Gettext</emphasis>. Nous plaçons notre fichier <code>source-de.mo</code> dans le dossier
82 <code>/chemin/vers</code>. Le fichier gettext inclura la traduction allemande. Et nous avons
83 également ajouté un autre fichier de langue pour le français.
87 L'étape suivante est d'envelopper toutes les chaînes qui doivent être traduites.
88 L'approche la plus simple est d'avoir seulement des chaînes simples ou des phrases comme
89 celle-ci : <programlisting language="php"><![CDATA[
90 print $translate->_("Exemple")."\n";
92 print $translate->_("Ceci la ligne une")."\n";
93 ]]></programlisting>Certaines chaînes ne sont pas nécessairement traduites. La ligne séparatrice
94 est toujours la même, même dans d'autres langues.
98 Avoir des valeurs de données intégrées dans une chaîne de traduction est également
99 supporté par l'utilisation des paramètres inclus. <programlisting language="php"><![CDATA[
100 printf($translate->_("Aujourd'hui nous sommes le %1\$s") . "\n",
102 ]]></programlisting> Au lieu de <methodname>print()</methodname>, utiliser la fonction <methodname>printf()</methodname>
103 et remplacer tous les paramètres avec des éléments de type <code>%1\$s</code>. Le premier
104 est <code>%1\$s</code>, le second <code>%2\$s</code>, et ainsi de suite. De cette façon une
105 traduction peut être faite sans savoir la valeur exacte. Dans notre exemple, la date est
106 toujours le jour actuel, mais la chaîne peut être traduite sans connaissance du jour
111 Chaque chaîne est identifiée dans le stockage de traduction par un identificateur de
112 message. Vous pouvez employer l'identificateur de message au lieu des chaînes dans votre
113 code, comme ceci : <programlisting language="php"><![CDATA[
114 print $translate->_(1)."\n";
116 print $translate->_(2)."\n";
117 ]]></programlisting> faire ceci a plusieurs inconvénients :
121 Vous ne pouvez pas voir ce que votre code devrait afficher juste en lisant
126 En outre vous obtiendrez des problèmes si certaines chaînes ne sont pas traduites.
127 Vous devez toujours imaginer comment la traduction fonctionne. Premièrement
128 <classname>Zend_Translate</classname> vérifie si la langue choisie a une traduction pour
129 l'identificateur de message ou la chaîne fournie. Si aucune chaîne de traduction n'a été
130 trouvée, elle se reporte sur la langue suivante comme définie dans
131 <classname>Zend_Locale</classname>. Ainsi le "<emphasis>de_AT</emphasis>" devient seulement
132 "<emphasis>de</emphasis>". Si aucune traduction n'est trouvée pour le
133 "<emphasis>de</emphasis>", alors le message original est retourné. De cette façon vous avez
134 toujours un affichage, au cas où la traduction de message n'existerait pas dans votre
135 stockage des messages. <classname>Zend_Translate</classname> ne lève jamais d'erreur ou
136 d'exception en traduisant les chaînes.
139 <sect2 id="zend.translate.using.structure">
140 <title>Structures des sources de traduction</title>
143 L'étape suivante est la création des sources de traduction pour les multiples
144 langues vers lesquelles vous traduisez. Chaque adaptateur est créé de sa propre manière
145 comme décrit ici. Mais il y a quelques dispositifs généraux qui sont valables pour tous
150 Vous devrez savoir où stocker vos fichiers sources de traduction. Avec
151 <classname>Zend_Translate</classname> vous n'avez aucune restriction. Les structures
152 suivantes sont préférables :
157 <para>Structure de source unique</para>
159 <programlisting><![CDATA[
168 Positif : Tous les fichiers sources pour chacune des langues peuvent être
169 trouvés dans un dossier. Aucun fractionnement des fichiers.
174 <para>Source structurée par langue</para>
176 <programlisting><![CDATA[
189 Positif : chaque langue est située dans un dossier. La traduction est
190 facilitée car un seul dossier doit être traduit par une équipe de langue. En
191 outre l'utilisation de dossiers multiples est transparente.
196 <para>Source structurée par application</para>
198 <programlisting><![CDATA[
208 Positif : tous les fichiers sources pour chacune des langues peuvent être
209 trouvés dans un seul dossier. Aucun fractionnement des fichiers.
213 Négatif : avoir des dossiers multiples pour la même langue est
219 <para>Source structurée par Gettext</para>
221 <programlisting><![CDATA[
234 Positif : de vieilles sources de gettext peuvent être utilisées sans
235 changer la structure.
239 Négatif : avoir des dossiers de dossiers peut être embrouillant pour les
240 personnes qui n'ont pas utilisé gettext avant.
245 <para>Source structurée par fichier</para>
247 <programlisting><![CDATA[
266 <para>Positif : chaque fichier est lié à sa propre source de traduction.</para>
269 Négatif : de multiples petits fichiers sources de traduction rendent plus
270 difficile la traduction. En outre chaque fichier doit être ajouté comme source
277 Les fichiers source uniques et structurés par langue sont les plus utilisés pour
278 <classname>Zend_Translate</classname>.
282 Maintenant, que nous connaissons la structure que nous voulons avoir, nous devons
283 créer nos fichiers sources de traduction.
287 <sect2 id="zend.translate.using.source.array">
288 <title>Créer des fichiers sources de type tableau</title>
291 Les fichiers sources de type tableau sont simplement des tableaux. Mais vous devez
292 les définir manuellement parce qu'il n'y a aucun outil pour automatiser cela. Mais parce
293 qu'ils sont très simples, ils représentent la manière la plus rapide de rechercher des
294 messages si votre code fonctionne comme prévu. C'est généralement le meilleur adaptateur
295 pour démarrer avec des systèmes multilingues.
298 <programlisting language="php"><![CDATA[
299 $english = array('message1' => 'message1',
300 'message2' => 'message2',
301 'message3' => 'message3');
302 $german = array('message1' => 'Nachricht1',
303 'message2' => 'Nachricht2',
304 'message3' => 'Nachricht3');
306 $translate = new Zend_Translate('array', $english, 'en');
307 $translate->addTranslation($deutsch, 'de');
311 Depuis la version 1.5 il est également possible d'avoir des tableaux inclus dans
312 un fichier externe. Vous devez simplement fournir le nom de fichier,
313 <classname>Zend_Translate</classname> l'inclura automatiquement et recherchera le
314 tableau. Voir l'exemple suivant pour les détails :
317 <programlisting language="php"><![CDATA[
320 'message1' => 'Nachricht1',
321 'message2' => 'Nachricht2',
322 'message3' => 'Nachricht3');
325 $translate = new Zend_Translate('array',
326 'chemin/vers/montableau.php',
332 Les fichiers qui ne renvoient pas un tableau ne seront pas inclus. N'importe
333 quel rendu issu de ce fichier sera ignoré et également supprimé.
338 <sect2 id="zend.translate.using.source.gettext">
339 <title>Créer des fichiers sources Gettext</title>
342 Des fichiers source Gettext sont créés par la bibliothèque GNU gettext. Il y a
343 plusieurs outils libres disponibles qui peuvent analyser vos fichiers de code et créer
344 les fichiers sources nécessaires à gettext. Ces fichiers se terminent par
345 <emphasis>*.mo</emphasis> et ce sont des fichiers binaires. Un gratuiciel pour créer ces
346 fichiers est <ulink url="http://sourceforge.net/projects/poedit/">poEdit</ulink>. Cet
347 outil vous aide également pour le processus de traduction lui-même.
350 <programlisting language="php"><![CDATA[
351 // Les fichiers mo sont créés et déjà traduits
352 $translate = new Zend_Translate('gettext',
353 'chemin/vers/english.mo',
355 $translate->addTranslation('chemin/vers/german.mo', 'de');
359 Comme vous pouvez le voir, les adaptateurs sont utilisés exactement de la même
360 manière, avec juste une petite différence : changer "<code>array</code>" en
361 "<code>gettext</code>". Toutes autres utilisations sont exactement les mêmes qu'avec
362 tous autres adaptateurs. Avec l'adaptateur de gettext vous ne devez plus vous occuper de
363 la structure des répertoires, du "<code>bindtextdomain</code>" et du
364 "<code>textdomain</code>". Fournissez juste le chemin et le nom de fichier à
370 Vous devriez toujours employer UTF-8 comme source d'encodage. Autrement vous
371 aurez des problèmes si vous employez deux encodages différents. Par exemple, si un
372 de vos fichiers source est encodé en ISO-8815-1 et un fichier différent est codé
373 avec CP815. Vous ne pouvez utiliser qu'un seul encodage pour vos fichiers sources,
374 ainsi une de vos langues ne s'affichera probablement pas correctement.
378 UTF-8 est un format portable qui supporte toutes les langues. Si vous employez
379 l'encodage UTF-8 pour toutes les langues, vous éliminez le problème des encodages
385 La plupart des éditeur gettext ajoutent les informations de l'adaptateur comme
386 chaines de traduction vides. C'est pour cela que traduire des chaines vides ne
387 fonctionne pas avec l'adaptateur gettext. A la place, elles sont effacées de la table de
388 traduction. <methodname>getAdapterInfo()</methodname> retourne les informations de l'adaptateur
389 gettext, notamment les informations des fichiers gettext ajoutés.
392 <programlisting language="php"><![CDATA[
393 // Informations sur l'adaptateur
394 $translate = new Zend_Translate('gettext',
395 'path/to/english.mo',
397 print_r $translate->getAdapterInfo();
401 <sect2 id="zend.translate.using.source.tmx">
402 <title>Créer des fichiers source TMX</title>
405 Les fichiers sources TMX sont les nouveaux standards industriels. Ils ont
406 l'avantage d'être des fichiers <acronym>XML</acronym> et ainsi ils sont lisibles par tout éditeur de
407 fichier et naturellement ils sont lisibles pour l'homme. Vous pouvez soit créer des
408 fichiers TMX manuellement avec un éditeur de texte, soit utiliser un outil. Mais la
409 plupart des programmes actuellement disponibles pour développer des fichiers source TMX
410 ne sont pas des gratuiciels.
413 <example id="zend.translate.using.source.tmx.example">
414 <title>Exemple de fichier TMX</title>
416 <programlisting language="xml"><![CDATA[
417 <?xml version="1.0" ?>
418 <!DOCTYPE tmx SYSTEM "tmx14.dtd">
420 <header creationtoolversion="1.0.0" datatype="winres"
421 segtype="sentence" adminlang="en-us" srclang="de-at"
422 o-tmf="abc" creationtool="XYZTool" >
426 <tuv xml:lang="de"><seg>Nachricht1</seg></tuv>
427 <tuv xml:lang="en"><seg>message1</seg></tuv>
430 <tuv xml:lang="en"><seg>message2</seg></tuv>
431 <tuv xml:lang="de"><seg>Nachricht2</seg></tuv>
435 <programlisting language="php"><![CDATA[
436 $translate = new Zend_Translate('tmx',
437 'chemin/vers/mytranslation.tmx',
439 // TMX peut contenir différentes langues dans le même fichier
444 Les fichiers TMX peuvent avoir plusieurs langues dans le même fichier. Toute autre
445 langue incluse est ajoutée automatiquement, ainsi vous n'avez pas à appeler
446 <methodname>addLanguage()</methodname>.
450 Si vous voulez avoir seulement les langues spécifiées de la source traduite, vous
451 pouvez régler l'option <code>defined_language</code> à <constant>TRUE</constant>. Avec cette
452 option vous pouvez ajouter les langues souhaitées explicitement avec
453 <methodname>addLanguage()</methodname>. La valeur par défaut pour cette option est d'ajouter toutes
458 <sect2 id="zend.translate.using.source.csv">
459 <title>Créer des fichiers source CSV</title>
462 Les fichiers sources CSV sont petits et lisibles pour l'homme. Si vos clients
463 veulent eux-mêmes traduire, vous utiliserez probablement l'adaptateur CSV.
466 <example id="zend.translate.using.source.csv.example">
467 <title>Exemple avec un fichier CSV</title>
469 <programlisting><![CDATA[
470 #Exemple de fichier csv
475 <programlisting language="php"><![CDATA[
476 $translate = new Zend_Translate('csv',
477 'chemin/vers/matraduction.csv',
479 $translate->addTranslation('chemin/vers/autretraduction.csv',
485 Il existe trois options différentes pour l'adaptateur CSV. Vous pouvez paramétrer
486 "<code>delimiter</code>", "<code>limit</code>" et "<code>enclosure</code>".
490 Le délimiteur standard des fichiers CSV est le signe "<code>;</code>". Mais
491 celui-ci n'est pas obligatoire. Avec l'option "<code>delimiter</code>" vous pouvez
492 décider d'utiliser un autre signe de séparation.
496 La taille limite d'une ligne de fichier CSV est par défaut "<code>0</code>" Ce qui
497 veut dire que la fin de la ligne est recherchée automatiquement. Si vous paramétrez
498 l'option "<code>limit</code>" avec une valeur quelconque, alors le fichier CSV sera lu
499 plus rapidement, mais toute ligne dont la longueur excédera la limite sera
504 "L'échappement" par défaut d'un fichier CSV est le "<code>"</code>". Vous pouvez
505 en paramétrer un autre avec l'option "<code>enclosure</code>".
508 <example id="zend.translate.using.source.csv.example2">
509 <title>Exemple avec un fichier CSV (2)</title>
511 <programlisting><![CDATA[
512 #Exemple de fichier csv
513 # original 'message,1'
514 "message,1",Nachricht1
515 # traduction 'Nachricht,2'
516 message2,"Nachricht,2"
517 # original 'message3,'
518 "message3,",Nachricht3
521 <programlisting language="php"><![CDATA[
522 $translate = new Zend_Translate('csv',
523 'chemin/vers/matraduction.csv',
525 array('delimiter' => ','));
526 $translate->addTranslation('chemin/vers/autretraduction.csv',
532 <sect2 id="zend.translate.using.source.ini">
533 <title>Créer des fichiers sources INI</title>
536 Les fichiers sources <acronym>INI</acronym> sont lisibles par l'homme mais habituellement pas très
537 petits puisqu'ils incluent également d'autres données à côté des traductions. Si vous
538 avez des données qui seront éditables par vos clients, vous pouvez aussi utiliser
539 l'adaptateur <acronym>INI</acronym> dans ce cas.
542 <example id="zend.translate.using.source.ini.example">
543 <title>Exemple avec un fichier INI</title>
545 <programlisting><![CDATA[
547 ;Commentaires possibles
548 Message_1="Nachricht 1 (de)"
549 Message_2="Nachricht 2 (de)"
550 Message_3="Nachricht :3 (de)"
553 <programlisting language="php"><![CDATA[
554 $translate = new Zend_Translate('ini',
555 'path/to/mytranslation.ini',
557 $translate->addTranslation('path/to/other.ini',
563 Les fichiers <acronym>INI</acronym> ont de multiples restrictions. Si une valeur dans le fichier <acronym>INI</acronym>
564 contient un caractère non-alphanumérique, il doit être entouré avec des guillemets
565 doubles ("). Il y a aussi des mots réservés qui ne doivent pas être utilisés en tant que
566 clés des fichiers <acronym>INI</acronym>. Ceci inclut : <constant>NULL</constant>, <code>yes</code>,
567 <code>no</code>, <constant>TRUE</constant> et <constant>FALSE</constant>. Les valeurs <constant>NULL</constant>,
568 <code>no</code> et <constant>FALSE</constant> sont retournées sous la forme "". <code>yes</code>
569 et <constant>TRUE</constant> sont retournés en "1". Les caractères {}|&~![()" ne doivent pas
570 être utilisés dans la clé et ont une signification particulière dans la valeur. Ne les
571 utilisez pas ou vous rencontrerez des comportements inattendus.
575 <sect2 id="zend.translate.using.options">
576 <title>Options pour les adaptateurs</title>
579 Les options peuvent être utilisées avec tous les adaptateurs. Bien sûr chacun
580 d'eux accepte des options différentes. Vous pouvez passer des options quand vous créez
581 l'adaptateur. Pour l'instant il y a qu'une option qui est valable pour tous les
582 adaptateurs. '<code>clear</code>' décide si des données de traduction peuvent être
583 ajoutées à l'existant ou non. Le comportement standard est d'ajouter des nouvelles
584 données de traduction à l'existant. Les données de traduction sont seulement effacées
585 pour la langue choisie. Donc on ne touchera pas aux autres langues.
589 Vous pouvez régler des options temporaires en utilisant
590 <methodname>addTranslation($data, $locale, array $options = array())</methodname> comme troisième
591 paramètre optionnel. Ou vous pouvez utiliser la fonction <methodname>setOptions()</methodname> pour
595 <example id="zend.translate.using.options.example">
596 <title>Utiliser les options de traduction</title>
598 <programlisting language="php"><![CDATA[
599 // définir ':' comme séparateur pour les fichiers sources de traduction
600 $options = array('delimiter' => ':');
601 $translate = new Zend_Translate('csv',
602 'chemin/vers/matraduction.csv',
608 // efface le langage défini et utilise de nouvelles données de traduction
609 $options = array('clear' => true);
610 $translate->addTranslation('chemin/vers/nouveau.csv',
617 Ici vous pouvez trouver toutes les options disponibles pour les différents
618 adaptateurs avec une description de leur utilisation :
621 <table id="zend.translate.using.options.alloptions">
622 <title>Options des adaptateurs de traduction</title>
627 <entry>Adaptateur</entry>
628 <entry>Option</entry>
629 <entry>Valeur standard</entry>
630 <entry>Description</entry>
637 <entry><code>clear</code></entry>
638 <entry><constant>FALSE</constant></entry>
639 <entry>Si réglé à <constant>TRUE</constant>, les traductions déjà lues seront
640 effacées. Ceci peut être utilisé au lieu de créer une nouvelle instance
641 quand on lit de nouvelles données de traduction.</entry>
646 <entry><code>disableNotices</code></entry>
647 <entry><constant>FALSE</constant></entry>
648 <entry>Si réglé à <constant>TRUE</constant>, toutes les notices concernant la
649 non-disponibilité des traductions seront désactivées. Vous devriez
650 mettre cette option à <constant>TRUE</constant> dans votre environnement de
656 <entry><code>ignore</code></entry>
657 <entry><emphasis>.</emphasis></entry>
658 <entry>Tous les dossiers et les fichiers commençant par ce caractère
659 seront ignorés dans la recherche automatique de traductions. La valeur
660 par défaut est <emphasis>'.'</emphasis>, ce qui signifie que tous les
661 fichiers cachés (Unix) seront ignorés. Mettre une valeur par exemple à
662 'tmp' aura pour effet d'ignorer les dossiers ou fichiers 'tmpImages' ou
663 encore 'tmpFiles' (par exemple), ainsi que tous les
664 sous-dossiers</entry>
670 <entry><emphasis>null</emphasis></entry>
671 <entry>An instance of Zend_Log where untranslated messages and notices will
672 be written to</entry>
676 <entry>logMessage</entry>
678 <entry>The message which will be written into the log</entry>
680 <emphasis>Untranslated message within '%locale%': %message%</emphasis>
686 <entry>logUntranslated</entry>
687 <entry><emphasis>false</emphasis></entry>
688 <entry>When this option is set to true, all message id's which can not be
689 translated will be written into a also attached log</entry>
694 <entry><code>scan</code></entry>
695 <entry><constant>NULL</constant></entry>
696 <entry>Si réglé à <constant>NULL</constant>, aucun scan de la structure de
697 répertoire ne sera effectué. Si réglé à
698 <classname>Zend_Translate::LOCALE_DIRECTORY</classname>, la localisation
699 sera détectée dans le répertoire. Si réglé à
700 <classname>Zend_Translate::LOCALE_FILENAME</classname>, la localisation
701 sera détectée dans le nom de fichier. Voir <xref
702 linkend="zend.translate.using.detection" /> pour de plus amples
708 <entry><code>delimiter</code></entry>
709 <entry><code>;</code></entry>
710 <entry>Définit quel signe est utilisé pour la séparation de la source et
711 de la traduction.</entry>
716 <entry><code>length</code></entry>
717 <entry><code>0</code></entry>
718 <entry>Définit la longueur maximum d'une ligne de fichier. Réglé à 0, la
719 recherche sera automatique.</entry>
724 <entry><code>enclosure</code></entry>
725 <entry><code>"</code></entry>
726 <entry>Définit le caractère d'échappement.</entry>
733 Si vous souhaitez avoir vos propres définitions d'options, vous pouvez les
734 utiliser avec tous les adaptateurs. La méthode <methodname>setOptions()</methodname> peut être
735 utilisée pour définir vos options. La méthode <methodname>setOptions()</methodname> nécessite un
736 tableau avec les options que vous voulez paramétrer. Si une option fournie existe déjà,
737 elle sera alors ré-assignée. Vous pouvez définir autant d'options que nécessaire car
738 elles ne seront pas vérifiées par l'adaptateur. Vérifiez simplement que vous ne créez
739 pas une option qui existe déjà dans l'adaptateur, vous affecteriez alors une nouvelle
744 Pour récupérer l'ensemble des options, vous pouvez utiliser la méthode
745 <methodname>getOptions()</methodname>. Quand <methodname>getOptions()</methodname> est appelée sans paramètre,
746 elle retourne l'ensemble des options. Si un paramètre est fourni, seule l'option
747 particulière sera retournée.
751 <sect2 id="zend.translate.using.languages">
752 <title>Gérer les langues</title>
755 En travaillant avec différentes langues il y a quelques méthodes qui seront
760 La méthode <methodname>getLocale()</methodname> peut être utilisée pour récupérer la langue
761 actuellement réglée. Elle peut retourner soit une instance de
762 <classname>Zend_Locale</classname>, soit un identifiant de localisation.
766 La méthode <methodname>setLocale()</methodname> règle une nouvelle langue standard pour la
767 traduction. Ceci évite de placer le paramètre facultatif de langue plus d'une fois lors
768 de l'appel de la méthode <methodname>translate()</methodname>. Si la langue donnée n'existe pas, ou
769 si aucune donnée de traduction n'est disponible pour la langue, <methodname>setLocale()</methodname>
770 essaye de remonter à la langue sans région si elle est indiquée. Une langue
771 <code>fr_FR</code> serait remontée à <code>fr</code>. Si la remontée n'est pas possible,
772 une exception sera levée.
776 La méthode <methodname>isAvailable()</methodname> vérifie si une langue donnée est déjà
777 disponible. Elle retourne <constant>TRUE</constant> si des données existent pour la langue
782 Et enfin la méthode <methodname>getList()</methodname> peut être utilisée pour récupérer sous
783 la forme d'un tableau tous les langues paramétrées pour un adaptateur.
786 <example id="zend.translate.using.languages.example">
787 <title>Gestion des langues avec des adaptateurs</title>
789 <programlisting language="php"><![CDATA[
791 // retourne la langue paramétrée actuelle
792 $actual = $translate->getLocale();
795 // vous pouvez utiliser le paramètre optionel au moment de la traduction
796 echo $translate->_("mon_texte", "fr");
797 // ou paramètrer une langue standard
798 $translate->setLocale("fr");
799 echo $translate->_("mon_texte");
800 // référence à la langue de base... fr_CH sera remonté à fr
801 $translate->setLocale("fr_CH");
802 echo $translate->_("mon_texte");
804 // vérifie si la langue existe
805 if ($translate->isAvailable("fr")) {
811 <sect3 id="zend.translate.using.languages.automatic">
812 <title>Gestion automatique des langues</title>
815 Notez que tant que vous ajouterez les nouvelles sources de traduction
816 seulement via la méthode <methodname>addTranslation()</methodname>,
817 <classname>Zend_Translate</classname> cherchera automatiquement la langue
818 correspondant au mieux à votre environnement quand vous utiliserez une des
819 localisations automatiques "<code>auto</code>" ou "<code>browser</code>". Donc
820 normalement vous ne devriez pas appeler <methodname>setLocale()</methodname>. Ceci ne doit être
821 utilisé qu'en conjonction avec la détection automatique des sources de
826 L'algorithme recherchera la meilleure locale suivant le navigateur des
827 utilisateurs et votre environnement. Voyez l'exemple suivant pour les détails
831 <example id="zend.translate.using.languages.automatic.example">
832 <title>Comment la détection automatique de la langue fonctionne-t-elle ?</title>
834 <programlisting language="php"><![CDATA[
835 // Assumons que le navigateur retourne ces valeurs
836 // HTTP_ACCEPT_LANGUAGE = "de_AT=1;fr=1;en_US=0.8";
839 $translate = new Zend_Translate('gettext',
842 array('scan' => Zend_Translate::LOCALE_FILENAME);
843 // pas de langue trouvée, on retourne le messageid
846 $translate = new Zend_Translate('gettext',
849 array('scan' => Zend_Translate::LOCALE_FILENAME);
850 // langue correspondante trouvée "en_US"
853 $translate = new Zend_Translate('gettext',
856 array('scan' => Zend_Translate::LOCALE_FILENAME);
857 // langue correspondante trouvée "de" car "de_AT" est descendue à "de"
860 $translate = new Zend_Translate('gettext',
863 array('scan' => Zend_Translate::LOCALE_FILENAME);
864 $translate->addTranslation('\my_ru.mo', 'ru');
865 $translate->setLocale('it_IT');
866 // retourne "it_IT" comme source de traduction et surcharge le réglage automatique
871 Si vous utilisez <methodname>setLocale()</methodname>, la detection automatique de la
872 langue sera alors annulée, et la langue à utiliser sera celle spécifiée par l'appel
877 Si vous voulez réactiver la détection automatique, réappelez
878 <methodname>setLocale()</methodname> et passez lui la valeur <emphasis>auto</emphasis>.
882 Depuis Zend Framework 1.7.0 <classname>Zend_Translate</classname> reconnait
883 une locale globale pour l'application. Vous pouvez ainsi simplement mettre un objet
884 <classname>Zend_Locale</classname> dans le registre, comme montré ci-après. Avec
885 cette fonctionnalité, vous pouvez oublier le passage de la locale à votre objet de
889 <programlisting language="php"><![CDATA[
890 // En fichier d'amorçage (bootstrap)
891 $locale = new Zend_Locale('de_AT');
892 Zend_Registry::set('Zend_Locale', $locale);
894 // ailleurs dans votre application
895 $translate = new Zend_Translate('gettext', '\my_de.mo');
896 $translate->getLocale();
901 <sect2 id="zend.translate.using.detection">
902 <title>Détéction automatique de la source</title>
905 Zend_Translate peut détecter les sources de traduction de manière automatique.
906 Ainsi vous n'avez pas à déclarer toutes les sources manuellement. Vous laissez
907 Zend_Translate faire ce travail et scanner complètement tout un répertoire à la
908 recherche de fichiers de langue de traduction.
913 La détection automatique des sources de traduction est disponible depuis Zend
914 Framework version 1.5.
919 L'utilisation est assez semblable à celle qui permet de spécifier une source de
920 langue. Vous devez simplement donner un dossier, et non plus un fichier, à l'adaptateur.
921 Ce dossier sera alors scanné
924 <example id="zend.translate.using.languages.directory.example">
925 <title>Scanner un dossier à la recherche de sources de traduction</title>
927 <programlisting language="php"><![CDATA[
928 // Soit la structure suivante :
930 // /language/login/login.tmx
931 // /language/logout/logout.tmx
932 // /language/error/loginerror.tmx
933 // /language/error/logouterror.tmx
935 $translate = new Zend_Translate('tmx', '/language');
940 Notez que Zend_Translate cherche dans tous les sous-repertoires. L'utilisation
941 devient alors relativement simple. Aussi, Zend_Translate ignorera tout fichier qui ne
942 l'interresse pas : des fichiers non représentatifs de traductions ou encore des fichiers
943 illisibles. Vérifiez donc que le dossier principal ne contienne que des fichiers de
944 traductions, car Zend_Translate ne renverra aucune erreur dans le cas contraire, il
945 ignorera simplement de tels fichiers.
950 Selon la compléxité de la récursivité, la traversée du répertoire principal
951 peut devenir longue et couteuse.
956 Dans notre exemple, nous utilisons l'adaptateur TMX qui inclut la langue à
957 utiliser dans le fichier en question. D'autres adaptateurs n'agissent pas comme cela,
958 ainsi les noms de fichiers devront comporter les noms des langues à considérer pour de
962 <sect3 id="zend.translate.using.detection.directory">
963 <title>La langue se trouve dans le nom des dossiers</title>
966 One way to include automatic language detection is to name the directories
967 related to the language which is used for the sources within this directory. This is
968 the easiest way and is used for example within standard gettext
973 Zend_Translate needs the 'scan' option to know that it should search the names
974 of all directories for languages. See the following example for details:
977 <example id="zend.translate.using.detection.directory.example">
978 <title>Directory scanning for languages</title>
980 <programlisting language="php"><![CDATA[
981 // expect we have the following structure
983 // /language/de/login/login.mo
984 // /language/de/error/loginerror.mo
985 // /language/en/login/login.mo
986 // /language/en/error/loginerror.mo
988 $translate = new Zend_Translate('gettext',
992 Zend_Translate::LOCALE_DIRECTORY));
998 This works only for adapters which do not include the language within the
999 source file. Using this option for example with TMX will be ignored. Also
1000 language definitions within the filename will be ignored when using this
1007 You should be aware if you have several subdirectories under the same
1008 structure. Expect we have a structure like
1009 <code>/language/module/de/en/file.mo</code>. The path contains in this case
1010 multiple strings which would be detected as locale. It could be eigther
1011 <code>de</code> or <code>en</code>. As the behaviour is, in this case, not
1012 declared it is recommended that you use file detection in such
1018 <sect3 id="zend.translate.using.detection.filename">
1019 <title>Language through filenames</title>
1022 Another way to detect the langage automatically is to use special filenames.
1023 You can either name the complete file or parts of a file with the used language. To
1024 use this way of detection you will have to set the 'scan' option at initiation.
1025 There are several ways of naming the sourcefiles which are described below:
1028 <example id="zend.translate.using.detection.filename.example">
1029 <title>Filename scanning for languages</title>
1031 <programlisting language="php"><![CDATA[
1032 // expect we have the following structure
1034 // /language/login/login_en.mo
1035 // /language/login/login_de.mo
1036 // /language/error/loginerror_en.mo
1037 // /language/error/loginerror_de.mo
1039 $translate = new Zend_Translate('gettext',
1043 Zend_Translate::LOCALE_FILENAME));
1044 ]]></programlisting>
1047 <sect4 id="zend.translate.using.detection.filename.complete">
1048 <title>Complete Filename</title>
1051 Having the whole file named after the language is the simplest way but
1052 only usable if you have only one file per directory.
1055 <programlisting><![CDATA[
1060 ]]></programlisting>
1063 <sect4 id="zend.translate.using.detection.filename.extension">
1064 <title>Extension of the file</title>
1067 Another very simple way if to use the extension of the file for the
1068 language detection. But this may be confusing because you will no longer know
1069 which file extension the file originally was.
1072 <programlisting><![CDATA[
1077 ]]></programlisting>
1080 <sect4 id="zend.translate.using.detection.filename.token">
1081 <title>Filename tokens</title>
1084 Zend_Translate is also captable of detecting the language if it is
1085 included within the filename. But if you use this way you will have to seperate
1086 the language with a token. There are three supported tokens which can be used: A
1087 point '.', a underline '_', or a hyphen '-'.
1090 <programlisting><![CDATA[
1092 view_en.mo -> detects english
1093 view_de.mo -> detects german
1094 view_it.mo -> detects italian
1095 ]]></programlisting>
1098 The first found token which can be detected as locale will be used. See
1099 the following example for details.
1102 <programlisting><![CDATA[
1104 view_en_de.mo -> detects english
1105 view_en_es.mo -> detects english and overwrites the first file
1106 because the same messageids are used
1107 view_it_it.mo -> detects italian
1108 ]]></programlisting>
1111 All three tokens are used to detect the locale. The first one is the point
1112 '.', the second is the underline '_' and the third the hyphen '-'. If you have
1113 several tokens within the filename the first found depending on the order of the
1114 tokens will be used. See the following example for details.
1117 <programlisting><![CDATA[
1119 view_en-it.mo -> detects english because '_' will be used before '-'
1120 view-en_it.mo -> detects italian because '_' will be used before '-'
1121 view_en.it.mo -> detects italian because '.' will be used before '_'
1122 ]]></programlisting>
1127 <sect2 id="zend.translate.using.istranslated">
1128 <title>Vérifier les traductions</title>
1131 Normalement le texte sera traduit sans aucun calcul. Mais il est quelquefois
1132 nécessaire si un texte est traduit ou non dans la source. Dans ce cas la méthode
1133 <methodname>isTranslated()</methodname> peut être utilisé.
1137 <methodname>isTranslated($messageId, $original = false, $locale = null)</methodname> prend
1138 comme premier paramètre le texte dont vous voulez vérifier que la traduction est
1139 possible. Et comme troisième paramètre optionnel la langue dont vous voulez connaître la
1140 traduction. Le second paramètre optionnel détermine si la traduction est fixée à la
1141 langue déclarée ou si une autre langue peut être utilisée. Si vous avez un texte qui
1142 peut être traduit en "fr" mais pas en "fr_fr" vous obtiendriez normalement la traduction
1143 fournie, mais avec <varname>$original</varname> réglé à <constant>TRUE</constant>, la méthode
1144 <methodname>isTranslated()</methodname> retournera <constant>FALSE</constant> dans ce cas.
1147 <example id="zend.translate.using.istranslated.example">
1148 <title>Vérifier si une texte est traduisible</title>
1150 <programlisting language="php"><![CDATA[
1151 $english = array('message1' => 'Nachricht 1',
1152 'message2' => 'Nachricht 2',
1153 'message3' => 'Nachricht 3');
1154 $translate = new Zend_Translate('array', $english, 'de_AT');
1156 if ($translate->isTranslated('message1')) {
1157 print "'message1' peut être traduit";
1159 if (!($translate->isTranslated('message1', true, 'de'))) {
1160 print "'message1' ne peut pas être traduit en 'de', "
1161 . "il est seulement disponible en 'de_AT'";
1163 if ($translate->isTranslated('message1', false, 'de')) {
1164 print "'message1' peut être traduit en 'de_AT' "
1165 . "et par conséquent en 'de'";}
1166 ]]></programlisting>
1170 <sect2 id="zend.translate.using.logging">
1172 <title>How to log not found translations</title>
1175 When you have a bigger site or you are creating the translation files manually, you
1176 often have the problem that some messages are not translated. But there is a easy
1177 solution for you when you are using <classname>Zend_Translate</classname>.
1181 You have to follow two or three simple steps. First, you have to create a instance of
1182 <classname>Zend_Log</classname>. And then you have to attach this instance to
1183 <classname>Zend_Translate</classname>. See the following example:
1186 <example id="zend.translate.using.logging.example">
1187 <title>Log translations</title>
1188 <programlisting language="php"><![CDATA[
1189 $translate = new Zend_Translate('gettext', $path, 'de');
1191 // Create a log instance
1192 $writer = new Zend_Log_Writer_Stream('/path/file.log');
1193 $log = new Zend_Log($writer);
1195 // Attach it to the translation instance
1196 $translate->setOptions(array(
1198 'logUntranslated' => true));
1200 $translate->translate('unknown string');
1201 ]]></programlisting>
1205 Now you will have in the log a new notice:
1206 <code>Untranslated message within 'de': unknown string</code>.
1211 You should note that any translation which can not be found will be logged. This
1212 means all translations when a user requests a not supported language. But also every
1213 request to a message which can not be translated will be logged. Be aware that when
1214 100 people request the same translation you will have 100 notices logged.
1219 This feature can not only be used to log messages but also to attach this not translated
1220 messages into a empty translation file. To archive this you will have to write your own
1221 log writer which writes the format you want to have and strips the prepending
1222 "Untranslated message" for you.
1226 You can also set the '<code>logMessage</code>' option when you want to have your own log
1227 message. Use the '<code>%message%</code>' token for placing the messageId within your log
1228 message, and the '<code>%locale%</code>' token for the requested locale. See the
1229 following example for a self defined log message:
1232 <example id="zend.translate.using.logging.example2">
1233 <title>Self defined log messages</title>
1234 <programlisting language="php"><![CDATA[
1235 $translate = new Zend_Translate('gettext', $path, 'de');
1237 // Create a log instance
1238 $writer = new Zend_Log_Writer_Stream('/path/to/file.log');
1239 $log = new Zend_Log($writer);
1241 // Attach it to the translation instance
1242 $translate->setOptions(array(
1244 'logMessage' => "Missing '%message%' within locale '%locale%'",
1245 'logUntranslated' => true));
1247 $translate->translate('unknown string');
1248 ]]></programlisting>
1253 <sect2 id="zend.translate.using.sourcedata">
1254 <title>Access to the source data</title>
1257 Of course sometimes it is useful to have access to the translation source data.
1258 Therefor two functions exist.
1262 The <methodname>getMessageIds($locale = null)</methodname> method returns all known message
1267 And the <methodname>getMessages($locale = null)</methodname> method returns the complete
1268 translation source as array. The message id is used as key and the translation data as
1273 Both methods accept an optional parameter <varname>$locale</varname> which, when set,
1274 returns the translation data for the specified language. If this parameter is not given,
1275 the actual set language will be used. Keep in mind that normally all translations should
1276 be available in all languages. Which means that in a normal situation you will not have
1277 to set this parameter.
1281 Additionally the <methodname>getMessages()</methodname> method is able to return the complete
1282 translation dictionary with the pseudo-locale 'all'. This will return all available
1283 translation data for each added locale.
1288 Attention: The returned array can be <emphasis>very big</emphasis>, depending
1289 on the count of added locales and the amount of translation data.
1293 <example id="zend.translate.using.sourcedata.example">
1294 <title>Handling languages with adapters</title>
1296 <programlisting language="php"><![CDATA[
1298 // returns all known message ids
1299 $messageids = $translate->getMessageIds();
1300 print_r($messageids);
1303 // or just for the specified language
1304 $messageids = $translate->getMessageIds('en_US');
1305 print_r($messageids);
1308 // returns all the complete translation data
1309 $source = $translate->getMessages();
1311 ]]></programlisting>