Sfoglia il codice sorgente

Added some french doc translations

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@18027 44c647ce-9c0f-0410-b52a-842ac1e357ba
doctorrock83 16 anni fa
parent
commit
f630a48ea7

+ 36 - 0
documentation/manual/fr/module_specs/Zend_Application-AvailableResources-Navigation.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect2 id="zend.application.available-resources.navigation">
+    <title>Zend_Application_Resource_Navigation</title>
+
+    <para>
+        <classname>Zend_Application_Resource_Navigation</classname> peut être utilisé pour configurer
+        une instance de <classname>Zend_Navigation</classname>. Les options de configurations sont les mêmes
+        que celles de <link linkend="zend.navigation.pages.common.options">
+            <classname>Zend_Navigation</classname></link>.
+    </para>
+
+    <para>
+        Une fois configuré, l'objet <classname>Zend_Navigation</classname> est ajouté à
+        <classname>Zend_View_Helper_Navigation</classname> par défaut.
+    </para>
+
+    <example id="zend.application.available-resources.navigation.configExample">
+        <title>Exemple de configuration de la ressource Navigation</title>
+
+        <para>
+            Voici un exemple de syntaxe <acronym>INI</acronym> concernant la configuration
+            de la ressource navigation.
+        </para>
+
+        <programlisting language="ini"><![CDATA[
+resources.navigation.pages.page1.label = "Nom de la première page"
+resources.navigation.pages.page1.route = "Route concernant la première page"
+
+; Page 2 est une sous-page de page 1
+resources.navigation.pages.page1.pages.page2.type = "Zend_Navigation_Page_Uri"
+resources.navigation.pages.page1.pages.page2.label = "Nom de la seconde page"
+resources.navigation.pages.page1.pages.page2.uri = "/url/to/page/2"
+]]></programlisting>
+    </example>
+</sect2>

+ 409 - 0
documentation/manual/fr/module_specs/Zend_Application-QuickStart.xml

@@ -0,0 +1,409 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.application.quick-start">
+    <title>Zend_Application démarrage rapide</title>
+
+    <para>
+        Il existe deux manières d'aborder
+        <classname>Zend_Application</classname>, elles dépendent de la manière dont vous commencez
+        votre projet. Dans tous les cas, vous devrez créer une classe
+        <classname>Bootstrap</classname> et un fichier de configuration.
+    </para>
+
+    <para>
+        Si vous souhaitez utiliser <classname>Zend_Tool</classname> pour créer votre projet,
+        continuez votre lecture. Si vous ajoutez
+        <classname>Zend_Application</classname> à un projet existant, vous devriez
+        <link linkend="zend.application.quick-start.manual">passer à la suite</link>.
+    </para>
+
+    <sect2 id="zend.application.quick-start.zend-tool">
+        <title>Utiliser Zend_Tool</title>
+
+        <para>
+            La manière la plus rapide d'utiliser <classname>Zend_Application</classname> est d'appeler
+            <classname>Zend_Tool</classname> pour créer votre projet. Ceci va aussi créer la classe de
+            <classname>Bootstrap</classname>.
+        </para>
+
+        <para>
+            Pour créer un projet, éxecutez la commande <command>zf</command> (sur les systèmes *nix):
+        </para>
+
+        <programlisting language="sh"><![CDATA[
+% zf create project newproject
+]]></programlisting>
+
+        <para>
+            Pour Windows, <filename>zf.bat</filename>:
+        </para>
+
+        <programlisting language="dos"><![CDATA[
+C:> zf.bat create project newproject
+]]></programlisting>
+
+        <para>
+            Ceci va créer une structure de projet ressemblant à:
+        </para>
+
+        <programlisting language="text"><![CDATA[
+newproject
+|-- application
+|   |-- Bootstrap.php
+|   |-- configs
+|   |   `-- application.ini
+|   |-- controllers
+|   |   |-- ErrorController.php
+|   |   `-- IndexController.php
+|   |-- models
+|   `-- views
+|       |-- helpers
+|       `-- scripts
+|           |-- error
+|           |   `-- error.phtml
+|           `-- index
+|               `-- index.phtml
+|-- library
+|-- public
+|   `-- index.php
+`-- tests
+    |-- application
+    |   `-- bootstrap.php
+    |-- library
+    |   `-- bootstrap.php
+    `-- phpunit.xml
+]]></programlisting>
+
+        <para>
+            Dans une telle structure, le bootstrap est
+            <filename>newproject/application/Bootstrap.php</filename>, et ressemble
+            en premier lieux à ceci:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
+{
+}
+]]></programlisting>
+
+        <para>
+            Notez aussi la présence d'un fichier de configuration
+            <filename>newproject/application/configs/application.ini</filename>, il contient:
+        </para>
+
+        <programlisting language="dosini"><![CDATA[
+[production]
+phpSettings.display_startup_errors = 0
+phpSettings.display_errors = 0
+includePaths.library = APPLICATION_PATH "/../library"
+bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
+bootstrap.class = "Bootstrap"
+resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
+
+[staging : production]
+
+[testing : production]
+phpSettings.display_startup_errors = 1
+phpSettings.display_errors = 1
+
+[development : production]
+phpSettings.display_startup_errors = 1
+phpSettings.display_errors = 1
+]]></programlisting>
+
+        <para>
+            Tous ces paramètres s'utilisent avec
+            <classname>Zend_Application</classname> et avec le bootstrap.
+        </para>
+
+        <para>
+            Un autre fichier intéressant est
+            <filename>newproject/public/index.php</filename>, qui invoque
+            <classname>Zend_Application</classname> et le démarre.
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Define path to application directory
+defined('APPLICATION_PATH')
+    || define('APPLICATION_PATH',
+              realpath(dirname(__FILE__) . '/../application'));
+
+// Define application environment
+defined('APPLICATION_ENV')
+    || define('APPLICATION_ENV',
+              (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV')
+                                         : 'production'));
+
+/** Zend_Application */
+require_once 'Zend/Application.php';
+
+// Create application, bootstrap, and run
+$application = new Zend_Application(
+    APPLICATION_ENV,
+    APPLICATION_PATH . '/configs/application.ini'
+);
+$application->bootstrap()
+            ->run();
+]]></programlisting>
+
+        <para>
+            Pour continuer le guide de démarrage rapide,<link
+            linkend="zend.application.quick-start.resources">voyez la section sur les
+            Ressources</link>.
+        </para>
+    </sect2>
+
+    <sect2 id="zend.application.quick-start.manual">
+        <title>Ajouter Zend_Application à votre existant</title>
+
+        <para>
+            Les bases de <classname>Zend_Application</classname> sont très simples:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                Créez un fichier <filename>application/Bootstrap.php</filename> contenant une classe
+                <classname>Bootstrap</classname>.
+            </para></listitem>
+
+            <listitem><para>
+                Créez un fichier <filename>application/configs/application.ini</filename>
+                contenant la configuration de base pour <classname>Zend_Application</classname>.
+            </para></listitem>
+
+            <listitem><para>
+                Modifiez <filename>public/index.php</filename> afin d'utiliser
+                <classname>Zend_Application</classname>.
+            </para></listitem>
+        </itemizedlist>
+
+        <para>
+            D'abord, créez la classe <classname>Bootstrap</classname> class. Dans le fichier
+            <filename>application/Bootstrap.php</filename>, voici le contenu:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
+{
+}
+]]></programlisting>
+
+        <para>
+            Créez maintenant votre configuration. Pour ce tutoriel, nous utilisons une syntaxe
+            <acronym>INI</acronym>, bien sûr une syntaxe <acronym>XML</acronym> ou
+            <acronym>PHP</acronym> est utilisable aussi. Créez donc le fichier
+            <filename>application/configs/application.ini</filename>, et ajoutez lui ce contenu:
+        </para>
+
+        <programlisting language="dosini"><![CDATA[
+[production]
+phpSettings.display_startup_errors = 0
+phpSettings.display_errors = 0
+includePaths.library = APPLICATION_PATH "/../library"
+bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
+bootstrap.class = "Bootstrap"
+resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
+
+[staging : production]
+
+[testing : production]
+phpSettings.display_startup_errors = 1
+phpSettings.display_errors = 1
+
+[development : production]
+phpSettings.display_startup_errors = 1
+phpSettings.display_errors = 1
+]]></programlisting>
+
+        <para>
+            Maintenant, modifions le script de démarrage
+            <filename>public/index.php</filename>. Si le fichier n'existe pas, créez le, et placez ce contenu dedans:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Define path to application directory
+defined('APPLICATION_PATH')
+    || define('APPLICATION_PATH',
+              realpath(dirname(__FILE__) . '/../application'));
+
+// Define application environment
+defined('APPLICATION_ENV')
+    || define('APPLICATION_ENV',
+              (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV')
+                                         : 'production'));
+
+// Typically, you will also want to add your library/ directory
+// to the include_path, particularly if it contains your ZF installed
+set_include_path(implode(PATH_SEPARATOR, array(
+    dirname(dirname(__FILE__)) . '/library',
+    get_include_path(),
+)));
+
+/** Zend_Application */
+require_once 'Zend/Application.php';
+
+// Create application, bootstrap, and run
+$application = new Zend_Application(
+    APPLICATION_ENV,
+    APPLICATION_PATH . '/configs/application.ini'
+);
+$application->bootstrap()
+            ->run();
+]]></programlisting>
+
+        <para>
+            Notez que l'environnement applicatif est défini dans une constante
+            "APPLICATION_ENV". Nous recommandons la spécification d'un tel paramètre dans la configuration
+            générale du serveur web. Pour Apache, vous pouvez utiliser <filename>.htaccess</filename>
+            si votre serveur le permet. Nous recommandons un fichier <filename>public/.htaccess</filename>
+            avec le contenu suivant:
+        </para>
+
+        <programlisting language="conf"><![CDATA[
+SetEnv APPLICATION_ENV development
+
+RewriteEngine On
+RewriteCond %{REQUEST_FILENAME} -s [OR]
+RewriteCond %{REQUEST_FILENAME} -l [OR]
+RewriteCond %{REQUEST_FILENAME} -d
+RewriteRule ^.*$ - [NC,L]
+RewriteRule ^.*$ index.php [NC,L]
+]]></programlisting>
+
+        <note>
+            <title>Apprenez mod_rewrite</title>
+
+            <para>
+                Les règles de réécriture ci-dessus autorisent l'accès à tout fichier existant
+                dans l'hôte virtuel. S'il existe des fichiers que vous ne voulez pas exposer, utilisez
+                des règles plus restrictives. Le site web d'Apache <ulink
+                    url="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">vous permettra d'en apprendre
+                plus au sujet de mod_rewrite</ulink>.
+            </para>
+        </note>
+
+        <para>
+            Voila, à partir de maintenant nous sommes prêts à tirer partie de la puissance de
+            <classname>Zend_Application</classname>.
+        </para>
+    </sect2>
+
+    <sect2 id="zend.application.quick-start.resources">
+        <title>Ajouter et créer des ressources</title>
+
+        <para>
+            Si vous avez suivi les instructions jusqu'à maintenant, alors votre classe de
+            bootstrap utilisera le contrôleur frontal et lorsque lancée, lancera le dispatch
+            du contrôleur frontal. En vérité, il va être rapidement nécessaire de rajouter de
+            la configuration, concernant d'autres objets divers (appelés "ressources").
+        </para>
+
+        <para>
+            Nous allons voir ici comment créer et configurer des ressources. D'abord un layout,
+            puis nous personnaliserons un objet de vue.
+        </para>
+
+        <para>
+            Une ressource assez standard proposée par
+            <classname>Zend_Application</classname> est "layout". Cette ressource attend
+            une configuration qu'elle fera suivre immédiatement à
+            <classname>Zend_Layout</classname>.
+        </para>
+
+        <para>
+            Pour l'utiliser, vous devrez modifier votre fichier de configuration comme suit:
+        </para>
+
+        <programlisting language="dosini"><![CDATA[
+[production]
+phpSettings.display_startup_errors = 0
+phpSettings.display_errors = 0
+bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
+bootstrap.class = "Bootstrap"
+resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
+
+; AJOUTEZ CES LIGNES
+resources.layout.layout = "layout"
+resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
+
+[staging : production]
+
+[testing : production]
+phpSettings.display_startup_errors = 1
+phpSettings.display_errors = 1
+
+[development : production]
+phpSettings.display_startup_errors = 1
+phpSettings.display_errors = 1
+]]></programlisting>
+
+        <para>
+            Si ce n'est pas déja fait, créez le dossier
+            <filename>application/layouts/scripts/</filename>, et le fichier
+            <filename>layout.phtml</filename> dans ce même dossier. Voici un exemple de script
+            de layout tout à fait classique:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+<?php echo $this->doctype() ?>
+<html>
+<head>
+    <?php echo $this->headTitle() ?>
+    <?php echo $this->headLink() ?>
+    <?php echo $this->headStyle() ?>
+    <?php echo $this->headScript() ?>
+</head>
+<body>
+    <?php echo $this->layout()->content ?>
+</body>
+</html>
+]]></programlisting>
+
+        <para>
+            Voila, vous avez un layout fonctionnel.
+        </para>
+
+        <para>
+            Maintenant passons à la vue. Nous voulons un DocType <acronym>HTML</acronym> et
+            une valeur de titre par défaut à utiliser dans la partie "head". Nous pouvons
+            ordonner ceci en éditant la classe
+            <classname>Bootstrap</classname> et en ajoutant une méthode
+        </para>
+
+        <programlisting language="php"><![CDATA[
+class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
+{
+    protected function _initView()
+    {
+        // Initialisons la view
+        $view = new Zend_View();
+        $view->doctype('XHTML1_STRICT');
+        $view->headTitle('My First Zend Framework Application');
+
+        // Ajoutons la au ViewRenderer
+        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
+            'ViewRenderer'
+        );
+        $viewRenderer->setView($view);
+
+        // Retourner la vue pour qu'elle puisse être stockée par le bootstrap
+        return $view;
+    }
+}
+]]></programlisting>
+
+        <para>
+            Cette méthode va être lancée automatiquement lors du bootstrap et configurera une vue.
+        </para>
+    </sect2>
+
+    <sect2 id="zend.application.quick-start.next-steps">
+        <title>Aller plus loin avec Zend_Application</title>
+
+        <para>
+            Nous vennons de voir comment configurer de manière basique <classname>Zend_Application</classname>
+            ainsi que les principes du bootstrap. Pour un maximum de réutilisation de code, vous devriez
+            songer à utiliser des plugins de ressources. Continuez à lire la suite!
+        </para>
+    </sect2>
+</sect1>

+ 256 - 0
documentation/manual/fr/module_specs/Zend_Filter-Encryption.xml

@@ -0,0 +1,256 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect2 id="zend.filter.set.encrypt">
+    <title>Encrypt</title>
+    <para>
+        Ce filtre va crypter toute chaine avec les paramètres spécifiés. Des adaptateurs sont utilisés.
+        Actuellement, il existe des adaptateurs pour les extensions PHP <code>Mcrypt</code> et
+        <code>OpenSSL</code>.
+    </para>
+
+    <para>
+        Comme ces deux méthodes d'encryptage sont très différentes, l'utilisation de leurs adaptateurs
+        l'est aussi.
+    </para>
+
+    <programlisting language="php"><![CDATA[
+// Utiliser Mcrypt
+$filter1 = new Zend_Filter_Encrypt(array('adapter' => 'mcrypt'));
+
+// Utiliser OpenSSL
+$filter2 = new Zend_Filter_Encrypt(array('adapter' => 'openssl'));
+]]></programlisting>
+
+    <para>
+        Les méthodes <code>setAdapter()</code> et <code>getAdapter()</code> existent aussi.
+    </para>
+
+    <programlisting language="php"><![CDATA[
+// Utiliser Mcrypt
+$filter = new Zend_Filter_Encrypt();
+$filter->setAdapter('openssl');
+]]></programlisting>
+
+    <note>
+        <para>
+            Si vous ne précisez pas d'adaptateur, <code>Mcrypt</code> est utilisé par défaut.
+        </para>
+    </note>
+
+    <sect3 id="zend.filter.set.encrypt.mcrypt">
+        <title>Cryptage avec Mcrypt</title>
+        <para>
+            Cet adaptateur nécessite la présence de l'extension PHP <code>Mcrypt</code>. Voici ses options:
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    <emphasis>key</emphasis>: La clé d'encryptage. Cette même clé sera nécessaire pour le
+                    décryptage.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>algorithm</emphasis>: L'algorithme à utiliser pour le cryptage. Voyez
+                    <ulink url="http://php.net/mcrypt">PHP's mcrypt ciphers</ulink>. Si non précisé,
+                    <code>blowfish</code> sera utilisé par défaut.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>algorithm_directory</emphasis>: Le dossier dans lequel se trouve l'algorithme. Si
+                    non précisé, le dossier spécifié par l'extension mcrypt est alors utilisé.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>mode</emphasis>: Le mode de cryptage à utiliser. Un des 
+                    <ulink url="http://php.net/mcrypt">modes mcrypt</ulink> doit être utilisé.
+                    Par défaut, <code>cbc</code> est utilisé.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>mode_directory</emphasis>: Le dossier dans lequel se trouve le mode. Si
+                    non précisé, le dossier spécifié par l'extension mcrypt est alors utilisé.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>vector</emphasis>: Le vecteur d'initialisation à utiliser. Un vecteur aléatoire 
+                    est utilisé si non précisé.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>salt</emphasis>: Si la clé doit être utilisé comme grain de sel. Dans ce cas la clé
+                    utilisée pour le cryptage sera elle même cryptée. Par défaut false : ce n'est pas le cas.
+                </para>
+            </listitem>
+        </itemizedlist>
+
+        <para>
+            Si vous passez une chaine à la place d'un tableau pour la clé, celle-ci sera utilisée.
+        </para>
+
+        <para>
+            Les méthodes <code>getEncryption()</code> et <code>setEncryption()</code> sont aussi présentes.
+        </para>
+
+        <note>
+            <para>
+                Une exception sera levée si l'extension PHP mcrypt n'est pas disponible.
+            </para>
+        </note>
+
+        <note>
+            <para>
+                Notez aussi que tous vos paramètres utilisés à la création de l'instance ou avec setEncryption()
+                vont être vérifiés. Si mcrypt détecte un problème, une exception sera levée.
+            </para>
+        </note>
+
+        <para>
+            <code>getVector()</code> et <code>setVector()</code> sont aussi disponibles si besoin.
+            Une chaine passée sera mise à la taille du vecteur pour être utilisée avec l'algorithme en cours.
+        </para>
+
+        <note>
+            <para>
+                Notez que si vous n'utilisez pas un vecteur spécifique, alors vous devrez le récupérer et le stocker.
+                En effet, celui-ci est indispensable pour décoder la valeur dans le futur.
+            </para>
+        </note>
+
+        <programlisting language="php"><![CDATA[
+// Utilise blowfish par défaut
+$filter = new Zend_Filter_Encrypt('myencryptionkey');
+
+// Affecte un vecteur précis.
+$filter->setVector('myvector');
+// $filter->getVector(); est nécessaire sinon, pour décoder la valeur plus tard
+
+$encrypted = $filter->filter('text_to_be_encoded');
+print $encrypted;
+
+// Pour le décryptage, voyez le code du filtre Decrypt
+]]></programlisting>
+    </sect3>
+
+    <sect3 id="zend.filter.set.encrypt.openssl">
+        <title>Cryptage avec OpenSSL</title>
+        <para>
+            Lorsque vous avez installé l'extension PHP <code>OpenSSL</code>, vous pouvez utiliser l'adaptateur
+            du même nom, dont voici les options d'instanciation:
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    <emphasis>public</emphasis>: La clé publique de l'utilisateur auquel vous voulez proposer
+                    du contenu crypté. Plusieurs clés peuvent être spécifiées via un tableau. Il est possible
+                    de préciser le contenu de la clé, ou alors un chemin vers une clé.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>private</emphasis>: Votre clé privée utilisée pour crypter le contenu.
+                    La encore la clé peut être précisée sous forme textuelle, ou alors un chemin vers
+                    un fichier contenant la clé.
+                </para>
+            </listitem>
+        </itemizedlist>
+
+        <para>
+            <code>getPublicKey()</code> et <code>setPublicKey()</code> sont aussi présentes, ainsi que
+            <code>getPrivateKey()</code> et <code>setPrivateKey()</code>.
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Utiliser openssl
+$filter = new Zend_Filter_Encrypt(array(
+    'adapter' => 'openssl',
+    'private' => '/path/to/mykey/private.pem'
+));
+
+// utilisation des méthodes
+$filter->setPublicKey(array(
+    '/public/key/path/first.pem',
+    '/public/key/path/second.pem'
+));
+]]></programlisting>
+
+        <note>
+            <para>
+                Attention l'adaptateur <code>OpenSSL</code> ne fonctionnera pas si vous ne passez pas des clés
+                valides.
+            </para>
+        </note>
+
+        <para>
+            Si vous souhaitez encoder aussi les clés, passez alors une passphrase via
+            <code>setPassphrase()</code>. Attention, la passphrase sera nécessaire pour décoder les clés.
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Utilise openssl avec une clé privée
+$filter = new Zend_Filter_Encrypt(array(
+    'adapter' => 'openssl',
+    'private' => '/path/to/mykey/private.pem'
+));
+
+// utilisation des méthodes pour specifier la clé publique
+$filter->setPublicKey(array(
+    '/public/key/path/first.pem',
+    '/public/key/path/second.pem'
+));
+$filter->setPassphrase('mypassphrase');
+]]></programlisting>
+
+        <para>
+            Pour décrypter le document, la passphrase (si utilisée) et les clés enveloppe sont nécessaires.
+        </para>
+
+        <para>
+            Ceci signifie que vous devez appeler la méthode <code>getEnvelopeKey()</code> après le cryptage
+            pour récupérer l'enveloppe.
+        </para>
+
+        <para>
+            Voici donc un exemple complet de cryptage de données avec <code>OpenSSL</code>.
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Utilisons openssl avec une clé privée
+$filter = new Zend_Filter_Encrypt(array(
+    'adapter' => 'openssl',
+    'private' => '/path/to/mykey/private.pem'
+));
+
+// Voici la clé publique
+$filter->setPublicKey(array(
+    '/public/key/path/first.pem',
+    '/public/key/path/second.pem'
+));
+$filter->setPassphrase('mypassphrase');
+
+$encrypted = $filter->filter('text_to_be_encoded');
+$envelope  = $filter->getEnvelopeKey();
+print $encrypted;
+
+// Le décryptage est expliqué dans le filtre Decrypt
+]]></programlisting>
+    </sect3>
+</sect2>
+
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 183 - 0
documentation/manual/fr/module_specs/Zend_Filter-LocalizedToNormalized.xml

@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect2 id="zend.filter.set.localizedtonormalized">
+
+    <title>LocalizedToNormalized</title>
+
+    <para>
+        Ce filtre va transformer toute entrée localisée en sa représentation normalisée. La transformation est effectuée
+        grâce à <classname>Zend_Locale</classname> en interne.
+    </para>
+
+    <para>
+        Ceci permet à l'utilisateur de saisir des information dans sa propre locale, et du coté serveur de stocker les informations
+        normalisées relatives.
+    </para>
+
+    <note>
+        <para>
+            Attention la normalisation n'est pas de la traduction. Ce filtre ne sait pas traduire des chaines d'un langage à un autre.
+        </para>
+    </note>
+
+    <para>
+        Les types suivants peuvent être normalisés:
+    </para>
+
+    <itemizedlist>
+        <listitem>
+            <para>
+                <emphasis>entiers</emphasis>: Nombres entiers localisés. Ils seront normalisés
+                dans la notation anglaise internationnale.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                <emphasis>float</emphasis>: Nombres flottants. Ils seront normalisés
+                dans la notation anglaise internationnale.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                <emphasis>nombres</emphasis>: Nombres réels. Ils seront normalisés
+                dans la notation anglaise internationnale.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                <emphasis>time</emphasis>: Valeurs de temps. Normalisées sous forme de tableaux.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                <emphasis>date</emphasis>: Valeurs de date. Normalisées sous forme de tableaux.
+            </para>
+        </listitem>
+    </itemizedlist>
+
+    <para>
+        Tout autre type d'entrée sera retourné tel quel, sans tranformation, par ce filtre.
+    </para>
+
+    <note>
+        <para>
+            Notez bien que toute sortie normalisée de ce filtre est de type chaine de caractères.
+        </para>
+    </note>
+
+    <sect3 id="zend.filter.set.localizedtonormalized.numbers">
+
+        <title>Normaliser des nombres</title>
+
+        <para>
+            Tout type de nombre peut être normalisé, excepté les nombres représentant une notation scientifique.
+        </para>
+
+        <para>
+            Voici un exemple:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Initialise le filtre
+$filter = new Zend_Filter_LocalizedToNormalized();
+$filter->filter('123.456,78');
+// retourne '123456.78'
+]]></programlisting>
+
+        <para>
+            Imaginons que nous utilisoons la locale 'de' de manière globale sur toute l'application.
+            <classname>Zend_Filter_LocalizedToNormalized</classname> va utiliser cette locale là pour calculer sa sortie.
+        </para>
+
+        <para>
+            Il est possible de contrôler la normalisation des nombres. Toute options accépté par 
+            <classname>Zend_Locale_Format</classname> peut alors être utilisée. Les plus courantes sont:
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    <emphasis>date_format</emphasis>
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>locale</emphasis>
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>precision</emphasis>
+                </para>
+            </listitem>
+        </itemizedlist>
+
+        <para>
+            Pour plus de détails à ce sujet, voyez le chapitre <link linkend="zend.locale.parsing">
+            Zend_Locale</link>.
+        </para>
+
+        <para>
+            Voici un exemple utilisant la précision:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Numeric Filter
+$filter = new Zend_Filter_LocalizedToNormalized(array('precision' => 2));
+
+$filter->filter('123.456');
+// retourne '123456.00'
+
+$filter->filter('123.456,78901');
+// retourne '123456.79'
+]]></programlisting>
+
+    </sect3>
+
+    <sect3 id="zend.filter.set.localizedtonormalized.dates">
+
+        <title>Normaliser des dates et des temps</title>
+
+        <para>
+            Les dates et temps peuvent être normalisés eux aussi. La sortie du filtre sera alors toujours de type tableau.
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Initialise le filtre
+$filter = new Zend_Filter_LocalizedToNormalized();
+$filter->filter('12.April.2009');
+// retourne array('day' => '12', 'month' => '04', 'year' => '2009')
+]]></programlisting>
+
+        <para>
+            Imaginons une fois de plus une locale globale 'de'. L'entrée est donc automatiquement reconnue comme date
+            et vous aurez un tableau en sortie.
+        </para>
+
+        <para>
+            Vous pouvez contrôler la transformation du filtre grâce aux paramètres
+            <emphasis>date_format</emphasis> et <emphasis>locale</emphasis>.
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Date Filter
+$filter = new Zend_Filter_LocalizedToNormalized(
+    array('date_format' => 'ss:mm:HH')
+);
+
+$filter->filter('11:22:33');
+// retourne array('hour' => '33', 'minute' => '22', 'second' => '11')
+]]></programlisting>
+    </sect3>
+
+</sect2>
+
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 178 - 0
documentation/manual/fr/module_specs/Zend_Filter-NormalizedToLocalized.xml

@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect2 id="zend.filter.set.normalizedtolocalized">
+
+    <title>NormalizedToLocalized</title>
+
+    <para>
+        Ce filtre est l'inverse de
+        <classname>Zend_Filter_LocalizedToNormalized</classname> et convertira toute entrée normalisée
+        en entrée localisée. Il utilise <classname>Zend_Locale</classname> pour celà.
+    </para>
+
+    <para>
+        Ceci permet de représenter une valeur normalisée dans la locale de l'utilisateur, qu'il reconnaitra
+        donc sans problème.
+    </para>
+
+    <note>
+        <para>
+            Notez bien que la localisation n'est pas de la traduction, ce filtre ne sait pas traduire des chaines
+            d'une langue à l'autre (comme des noms de jours ou de mois).
+        </para>
+    </note>
+
+    <para>
+        Les types suivants peuvent être localisés:
+    </para>
+
+    <itemizedlist>
+        <listitem>
+            <para>
+                <emphasis>entiers</emphasis>: Nombres entiers.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                <emphasis>float</emphasis>: Nombres flottants.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                <emphasis>nombres</emphasis>: Autres nombres, comme les réels.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                <emphasis>temps</emphasis>: Valeurs de temps, localisées sous forme de chaines.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                <emphasis>date</emphasis>: Valeurs de dates, localisées sour forme de chaines.
+            </para>
+        </listitem>
+    </itemizedlist>
+
+    <para>
+        Tout autre type d'entrée sera retourné tel quel, sans transformation.
+    </para>
+
+    <sect3 id="zend.filter.set.normalizedtolocalized.numbers">
+
+        <title>Localisation des nombres</title>
+
+        <para>
+            Tout type de nombre peut être localisé, à l'exception des nombres représentant une notation scientifique.
+        </para>
+
+        <para>
+            Comment fonctionne la localisation pour les nombres ?:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Initialise le filtre
+$filter = new Zend_Filter_NormalizedToLocalized();
+$filter->filter(123456.78);
+// retourne '123.456,78'
+]]></programlisting>
+
+        <para>
+            Imaginons que vous avez affecté une locale 'de' comme locale de l'application.
+            <classname>Zend_Filter_NormalizedToLocalized</classname> va utiliser cette locale
+            pour détecter le type de sortie à produire, ceci sous forme de chaine de caractères.
+        </para>
+
+        <para>
+            Il est aussi possible de contrôler le look de vos nombres localisés. Pour cela vous pouvez préciser toute option
+            que <classname>Zend_Locale_Format</classname> reconnait. Les plus courantes sont:
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    <emphasis>date_format</emphasis>
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>locale</emphasis>
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>precision</emphasis>
+                </para>
+            </listitem>
+        </itemizedlist>
+
+        <para>
+            Pour plus de détails sur ces options, voyez le <link linkend="zend.locale.parsing"> chapitre sur
+            Zend_Locale </link>.
+        </para>
+
+        <para>
+            Voici un exemple utilisant ces options:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Numeric Filter
+$filter = new Zend_Filter_NormalizedToLocalized(array('precision' => 2));
+
+$filter->filter(123456);
+// retourne '123.456,00'
+
+$filter->filter(123456.78901);
+// retourne '123.456,79'
+]]></programlisting>
+
+    </sect3>
+
+    <sect3 id="zend.filter.set.normalizedtolocalized.dates">
+
+        <title>Localiser des dates et des temps</title>
+
+        <para>
+            Les dates et les temps peuvent aussi être localisés. Des chaines de caractères sont alors retournées,
+            agissant avec la locale définie.
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Initialise le filtre
+$filter = new Zend_Filter_NormalizedToLocalized();
+$filter->filter(array('day' => '12', 'month' => '04', 'year' => '2009');
+// retoures '12.04.2009'
+]]></programlisting>
+
+        <para>
+            Imaginons que vous ayiez spécifié la locale 'de' au niveau de l'application, celle-ci est alors
+            automatiquement détectée et utilisée pour localiser la date.
+        </para>
+
+        <para>
+            Bien sûr, vous pouvez contrôler le format d'affichage de vos dates, grâce aux paramètres
+            <emphasis>date_format</emphasis> et <emphasis>locale</emphasis>.
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Date Filter
+$filter = new Zend_Filter_LocalizedToNormalized(
+    array('date_format' => 'ss:mm:HH')
+);
+
+$filter->filter(array('hour' => '33', 'minute' => '22', 'second' => '11'));
+// retourne '11:22:33'
+]]></programlisting>
+    </sect3>
+
+</sect2>
+
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 49 - 0
documentation/manual/fr/module_specs/Zend_Filter-StringToLower.xml

@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect2 id="zend.filter.set.stringtolower">
+    <title>StringToLower</title>
+
+    <para>
+        Ce filtre convertit toute entrée vers des caractères minuscules.
+    </para>
+
+    <programlisting language="php"><![CDATA[
+$filter = new Zend_Filter_StringToLower();
+
+print $filter->filter('SAMPLE');
+// retourne "sample"
+]]></programlisting>
+
+    <para>
+        Par défaut, seul le jeu de caractères de la locale en cours sera utilisé. Les caractères provenant
+        d'autres jeux seront ignorés. Cela reste possible de les passer en minuscules si l'extension mbstring
+        est présente dans votre environnement PHP. Indiquez l'encodage voulu à la création du filtre
+        <classname>StringToLower</classname> ou utilisez sa méthode
+        <methodname>setEncoding()</methodname>.
+    </para>
+
+    <programlisting language="php"><![CDATA[
+// utiliser UTF-8
+$filter = new Zend_Filter_StringToLower('UTF-8');
+
+// ou passer un tableau
+$filter = new Zend_Filter_StringToLower(array('encoding' => 'UTF-8'));
+
+// ou encore faire cela après coup
+$filter->setEncoding('ISO-8859-1');
+]]></programlisting>
+
+    <note>
+        <title>Préciser des mauvais encodages</title>
+
+        <para>
+            Attention une exception sera levée si vous précisez un encodage alors que l'extension
+            mbstring est absente.
+        </para>
+
+        <para>
+            Une exception sera de même levée si l'encodage que vous précisez n'est pas pris en compte
+            par mbstring.
+        </para>
+    </note>
+</sect2>

+ 29 - 0
documentation/manual/fr/module_specs/Zend_Filter-StringToUpper.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect2 id="zend.filter.set.stringtoupper">
+    <title>StringToUpper</title>
+
+    <para>
+        Ce filtre convertit toute entrée vers une casse majuscule.
+    </para>
+
+    <programlisting language="php"><![CDATA[
+$filter = new Zend_Filter_StringToUpper();
+
+print $filter->filter('Sample');
+// retourne "SAMPLE"
+]]></programlisting>
+
+    <para>
+        Tout comme le filtre <classname>StringToLower</classname>, seul le jeu de
+        caractères de la locale en cours sera utilisé. Son fonctionnement est le même
+        que celui de <classname>StringToLower</classname>.
+    </para>
+
+    <programlisting language="php"><![CDATA[
+$filter = new Zend_Filter_StringToUpper(array('encoding' => 'UTF-8'));
+
+// ou encore
+$filter->setEncoding('ISO-8859-1');
+]]></programlisting>
+</sect2>

+ 89 - 0
documentation/manual/fr/module_specs/Zend_Test-PHPUnit-Db-Adapter.xml

@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect2 id="zend.test.phpunit.db.adapter">
+    <title>Utiliser l'adaptateur de tests</title>
+
+    <para>
+        Il peut être nécessaire quelques fois de vouloir tester l'application, mais sans base de données
+        réelle physique. <classname>Zend_Test_DbAdapter</classname> offre des possibilités d'utiliser
+        une implémentation de <classname>Zend_Db_Adapter_Abstract</classname> sans avoir à ouvrir une
+        connexion vers une base physique. En plus, cet adaptateur est très facilement déguisable car
+        aucun paramètre de constructeur n'est nécessaire.
+    </para>
+
+    <para>
+        L'adaptateur de tests agit comme une pile pour des résultats de base. L'ordre des résultats
+        doit être implémenté manuellement ce qui peut devenir assez complexe, mais cet adaptateur
+        est très pratique dans le cas où un ensemble logique de requêtes est éxecuté et que vous
+        connaissez l'ordre précis dans lequel les résultats doivent être retournés.
+    </para>
+
+    <programlisting language="php"><![CDATA[
+$adapter   = new Zend_Test_DbAdapter();
+$stmt1Rows = array(array('foo' => 'bar'), array('foo' => 'baz'));
+$stmt1     = Zend_Test_DbStatement::createSelectStatement($stmt1Rows);
+$adapter->appendStatementToStack($stmt1);
+
+$stmt2Rows = array(array('foo' => 'bar'), array('foo' => 'baz'));
+$stmt2     = Zend_Test_DbStatement::createSelectStatement($stmt2Rows);
+$adapter->appendStatementToStack($stmt2);
+
+$rs = $adapter->query('SELECT ...'); // Retourne Statement 2
+while ($row = $rs->fetch()) {
+    echo $rs['foo']; // Prints "Bar", "Baz"
+}
+$rs = $adapter->query('SELECT ...'); // Retourne Statement 1
+]]></programlisting>
+
+    <para>
+        Le comportement des adaptateurs réels est simulé afin que des méthodes telles que
+        <methodname>fetchAll()</methodname>, <methodname>fetchObject()</methodname>,
+        <methodname>fetchColumn()</methodname> puissent fonctionner avec l'adaptateur de tests.
+    </para>
+
+    <para>
+        Bien sûr, INSERT, UPDATE et DELETE peuvent être empilés aussi, mais vous ne pourrez alors tester
+        que <methodname>$stmt->rowCount()</methodname> car ces types de requêtes ne retournent pas de
+        résultats.
+    </para>
+
+    <programlisting language="php"><![CDATA[
+$adapter = new Zend_Test_DbAdapter();
+$adapter->appendStatementToStack(
+    Zend_Test_DbStatement::createInsertStatement(1)
+);
+$adapter->appendStatementToStack(
+    Zend_Test_DbStatement::createUpdateStatement(2)
+);
+$adapter->appendStatementToStack(
+    Zend_Test_DbStatement::createDeleteStatement(10
+));
+]]></programlisting>
+
+    <para>
+        Par défaut, le profiler est activé pour que vous puissiez récupérer la requête éxecutée de manière
+        textuelle, avec ses paramètres donc.
+    </para>
+
+    <programlisting language="php"><![CDATA[
+$adapter = new Zend_Test_DbAdapter();
+$stmt = $adapter->query("SELECT * FROM bugs");
+
+$qp = $adapter->getProfiler()->getLastQueryProfile();
+
+echo $qp->getQuerY(); // SELECT * FROM bugs
+]]>
+    </programlisting>
+
+    <para>
+        L'adaptateur de test ne vérifie jamais si la requête spécifiée est réellement de type SELECT, DELETE,
+        INSERT ou UPDATE. L'ordre exact de retour des données doit être spécifié manuellement dans l'adaptateur
+        de tests.
+    </para>
+
+    <para>
+        L'adaptateur de tests définit aussi les méthodes
+        <methodname>listTables()</methodname>, <methodname>describeTables()</methodname> et
+        <methodname>lastInsertId()</methodname>.
+    </para>
+</sect2>

+ 39 - 0
documentation/manual/fr/module_specs/Zend_Test-PHPUnit-Db.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.test.phpunit.db" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <title>Zend_Test_PHPUnit_Db</title>
+
+    <para>
+        Couper l'accès aux données au modèle métier requiert souvent l'utilisation d'une base de données
+        pour les tests. Mais la base est persistente entre les tests, et leur isolation est donc
+        rompue, de plus, configurer une base de données pour des tests peut vite s'avérer complexe.
+        L'extension sur les bases de données de PHPUnit simplifie les procédures de tests en offrant
+        des mécanismes de preconditions et postconditions sur la base entre les tests.
+        Ce composant étend donc l'extension base de données de PHPUnit en ajoutant du code spécifique
+        à Zend Framework.
+    </para>
+
+    <para>
+        Les tests de base de données peuvent être résumés en 2 notions : DataSets et DataTables.
+        En interne, PHPUnit peut créer un objet dont la structure est callée sur une base de données
+        dont les tables et les enregistrements sont montés depuis un fichier de configuration ou
+        un contenu réel. Cet objet abstrait peut alors être comparé à des structures.
+        Un cas courant en tests de base de données consiste à configurer des tables en les remplissant
+        de données fictives, éxecuter du code "utile", puis comparer la base de données avec une structure.
+        <classname>Zend_Test_PHPUnit_Db</classname> simplifie cette tâche en offrant la possibilité de créer
+        des DataSets et des DataTables provenant d'instances de <classname>Zend_Db_Table_Abstract</classname>
+        ou <classname>Zend_Db_Table_Rowset_Abstract</classname>.
+    </para>
+
+    <para>
+        Aussi, ce composant permet l'utilisation de n'importe quel
+        <classname>Zend_Db_Adapter_Abstract</classname> alors qu'à l'originine PHPUnit ne fonctionne
+        qu'avec <acronym>PDO</acronym>. Un adaptateur de test basé sur
+        <classname>Zend_Db_Adapter_Abstract</classname> est aussi inclus. Il permet d'instancier un adaptateur
+        qui ne requiert aucune base de données réelle.
+    </para>
+
+    <xi:include href="Zend_Test-PHPUnit-Db-Quickstart.xml" />
+    <xi:include href="Zend_Test-PHPUnit-Db-Testing.xml" />
+    <xi:include href="Zend_Test-PHPUnit-Db-Adapter.xml" />
+</sect1>

+ 276 - 0
documentation/manual/fr/module_specs/Zend_Translate-Plurals.xml

@@ -0,0 +1,276 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.translate.plurals">
+
+    <title>Notation des pluriels pour Translation</title>
+
+    <para>
+        Depuis Zend Framework 1.9, <classname>Zend_Translate</classname> gère les pluriels.
+        Comme presque tous les langages utilisent des pluriels, la traduction doit gérer celà.
+    </para>
+
+    <para>
+        Qu'est ce qu'un pluriel? En général, les pluriels sont des mots qui prennent en compte une contenance
+        numérique. Cependant chaque langue a sa propre définition du pluriel. En anglais, par exemple, un seul pluriel
+        par mot existe donc par exemple "car" donnera "cars" au pluriel. D'autres langages comme le russe
+        proposent plusieurs pluriels et plusieurs règles de pluriels.
+    </para>
+
+    <para>
+        Lorsque vous voulez utiliser les pluriels avec <classname>Zend_Translate</classname> vous n'avez pas besoin
+        de savoir comment ceux-ci sont définis, seul le traducteur sait. Vous devez juste savoir la langue dans laquelle
+        traduire.
+    </para>
+
+    <para>
+        Il existe 2 manières d'utiliser les pluriels. La traditionnelle qui vous fait utiliser une méthode,
+        la moderne, qui permet d'utiliser la même méthode pour plusieurs pluriels.
+    </para>
+
+    <sect2 id="zend.translate.plurals.traditional">
+
+        <title>Méthode traditionnelle</title>
+
+        <para>
+            Les personnes connaissant gettext vont reconnaitre cette méthodologie. Il existe une seule méthode
+            <methodname>plural()</methodname> qui rend le pluriel.
+        </para>
+
+        <example id="zend.translate.plurals.traditional.example1">
+
+            <title>Exemple avec la méthode traditionnelle</title>
+
+            <para>
+                La méthode <methodname>plural()</methodname> accepte 4 paramètres. Le premier est le messageId au singulier, le second
+                est le messageId du pluriel, le troisième est le nombre ou la quantité.
+            </para>
+
+            <para>
+                La quantité va être utilisée pour détecter le pluriel à retourner. Le 4ème paramètre optionnel peut être utilisé pour
+                spécifier une locale concernant la traduction.
+            </para>
+
+            <programlisting language="php"><![CDATA[
+$translate = new Zend_Translate('gettext', '/path/to/german.mo', 'de');
+$translate->plural('Car', 'Cars', $number);
+]]></programlisting>
+
+        </example>
+
+    </sect2>
+
+    <sect2 id="zend.translate.plurals.modern">
+
+        <title>Méthode moderne de traduction du pluriel</title>
+
+        <para>
+            Utilisez la méthode <methodname>translate()</methodname> pour la traduction des pluriels.
+        </para>
+
+        <para>
+            Pour utiliser la traduction de pluriels avec <methodname>translate()</methodname>, passez un tableau
+            comme messageId plutôt qu'une chaine. Ce tableau doit contenir le messageId original, celui du pluriel,
+            une quantité et optionnellement une locale.
+        </para>
+
+        <example id="zend.translate.plurals.modern.example1">
+
+            <title>Exemple de la méthode moderne de traduction du pluriel</title>
+
+            <para>
+                Pour traduire un pluriel avec la méthode moderne, agissez comme suit:
+            </para>
+
+            <programlisting language="php"><![CDATA[
+$translate = new Zend_Translate('gettext', '/path/to/german.mo', 'de');
+$translate->translate(array('Car', 'Cars', $number));
+]]></programlisting>
+
+        </example>
+
+        <para>
+            Avec cette méthode, vous pouvez utiliser n'importe quelle langue comme messageId original.
+        </para>
+
+        <example id="zend.translate.plurals.modern.example2">
+
+            <title>Exemple de la méthode moderne de traduction du pluriel utilisant un langage source différent</title>
+
+            <para>
+                Imaginons que nous voulions utiliser du russe et que le messageId est russe et non anglais.
+            </para>
+
+            <programlisting language="php"><![CDATA[
+$translate = new Zend_Translate('gettext', '/path/to/german.mo', 'de');
+$translate->translate(array('Car',
+                            'Cars first plural',
+                            'Cars second plural',
+                            $number,
+                            'ru'));
+]]></programlisting>
+
+        </example>
+
+        <para>
+            Comme vous le voyez, vous pouvez donner plus d'un pluriel, mais il faut alors spécifier la langue pour que
+            <classname>Zend_Translate</classname> puisse trouver les règles de pluriel appropriées.
+        </para>
+
+        <para>
+            Si vous omettez la langue, l'anglais sera utilisé et tout pluriel superflu sera ignoré.
+        </para>
+
+    </sect2>
+
+    <sect2 id="zend.translate.plurals.source">
+
+        <title>Fichiers sources de pluriels</title>
+
+        <para>
+            Toutes les sources ne supportent pas les pluriels. Voyez la liste ci-après pour les détails:
+        </para>
+
+        <table id="zend.translate.plurals.source.supportedadapters">
+            <title>Support du pluriel</title>
+            <tgroup cols="4">
+                <thead>
+                    <row>
+                        <entry>Adaptateur</entry>
+                        <entry>Pluriels supportés</entry>
+                    </row>
+                </thead>
+                <tbody>
+                    <row>
+                        <entry>Array</entry>
+                        <entry><emphasis>oui</emphasis></entry>
+                    </row>
+                    <row>
+                        <entry>Csv</entry>
+                        <entry><emphasis>oui</emphasis></entry>
+                    </row>
+                    <row>
+                        <entry>Gettext</entry>
+                        <entry><emphasis>oui</emphasis></entry>
+                    </row>
+                    <row>
+                        <entry>Ini</entry>
+                        <entry><emphasis>non</emphasis></entry>
+                    </row>
+                    <row>
+                        <entry>Qt</entry>
+                        <entry><emphasis>non</emphasis></entry>
+                    </row>
+                    <row>
+                        <entry>Tbx</entry>
+                        <entry><emphasis>non</emphasis></entry>
+                    </row>
+                    <row>
+                        <entry>Tmx</entry>
+                        <entry><emphasis>non</emphasis></entry>
+                    </row>
+                    <row>
+                        <entry>Xliff</entry>
+                        <entry><emphasis>non</emphasis></entry>
+                    </row>
+                    <row>
+                        <entry>XmlTm</entry>
+                        <entry><emphasis>non</emphasis></entry>
+                    </row>
+                </tbody>
+            </tgroup>
+        </table>
+
+        <para>
+            Lisez la suite pour des exemples.
+        </para>
+
+        <sect3 id="zend.translate.plurals.source.array">
+
+            <title>Source tableau contenant des pluriels</title>
+
+            <para>
+                Un tableau de traduction contenant des pluriels devrait ressembler à ceci:
+            </para>
+
+            <programlisting language="php"><![CDATA[
+array(
+    'plural_0' => array(
+        'plural_0 (ru)',
+        'plural_1 (ru)',
+        'plural_2 (ru)',
+        'plural_3 (ru)'
+    ),
+    'plural_1' => ''
+);
+]]></programlisting>
+
+            <para>
+                Dans cet exemple, <code>plural_0</code> et <code>plural_1</code> sont les définitions du pluriel
+                depuis le code source. Le tableau à l'index <code>plural_0</code> possède les pluriels traduits.
+                Regardez l'exemple suivant avec du vrai contenu et une traduction anglais - allemand.
+            </para>
+
+            <programlisting language="php"><![CDATA[
+array(
+    'Car' => array(
+        'Auto',
+        'Autos'
+    ),
+    'Cars' => ''
+);
+]]></programlisting>
+
+            <para>
+                Si votre langue supporte plusieurs pluriels, ajoutez les simplement dans le tableau à la
+                suite du premier pluriel.
+            </para>
+
+        </sect3>
+
+        <sect3 id="zend.translate.plurals.source.csv">
+
+            <title>Csv et pluriels</title>
+
+            <para>
+                Un fichier csv gérant des pluriels ressemble à ceci:
+            </para>
+
+            <programlisting language="php"><![CDATA[
+"plural_0";"plural_0 (ru)";"plural_1 (ru)";"plural_2 (ru)";"plural_3 (ru)"
+"plural_1";
+]]></programlisting>
+
+            <para>
+                Toutes les traductions des pluriels doivent être ajoutées après le premier pluriel et
+                tout les pluriels suivants doivent être ajoutés après, mais sans traduction.
+                Notez que le délimiteur est nécessaire pour les pluriels vides.
+            </para>
+
+        </sect3>
+
+        <sect3 id="zend.translate.plurals.source.gettext">
+
+            <title>Gettext et pluriels</title>
+
+            <para>
+                Gettext supporte nativement les pluriels, les fichiers
+                <filename>*.mo</filename> contiennent tout ce qui est nécessaire.
+            </para>
+
+            <note>
+
+                <para>
+                    Notez que gettext ne gère pas les langues à plusieurs pluriels, utilisez
+                    un autre adaptateur dans ce cas là.
+                </para>
+
+            </note>
+
+        </sect3>
+
+    </sect2>
+
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 158 - 0
documentation/manual/fr/module_specs/Zend_Validate-Db.xml

@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect2 id="zend.validate.Db">
+    <title>Db_RecordExists et Db_NoRecordExists</title>
+
+    <para>
+        <classname>Zend_Validate_Db_RecordExists</classname> et
+        <classname>Zend_Validate_Db_NoRecordExists</classname> permettent de vérifier si un enregistrement
+        existe (ou pas) dans une table de base de données.
+    </para>
+
+    <sect3 id="zend.validate.db.basic-usage">
+        <title>Utilisation de base</title>
+
+        <para>
+            Voici un exemple basique:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+//Vérifie que l'email existe bien dans la base de données
+$validator = new Zend_Validate_Db_RecordExists('users', 'emailaddress');
+if ($validator->isValid($emailaddress)) {
+    // l'adresse email existe
+} else {
+    // l'adresse email n'existe pas, affichons les messages d'erreur
+    foreach ($validator->getMessages() as $message) {
+        echo "$message\n";
+    }
+}
+]]></programlisting>
+
+        <para>
+            Le code ci-dessus vérifie la présence d'une adresse email <varname>$emailaddress</varname>
+            vis à vis d'un champ d'une table de base de données.
+        </para>
+
+        <programlisting language="php"><![CDATA[
+//Vérifie que le nom d'utilisateur n'est pas présent dans la table
+$validator = new Zend_Validate_Db_NoRecordExists('users', 'username');
+if ($validator->isValid($username)) {
+    // Le nom d'utilisateur semble absent de la table
+} else {
+    // invalide : l'utilisateur est probablement présent dans la table
+    $messages = $validator->getMessages();
+    foreach ($messages as $message) {
+        echo "$message\n";
+    }
+}
+]]></programlisting>
+
+        <para>
+            Le code ci-dessus vérifie l'absence d'un nom d'utilisateur <varname>$username</varname>
+            vis à vis d'un champ d'une table de base de données.
+        </para>
+    </sect3>
+
+    <sect3 id="zend.validate.db.excluding-records">
+        <title>Exclure des enregistrement</title>
+
+        <para>
+            <classname>Zend_Validate_Db_RecordExists</classname> et
+            <classname>Zend_Validate_Db_NoRecordExists</classname> proposent aussi un moyen de tester
+            la base de données en excluant certaines parties de table, en passant une clause where
+            ou un tableau de paires "champs" "valeur".
+        </para>
+
+        <para>
+            Lorsqu'un tableau est passé, l'opérateur <code>!=</code> est utilisé et vous pouvez ainsi
+            tester le reste de la table.
+        </para>
+
+        <programlisting language="php"><![CDATA[
+//Vérifie qu'aucun autre utilisateur que celui dont l'id est spécifié, ne possède ce nom
+$user_id   = $user->getId();
+$validator = new Zend_Validate_Db_NoRecordExists(
+    'users',
+    'username',
+    array(
+        'field' => 'id',
+        'value' => $user_id
+    )
+);
+
+if ($validator->isValid($username)) {
+    // OK
+} else {
+    // KO
+    $messages = $validator->getMessages();
+    foreach ($messages as $message) {
+        echo "$message\n";
+    }
+}
+]]></programlisting>
+
+        <para>
+            L'exemple ci dessus va vérifier qu'aucun utilisateur dont l'id n'est pas celui spécifié,
+            possède ce nom là <varname>$username</varname>.
+        </para>
+
+        <para>
+            La clause d'exclusion peut aussi être renseignée avec une chaine afin de pouvoir utiliser
+            un opérateur autre que <code>!=</code>.
+        </para>
+
+        <programlisting language="php"><![CDATA[
+$post_id   = $post->getId();
+$clause    = $db->quoteInto('post_id = ?', $category_id);
+$validator = new Zend_Validate_Db_RecordExists(
+    'posts_categories',
+    'post_id',
+    $clause
+);
+
+if ($validator->isValid($username)) {
+    // OK
+} else {
+    // KO
+    $messages = $validator->getMessages();
+    foreach ($messages as $message) {
+        echo "$message\n";
+    }
+}
+]]></programlisting>
+
+        <para>
+            L'exemple ci-dessus vérifie la table <code>posts_categories</code> pour s'assurer
+            qu'un enregistrement avec <code>post_id</code> corresponde à <varname>$category_id</varname>
+        </para>
+    </sect3>
+
+    <sect3 id="zend.validate.db.database-adapters">
+        <title>Adaptateurs de base de données</title>
+
+        <para>
+            Un adaptateur spécifique peut être passé au validateur. Dans le cas contraire,
+            il utilisera l'adaptateur déclaré comme étant celui par défaut:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+$validator = new Zend_Validate_Db_RecordExists('users', 'id', null, $dbAdapter);
+]]></programlisting>
+    </sect3>
+
+    <sect3 id="zend.validate.db.database-schemas">
+        <title>Nom des bases de données</title>
+
+        <para>
+            Vous pouvez spécifier un nom de base de données (schéma) pour l'adaptateur
+            PostgreSQL et DB/2 simplement grâce à un tableau possédant les clés
+            <code>table</code> et <code>schema</code>. Voici un exemple:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+$validator = new Zend_Validate_Db_RecordExists(array('table' => 'users',
+                                                     'schema' => 'my'), 'id');
+]]></programlisting>
+    </sect3>
+</sect2>

+ 145 - 0
documentation/manual/fr/module_specs/Zend_Validate-InArray.xml

@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect2 id="zend.validate.set.in_array">
+
+    <title>InArray</title>
+
+    <para>
+        <classname>Zend_Validate_InArray</classname> vous permet de valider qu'une entrée est bien présente
+        dans un tableau. Ceci fonctionne aussi avec des tableau multidimensionnels.
+    </para>
+
+    <sect3 id="zend.validate.set.in_array.basic">
+        <title>Validation tableau simple</title>
+
+        <para>
+            Passez simplement un tableau dans lequel rechercher une valeur:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+$validator = new Zend_Validate_InArray(array('key' => 'value',
+                                             'otherkey' => 'othervalue'));
+if ($validator->isValid('value')) {
+    // value trouvée
+} else {
+    // value non trouvée
+}
+]]></programlisting>
+
+        <para>
+            C'est le comportement exact de la fonction PHP <methodname>in_array()</methodname>.
+        </para>
+
+        <note>
+            <para>
+                Par défaut la validation est non stricte et ne valide pas les multiple dimensions.
+            </para>
+        </note>
+
+        <para>
+            Notez que <methodname>setHaystack()</methodname> est aussi disponible.
+        </para>
+
+        <programlisting language="php"><![CDATA[
+$validator = new Zend_Validate_InArray();
+$validator->setHaystack(array('key' => 'value', 'otherkey' => 'othervalue'));
+
+if ($validator->isValid('value')) {
+    // value trouvée
+} else {
+    // value non trouvée
+}
+]]></programlisting>
+    </sect3>
+
+    <sect3 id="zend.validate.set.in_array.strict">
+        <title>Validation tableau stricte</title>
+
+        <para>
+            Il est possible d'effectuer une validation stricte des données dans le tableau. Par défaut, il n'y aura aucune
+            différence entre l'entier <emphasis>0</emphasis> et la chaine <emphasis>"0"</emphasis>. La validation stricte
+            fera cette différence.
+        </para>
+
+        <para>
+            Pour spécifier une validation stricte à l'instanciation de l'objet, agissez comme suit:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+$validator = new Zend_Validate_InArray(
+    array(
+        'haystack' => array('key' => 'value', 'otherkey' => 'othervalue'),
+        'strict'   => true
+    )
+);
+
+if ($validator->isValid('value')) {
+    // value trouvée
+} else {
+    // value non trouvée
+}
+]]></programlisting>
+
+        <para>
+            La clé <emphasis>haystack</emphasis> contient le tableau dans lequel valider. En mettant la clé
+            <emphasis>strict</emphasis> à <constant>TRUE</constant>, la validation sera stricte (valeur et type).
+        </para>
+
+        <para>
+            La méthode <methodname>setStrict()</methodname> est aussi disponible.
+        </para>
+
+        <note>
+            <para>
+                Notez que par défaut, <emphasis>strict</emphasis> a la valeur
+                <constant>FALSE</constant>.
+            </para>
+        </note>
+    </sect3>
+
+    <sect3 id="zend.validate.set.in_array.recursive">
+        <title>Validation de tableaux recursifs</title>
+
+        <para>
+            En plus de la validation type <acronym>PHP</acronym> <methodname>in_array()</methodname>, ce validateur peut
+            aussi être utilisé pour valider des tableaux à plusieurs dimensions.
+        </para>
+
+        <para>
+            Pour celà, utilisez l'option <emphasis>recursive</emphasis>.
+        </para>
+
+        <programlisting language="php"><![CDATA[
+$validator = new Zend_Validate_InArray(
+    array(
+        'haystack' => array(
+            'firstDimension' => array('key' => 'value',
+                                      'otherkey' => 'othervalue'),
+            'secondDimension' => array('some' => 'real',
+                                       'different' => 'key')),
+        'recursive' => true
+    )
+);
+
+if ($validator->isValid('value')) {
+    // value trouvée
+} else {
+    // value non trouvée
+}
+]]></programlisting>
+
+        <para>
+            Votre tableau sera parcouru récursivement à la recherche de votre valeur.
+        </para>
+
+        <note>
+            <para>
+                Par défaut, la récursivité n'est pas activée.
+            </para>
+        </note>
+    </sect3>
+
+</sect2>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 611 - 0
documentation/manual/fr/module_specs/Zend_Validate-Messages.xml

@@ -0,0 +1,611 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.validate.messages">
+
+    <title>Messages de validation</title>
+
+    <para>
+        Chaque validateur basé sur <classname>Zend_Validate</classname> propose un ou plusieurs messages
+        dans le cas d'un echec. Vous pouvez utiliser ces informations pour créer vos propres messages
+        ou pour traduire les messages présents. La table suivante liste tous les messages retournés
+        par tous les validateurs.
+    </para>
+
+    <table id="zend.validate.messages.table">
+        <title>Messages de validation disponibles</title>
+        <tgroup cols="3">
+            <thead>
+                <row>
+                    <entry>Validator</entry>
+                    <entry>Constant</entry>
+                    <entry>Message</entry>
+                </row>
+            </thead>
+            <tbody>
+                <row>
+                    <entry morerows="1" valign="middle">Alnum</entry>
+                    <entry><constant>NOT_ALNUM</constant></entry>
+                    <entry>'%value%' has not only alphabetic and digit characters</entry>
+                </row>
+                <row>
+                    <entry><constant>STRING_EMPTY</constant></entry>
+                    <entry>'%value%' is an empty string</entry>
+                </row>
+                <row>
+                    <entry morerows="1" valign="middle">Alpha</entry>
+                    <entry><constant>NOT_ALPHA</constant></entry>
+                    <entry>'%value%' has not only alphabetic characters</entry>
+                </row>
+                <row>
+                    <entry><constant>STRING_EMPTY</constant></entry>
+                    <entry>'%value%' is an empty string</entry>
+                </row>
+                <row>
+                    <entry>Barcode</entry>
+                    <entry>---</entry>
+                    <entry>messages are thrown by a subclass</entry>
+                </row>
+                <row>
+                    <entry morerows="2" valign="middle">Barcode_Ean13</entry>
+                    <entry><constant>INVALID</constant></entry>
+                    <entry>'%value%' is an invalid <constant>EAN</constant>-13 barcode</entry>
+                </row>
+                <row>
+                    <entry><constant>INVALID_LENGTH</constant></entry>
+                    <entry>'%value%' should be 13 characters</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_NUMERIC</constant></entry>
+                    <entry>'%value%' should contain only numeric characters</entry>
+                </row>
+                <row>
+                    <entry morerows="1" valign="middle">Barcode_UpcA</entry>
+                    <entry><constant>INVALID</constant></entry>
+                    <entry>'%value%' is an invalid <constant>UPC</constant>-A barcode</entry>
+                </row>
+                <row>
+                    <entry><constant>INVALID_LENGTH</constant></entry>
+                    <entry>'%value%' should be 12 characters</entry>
+                </row>
+                <row>
+                    <entry morerows="1" valign="middle">Between</entry>
+                    <entry><constant>NOT_BETWEEN</constant></entry>
+                    <entry>'%value%' is not between '%min%' and '%max%', inclusively</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_BETWEEN_STRICT</constant></entry>
+                    <entry>'%value%' is not strictly between '%min%' and '%max%'</entry>
+                </row>
+                <row>
+                    <entry morerows="1" valign="middle">Ccnum</entry>
+                    <entry><constant>LENGTH</constant></entry>
+                    <entry>'%value%' must contain between 13 and 19 digits</entry>
+                </row>
+                <row>
+                    <entry><constant>CHECKSUM</constant></entry>
+                    <entry>Luhn algorithm (mod-10 checksum) failed on '%value%'</entry>
+                </row>
+                <row>
+                    <entry morerows="1" valign="middle">Date</entry>
+                    <entry><constant>FALSEFORMAT</constant></entry>
+                    <entry>'%value%' does not fit given date format</entry>
+                </row>
+                <row>
+                    <entry><constant>INVALID</constant></entry>
+                    <entry>'%value%' does not appear to be a valid date</entry>
+                </row>
+                <row>
+                    <entry morerows="1" valign="middle">Db_Abstract</entry>
+                    <entry><constant>ERROR_NO_RECORD_FOUND</constant></entry>
+                    <entry>No record matching %value% was found</entry>
+                </row>
+                <row>
+                    <entry><constant>ERROR_RECORD_FOUND</constant></entry>
+                    <entry>A record matching %value% was found</entry>
+                </row>
+                <row>
+                    <entry morerows="1" valign="middle">Digits</entry>
+                    <entry><constant>NOT_DIGITS</constant></entry>
+                    <entry>'%value%' contains not only digit characters</entry>
+                </row>
+                <row>
+                    <entry><constant>STRING_EMPTY</constant></entry>
+                    <entry>'%value%' is an empty string</entry>
+                </row>
+                <row>
+                    <entry morerows="7" valign="middle">EmailAddress</entry>
+                    <entry><constant>INVALID</constant></entry>
+                    <entry>
+                        '%value%' is not a valid email address in the basic format
+                        local-part@hostname
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>INVALID_FORMAT</constant></entry>
+                    <entry>'%value%' is not a valid email address in the basic format local-part@hostname</entry>
+                </row>
+                <row>
+                    <entry><constant>INVALID_HOSTNAME</constant></entry>
+                    <entry>'%hostname%' is not a valid hostname for email address '%value%'</entry>
+                </row>
+                <row>
+                    <entry><constant>INVALID_MX_RECORD</constant></entry>
+                    <entry>
+                        '%hostname%' does not appear to have a valid MX record for the email address
+                        '%value%'
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>DOT_ATOM</constant></entry>
+                    <entry>'%localPart%' not matched against dot-atom format</entry>
+                </row>
+                <row>
+                    <entry><constant>QUOTED_STRING</constant></entry>
+                    <entry>'%localPart%' not matched against quoted-string format</entry>
+                </row>
+                <row>
+                    <entry><constant>INVALID_LOCAL_PART</constant></entry>
+                    <entry>
+                        '%localPart%' is not a valid local part for email address '%value%'
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>LENGTH_EXCEEDED</constant></entry>
+                    <entry>'%value%' exceeds the allowed length</entry>
+                </row>
+                <row>
+                    <entry morerows="1" valign="middle">File_Count</entry>
+                    <entry><constant>TOO_MUCH</constant></entry>
+                    <entry>
+                        Too much files, maximum '%max%' are allowed but '%count%' are given
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>TOO_LESS</constant></entry>
+                    <entry>
+                        Too less files, minimum '%min%' are expected but '%count%' are given
+                    </entry>
+                </row>
+                <row>
+                    <entry morerows="2" valign="middle">File_Crc32</entry>
+                    <entry><constant>DOES_NOT_MATCH</constant></entry>
+                    <entry>The file '%value%' does not match the given crc32 hashes</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_DETECTED</constant></entry>
+                    <entry>There was no crc32 hash detected for the given file</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_FOUND</constant></entry>
+                    <entry>The file '%value%' could not be found</entry>
+                </row>
+                <row>
+                    <entry morerows="1" valign="middle">File_ExcludeExtension</entry>
+                    <entry><constant>FALSE_EXTENSION</constant></entry>
+                    <entry>The file '%value%' has a false extension</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_FOUND</constant></entry>
+                    <entry>The file '%value%' was not found</entry>
+                </row>
+                <row>
+                    <entry morerows="2" valign="middle">File_ExcludeMimeType</entry>
+                    <entry><constant>FALSE_TYPE</constant></entry>
+                    <entry>The file '%value%' has a false mimetype of '%type%'</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_DETECTED</constant></entry>
+                    <entry>The mimetype of file '%value%' could not been detected</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_READABLE</constant></entry>
+                    <entry>The file '%value%' can not be read</entry>
+                </row>
+                <row>
+                    <entry morerows="2" valign="middle">File_Exists</entry>
+                    <entry><constant>DOES_NOT_EXIST</constant></entry>
+                    <entry>The file '%value%' does not exist</entry>
+                </row>
+                <row>
+                    <entry morerows="1" valign="middle">File_Extension</entry>
+                    <entry><constant>FALSE_EXTENSION</constant></entry>
+                    <entry>The file '%value%' has a false extension</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_FOUND</constant></entry>
+                    <entry>The file '%value%' was not found</entry>
+                </row>
+                <row>
+                    <entry morerows="2" valign="middle">File_FilesSize</entry>
+                    <entry><constant>TOO_BIG</constant></entry>
+                    <entry>
+                        All files in sum should have a maximum size of '%max%' but '%size%' were
+                        detected
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>TOO_SMALL</constant></entry>
+                    <entry>
+                        All files in sum should have a minimum size of '%min%' but '%size%' were
+                        detected
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_READABLE</constant></entry>
+                    <entry>One or more files can not be read</entry>
+                </row>
+                <row>
+                    <entry morerows="2" valign="middle">File_Hash</entry>
+                    <entry><constant>DOES_NOT_MATCH</constant></entry>
+                    <entry>The file '%value%' does not match the given hashes</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_DETECTED</constant></entry>
+                    <entry>There was no hash detected for the given file</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_FOUND</constant></entry>
+                    <entry>The file '%value%' could not be found</entry>
+                </row>
+                <row>
+                    <entry morerows="5" valign="middle">File_ImageSize</entry>
+                    <entry><constant>WIDTH_TOO_BIG</constant></entry>
+                    <entry>
+                        Maximum allowed width for image '%value%' should be '%maxwidth%' but
+                        '%width%' detected
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>WIDTH_TOO_SMALL</constant></entry>
+                    <entry>
+                        Minimum expected width for image '%value%' should be '%minwidth%' but
+                        '%width%' detected
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>HEIGHT_TOO_BIG</constant></entry>
+                    <entry>
+                        Maximum allowed height for image '%value%' should be '%maxheight%' but
+                        '%height%' detected
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>HEIGHT_TOO_SMALL</constant></entry>
+                    <entry>
+                        Minimum expected height for image '%value%' should be '%minheight%' but
+                        '%height%' detected
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_DETECTED</constant></entry>
+                    <entry>The size of image '%value%' could not be detected</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_READABLE</constant></entry>
+                    <entry>The image '%value%' can not be read</entry>
+                </row>
+                <row>
+                    <entry morerows="2" valign="middle">File_IsCompressed</entry>
+                    <entry><constant>FALSE_TYPE</constant></entry>
+                    <entry>The file '%value%' is not compressed, '%type%' detected</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_DETECTED</constant></entry>
+                    <entry>The mimetype of file '%value%' could not been detected</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_READABLE</constant></entry>
+                    <entry>The file '%value%' can not be read</entry>
+                </row>
+                <row>
+                    <entry morerows="2" valign="middle">File_IsImage</entry>
+                    <entry><constant>FALSE_TYPE</constant></entry>
+                    <entry>The file '%value%' is no image, '%type%' detected</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_DETECTED</constant></entry>
+                    <entry>The mimetype of file '%value%' could not been detected</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_READABLE</constant></entry>
+                    <entry>The file '%value%' can not be read</entry>
+                </row>
+                <row>
+                    <entry morerows="2" valign="middle">File_Md5</entry>
+                    <entry><constant>DOES_NOT_MATCH</constant></entry>
+                    <entry>The file '%value%' does not match the given md5 hashes</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_DETECTED</constant></entry>
+                    <entry>There was no md5 hash detected for the given file</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_FOUND</constant></entry>
+                    <entry>The file '%value%' could not be found</entry>
+                </row>
+                <row>
+                    <entry morerows="2" valign="middle">File_MimeType</entry>
+                    <entry><constant>FALSE_TYPE</constant></entry>
+                    <entry>The file '%value%' has a false mimetype of '%type%'</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_DETECTED</constant></entry>
+                    <entry>The mimetype of file '%value%' could not been detected</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_READABLE</constant></entry>
+                    <entry>The file '%value%' can not be read</entry>
+                </row>
+                <row>
+                    <entry>File_NotExists</entry>
+                    <entry><constant>DOES_EXIST</constant></entry>
+                    <entry>The file '%value%' does exist</entry>
+                </row>
+                <row>
+                    <entry morerows="2" valign="middle">File_Sha1</entry>
+                    <entry><constant>DOES_NOT_MATCH</constant></entry>
+                    <entry>The file '%value%' does not match the given sha1 hashes</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_DETECTED</constant></entry>
+                    <entry>There was no sha1 hash detected for the given file</entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_FOUND</constant></entry>
+                    <entry>The file '%value%' could not be found</entry>
+                </row>
+                <row>
+                    <entry morerows="2" valign="middle">File_Size</entry>
+                    <entry><constant>TOO_BIG</constant></entry>
+                    <entry>
+                        Maximum allowed size for file '%value%' is '%max%' but '%size%' detected
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>TOO_SMALL</constant></entry>
+                    <entry>
+                        Minimum expected size for file '%value%' is '%min%' but '%size%' detected
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_FOUND</constant></entry>
+                    <entry>The file '%value%' could not be found</entry>
+                </row>
+                <row>
+                    <entry morerows="9" valign="middle">File_Upload</entry>
+                    <entry><constant>INI_SIZE</constant></entry>
+                    <entry>The file '%value%' exceeds the defined ini size</entry>
+                </row>
+                <row>
+                    <entry><constant>FORM_SIZE</constant></entry>
+                    <entry>The file '%value%' exceeds the defined form size</entry>
+                </row>
+                <row>
+                    <entry><constant>PARTIAL</constant></entry>
+                    <entry>The file '%value%' was only partially uploaded</entry>
+                </row>
+                <row>
+                    <entry><constant>NO_FILE</constant></entry>
+                    <entry>The file '%value%' was not uploaded</entry>
+                </row>
+                <row>
+                    <entry><constant>NO_TMP_DIR</constant></entry>
+                    <entry>No temporary directory was found for the file '%value%'</entry>
+                </row>
+                <row>
+                    <entry><constant>CANT_WRITE</constant></entry>
+                    <entry>The file '%value%' can't be written</entry>
+                </row>
+                <row>
+                    <entry><constant>EXTENSION</constant></entry>
+                    <entry>
+                        The extension returned an error while uploading the file '%value%'
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>ATTACK</constant></entry>
+                    <entry>The file '%value%' was illegal uploaded, possible attack</entry>
+                </row>
+                <row>
+                    <entry><constant>FILE_NOT_FOUND</constant></entry>
+                    <entry>The file '%value%' was not found</entry>
+                </row>
+                <row>
+                    <entry><constant>UNKNOWN</constant></entry>
+                    <entry>Unknown error while uploading the file '%value%'</entry>
+                </row>
+                <row>
+                    <entry morerows="2" valign="middle">File_WordCount</entry>
+                    <entry><constant>TOO_MUCH</constant></entry>
+                    <entry>
+                        Too much words, maximum '%max%' are allowed but '%count%' were counted
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>TOO_LESS</constant></entry>
+                    <entry>
+                        Too less words, minimum '%min%' are expected but '%count%' were counted
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>NOT_FOUND</constant></entry>
+                    <entry>The file '%value%' could not be found</entry>
+                </row>
+                <row>
+                    <entry>Float</entry>
+                    <entry><constant>NOT_FLOAT</constant></entry>
+                    <entry>'%value%' does not appear to be a float</entry>
+                </row>
+                <row>
+                    <entry>GreaterThan</entry>
+                    <entry><constant>NOT_GREATER</constant></entry>
+                    <entry>'%value%' is not greater than '%min%'</entry>
+                </row>
+                <row>
+                    <entry>Hex</entry>
+                    <entry><constant>NOT_HEX</constant></entry>
+                    <entry>'%value%' has not only hexadecimal digit characters</entry>
+                </row>
+                <row>
+                    <entry morerows="7" valign="middle">Hostname</entry>
+                    <entry><constant>IP_ADDRESS_NOT_ALLOWED</constant></entry>
+                    <entry>
+                        '%value%' appears to be an IP address, but IP addresses are not allowed
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>UNKNOWN_TLD</constant></entry>
+                    <entry>
+                        '%value%' appears to be a <acronym>DNS</acronym> hostname but cannot match <acronym>TLD</acronym> against known
+                        list
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>INVALID_DASH</constant></entry>
+                    <entry>
+                        '%value%' appears to be a <acronym>DNS</acronym> hostname but contains a dash (-) in an invalid
+                        position
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>INVALID_HOSTNAME_SCHEMA</constant></entry>
+                    <entry>
+                        '%value%' appears to be a <acronym>DNS</acronym> hostname but cannot match against hostname
+                        schema for <acronym>TLD</acronym> '%tld%'
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>UNDECIPHERABLE_TLD</constant></entry>
+                    <entry>
+                        '%value%' appears to be a <acronym>DNS</acronym> hostname but cannot extract <acronym>TLD</acronym> part
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>INVALID_HOSTNAME</constant></entry>
+                    <entry>
+                        '%value%' does not match the expected structure for a <acronym>DNS</acronym> hostname
+                    </entry>
+                </row>
+                <row>
+                    <entry><constant>INVALID_LOCAL_NAME</constant></entry>
+                    <entry>'%value%' does not appear to be a valid local network name</entry>
+                </row>
+                <row>
+                    <entry><constant>LOCAL_NAME_NOT_ALLOWED</constant></entry>
+                    <entry>
+                        '%value%' appears to be a local network name but local network names are not
+                        allowed
+                    </entry>
+                </row>
+                <row>
+                    <entry morerows="2" valign="middle">Iban</entry>
+                    <entry><constant>NOTSUPPORTED</constant></entry>
+                    <entry>'%value%' does not have <acronym>IBAN</acronym></entry>
+                </row>
+                <row>
+                    <entry><constant>FALSEFORMAT</constant></entry>
+                    <entry>'%value%' has a false format</entry>
+                </row>
+                <row>
+                    <entry><constant>CHECKFAILED</constant></entry>
+                    <entry>'%value%' has failed the <acronym>IBAN</acronym> check</entry>
+                </row>
+                <row>
+                    <entry morerows="1" valign="middle">Identical</entry>
+                    <entry><constant>NOT_SAME</constant></entry>
+                    <entry>The token '%token%' does not match the given token '%value%'</entry>
+                </row>
+                <row>
+                    <entry><constant>MISSING_TOKEN</constant></entry>
+                    <entry>No token was provided to match against</entry>
+                </row>
+                <row>
+                    <entry>InArray</entry>
+                    <entry><constant>NOT_IN_ARRAY</constant></entry>
+                    <entry>'%value%' was not found in the haystack</entry>
+                </row>
+                <row>
+                    <entry>Int</entry>
+                    <entry><constant>NOT_INT</constant></entry>
+                    <entry>'%value%' does not appear to be an integer</entry>
+                </row>
+                <row>
+                    <entry>Ip</entry>
+                    <entry><constant>NOT_IP_ADDRESS</constant></entry>
+                    <entry>'%value%' does not appear to be a valid IP address</entry>
+                </row>
+                <row>
+                    <entry>LessThan</entry>
+                    <entry><constant>NOT_LESS</constant></entry>
+                    <entry>'%value%' is not less than '%max%'</entry>
+                </row>
+                <row>
+                    <entry>NotEmpty</entry>
+                    <entry><constant>IS_EMPTY</constant></entry>
+                    <entry>Value is required and can't be empty</entry>
+                </row>
+                <row>
+                    <entry>Regex</entry>
+                    <entry><constant>NOT_MATCH</constant></entry>
+                    <entry>'%value%' does not match against pattern '%pattern%'</entry>
+                </row>
+                <row>
+                    <entry morerows="1" valign="middle">StringLength</entry>
+                    <entry><constant>TOO_SHORT</constant></entry>
+                    <entry>'%value%' is less than %min% characters long</entry>
+                </row>
+                <row>
+                    <entry><constant>TOO_LONG</constant></entry>
+                    <entry>'%value%' is greater than %max% characters long</entry>
+                </row>
+            </tbody>
+        </tgroup>
+    </table>
+
+    <para>
+        Il est possible de récupérer tous les messages d'erreurs d'un validator grâce à sa méthode
+        <methodname>getMessageTemplates()</methodname>. Celle-ci retourne un tableau.
+    </para>
+
+    <programlisting language="php"><![CDATA[
+$validator = new Zend_Validate_Alnum();
+$messages  = $validator->getMessageTemplates();
+]]></programlisting>
+
+    <sect2 id="zend.validate.messages.limitation">
+        <title>Limiter la taille d'un message de validation</title>
+
+        <para>
+            Il peut être nécessaire parfois de limiter la taille en caractères des messages d'erreur
+            retournés. par exemple si une vue n'autorise que 100 caractères par ligne.
+            <classname>Zend_Validate</classname> propose une telle option.
+        </para>
+
+        <para>
+            La taille actuelle est
+            <methodname>Zend_Validate::getMessageLength()</methodname>. -1 signifie que le message ne
+            sera pas tronqué et entièrement retourné, c'est le comportement par défaut.
+        </para>
+
+        <para>
+            Pour limiter la taille, utilisez
+            <methodname>Zend_Validate::setMessageLength()</methodname>. Lorsque la taille excède cette valeur,
+            le message sera alors tronqué et suivi de '<emphasis>...</emphasis>'.
+        </para>
+
+        <programlisting language="php"><![CDATA[
+Zend_Validate::setMessageLength(100);
+]]></programlisting>
+
+        <note>
+            <para>
+                Notez que la taille des messages affecte aussi les messages personnalisés enregistrés,
+                si le validateur considéré étend <classname>Zend_Validate_Abstract</classname>.
+            </para>
+        </note>
+    </sect2>
+
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 147 - 0
documentation/manual/fr/module_specs/Zend_Validate-Migration.xml

@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.validate.migration">
+
+    <title>Migration depuis les versions précédentes</title>
+
+    <para>
+        L'<acronym>API</acronym> de <classname>Zend_Validate</classname> a changé quelques fois.
+        Ce guide va vous permettre de noter les différences entre les versions.
+    </para>
+
+    <sect2 id="zend.validate.migration.fromoneninetooneten">
+        <title>Migrer de 1.9 à 1.10</title>
+        <sect3 id="zend.validate.migration.fromoneninetooneten.selfwritten">
+            <title>Adaptateurs personnels</title>
+
+            <para>
+                Lorsqu'une erreur apparait dans un adaptateur crée de toute pièce,
+                <methodname>_error()</methodname> doit être appelée. Avant Zend Framework 1.10, il était
+                possible d'appeler cette méthode sans aucun paramètre. Le premier template de message d'erreur
+                était alors utilisé.
+            </para>
+
+            <para>
+                Ce comportement est problématique lorsque vous avez des validateurs retournant plusieurs messages.
+                Aussi, étendre un validateur peut mener à des comportements inattendus dans une telle situation,
+                comme par exemple l'apparition du mauvais message d'erreur.
+            </para>
+
+            <programlisting language="php"><![CDATA[
+My_Validator extends Zend_Validate_Abstract
+{
+    public isValid($value)
+    {
+        ...
+        $this->_error(); // Résultat inattendu
+        ...
+    }
+}
+]]></programlisting>
+
+            <para>
+                Pour éviter ces problèmes <methodname>_error()</methodname> doit desormais
+                prendre obligatoirement un paramètre.
+            </para>
+
+            <programlisting language="php"><![CDATA[
+My_Validator extends Zend_Validate_Abstract
+{
+    public isValid($value)
+    {
+        ...
+        $this->_error(self::MY_ERROR); // Ok, erreur définie
+        ...
+    }
+}
+]]></programlisting>
+        </sect3>
+
+        <sect3 id="zend.validate.migration.fromoneninetooneten.datevalidator">
+            <title>Simplification dans le validateur des dates</title>
+
+            <para>
+                Avant Zend Framework 1.10, 2 messages identiques étaient envoyés dans le validateur
+                des dates. <constant>NOT_YYYY_MM_DD</constant> et
+                <constant>FALSEFORMAT</constant>. Depuis Zend Framework 1.10, seul
+                <constant>FALSEFORMAT</constant> sera retourné lorsque la date passée ne correspond pas
+                au format demandé.
+            </para>
+        </sect3>
+
+        <sect3 id="zend.validate.migration.fromoneninetooneten.barcodevalidator">
+            <title>Corrections dans Alpha, Alnum et Barcode</title>
+
+            <para>
+                Avant Zend Framework 1.10, les messages dans les 2 validateurs barcode, le Alpha
+                et le Alnum étaient identiques. Des problèmes pouvaient alors faire surface avec des
+                messages personnalisés, des traducteurs ou des instances multiples des validateurs.
+            </para>
+
+            <para>
+                Depuis Zend Framework 1.10, les valeurs des constantes ont changé pour être uniques.
+                Si vous utilisiez les constantes comme le manuel le recommande, aucun changement n'est nécessaire.
+                Mais si vous utilisiez les messages d'erreurs, alors il faudra les changer. Voici les changements
+                opérés:
+            </para>
+
+            <table id="zend.validate.migration.fromoneninetooneten.barcodevalidator.table">
+                <title>Messages de validation disponibles</title>
+                <tgroup cols="3">
+                    <thead>
+                        <row>
+                            <entry>Validateur</entry>
+                            <entry>Constante</entry>
+                            <entry>Valeur</entry>
+                        </row>
+                    </thead>
+
+                    <tbody>
+                        <row>
+                            <entry>Alnum</entry>
+                            <entry><constant>STRING_EMPTY</constant></entry>
+                            <entry>alnumStringEmpty</entry>
+                        </row>
+
+                        <row>
+                            <entry>Alpha</entry>
+                            <entry><constant>STRING_EMPTY</constant></entry>
+                            <entry>alphaStringEmpty</entry>
+                        </row>
+
+                        <row>
+                            <entry>Barcode_Ean13</entry>
+                            <entry><constant>INVALID</constant></entry>
+                            <entry>ean13Invalid</entry>
+                        </row>
+
+                        <row>
+                            <entry>Barcode_Ean13</entry>
+                            <entry><constant>INVALID_LENGTH</constant></entry>
+                            <entry>ean13InvalidLength</entry>
+                        </row>
+
+                        <row>
+                            <entry>Barcode_UpcA</entry>
+                            <entry><constant>INVALID</constant></entry>
+                            <entry>upcaInvalid</entry>
+                        </row>
+
+                        <row>
+                            <entry>Barcode_UpcA</entry>
+                            <entry><constant>INVALID_LENGTH</constant></entry>
+                            <entry>upcaInvalidLength</entry>
+                        </row>
+
+                        <row>
+                            <entry>Digits</entry>
+                            <entry><constant>STRING_EMPTY</constant></entry>
+                            <entry>digitsStringEmpty</entry>
+                        </row>
+                    </tbody>
+                </tgroup>
+            </table>
+
+        </sect3>
+    </sect2>
+</sect1>

+ 45 - 0
documentation/manual/fr/module_specs/Zend_View-Helpers-BaseUrl.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect3 id="zend.view.helpers.initial.baseurl">
+    <title>Aide BaseUrl</title>
+
+    <para>
+        La plupart des <acronym>URL</acronym>s générées par le framework possèdent l'
+        <acronym>URL</acronym> de base préfixée automatiquement. Les développeurs ont besoin de
+        la rajouter à la main à leurs propres <acronym>URL</acronym>s afin de garder une correspondance
+        chemins - ressources correcte.
+    </para>
+
+    <para>
+        L'utilisation de l'aide de vue BaseUrl est très simple:
+    </para>
+
+    <programlisting language="php"><![CDATA[
+/*
+ * Imaginons une URL de base dans page/application de "/mypage".
+ */
+
+/*
+ * affiche:
+ * <base href="/mypage/" />
+ */
+<base href="<?php echo $this->baseUrl(); ?>" />
+
+/*
+ * affiche:
+ * <link rel="stylesheet" type="text/css" href="/mypage/css/base.css" />
+ */
+<link rel="stylesheet" type="text/css"
+     href="<?php echo $this->baseUrl('css/base.css'); ?>" />
+]]></programlisting>
+
+    <note>
+        <para>
+            Pour plus de simplicité, le fichier <acronym>PHP</acronym> (par exemple
+            "<filename>index.php</filename>") est enelevé de l'<acronym>URL</acronym> de base
+            gérée par <classname>Zend_Controller</classname>. Cependant, si ceci vous gène, utilisez
+            <methodname>$this->getHelper('BaseUrl')->setBaseUrl()</methodname> pour affecter votre
+            propre BaseUrl.
+        </para>
+    </note>
+</sect3>

+ 76 - 0
documentation/manual/fr/module_specs/Zend_View-Helpers-Cycle.xml

@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect3 id="zend.view.helpers.initial.cycle">
+
+    <title>Aide Cycle</title>
+
+    <para>
+      L'aide <code>Cycle</code> est utilisée pour alterner des valeurs.
+    </para>
+
+    <example id="zend.view.helpers.initial.cycle.basicusage">
+
+        <title>Aide Cycle : utilisation de base</title>
+
+        <para>
+            Pour ajouter des éléments dans le cycle, spécifiez le simplement dans le
+            constructeur ou utilisez <methodname>assign(array $data)</methodname>
+        </para>
+
+        <programlisting language="php"><![CDATA[
+<?php foreach ($this->books as $book):?>
+  <tr style="background-color:<?php echo $this->cycle(array("#F0F0F0",
+                                                            "#FFFFFF"))
+                                              ->next()?>">
+  <td><?php echo $this->escape($book['author']) ?></td>
+</tr>
+<?php endforeach;?>
+
+// Mouvement dans le sens inverse
+$this->cycle()->assign(array("#F0F0F0","#FFFFFF"));
+$this->cycle()->prev();
+?>
+]]></programlisting>
+
+        <para>
+            La sortie:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+<tr style="background-color:'#F0F0F0'">
+   <td>First</td>
+</tr>
+<tr style="background-color:'#FFFFFF'">
+   <td>Second</td>
+</tr>
+]]></programlisting>
+
+    </example>
+
+    <example id="zend.view.helpers.initial.cycle.advanceusage">
+
+        <title>Travailler avec 2 cycles ou plus</title>
+
+       <para>
+           Pour utiliser 2 cycles, il faut renseigner leurs noms. Ca se passe au niveau du second
+           paramètre de la méthode cycle. <code>$this->cycle(array("#F0F0F0","#FFFFFF"),'cycle2')</code>.
+           setName($name) peut aussi être utilisée.
+        </para>
+
+    </example>
+
+    <programlisting language="php"><![CDATA[
+<?php foreach ($this->books as $book):?>
+  <tr style="background-color:<?php echo $this->cycle(array("#F0F0F0",
+                                                            "#FFFFFF"))
+                                              ->next()?>">
+  <td><?php echo $this->cycle(array(1,2,3),'number')->next()?></td>
+  <td><?php echo $this->escape($book['author'])?></td>
+</tr>
+<?php endforeach;?>
+]]></programlisting>
+
+</sect3>
+<!--
+vim:se ts=4 sw=4 et:
+-->