Pārlūkot izejas kodu

[ES] News Files and Update Files

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@15926 44c647ce-9c0f-0410-b52a-842ac1e357ba
benjamin-gonzales 16 gadi atpakaļ
vecāks
revīzija
f297e762c0
26 mainītis faili ar 7251 papildinājumiem un 309 dzēšanām
  1. 2 1
      documentation/manual/es/module_specs/Zend_Application-Introduction.xml
  2. 41 41
      documentation/manual/es/module_specs/Zend_Application-QuickStart.xml
  3. 330 0
      documentation/manual/es/module_specs/Zend_Auth_Adapter_DbTable.xml
  4. 118 0
      documentation/manual/es/module_specs/Zend_Auth_Adapter_Digest.xml
  5. 279 0
      documentation/manual/es/module_specs/Zend_Auth_Adapter_Http.xml
  6. 49 49
      documentation/manual/es/module_specs/Zend_Controller-Basics.xml
  7. 6 5
      documentation/manual/es/module_specs/Zend_Controller-FrontController.xml
  8. 232 208
      documentation/manual/es/module_specs/Zend_Controller-Migration.xml
  9. 7 4
      documentation/manual/es/module_specs/Zend_Controller-QuickStart.xml
  10. 425 0
      documentation/manual/es/module_specs/Zend_Controller-Request.xml
  11. 185 0
      documentation/manual/es/module_specs/Zend_Controller-Router-Route-Chain.xml
  12. 59 0
      documentation/manual/es/module_specs/Zend_Controller-Router-Route-Hostname.xml
  13. 264 0
      documentation/manual/es/module_specs/Zend_Controller-Router-Route-Regex.xml
  14. 69 0
      documentation/manual/es/module_specs/Zend_Controller-Router-Route-Static.xml
  15. 381 0
      documentation/manual/es/module_specs/Zend_Controller-Router-Route.xml
  16. 506 0
      documentation/manual/es/module_specs/Zend_Controller-Router.xml
  17. 399 0
      documentation/manual/es/module_specs/Zend_Dojo-Data.xml
  18. 148 0
      documentation/manual/es/module_specs/Zend_Dojo-Form-Decorators.xml
  19. 1482 0
      documentation/manual/es/module_specs/Zend_Dojo-Form-Elements.xml
  20. 418 0
      documentation/manual/es/module_specs/Zend_Dojo-Form-Examples.xml
  21. 112 0
      documentation/manual/es/module_specs/Zend_Dojo-Form.xml
  22. 422 0
      documentation/manual/es/module_specs/Zend_Dojo-View-Dojo.xml
  23. 1233 0
      documentation/manual/es/module_specs/Zend_Dojo-View-Helpers.xml
  24. 48 0
      documentation/manual/es/module_specs/Zend_Dojo-View.xml
  25. 35 0
      documentation/manual/es/module_specs/Zend_Dojo.xml
  26. 1 1
      documentation/manual/es/module_specs/Zend_Form-Decorators.xml

+ 2 - 1
documentation/manual/es/module_specs/Zend_Application-Introduction.xml

@@ -5,7 +5,8 @@
     <title>Introducción</title>
 
     <para>
-        <classname>Zend_Application</classname> ofrece un motor de bootstrap
+        <classname>Zend_Application</classname> 
+        ofrece un motor de arranque (Bootstrapping)
         para aplicaciones que proporcionan recursos reutilizables,
         -- clases de bootstrap comunes y basadas en módulos -- y comprobación de
         dependencias. También se ocupa de establecer el entorno de PHP

+ 41 - 41
documentation/manual/es/module_specs/Zend_Application-QuickStart.xml

@@ -2,20 +2,20 @@
 <!-- EN-Revision: 15103 -->
 <!-- Reviewed: no -->
 <sect1 id="zend.application.quick-start">
-    <title>Inicio Rápido con Zend_Application</title>
+    <title>Inicio rápido con Zend_Application</title>
 
     <para>
         Hay dos caminos para iniciarse con
         <classname>Zend_Application</classname>, y dependen de cómo inicia su
-        proyecto. En cada caso, usted siempre comienza con la creación de la
+        proyecto. En cada caso, siempre se comienza con la creación de la
         clase <code>Bootstrap</code>, y un archivo de configuración asociado.
     </para>
 
     <para>
-        Si usted planea utilizar <classname>Zend_Tool</classname> para crear su
-        proyecto, continúe leyendo abajo. Si usted va añadiendo
+        Si planea utilizar <classname>Zend_Tool</classname> para crear su
+        proyecto, continúe leyendo. Si va añadir
         <classname>Zend_Application</classname> a un proyecto existente,
-        usted querrá <link linkend="zend.application.quick-start.manual">saltearse hacia adelante</link>.
+        debe <link linkend="zend.application.quick-start.manual"> ir aquí</link>.
     </para>
 
     <sect2 id="zend.application.quick-start.zend-tool">
@@ -47,7 +47,7 @@ C:> zf.bat create project newproject
 ]]></programlisting>
 
         <para>
-            Ambos crearán una estructura del proyecto que luce como lo siguiente:
+            Ambos crearán una estructura del proyecto que se parece a lo siguiente:
         </para>
 
         <programlisting role="text"><![CDATA[
@@ -80,7 +80,7 @@ newproject
 ]]></programlisting>
 
         <para>
-            En el diagrama de arriba, su arranque(bootstrap) está en
+            En el diagrama anterior, su bootstrap se encuentra en
             <code>newproject/application/Bootstrap.php</code>, y al principio
             se vería así:
         </para>
@@ -93,9 +93,9 @@ class Bootstrap extends Zend_Application_Bootstrap_BootstrapAbstract
 ]]></programlisting>
 
         <para>
-            Usted también notará que se ha creado un archivo de configuración,
+            También notará que se ha creado un archivo de configuración,
             <code>newproject/application/configs/application.ini</code>.
-            Tiene los siguientes contenidos:
+            Con el siguiente contenido:
         </para>
 
         <programlisting role="dosini"><![CDATA[
@@ -120,7 +120,7 @@ phpSettings.display_errors = 1
 ]]></programlisting>
 
         <para>
-            Todos los settings en este archivo de configuración son para
+            Todos las opciones en este archivo de configuración son para
             su uso con <classname>Zend_Application</classname>
             y su bootstrap.
         </para>
@@ -128,7 +128,7 @@ phpSettings.display_errors = 1
         <para>
             Otro archivo de interés es <code>newproject/public/index.php</code>,
             el cual invoca a
-            <classname>Zend_Application</classname> y lo despacha.
+            <classname>Zend_Application</classname> y lo envía.
         </para>
 
         <programlisting role="php"><![CDATA[
@@ -158,9 +158,9 @@ $application->bootstrap()
 ]]></programlisting>
 
         <para>
-            Para continuar el inicio rápido, por favor
+            Para continuar con el inicio rápido, por favor
             <link linkend="zend.application.quick-start.resources">
-            salte a la sección de Recursos</link>.
+           vaya a la sección de Recursos</link>.
         </para>
     </sect2>
 
@@ -192,7 +192,7 @@ $application->bootstrap()
 
         <para>
             Primero, genere su clase <code>Bootstrap</code>. Crear un archivo,
-            <code>application/Bootstrap.php</code>, con los siguientes contenidos:
+            <code>application/Bootstrap.php</code>, con el siguiente contenido:
         </para>
 
         <programlisting role="php"><![CDATA[
@@ -204,11 +204,11 @@ class Bootstrap extends Zend_Application_Bootstrap_BootstrapAbstract
 ]]></programlisting>
 
         <para>
-            Ahora, debe crear su configuración. Para este tutorial, vamos a
-            usar un estilo de configuración INI; puede, por supuesto,
-            usar un archivo de configuración XML o PHP. Crear el archivo
+            Ahora, debe crear su configuración. Para este tutorial, usaremos
+            una configuración de estilo INI; puede, por supuesto,
+            usar un archivo de configuración XML o PHP. Cree el archivo
             <code>application/configs/application.ini</code>, proporcionando
-            los siguientes contenidos:
+            el siguiente contenido.
         </para>
 
         <programlisting role="dosini"><![CDATA[
@@ -233,20 +233,20 @@ phpSettings.display_errors = 1
 ]]></programlisting>
 
         <para>
-            Ahora, modifiquemos su script de gateway,
+            Ahora, modifiquemos su script de entrada (gateway),
             <code>public/index.php</code>. Si el archivo no existe, cree uno;
-            de lo contrario, sustituirlo por el siguiente contenido:
+            de lo contrario, sustitúyalo por el siguiente contenido:
         </para>
 
         <programlisting role="php"><![CDATA[
 
 <?php
-// Define el path al directorio de la aplicación
+// Define la ruta al directorio de la aplicación
 defined('APPLICATION_PATH')
     || define('APPLICATION_PATH',
               realpath(dirname(__FILE__) . '/../application'));
 
-// Define el medio ambiente de la aplicación
+// Define el entorno de la aplicación
 defined('APPLICATION_ENV')
     || define('APPLICATION_ENV',
               (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV')
@@ -265,10 +265,10 @@ $application->bootstrap()
 ]]></programlisting>
 
         <para>
-            Usted puede observar que el valor constante del entorno de aplicación
+            Se puede observar que el valor constante del entorno de la aplicación
             busca una variable de entorno "APPLICATION_ENV".
-            Recomendamos este ajuste en el medio ambiente de su servidor web.
-            En Apache, puede configurar esto también en su definición de vhost,
+            Recomendamos este ajuste en el entorno de su servidor web.
+            En Apache, puede también configurarlo en la definición de su vhost,
             o en su archivo <code>.htaccess</code>. Recomendamos el siguiente
             contenido para su archivo <code>public/.htacces</code>:
         </para>
@@ -296,22 +296,22 @@ RewriteRule ^.*$ index.php [NC,L]
 
         <para>
             Si ha seguido las instrucciones anteriores, entonces su clase de
-            arranque estará utilizando un controlador frontal,
-            y cuando se ejecute, despachará el controlador frontal.
+            arranque estará utilizando un controlador frontal (front controller),
+            y cuando se ejecute, enviará el controlador frontal (front controller).
             Sin embargo, con toda probabilidad, necesitará un poco más de
             configuración que ésta.
         </para>
 
         <para>
             En esta sección, veremos como añadir dos recursos a su aplicación.
-            En primer lugar, estableceremos los diseños,
-            y luego personalizaremos su objeto de vista.
+            En primer lugar, estableceremos los layouts,
+            y luego vamos a personalizar sus objetos de la  vista.
         </para>
 
         <para>
-            Uno de los recursos standard provistos con
+            Uno de los recursos estándar provistos con
             <classname>Zend_Application</classname> es el recurso "layout".
-            Este recurso espera que usted defina valores de configuración, los
+            Este recurso espera que definas valores de configuración, los
             que entonces utilizará para configurar su instancia
             <classname>Zend_Layout</classname>.
         </para>
@@ -346,11 +346,11 @@ phpSettings.display_errors = 1
 ]]></programlisting>
 
         <para>
-            Si hasta ahora usted no lo ha hecho, genere el directorio
+            Si hasta ahora no lo ha hecho, genere el directorio
             <code>application/layouts/scripts/</code>, y el archivo
-            <code>layout.phtml</code> dentro de ese directorio. Un buen diseño
+            <code>layout.phtml</code> dentro de ese directorio. Un buen layout
             inicial es como sigue
-            (y vincularlo con el recurso vista que cubriremos a continuación):
+            (y vincularlo con los recursos de la vista que cubriremos a continuación):
         </para>
 
         <programlisting role="php"><![CDATA[
@@ -370,7 +370,7 @@ phpSettings.display_errors = 1
 ]]></programlisting>
 
         <para>
-            En este punto, usted tendrá un diseño ya trabajando.
+            En este punto, usted tendrá un layout ya trabajando.
         </para>
 
         <para>
@@ -393,13 +393,13 @@ class Bootstrap extends Zend_Application_Bootstrap_BootstrapAbstract
         $view->doctype('XHTML1_STRICT');
         $view->headTitle('My First Zend Framework Application');
 
-        // Agregarla al ViewRenderer
+        // Añadir al ViewRenderer
         $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
             'ViewRenderer'
         );
         $viewRenderer->setView($view);
 
-        // Retornarla, de modo que pueda ser almacenada en el arranque (bootstrap)
+        // Retorno, de modo que pueda ser almacenada en el arranque (bootstrap)
 
         return $view;
     }
@@ -408,8 +408,8 @@ class Bootstrap extends Zend_Application_Bootstrap_BootstrapAbstract
 
         <para>
             Este método se ejecuta automáticamente cuando arranca la aplicación,
-            y se asegurará que su vista sea inicializada según sus necesidades
-            de aplicación.
+            y se asegurará que su vista sea inicializada según las necesidades
+            de su aplicación.
         </para>
     </sect2>
 
@@ -417,8 +417,8 @@ class Bootstrap extends Zend_Application_Bootstrap_BootstrapAbstract
         <title>Próximos pasos con Zend_Application</title>
 
         <para>
-            Con lo anterior usted comenzó con <classname>Zend_Application</classname>
-            y pudo crear su aplicación bootstrap. Desde aquí, usted debe comenzar a
+            Con lo anterior debería poder comenzar con <classname>Zend_Application</classname>
+            y con la creación del bootstrap de su aplicación.  De aquí, usted debe comenzar a
             crear sus métodos de recursos, o para la máxima re-usabilidad,
             clases de recursos de plugin. Y seguir leyendo para aprender más!
         </para>

+ 330 - 0
documentation/manual/es/module_specs/Zend_Auth_Adapter_DbTable.xml

@@ -0,0 +1,330 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.auth.adapter.dbtable">
+    <title>Tabla de base de datos de autenticación</title>
+    <sect2 id="zend.auth.adapter.dbtable.introduction">
+        <title>Introducción</title>
+        <para>
+            <classname>Zend_Auth_Adapter_DbTable</classname> proporciona la capacidad
+            de autenticar contra credenciales almacenadas en una tabla de la base de
+            datos. Como <classname>Zend_Auth_Adapter_DbTable</classname> requiere una 
+            instancia de <classname>Zend_Db_Adapter_Abstract</classname> que será
+            pasada a su constructor, cada instancia está vinculada a una conexión
+            concreta de la base de datos. Se pueden establecer otras opciones de 
+            configuración a través del constructor y de métodos de instancia:
+        </para>
+        <para>
+            Las opciones de configuración disponibles incluyen:
+            <itemizedlist>
+                <listitem>
+                    <para>
+                        <code>tableName</code>: Nombre de tabla de la base de datos que
+                        contiene las credenciales de autenticación, y contra la cual
+                        se realiza la búsqueda de autenticación en la base de datos.
+                        </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <code>identityColumn</code>: Nombre de la columna de la tabla
+                        de la base de datos utilizada para representar la identidad. La 
+                        columna identidad debe contar con valores únicos, tales como un
+                        apellido ó una dirección de e-mail.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <code>credentialColumn</code>: Nombre de la columna de la tabla 
+                        de la base de datos utilizada para representar la credencial.
+                        Conforme a un sistema de identidad simple y autenticación de 
+                        contraseña, el valor de la credencial corresponde con la 
+                        contraseña. Véase también la opción <code>credentialTreatment
+                        </code>.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <code>credentialTreatment</code>: En muchos casos, contraseñas
+                        y otros datos son encriptados, mezclados, codificados,
+                        ocultados, desplazados o tratados de otra manera a través de 
+                        alguna función o algoritmo. Al especificar una cadena de 
+                        tratamiento parametrizada con este método, tal como 
+                        <code>'MD5(?)'</code> o <code>'PASSWORD(?)'</code>, un 
+                        desarrollador podría aplicar sentencias arbitrarias SQL 
+                        sobre los datos credenciales de entrada. Ya que estas funciones 
+                        son específicas de los RDBMS, debemos consultar el manual de la 
+                        base de datos para comprobar la disponibilidad de tales 
+                        funciones para su sistema de base de datos.
+                    </para>
+                </listitem>
+            </itemizedlist>
+        </para>
+        <example id="zend.auth.adapter.dbtable.introduction.example.basic_usage">
+            <title>Uso Básico</title>
+            <para>
+            	Como se explicó en la introducción, el constructor
+            	<classname>Zend_Auth_Adapter_DbTable</classname> requiere una instancia 
+            	de <classname>Zend_Db_Adapter_Abstract</classname> que sirve como 
+            	conexión a la base de datos a la cual la instancia de autenticación 
+            	está obligada a adaptarse. En primer lugar, la conexión de la base de 
+            	datos debe ser creada.
+            </para>
+            <para>
+                El siguiente código crea un adaptador para una base de datos en memoria
+                , un esquema simple de la tabla, e inserta una fila contra la que se 
+                pueda realizar una consulta de autenticación posterior. Este ejemplo 
+                requiere que la extensión DOP SQLite esté disponible.
+            </para>
+            <programlisting role="php"><![CDATA[
+// Crear una conexión en memoria de la bade de datos SQLite
+$dbAdapter = new Zend_Db_Adapter_Pdo_Sqlite(array('dbname' =>
+                                                  ':memory:'));
+
+// Construir mediante una consulta una simple tabla
+$sqlCreate = 'CREATE TABLE [users] ('
+           . '[id] INTEGER  NOT NULL PRIMARY KEY, '
+           . '[username] VARCHAR(50) UNIQUE NOT NULL, '
+           . '[password] VARCHAR(32) NULL, '
+           . '[real_name] VARCHAR(150) NULL)';
+
+// Crear las credenciales de autenticación de la tabla
+$dbAdapter->query($sqlCreate);
+
+// Construir una consulta para insertar una fila para que se pueda realizar la autenticación
+$sqlInsert = "INSERT INTO users (username, password, real_name) "
+           . "VALUES ('my_username', 'my_password', 'My Real Name')";
+
+// Insertar los datos
+$dbAdapter->query($sqlInsert);
+]]></programlisting>
+            <para>
+                Con la conexión de la base de datos y los datos de la tabla 
+                disponibles, podemos crear un instancia de 
+                <classname>Zend_Auth_Adapter_DbTable</classname>. Los valores de las opciones  
+                de configuración pueden ser pasados al constructor o pasados como 
+                parámetros a los métodos setter después de ser instanciados.
+                </para>
+            <programlisting role="php"><![CDATA[
+// Configurar la instancia con los parámetros del constructor...
+$authAdapter = new Zend_Auth_Adapter_DbTable(
+    $dbAdapter,
+    'users',
+    'username',
+    'password'
+);
+
+// ...o configurar la instancia con los métodos setter.
+$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
+
+$authAdapter
+    ->setTableName('users')
+    ->setIdentityColumn('username')
+    ->setCredentialColumn('password')
+;
+]]></programlisting>
+            <para>
+                En este punto, el adaptador de la instancia de autenticación está listo 
+                para aceptar consultas de autenticación. Con el fin de elaborar una 
+                consulta de autenticación, los valores de entrada de la credencial son 
+                pasados por el adaptador ates de llamar al método 
+                <code>authenticate()</code>:
+            </para>
+            <programlisting role="php"><![CDATA[
+// Seleccionamos los valores de entrada de la credencial (e.g., de un formulario de acceso)
+$authAdapter
+    ->setIdentity('my_username')
+    ->setCredential('my_password')
+;
+
+// Ejecutamos la consulta de autenticación, salvando los resultados
+]]></programlisting>
+            <para>
+            	Además de la disponibilidad del método <code>getIdentity()</code> 
+            	sobre el objeto resultante de la autenticación, 
+            	<classname>Zend_Auth_Adapter_DbTable</classname> también ayuda a 
+            	recuperar la fila de al tabla sobre la autenticación realizada.
+                </para>
+            <programlisting role="php"><![CDATA[
+// Imprimir la identidad
+echo $result->getIdentity() . "\n\n";
+
+// Imprimir la fila resultado
+print_r($authAdapter->getResultRowObject());
+
+/* Salida:
+my_username
+
+Array
+(
+    [id] => 1
+    [username] => my_username
+    [password] => my_password
+    [real_name] => My Real Name
+)
+]]></programlisting>
+            <para>
+                Ya que la fila de la tabla contiene el valor de la credencial, es 
+                importante proteger los valores contra accesos no deseados.
+            </para>
+        </example>
+    </sect2>
+    <sect2 id="zend.auth.adapter.dbtable.advanced.storing_result_row">
+        <title>Advanced Usage: Manteniendo el resultado del Objeto DbTable</title>
+        <para>
+        	Por defecto, <classname>Zend_Auth_Adapter_DbTable</classname> devuelve la 
+        	identidad proporcionada al objeto Auth en la autenticación 
+        	realizada. Otro de los casos de uso, donde los desarrolladores desean 
+        	guardar para mantener el mecanismo de almacenamiento de un objeto identidad 
+        	<classname>Zend_Auth</classname> que contiene información útil, se 
+        	resuelve usando el método <code>getResultRowObject()</code> para devolver 
+        	un objeto <code>stdClass</code>. El siguiente fragmento de código muestra 
+        	su uso:
+        </para>
+        <programlisting role="php"><![CDATA[
+// Autenticar con Zend_Auth_Adapter_DbTable
+$result = $this->_auth->authenticate($adapter);
+
+if ($result->isValid()) {
+    // Almacena la identidad como un objedo dónde solo username y
+    // real_name han sido devueltos
+    $storage = $this->_auth->getStorage();
+    $storage->write($adapter->getResultRowObject(array(
+        'username',
+        'real_name',
+    )));
+
+    // Almacena la identidad como un objeto dónde la columna contraseña ha
+    // sido omitida
+    $storage->write($adapter->getResultRowObject(
+        null,
+        'password'
+    ));
+
+    /* ... */
+
+} else {
+
+    /* ... */
+
+}
+]]></programlisting>
+    </sect2>
+    <sect2 id="zend.auth.adapter.dbtable.advanced.advanced_usage">
+        <title>Ejemplo de Uso Avanzado</title>
+        <para>
+        	Si bien el objetivo primordial de <classname>Zend_Auth</classname> (y, 
+        	por consiguiente, <classname>Zend_Auth_Adapter_DbTable</classname>) es 
+        	principalmente la <emphasis>autenticación</emphasis> y no 
+        	la <emphasis>autorización</emphasis>, hay unos pocos casos 
+        	y problemas que se encuentran al límite entre cuales encajan dentro del 
+        	dominio.
+        	Dependiendo de cómo haya decidido explicar su problema, a veces tiene 
+        	sentido resolver lo que podría parecer un problema de autorización 
+        	dentro de un adaptador de autenticación.
+        </para>
+        <para>
+            Con esa excepción fuera de lo común, 
+            <classname>Zend_Auth_Adapter_DbTable</classname> ha construido mecanismos 
+            que pueden ser aprovechados para realizar controles adicionales en la 
+            autenticación a la vez que se resuelven algunos problemas comunes de los 
+            usuarios.
+        </para>
+        <programlisting role="php"><![CDATA[
+// El valor del campo status de una cuenta no es igual a "compromised"
+$adapter = new Zend_Auth_Adapter_DbTable(
+    $db,
+    'users',
+    'username',
+    'password',
+    'MD5(?) AND status != "compromised"'
+);
+
+// El valor del campo active de una cuenta es igual a "TRUE"
+$adapter = new Zend_Auth_Adapter_DbTable(
+    $db,
+    'users',
+    'username',
+    'password',
+    'MD5(?) AND active = "TRUE"'
+]]></programlisting>
+        <para>
+            Otra idea puede ser la aplicación de un mecanismo de "salting". "Salting" 
+            es un término que se refiere a una técnica que puede mejorar altamente la 
+            seguridad de su aplicación. Se basa en la idea de concatenar una cadena 
+            aleatoria a cada contraseña para evitar un ataque de fuerza bruta sobre la
+            base de datos usando los valores hash de un diccionario pre-calculado.
+        </para>
+        <para>
+            Por lo tanto, tenemos que modificar nuestra tabla para almacenar nuestra 
+            cadena mezclada:
+        </para>
+        <programlisting role="php"><![CDATA[
+$sqlAlter = "ALTER TABLE [users] "
+          . "ADD COLUMN [password_salt] "
+          . "AFTER [password]";
+]]></programlisting>
+        <para>
+            Aquí hay una forma sencilla de generar una cadena mezclada por cada 
+            usuario en el momento del registro:
+        </para>
+        <programlisting role="php"><![CDATA[
+for ($i = 0; $i < 50; $i++) {
+    $dynamicSalt .= chr(rand(33, 126));
+]]></programlisting>
+        <para>
+            Y ahora vamos a construir el adaptador:
+        </para>
+        <programlisting role="php"><![CDATA[
+$adapter = new Zend_Auth_Adapter_DbTable(
+    $db,
+    'users',
+    'username',
+    'password',
+    "MD5(CONCAT('"
+    . Zend_Registry::get('staticSalt')
+    . "', ?, password_salt))"
+);
+]]></programlisting>
+        <note>
+            <para>
+                Puede mejorar aún más la seguridad mediante el uso de un valor 
+                'salt' estático fuertemente codificado en su aplicación. En el caso de 
+                que su base de datos se vea comprometida (por ejemplo, por un ataque 
+                de inyección SQL), su servidor web está intacto y sus 
+                datos son inutilizable para el atacante.
+            </para>
+        </note>
+        <para>
+            Otra alternativa es utilizar el método <code>getDbSelect()</code> de 
+            Zend_Auth_Adapter_DbTable después de que el adaptador se ha construido. 
+            Este método devolverá la instancia del objeto Zend_Db_Select que se va a 
+            utilizar para completar la rutina de authenticate(). Es importante señalar 
+            que este método siempre devuelve el mismo objeto, independientemente de si 
+            authenticate() ha sido llamado o no. Este objeto 
+            <emphasis>no tendrá</emphasis> ninguna de las 
+            credenciales de identidad o información de como estos valores son colocados 
+            dentro del objeto seleccionado en authenticate().
+        </para>
+        <para>
+            Un ejemplo de una situación en la que uno podría querer utilizar el 
+            método getDbSelect() sería comprobar el estado de un usuario, en otras 
+            palabras, ver si la cuenta del usuario está habilitada.
+        </para>
+        <programlisting role="php"><![CDATA[
+// Continuando con el ejemplo de arriba
+$adapter = new Zend_Auth_Adapter_DbTable(
+    $db,
+    'users',
+    'username',
+    'password',
+    'MD5(?)'
+);
+
+// obtener el objeto select (por referencia)
+$select = $adapter->getDbSelect();
+$select->where('active = "TRUE"');
+
+// authenticate, esto asegura que users.active = TRUE
+$adapter->authenticate();
+]]></programlisting>
+    </sect2>
+</sect1>

+ 118 - 0
documentation/manual/es/module_specs/Zend_Auth_Adapter_Digest.xml

@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.auth.adapter.digest">
+
+    <title>Autenticación "Digest"</title>
+
+    <sect2 id="zend.auth.adapter.digest.introduction">
+
+        <title>Introducción</title>
+
+        <para>
+            La <ulink url="http://en.wikipedia.org/wiki/Digest_access_authentication">Autenticación "Digest"</ulink>
+            es un método de la autenticación HTTP que mejora la 
+            <ulink url="http://en.wikipedia.org/wiki/Basic_authentication_scheme">Autenticación Básica</ulink>
+            proporcionando una manera de autenticar sin tener que transmitir la contraseña de manera clara a través de la red.
+        </para>
+
+        <para>
+            Este adaptador permite la autentificación contra archivos de texto que contengan líneas que tengan los elementos 
+            básicos de la autenticación "Digest":
+            <itemizedlist>
+                <listitem>
+                    <para>
+                        apellido, tal como "<code>joe.user</code>"
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        dominio, tal como "<code>Administrative Area</code>"
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        Hash MD5 del nombre de usuario, dominio y contraseña, separados por dos puntos
+                    </para>
+                </listitem>
+            </itemizedlist>
+            Los elementos anteriores están separados por dos puntos, como en el ejemplo siguiente (en el que 
+            la contraseña es "<code>somePassword</code>"):
+        </para>
+
+        <programlisting><![CDATA[
+someUser:Some Realm:fde17b91c3a510ecbaf7dbd37f59d4f8
+]]></programlisting>
+
+    </sect2>
+
+    <sect2 id="zend.auth.adapter.digest.specifics">
+
+        <title>Detalles Específicos</title>
+
+        <para>
+            El adaptador de autenticación "Digest", <classname>Zend_Auth_Adapter_Digest</classname>, requiere varios 
+            parámetros de entrada:
+            <itemizedlist>
+                <listitem>
+                    <para>
+                        filename - Nombre del archivo contra el que se realiza la autenticación de las consultas
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                       realm - Domino de la autenticación "Digest"
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        username - Usuario de la autenticación "Digest" 
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                       password - Contraseña para el usuario del dominio
+                    </para>
+                </listitem>
+            </itemizedlist>
+            Estos parámetros deben ser establecidos antes de llamar a <code>authenticate()</code>.
+        </para>
+
+    </sect2>
+
+    <sect2 id="zend.auth.adapter.digest.identity">
+
+        <title>Identidad</title>
+
+        <para>
+            El adaptador de autenticación "Digest" devuelve un objeto <classname>Zend_Auth_Result</classname>, que ha sido rellenado
+            con la identidad como un array que tenga claves <code>realm</code> y <code>username</code>. Los respectivos valores del 
+            array asociados con esas claves correspondes con los valores fijados andes de llamar a <code>authenticate()</code>.
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$adapter = new Zend_Auth_Adapter_Digest($filename,
+                                        $realm,
+                                        $username,
+                                        $password);
+
+$result = $adapter->authenticate();
+
+$identity = $result->getIdentity();
+
+print_r($identity);
+
+/*
+Array
+(
+    [realm] => Some Realm
+    [username] => someUser
+)
+*/
+]]></programlisting>
+
+    </sect2>
+
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 279 - 0
documentation/manual/es/module_specs/Zend_Auth_Adapter_Http.xml

@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.auth.adapter.http">
+
+    <title>Adaptador de Autenticación HTTP</title>
+
+    <sect2 id="zend.auth.adapter.http.introduction">
+
+        <title>Introducción</title>
+
+        <para>
+            <classname>Zend_Auth_Adapter_Http</classname> proporciona una implementación compatible con
+            <ulink url="http://tools.ietf.org/html/rfc2617">RFC-2617</ulink>, 
+            <ulink url="http://en.wikipedia.org/wiki/Basic_authentication_scheme">Basic</ulink> y
+            <ulink url="http://en.wikipedia.org/wiki/Digest_access_authentication">Digest</ulink> Autenticación HTTP.
+            La autenticación "Digest" es un método de autenticación HTTP que mejora la autenticación básica proporcionando 
+            una manera de autenticar sin tener que transmitir la contraseña de manera clara en un texto a través de la red.
+        </para>
+
+        <para>
+            <emphasis role="strong">Características Principales:</emphasis>
+            <itemizedlist>
+                <listitem>
+                    <para>
+                        Soporta tanto Autenticación "Digest" como Básica.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        Establece retos en todos los proyectos soportados, por lo que el cliente puede responder con cualquier 
+                        proyecto que soporte.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        Soporta autenticación proxy.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        Incluye soporte para la autenticación contra archivos de texto y proporciona una interfaz para 
+                        autenticar contra otras fuentes, tales como bases de datos.
+                    </para>
+                </listitem>
+            </itemizedlist>
+        </para>
+
+        <para>
+            Hay algunas características notables del RFC-2617 no implementadas todavía:
+            <itemizedlist>
+                <listitem>
+                    <para>
+                        Seguimiento "nonce", que permitiría un gran apoyo, y un aumento de la protección de repetidos 
+                        ataques.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        Autenticación con comprobación de integridad, o "auth-int".
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        Cabecera de información de la autenticación HTTP.
+                    </para>
+                </listitem>
+            </itemizedlist>
+        </para>
+
+    </sect2>
+
+    <sect2 id="zend.auth.adapter.design_overview">
+
+        <title>Descripción del diseño</title>
+
+        <para>
+            Este adaptador consiste en dos sub-componentes, la propia clase autenticación HTTP, y el llamado "Resolvers". 
+            La clase autenticación HTTP encapsula la lógica para llevar a cabo tanto la autenticación basica y la "Digest".
+            Utiliza un Resolver para buscar la identidad de un cliente en los datos almacenados (por defecto, archivos de texto), 
+            y recuperar las credenciales de los datos almacenados. Las credenciales del "Resolved" se comparan con los valores
+            presentados por el cliente para determinar si la autenticación es satisfactoria.
+        </para>
+
+    </sect2>
+
+    <sect2 id="zend.auth.adapter.configuration_options">
+
+        <title>Opciones de Configuración</title>
+
+        <para>
+            La clase <classname>Zend_Auth_Adapter_Http</classname> requiere un array configurado que pasará a su constructor.
+            Hay varias opciones de configuración disponibles, y algunas son obligatorias:
+            <table id="zend.auth.adapter.configuration_options.table">
+                <title>Opciones de Configuración</title>
+                <tgroup cols="3">
+                    <thead>
+                        <row>
+                            <entry>Nombre de Opción</entry>
+                            <entry>Obligatoria</entry>
+                            <entry>Descripción</entry>
+                        </row>
+                    </thead>
+                    <tbody>
+                        <row>
+                            <entry><code>accept_schemes</code></entry>
+                            <entry>Si</entry>
+                            <entry>
+                                Determina que tareas de autenticación acepta el adaptador del cliente. 
+                                Debe ser una lista separada por espacios que contengo <code>'basic'</code> y/o <code>'digest'</code>.
+                            </entry>
+                        </row>
+                        <row>
+                            <entry><code>realm</code></entry>
+                            <entry>Si</entry>
+                            <entry>
+                                Establece el realm de autenticación; usernames debe ser único dentro de un determinado realm.
+                            </entry>
+                        </row>
+                        <row>
+                            <entry><code>digest_domains</code></entry>
+                            <entry>Si, cuando <code>'accept_schemes'</code> contiene <code>'digest'</code></entry>
+                            <entry>
+                                Lista de URIs separadas por espacios para las cuales la misma información de autenticación es válida.
+                                No es necesario que todas las URIs apunten al mismo oservidor.
+                            </entry>
+                        </row>
+                        <row>
+                            <entry><code>nonce_timeout</code></entry>
+                            <entry>Si, cuando <code>'accept_schemes'</code> contiene <code>'digest'</code></entry>
+                            <entry>
+                                Establece el número de segundos para los cuales el "nonce" es válido.
+                                Ver notas de abajo.
+                            </entry>
+                        </row>
+                        <row>
+                            <entry><code>proxy_auth</code></entry>
+                            <entry>No</entry>
+                            <entry>
+                                Deshabilitado por defecto. Permite llevar a cabo la autenticación del Proxy, en lugar 
+                                de la autenticación normal del servidor.
+                            </entry>
+                        </row>
+                    </tbody>
+                </tgroup>
+            </table>
+        </para>
+
+        <note>
+            <para>
+                La implementación actual del <code>nonce_timeout</code> tiene algunos efectos colaterales interesantes. Este 
+                ajuste es supuesto para determinar la vida util válida para un determinado "nonce", o de manera efectiva el tiempo 
+                que una información de autenticación del cliente es aceptada. Actualmente, si se establece en 3600 (por ejemplo), 
+                hará que el adaptador indique al cliente las nuevas credenciales cada hora, a la hora en punto.
+            </para>
+        </note>
+
+    </sect2>
+
+    <sect2 id="zend.auth.adapter.http.resolvers">
+
+        <title>Resolvers</title>
+
+        <para>
+            El trabajo del "Resolver" es tener un username y un realm, y devolver algún valor de tipo credencial. La autenticación 
+            básica espera recibir la versión codificada en Base64 de la contraseña del usuario. La autenticación "Digest" espera 
+            recibir un hash del username del usuario, un realm, y su contraseña (separados por coma). Actualmente, sólo se admite el 
+            algoritmo de hash MD5.
+        </para>
+
+        <para>
+            <classname>Zend_Auth_Adapter_Http</classname> se basa en la implementación de objetos
+            <classname>Zend_Auth_Adapter_Http_Resolver_Interface</classname>. Un archivo de texto de la clase "Resolve" se incluye 
+            con este adaptador, pero cualquier otro tipo de "resolver" puede ser creado simplemente implementando la interfaz del 
+            "resolver".
+        </para>
+
+        <sect3 id="zend.auth.adapter.http.resolvers.file">
+
+            <title>Archivo Resolver</title>
+
+            <para>
+                El archivo "resolver" es una clase muy simple. Tiene una única propiedad que especifique un nombre de archivo, 
+                que también puede ser pasado al constructor. Su método <code>resolve()</code> recorre el archivo de texto,
+                buscando una linea con el correspondiente username y realm. El formato del archivo de texto es similar a los 
+                archivos htpasswd de Apache:
+                <programlisting><![CDATA[
+<username>:<realm>:<credentials>\n
+]]></programlisting>
+                Cada linea consta de tres campos -username, realm, y credenciales - cada uno separados por dos puntos. El campo 
+                credenciales es opaco al archivo "resolver"; simplemente devuelve el valor tal como és al llamador. Por lo tanto, 
+                este formato de archivo sirve tanto de autenticación básica como "Digest". En la autenticación básica, el campo 
+                credenciales debe ser escrito en texto claro. En la autenticación "Digest", debería ser en hash MD5 descrito 
+                anteriormente.
+            </para>
+
+            <para>
+                Hay dos formas igualmente fácil de crear un archivo de "resolver":
+                <programlisting role="php"><![CDATA[
+$path     = 'files/passwd.txt';
+$resolver = new Zend_Auth_Adapter_Http_Resolver_File($path);
+]]></programlisting>
+                o
+                <programlisting role="php"><![CDATA[
+$path     = 'files/passwd.txt';
+$resolver = new Zend_Auth_Adapter_Http_Resolver_File();
+$resolver->setFile($path);
+]]></programlisting>
+                Si la ruta está vacía o no se puede leer, se lanza una excepción.
+            </para>
+
+        </sect3>
+
+    </sect2>
+
+    <sect2 id="zend.auth.adapter.http.basic_usage">
+
+        <title>Uso Básico</title>
+
+        <para>
+            En primer lugar, establecemos un array con los valores de configuración obligatorios:
+            <programlisting role="php"><![CDATA[
+$config = array(
+    'accept_schemes' => 'basic digest',
+    'realm'          => 'My Web Site',
+    'digest_domains' => '/members_only /my_account',
+    'nonce_timeout'  => 3600,
+);
+]]></programlisting>
+			Este array hará que el adaptador acepte la autenticación básica o "Digest", y requerirá un acceso autenticado 
+			a todas las áreas del sitio en <code>/members_only</code> y <code>/my_account</code>. El valor realm es normalmente 
+			mostrado por el navegador en el cuadro de dialogo contraseña. El <code>nonce_timeout</code>, por supuesto, se 
+			comporta como se ha descrito anteriormente.
+        </para>
+
+        <para>
+            A continuación, creamos el objeto Zend_Auth_Adapter_Http:
+            <programlisting role="php"><![CDATA[
+$adapter = new Zend_Auth_Adapter_Http($config);
+]]></programlisting>
+        </para>
+
+        <para>
+            Ya que estamos soportando tanto la autenticación básica como la "Digest", necesitamos dos objetos diferentes 
+            resolver. Tenga en cuenta que esto podría ser facilmente dos clases diferentes:
+            <programlisting role="php"><![CDATA[
+$basicResolver = new Zend_Auth_Adapter_Http_Resolver_File();
+$basicResolver->setFile('files/basicPasswd.txt');
+
+$digestResolver = new Zend_Auth_Adapter_Http_Resolver_File();
+$digestResolver->setFile('files/digestPasswd.txt');
+
+$adapter->setBasicResolver($basicResolver);
+$adapter->setDigestResolver($digestResolver);
+]]></programlisting>
+        </para>
+
+        <para>
+            Por último, realizamos la autenticación. El adaptador necesita una referencia a ambos objetos solicitud y 
+            respuesta para hacer su trabajo:
+            <programlisting role="php"><![CDATA[
+assert($request instanceof Zend_Controller_Request_Http);
+assert($response instanceof Zend_Controller_Response_Http);
+
+$adapter->setRequest($request);
+$adapter->setResponse($response);
+
+$result = $adapter->authenticate();
+if (!$result->isValid()) {
+    // Bad userame/password, or canceled password prompt
+}
+]]></programlisting>
+        </para>
+
+    </sect2>
+
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 49 - 49
documentation/manual/es/module_specs/Zend_Controller-Basics.xml

@@ -7,7 +7,7 @@
         El sistema <classname>Zend_Controller</classname> está diseñado para
         ser liviano, modular y extensible. Se trata de un diseño minimalista
         para permitir flexibilidad y cierta libertad para los usuarios
-        proporcionando al mismo tiempo suficiente estructura para que sistemas
+        proporcionando al mismo tiempo una estructura suficiente para que sistemas
         construidos alrededor de <classname>Zend_Controller</classname>
         compartan algunas convenciones y layouts de código similares.
     </para>
@@ -23,7 +23,7 @@
     </para>
 
     <para>
-        El workflow de <classname>Zend_Controller</classname> está implementado
+        El flujo de procesos de <classname>Zend_Controller</classname> está implementado
         por varios componentes. Si bien no es necesario entender los cimientos
         de todos estos componentes para utilizar el sistema, tener un
         conocimiento práctico del proceso es de mucha utilidad.
@@ -32,12 +32,12 @@
         <itemizedlist>
             <listitem>
                 <para>
-                    <classname>Zend_Controller_Front</classname> orquesta todo
-                    el workflow del sistema <classname>Zend_Controller</classname>.
+                    <classname>Zend_Controller_Front</classname> organiza todo
+                    el flujo de trabajo del sistema <classname>Zend_Controller</classname>.
                     Es una interpretación del patrón FrontController.
                     <classname>Zend_Controller_Front</classname> procesa todas
                     las solicitudes recibidas por el servidor y es responsable
-                    en última instancia para delegar requerimientos a los
+                    en última instancia de la delegación de las solicitudes  a los
                     ActionControllers
                     (<classname>Zend_Controller_Action</classname>).
                 </para>
@@ -47,22 +47,22 @@
                 <para>
                     <classname>Zend_Controller_Request_Abstract</classname> (a
                     menudo denominado <code>Request Object</code>) representa
-                    el medio ambiente de la solicitud y ofrece métodos para
-                    establecer y recuperar el controlador, los nombres de
-                    acción y cualquier parámetro de solicitd. Además mantiene
-                    la pista de si la acción que contiene ha sido enviada o no
+                    el entorno de la solicitud y ofrece métodos para
+                    establecer y recuperar el controlador, los nombres de las
+                    acciones y cualquier parámetro de solicitud. Además realiza un seguimiento
+                    de si la acción que contiene ha sido enviada o no
                     por <classname>Zend_Controller_Dispatcher</classname>.
-                    Se pueden uar extensiones del objeto abstracto para
-                    encapsular toda el medio ambiente de la solicitud,
-                    permitiendo a los routers traer información del medio
-                    ambiente de la solicitud a fin de establecer el controlador
+                    Se pueden usar extensiones del objeto abstracto para
+                    encapsular toda el entorno de la solicitud,
+                    permitiendo a los routers traer información del ámbito
+                    de la solicitud a fin de establecer el controlador
                     y los nombres de acción.
                 </para>
 
                 <para>
                     Por defecto, se usa
-                    <classname>Zend_Controller_Request_Http</classname>, que
-                    proporciona acceso a todo el medio ambiente de la petición
+                    <classname>Zend_Controller_Request_Http</classname>, el cual
+                    proporciona acceso a todo el ámbito de la petición
                     HTTP.
                 </para>
             </listitem>
@@ -71,24 +71,24 @@
                 <para>
                     <classname>Zend_Controller_Router_Interface</classname>
                     se usa para definir routers. El ruteo es el proceso de
-                    examinar el medio ambiente de la solicitud para determinar
-                    qué controlador, y qué acción del contralor debe recibir
+                    examinar el ámbito de la solicitud para determinar
+                    qué controlador, y qué acción del controlador debe recibir
                     la solicitud. Este controlador, la acción, y los parámetros
-                    opcionales son luego establecidos en el objeto solicitud
+                    opcionales son luego establecidos en el objeto de la  solicitud
                     para ser procesados por
                     <classname>Zend_Controller_Dispatcher_Standard</classname>.
                     El ruteo (routing) ocurre sólo una vez: cuando la solicitud
-                    se recibie inicialmente y antes de despachar el primer
+                    se recibe inicialmente y antes de enviar el primer
                     controlador.
                 </para>
 
                 <para>
                     El router por defecto,
                     <classname>Zend_Controller_Router_Rewrite</classname>,
-                    toma el punto final de una URI como se especidicó en
+                    toma el punto final de una URI como se especificó en
                     <classname>Zend_Controller_Request_Http</classname>
-                    y la descompone en un controlador, acción y parámetros
-                    basados en la información del path en la url.
+                    y la descompone en un controlador, una acción y parámetros,
+                    basándose en la información de la ruta del url.
                     Como ejemplo, la URL
                     <code>http://localhost/foo/bar/key/value</code> se
                     decodificará para usar el controlador <code>foo</code>,
@@ -98,7 +98,7 @@
 
                 <para>
                     <classname>Zend_Controller_Router_Rewrite</classname>
-                    también puede ser utilizado para igualar paths arbitrarios;
+                    también puede ser utilizado para igualar las rutas arbitrarios;
                     para más información, ver <link
                         linkend="zend.controller.router">documentación
                         del router</link>.
@@ -108,29 +108,29 @@
             <listitem>
                 <para>
                     <classname>Zend_Controller_Dispatcher_Interface</classname>
-                    se usa para definir despachadores. Despachar es el proceso
-                    de sacar el controlador y la acción del objeto solicitud y
+                    se usa para definir dispatchers. Dispatching (Despachar) es el proceso
+                    de sacar el controlador y la acción del objeto que solicita y
                     mapearlo a un controlador archivo/clase y al método acción
                     en la clase del controlador. Si el controlador o acción no
                     existen, hará un manejo para determinar los controladores
-                    por defecto y las acciones a despachar.
+                    por defecto y las acciones a enviar.
                 </para>
 
                 <para>
-                    El proceso actual de despacho consta de instanciar la
+                    El proceso actual de dispatching(despacho) consta de instanciar la
                     clase del controlador y llamar al método acción en esa
                     clase. A diferencia del routing, que ocurre sólo una vez,
-                    el despacho ocurre en un bucle. Si el status del objeto
-                    solicitud despachado es reseteado en cualquier punto,
+                    el dispatching(despacho) ocurre en un bucle. Si el estado del objeto que
+                    que envía la solicita es reseteado en cualquier punto,
                     el bucle se repetirá, llamando a cualquier acción que esté
-                    actualmente establecida en el objeto solicitud.
-                    La primera vez el bucle termina con el objeto solicitud,
-                    el status de lo despachado se establece a (booleano true),
+                    actualmente establecida en la solicitud del objeto.
+                    La primera vez el bucle termina con la solicitud del objeto,
+                    el estado de lo enviado se establece a (booleano true),
                     que terminará el procesamiento.
                 </para>
 
                 <para>
-                    El despachador por defecto es
+                    El dispatcher por defecto es
                     <classname>Zend_Controller_Dispatcher_Standard</classname>.
                     Se definen como controladores MixedCasedClasses cuando
                     terminan en la palabra Controller, y los métodos de acción
@@ -141,22 +141,22 @@
                 </para>
 
                 <note>
-                    <title>Convenciones para Case Naming</title>
+                    <title>Convenciones para Case Naming (Casos de Nombre)</title>
 
                     <para>
                         Dado que los humanos somos notablemente inconsistentes
                         en mantener cierta sensibilidad respecto a las
-                        minúsculas y mayúusculas al escribir enlaces,
-                        Zend Framework realmente normaliza ls información del
-                        path a minúsculas. Esto, por supuesto, afectará cómo
-                        nombre usted a su controlador y acciones... o referirse
+                        minúsculas y mayúsculas al escribir enlaces,
+                        Zend Framework realmente normaliza la información de la
+                       ruta a minúsculas. Esto, por supuesto, afectará cómo
+                        nombre a su controlador y a sus acciones... o referirse
                         a ellos en los enlaces.
                     </para>
 
                     <para>
                         Si desea que su clase controlador o el nombre del
                         método de la acción tenga múltiples MixedCasedWords o
-                        camelCasedWords, para separar las palabras en la RUL
+                        camelCasedWords, para separar las palabras en la url
                         necesitará hacerlo con un '-' o '.' (aunque puede
                         configurar el carácter utilizado).
                     </para>
@@ -176,7 +176,7 @@
                     <classname>Zend_Controller_Action</classname>
                     es el componente base del controlador de acción.
                     Cada controlador es una sola clase que extiende la
-                    <classname>Zend_Controller_Action class</classname>
+                    <classname>clase Zend_Controller_Action </classname>
                     y debe contener uno o más métodos de acción.
                 </para>
             </listitem>
@@ -190,7 +190,7 @@
                 </para>
 
                 <para>
-                    La clase respuesta por defecto es
+                    La clase de respuesta (response) por defecto es
                     <classname>Zend_Controller_Response_Http</classname>,
                     la cual es adecuada para usarla en un entorno HTTP.
                 </para>
@@ -198,25 +198,25 @@
         </itemizedlist>
 
     <para>
-        El workflow de <classname>Zend_Controller</classname> es relativamente
+        El flujo de procesos de <classname>Zend_Controller</classname> es relativamente
         sencillo. Una solicitud es recibida por
         <classname>Zend_Controller_Front</classname>, la que a su vez llama a
         <classname>Zend_Controller_Router_Rewrite</classname>
-        para determinar qué controlador (y la acción en ese contralor)
+        para determinar qué controlador (y la acción en ese controlador)
         despachar.
         <classname>Zend_Controller_Router_Rewrite</classname>
         descompone la URI a fin de establecer el controlador y el nombre de
         acción en la solicitud.
         <classname>Zend_Controller_Front</classname>
-        entonces entra al loop de despacho. Llama a
+        entonces entra al bucle del dispatch. Llama a
         <classname>Zend_Controller_Dispatcher_Standard</classname>,
-        le pasa la solicitud para despachar al contralor y a la acción
+        el que pasa la solicitud para enviar al controlador y a la acción
         especificada en la solicitud (o el usado por defecto).
-        Después de que el contralor ha terminado, el control vuelve a
+        Después de que el controlador ha terminado, el control vuelve a
         <classname>Zend_Controller_Front</classname>.
-        Si el contralor ha indicado que debe despacharse otro controlador
-        mediante el reinicio de la condición (status) de la solicitud,
-        el bucle continúa y se ejecuta otro despacho.
+        Si el controlador ha indicado que debe enviarse otro controlador
+        mediante el reinicio del estado de la condición  de la solicitud,
+        el bucle continúa y se ejecuta otro envio.
         En caso contrario el proceso termina.
     </para>
 </sect1>

+ 6 - 5
documentation/manual/es/module_specs/Zend_Controller-FrontController.xml

@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 15103 -->
 <!-- Reviewed: no -->
 <sect1 id="zend.controller.front">
     <title>El Front Controller</title>
@@ -12,8 +13,8 @@
                 Controller pattern</ulink> usado en aplicaciones <ulink
                 url="http://en.wikipedia.org/wiki/Model-view-controller">Model-View-Controller
                 (MVC)</ulink>. 
-                Su propósito es inicializar el medio ambiente de la solicitud, 
-                rutear la solicitud entrante, y luego hacer un dispatch de 
+                Su propósito es inicializar el entorno de la solicitud, 
+                rutear la solicitud entrante, y luego hacer un envío de 
                 cualquier de las acciones descubiertas; le agrega las respuestas 
                 y las regresa cuando se completa el proceso.  
         </para>
@@ -24,12 +25,12 @@
             pattern</ulink>, significando que solo una única instancia de él 
             puede estar disponible en cualquier momento dado. 
             Esto le permite actuar también como un registro en el que los demás 
-            objetos puden extraer del proceso dispatch.
+            objetos pueden extraer del proceso dispatch.
         </para>
 
         <para>
             <classname>Zend_Controller_Front</classname> registra un <link
-                linkend="zend.controller.plugins">plugin broker</link> consígo  
+                linkend="zend.controller.plugins">plugin broker</link> consigo  
             mismo, permitiendo que diversos eventos que dispara sean observados 
             por plugins. En muchos casos, esto da el desarrollador la 
             oportunidad de adaptar el proceso de dispatch al sitio sin la 
@@ -207,7 +208,7 @@ $front->addControllerDirectory('../modules/foo/controllers', 'foo');
 
             <para>
                 Similarmente, <code>dispatch()</code> 
-                comprueba los objetos registados <link
+                comprueba los objetos registrados <link
                     linkend="zend.controller.router">router</link> y <link
                     linkend="zend.controller.dispatcher">dispatcher</link>
                 , instanciando las versiones por defecto de cada uno si ninguno 

+ 232 - 208
documentation/manual/es/module_specs/Zend_Controller-Migration.xml

@@ -5,31 +5,55 @@
 
     <para>
     	La API de los componentes de MVC  ha cambiado en el tiempo. Si usted ha empezado a
-    	usar una versión anterior de Zend Framework, sigua la guía de abajo para
+    	usar una versión anterior de Zend Framework, siga la guía de abajo para
     	migrar sus acripts para usar la arquitectura nueva.
     </para>
 
+	<sect2 id="zend.controller.migration.fromoneseventooneeight">
+		<title>Migración de 1.7.x a 1.8.0 o nuevas versiones</title>
+
+		<sect3 id="zend.controller.migration.fromoneseventooneeight.router">
+			<title>Cambios en Standard Route </title>
+
+			<para>
+				Como los segmentos traducidos fueron presentados en la nueva
+				standard
+				route, El caracter
+				<code>@</code>
+				es ahora un carácter especial al principio de
+				un segmento del route. Para poder utilizarlo en un segmento estático,
+				tiene que escaparlo usando un segundo caracater
+				<code>@</code>
+				como prefijo. La misma regla se aplica ahora para el
+				caracter
+				<code>:</code>
+				.
+			</para>
+		</sect3>
+	</sect2>
+
+    
     <sect2 id="zend.controller.migration.fromonesixtooneseven">
         <title>Migración de 1.6.x a 1.7.0 o nuevas versiones</title>
 
         <sect3 id="zend.controller.migration.fromonesixtooneseven.dispatcher">
-            <title>El despachador de la interfaz cambios</title>
+            <title>Cambios en la interfaz del Dispatcher</title>
 
             <para>
 				Los usuarios llamaron nuestra atención el hecho de que
                 <classname> Zend_Controller_Action_Helper_ViewRenderer </classname> estaba
-                utilizando un método despachador de la clase abstracta que no está en
-                el despachador de la interfaz. Hemos añadido el siguiente método para
-                garantizar que los despachadores de costumbre seguirán trabajando con las
+                utilizando un método Dispatcher de la clase abstracta que no está en
+                el Dispatcher de la interfaz. Hemos añadido el siguiente método para
+                garantizar que los Dispatcher de costumbre seguirán trabajando con las
                 implementaciones enviadas:
             </para>
 
             <itemizedlist>
             	<listitem><para>
                     <code>formatModuleName()</code>: debe utilizarse para tomar un nuevo
-                nombre de controlador, tal como uno que deberia estar basado dentro de una petición
+                nombre de controlador, tal como uno que debería estar basado dentro de una petición
                 objeto, y cambiarlo a un nombre de clase apropiado que la clase extendida
-                <classname>Zend_Controller_Action</classname> deberia usar
+                <classname>Zend_Controller_Action</classname> debería usar
                 </para></listitem>
             </itemizedlist>
         </sect3>
@@ -39,7 +63,7 @@
         <title>Migrando desde 1.5.x to 1.6.0 o versiones posteriores</title>
 
         <sect3 id="zend.controller.migration.fromoneohtoonesix.dispatcher">
-            <title>El Despachador de la Interfaz de cambios</title>
+            <title>Cambios en la interfaz del Dispatcher</title>
 
             <para>            		
 				Los usuarios atrajeron nuestra atención con el hecho de que
@@ -230,39 +254,39 @@ $front->setParam('noErrorHandler', true);
         </para>
 
         <para>
-            There are several strategies you can take to update your code. In
-            the short term, you can globally disable the
-            <code>ViewRenderer</code> in your front controller bootstrap prior
-            to dispatching:
+        	Existen varias estrategias que se puede tomar para actualizar su código. En
+            el corto plazo, se puede deshabilitar globalmente 
+            <code> ViewRenderer </code> en su controlador frontal bootstrap antes del
+            despache:
         </para>
 
         <programlisting role="php"><![CDATA[
-// Assuming $front is an instance of Zend_Controller_Front
+// Asumiendo que $front es una instacia de Zend_Controller_Front
 $front->setParam('noViewRenderer', true);
 ]]></programlisting>
 
         <para>
-            However, this is not a good long term strategy, as it means most
-            likely you'll be writing more code.
+        	Sin embargo, esta no es una buena estrategia a largo plazo, eso significa que es
+        	probable que usted escriba mas código.
         </para>
 
         <para>
-            When you're ready to start using the <code>ViewRenderer</code>
-            functionality, there are several things to look for in your
-            controller code. First, look at your action methods (the methods
-            ending in 'Action'), and determine what each is doing. If none of
-            the following is happening, you'll need to make changes:
+        	Cuando se esta listo para empezar a usar la funcionalidad
+        	<code>ViewRenderer</code>, existen demasiadas cosas que ver en el
+        	código del controlador. Primero, ver las acciones método (los métodos
+        	terminados en 'Action'), y determinar lo que cada uno esta haciendo. Si ninguno
+        	de los siguientes esta pasando, usted necesitará hacer cambios:        	
         </para>
 
         <itemizedlist>
-            <listitem><para>Calls to <code>$this-&gt;render()</code></para></listitem>
-            <listitem><para>Calls to <code>$this-&gt;_forward()</code></para></listitem>
-            <listitem><para>Calls to <code>$this-&gt;_redirect()</code></para></listitem>
-            <listitem><para>Calls to the <code>Redirector</code> action helper</para></listitem>
+            <listitem><para>Llamar a <code>$this-&gt;render()</code></para></listitem>
+            <listitem><para>Llamar a <code>$this-&gt;_forward()</code></para></listitem>
+            <listitem><para>Llamar a <code>$this-&gt;_redirect()</code></para></listitem>
+            <listitem><para>Llamar a el <code>Redirector</code> action helper</para></listitem>
         </itemizedlist>
 
         <para>
-            The easiest change is to disable auto-rendering for that method:
+        	La forma mas fácil de cambiar es deshabilitar auto-rendering para ese método:
         </para>
 
         <programlisting role="php"><![CDATA[
@@ -270,10 +294,10 @@ $this->_helper->viewRenderer->setNoRender();
 ]]></programlisting>
 
         <para>
-            If you find that none of your action methods are rendering,
-            forwarding, or redirecting, you will likely want to put the above
-            line in your <code>preDispatch()</code> or <code>init()</code>
-            methods:
+        	Si se encuentra que ninguno de sus acciones método se estan enviando,
+            transmitiendo, o redireccionando, lo más probable es que se quiera poner encima de la
+            línea en su <code> preDispatch () </code> o <code> de init() </code>
+            métodos:
         </para>
 
         <programlisting role="php"><![CDATA[
@@ -286,59 +310,59 @@ public function preDispatch()
 ]]></programlisting>
 
         <para>
-            If you are calling <code>render()</code>, and you're using <link
-                linkend="zend.controller.modular">the Conventional Modular
-                directory structure</link>, you'll want to change your code to
-            make use of autorendering:
+        	Si se está llamando a <code>render()</code>, y si está usando <link
+                linkend="zend.controller.modular"> la Convención Modular
+                de estructura de directorios</link>, usted preferirá cambiar su código a 
+            hacer uso del auto envio:
         </para>
 
         <itemizedlist>
             <listitem>
                 <para>
-                    If you're rendering multiple view scripts in a single
-                    action, you don't need to change a thing.
+                	Si se esta enviando scripts de vistas multiples en una sóla
+                	acción, usted no necesoita cambiar nada.
                 </para>
             </listitem>
             <listitem>
                 <para>
-                    If you're simply calling <code>render()</code> with no
-                    arguments, you can remove such lines.
+                	Si se está simplemente llamando <code>render()</code> sin ningún
+                	argumento, se puede remover tales líneas.
                 </para>
             </listitem>
             <listitem>
                 <para>
-                    If you're calling <code>render()</code> with arguments, and
-                    not doing any processing afterwards or rendering multiple
-                    view scripts, you can change these calls to read
+                	Si se está llamando con argumentos, y
+                	no se esta haciendo ningún proceso después or enviando 
+                	scrips de vistas multiples, se puede cambiar estas llamadas a leer
                     <code>$this-&gt;_helper-&gt;viewRenderer()</code>.
                 </para>
             </listitem>
         </itemizedlist>
 
         <para>
-            If you're not using the conventional modular directory structure,
-            there are a variety of methods for setting the view base path and
-            script path specifications so that you can make use of the
-            <code>ViewRenderer</code>. Please read the <link
+        	Si no se esta usando la convención modular de estructura de directorios,
+        	existen variedad de métodos para definir la dirección de la vista base y
+        	scripts de especificaciones de dirección así se puede hacer uso de 
+            <code>ViewRenderer</code>. Pro favor leer la docuemntación de<link
                 linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer
-                documentation</link> for information on these methods.
+                </link> para información de esos métodos.
         </para>
 
         <para>
-            If you're using a view object from the registry, or customizing your
-            view object, or using a different view implementation, you'll want
-            to inject the <code>ViewRenderer</code> with this object. This can
-            be done easily at any time.
+        	Si se esta usando un objeto vista desde el registro o personalizando su 
+        	objeto vista o usando una diferente implementación de vista, se deseará
+        	introducir <code>ViewRenderer</code> con este objeto. Esto puede ser
+        	terminado facilmente en cualquier momento.
         </para>
 
         <itemizedlist>
             <listitem>
                 <para>
-                    Prior to dispatching a front controller instance:
+                	Antes de despachar una instancia del controlador frontal:
                 </para>
 
                 <programlisting role="php"><![CDATA[
-// Assuming $view has already been defined
+// Asumiendo que $view ha sido definido
 $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
 Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
 ]]></programlisting>
@@ -346,7 +370,7 @@ Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
 
             <listitem>
                 <para>
-                    Any time during the bootstrap process:
+                	Cualquier momento el processo bootstrap:
                 </para>
 
                 <programlisting role="php"><![CDATA[
@@ -358,30 +382,30 @@ $viewRenderer->setView($view);
         </itemizedlist>
 
         <para>
-            There are many ways to modify the <code>ViewRenderer</code>,
-            including setting a different view script to render, specifying
-            replacements for all replaceable elements of a view script path
-            (including the suffix), choosing a response named segment to
-            utilize, and more. If you aren't using the conventional modular
-            directory structure, you can even associate different path
-            specifications with the <code>ViewRenderer</code>.
+        	Existen muchas vias para modificar <code>ViewRenderer</code>,
+        	incluyendo la definición de diferentes scripts de vista a enviar, especificando 
+        	reemplazantes para todos los elementos reemplazables de la dirección del script vista
+        	(incluyendo el sufijo), eligiendo una respuesta nombrada segmento para 
+        	utilizar y mas. Si no esta usando la convención modular de 
+        	estructura de directorios, se puede asociar diferentes especificaciones 
+        	de direcciones con <code>ViewRenderer</code>.
         </para>
 
         <para>
-            We encourage you to adapt your code to use the
-            <code>ErrorHandler</code> and <code>ViewRenderer</code> as they are
-            now core functionality.
+			Le animamos a adaptar el código para utilizar el
+            <code>ErrorHandler</code> y <code>ViewRenderer</code>, ya que son
+            ahora funcionalidad básica.
         </para>
     </sect2>
 
     <sect2 id="zend.controller.migration.fromzeroninetwo">
-        <title>Migrating from 0.9.2 to 0.9.3 or Newer</title>
+        <title>Migrando desde 0.9.2 to 0.9.3 o nuevas versiones</title>
 
         <para>
-            0.9.3 introduces <link
+            0.9.3 introduce <link
                 linkend="zend.controller.actionhelpers">action helpers</link>.
-            As part of this change, the following methods have been removed as
-            they are now encapsulated in the <link
+            Como parte de este cambio, los siguientes métodos han sido removidos ya
+            que ahora son encapsulados en <link
                 linkend="zend.controller.actionhelpers.redirector">redirector
                 action helper</link>:
         </para>
@@ -389,78 +413,78 @@ $viewRenderer->setView($view);
         <itemizedlist>
             <listitem>
                 <para>
-                    <code>setRedirectCode()</code>; use
+                    <code>setRedirectCode()</code>; usa
                     <classname>Zend_Controller_Action_Helper_Redirector::setCode()</classname>.
                 </para>
             </listitem>
             <listitem>
                 <para>
-                    <code>setRedirectPrependBase()</code>; use
+                    <code>setRedirectPrependBase()</code>; usa
                     <classname>Zend_Controller_Action_Helper_Redirector::setPrependBase()</classname>.
                 </para>
             </listitem>
             <listitem>
                 <para>
-                    <code>setRedirectExit()</code>; use
+                    <code>setRedirectExit()</code>; usa
                     <classname>Zend_Controller_Action_Helper_Redirector::setExit()</classname>.
                 </para>
             </listitem>
         </itemizedlist>
 
-        <para>
-            Read the <link linkend="zend.controller.actionhelpers">action
-                helpers documentation</link> for more information on how to
-            retrieve and manipulate helper objects, and the <link
-                linkend="zend.controller.actionhelpers.redirector">redirector
-                helper documentation</link> for more information on setting
-            redirect options (as well as alternate methods for redirecting).
+        <para>        		
+			Leer la documentación <link linkend="zend.controller.actionhelpers">ayudantes 
+				de acción</link> para obtener más información sobre cómo
+             recuperar y manipular objetos de ayuda, y la <link
+                 linkend = "zend.controller.actionhelpers.redirector"> documentación
+                 del ayudante redirector</link> para obtener más información sobre la configuración
+             de reorientar las opciones (así como los alternativos métodos para la redirección).             
         </para>
     </sect2>
 
     <sect2 id="zend.controller.migration.fromzerosix">
-        <title>Migrating from 0.6.0 to 0.8.0 or Newer</title>
+        <title>Migrando desde 0.6.0 to 0.8.0 o versiones nuevas</title>
 
         <para>
-            Per previous changes, the most basic usage of the MVC components
-            remains the same:
+        	Por los cambios previos, el más básico uso de los componentes MVC 
+            sigue siendo el mismo:
         </para>
 
         <programlisting role="php"><![CDATA[
 Zend_Controller_Front::run('/path/to/controllers');
 ]]></programlisting>
 
-        <para>
-            However, the directory structure underwent an overhaul, several
-            components were removed, and several others either renamed or added.
-            Changes include:
+        <para>      
+			Sin embargo, la estructura de directorios se sometió a una revisión, varios
+            componentes han sido eliminados, y varios otros ya sea añadidos o adicionados.
+            Los cambios incluyen:
         </para>
 
         <itemizedlist>
             <listitem>
                 <para>
-                    <classname>Zend_Controller_Router</classname> was removed in favor of
-                    the rewrite router.
+                    <classname>Zend_Controller_Router</classname> fue eliminado en favor de 
+                    reescribir el router.
                 </para>
             </listitem>
 
             <listitem>
-                <para>
-                    <classname>Zend_Controller_RewriteRouter</classname> was renamed to
-                    <classname>Zend_Controller_Router_Rewrite</classname>, and promoted to
-                    the standard router shipped with the framework;
-                    <classname>Zend_Controller_Front</classname> will use it by default if
-                    no other router is supplied.
+                <para>                		
+					<classname> Zend_Controller_RewriteRouter </classname> ha sido renombrado a
+                    <classname> Zend_Controller_Router_Rewrite </classname>, y promovido a 
+                    router estándar enviado con el framework;
+                    <classname> Zend_Controller_Front </classname> lo utilizará por defecto si
+                    ningún otro router es sustituido.
                 </para>
             </listitem>
 
             <listitem>
-                <para>
-                    A new route class for use with the rewrite router was
-                    introduced,
-                    <classname>Zend_Controller_Router_Route_Module</classname>; it covers
-                    the default route used by the MVC, and has support for <link
-                        linkend="zend.controller.modular">controller
-                        modules</link>.
+                <para>                		
+					Una nueva clase ruta para uso con el router reescribir se 
+                    presentó,
+                    <classname> Zend_Controller_Router_Route_Module </classname>, que abarca
+                    la ruta por defecto utilizado por el MVC, y tiene soporte para el<link
+                    	linkend = "zend.controller.modular">controlador de
+                        módulos </link>.
                 </para>
             </listitem>
 
@@ -480,8 +504,8 @@ Zend_Controller_Front::run('/path/to/controllers');
 
             <listitem>
                 <para>
-                    <classname>Zend_Controller_Action::_forward()</classname>'s arguments
-                    have changed. The signature is now:
+                    Los argumentos de <classname>Zend_Controller_Action::_forward()</classname>
+                    han cambiado. la firma es ahora:
                 </para>
 
                 <programlisting role="php"><![CDATA[
@@ -492,25 +516,25 @@ final protected function _forward($action,
 ]]></programlisting>
 
                 <para>
-                    <code>$action</code> is always required; if no controller is
-                    specified, an action in the current controller is assumed.
-                    <code>$module</code> is always ignored unless
-                    <code>$controller</code> is specified. Finally, any
-                    <code>$params</code> provided will be appended to the
-                    request object. If you do not require the controller or
-                    module, but still need to pass parameters, simply specify
-                    null for those values.
+                	<code>$accion</code> es siempre necesaria; si ningún controlador es
+                	especificado, es asumida una acción en el actual controlador.
+                    <code>$module</code> es siempre ignorado a menos que
+                    <code>$controller</code> sea especificado. Por último, cualquier
+                    <code>$params</code> previsto será adjuntado a la
+                    solicitud del objeto. Si no necesita el controlador o el
+                    módulo, pero aún tienen que pasar los parámetros, basta con especificar
+                    null para esos valores.
                 </para>
             </listitem>
         </itemizedlist>
     </sect2>
 
     <sect2 id="zend.controller.migration.fromzerotwo">
-        <title>Migrating from 0.2.0 or before to 0.6.0</title>
+        <title>Migrando desde 0.2.0 o antes de 0.6.0</title>
 
         <para>
-            The most basic usage of the MVC components has not changed; you can
-            still do each of the following:
+        	El mas basico uso de los componentes de MVC no ha cambiado; se puede
+        	seguir utilizando a cada uno en la siguiente manera:
         </para>
 
         <programlisting role="php"><![CDATA[
@@ -518,58 +542,58 @@ Zend_Controller_Front::run('/path/to/controllers');
 ]]></programlisting>
 
         <programlisting role="php"><![CDATA[
-/* -- create a router -- */
+/* -- crear una ruta -- */
 $router = new Zend_Controller_RewriteRouter();
 $router->addRoute('user',
                   'user/:username',
                   array('controller' => 'user', 'action' => 'info')
 );
 
-/* -- set it in a controller -- */
+/* -- configurarlo en un controlador -- */
 $ctrl = Zend_Controller_Front::getInstance();
 $ctrl->setRouter($router);
 
-/* -- set controller directory and dispatch -- */
+/* -- configurar el directorio controladores y despahcarlos -- */
 $ctrl->setControllerDirectory('/path/to/controllers');
 $ctrl->dispatch();
 ]]></programlisting>
 
-        <para>
-            We encourage use of the Response object to aggregate content and
-            headers. This will allow for more flexible output format switching
-            (for instance, JSON or XML instead of XHTML) in your applications.
-            By default, <code>dispatch()</code> will render the response, sending both
-            headers and rendering any content. You may also have the front
-            controller return the response using <code>returnResponse()</code>,
-            and then render the response using your own logic. A future version
-            of the front controller may enforce use of the response object via
-            output buffering.
+        <para>        		
+			Alentamos el uso del objeto Response para agregar contenido y
+            cabeceras. Esto permitirá una mayor flexibilidad en el formato de salida intercambiando
+            (por instancias, JSON o XML en lugar de XHTML) en sus aplicaciones.
+            Por defecto, el envío <code> distpach() </code> enviará la respuesta, enviando ambas
+            cabeceras y enviando cuanlquier contenido. También se puede tener el controlador front 
+            retorne la respuesta usando <code>returnResponse()</code>,
+            y luego enviar la respuesta a través de su propia lógica. Una versión futura
+            del controlador front puede hacer valer el uso de la respuesta a través de objetos mediante
+            la salida de buffers.
         </para>
 
-        <para>
-            There are many additional features that extend the existing API,
-            and these are noted in the documentation.
+        <para>        		
+			Hay muchas características adicionales que amplían las existentes API,
+            y estas son observadas en la documentación.
         </para>
 
         <para>
-            The main changes you will need to be aware of will be found when
-            subclassing the various components. Key amongst these are:
+        	Los principales cambios que tendrán que ser conscientes de cuando se encuentre
+            la subclase de los diversos componentes. Clave entre estos son:
         </para>
 
         <itemizedlist>
             <listitem>
                 <para>
-                    <classname>Zend_Controller_Front::dispatch()</classname> by default
-                    traps exceptions in the response object, and does not render
-                    them, in order to prevent sensitive system information from
-                    being rendered. You can override this in several ways:
+                	<classname>Zend_Controller_Front::distpach()</classname> por defecto
+                    intercepta excepciones en la respuesta del objeto, y no los envia
+                    en orden de prevenir un sistema de informacion sensitivo de ser 
+                    enviado. Se puede anular esto de varias maneras:                    
                 </para>
 
                 <itemizedlist>
                     <listitem>
                         <para>
-                            Set <code>throwExceptions()</code> in the front
-                            controller:
+                            Configurar <code>throwExceptions()</code> en el controlador
+                            front:
                         </para>
                         <programlisting role="php"><![CDATA[
 $front->throwExceptions(true);
@@ -578,15 +602,15 @@ $front->throwExceptions(true);
 
                     <listitem>
                         <para>
-                            Set <code>renderExceptions()</code> in the response
-                            object:
+                            Configurar <code>renderExceptions()</code> en la respuesta del 
+                            objeto:
                         </para>
                         <programlisting role="php"><![CDATA[
 $response->renderExceptions(true);
 $front->setResponse($response);
 $front->dispatch();
 
-// or:
+// o:
 $front->returnResponse(true);
 $response = $front->dispatch();
 $response->renderExceptions(true);
@@ -597,103 +621,103 @@ echo $response;
             </listitem>
 
             <listitem><para>
-                <classname>Zend_Controller_Dispatcher_Interface::dispatch()</classname>
-                now accepts and returns a <xref linkend="zend.controller.request" />
-                object instead of a dispatcher token.
+            	<classname>Zend_Controller_Dispatcher_Interface::dispatch()</classname>
+                ahora acepta y devuelve un <xref linkend="zend.controller.request" />
+                objeto en lugar de un despachador simbólico.
             </para></listitem>
 
-            <listitem><para>
-                <classname>Zend_Controller_Router_Interface::route()</classname>
-                now accepts and returns a <xref linkend="zend.controller.request" />
-                object instead of a dispatcher token.
+            <listitem><para>            	
+				<classname>Zend_Controller_Router_Interface::route()</classname>
+                ahora acepta y devuelve un <xref linkend="zend.controller.request" />
+                objeto en lugar de un despachador simbólico.                 
             </para></listitem>
 
             <listitem>
-                <para><classname>Zend_Controller_Action</classname> changes include:</para>
+                <para><classname>Zend_Controller_Action</classname> los cambios incluyen:</para>
 
                 <itemizedlist>
                     <listitem><para>
-                        The constructor now accepts exactly three arguments,
-                        <classname>Zend_Controller_Request_Abstract $request</classname>,
-                        <classname>Zend_Controller_Response_Abstract $response</classname>,
-                        and <code>array $params (optional)</code>.
-                        <classname>Zend_Controller_Action::__construct()</classname> uses
-                        these to set the request, response, and invokeArgs
-                        properties of the object, and if overriding the
-                        constructor, you should do so as well. Better yet, use
-                        the <code>init()</code> method to do any instance
-                        configuration, as this method is called as the final
-                        action of the constructor.
+                    	El constructor acepta ahora exactamente tres argumentos,
+                        <classname> Zend_Controller_Request_Abstract $request</classname>
+                        <classname> Zend_Controller_Response_Abstract $response</classname>
+                        y <code> array $ params (opcional) </code>.
+                        <classname> Zend_Controller_Action::__construct()</classname> usa
+                        los argumentos para para configurar la petición, la respuesta, y propiedades
+                        invokeArgs del objeto, y si se sobrecarga el
+                        constructor se debe hacer lo mismo. Mejor aún, use
+                        el método <code>init()</code> para hacer cualquier configuración
+                        a la instancia, ya que este método es llamado como la acción 
+                        final del constructor.
                     </para></listitem>
 
                     <listitem><para>
-                        <code>run()</code> is no longer defined as final, but is
-                        also no longer used by the front controller; its sole
-                        purpose is for using the class as a page controller. It
-                        now takes two optional arguments, a
-                        <classname>Zend_Controller_Request_Abstract $request</classname>
-                        and a <classname>Zend_Controller_Response_Abstract $response</classname>.
+                    	<code>run()</code>, ya no se define como definitivo, pero es
+                        también no utilizado por el controlador front; su único
+                        objetivo es para el uso de la clase como un controlador de página. Ello
+                        ahora tiene dos argumentos opcionales, uno
+                        <classname> Zend_Controller_Request_Abstract $request</classname>
+                        y <classname> Zend_Controller_Response_Abstract $response</classname>.
                     </para></listitem>
 
                     <listitem><para>
-                        <code>indexAction()</code> no longer needs to be
-                        defined, but is encouraged as the default action. This
-                        allows using the RewriteRouter and action controllers to
-                        specify different default action methods.
+                    	<code>indexAction()</code>ya no necesita ser
+                         definido, pero se recomienda como acción por defecto. Esto
+                         permite utilizar RewriteRouter y la acción controladores para 
+                         especificar los diferentes métodos de acción.
                     </para></listitem>
 
                     <listitem><para>
-                        <code>__call()</code> should be overridden to handle any
-                        undefined actions automatically.
+                        <code>__call()</code> debería ser sobrecargado para manejar las
+                        indefinidas acciones automaticamente.
                     </para></listitem>
 
-                    <listitem><para>
-                        <code>_redirect()</code> now takes an optional second
-                        argument, the HTTP code to return with the redirect, and
-                        an optional third argument, <code>$prependBase</code>,
-                        that can indicate that the base URL registered with the
-                        request object should be prepended to the url specified.
+                    <listitem><para>                    	
+						<code>_redirect ()</code> ahora toma un segundo opcional
+                        argumento, el código HTTP a retornar con la redirección, y
+                        un opcional tercer argumento, <code>$prependBase</code>,
+                        que puede indicar que la URL base registrada en la
+                        solicitud del objeto debería ser añadido a la URL especificada.
                     </para></listitem>
 
                     <listitem>
-                        <para>
-                            The <code>_action</code> property is no longer set.
-                            This property was a <classname>Zend_Controller_Dispatcher_Token</classname>,
-                            which no longer exists in the current incarnation.
-                            The sole purpose of the token was to provide
-                            information about the requested controller, action,
-                            and URL parameters. This information is now
-                            available in the request object, and can be accessed
-                            as follows:
+                        <para>                        		
+							La propiedad <code>_action</code> ya no está configurada.
+                            Esta propiedad fue un <classname> Zend_Controller_Dispatcher_Token </classname>,
+                            el cual ya no existe en la actual encarnación.
+                            El único propósito de la muestra era proporcionar
+                            información sobre la solicitud del controlador, acción,
+                            y los parámetros URL. Esta información es ahora
+                            disponible en la solicitud del objeto, y puede acceder
+                            como sigue:
                         </para>
 
                         <programlisting role="php"><![CDATA[
-// Retrieve the requested controller name
-// Access used to be via: $this->_action->getControllerName().
-// The example below uses getRequest(), though you may also directly
-// access the $_request property; using getRequest() is recommended as
-// a parent class may override access to the request object.
+// Recuperar las solicitud del nombre del controlador
+// El acceso ha sido a través: $this->_action->getControllerName().
+// El ejemplo siguiente usa getRequest(), aunque se pueda acceder
+// directamente a la $_request property; usar getRequest() es recomendado como
+// una clase padre pueda sobrecargar el acceso a la solicitud del objeto.
 $controller = $this->getRequest()->getControllerName();
 
-// Retrieve the requested action name
-// Access used to be via: $this->_action->getActionName().
+// Recuperar la solicitud del nombre de la accion
+// El acceso ha sido a través: $this->_action->getActionName().
 $action = $this->getRequest()->getActionName();
 
-// Retrieve the request parameters
-// This hasn't changed; the _getParams() and _getParam() methods simply
-// proxy to the request object now.
+// Recuperar la solicitud de los parametros
+// Esto no ha cambiado; Los métodos _getParams() y _getParam() simplemente
+// proxy a la solictud del objeto.
 $params = $this->_getParams();
-// request 'foo' parameter, using 'default' as default value if not found
+// solicitud 'foo' parametro, usando 'default' como valor por defecto si no lo encuentra
 $foo = $this->_getParam('foo', 'default');
 ]]></programlisting>
                     </listitem>
 
                     <listitem>
                         <para>
-                            <code>noRouteAction()</code> has been removed. The
-                            appropriate way to handle non-existent action
-                            methods should you wish to route them to a default
-                            action is using <code>__call()</code>:
+                        	<code>noRouteAction()</code> ha sido eliminado. La
+                            manera adecuada de manejar inexistentes métodos 
+                            de acciones se desearia enrutarlos a una 
+                            acción por defecto utilizando <code>__call()</code>:
                         </para>
 
                         <programlisting role="php"><![CDATA[
@@ -713,17 +737,17 @@ public function __call($method, $args)
             </listitem>
 
             <listitem><para>
-                <classname>Zend_Controller_RewriteRouter::setRewriteBase()</classname> has
-                been removed. Use <classname>Zend_Controller_Front::setBaseUrl()</classname>
-                instead (or <classname>Zend_Controller_Request_Http::setBaseUrl()</classname>, if using
-                that request class).
+                <classname>Zend_Controller_RewriteRouter::setRewriteBase()</classname> ha
+                sido eliminado. Use <classname>Zend_Controller_Front::setBaseUrl()</classname>
+                en lugar de (o <classname>Zend_Controller_Request_Http::setBaseUrl()</classname>, si esta usando
+                la petición de la clase).
             </para></listitem>
 
-            <listitem><para>
-                <classname>Zend_Controller_Plugin_Interface</classname> was replaced
-                by <classname>Zend_Controller_Plugin_Abstract</classname>. All methods now
-                accept and return a <xref linkend="zend.controller.request" />
-                object instead of a dispatcher token.
+            <listitem><para>            
+				<classname>Zend_Controller_Plugin_Interface</classname> se reemplazó 
+                por <classname> Zend_Controller_Plugin_Abstract</classname>. Ahora todos los métodos
+                aceptan y devuelven un objeto <xref linkend="zend.controller.request" />
+                en lugar de un despachador simbólico.
             </para></listitem>
         </itemizedlist>
     </sect2>

+ 7 - 4
documentation/manual/es/module_specs/Zend_Controller-QuickStart.xml

@@ -1,5 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 15103 -->
+<!-- Reviewed: no -->
 <sect1 id="zend.controller.quickstart">
-    <title>Zend_Controller Quick Start</title>
+    <title>Inicio rápido a Zend_Controller</title>
 
     <sect2 id="zend.controller.quickstart.introduction">
         <title>Introducción</title>
@@ -18,7 +21,7 @@
                 Front Controller (Controlador Frontal)
             </ulink>
             en el cual todas las transacciones HTTP (requests) son
-            interceptadas por el controlador frontal y despachado a una
+            interceptadas por el controlador frontal y enviado a una
             Acción particular de un Controlador según la URL pedida.
 
 
@@ -77,7 +80,7 @@ html/
                 Apunte su document root en su servidor web hacia el
                 directorio
                 <code>html</code>
-                de la estrctura de archivos de arriba.
+                de la estructura de archivos de arriba.
             </para>
         </sect3>
 
@@ -100,7 +103,7 @@ RewriteRule ^.*$ index.php [NC,L]
 ]]></programlisting>
 
             <para>
-                La regla de arriba redigirá las peticiones a recuros existentes
+                La regla de arriba redirigirá las peticiones a recuros existentes
                 (enlaces simbólicos existentes, archivos no vacíos, o directorios no vacíos)
         en consecuencia, y todas las otras peticiones al front controller.
             </para>

+ 425 - 0
documentation/manual/es/module_specs/Zend_Controller-Request.xml

@@ -0,0 +1,425 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.controller.request">
+    <title>La solicitud del Objeto</title>
+    <sect2 id="zend.controller.request.introduction">
+        <title>Introducción</title>
+        <para>        		
+			La solicitud del objeto es un simple valor que es pasado entre
+            <classname>Zend_Controller_Front</classname> y el router, dispatcher, y
+            controlador de clases. Empaqueta los nombres de los módulos solicitados,
+            controlador, acción, y los parámetros opcionales, así como el resto del
+            medio de la solicitud, ya sea HTTP, el CLI, o PHP-GTK.
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                The module name is accessed by
+                <code>getModuleName()</code> and
+                <code>setModuleName()</code>.
+            </para></listitem>
+
+            <listitem><para>
+                The controller name is accessed by
+                <code>getControllerName()</code> and
+                <code>setControllerName()</code>.
+            </para></listitem>
+
+            <listitem><para>
+                The name of the action to call within that controller is
+                accessed by <code>getActionName()</code> and
+                <code>setActionName()</code>.
+            </para></listitem>
+
+            <listitem><para>
+                Parameters to be accessible by the action are an associative array
+                of key/value pairs that are retrieved by <code>getParams()</code>
+                and set with <code>setParams()</code>, or individually by
+                <code>getParam()</code> and <code>setParam()</code>.
+            </para></listitem>
+        </itemizedlist>
+
+        <para>
+            Based on the type of request, there may be more methods available.
+            The default request used, <classname>Zend_Controller_Request_Http</classname>,
+            for instance, has methods for retrieving the request URI, path
+            information, <code>$_GET</code> and <code>$_POST</code> parameters,
+            etc.
+        </para>
+
+        <para>
+            The request object is passed to the front controller, or if none is
+            provided, it is instantiated at the beginning of the dispatch
+            process, before routing occurs. It is passed through to every object
+            in the dispatch chain.
+        </para>
+
+        <para>
+            Additionally, the request object is particularly useful in testing.
+            The developer may craft the request environment, including module,
+            controller, action, parameters, URI, etc, and pass the request
+            object to the front controller to test application flow. When paired
+            with the <link linkend="zend.controller.response">response
+                object</link>, elaborate and precise unit testing of MVC
+            applications becomes possible.
+        </para>
+    </sect2>
+
+    <sect2 id="zend.controller.request.http">
+        <title>HTTP Requests</title>
+
+        <sect3 id="zend.controller.request.http.dataacess">
+            <title>Accessing Request Data</title>
+
+            <para>
+                <classname>Zend_Controller_Request_Http</classname> encapsulates access to
+                relevant values such as the key name and value for the
+                controller and action router variables, and all additional
+                parameters parsed from the URI. It additionally allows access to
+                values contained in the superglobals as public members, and
+                manages the current Base URL and Request URI. Superglobal
+                values cannot be set on a request object, instead use the
+                setParam/getParam methods to set or retrieve user parameters.
+            </para>
+
+            <note>
+                <title>Superglobal Data</title>
+                <para>
+                    When accessing superglobal data through
+                    <classname>Zend_Controller_Request_Http</classname> as public member
+                    properties, it is necessary to keep in mind that the
+                    property name (superglobal array key) is matched to a
+                    superglobal in a specific order of precedence: 1. GET, 2.
+                    POST, 3. COOKIE, 4. SERVER, 5. ENV.
+                </para>
+            </note>
+
+            <para>
+                Specific superglobals can be accessed using a public method as
+                an alternative. For example, the raw value of
+                <code>$_POST['user']</code> can be accessed by calling
+                <code>getPost('user')</code> on the request object. These
+                include <code>getQuery()</code> for retrieving
+                <code>$_GET</code> elements, and <code>getHeader()</code> for
+                retrieving request headers.
+            </para>
+
+            <note>
+                <title>GET and POST Data</title>
+                <para>
+                    Be cautious when accessing data from the request object as
+                    it is not filtered in any way. The router and dispatcher
+                    validate and filter data for use with their tasks, but leave
+                    the data untouched in the request object.
+                </para>
+            </note>
+
+            <note>
+                <title>Retrieving the Raw POST Data</title>
+
+                <para>
+                    As of 1.5.0, you can also retrieve the raw post data via the
+                    <code>getRawBody()</code> method. This method returns false
+                    if no data was submitted in that fashion, but the full body
+                    of the post otherwise.
+                </para>
+
+                <para>
+                    This is primarily useful for accepting content when
+                    developing a RESTful MVC application.
+                </para>
+            </note>
+
+            <para>
+                You may also set user parameters in the request object using
+                <code>setParam()</code> and retrieve these later using
+                <code>getParam()</code>. The router makes use of this
+                functionality to set parameters matched in the request URI into
+                the request object.
+            </para>
+
+            <note>
+                <title>getParam() Retrieves More than User Parameters</title>
+
+                <para>
+                    In order to do some of its work, <code>getParam()</code> actually
+                    retrieves from several sources. In order of priority, these
+                    include: user parameters set via <code>setParam()</code>,
+                    <code>GET</code> parameters, and finally <code>POST</code>
+                    parameters. Be aware of this when pulling data via this
+                    method.
+                </para>
+
+                <para>
+                    If you wish to pull only from parameters you set via
+                    <code>setParam()</code>, use the <code>getUserParam()</code>.
+                </para>
+
+                <para>
+                    Additionally, as of 1.5.0, you can lock down which parameter
+                    sources will be searched. <code>setParamSources()</code>
+                    allows you to specify an empty array or an array with one or
+                    more of the values '_GET' or '_POST' indicating which
+                    parameter sources are allowed (by default, both are
+                    allowed); if you wish to restrict access to only '_GET'
+                    specify <code>setParamSources(array('_GET'))</code>.
+                </para>
+            </note>
+
+            <note>
+                <title>Apache Quirks</title>
+                <para>
+                    If you are using Apache's 404 handler to pass incoming
+                    requests to the front controller, or using a PT flag with
+                    rewrite rules, <code>$_SERVER['REDIRECT_URL']</code>
+                    contains the URI you need, not
+                    <code>$_SERVER['REQUEST_URI']</code>. If you are using such
+                    a setup and getting invalid routing, you should use the
+                    <classname>Zend_Controller_Request_Apache404</classname> class instead
+                    of the default Http class for your request object:
+                </para>
+
+                <programlisting role="php"><![CDATA[
+$request = new Zend_Controller_Request_Apache404();
+$front->setRequest($request);
+]]></programlisting>
+
+                <para>
+                    This class extends the
+                    <classname>Zend_Controller_Request_Http</classname> class and simply
+                    modifies the autodiscovery of the request URI. It can be
+                    used as a drop-in replacement.
+                </para>
+            </note>
+        </sect3>
+
+        <sect3 id="zend.controller.request.http.baseurl">
+            <title>Base Url and Subdirectories</title>
+
+            <para>
+                <classname>Zend_Controller_Request_Http</classname> allows
+                <classname>Zend_Controller_Router_Rewrite</classname> to be used in subdirectories.
+                <classname>Zend_Controller_Request_Http</classname> will attempt to automatically
+                detect your base URL and set it accordingly.
+            </para>
+
+            <para>
+                For example, if you keep your <code>index.php</code> in a
+                webserver subdirectory named
+                <code>/projects/myapp/index.php</code>, base URL (rewrite base)
+                should be set to <code>/projects/myapp</code>. This string will
+                then be stripped from the beginning of the path before
+                calculating any route matches. This frees one from the necessity
+                of prepending it to any of your routes. A route of
+                <code>'user/:username'</code> will match URIs like
+                <code>http://localhost/projects/myapp/user/martel</code> and
+                <code>http://example.com/user/martel</code>.
+            </para>
+
+            <note>
+                <title>URL Detection is Case Sensitive</title>
+                <para>
+                    Automatic base URL detection is case sensitive, so make sure your URL
+                    will match a subdirectory name in a filesystem (even on Windows
+                    machines). If it doesn't, an exception will be raised.
+                </para>
+            </note>
+
+            <para>
+                Should base URL be detected incorrectly you can override it
+                with your own base path with the help of the
+                <code>setBaseUrl()</code> method of either the
+                <classname>Zend_Controller_Request_Http</classname> class, or the
+                <classname>Zend_Controller_Front</classname> class. The easiest
+                method is to set it in <classname>Zend_Controller_Front</classname>,
+                which will proxy it into the request object. Example usage to
+                set a custom base URL:
+            </para>
+
+            <programlisting role="php"><![CDATA[
+/**
+ * Dispatch Request with custom base URL with Zend_Controller_Front.
+ */
+$router     = new Zend_Controller_Router_Rewrite();
+$controller = Zend_Controller_Front::getInstance();
+$controller->setControllerDirectory('./application/controllers')
+           ->setRouter($router)
+           ->setBaseUrl('/projects/myapp'); // set the base url!
+$response   = $controller->dispatch();
+]]></programlisting>
+
+        </sect3>
+
+        <sect3 id="zend.controller.request.http.method">
+            <title>Determining the Request Method</title>
+
+            <para>
+                <code>getMethod()</code> allows you to determine the HTTP
+                request method used to request the current resource.
+                Additionally, a variety of methods exist that allow you to get
+                boolean responses when asking if a specific type of request has
+                been made:
+            </para>
+
+            <itemizedlist>
+                <listitem><para><code>isGet()</code></para></listitem>
+                <listitem><para><code>isPost()</code></para></listitem>
+                <listitem><para><code>isPut()</code></para></listitem>
+                <listitem><para><code>isDelete()</code></para></listitem>
+                <listitem><para><code>isHead()</code></para></listitem>
+                <listitem><para><code>isOptions()</code></para></listitem>
+            </itemizedlist>
+
+            <para>
+                The primary use case for these is for creating RESTful MVC
+                architectures.
+            </para>
+        </sect3>
+
+        <sect3 id="zend.controller.request.http.ajax">
+            <title>Detecting AJAX Requests</title>
+
+            <para>
+                <classname>Zend_Controller_Request_Http</classname> has a rudimentary
+                method for detecting AJAX requests:
+                <code>isXmlHttpRequest()</code>. This method looks for an
+                HTTP request header <code>X-Requested-With</code> with the value
+                'XMLHttpRequest'; if found, it returns true.
+            </para>
+
+            <para>
+                Currently, this header is known to be passed by default with the
+                following JS libraries:
+            </para>
+
+            <itemizedlist>
+                <listitem><para>Prototype/Scriptaculous (and libraries derived
+                        from Prototype)</para></listitem>
+                <listitem><para>Yahoo! UI Library</para></listitem>
+                <listitem><para>jQuery</para></listitem>
+                <listitem><para>MochiKit</para></listitem>
+            </itemizedlist>
+
+            <para>
+                Most AJAX libraries allow you to send custom HTTP request
+                headers; if your library does not send this header, simply add
+                it as a request header to ensure the
+                <code>isXmlHttpRequest()</code> method works for you.
+            </para>
+        </sect3>
+    </sect2>
+
+    <sect2 id="zend.controller.request.subclassing">
+        <title>Subclassing the Request Object</title>
+
+        <para>
+            The base request class used for all request objects is the abstract
+            class <classname>Zend_Controller_Request_Abstract</classname>. At its most
+            basic, it defines the following methods:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+abstract class Zend_Controller_Request_Abstract
+{
+    /**
+     * @return string
+     */
+    public function getControllerName();
+
+    /**
+     * @param string $value
+     * @return self
+     */
+    public function setControllerName($value);
+
+    /**
+     * @return string
+     */
+    public function getActionName();
+
+    /**
+     * @param string $value
+     * @return self
+     */
+    public function setActionName($value);
+
+    /**
+     * @return string
+     */
+    public function getControllerKey();
+
+    /**
+     * @param string $key
+     * @return self
+     */
+    public function setControllerKey($key);
+
+    /**
+     * @return string
+     */
+    public function getActionKey();
+
+    /**
+     * @param string $key
+     * @return self
+     */
+    public function setActionKey($key);
+
+    /**
+     * @param string $key
+     * @return mixed
+     */
+    public function getParam($key);
+
+    /**
+     * @param string $key
+     * @param mixed $value
+     * @return self
+     */
+    public function setParam($key, $value);
+
+    /**
+     * @return array
+     */
+     public function getParams();
+
+    /**
+     * @param array $array
+     * @return self
+     */
+    public function setParams(array $array);
+
+    /**
+     * @param boolean $flag
+     * @return self
+     */
+    public function setDispatched($flag = true);
+
+    /**
+     * @return boolean
+     */
+    public function isDispatched();
+}
+]]></programlisting>
+
+        <para>
+            The request object is a container for the request environment. The
+            controller chain really only needs to know how to set and retrieve the
+            controller, action, optional parameters, and dispatched status. By
+            default, the request will search its own parameters using the
+            controller or action keys in order to determine the controller and
+            action.
+        </para>
+
+        <para>
+            Extend this class, or one of its derivatives, when you need the
+            request class to interact with a specific environment in order to
+            retrieve data for use in the above tasks. Examples include <link
+                linkend="zend.controller.request.http">the HTTP
+                environment</link>, a CLI environment, or a PHP-GTK environment.
+        </para>
+    </sect2>
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 185 - 0
documentation/manual/es/module_specs/Zend_Controller-Router-Route-Chain.xml

@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect3 id="zend.controller.router.routes.chain">
+    <title>Zend_Controller_Router_Route_Chain</title>
+
+    <para>
+        <classname>Zend_Controller_Router_Route_Chain</classname> es una ruta 
+        que permite encadenar juntas a múltiples rutas. 
+        Esto le permite encadenar hostname/rutas y rutas de paths, o múltiples 
+        paths de rutas por ejemplo. El encadenamiento puede hacerse 
+        programáticamente o dentro de un archivo de configuración.
+    </para>
+
+    <note>
+        <title>Prioridad de Parámetros</title>
+        <para>
+            Cuando se encadenan en conjunto varias rutas, los parámetros de la 
+            ruta exterior tienen mayor prioridad que los parámetros de la ruta 
+            interior. Así, si define un controlador en el exterior y otro en 
+            la ruta interior, será seleccionado el controlador de la ruta exterior.
+        </para>
+    </note>
+
+    <para>
+        Cuando el encadenamiento se realiza prográmaticamente, hay dos maneras 
+        de archivarlo. La primera consiste en crear una nueva instancia 
+        <classname>Zend_Controller_Router_Route_Chain</classname> y entones 
+        llamar al método <code>chain</code> varias veces con todas las rutas 
+        que deberían encadenarse juntas. La otra forma es tomar la primera 
+        ruta, por ejemplo, la  ruta del nombre del host, y llamar al método 
+        <code>chain</code> con la ruta que debería ser anexada a ella. 
+        Esto no modificará la ruta del nombre del host, pero devolverá una nueva 
+        instancia de <classname>Zend_Controller_Router_Route_Chain</classname>, 
+        teniendo entonces a ambas rutas encadenadas juntas:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+// Crear dos rutas
+$hostnameRoute = new Zend_Controller_Router_Route_Hostname(...);
+$pathRoute     = new Zend_Controller_Router_Route(...);
+
+// Primera manera, encadenarlas con chain route
+$chainedRoute = new Zend_Controller_Router_Route_Chain();
+$chainedRoute->chain($hostnameRoute)
+             ->chain($pathRoute);
+
+// Segunda manera, encadenarlas directamente
+$chainedRoute = $hostnameRoute->chain($pathRoute);
+]]></programlisting>
+
+    <para>
+        Cuando las rutas se encadenan juntas, su separador por defecto es una 
+        barra ('/'). Pueden haber casos cuando quiera tener un separador 
+        diferente:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+// Crear dos rutas
+$firstRoute  = new Zend_Controller_Router_Route('foo');
+$secondRoute = new Zend_Controller_Router_Route('bar');
+
+// Encadenarlas juntas con un separador diferente
+$chainedRoute = $firstRoute->chain($secondRoute, '-');
+
+// Ensamblar la ruta: "foo-bar"
+echo $chainedRoute->assemble();
+]]></programlisting>
+
+    <sect4 id="zend.controller.router.routes.chain.config">
+        <title>Encadenar Rutas via <classname>Zend_Config</classname></title>
+
+        <para>
+            Para encadenar juntas a las rutas en un archivo de configuración, 
+            hay parámetros adicionales para la configuración de aquellos. 
+            El enfoque más sencillo es utilizar los parámetros <code>chains</code>. 
+            Este es simplemente una lista de las rutas, que será encadenada con  
+            la ruta padre. Ni la ruta padre ni la ruta hijo serán añadidos 
+            directamente al router sino que sólo lo hará la ruta del 
+            encadenamiento resultante. 
+            El nombre de la ruta encadenada en el router será el nombre de la 
+            ruta padre concatenada con un guión ('-') con el nombre de la ruta 
+            hijo. Un simple config en XML se vería así:
+        </para>
+
+        <programlisting role="xml"><![CDATA[
+<routes>
+    <www type="Zend_Controller_Router_Route_Hostname">
+        <route>www.example.com</route>
+        <chains>
+            <language type="Zend_Controller_Router_Route">
+                <route>:language</route>
+                <reqs language="[a-z]{2}">
+                <chains>
+                    <index type="Zend_Controller_Router_Route_Static">
+                        <route></route>
+                        <defaults module="default" controller="index" action="index" />
+                    </index>
+                    <imprint type="Zend_Controller_Router_Route_Static">
+                        <route>imprint</route>
+                        <defaults module="default" controller="index" action="index" />
+                    </imprint>
+                </chains>
+            </language>
+        </chains>
+    </www>
+    <users type="Zend_Controller_Router_Route_Hostname">
+        <route>users.example.com</route>
+        <chains>
+            <profile type="Zend_Controller_Router_Route">
+                <route>:username</route>
+                <defaults module="users" controller="profile" action="index" />
+            </profile>
+        </chains>
+    </users>
+    <misc type="Zend_Controller_Router_Route_Static">
+        <route>misc</route>
+    </misc>
+</routes>
+]]></programlisting>
+
+        <para>
+            Esto se traducirá en las tres rutas <code>www-language-index</code>,
+            <code>www-language-imprint</code> y
+            <code>users-language-profile</code> que sólo concordarán basados 
+            en el nombre y la ruta <code>misc</code>, que se comparará con 
+            cualquier nombre de host.
+        </para>
+
+        <para>
+            La manera alternativa de crear una ruta encadenada es a través del 
+            parámetro <code>chain</code>, que sólo puede utilizarse 
+            directamente con el tipo cadena-ruta, y también trabaja en el nivel raíz:
+        </para>
+
+        <programlisting role="xml"><![CDATA[
+<routes>
+    <www type="Zend_Controller_Router_Route_Chain">
+        <route>www.example.com</route>
+    </www>
+    <language type="Zend_Controller_Router_Route">
+        <route>:language</route>
+        <reqs language="[a-z]{2}">
+    </language>
+    <index type="Zend_Controller_Router_Route_Static">
+        <route></route>
+        <defaults module="default" controller="index" action="index" />
+    </index>
+    <imprint type="Zend_Controller_Router_Route_Static">
+        <route>imprint</route>
+        <defaults module="default" controller="index" action="index" />
+    </imprint>
+
+    <www-index type="Zend_Controller_Router_Route_Chain">
+        <chain>www, language, index</chain>
+    </www-index>
+    <www-imprint type="Zend_Controller_Router_Route_Chain">
+        <chain>www, language, imprint</chain>
+    </www-imprint>
+</routes>
+]]></programlisting>
+
+        <para>
+            También puede darle el parámetro a <code>chain</code> como un array 
+            en vez de separ las rutas con comas:
+        </para>
+
+        <programlisting role="xml"><![CDATA[
+<routes>
+    <www-index type="Zend_Controller_Router_Route_Chain">
+        <chain>www</chain>
+        <chain>language</chain>
+        <chain>index</chain>
+    </www-index>
+    <www-imprint type="Zend_Controller_Router_Route_Chain">
+        <chain>www</chain>
+        <chain>language</chain>
+        <chain>imprint</chain>
+    </www-imprint>
+</routes>
+]]></programlisting>
+    </sect4>
+</sect3>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 59 - 0
documentation/manual/es/module_specs/Zend_Controller-Router-Route-Hostname.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect3 id="zend.controller.router.routes.hostname">
+    <title>Zend_Controller_Router_Route_Hostname</title>
+
+    <para>
+        <classname>Zend_Controller_Router_Route_Hostname</classname> es la ruta 
+        del framework en el servidor. Funciona similarmente a la standard route, 
+        pero funciona con el nombre del host de la URL llamada, en lugar del path.
+    </para>
+
+    <para>
+        Vamos a usar el ejemplo de la standard route y ver cómo se vería con un 
+        nombre basado en host. En lugar de llamar al usuario mediante un path, 
+        quisiéramos que un usuario pueda llamar a
+        <code>http://martel.users.example.com</code> para ver la información 
+        acerca del usuario "martel".
+    </para>
+
+    <programlisting role="php"><![CDATA[
+$hostnameRoute = new Zend_Controller_Router_Route_Hostname(
+    ':username.users.example.com',
+    array(
+        'controller' => 'profile',
+        'action'     => 'userinfo'
+    )
+);
+
+$plainPathRoute = new Zend_Controller_Router_Route_Static('');
+
+$router->addRoute('user', $hostnameRoute->chain($plainPathRoute);
+]]></programlisting>
+
+    <para>
+        El primer parámetro del constructor en 
+        <classname>Zend_Controller_Router_Route_Hostname</classname>
+        es una definición de ruta que será comparada con el nombre del host. 
+        Las definiciones de ruta consisten en partes estáticas y dinámicas 
+        separadas por el carácter punto ('.'). 
+        Las partes dinámicas, llamadas variables, se marcan anteponiendo 
+        dos puntos (':') al nombre de la variable: <code>:username</code>. 
+        Las partes estáticas son simplemente texto: <code>user</code>.
+    </para>
+
+    <para>
+        Las rutas del nombre del host pueden, pero nunca deben ser utilizadas así.
+        La razón detrás de esto es que la ruta del nombre del host solamente,  
+        concordaría con cualquier path. Entonces, lo que tiene que hacer 
+        es encadenar una ruta del path a la ruta del nombre del host. 
+        Esto se hace como en el ejemplo llamando a 
+        <code>$hostnameRoute->chain($pathRoute);</code>. Haciendo esto, 
+        <code>$hostnameRoute</code> no se modifica, pero devuelve una nueva ruta 
+        (<classname>Zend_Controller_Router_Route_Chain</classname>), que luego 
+        puede ser entregada al router.
+    </para>
+</sect3>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 264 - 0
documentation/manual/es/module_specs/Zend_Controller-Router-Route-Regex.xml

@@ -0,0 +1,264 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect3 id="zend.controller.router.routes.regex">
+    <title>Zend_Controller_Router_Route_Regex</title>
+
+    <para>
+        Además de los tipos de ruta estáticos y por defecto, también está 
+        disponible el tipo de ruta Expresión Regular. 
+        Esta ruta ofrece más potencia y flexibilidad que los otros, pero a 
+        costa de un ligero aumento en la complejidad. 
+        Al mismo tiempo, debería ser más rápido que la standard Route.
+    </para>
+
+    <para>
+        Al igual que la standard Route, esta ruta tiene que ser inicializada 
+        con una definición de ruta y algunos valores predeterminados. 
+        Vamos a crear un archivo ruta como un ejemplo, similar al previamente 
+        definido, sólo que esta vez usaremos la ruta Regex:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+$route = new Zend_Controller_Router_Route_Regex(
+    'archive/(\d+)',
+    array(
+        'controller' => 'archive',
+        'action'     => 'show'
+    )
+);
+$router->addRoute('archive', $route);
+]]></programlisting>
+
+    <para>
+        Cada sub-patrón regex definido será inyectado al objeto solicitud. 
+        Con nuestro ejemplo anterior, después de un matching exitoso
+        <code>http://domain.com/archive/2006</code>, el valor resultante del 
+        array puede verse como:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+$values = array(
+    1            => '2006',
+    'controller' => 'archive',
+    'action'     => 'show'
+);
+]]></programlisting>
+
+    <note>
+        <para>
+            Las barras de comienzo y final están recortadas de la URL en el 
+            Router antes de una concordancia. Como resultado, coincidendo con 
+            la URL <code>http://domain.com/foo/bar/</code>, involucraría al 
+            regex de <code>foo/bar</code>, y no a <code>/foo/bar</code>.
+        </para>
+    </note>
+
+    <note>
+        <para>
+            Las anclas de comienzo y fin de línea ('^' y '$', respectivamente) 
+            son automáticamente antepuestas y pospuestas a todas las expresiones. 
+            Así, no debe usar éstas en sus expresiones regulares, y debe 
+            coincidir con el string completo.
+        </para>
+    </note>
+
+    <note>
+        <para>
+            Esta clase de ruta usa el carácter <code>#</code> como un delimitador. 
+            Esto significa que necesitará caracteres hash ('#') para escapar    
+            pero no barras ('/') en sus definiciones de ruta. 
+            Dado que el carácter '#' (llamado ancla) es raramente pasado al 
+            webserver, será muy rara la necesidad de utilizar ese carácter en su 
+            regex.
+        </para>
+    </note>
+
+    <para>
+        Puede obtener el contenido de los sub-patrones definidos por la forma habitual:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+public function showAction()
+{
+    $request = $this->getRequest();
+    $year    = $request->getParam(1); // $year = '2006';
+}
+]]></programlisting>
+
+    <note>
+        <para>
+        Tenga en cuenta que la clave es un entero (1) en lugar de un string ('1').
+        </para>
+    </note>
+
+    <para>
+        Sin embargo, esta ruta no funciona exactamente igual que su contraparte 
+        standard route dado que el valor por defecto para 'year' todavía no se 
+        ha establecido. Y lo que puede ser no tan evidente es que tendremos un 
+        problema con una barra final incluso si declaramos por defecto el año y 
+        hacemos opcional al sub-patrón. 
+        La solución es hacer que toda la parte del año sea opcional junto con la 
+        barra pero capturar solo la parte numérica:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+$route = new Zend_Controller_Router_Route_Regex(
+    'archive(?:/(\d+))?',
+    array(
+        1            => '2006',
+        'controller' => 'archive',
+        'action'     => 'show'
+    )
+);
+$router->addRoute('archive', $route);
+]]></programlisting>
+
+    <para>
+        Ahora, ocupemósnos del problema que probablemente haya notado. 
+		Utilizar claves basadas en enteros para los parámetros 
+        no es una solución fácilmente manejable y puede ser potencialmente 
+        problemática a largo plazo. Y aquí es donde entra el tercer 
+        parámetro. Este parámetro es un array asociativo que representa un 
+        mapa de sub-patrones regex a nombres de clave de parámetros. Trabajemos 
+        en nuestro ejemplo más fácil:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+$route = new Zend_Controller_Router_Route_Regex(
+    'archive/(\d+)',
+    array(
+        'controller' => 'archive',
+        'action' => 'show'
+    ),
+    array(
+        1 => 'year'
+    )
+);
+$router->addRoute('archive', $route);
+]]></programlisting>
+
+    <para>
+        Esto resultaraá en los siguientes valores inyectados a la solicitud:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+$values = array(
+    'year'       => '2006',
+    'controller' => 'archive',
+    'action'     => 'show'
+);
+]]></programlisting>
+
+    <para>
+        El mapa puede ser definido en cualquier dirección para hacer que 
+        funcione en cualquier ambiente. Las claves pueden contener nombres de 
+        variables o índices de sub-patrones:
+    </para>
+
+
+    <programlisting role="php"><![CDATA[
+$route = new Zend_Controller_Router_Route_Regex(
+    'archive/(\d+)',
+    array( ... ),
+    array(1 => 'year')
+);
+
+// O
+
+$route = new Zend_Controller_Router_Route_Regex(
+    'archive/(\d+)',
+    array( ... ),
+    array('year' => 1)
+);
+]]></programlisting>
+
+    <note>
+        <para>
+            Las claves de los sub-patrones deben respresentarse por enteros.
+        </para>
+    </note>
+
+    <para>
+        Observe que el índice numérico en los valores del Request ahora han  
+        desaparecido y en su lugar se muestra una variable nombrada. 
+        Por supuesto que puede mezclar variables nombradas y numéricas si lo desea:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+$route = new Zend_Controller_Router_Route_Regex(
+    'archive/(\d+)/page/(\d+)',
+    array( ... ),
+    array('year' => 1)
+);
+]]></programlisting>
+
+    <para>
+        Lo que resultará en una mezcla de valores disponibles en la solicitud. 
+        Como ejemplo, la URL <code>http://domain.com/archive/2006/page/10</code>  
+        resultará con los siguientes valores:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+$values = array(
+    'year'       => '2006',
+    2            => 10,
+    'controller' => 'archive',
+    'action'     => 'show'
+);
+]]></programlisting>
+
+    <para>
+        Dado que los patrones regex no pueden invertirse fácilmente, tendrá que 
+        preparar una URL inversa si desea usar un ayudante de URL o incluso 
+        un método de ensamble de esta clase. Este path inverso está representado 
+        por un string parseable por sprintf() y se define como el cuarto 
+        parámetro del constructor:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+$route = new Zend_Controller_Router_Route_Regex(
+    'archive/(\d+)',
+    array( ... ),
+    array('year' => 1),
+    'archive/%s'
+);
+]]></programlisting>
+
+    <para>
+        Todo esto es algo que ya fue posible de hacer por medio de un objeto 
+        de ruta estandard, por lo tanto podría preguntarese: ¿cuál es la ventaja 
+        de utilizar la ruta Regex?. 
+        Principalmente, le permite describir cualquier tipo de URL sin 
+        restricción alguna. Imagínese que tiene un blog y desea crear URLs 
+        como: <code>http://domain.com/blog/archive/01-Using_the_Regex_Router.html</code>, 
+        y que tiene que descomponer el último elemento del path 
+        <code>01-Using_the_Regex_Router.html</code>, en un ID de artículo y 
+        en el título/descripción del artículo; esto no es posible con el 
+        standard route. Con la ruta Regex, puede hacer algo como la siguiente 
+        solución:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+$route = new Zend_Controller_Router_Route_Regex(
+    'blog/archive/(\d+)-(.+)\.html',
+    array(
+        'controller' => 'blog',
+        'action'     => 'view'
+    ),
+    array(
+        1 => 'id',
+        2 => 'description'
+    ),
+    'blog/archive/%d-%s.html'
+);
+$router->addRoute('blogArchive', $route);
+]]></programlisting>
+
+    <para>
+        Como puede ver, esto añade una enorme cantidad de flexibilidad por  
+        encima del standard route.
+    </para>
+</sect3>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 69 - 0
documentation/manual/es/module_specs/Zend_Controller-Router-Route-Static.xml

@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect3 id="zend.controller.router.routes.static">
+    <title>Zend_Controller_Router_Route_Static</title>
+
+    <para>
+        Los ejemplos sobre todo usan rutas dinámicas  -- rutas que contienen 
+        patrones contra los cuales comparar. A veces, sin embargo, una ruta en 
+        particular pareciera estar seteada en piedra, y ejecutar el motor de  
+        expresiones regulares sería excesivo. 
+        La respuesta a esta situación es utilizar rutas estáticas:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+$route = new Zend_Controller_Router_Route_Static(
+    'login',
+    array('controller' => 'auth', 'action' => 'login')
+);
+$router->addRoute('login', $route);
+]]></programlisting>
+
+    <para>
+        La ruta anterior se comparará con una URL de <code>http://domain.com/login</code>,
+        y hará un dispatch a <code>AuthController::loginAction()</code>.
+    </para>
+
+    <note id="zend.controller.router.routes.static.warning">
+        <title>Advertencia: Las Rutas Estáticas Deben Contener Defaults Sanos</title>
+
+        <para>
+            Dado que una ruta estática no pasa ninguna parte de la URL del  
+            objeto solicitud, como ser los parámetros, usted 
+            <emphasis>debe</emphasis> pasar todos los parámetros necesarios para 
+            enviar una solicitud a la ruta como si fuera por defecto. 
+            Omitiendo los valores por defecto de "controller" o "action" tendrá 
+            resultados inesperados, y probablemente el resultado de la solicitud 
+            no sea ejecutable.
+        </para>
+
+        <para>
+            Como regla general, siempre proporcione cada uno de los siguientes 
+            valores por defecto:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>controller</para></listitem>
+            <listitem><para>action</para></listitem>
+            <listitem><para>module (si ya no está por defecto)</para></listitem>
+        </itemizedlist>
+
+        <para>
+            Opcionalmente, también puede pasar el parámetro 
+            "useDefaultControllerAlways" al front controller durante el 
+            bootstrapping:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$front->setParam('useDefaultControllerAlways', true);
+]]></programlisting>
+
+        <para>
+            Sin embargo, esto es considerado un rodeo; siempre es mejor 
+            definir explícitamente valores correctos o sanos por defecto.
+        </para>
+    </note>
+</sect3>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 381 - 0
documentation/manual/es/module_specs/Zend_Controller-Router-Route.xml

@@ -0,0 +1,381 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect3 id="zend.controller.router.routes.standard">
+    <title>Zend_Controller_Router_Route</title>
+
+    <para>
+        <classname>Zend_Controller_Router_Route</classname> es la ruta 
+        standard del framework. Combina la facilidad de uso con la flexibilidad  
+        para la definición de rutas. Cada ruta consiste fundamentalmente en el 
+        mapeo de la URL (de partes estáticas y dinámicas (variables)) y puede ser 
+        iniciada con valores predeterminados así como con requisitos variables.
+    </para>
+
+    <para>
+        Imaginemos que nuestra aplicación ficticia necesitará algunas páginas 
+        informativas sobre los autores del contenido. 
+        Queremos ser capaces de apuntar nuestro navegador web a 
+        <code>http://domain.com/author/martel</code> para ver la información 
+        sobre este muchacho "martel". La ruta para esa funcionalidad podría 
+        parecerse a:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+$route = new Zend_Controller_Router_Route(
+    'author/:username',
+    array(
+        'controller' => 'profile',
+        'action'     => 'userinfo'
+    )
+);
+
+$router->addRoute('user', $route);
+]]></programlisting>
+
+    <para>
+        El primer parámetro en el constructor 
+        <classname>Zend_Controller_Router_Route</classname>
+        es una definición de ruta que será acompañada de una URL. 
+        Las definiciones de ruta consisten en partes estáticas y dinámicas 
+        separadas por el caracter barra ('/'). Las partes estáticas son simples 
+        textos: <code>author</code>. Las partes dinámicas, llamadas variables, 
+        se marcan anteponiendo dos puntos (:) al nombre de la variable  
+        <code>:username</code>.
+    </para>
+
+    <note>
+        <title>Uso de Caracteres</title>
+        <para>
+            La implementación actual le permite utilizar cualquier carácter 
+            (salvo una barra) como un identificador de variable, pero se recomienda 
+            encarecidamente que se utilicen sólo caracteres que sean válidos para 
+            identificadores de variables PHP. En implementaciones futuras se 
+            podría alterar este comportamiento, resultando en probables fallos 
+            escondidos en su código.
+        </para>
+    </note>
+
+    <para>
+        Este ejemplo de ruta debería ser coincidente cuando apunta su navegador a
+        <code>http://domain.com/author/martel</code>, en cuyo caso todas sus 
+        variables se inyectan al objeto <classname>Zend_Controller_Request</classname> 
+        y quedando accesibles en <code>ProfileController</code>. 
+        Las variables devueltas por este ejemplo pueden ser representadas como 
+        el siguiente array de pares clave/valor:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+$values = array(
+    'username'   => 'martel',
+    'controller' => 'profile',
+    'action'     => 'userinfo'
+);
+]]></programlisting>
+
+    <para>
+        Después, <classname>Zend_Controller_Dispatcher_Standard</classname> 
+        debe invocar al método <code>userinfoAction()</code> de su clase 
+        <code>ProfileController</code> (en el módulo por defecto) basado en
+        estos valores. Allí se podrán acceder a todas las variables mediante  
+        los métodos <classname>Zend_Controller_Action::_getParam()</classname> 
+        o <classname>Zend_Controller_Request::getParam()</classname>:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+public function userinfoAction()
+{
+    $request = $this->getRequest();
+    $username = $request->getParam('username');
+
+    $username = $this->_getParam('username');
+}
+]]></programlisting>
+
+    <para>
+        La definición de ruta puede contener uno o más caracteres especiales 
+        - un comodín - representado por el símbolo '*'. 
+        Se utiliza para reunir parámetros al igual que el valor de ruta por 
+        defecto del Módulo (var => pares de valores definidos en la URI). 
+        La siguiente ruta imita más o menos el comportamiento de la ruta del 
+        Módulo:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+$route = new Zend_Controller_Router_Route(
+    ':module/:controller/:action/*',
+    array('module' => 'default')
+);
+$router->addRoute('default', $route);
+]]></programlisting>
+
+    <sect4 id="zend.controller.router.routes.standard.variable-defaults">
+        <title>Variables por Defecto</title>
+
+        <para>
+            Cada variable en la ruta puede tener una valor por defecto y para 
+            esto es que se usa el segundo parámetro del constructor 
+            <classname>Zend_Controller_Router_Route</classname>. 
+            Este parámetro es un array con claves representando los nombres de 
+            variables y con valores como los deseados por defecto:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$route = new Zend_Controller_Router_Route(
+    'archive/:year',
+    array('year' => 2006)
+);
+$router->addRoute('archive', $route);
+]]></programlisting>
+
+        <para>
+            La ruta de arriba comparará URLs como
+            <code>http://domain.com/archive/2005</code> y
+            <code>http://example.com/archive</code>. En este último caso la 
+            variable year(año) tendrá un valor inicial predeterminado de 2006.
+        </para>
+
+        <para>
+            Este ejemplo resultará en inyectar una variable año al objeto 
+            solicitud. Ya que no hay información de enrutamiento presente 
+            (no se define ningún controlador ni parámetros de acción), 
+            la solicitud será enviada al controlador y al método de acción 
+            por defecto (que a la vez ambos están definidos en 
+            <classname>Zend_Controller_Dispatcher_Abstract</classname>). 
+            Para hacerlos más utilizables, tiene que proporcionar un controlador 
+            válido y una acción válida como la ruta por defecto:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$route = new Zend_Controller_Router_Route(
+    'archive/:year',
+    array(
+        'year'       => 2006,
+        'controller' => 'archive',
+        'action'     => 'show'
+    )
+);
+$router->addRoute('archive', $route);
+]]></programlisting>
+
+        <para>
+            Entonces, esta ruta resultará en el dispatch al método 
+            <code>showAction()</code> de la clase 
+            <code>ArchiveController</code>.
+        </para>
+
+    </sect4>
+
+    <sect4 id="zend.controller.router.routes.standard.variable-requirements">
+        <title>Requerimientos para Variables</title>
+
+        <para>
+            Podemos agregar un tercer parámetro al constructor
+            <classname>Zend_Controller_Router_Route</classname> donde podemos  
+            establecer los requisitos para las variables. 
+            Estas son definidas como partes de una expresión regular:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$route = new Zend_Controller_Router_Route(
+    'archive/:year',
+    array(
+        'year'       => 2006,
+        'controller' => 'archive',
+        'action'     => 'show'
+    ),
+    array('year' => '\d+')
+);
+$router->addRoute('archive', $route);
+]]></programlisting>
+
+        <para>
+            Con una ruta definida como la de arriba, el router comparará solo 
+            cuando la variable año contenga datos numéricos, eg. 
+            <code>http://domain.com/archive/2345</code>. Una URL como 
+            <code>http://example.com/archive/test</code> no se comparará y en su 
+            lugar el control se pasará a la próxima ruta en la cadena.
+        </para>
+    </sect4>
+
+    <sect4 id="zend.controller.router.routes.standard.translated-segments">
+        <title>Segmentos Traducidos</title>
+
+        <para>
+            El standard de ruta brinda apoyo a la traducción de segmentos. 
+            Para utilizar esta característica, tiene que definir por lo menos 
+            un traductor (una instancia de <classname>Zend_Translate</classname>) 
+            mediante una de las siguientes formas:
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    Ponerlo en el registro con la clave 
+                    <classname>Zend_Translate</classname>.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    Setearlo mediante el método estático
+                    <classname>Zend_Controller_Router_Route::setDefaultTranslator()</classname>.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    Pasarlo como cuarto parámetro al constructor.
+                </para>
+            </listitem>
+        </itemizedlist>
+
+        <para>
+            Por defecto, se utilizará el "locale" especificado en la instancia 
+            <classname>Zend_Translate</classname>.  
+            Para anularlo, debe setearlo (como una instancia de 
+            <classname>Zend_Locale</classname> o un string local) de una de las 
+            siguientes maneras:
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    Ponerlo en el registro con la clave <classname>Zend_Locale</classname>.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    Setearlo mediante el método estático 
+                    <classname>Zend_Controller_Router_Route::setDefaultLocale()</classname>.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    Pasarlo como cuarto parámetro al constructor.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    Pasarlo como parámetro <code>@locale</code> al método de 
+                    ensamblaje.
+                </para>
+            </listitem>
+        </itemizedlist>
+
+        <para>
+            Los segmentos traducidos se dividen en dos partes. 
+            Los segmentos fijos están precedidos por un único signo 
+            <code>@</code>, y serán traducidos al "locale" actual para el 
+            ensamblaje y se revierten al ID del mensaje cuando se acepte 
+            nuevamente. Los segmentos dinámicos tienen el prefijo <code>:@</code>.
+            Para el ensamblaje, el parámetro dado será traducido y se insertará 
+            en la posición del parámetro. 
+            Cuando se acepte, el parámetro traducido de la URL volverá al ID
+            del mensaje nuevamente.
+        </para>
+
+        <note>
+            <title>IDs de Mensajes y Archivos de Lenguajes Separados</title>
+            <para>
+                Ocasionalmente un ID de mensaje que quiere usar en una de sus 
+                rutas ya se utiliza en un view script o en otro lugar. 
+                Para tener pleno control sobre URLs seguras, debe usar 
+                un archivo de idioma separado para los mensajes utilizados en 
+                la ruta.
+            </para>
+        </note>
+
+        <para>
+            La siguiente es la forma más sencilla para preparar el itinerario 
+            normal para el uso de la traducción del segmento:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+// Prepare el traductor
+$translator = new Zend_Translate('array', array(), 'en');
+$translator->addTranslation(array('archive' => 'archiv',
+                                  'year'    => 'jahr',
+                                  'month'   => 'monat',
+                                  'index'   => 'uebersicht'),
+                            'de');
+
+// Establecer el "locale" actual para el traductor
+$translator->setLocale('en');
+
+// Establecerlo como traductor por defecto para las rutas
+Zend_Controller_Router_Route::setDefaultTranslator($translator);
+]]></programlisting>
+
+        <para>
+            Este ejemplo demuestra el uso de segmentos estáticos:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+// Crear la ruta
+$route = new Zend_Controller_Router_Route(
+    '@archive',
+    array(
+        'controller' => 'archive',
+        'action'     => 'index'
+    )
+);
+$router->addRoute('archive', $route);
+
+// Ensamblar la URL en el locale actual por defecto: archive
+$route->assemble(array());
+
+// Ensamblar la URL en alemán: archiv
+$route->assemble(array());
+]]></programlisting>
+
+        <para>
+            Puede usar segmentos dinámicos para crear veriones traducidas como 
+            del tipo módulo-ruta:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+// Crear la ruta
+$route = new Zend_Controller_Router_Route(
+    ':@controller/:@action/*',
+    array(
+        'controller' => 'index',
+        'action'     => 'index'
+    )
+);
+$router->addRoute('archive', $route);
+
+// Ensamblar la URL en el "locale" por defecto: archive/index/foo/bar
+$route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
+
+// Ensamblar la URL en alemán: archiv/uebersicht/foo/bar
+$route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
+]]></programlisting>
+
+        <para>
+            También puede mezclar segmentos estáticos y dinámicos:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+// Crear la ruta
+$route = new Zend_Controller_Router_Route(
+    '@archive/:@mode/:value',
+    array(
+        'mode'       => 'year'
+        'value'      => 2005,
+        'controller' => 'archive',
+        'action'     => 'show'
+    ),
+    array('mode'  => '(month|year)'
+          'value' => '\d+')
+);
+$router->addRoute('archive', $route);
+
+// Ensamblar la URL en el "locale" por defecto: archive/month/5
+$route->assemble(array('mode' => 'month', 'value' => '5'));
+
+// Ensamblar la URL en alemán: archiv/monat/5
+$route->assemble(array('mode' => 'month', 'value' => '5', '@locale' => 'de'));
+]]></programlisting>
+    </sect4>
+</sect3>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 506 - 0
documentation/manual/es/module_specs/Zend_Controller-Router.xml

@@ -0,0 +1,506 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.controller.router"  xmlns:xi="http://www.w3.org/2001/XInclude">
+    <title>El Router Standard</title>
+    <sect2 id="zend.controller.router.introduction">
+        <title>Introducción</title>
+        <para>
+            <classname>Zend_Controller_Router_Rewrite</classname> Es el router 
+            standard del Framework. Routing es el proceso de tomar la parte 
+            final de una URI (la parte de la URI que viene después de la URL 
+            base) y la descomposición en parámetros para determinar qué módulo, 
+            qué controlador y acción de ese controlador debe recibir la solicitud. 
+            Estos valores del módulo, controlador, acción y otros parámetros 
+            están enpaquetados en un objeto 
+            <classname>Zend_Controller_Request_Http</classname> el cual es 
+            procesado luego por <classname>Zend_Controller_Dispatcher_Standard</classname>. 
+            El routing ocurre sólo una vez: cuando se recibió inicialmente la 
+            solicitud y antes del dispatch del primer controlador.
+        </para>
+
+        <para>
+            <classname>Zend_Controller_Router_Rewrite</classname> está diseñado 
+            para permitir que una funcionalidad tipo mod_rewrite se pueda usar 
+            en estructuras PHP puras. Se basa muy vagamente en el routing de 
+            Ruby on Rails (RoR) y no requiere ningún conocimiento previo de 
+            reescritura de la URL del webserver. Está diseñado para trabajar 
+            con solo una regla mod_rewrite de Apache (one of):
+        </para>
+
+        <programlisting role="php"><![CDATA[
+RewriteEngine on
+RewriteRule !\.(js|ico|gif|jpg|png|css|html)$ index.php
+]]></programlisting>
+
+        <para>
+            o (preferido):
+        </para>
+
+        <programlisting role="php"><![CDATA[
+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>
+
+        <para>
+            El router rewrite también puede utilizarse con el IIS webserver (versions &lt;= 7.0) si <ulink
+                url="http://www.isapirewrite.com">Isapi_Rewrite</ulink> 
+                se ha instalado como una extensión Isapi con la siguiente 
+                regla de reescribir:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+RewriteRule ^[\w/\%]*(?:\.(?!(?:js|ico|gif|jpg|png|css|html)$)[\w\%]*$)? /index.php [I]
+]]></programlisting>
+
+        <note>
+            <title>IIS Isapi_Rewrite</title>
+            <para>
+                Cuando se usa IIS, <code>$_SERVER['REQUEST_URI']</code> puede 
+                no existir, o establecerlo como un string vacío. En este caso,
+                <classname>Zend_Controller_Request_Http</classname> 
+                intentará usar el valor de 
+                <code>$_SERVER['HTTP_X_REWRITE_URL']</code> 
+                establecido por la extensión Isapi_Rewrite.
+            </para>
+        </note>
+
+        <para>
+            IIS 7.0 introduce un módulo nativo de reescribir la URL, y puede ser 
+            configurado como sigue:
+        </para>
+
+        <programlisting role="xml"><![CDATA[
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+     <system.webServer>
+         <rewrite>
+             <rules>
+                 <rule name="Imported Rule 1" stopProcessing="true">
+                     <match url="^.*$" />
+                     <conditions logicalGrouping="MatchAny">
+                         <add input="{REQUEST_FILENAME}"
+                             matchType="IsFile" pattern=""
+                             ignoreCase="false" />
+                         <add input="{REQUEST_FILENAME}"
+                             matchType="IsDirectory"
+                             pattern="" ignoreCase="false" />
+                     </conditions>
+                     <action type="None" />
+                 </rule>
+                 <rule name="Imported Rule 2" stopProcessing="true">
+                     <match url="^.*$" />
+                     <action type="Rewrite" url="index.php" />
+                 </rule>
+             </rules>
+         </rewrite>
+     </system.webServer>
+</configuration>]></programlisting>
+
+        <para>
+            Si está usando Lighttpd, la siguiente regla de reescritura es válida:
+        </para>
+
+        <programlisting role="lighttpd"><![CDATA[
+url.rewrite-once = (
+    ".*\?(.*)$" => "/index.php?$1",
+    ".*\.(js|ico|gif|jpg|png|css|html)$" => "$0",
+    "" => "/index.php"
+)
+]]></programlisting>
+    </sect2>
+
+    <sect2 id="zend.controller.router.usage">
+        <title>Usando un Router</title>
+
+        <para>
+            Para utilizar adecuadamente el router de reescritura debe 
+            instanciarlo, agregar algunas rutas definidas por el usuario y 
+            luego inyectarlo en el controlador. El siguiente código ilustra el 
+            procedimiento:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+// Crear un router
+
+$router = $ctrl->getRouter(); // returns a rewrite router by default
+$router->addRoute(
+    'user',
+    new Zend_Controller_Router_Route('user/:username',
+                                     array('controller' => 'user',
+                                           'action' => 'info'))
+);
+]]></programlisting>
+    </sect2>
+
+    <sect2 id="zend.controller.router.basic">
+        <title>Operación Básica del Rewrite Router</title>
+
+        <para>
+            El corazón del RewriteRouter es la definición de la rutas definidas 
+            por el usuario. Las rutas se agregan llamando al método addRoute 
+            de RewriteRouter y pasándole una nueva instancia de una clase que 
+            implementó a 
+            <classname>Zend_Controller_Router_Route_Interface</classname>. Eg.:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$router->addRoute('user',
+                  new Zend_Controller_Router_Route('user/:username'));
+]]></programlisting>
+
+        <para>
+            El Rewrite Router viene con seis tipos básicos de rutas (uno de los 
+            cuales es especial):
+        </para>
+
+        <itemizedlist mark="opencircle">
+            <listitem><para><xref linkend="zend.controller.router.routes.standard" /></para></listitem>
+            <listitem><para><xref linkend="zend.controller.router.routes.static" /></para></listitem>
+            <listitem><para><xref linkend="zend.controller.router.routes.regex" /></para></listitem>
+            <listitem><para><xref linkend="zend.controller.router.routes.hostname" /></para></listitem>
+            <listitem><para><xref linkend="zend.controller.router.routes.chain" /></para></listitem>
+            <listitem><para><xref linkend="zend.controller.router.default-routes" /> *</para></listitem>
+        </itemizedlist>
+
+        <para>
+            Las rutas pueden ser utilizadas numerosas veces para crear una cadena 
+            o un esquema de aplicación de ruteo definido por el usuario.  
+            Puede usar cualquier número de rutas en cualquier configuración, 
+            con la excepción de la ruta del Módulo, la cual debe ser utilizada 
+            una vez y probablemente como la ruta más genérica (es decir, 
+            por defecto). Cada ruta se describe en mayor detalle más adelante.
+        </para>
+
+        <para>
+            El primer parámetro a addRoute es el nombre de la ruta. 
+            Se utiliza como un manejador para sacar las rutas del router 
+            (por ejemplo, con fines de generación de URL). 
+            El segundo parámetro es la ruta misma.
+        </para>
+
+        <note>
+            <para>
+                El uso más común del nombre de ruta es por medio del 
+                ayudante de url <classname>Zend_View</classname>:
+            </para>
+
+            <programlisting role="php"><![CDATA[
+<a href=
+"<?php echo $this->url(array('username' => 'martel'), 'user') ?>">Martel</a>
+]]></programlisting>
+
+            <para>
+                Que resultaría en la href: <code>user/martel</code>.
+            </para>
+        </note>
+
+        <para>
+            El routing es un simple proceso de iteración a través de todas las 
+            rutas provistas y la equiparación de sus definiciones con la petición 
+            actual de URI. Cuando se encuentra una concordancia, se devuelven 
+            valores de variables desde la instancia Route y se inyecta en el 
+            objeto <classname>Zend_Controller_Request</classname>  
+            para su posterior utilización en el dispatcher así también como en 
+            los controladores creados por el usuario. En caso de no encontrar 
+            ninguna concordancia, se comprobará la siguiente ruta en la cadena.
+        </para>
+
+        <para>
+            Si necesita determinar en qué ruta se encontró una concordancia, 
+            puede usar el método <code>getCurrentRouteName()</code>, que devolverá 
+            el identificador usado cuando registró la ruta con el router. 
+            Si quiere el objeto de la ruta actual, puede usar 
+            <code>getCurrentRoute()</code>.
+        </para>
+
+        <note>
+            <title>Matching Inverso</title>
+            <para>
+                Las rutas están equiparadas en orden inverso para asegurarse 
+                que las rutas más genéricas se definan primero.
+            </para>
+        </note>
+
+        <note>
+            <title>Valores Retornados</title>
+            <para>
+                Los valores retornados del routing provienen de parámetros URL 
+                o de rutas definidas por defecto por el usuario. 
+                Estas variables son accesibles posteriormente a través de los métodos 
+                <classname>Zend_Controller_Request::getParam()</classname> o
+                <classname>Zend_Controller_Action::_getParam()</classname>.
+            </para>
+        </note>
+
+        <para>
+            Hay tres variables que pueden utilizarse en las rutas - 'module', 
+            'controller' y 'action'. Estas variables especiales son utilizados por 
+            <classname>Zend_Controller_Dispatcher</classname> para encontrar un 
+            controlador y una acción para hacer el dispatch.
+        </para>
+
+        <note>
+            <title>Variables Especiales</title>
+            <para>
+                Los nombres de estas variables especiales pueden ser diferentes 
+                si elige alterar los valores por defecto en
+                <classname>Zend_Controller_Request_Http</classname> mediante los 
+                métodos 
+                <code>setControllerKey</code> y <code>setActionKey</code>.
+            </para>
+        </note>
+
+    </sect2>
+
+    <sect2 id="zend.controller.router.default-routes">
+        <title>Routes por Defecto</title>
+
+        <para>
+            <classname>Zend_Controller_Router_Rewrite</classname> viene 
+            preconfigurado con una ruta por defecto, que se comparará con URIs 
+            en la forma de <code>controller/action</code>. 
+            Además, se puede especificar un nombre de módulo como primer 
+            elemento del path, permitiendo URIs de la forma            
+            <code>module/controller/action</code>. Por último, también coincidrá  
+            con cualquier parámetro adicional agregado a la URI por defecto -
+            <code>controller/action/var1/value1/var2/value2</code>.
+        </para>
+
+        <para>
+            Algunos ejemplos de cómo están equiparadas las rutas:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+// Asumiendo lo siguiente:
+$ctrl->setControllerDirectory(
+    array(
+        'default' => '/path/to/default/controllers',
+        'news'    => '/path/to/news/controllers',
+        'blog'    => '/path/to/blog/controllers'
+    )
+);
+
+Módulo únicamente:
+http://example/news
+    module == news
+
+Modulo inválido mapea al nombre del controlador:
+http://example/foo
+    controller == foo
+
+Módulo + controlador:
+http://example/blog/archive
+    module     == blog
+    controller == archive
+
+Módulo + controlador + accción:
+http://example/blog/archive/list
+    module     == blog
+    controller == archive
+    action     == list
+
+Módulo + controlador + accción + parámetros:
+http://example/blog/archive/list/sort/alpha/date/desc
+    module     == blog
+    controller == archive
+    action     == list
+    sort       == alpha
+    date       == desc
+]]></programlisting>
+
+        <para>
+            La ruta por defecto es simplemente un objeto 
+            <classname>Zend_Controller_Router_Route_Module</classname> 
+            almacenado bajo el nombre de (index) por 'default' en RewriteRouter. 
+            Está generado más o menos así:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$compat = new Zend_Controller_Router_Route_Module(array(),
+                                                  $dispatcher,
+                                                  $request);
+$this->addRoute('default', $compat);
+]]></programlisting>
+
+        <para>
+            Si no quiere esta ruta en particular en su esquema por defecto de
+            routing, podrá anularla creando su propia ruta por 'defecto'  
+            (es decir, almacenar bajo el nombre de 'default') o eliminarla por 
+            completo usando <code>removeDefaultRoutes()</code>:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+// Eliminar cualquier ruta por defecto
+$router->removeDefaultRoutes();
+]]></programlisting>
+
+    </sect2>
+
+    <sect2 id="zend.controller.router.rewritebase">
+        <title>URL Base y Subdirectorios</title>
+
+        <para>
+            El router rewrite puede ser utilizado en subdirectorios (por 
+            ejemplo <code>http://domain.com/~user/application-root/</code>) 
+            en cuyo caso la URL base de la aplicación 
+            (<code>/~user/application-root</code>) debe ser detectada 
+            automáticamente por <classname>Zend_Controller_Request_Http</classname> 
+            y usada en consecuencia.
+        </para>
+
+        <para>
+            Si la URL base se detecta incorrectamente se la puede anular con su 
+            propio path de base usando
+            <classname>Zend_Controller_Request_Http</classname> y llamando al 
+            método <code>setBaseUrl()</code> (ver <xref
+                linkend="zend.controller.request.http.baseurl" />):
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$request->setBaseUrl('/~user/application-root/');
+]]></programlisting>
+
+    </sect2>
+
+    <sect2 id="zend.controller.router.global.parameters">
+        <title>Parámetros Globales</title>
+
+        <para>
+            Puede establecer los parámetros globales en un router que se 
+            proporcionan automáticamente a una ruta cuando se ensamblasn mediante  
+            <code>setGlobalParam</code>. Si se establece un parámetro global 
+            pero también se lo entrega directamente al método de ensamblaje, 
+            el parámetro del usuario sobreescribe al parámetro global. 
+            Puede establecer un parámetro global esta forma:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$router->setGlobalParam('lang', 'en');
+]]></programlisting>
+    </sect2>
+
+    <sect2 id="zend.controller.router.routes">
+        <title>Tipos de Route</title>
+        <xi:include href="Zend_Controller-Router-Route.xml" />
+        <xi:include href="Zend_Controller-Router-Route-Static.xml" />
+        <xi:include href="Zend_Controller-Router-Route-Regex.xml" />
+        <xi:include href="Zend_Controller-Router-Route-Hostname.xml" />
+        <xi:include href="Zend_Controller-Router-Route-Chain.xml" />
+    </sect2>
+
+    <sect2 id="zend.controller.router.add-config">
+        <title>Usando <classname>Zend_Config</classname> con RewriteRouter</title>
+
+        <para>
+            A veces es más conveniente para actualizar un archivo de 
+            configuración con nuevas rutas que modificar el código. 
+            Esto es posible a través del método <code>addConfig()</code>.
+            Básicamente, se crea una configuración compatible con 
+            <classname>Zend_Config</classname>. 
+            Y en su código lo lee y lo pasa a RewriteRouter.
+        </para>
+
+        <para>
+            Como ejemplo, considere el siguiente archivo INI:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+[production]
+routes.archive.route = "archive/:year/*"
+routes.archive.defaults.controller = archive
+routes.archive.defaults.action = show
+routes.archive.defaults.year = 2000
+routes.archive.reqs.year = "\d+"
+
+routes.news.type = "Zend_Controller_Router_Route_Static"
+routes.news.route = "news"
+routes.news.defaults.controller = "news"
+routes.news.defaults.action = "list"
+
+routes.archive.type = "Zend_Controller_Router_Route_Regex"
+routes.archive.route = "archive/(\d+)"
+routes.archive.defaults.controller = "archive"
+routes.archive.defaults.action = "show"
+routes.archive.map.1 = "year"
+; O: routes.archive.map.year = 1
+]]></programlisting>
+
+        <para>
+            Entonces el archivo INI puede ser leído por un objeto
+            <classname>Zend_Config</classname> como sigue:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$config = new Zend_Config_Ini('/path/to/config.ini', 'production');
+$router = new Zend_Controller_Router_Rewrite();
+$router->addConfig($config, 'routes');
+]]></programlisting>
+
+        <para>
+            En el ejemplo de arriba, le decimos el router que utilice la 
+            sección 'routes' del archivo INI para utilizarlo en sus rutas. 
+            Cada clave de primer nivel en esa sección será utilizada para definir 
+            un nombre de ruta; el ejemplo anterior define las rutas 'archive' y 
+            'news'. Entonces cada ruta requiere, como mínimo, una entrada a la 
+            'ruta' y una o más entradas por 'default'; opcionalmente puede 
+            proporcionarse una o más 'reqs' (abreviación de 'required'). 
+            Dicho todo esto, estos corresponden a los tres argumentos que se le 
+            suministran al objeto 
+            <classname>Zend_Controller_Router_Route_Interface</classname>. 
+            Puede utilizarse una clave opcional 'type' para especificar el 
+            tipo de clase de ruta a utilizar en esa ruta en particular; 
+            por defecto, usa 
+            <classname>Zend_Controller_Router_Route</classname>. 
+            En el ejemplo de arriba, la ruta 'news' está definida para usar 
+            <classname>Zend_Controller_Router_Route_Static</classname>.
+        </para>
+    </sect2>
+
+    <sect2 id="zend.controller.router.subclassing">
+        <title>Subclassing del Router</title>
+
+        <para>
+            El standard rewrite router debería proporcionarle más funcionalidad 
+            si la necesita; más a menudo, sólo necesitará crear un nuevo 
+            tipo de ruta a fin de ofrecer funcionalidades nuevas o modificadas  
+            sobre las tutas provistas.
+        </para>
+
+        <para>
+            Dicho esto, en algún momento puede encontrarse a si mismo deseando 
+            usar un paradigma diferente de routing. La intefaz  
+            <classname>Zend_Controller_Router_Interface</classname> proporciona 
+            la información mínima necesaria para crear un router, y consiste en 
+            un único método.
+        </para>
+
+        <programlisting role="php"><![CDATA[
+interface Zend_Controller_Router_Interface
+{
+  /**
+   * @param  Zend_Controller_Request_Abstract $request
+   * @throws Zend_Controller_Router_Exception
+   * @return Zend_Controller_Request_Abstract
+   */
+  public function route(Zend_Controller_Request_Abstract $request);
+}
+]]></programlisting>
+
+        <para>
+            El routing sólo ocurre una vez: cuando la petición es recibida por 
+            primera vez en el sistema. El propósito del router es determinar el 
+            controlador, la acción, y los parámetros opcionales sobre la base 
+            del medio ambiente de la solicitud, y luego ajustarlos en la solicitud. 
+            El objeto solicitud se pasa entonces al dispatcher. 
+            Si no es posible trazar una ruta hacia un dispatch token, 
+            el router no debe hacer nada con el objeto solicitud.
+        </para>
+    </sect2>
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 399 - 0
documentation/manual/es/module_specs/Zend_Dojo-Data.xml

@@ -0,0 +1,399 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.dojo.data">
+    <title>Zend_Dojo_Data: Envolturas de dojo.data</title>
+
+    <para>
+        Dojo proporciona abstracción de datos para los widgets de datos 
+        habilitados a través de su componente dojo.data. Este componente 
+        proporciona la capacidad de adjuntar un datastore, ofrecer algunos 
+        metadatos relativos al campo identidad, opcionalmente una etiqueta de 
+        campo, y una API para efectuar consultas, clasificación, recuperación 
+        de archivos y conjuntos de registros del datastore.
+    </para>
+
+    <para>
+        dojo.data se utiliza a menudo con XmlHttpRequest para traer dinámicamente  
+        datos desde el servidor. El principal mecanismo para esto es extender 
+        el QueryReadStore para que apunte a una URL y especificar la información 
+        a consultar. El lado del servidor después devuelve los datos con el 
+        siguiente formato JSON:
+    </para>
+
+    <programlisting role="javascript"><![CDATA[
+{
+    identifier: '<name>',
+    <label: '<label>',>
+    items: [
+        { name: '...', label: '...', someKey: '...' },
+        ...
+    ]
+}
+]]></programlisting>
+
+    <para>
+        <classname>Zend_Dojo_Data</classname> ofrece una interfaz simple para la 
+        construcción de estas estructuras programáticamente, interactuando 
+        con ellos, y serializándolos a un array o a JSON.
+    </para>
+
+    <sect2 id="zend.dojo.data.usage">
+        <title>Uso de Zend_Dojo_Data</title>
+
+        <para>
+            En su forma más simple, dojo.data requiere que se proporcione el 
+            nombre del campo identificador en cada item, y un conjunto de 
+            items (datos). Puede pasarlos tanto via el constructor, o via mutators:
+        </para>
+
+        <example id="zend.dojo.data.usage.constructor">
+            <title>Inicialización de Zend_Dojo_Data via constructor</title>
+
+            <programlisting role="php"><![CDATA[
+$data = new Zend_Dojo_Data('id', $items);
+]]></programlisting>
+        </example>
+
+        <example id="zend.dojo.data.usage.mutators">
+            <title>Inicialización de Zend_Dojo_Data via mutators</title>
+
+            <programlisting role="php"><![CDATA[
+$data = new Zend_Dojo_Data();
+$data->setIdentifier('id')
+     ->addItems($items);
+]]></programlisting>
+        </example>
+
+        <para>
+            También puede añadir un solo item a la vez, o agregar items utilizando 
+            <code>addItem()</code> y <code>addItems()</code>.
+        </para>
+
+        <example id="zend.dojo.data.usage.append">
+            <title>Agregando datos a <classname>Zend_Dojo_Data</classname></title>
+
+            <programlisting role="php"><![CDATA[
+$data = new Zend_Dojo_Data($identifier, $items);
+$data->addItem($someItem);
+
+$data->addItems($someMoreItems);
+]]></programlisting>
+        </example>
+
+        <note>
+            <title>Siempre use un identificador!</title>
+
+            <para>
+                Cada datastore de dojo.data requiere que la columna identificadora 
+                se proporcione como metadatos, incluyendo 
+                <classname>Zend_Dojo_Data</classname>. 
+                De hecho, si intenta añadir items sin un identificador, se  
+                generará una excepción.
+            </para>
+        </note>
+
+        <para>
+            Los items individuales pueden ser uno de los siguientes:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                Arrays asociativos
+            </para></listitem>
+
+            <listitem><para>
+                Objectos implementando un método <code>toArray()</code>
+            </para></listitem>
+
+            <listitem><para>
+                Cualquiera de los otros objetos (se serializarán via get_object_vars())
+            </para></listitem>
+        </itemizedlist>
+
+        <para>
+            Puede adjuntar colecciones de los items anteriores via 
+            <code>addItems()</code> o <code>setItems()</code> 
+            (sobreescribe todos los items previamente establecidos); cuando lo 
+            haga, puede pasar un solo argumento:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                Arrays
+            </para></listitem>
+
+            <listitem><para>
+                Objectos implementando la interfaz <code>Traversable</code>, 
+                que incluye las interfaces <code>Iterator</code> y
+                <code>ArrayAccess</code>.
+            </para></listitem>
+        </itemizedlist>
+
+        <para>
+            Si quiere especificar un campo que actuará como una etiqueta para 
+            el item, llame a <code>setLabel()</code>:
+        </para>
+
+        <example id="zend.dojo.data.usage.label">
+            <title>Especificando la etiqueta de un campo en 
+            <classname>Zend_Dojo_Data</classname></title>
+
+            <programlisting role="php"><![CDATA[
+$data->setLabel('name');
+]]></programlisting>
+        </example>
+
+        <para>
+            Por último, también puede cargar un item 
+            <classname>Zend_Dojo_Data</classname> 
+            de un array JSON dojo.data, utilizando el método 
+            <code>fromJson()</code>.
+        </para>
+
+        <example id="zend.dojo.data.usage.populate">
+            <title>Alimentando <classname>Zend_Dojo_Data</classname> desde JSON</title>
+
+            <programlisting role="php"><![CDATA[
+$data->fromJson($json);
+]]></programlisting>
+        </example>
+    </sect2>
+
+    <sect2 id="zend.dojo.data.metadata">
+        <title>Agregando metadatos a sus contenedores</title>
+
+        <para>
+            Algunos componentes de Dojo requieren metadatos adicionales junto 
+            al conjunto de datos de dojo.data. 
+            Como ejemplo, <code>dojox.grid.Grid</code> puede tirar datos 
+            dinámicamente desde un <code>dojox.data.QueryReadStore</code>. 
+            Para que la paginación funcione correctamente, cada conjunto de datos 
+            de regreso debería contener una clave <code>numRows</code> con el 
+            número total de filas que podrían ser devueltas por la consulta. 
+            Con estos datos, la plantilla sabe cuando seguir haciendo pequeños  
+            pedidos de subconjuntos de datos al servidor y cuando dejar de 
+            hacer más peticiones (es decir, ha llegado a la última página de 
+            datos). Esta técnica es útil para despachar grandes conjuntos de 
+            datos en sus plantillas sin cargar todo el conjunto de una sola vez.
+        </para>
+
+        <para>
+            <classname>Zend_Dojo_Data</classname> permite asignar propiedades 
+            a los metadatos como al objeto. Lo siguiente ilustra su uso:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+// Establece el "numRows" a 100
+$data->setMetadata('numRows', 100);
+
+// Establece varios items a la vez:
+$data->setMetadata(array(
+    'numRows' => 100,
+    'sort'    => 'name',
+));
+
+// Inspecciona un único valor de metadatos:
+$numRows = $data->getMetadata('numRows');
+
+// Inspecciona todos los metadatos:
+$metadata = $data->getMetadata();
+
+// Elimina un item de metadatos:
+$data->clearMetadata('numRows');
+
+// Elimina todos los metadatos:
+$data->clearMetadata();
+]]></programlisting>
+    </sect2>
+
+    <sect2 id="zend.dojo.data.advanced">
+        <title>Casos Avanzados de Uso</title>
+
+        <para>
+            Además de actuar como un contenedor de datos serializable, 
+            <classname>Zend_Dojo_Data</classname> también ofrece la posibilidad 
+            de manipular y recorrer los datos en una variedad de formas.
+        </para>
+
+        <para>
+            <classname>Zend_Dojo_Data</classname> implementa las interfaces
+            <code>ArrayAccess</code>, <code>Iterator</code>, y
+            <code>Countable</code>. Por lo tanto, puede usar la recopilación de 
+            datos casi como si fuera un array.
+        </para>
+
+        <para>
+            Todos los items son referenciados por el identificador de campo. 
+            Dado que los identificadores deben ser únicos, puede usar los 
+            valores de este campo para sacar los registros individuales. 
+            Hay dos maneras de hacer esto: con el método <code>getItem()</code>, 
+            o via notación de array.
+        </para>
+
+        <programlisting role="php"><![CDATA[
+// Usando getItem():
+$item = $data->getItem('foo');
+
+// O usando notación de array:
+$item = $data['foo'];
+]]></programlisting>
+
+        <para>
+            Si conoce el identificador, puede utilizarlo para recuperar un item, 
+            actualizarlo, borrarlo, crearlo, o probarlo:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+// Actualizar o crear un item:
+$data['foo'] = array('title' => 'Foo', 'email' => 'foo@foo.com');
+
+// Borrar un item:
+unset($data['foo']);
+
+// Efectuar una prueba para un item:
+if (isset($data[foo])) {
+}
+]]></programlisting>
+
+        <para>
+            También puede hacer un loop sobre todos los items. 
+            Internamente, todos los items se almacenan como arrays.
+        </para>
+
+        <programlisting role="php"><![CDATA[
+foreach ($data as $item) {
+    echo $item['title'] . ': ' . $item['description'] . "\n";
+}
+]]></programlisting>
+
+        <para>
+            O inclusive contar para ver cuántos ítems tiene:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+echo count($data), " items encontrados!";
+]]></programlisting>
+
+        <para>
+            Por último, como la clase implementa <code>__toString()</code>, 
+            también puede convertirlo a JSON simplemente con "echo" de PHP o 
+            convertirlo a string:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+echo $data; // echo como un string JSON
+
+$json = (string) $data; // conversión a string == conversión a JSON
+]]></programlisting>
+
+        <sect3 id="zend.dojo.data.advanced.methods">
+            <title>Métodos Disponibles</title>
+
+            <para>
+                Además de los métodos necesarios para aplicar las interfaces 
+                enumeradas anteriormente, están disponibles los siguientes métodos.
+            </para>
+
+            <itemizedlist>
+                <listitem><para>
+                    <code>setItems($items)</code>: establece varios items a la 
+                    vez, sobrescribiendo cualquier item que figurase anteriormente 
+                    en el objeto. <code>$items</code> debe ser un array o un 
+                    objeto <code>Traversable</code>.
+                </para></listitem>
+
+                <listitem><para>
+                    <code>setItem($item, $id = null)</code>: establece un 
+                    item individual, opcionalmente puede pasar un identificador 
+                    explícito. Sobreescribe el item si ya existe en la colección. 
+                    Los items válidos incluyen a arrays asociativos, objetos 
+                    implementando <code>toArray()</code>, o cualquier objeto 
+                    con propiedades públicas.
+                </para></listitem>
+
+                <listitem><para>
+                    <code>addItem($item, $id = null)</code>: añade un item 
+                    individual, opcionalmente puede pasar un identificador 
+                    explícito. 
+                    Generará una excepción si el item ya existe en la colección. 
+                    Los items válidos incluyen a arrays asociativos, objetos 
+                    implementando <code>toArray()</code>, o cualquier objeto 
+                    con propiedades públicas.
+                </para></listitem>
+
+                <listitem><para>
+                    <code>addItems($items)</code>: agrega múltiples items a la 
+                    vez, añadiendolos a cualquiera de los items actuales. 
+                    Generará una excepción si alguno de los nuevos items tiene 
+                    un identificador concordante a un identificador ya existente 
+                    en la colección. <code>$items</code> debe ser un array o un 
+                    objeto <code>Traversable</code>.
+                </para></listitem>
+
+                <listitem><para>
+                    <code>getItems()</code>: recupera todos los items como un 
+                    array de arrays.
+                </para></listitem>
+
+                <listitem><para>
+                    <code>hasItem($id)</code>: determina si un item con el 
+                    identificador dado existe en la colección.
+                </para></listitem>
+
+                <listitem><para>
+                    <code>getItem($id)</code>: recupera un item con el 
+                    identificador dado de la colección; el item retornado será 
+                    un array asociativo. Si ningún item coincide, se devolverá 
+                    un valor null.
+                </para></listitem>
+
+                <listitem><para>
+                    <code>removeItem($id)</code>: elimina de la colección un 
+                    item con el identificador dado.
+                </para></listitem>
+
+                <listitem><para>
+                    <code>clearItems()</code>: elimina todos los items de la 
+                    colección.
+                </para></listitem>
+
+                <listitem><para>
+                    <code>setIdentifier($identifier)</code>: establece el 
+                    nombre del campo que representa el identificador único para 
+                    cada item en la colección.
+                </para></listitem>
+
+                <listitem><para>
+                    <code>getIdentifier()</code>: recupera el nombre del campo 
+                    identificador.
+                </para></listitem>
+
+                <listitem><para>
+                    <code>setLabel($label)</code>: establece el nombre de un 
+                    campo para ser utilizado como la etiqueta a mostrar para 
+                    un item.
+                </para></listitem>
+
+                <listitem><para>
+                    <code>getLabel()</code>: recupera la etiqueta del nombre 
+                    del campo.
+                </para></listitem>
+
+                <listitem><para>
+                    <code>toArray()</code>: enviar el objeto a un array. 
+                    Como mínimo, el array contendrá las claves 'identifier', 
+                    'items', y 'label' si una etiqueta de campo ha sido 
+                    establecida en el objeto.
+                </para></listitem>
+
+                <listitem><para>
+                    <code>toJson()</code>: enviar el objeto a una representación JSON.
+                </para></listitem>
+            </itemizedlist>
+        </sect3>
+    </sect2>
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->
+

+ 148 - 0
documentation/manual/es/module_specs/Zend_Dojo-Form-Decorators.xml

@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect2 id="zend.dojo.form.decorators">
+    <title>Decoradores de Forms Específicos de Dijit</title>
+
+    <para>
+        La mayoría de los elementos de formularios pueden usar el decorador 
+        DijitElement, que tomará los parámetros dijit de los elementos, y 
+        pasarán estos y otros metadatos al ayudante de vista especificado por 
+        el elemento. 
+        Sin embargo, para decorar los forms, sub forms, y grupos de visualización, 
+        hay un conjunto de decoradores correspondientes a los diversos 
+        esquemas dijit.
+    </para>
+
+    <para>
+        Todos los decoradores dijit buscan la propiedad <code>dijitParams</code> 
+        del elemento que va a ser decorado, y mandarlos como un array <code>$params</code> 
+        al ayudante de vista dijit que se está usando. Luego, éstos son separados de 
+        cualquiera de las otras propiedades para evitar la duplicación de 
+        información.
+    </para>
+
+    <sect3 id="zend.dojo.form.decorators.dijitElement">
+        <title>Decorador DijitElement</title>
+
+        <para>
+            Al igual que <link linkend="zend.form.standardDecorators.viewHelper"> 
+            el decorador ViewHelper</link>, DijitElement espera una propiedad  
+            del <code>helper</code> en el elemento que luego usará como el 
+            ayudante de vista cuando lo renderice. 
+            Los parámetros Dijit suelen ser arrastrados directamente desde el 
+            elemento, pero también pueden ser pasados como opciones vía 
+            la clave <code>dijitParams</code> (el valor de esa clave debe ser 
+            un array asociativo de opciones).
+        </para>
+
+        <para>
+            Es importante que cada elemento tenga un único ID (como traído desde 
+            el método <code>getId()</code> del elemento). 
+            Si se detectan duplicados dentro del ayudante de vista <code>dojo()</code>, 
+            el decorador accionará un aviso, pero luego creará un único ID 
+            añadiéndole lo que devuelve <code>uniqid()</code> al identificador.
+        </para>
+
+        <para>
+            El uso estándar es simplemente asociar este decorador como el primero 
+            de su cadena de decoradores, sin opciones adicionales.
+        </para>
+
+        <example id="zend.dojo.form.decorators.dijitElement.usage">
+            <title>Uso del Decorador DijitElement</title>
+
+            <programlisting role="php"><![CDATA[
+$element->setDecorators(array(
+    'DijitElement',
+    'Errors',
+    'Label',
+    'ContentPane',
+));
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.decorators.dijitForm">
+        <title>Decorador DijitForm</title>
+
+        <para>
+            El decorador DijitForm es muy similar al <link
+                linkend="zend.form.standardDecorators.form">Form
+                decorator</link>; de hecho, básicamente puede ser utilizado de  
+            manera intercambiable con él, ya que utiliza el mismo nombre de 
+            ayudante de vista ('form').
+        </para>
+
+        <para>
+            Dado que dijit.form.Form no requiere ningún parámetro dijit para la 
+            configuración, la principal diferencia es que el ayudante de vista 
+            dijit del form exige que se pase un DOM ID para garantizar que la 
+            creación programática del dijit pueda trabajar. 
+            El decorador garantiza esto, pasando el nombre del form como el 
+            identificador.
+        </para>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.decorators.dijitContainer">
+        <title>Decoradores basados en DijitContainer</title>
+
+        <para>
+            El decorador <code>DijitContainer</code> es en realidad una clase 
+            abstracta desde la cual derivan una variedad de otros decoradores. 
+            Ofrece la misma funcionalidad de <link
+                linkend="zend.dojo.form.decorators.dijitElement">DijitElement</link>,
+            con el añadido del soporte para títulos. Muchos esquemas de dijits 
+            requieren o pueden utilizar un título; DijitContainer utilizará la  
+            propiedad del elemento leyenda (legend) si está disponible, y también pueden 
+            utilizar tanto 'legend' o 'title' como opción del decorador, si es 
+            pasada. 
+            El título será traducido si un adaptador de traducción con su 
+            correspondiente traducción está presente.
+        </para>
+
+        <para>
+            La siguiente es una lista de decoradores que heredan de  
+            <code>DijitContainer</code>:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>AccordionContainer</para></listitem>
+            <listitem><para>AccordionPane</para></listitem>
+            <listitem><para>BorderContainer</para></listitem>
+            <listitem><para>ContentPane</para></listitem>
+            <listitem><para>SplitContainer</para></listitem>
+            <listitem><para>StackContainer</para></listitem>
+            <listitem><para>TabContainer</para></listitem>
+        </itemizedlist>
+
+        <example id="zend.dojo.form.decorators.dijitContainer.usage">
+            <title>Uso del Decorador DijitContainer</title>
+
+            <programlisting role="php"><![CDATA[
+// Use un TabContainer para su form:
+$form->setDecorators(array(
+    'FormElements',
+    array('TabContainer', array(
+        'id'          => 'tabContainer',
+        'style'       => 'width: 600px; height: 500px;',
+        'dijitParams' => array(
+            'tabPosition' => 'top'
+        ),
+    )),
+    'DijitForm',
+));
+
+// Use un ContentPane en su sub form (que puede utilizarse con todos, pero no
+// con AccordionContainer):
+$subForm->setDecorators(array(
+    'FormElements',
+    array('HtmlTag', array('tag' => 'dl')),
+    'ContentPane',
+));
+]]></programlisting>
+        </example>
+    </sect3>
+</sect2>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 1482 - 0
documentation/manual/es/module_specs/Zend_Dojo-Form-Elements.xml

@@ -0,0 +1,1482 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect2 id="zend.dojo.form.elements">
+    <title>Elementos de Formularios Dijit-Specific</title>
+
+    <para>
+        Cada formulario dijit para el que se provee un ayudante tiene un 
+        elemento correspondiente <classname>Zend_Form</classname>. 
+        Todos ellos tienen los siguientes métodos disponibles para manipular 
+        los parámetros dijit:
+    </para>
+
+    <itemizedlist>
+        <listitem><para>
+                <code>setDijitParam($key, $value)</code>: establecer un único 
+                parámetro dijit. Si el parámetro dijit ya existe, se borrará y 
+                se reemplazará por el nuevo.
+        </para></listitem>
+
+        <listitem><para>
+                <code>setDijitParams(array $params)</code>: establecer varios 
+                parámetros dijit a la vez. Cualquiera de los  parámetros pasados 
+                que concuerden con los ya presentes se sobreescribirán. 
+        </para></listitem>
+
+        <listitem><para>
+                <code>hasDijitParam($key)</code>: si un determinado parámetro 
+                dijit está definido y presente, devolverá TRUE, de lo contrario 
+                devolverá FALSE.
+        </para></listitem>
+
+        <listitem><para>
+                <code>getDijitParam($key)</code>: recupera el parámetro dijit. 
+                Si no está disponible, se devuelve un valor null.
+        </para></listitem>
+
+        <listitem><para>
+                <code>getDijitParams()</code>: recupera todos los parámetros 
+                dijit.
+        </para></listitem>
+
+        <listitem><para>
+                <code>removeDijitParam($key)</code>: elimina el parámetro 
+                dijit dado.
+        </para></listitem>
+
+        <listitem><para>
+                <code>clearDijitParams()</code>: borra todos los parámetros 
+                dijit actualmente definidos. 
+        </para></listitem>
+    </itemizedlist>
+
+    <para>
+        Los parámetros Dijit se almacenan en la propiedad pública 
+        <code>dijitParams</code>. Así, puede habilitar dijit para un elemento 
+        de un formulario existente simplemente estableciendo esta propiedad 
+        en el elemento; sencillamante no tendrá los accessors anteriores a fin 
+        de facilitar la manipulación de parámetros.
+    </para>
+
+    <para>
+        Además, los elementos específicos de dijit implementan una lista 
+        diferente de decoradores, correspondientes a lo siguiente:
+    </para>
+
+    <programlisting role="php"><![CDATA[
+$element->addDecorator('DijitElement')
+        ->addDecorator('Errors')
+        ->addDecorator('HtmlTag', array('tag' => 'dd'))
+        ->addDecorator('Label', array('tag' => 'dt'));
+]]></programlisting>
+
+    <para>
+        En efecto, el decorador DijitElement es utilizado en lugar del 
+        decorador standard ViewHelper.
+    </para>
+
+    <para>
+        Finalmente, el elemento base Dijit asegura que el path del ayudante de 
+        vista de Dojo se establezca en la vista.
+    </para>
+
+    <para>
+        Una variante de DijitElement, DijitMulti, ofrece la funcionalidad del  
+        elemento abstracto del formulario <code>Multi</code>, permitiendo al  
+        desarrollador especificar 'multiOptions' -- típicamente opciones 
+        "select" u opciones de "radio".
+    </para>
+
+    <para>
+        Los siguientes elementos dijit están incluídos en la distribución 
+        standard de Zend Framework.
+    </para>
+
+    <sect3 id="zend.dojo.form.elements.button">
+        <title>Button</title>
+
+        <para>
+            Si bien no derivan del elemento standard Button <link
+                linkend="zend.form.standardElements.button"></link>, implementan  
+            la misma funcionalidad, y pueden ser utilizados como una sustitución 
+            de drop-in, como se expone en la siguiente funcionalidad:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                <code>getLabel()</code> utilizará el nombre del elemento como el 
+                rótulo del botón si no se ha provisto el nombre. 
+                Además, traducirá el nombre si un adaptador de traducción 
+                encuentra concordancia con un mensaje disponible.
+            </para></listitem>
+
+            <listitem><para>
+                <code>isChecked()</code> determina si el valor enviado  
+                coincide con la etiqueta; si así fuera, devuelve true. 
+                Esto es útil para determinar qué botón se utilizó cuando se  
+                envió un formulario.
+            </para></listitem>
+        </itemizedlist>
+
+        <para>
+            Además, sólo los decoradores <code>DijitElement</code> y
+            <code>DtDdWrapper</code> se utilizan para elementos Button.
+        </para>
+
+        <example id="zend.dojo.form.elements.button.example">
+            <title>Ejemplo de Uso del Elemento Button dijit</title>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'Button',
+    'foo',
+    array(
+        'label' => 'Button Label',
+    )
+);
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.checkBox">
+        <title>CheckBox</title>
+
+        <para>
+            Si bien no derivan del elemento standard Checkbox <link
+                linkend="zend.form.standardElements.checkbox"></link>, 
+            aplican la misma funcionalidad. Esto significa exponer los 
+            siguientes métodos:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                <code>setCheckedValue($value)</code>: establecer el valor a usar 
+                cuando el elemento está marcado (checked).
+            </para></listitem>
+
+            <listitem><para>
+                <code>getCheckedValue()</code>: obtener el valor del item a 
+                usar cuando está comprobado (checked).
+            </para></listitem>
+
+            <listitem><para>
+                <code>setUncheckedValue($value)</code>: establecer el valor del 
+                item a utilizar cuando está desactivado (unchecked).
+            </para></listitem>
+
+            <listitem><para>
+                <code>getUncheckedValue()</code>: obtener el valor del 
+                item a utilizar cuando está desactivado (unchecked).
+            </para></listitem>
+
+            <listitem><para>
+                <code>setChecked($flag)</code>: marcar el elemento como 
+                activado (checked) o desactivado (unchecked).
+            </para></listitem>
+
+            <listitem><para>
+                <code>isChecked()</code>: determina si el elemento está 
+                activo (checked) actualmente.
+            </para></listitem>
+        </itemizedlist>
+
+        <example id="zend.dojo.form.elements.checkBox.example">
+            <title>Ejemplo de Uso de Elementos CheckBox dijit</title>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'CheckBox',
+    'foo',
+    array(
+        'label'          => 'A check box',
+        'checkedValue'   => 'foo',
+        'uncheckedValue' => 'bar',
+        'checked'        => true,
+    )
+);
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.comboBox">
+        <title>ComboBox y FilteringSelect</title>
+
+        <para>
+            Como se señaló en la documentación del ayudante de vista de 
+            ComboBox dijit <link
+                linkend="zend.dojo.view.dijit.form"></link>, los ComboBoxes 
+            son un híbrido entre "select" y "text input", permitiendo el 
+            autocompletado y la capacidad para especificar una alternativa a las 
+            opciones provistas. 
+            FilteringSelects es lo mismo, pero no permite entradas arbitrarias.
+        </para>
+
+        <note>
+            <title>ComboBoxes que Devuelven los Valores de los Labels</title>
+
+            <para>
+                Los ComboBoxes devuelven los valores de los rótulos (labels), 
+                y no los valores de opción, que pueden llevar a una 
+                desvinculación de las expectativas. 
+                Por esta razón, los ComboBoxes no auto-registran un validador 
+                <code>InArray</code> (aunque los FilteringSelects si lo hacen).
+            </para>
+        </note>
+
+        <para>
+            Los elementos de forms de ComboBox y FilteringSelect proporcionan 
+            accessors y mutators para examinar y establecer las opciones 
+            seleccionadas, así como para especificar un datastore dojo.data 
+            (si se usa). Se extienden desde DijitMulti, que le permite 
+            especificar opciones de selección vía los métodos 
+            <code>setMultiOptions()</code> y <code>setMultiOption()</code>.
+            Además, están disponibles los siguientes métodos:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                <code>getStoreInfo()</code>: Obtener del datastore toda la 
+                información establecida actualmente. 
+                Devuelve un array vacío si no hay datos actualmente establecidos.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setStoreId($identifier)</code>: establece la variable del 
+                identificador (generalmente referenciado por el atributo 
+                'jsId' en Dojo). 
+                Este debe ser un nombre de variable válido para javascript.
+            </para></listitem>
+
+            <listitem><para>
+                <code>getStoreId()</code>: recupera el nombre de la variable del 
+                identificador del datastore.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setStoreType($dojoType)</code>: establece la clase del 
+                datastore a usar; por ejemplo, "dojo.data.ItemFileReadStore".
+            </para></listitem>
+
+            <listitem><para>
+                <code>getStoreType()</code>: obtiene la clase del datastore a 
+                usar.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setStoreParams(array $params)</code>: establece cualquiera 
+                de los parámetros utilizados para configurar el objeto datastore. 
+                Como ejemplo, el datastore dojo.data.ItemFileReadStore esperaría 
+                un parámetro 'url' apuntando a un lugar que devolvería el objeto 
+                dojo.data.
+            </para></listitem>
+
+            <listitem><para>
+                <code>getStoreParams()</code>: obtiene cualquiera de los 
+                parámetros del datastore actualmente establecido; si no hay 
+                ninguno, se devuelve un array vacío.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setAutocomplete($flag)</code>: indica si será usado o no  
+                el elemento seleccionado una vez que el usuario deje el 
+                elemento.
+            </para></listitem>
+
+            <listitem><para>
+                <code>getAutocomplete()</code>: obtener el valor del flag de 
+                autocomplete.
+            </para></listitem>
+        </itemizedlist>
+
+        <para>
+            Por defecto, si no hay ningún dojo.data registrado con el 
+            elemento, este elemento registra un validador <code>InArray</code> 
+            que valida contra las claves del array de las opciones registradas. 
+            Puede desactivar este comportamiento ya sea llamando a 
+            <code>setRegisterInArrayValidator(false)</code>, o pasando un valor 
+            false a la clave de configuración <code>registerInArrayValidator</code>.
+        </para>
+
+        <example id="zend.dojo.form.elements.comboBox.selectExample">
+            <title>Elemento de ComboBox dijit Usado como select input</title>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'ComboBox',
+    'foo',
+    array(
+        'label'        => 'ComboBox (select)',
+        'value'        => 'blue',
+        'autocomplete' => false,
+        'multiOptions' => array(
+            'red'    => 'Rouge',
+            'blue'   => 'Bleu',
+            'white'  => 'Blanc',
+            'orange' => 'Orange',
+            'black'  => 'Noir',
+            'green'  => 'Vert',
+        ),
+    )
+);
+]]></programlisting>
+        </example>
+
+        <example id="zend.dojo.form.elements.comboBox.datastoreExample">
+            <title>Elemento de ComboBox dijit Usado con datastore</title>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'ComboBox',
+    'foo',
+    array(
+        'label'       => 'ComboBox (datastore)',
+        'storeId'     => 'stateStore',
+        'storeType'   => 'dojo.data.ItemFileReadStore',
+        'storeParams' => array(
+            'url' => '/js/states.txt',
+        ),
+        'dijitParams' => array(
+            'searchAttr' => 'name',
+        ),
+    )
+);
+]]></programlisting>
+        </example>
+
+        <para>
+            Los ejemplos anteriores también podrían utilizar 
+            <code>FilteringSelect</code> en vez de <code>ComboBox</code>.
+        </para>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.currencyTextBox">
+        <title>CurrencyTextBox</title>
+
+        <para>
+            El CurrencyTextBox principalmente brinda apoyo a la entrada de 
+            moneda. La moneda puede ser localizada, y puede manejar tanto a 
+            valores fraccionarios como no fraccionarios.
+        </para>
+
+        <para>
+            Internamente, CurrencyTextBox deriva de <link
+                linkend="zend.dojo.form.elements.numberTextBox">NumberTextBox</link>,
+            <link
+                linkend="zend.dojo.form.elements.validationTextBox">ValidationTextBox</link>,
+            y <link linkend="zend.dojo.form.elements.textBox">TextBox</link>;
+            todos los métodos disponibles a esas clases están disponibles. 
+            Además, pueden utilizarse los siguientes métodos restrictivos:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                <code>setCurrency($currency)</code>: establecer el tipo de 
+                moneda a usar; y debe seguir la especificación <ulink
+                    url="http://en.wikipedia.org/wiki/ISO_4217">ISO-4217</ulink>
+            </para></listitem>
+
+            <listitem><para>
+                <code>getCurrency()</code>: recupera el tipo de moneda actual.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setSymbol($symbol)</code>: establece el símbolo de 
+                3 letras <ulink
+                    url="http://en.wikipedia.org/wiki/ISO_4217">ISO-4217</ulink>
+                de la moneda a usar.
+            </para></listitem>
+
+            <listitem><para>
+                <code>getSymbol()</code>: recupera el símbolo de la moneda actual.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setFractional($flag)</code>: establece si la moneda 
+                debería permitir o no valores fraccionarios.
+            </para></listitem>
+
+            <listitem><para>
+                <code>getFractional()</code>: recupera el status del flag 
+                fraccional.
+            </para></listitem>
+        </itemizedlist>
+
+        <example id="zend.dojo.form.elements.currencyTextBox.example">
+            <title>Ejemplo de Uso del Elemento CurrencyTextBox dijit</title>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'CurrencyTextBox',
+    'foo',
+    array(
+        'label'          => 'Currency:',
+        'required'       => true,
+        'currency'       => 'USD',
+        'invalidMessage' => 'Invalid amount. ' .
+                            'Include dollar sign, commas, and cents.',
+        'fractional'     => false,
+    )
+);
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.dateTextBox">
+        <title>DateTextBox</title>
+
+        <para>
+            DateTextBox establece un calendario desplegable (drop-down) para 
+            seleccionar una fecha, así como validación y formateo de fechas del 
+            lado del clente.
+        </para>
+
+        <para>
+            Internamente, DateTextBox deriva de <link
+                linkend="zend.dojo.form.elements.validationTextBox">ValidationTextBox</link>
+            y <link linkend="zend.dojo.form.elements.textBox">TextBox</link>;
+            todos los métodos disponibles a esas clases están disponibles. 
+            Además, los siguientes métodos pueden utilizarse para establecer 
+            restricciones individuales:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                <code>setAmPm($flag)</code> y <code>getAmPm()</code>: Cuándo 
+                usar o no los strings AM/PM en los fortmatos de horas.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setStrict($flag)</code> y <code>getStrict()</code>:
+                Cuándo usar o no el matching para una expresión regular estricta 
+                al validar la entrada. Si es falso, que es el valor por defecto, 
+                será indulgente sobre espacios en blanco y algunas abreviaturas.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setLocale($locale)</code> y <code>getLocale()</code>:
+                Establece y recupera la localidad a utilizar con este elemento 
+                específico.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setDatePattern($pattern)</code> y
+                <code>getDatePattern()</code>: provee y recupera el <ulink
+                    url="http://www.unicode.org/reports/tr35/#Date_Format_Patterns"> patrón
+                    de formato de fechas unicode</ulink> para el formateo de 
+                    fechas.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setFormatLength($formatLength)</code> y
+                <code>getFormatLength()</code>: proporciona y recupera la 
+                longitud del tipo de formato a usar; debe ser uno de los 
+                siguientes: "long", "short", "medium" o "full".
+            </para></listitem>
+
+            <listitem><para>
+                <code>setSelector($selector)</code> y
+                <code>getSelector()</code>: proporciona y recupera el estilo del 
+                selector; debe ser "date" o "time".
+            </para></listitem>
+        </itemizedlist>
+
+        <example id="zend.dojo.form.elements.dateTextBox.example">
+            <title>Ejemplo de Uso del Elemento DateTextBox dijit</title>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'DateTextBox',
+    'foo',
+    array(
+        'label'          => 'Date:',
+        'required'       => true,
+        'invalidMessage' => 'Invalid date specified.',
+        'formatLength'   => 'long',
+    )
+);
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.editor">
+        <title>Editor</title>
+
+        <para>
+            Editor proporciona un editor WYSIWYG que puede ser utilizado tanto 
+            para crear como para editar contenidos HTML ricos. 
+            dijit.Editor es pluggable y podrá ampliarse con plugins 
+            personalizados si lo desea; para más detalles vea en 
+            <ulink url="http://dojotoolkit.org/book/dojo-book-0-9/part-2-dijit/advanced-editing-and-display/editor-rich-text">  
+            la documentación de dijit.Editor</ulink>.
+        </para>
+
+        <para>
+            El elemento form de Editor proporciona un número de accessors y 
+            mutators para manipular diversos parámetros dijit, tal como sigue:
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    <emphasis>captureEvents</emphasis> son eventos que se 
+                    conectan al área de edición en si. 
+                    Los siguientes accessors y mutators están disponibles para 
+                    manipular la captura de eventos:
+                </para>
+
+                <itemizedlist>
+                    <listitem><para><code>addCaptureEvent($event)</code></para></listitem>
+                    <listitem><para><code>addCaptureEvents(array $events)</code></para></listitem>
+                    <listitem><para><code>setCaptureEvents(array $events)</code></para></listitem>
+                    <listitem><para><code>getCaptureEvents()</code></para></listitem>
+                    <listitem><para><code>hasCaptureEvent($event)</code></para></listitem>
+                    <listitem><para><code>removeCaptureEvent($event)</code></para></listitem>
+                    <listitem><para><code>clearCaptureEvents()</code></para></listitem>
+                </itemizedlist>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>events</emphasis> son eventos DOM estándar, como 
+                    onClick, onKeyup, etc. Los siguientes accessors y mutators 
+                    están disponibles para manipular eventos:
+                </para>
+
+                <itemizedlist>
+                    <listitem><para><code>addEvent($event)</code></para></listitem>
+                    <listitem><para><code>addEvents(array $events)</code></para></listitem>
+                    <listitem><para><code>setEvents(array $events)</code></para></listitem>
+                    <listitem><para><code>getEvents()</code></para></listitem>
+                    <listitem><para><code>hasEvent($event)</code></para></listitem>
+                    <listitem><para><code>removeEvent($event)</code></para></listitem>
+                    <listitem><para><code>clearEvents()</code></para></listitem>
+                </itemizedlist>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>plugins</emphasis> añaden funcionalidad al Editor 
+                    -- herramientas adicionales para la barra de herramientas, 
+                    estilos adicionales a permitir, etc. 
+                    Los siguientes accessors y mutators están disponibles para 
+                    manipular plugins:
+                </para>
+
+                <itemizedlist>
+                    <listitem><para><code>addPlugin($plugin)</code></para></listitem>
+                    <listitem><para><code>addPlugins(array $plugins)</code></para></listitem>
+                    <listitem><para><code>setPlugins(array $plugins)</code></para></listitem>
+                    <listitem><para><code>getPlugins()</code></para></listitem>
+                    <listitem><para><code>hasPlugin($plugin)</code></para></listitem>
+                    <listitem><para><code>removePlugin($plugin)</code></para></listitem>
+                    <listitem><para><code>clearPlugins()</code></para></listitem>
+                </itemizedlist>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>editActionInterval</emphasis> se utiliza para 
+                    agrupar eventos para deshacer operaciones. Por defecto, 
+                    este valor es de 3 segundos. El método 
+                    <code>setEditActionInterval($interval)</code> puede ser 
+                    usado para establecer el valor, mientras que 
+                    <code>getEditActionInterval()</code> lo recuperará.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>focusOnLoad</emphasis> se utiliza para determinar 
+                    si este editor en particular recibirá atención cuando la página 
+                    se haya cargado. Por defecto, esto es falso. El método
+                    <code>setFocusOnLoad($flag)</code> puede usarse para 
+                    establecer el valor, mientras que <code>getFocusOnLoad()</code>
+                    lo recuperará.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>height</emphasis> especifica la altura del editor; 
+                    por defecto, es de 300px. El método 
+                    <code>setHeight($height)</code> puede ser utilizado para 
+                    establecer el valor, mientras que <code>getHeight()</code> 
+                    lo recupera.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>inheritWidth</emphasis> se utiliza para determinar 
+                    si el editor utilizará el ancho del contenedor padre o 
+                    simplemente toma por defecto el 100% del ancho. 
+                    Por defecto, esto es falso (es decir, llenará el ancho de la 
+                    ventana). El método <code>setInheritWidth($flag)</code> 
+                    puede ser utilizado para establecer el valor, mientras que 
+                    <code>getInheritWidth()</code> lo recuperará.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>minHeight</emphasis> indica la altura mínima del 
+                    editor; por defecto, es de 1em. El método 
+                    <code>setMinHeight($height)</code> puede ser utilizado para 
+                    establecer el valor, mientras que <code>getMinHeight()</code> 
+                    lo recuperará.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>styleSheets</emphasis> indica qué otras hojas de 
+                    estilo CSS deberían ser utilizadas para incidir sobre la 
+                    pantalla del Editor. Por defecto, ninguna está registrada, 
+                    y hereda la página de estilos. Los siguientes accessors 
+                    y mutators están disponibles para manipular al editor de 
+                    hojas de estilo (stylesheets):
+                </para>
+
+                <itemizedlist>
+                    <listitem><para><code>addStyleSheet($styleSheet)</code></para></listitem>
+                    <listitem><para><code>addStyleSheets(array $styleSheets)</code></para></listitem>
+                    <listitem><para><code>setStyleSheets(array $styleSheets)</code></para></listitem>
+                    <listitem><para><code>getStyleSheets()</code></para></listitem>
+                    <listitem><para><code>hasStyleSheet($styleSheet)</code></para></listitem>
+                    <listitem><para><code>removeStyleSheet($styleSheet)</code></para></listitem>
+                    <listitem><para><code>clearStyleSheets()</code></para></listitem>
+                </itemizedlist>
+            </listitem>
+        </itemizedlist>
+
+        <example id="zend.dojo.form.elements.editor.example">
+            <title>Ejemplo de Uso del Elemento Editor dijit</title>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement('editor', 'content', array(
+    'plugins'            => array('undo', '|', 'bold', 'italic'),
+    'editActionInterval' => 2,
+    'focusOnLoad'        => true,
+    'height'             => '250px',
+    'inheritWidth'       => true,
+    'styleSheets'        => array('/js/custom/editor.css'),
+));]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.horizontalSlider">
+        <title>HorizontalSlider</title>
+
+        <para>
+            HorizontalSlider proporciona un widget deslizador de UI para 
+            seleccionar un valor numérico dentro de un rango. 
+            Internamente, establece el valor de un elemento oculto que es 
+            enviado por el formulario.
+        </para>
+
+        <para>
+            HorizontalSlider proviene del elemento abstracto <link
+                linkend="zend.dojo.form.elements.slider">Slider dijit</link>. 
+            Además, tiene una variedad de métodos de ajuste y configuración 
+            de reglas deslizantes y etiquetas para esas reglas.
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    <code>setTopDecorationDijit($dijit)</code> y
+                    <code>setBottomDecorationDijit($dijit)</code>: establecen el 
+                    nombre de la dijit a utilizar bien para la parte superior o 
+                    inferior de la barra deslizante. 
+                    Esto no debería incluir el prefijo "dijit.form.", 
+                    sino sólo el último nombre -- "HorizontalRule" o 
+                    "HorizontalRuleLabels".
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <code>setTopDecorationContainer($container)</code> y
+                    <code>setBottomDecorationContainer($container)</code>:
+                    especifican el nombre a utilizar para el elemento 
+                    contenedor de las reglas; por ejemplo 'Toprule', 
+                    'topContainer', etc.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <code>setTopDecorationLabels(array $labels)</code> y
+                    <code>setBottomDecorationLabels(array $labels)</code>: 
+                    establecen las etiquetas a usar por uno de los tipos 
+                    RuleLabels dijit. Debe ser un array indexado; especificar un 
+                    único espacio vacío para saltar a la posición de una  
+                    determinada etiqueta (como ser al comienzo o al final).
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <code>setTopDecorationParams(array $params)</code> y
+                    <code>setBottomDecorationParams(array $params)</code>:
+                    parámetros dijit para utilizar al configurar la Regla o 
+                    RuleLabels dijit.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <code>setTopDecorationAttribs(array $attribs)</code> y
+                    <code>setBottomDecorationAttribs(array $attribs)</code>:
+                    atributos HTML para especificar una Regla dada o el 
+                    elemento contenedor de HTML RuleLabels.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <code>getTopDecoration()</code> y
+                    <code>getBottomDecoration()</code>: recuperar todos los 
+                    metadatos para una determinada Regla o definición de 
+                    RuleLabels, tal como han sido provistos por los mutators 
+                    anteriores.
+                </para>
+            </listitem>
+        </itemizedlist>
+
+        <example id="zend.dojo.form.elements.horizontalSlider.example">
+            <title>Ejemplo de Uso del Elemento HorizontalSlider dijit</title>
+
+            <para>
+                Lo siguiente creará un deslizador horizontal de selección con 
+                valores enteros que van desde -10 a 10. La parte superior tendrá 
+                etiquetas en las marcas del 20%, 40%, 60%, y 80%. 
+                La parte inferior será una regla con marcas en el 0, 50%, y 100%. 
+                Cada vez que se cambie el valor, el elemento oculto almacenará  
+                el valor actualizado.
+            </para>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'HorizontalSlider',
+    'horizontal',
+    array(
+        'label'                     => 'HorizontalSlider',
+        'value'                     => 5,
+        'minimum'                   => -10,
+        'maximum'                   => 10,
+        'discreteValues'            => 11,
+        'intermediateChanges'       => true,
+        'showButtons'               => true,
+        'topDecorationDijit'        => 'HorizontalRuleLabels',
+        'topDecorationContainer'    => 'topContainer',
+        'topDecorationLabels'       => array(
+                ' ',
+                '20%',
+                '40%',
+                '60%',
+                '80%',
+                ' ',
+        ),
+        'topDecorationParams'      => array(
+            'container' => array(
+                'style' => 'height:1.2em; font-size=75%;color:gray;',
+            ),
+            'list' => array(
+                'style' => 'height:1em; font-size=75%;color:gray;',
+            ),
+        ),
+        'bottomDecorationDijit'     => 'HorizontalRule',
+        'bottomDecorationContainer' => 'bottomContainer',
+        'bottomDecorationLabels'    => array(
+                '0%',
+                '50%',
+                '100%',
+        ),
+        'bottomDecorationParams'   => array(
+            'list' => array(
+                'style' => 'height:1em; font-size=75%;color:gray;',
+            ),
+        ),
+    )
+);
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.numberSpinner">
+        <title>NumberSpinner</title>
+
+        <para>
+            Un número spinner es un elemento de texto para introducir valores 
+            numéricos; también incluye elementos de incremento y decremento 
+            del valor por una cantidad fija.
+        </para>
+
+        <para>
+            Se encuentran disponibles los siguientes métodos:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                <code>setDefaultTimeout($timeout)</code> y
+                <code>getDefaultTimeout()</code>: establece y recupera el 
+                tiempo de espera predeterminado en milisegundos, entre cuando 
+                el botón se mantiene presionado y cambia el valor.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setTimeoutChangeRate($rate)</code> y
+                <code>getTimeoutChangeRate()</code>: establece y recupera la 
+                tasa en milisegundos, en la que se harán cambios cuando un botón 
+                se mantiene presionado.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setLargeDelta($delta)</code> y
+                <code>getLargeDelta()</code>: establece y recupera la cantidad  
+                en la que el valor numérico debería cambiar cuando un botón se 
+                mantiene presionado.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setSmallDelta($delta)</code> y
+                <code>getSmallDelta()</code>: establece y recupera el delta con                
+                la que el número debería cambiar cuando se pulsa un botón una vez.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setIntermediateChanges($flag)</code> y
+                <code>getIntermediateChanges()</code>: establece y recupera el 
+                flag que indica si debe o no ser mostrado cada cambio de valor 
+                cuando un botón se mantiene presionado.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setRangeMessage($message)</code> y
+                <code>getRangeMessage()</code>: establece y recupera el mensaje 
+                indicando el rango de valores disponibles.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setMin($value)</code> y <code>getMin()</code>: 
+                establece y recupera el valor mínimo posible.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setMax($value)</code> y <code>getMax()</code>: 
+                establece y recupera el valor máximo posible.
+            </para></listitem>
+        </itemizedlist>
+
+        <example id="zend.dojo.form.elements.numberSpinner.example">
+            <title>Ejemplo de Uso del Elemento NumberSpinner dijit</title>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'NumberSpinner',
+    'foo',
+    array(
+        'value'             => '7',
+        'label'             => 'NumberSpinner',
+        'smallDelta'        => 5,
+        'largeDelta'        => 25,
+        'defaultTimeout'    => 500,
+        'timeoutChangeRate' => 100,
+        'min'               => 9,
+        'max'               => 1550,
+        'places'            => 0,
+        'maxlength'         => 20,
+    )
+);
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.numberTextBox">
+        <title>NumberTextBox</title>
+
+        <para>
+            Un cuadro de texto numérico es un elemento de texto de introducción 
+            de valores numéricos; a diferencia de NumberSpinner, se introducen 
+            manualmente. Se pueden proporcionar validaciones y restricciones para  
+            garantizar que el número permanece en un rango o formato particular.
+        </para>
+
+        <para>
+            Internmente, NumberTextBox proviene de <link
+                linkend="zend.dojo.form.elements.validationTextBox">ValidationTextBox</link>
+            y <link linkend="zend.dojo.form.elements.textBox">TextBox</link>;
+            todos los métodos disponibles a esas clases están disponibles. 
+            Además, los siguientes métodos pueden utilizarse para establecer 
+            restricciones individuales:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                <code>setLocale($locale)</code> y <code>getLocale()</code>:
+                especifica y recupera un "locale" determinado o alternativo para 
+                usar con este dijit.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setPattern($pattern)</code> y
+                <code>getPattern()</code>: establece y recupera un <ulink
+                    url="http://www.unicode.org/reports/tr35/#Number_Format_Patterns"> 
+                    patrón de formato numérico </ulink> a usar en el formateo de 
+                    números.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setType($type)</code> y <code>getType()</code>: 
+                establece y recupera el tipo de formato numérico a utilizar 
+                (deberán ser uno de 'decimal', 'percent', o 'currency').
+            </para></listitem>
+
+            <listitem><para>
+                <code>setPlaces($places)</code> y <code>getPlaces()</code>:
+                establece y recupera el número de decimales que soportará.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setStrict($flag)</code> y <code>getStrict()</code>: 
+                establece y recupera el valor estricto del flag, que indica 
+                cuánta indulgencia es permitida en relación con espacios en 
+                blanco y con caracteres no numéricos.
+            </para></listitem>
+        </itemizedlist>
+
+        <example id="zend.dojo.form.elements.numberTextBox.example">
+            <title>Ejemplo de Uso del Elemento NumberTextBox dijit</title>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'NumberTextBox',
+    'elevation',
+    array(
+        'label'          => 'NumberTextBox',
+        'required'       => true,
+        'invalidMessage' => 'Invalid elevation.',
+        'places'         => 0,
+        'constraints'    => array(
+            'min'    => -20000,
+            'max'    => 20000,
+        ),
+    )
+);
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.passwordTextBox">
+        <title>PasswordTextBox</title>
+
+        <para>
+            PasswordTextBox es simplemente un ValidationTextBox que está ligado 
+            a una contraseña; su único objetivo es permitir la entrada de texto 
+            de contraseñas de dijit que también proporciona validación del 
+            lado del cliente.
+        </para>
+
+        <para>
+            Internmente, NumberTextBox proviene de <link
+                linkend="zend.dojo.form.elements.validationTextBox">ValidationTextBox</link>
+            y <link linkend="zend.dojo.form.elements.textBox">TextBox</link>;
+            todos los métodos disponibles a esas clases están disponibles.
+        </para>
+
+        <example id="zend.dojo.form.elements.passwordTextBox.example">
+            <title>Ejemplo de Uso del Elemento PasswordTextBox dijit</title>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'PasswordTextBox',
+    'password',
+    array(
+        'label'          => 'Password',
+        'required'       => true,
+        'trim'           => true,
+        'lowercase'      => true,
+        'regExp'         => '^[a-z0-9]{6,}$',
+        'invalidMessage' => 'Invalid password; ' .
+                            'must be at least 6 alphanumeric characters',
+    )
+);
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.radioButton">
+        <title>RadioButton</title>
+
+        <para>
+            RadioButton envuelve a elementos standard de entrada tipo radio para 
+            brindar un look-and-feel consistente con otros dojo dijits.
+        </para>
+
+        <para>
+            RadioButton se extiende desde DijitMulti, que le permite especificar 
+            la selección de opciones vía los métodos 
+            <code>setMultiOptions()</code> y <code>setMultiOption()</code>.
+        </para>
+
+        <para>
+            Por defecto, este elemento registra un validador <code>InArray</code> 
+            que valida contra las calves del array de las opciones registradas. 
+            Puede desactivar este comportamiento ya sea llamando a 
+            <code>setRegisterInArrayValidator(false)</code>, o pasando un valor 
+            falso a la clave de configuración <code>registerInArrayValidator</code>.
+        </para>
+
+        <example id="zend.dojo.form.elements.radioButton.example">
+            <title>Ejemplo de Uso del Elemento RadioButton dijit</title>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'RadioButton',
+    'foo',
+    array(
+        'label' => 'RadioButton',
+        'multiOptions'  => array(
+            'foo' => 'Foo',
+            'bar' => 'Bar',
+            'baz' => 'Baz',
+        ),
+        'value' => 'bar',
+    )
+);
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.simpletextarea">
+        <title>SimpleTextarea</title>
+
+        <para>
+            SimpleTextarea actúa principalmente como un textarea estándar de HTML. 
+            Sin embargo, no permite establecer filas ni columnas. 
+            En su lugar, el ancho de textarea debe especificarse utilizando 
+            medidas CSS estándar. A diferencia de Textarea, esta no aumentará 
+            automáticamente.
+        </para>
+
+        <example id="zend.dojo.form.elements.simpletextarea.example">
+            <title>Ejemplo de Uso del Elemento SimpleTextarea dijit</title>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'SimpleTextarea',
+    'simpletextarea',
+    array(
+        'label'    => 'SimpleTextarea',
+        'required' => true,
+        'style'    => 'width: 80em; height: 25em;',
+    )
+);
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.slider">
+        <title>Elemento abstracto Slider</title>
+
+        <para>
+            Slider es un elemento abstracto que proviene de ambos  
+            <link linkend="zend.dojo.form.elements.horizontalSlider">HorizontalSlider</link>
+            y
+            <link linkend="zend.dojo.form.elements.verticalSlider">VerticalSlider</link>. 
+            Expone una serie de métodos comunes para configurar sus deslizadores, 
+            incluyendo a:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                <code>setClickSelect($flag)</code> y
+                <code>getClickSelect()</code>: establece y recupera el flag 
+                que indica cuando al presionar el botón deslizante cambia o no 
+                el valor.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setIntermediateChanges($flag)</code> y
+                <code>getIntermediateChanges()</code>: establece y recupera el 
+                flag que indica si dijit enviará o no una notificación sobre 
+                cada evento de cambio del deslizador.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setShowButtons($flag)</code> y
+                <code>getShowButtons()</code>: establece y recupera el flag que  
+                indica si los botones de uno u otro extremo se mostrarán o no; 
+                si es así, el usuario puede hacer clic sobre éstos para cambiar 
+                el valor de la barra deslizante.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setDiscreteValues($value)</code> y
+                <code>getDiscreteValues()</code>: establece y recupera el número 
+                de valores discretos representados por el deslizador.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setMaximum($value)</code> y <code>getMaximum()</code>:
+                establece y recupera el valor máximo del deslizador.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setMinimum($value)</code> y <code>getMinimum()</code>:
+                establece y recupera el valor mínimo del deslizador.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setPageIncrement($value)</code> y
+                <code>getPageIncrement()</code>: establece la cantidad en que  
+                cambiará el deslizador por eventos del teclado.
+        </itemizedlist>
+
+        <para>
+            Ejemplos de uso provistos con cada clase extendida concretamente.
+        </para>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.submitButton">
+        <title>SubmitButton</title>
+
+        <para>
+            Si bien no hay Dijit llamado SubmitButton, incluimos uno aquí para 
+            proporcionar un botón dijit capaz de enviar un formulario sin que se 
+            exijan ligaduras con javascript. 
+            Funciona exactamente igual que el  
+            <link linkend="zend.dojo.form.elements.button">Button dijit</link>.
+        </para>
+
+        <example id="zend.dojo.form.elements.submitButton.example">
+            <title>Ejemplo de Uso del Elemento SubmitButton dijit</title>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'SubmitButton',
+    'foo',
+    array(
+        'required'   => false,
+        'ignore'     => true,
+        'label'      => 'Submit Button!',
+    )
+);
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.textBox">
+        <title>TextBox</title>
+
+        <para>
+            Textbox se incluyó principalmente para proporcionar una entrada de 
+            texto con apariencia coherente y con el look-and-feel de los demás dijits. 
+            Sin embargo, también incluye algunas pequeñas capacidades de 
+            filtrado y validación, representadas en los métodos siguientes:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                <code>setLowercase($flag)</code> y
+                <code>getLowercase()</code>: establece y recupera el flag que 
+                indica si la entrada debe o no ser presentada en minúsculas.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setPropercase($flag)</code> y
+                <code>getPropercase()</code>: establece y recupera el flag que 
+                indica si la entrada debe ser o no ser presentada como Proper 
+                Case.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setUppercase($flag)</code> y <code>getUppercase()</code>: 
+                establece y recupera el flag que indica si la entrada debe ser 
+                presentada como mayúsculas (UPPERCASE).
+            </para></listitem>
+
+            <listitem><para>
+                <code>setTrim($flag)</code> y <code>getTrim()</code>: 
+                establece y recupera el flag que indica si los espacios al 
+                comienzo o al final deben ser eliminados o no.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setMaxLength($length)</code> y
+                <code>getMaxLength()</code>: establece y recupera la longitud 
+                máxima del input.
+            </para></listitem>
+        </itemizedlist>
+
+        <example id="zend.dojo.form.elements.textBox.example">
+            <title>Ejemplo de Uso del Elemento TextBox dijit</title>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'TextBox',
+    'foo',
+    array(
+        'value'      => 'some text',
+        'label'      => 'TextBox',
+        'trim'       => true,
+        'propercase' => true,
+    )
+);
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.textarea">
+        <title>Textarea</title>
+
+        <para>
+            Textarea actúa principalmente como un textarea estándar de HTML. 
+            Sin embargo, no permite establecer filas y columnas. 
+            En su lugar, el ancho de la textarea debe especificarse utilizando 
+            medidas CSS estándar; las filas debe omitirse totalmente. 
+            Luego, la textarea crecerá verticalmente tanto como texto se añada 
+            a ella.
+        </para>
+
+        <example id="zend.dojo.form.elements.textarea.example">
+            <title>Ejemplo de Uso del Elemento Textarea dijit</title>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'Textarea',
+    'textarea',
+    array(
+        'label'    => 'Textarea',
+        'required' => true,
+        'style'    => 'width: 200px;',
+    )
+);
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.timeTextBox">
+        <title>TimeTextBox</title>
+
+        <para>
+            TimeTextBox es una entrada de texto que proporciona una lista 
+            desplegable (drop-down) para seleccionar un tiempo (fecha y hora). 
+            La lista desplegable, puede ser configurada para mostrar una cierta 
+            ventana de tiempo, con incrementos especificados.
+        </para>
+
+        <para>
+            Internamente, TimeTextBox proviene de <link
+                linkend="zend.dojo.form.elements.dateTextBox">DateTextBox</link>,
+            <link
+                linkend="zend.dojo.form.elements.validationTextBox">ValidationTextBox</link>
+            y <link linkend="zend.dojo.form.elements.textBox">TextBox</link>;
+            todos los métodos disponibles a esas clases están disponibles. 
+            Además, los siguientes métodos pueden utilizarse para establecer 
+            restricciones individuales:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                <code>setTimePattern($pattern)</code> y
+                <code>getTimePattern()</code>: establece y recupera el <ulink
+                    url="http://www.unicode.org/reports/tr35/#Date_Format_Patterns">patrón 
+                    de formato de fecha y hora unicode</ulink> para el formato 
+                    correspondiente.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setClickableIncrement($format)</code> y
+                <code>getClickableIncrement()</code>: establece y recupera el 
+                string <ulink
+                    url="http://en.wikipedia.org/wiki/ISO_8601">ISO-8601</ulink>
+                representando la cantidad de tiempo a incrementar cada vez que 
+                se recolecta un elemento clickable.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setVisibleIncrement($format)</code> y
+                <code>getVisibleIncrement()</code>: establece y recupera el 
+                incremento visible en el selector de tiempo; debe seguir los 
+                formatos ISO-8601.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setVisibleRange($format)</code> y
+                <code>getVisibleRange()</code>: establece y recupera el intervalo 
+                de tiempo visible en el selector de tiempo en cualquier momento; 
+                debe seguir los formatos ISO-8601.
+            </para></listitem>
+        </itemizedlist>
+
+        <example id="zend.dojo.form.elements.timeTextBox.example">
+            <title>Ejemplo de Uso del Elemento TimeTextBox dijit</title>
+
+            <para>
+                Lo siguiente creará un TimeTextBox que muestra 2 horas a la vez, 
+                con incrementos de 10 minutos.
+            </para>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'TimeTextBox',
+    'foo',
+    array(
+        'label'              => 'TimeTextBox',
+        'required'           => true,
+        'visibleRange'       => 'T04:00:00',
+        'visibleIncrement'   => 'T00:10:00',
+        'clickableIncrement' => 'T00:10:00',
+    )
+);
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.validationTextBox">
+        <title>ValidationTextBox</title>
+
+        <para>
+            ValidationTextBox ofrece la posibilidad de añadir validaciones y 
+            limitaciones a una entrada de texto. Internamente, proviene de
+            <link linkend="zend.dojo.form.elements.textBox">TextBox</link>, 
+            y añade los siguientes accessors y mutators para manejar 
+            parámetros dijit:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                <code>setInvalidMessage($message)</code> y
+                <code>getInvalidMessage()</code>: establece y recupera el mensaje 
+                de tooltip para mostrar cuando el valor no se validó.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setPromptMessage($message)</code> y
+                <code>getPromptMessage()</code>: establece y recupera el mensaje 
+                de tooltip a mostrar para el uso del elemento.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setRegExp($regexp)</code> y <code>getRegExp()</code>:
+                establece y recupera la expresión regular a utilizar para validar 
+                el elemento. La expresión regular no necesita límites 
+                (a diferencia de la familia de funciones preg*, de PHP).
+            </para></listitem>
+
+            <listitem><para>
+                <code>setConstraint($key, $value)</code> y
+                <code>getConstraint($key)</code>: establece y recupera 
+                restricciones adicionales para utilizar al validar el elemento; 
+                se utiliza principalmente con subclases. Las restricciones son 
+                almacenados en la clave 'constraints' de los parámetros dijit.
+            </para></listitem>
+
+            <listitem><para>
+                <code>setConstraints(array $constraints)</code> y
+                <code>getConstraints()</code>: establece y recupera las 
+                restricciones para utilizar al validar el elemento; se utiliza 
+                principalmente con subclases.
+            </para></listitem>
+
+            <listitem><para>
+                <code>hasConstraint($key)</code>: prueba si una restricción 
+                dada existe.
+            </para></listitem>
+
+            <listitem><para>
+                <code>removeConstraint($key)</code> y
+                <code>clearConstraints()</code>: elimina una restricción 
+                individual o todas las restricciones para el elemento.
+            </para></listitem>
+        </itemizedlist>
+
+        <example id="zend.dojo.form.elements.validationTextBox.example">
+            <title>Ejemplo de Uso del Elemento ValidationTextBox dijit</title>
+
+            <para>
+                Lo siguiente creará un ValidationTextBox que requiere un solo 
+                string compuesto exclusivamente por caracteres de palabra 
+                (es decir, sin espacios, la mayor parte de la puntuación es inválida).
+            </para>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'ValidationTextBox',
+    'foo',
+    array(
+        'label'          => 'ValidationTextBox',
+        'required'       => true,
+        'regExp'         => '[\w]+',
+        'invalidMessage' => 'Invalid non-space text.',
+    )
+);
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.form.elements.verticalSlider">
+        <title>VerticalSlider</title>
+
+        <para>
+            VerticalSlider es el hermano de <link
+                linkend="zend.dojo.form.elements.horizontalSlider">HorizontalSlider</link>,
+            y opera en todos los sentidos como ese elemento. 
+            La única diferencia real es que los métodos 'top*' y 'bottom*' son 
+            sustituidos por 'left*' y 'right*', y en lugar de utilizar 
+            HorizontalRule y HorizontalRuleLabels, debe usarse VerticalRule y 
+            VerticalRuleLabels.
+        </para>
+
+        <example id="zend.dojo.form.elements.verticalSlider.example">
+            <title>Ejemplo de Uso del Elemento VerticalSlider dijit</title>
+
+            <para>
+                Lo siguiente creará una selección deslizante vertical con valores 
+                enteros desde -10 a 10. La izquierda tendrá etiquetas en las 
+                marcas correspondientes al 20%, 40%, 60%, y 80%. El derecho  
+                tiene reglas en un 0, 50%, y 100%. Cada vez que se cambie el 
+                valor, se actualizará el elemento oculto que almacena el valor.
+            </para>
+
+            <programlisting role="php"><![CDATA[
+$form->addElement(
+    'VerticalSlider',
+    'foo',
+    array(
+        'label'                    => 'VerticalSlider',
+        'value'                    => 5,
+        'style'                    => 'height: 200px; width: 3em;',
+        'minimum'                  => -10,
+        'maximum'                  => 10,
+        'discreteValues'           => 11,
+        'intermediateChanges'      => true,
+        'showButtons'              => true,
+        'leftDecorationDijit'      => 'VerticalRuleLabels',
+        'leftDecorationContainer'  => 'leftContainer',
+        'leftDecorationLabels'     => array(
+                ' ',
+                '20%',
+                '40%',
+                '60%',
+                '80%',
+                ' ',
+        ),
+        'rightDecorationDijit' => 'VerticalRule',
+        'rightDecorationContainer' => 'rightContainer',
+        'rightDecorationLabels' => array(
+                '0%',
+                '50%',
+                '100%',
+        ),
+    )
+);
+]]></programlisting>
+        </example>
+    </sect3>
+</sect2>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 418 - 0
documentation/manual/es/module_specs/Zend_Dojo-Form-Examples.xml

@@ -0,0 +1,418 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect2 id="zend.dojo.form.examples">
+    <title>Ejemplos de Dojo Form</title>
+
+    <example id="zend.dojo.form.examples.dojoform">
+        <title>Usando <classname>Zend_Dojo_Form</classname></title>
+
+        <para>
+            La forma más fácil de utilizar Dojo con <classname>Zend_Form</classname> 
+            es utilizar <classname>Zend_Dojo_Form</classname>, ya sea mediante 
+            el uso directo o mediante su extensión. 
+            Este ejemplo muestra la extensión de <classname>Zend_Dojo_Form</classname>, 
+            y muestra el uso de todos los elementos dijit. 
+            Crea cuatro sub forms, y decora el form para utilizar un TabContainer, 
+            mostrando cada sub form en su propia pestaña.
+        </para>
+
+        <programlisting role="php"><![CDATA[
+class My_Form_Test extends Zend_Dojo_Form
+{
+    /**
+     * Opciones para usar con elementos select
+     */
+    protected $_selectOptions = array(
+        'red'    => 'Rouge',
+        'blue'   => 'Bleu',
+        'white'  => 'Blanc',
+        'orange' => 'Orange',
+        'black'  => 'Noir',
+        'green'  => 'Vert',
+    );
+
+    /**
+     * Inicialización del Formn
+     *
+     * @return void
+     */
+    public function init()
+    {
+        $this->setMethod('post');
+        $this->setAttribs(array(
+            'name'  => 'masterForm',
+        ));
+        $this->setDecorators(array(
+            'FormElements',
+            array('TabContainer', array(
+                'id' => 'tabContainer',
+                'style' => 'width: 600px; height: 500px;',
+                'dijitParams' => array(
+                    'tabPosition' => 'top'
+                ),
+            )),
+            'DijitForm',
+        ));
+        $textForm = new Zend_Dojo_Form_SubForm();
+        $textForm->setAttribs(array(
+            'name'   => 'textboxtab',
+            'legend' => 'Text Elements',
+            'dijitParams' => array(
+                'title' => 'Text Elements',
+            ),
+        ));
+        $textForm->addElement(
+                'TextBox',
+                'textbox',
+                array(
+                    'value'      => 'some text',
+                    'label'      => 'TextBox',
+                    'trim'       => true,
+                    'propercase' => true,
+                )
+            )
+            ->addElement(
+                'DateTextBox',
+                'datebox',
+                array(
+                    'value' => '2008-07-05',
+                    'label' => 'DateTextBox',
+                    'required'  => true,
+                )
+            )
+            ->addElement(
+                'TimeTextBox',
+                'timebox',
+                array(
+                    'label' => 'TimeTextBox',
+                    'required'  => true,
+                )
+            )
+            ->addElement(
+                'CurrencyTextBox',
+                'currencybox',
+                array(
+                    'label' => 'CurrencyTextBox',
+                    'required'  => true,
+                    // 'currency' => 'USD',
+                    'invalidMessage' => 'Invalid amount. ' .
+                                        'Include dollar sign, commas, ' .
+                                        'and cents.',
+                    // 'fractional' => true,
+                    // 'symbol' => 'USD',
+                    // 'type' => 'currency',
+                )
+            )
+            ->addElement(
+                'NumberTextBox',
+                'numberbox',
+                array(
+                    'label' => 'NumberTextBox',
+                    'required'  => true,
+                    'invalidMessage' => 'Invalid elevation.',
+                    'constraints' => array(
+                        'min' => -20000,
+                        'max' => 20000,
+                        'places' => 0,
+                    )
+                )
+            )
+            ->addElement(
+                'ValidationTextBox',
+                'validationbox',
+                array(
+                    'label' => 'ValidationTextBox',
+                    'required'  => true,
+                    'regExp' => '[\w]+',
+                    'invalidMessage' => 'Invalid non-space text.',
+                )
+            )
+            ->addElement(
+                'Textarea',
+                'textarea',
+                array(
+                    'label'    => 'Textarea',
+                    'required' => true,
+                    'style'    => 'width: 200px;',
+                )
+            );
+        $editorForm = new Zend_Dojo_Form_SubForm();
+        $editorForm->setAttribs(array(
+            'name'   => 'editortab',
+            'legend' => 'Editor',
+            'dijitParams' => array(
+                'title' => 'Editor'
+            ),
+        ))
+        $editorForm->addElement(
+            'Editor',
+            'wysiwyg',
+            array(
+                'label'        => 'Editor',
+                'inheritWidth' => 'true',
+            )
+        );
+
+        $toggleForm = new Zend_Dojo_Form_SubForm();
+        $toggleForm->setAttribs(array(
+            'name'   => 'toggletab',
+            'legend' => 'Toggle Elements',
+        ));
+        $toggleForm->addElement(
+                'NumberSpinner',
+                'ns',
+                array(
+                    'value'             => '7',
+                    'label'             => 'NumberSpinner',
+                    'smallDelta'        => 5,
+                    'largeDelta'        => 25,
+                    'defaultTimeout'    => 1000,
+                    'timeoutChangeRate' => 100,
+                    'min'               => 9,
+                    'max'               => 1550,
+                    'places'            => 0,
+                    'maxlength'         => 20,
+                )
+            )
+            ->addElement(
+                'Button',
+                'dijitButton',
+                array(
+                    'label' => 'Button',
+                )
+            )
+            ->addElement(
+                'CheckBox',
+                'checkbox',
+                array(
+                    'label' => 'CheckBox',
+                    'checkedValue'  => 'foo',
+                    'uncheckedValue'  => 'bar',
+                    'checked' => true,
+                )
+            )
+            ->addElement(
+                'RadioButton',
+                'radiobutton',
+                array(
+                    'label' => 'RadioButton',
+                    'multiOptions'  => array(
+                        'foo' => 'Foo',
+                        'bar' => 'Bar',
+                        'baz' => 'Baz',
+                    ),
+                    'value' => 'bar',
+                )
+            );
+        $selectForm = new Zend_Dojo_Form_SubForm();
+        $selectForm->setAttribs(array(
+            'name'   => 'selecttab',
+            'legend' => 'Select Elements',
+        ));
+        $selectForm->addElement(
+                'ComboBox',
+                'comboboxselect',
+                array(
+                    'label' => 'ComboBox (select)',
+                    'value' => 'blue',
+                    'autocomplete' => false,
+                    'multiOptions' => $this->_selectOptions,
+                )
+            )
+            ->addElement(
+                'ComboBox',
+                'comboboxremote',
+                array(
+                    'label' => 'ComboBox (remoter)',
+                    'storeId' => 'stateStore',
+                    'storeType' => 'dojo.data.ItemFileReadStore',
+                    'storeParams' => array(
+                        'url' => '/js/states.txt',
+                    ),
+                    'dijitParams' => array(
+                        'searchAttr' => 'name',
+                    ),
+                )
+            )
+            ->addElement(
+                'FilteringSelect',
+                'filterselect',
+                array(
+                    'label' => 'FilteringSelect (select)',
+                    'value' => 'blue',
+                    'autocomplete' => false,
+                    'multiOptions' => $this->_selectOptions,
+                )
+            )
+            ->addElement(
+                'FilteringSelect',
+                'filterselectremote',
+                array(
+                    'label' => 'FilteringSelect (remoter)',
+                    'storeId' => 'stateStore',
+                    'storeType' => 'dojo.data.ItemFileReadStore',
+                    'storeParams' => array(
+                        'url' => '/js/states.txt',
+                    ),
+                    'dijitParams' => array(
+                        'searchAttr' => 'name',
+                    ),
+                )
+            );
+        $sliderForm = new Zend_Dojo_Form_SubForm();
+        $sliderForm->setAttribs(array(
+            'name'   => 'slidertab',
+            'legend' => 'Slider Elements',
+        ));
+        $sliderForm->addElement(
+                'HorizontalSlider',
+                'horizontal',
+                array(
+                    'label' => 'HorizontalSlider',
+                    'value' => 5,
+                    'minimum' => -10,
+                    'maximum' => 10,
+                    'discreteValues' => 11,
+                    'intermediateChanges' => true,
+                    'showButtons' => true,
+                    'topDecorationDijit' => 'HorizontalRuleLabels',
+                    'topDecorationContainer' => 'topContainer',
+                    'topDecorationLabels' => array(
+                            ' ',
+                            '20%',
+                            '40%',
+                            '60%',
+                            '80%',
+                            ' ',
+                    ),
+                    'topDecorationParams' => array(
+                        'container' => array(
+                            'style' => 'height:1.2em; ' .
+                                       'font-size=75%;color:gray;',
+                        ),
+                        'list' => array(
+                            'style' => 'height:1em; ' .
+                                       'font-size=75%;color:gray;',
+                        ),
+                    ),
+                    'bottomDecorationDijit' => 'HorizontalRule',
+                    'bottomDecorationContainer' => 'bottomContainer',
+                    'bottomDecorationLabels' => array(
+                            '0%',
+                            '50%',
+                            '100%',
+                    ),
+                    'bottomDecorationParams' => array(
+                        'list' => array(
+                            'style' => 'height:1em; ' .
+                                       'font-size=75%;color:gray;',
+                        ),
+                    ),
+                )
+            )
+            ->addElement(
+                'VerticalSlider',
+                'vertical',
+                array(
+                    'label' => 'VerticalSlider',
+                    'value' => 5,
+                    'style' => 'height: 200px; width: 3em;',
+                    'minimum' => -10,
+                    'maximum' => 10,
+                    'discreteValues' => 11,
+                    'intermediateChanges' => true,
+                    'showButtons' => true,
+                    'leftDecorationDijit' => 'VerticalRuleLabels',
+                    'leftDecorationContainer' => 'leftContainer',
+                    'leftDecorationLabels' => array(
+                            ' ',
+                            '20%',
+                            '40%',
+                            '60%',
+                            '80%',
+                            ' ',
+                    ),
+                    'rightDecorationDijit' => 'VerticalRule',
+                    'rightDecorationContainer' => 'rightContainer',
+                    'rightDecorationLabels' => array(
+                            '0%',
+                            '50%',
+                            '100%',
+                    ),
+                )
+            );
+
+        $this->addSubForm($textForm, 'textboxtab')
+             ->addSubForm($editorForm, 'editortab')
+             ->addSubForm($toggleForm, 'toggletab')
+             ->addSubForm($selectForm, 'selecttab')
+             ->addSubForm($sliderForm, 'slidertab');
+    }
+}
+]]></programlisting>
+    </example>
+
+    <example id="zend.dojo.form.examples.decorating">
+        <title>Modificando un form existente para utilizarlo con Dojo</title>
+
+        <para>
+            Los forms existentes pueden ser modificados para ser utilizados 
+            también por Dojo, usando el método estático 
+            <classname>Zend_Dojo::enableForm()</classname>.
+        </para>
+
+        <para>
+            Este primer ejemplo muestra como decorar una instancia de un form 
+            existente:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$form = new My_Custom_Form();
+Zend_Dojo::enableForm($form);
+$form->addElement(
+'ComboBox',
+'query',
+array(
+    'label'        => 'Color:',
+    'value'        => 'blue',
+    'autocomplete' => false,
+    'multiOptions' => array(
+        'red'    => 'Rouge',
+        'blue'   => 'Bleu',
+        'white'  => 'Blanc',
+        'orange' => 'Orange',
+        'black'  => 'Noir',
+        'green'  => 'Vert',
+    ),
+)
+);
+]]></programlisting>
+
+        <para>
+            Alternativamente, puede hacer un ligero retoque a su form de 
+            inicialización:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+class My_Custom_Form extends Zend_Form
+{
+    public function init()
+    {
+        Zend_Dojo::enableForm($this);
+
+        // ...
+    }
+}
+]]></programlisting>
+
+        <para>
+            Por supuesto, si puede hacerlo... podría y debería simplemente 
+            alterar la clase a heredar de <classname>Zend_Dojo_Form</classname>, 
+            que es una sustitución del drop-in de <classname>Zend_Form</classname> 
+            que ya está habilitada por Dojo.... 
+        </para>
+    </example>
+</sect2>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 112 - 0
documentation/manual/es/module_specs/Zend_Dojo-Form.xml

@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.dojo.form" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <title>Elementos y Decoradores de Dojo Form</title>
+
+    <para>
+        Sobre la base de los ayudantes de vista dijit 
+        <link linkend="zend.dojo.view.dijit"></link>,  
+        la familia de clases <classname>Zend_Dojo_Form</classname> ofrece la 
+        posibilidad de utilizar Dijits nativamente en sus formularios.
+    </para>
+
+    <para>
+        Hay tres opciones para utilizar los elementos de Dojo form con sus 
+        formularios:
+    </para>
+
+    <itemizedlist>
+        <listitem>
+            <para>
+                Use <classname>Zend_Dojo::enableForm()</classname>. Esto le 
+                permitirá añadir recursivamente paths de plugins para 
+                decoradores y elementos de todos los items de forms adjuntos. 
+                Además, el objeto vista será habilitado para Dojo. 
+                Note, sin embargo, que cualquier subformulario que agregue 
+                <emphasis>después</emphasis> de esta llamada también 
+                tendrá que ser pasado mediante 
+                <classname>Zend_Dojo::enableForm()</classname>.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                Utilice las implementaciones específicas de Dojo para formularios y 
+                subformularios, <classname>Zend_Dojo_Form</classname> y
+                <classname>Zend_Dojo_Form_SubForm</classname> respectivamente. 
+                Éstas pueden utilizarse como reemplazantes drop-in para 
+                <classname>Zend_Form</classname> y 
+                <classname>Zend_Form_SubForm</classname>, contener todos los 
+                paths apropiados de los decoradores y elementos, establecer 
+                una clase DisplayGroup por defecto específica, y habilitar la vista
+				para Dojo. 
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                Por último, y lo más tedioso, puede establecer por sí mismo el 
+                path apropiado para el decorador y para el elemento, establecer 
+                por defecto la clase DisplayGroup, y habilitar la vista para Dojo. 
+                Dado que <classname>Zend_Dojo::enableForm()</classname> ya 
+                hizo esto, hay pocas razones para seguir esta vía.
+            </para>
+        </listitem>
+    </itemizedlist>
+
+    <example id="zend.dojo.form.enable">
+        <title>Habilitando Dojo en sus formularios existentes</title>
+
+        <para>
+            "Pero espere", podría decir; "Ya extendí <classname>Zend_Form</classname> 
+            con mi propia clase personalizada de form! ¿Cómo puede habilitarlo para Dojo?"
+        </para>
+
+        <para>
+            En primer lugar, y lo más fácil, simplemente cambie de extender 
+            <classname>Zend_Form</classname> a extender 
+            <classname>Zend_Dojo_Form</classname>, y actualizar todos los 
+            lugares donde se instancie a
+            <classname>Zend_Form_SubForm</classname> para instanciar a
+            <classname>Zend_Dojo_Form_SubForm</classname>.
+        </para>
+
+        <para>
+            Un segundo enfoque es llamar al método <code>init()</code> dentro 
+            de sus forms personalizados 
+            <classname>Zend_Dojo::enableForm()</classname>. Cuando la definición 
+            del formulario está completa, mediante un loop habilite todos los 
+            SubForms de Dojo:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+class My_Form_Custom extends Zend_Form
+{
+    public function init()
+    {
+        // Dojo habilita el form:
+        Zend_Dojo::enableForm($this);
+
+        // ... continuar con la definición del form desde aquí
+
+        // Dojo habilita todos los sub forms:
+        foreach ($this->getSubForms() as $subForm) {
+            Zend_Dojo::enableForm($subForm);
+        }
+    }
+}
+]]></programlisting>
+    </example>
+
+    <para>
+        El uso de los decoradores y elementos específicos de dijit form es como 
+        usar cualquier otro decorador o elemento de formularios.
+    </para>
+
+    <xi:include href="Zend_Dojo-Form-Decorators.xml" />
+    <xi:include href="Zend_Dojo-Form-Elements.xml" />
+    <xi:include href="Zend_Dojo-Form-Examples.xml" />
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 422 - 0
documentation/manual/es/module_specs/Zend_Dojo-View-Dojo.xml

@@ -0,0 +1,422 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect2 id="zend.dojo.view.dojo">
+    <title>dojo() Ayudante de Vista</title>
+
+    <para>
+        El ayudante de vista <code>dojo()</code> está destinado a simplificar 
+        el establecimiento del medio ambiente de Dojo, incluyendo las siguientes 
+        responsabilidades:
+    </para>
+
+    <itemizedlist>
+        <listitem><para>Especificar bien un CDN o un path local para instalar 
+        Dojo.</para></listitem>
+        <listitem><para>
+            Especificando paths a módulos Dojo personalizados.
+        </para></listitem>
+        <listitem><para>
+            Especificando sentencias dojo.require.
+        </para></listitem>
+        <listitem><para>
+            Especificando hojas de estilo dijit a usar.
+        </para></listitem>
+        <listitem><para>
+            Especificando eventos dojo.addOnLoad().
+        </para></listitem>
+    </itemizedlist>
+
+    <para>
+        La implementación del ayudante de vista <code>dojo()</code> es un 
+        ejemplo de implementación de un marcador de posición. 
+        El conjunto de datos en él, persiste entre los objetos vista y puede 
+        ser directamente activado con en "echo" de PHP desde su script.
+    </para>
+
+    <example id="zend.dojo.view.dojo.usage">
+        <title>dojo() Ejemplo de Uso del Ayudante de Vista</title>
+
+        <para>
+            En este ejemplo, asumamos que el desarrollador estará usando Dojo 
+            desde un path local, se necesitarán varios dijits, y se utilizará 
+            el tema de dijit Tundra.
+        </para>
+
+        <para>
+            En muchas páginas, el desarrollador no podrá utilizar Dojo para nada. 
+            Así, vamos a centrarnos primero en un view script donde Dojo es 
+            necesario y luego en el layout script, en donde vamos a configurar 
+            algo del medio ambiente de Dojo y luego lo mostraremos.
+        </para>
+
+        <para>
+            En primer lugar, tenemos que decir nuestro objeto vista que utilice 
+            el path del ayudante de vista de Dojo. Esto puede hacerse en el 
+            arranque o en un plugin de ejecución temprana; simplemente apoderarse 
+            de su objeto vista y ejecutar lo siguiente:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$view->addHelperPath('Zend/Dojo/View/Helper/', 'Zend_Dojo_View_Helper');
+]]></programlisting>
+
+        <para>
+            El paso siguiente, el view script. En este caso, vamos a 
+            especificar que vamos a estar utilizando un FilteringSelect -- 
+            que consumirá un almacén personalizado basado en QueryReadStore, 
+            al que llamamos 'PairedStore' y almacenado en nuestro módulo 
+            'custom'.
+        </para>
+
+        <programlisting role="php"><![CDATA[
+<?php // establecer el data store para FilteringSelect ?>
+<div dojoType="custom.PairedStore" jsId="stateStore"
+    url="/data/autocomplete/type/state/format/ajax"
+    requestMethod="get"></div>
+
+<?php // Elemento de entrada: ?>
+State: <input id="state" dojoType="dijit.form.FilteringSelect"
+    store="stateStore" pageSize="5" />
+
+<?php // establecer elementos requeridos por dojo:
+$this->dojo()->enable()
+             ->setDjConfigOption('parseOnLoad', true)
+             ->registerModulePath('custom', '../custom/')
+             ->requireModule('dijit.form.FilteringSelect')
+             ->requireModule('custom.PairedStore'); ?>
+]]></programlisting>
+
+        <para>
+            En nuestro script de esquema, vamos entonces a comprobar si Dojo 
+            está habilitado, y si es así, haremos algunas configuraciones más 
+            generales y lo ensamblaremos:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+<?php echo $this->doctype() ?>
+<html>
+<head>
+    <?php echo $this->headTitle() ?>
+    <?php echo $this->headMeta() ?>
+    <?php echo $this->headLink() ?>
+    <?php echo $this->headStyle() ?>
+<?php if ($this->dojo()->isEnabled()){
+    $this->dojo()->setLocalPath('/js/dojo/dojo.js')
+                 ->addStyleSheetModule('dijit.themes.tundra');
+    echo $this->dojo();
+   }
+?>
+    <?php echo $this->headScript() ?>
+</head>
+<body class="tundra">
+    <?php echo $this->layout()->content ?>
+    <?php echo $this->inlineScript() ?>
+</body>
+</html>
+]]></programlisting>
+
+        <para>
+            En este punto, sólo necesita asegurarse de que sus archivos están 
+            en el lugar correcto y que ha creado el punto final de acción 
+            para su FilteringSelect!
+        </para>
+    </example>
+
+    <sect3 id="zend.dojo.view.dojo.declarative">
+        <title>Uso Programático y Declarativo de Dojo</title>
+
+        <para>
+            Dojo permite usar a ambos <emphasis>declarative</emphasis> y
+            <emphasis>programmatic</emphasis> en muchas de sus características.
+            El uso de <emphasis>Declarative</emphasis> utiliza elementos HTML 
+            con atributos no estándar que se parsean cuando la página se está 
+            cargado. Mientras que ésta es una sintaxis poderosa y simple de 
+            utilizar, para muchos desarrolladores esto puede causar problemas 
+            con la validación de páginas.
+        </para>
+
+        <para>
+            El uso de <emphasis>Programmatic</emphasis> permite al desarrollador  
+            decorar los elementos existentes tirando de ellos por ID o  
+            selectores CSS y pasarlos a los constructores apropiados de objetos 
+            en Dojo. Debido a que no se usan atributos HTML no standard, 
+            las páginas continúan con la validación.
+        </para>
+
+        <para>
+            En la práctica, ambos casos de uso permiten una degradación elegante  
+            cuando javascript está desactivado o los diversos recursos de 
+            Dojo script están fuera de alcance. Para promover las normas y 
+            validación de documentos, Zend Framework hace uso de los usos 
+            programáticos por defecto; los diversos ayudantes de vista generarán 
+            javascript y lo empujan al ayudante de vista <code>dojo()</code> 
+            para su inclusión cuando sean presentados.
+        </para>
+
+        <para>
+            Utilizando esta técnica los desarrolladores pueden también desear 
+            explorar la posibilidad de escribir sus propia decoración 
+            programática de la página. Uno de los beneficios sería la 
+            posibilidad de especificar handlers para eventos dijit.
+        </para>
+
+        <para>
+            Para permitir esto, así como la posibilidad de usar sintaxis 
+            declarativa, hay disponibles una serie de métodos estáticos para 
+            establecer globamente este comportamiento.
+        </para>
+
+        <example id="zend.dojo.view.dojo.declarative.usage">
+            <title>Especificando el Uso Declarativo y Programático de Dojo</title>
+
+            <para>
+                Para especificar el uso declarativo, simplemente llame al 
+                método estático <code>setUseDeclarative()</code>:
+            </para>
+
+            <programlisting role="php"><![CDATA[
+Zend_Dojo_View_Helper_Dojo::setUseDeclarative();
+]]></programlisting>
+
+            <para>
+                Si decide más bien utilizar el uso programático, llame al 
+                método estático <code>setUseProgrammatic()</code>:
+            </para>
+
+            <programlisting role="php"><![CDATA[
+Zend_Dojo_View_Helper_Dojo::setUseProgrammatic();
+]]></programlisting>
+
+            <para>
+                Por último, si quiere crear sus propias normas programáticas, 
+                debe especificar el uso programático, pero al pasarle el valor 
+                '-1'; en esta situación, no se creará ningún javascript para 
+                decorar cualquier dijit usado.
+            </para>
+
+            <programlisting role="php"><![CDATA[
+Zend_Dojo_View_Helper_Dojo::setUseProgrammatic(-1);
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.view.dojo.themes">
+        <title>Temas</title>
+
+        <para>
+            Dojo permite la creación de los temas de su dijits (widgets). 
+            Puede seleccionar uno pasándolo en un path de módulo:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$view->dojo()->addStylesheetModule('dijit.themes.tundra');
+]]></programlisting>
+
+        <para>
+            La ruta del módulo es descubierta por utilizar el carácter '.' 
+            como separador de directorio y utilizando el último valor en la 
+            lista como el nombre del archivo CSS en ese directorio del tema a 
+            usar; en el ejemplo de arriba, Dojo buscará el tema en 
+            'dijit/themes/tundra/tundra.css'.
+        </para>
+
+        <para>
+            Cuando se utiliza un tema, es importante recordar pasar la calse 
+            del tema a, por lo menos un contenedor rodeando cualquier dijits que 
+            se utilice; el caso de uso más común es pasárselo en el body:
+        </para>
+
+        <programlisting role="html"><![CDATA[
+<body class="tundra">
+]]></programlisting>
+    </sect3>
+
+    <sect3 id="zend.dojo.view.dojo.layers">
+        <title>Usando Layers (Construcciones Personalizadas)</title>
+
+        <para>
+            Por defecto, cuando utilice uns sentencia dojo.require, 
+            dojo hará una solicitud de retorno al servidor para agarrar al 
+            archivo javascript apropiado. Si hay muchos dijits en el lugar, 
+            esto se traduce en muchas peticiones al servidor -- lo que no es óptimo.
+        </para>
+
+        <para>
+            La respuesta de Dojo a esto es proporcionar la capacidad de crear 
+            <emphasis>custom builds (construcciones personalizadas</emphasis>. 
+            Las contrucciones hacen varias cosas:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                Grupos de archivos necesarios en <emphasis>layers</emphasis>; 
+                una capa (layer) agrupa a todos archivos necesarios en un único 
+                archivo JS. (De ahí el nombre de esta sección.)
+            </para></listitem>
+
+            <listitem><para>
+                "Interns" no son archivos javascript usados por dijits 
+                (típicamente, archivos de plantilla). También están agrupados 
+                en el mismo archivo JS como la capa.
+            </para></listitem>
+
+            <listitem><para>
+                Pasa el archivo a través de ShrinkSafe, que elimina espacios en 
+                blanco y comentarios, así como acorta nombres de variables.
+            </para></listitem>
+        </itemizedlist>
+
+        <para>
+            Algunos archivos pueden no ser superpuestos, pero el proceso creará 
+            una versión especial del directorio con la archivo capa y todos los 
+            otros archivos. Esto le permite tener una distribución reducida 
+            adaptada a su sitio o necesidades de aplicación.
+        </para>
+
+        <para>
+            Para usar una capa, el ayudante de vista <code>dojo()</code> tiene 
+            el método <code>addLayer()</code> para añadir paths de capas requeridas:
+        </para>
+
+        <programlisting role="html"><![CDATA[
+$view->dojo()->addLayer('/js/foo/foo.js');
+]]></programlisting>
+
+        <para>
+            Para más información sobre la creación de construcciones 
+            personalizadas, por favor <ulink
+                url="http://dojotoolkit.org/book/dojo-book-0-9/part-4-meta-dojo/package-system-and-custom-builds">
+            consulte la docuemntación de Build de Dojo</ulink>.
+        </para>
+    </sect3>
+
+    <sect3 id="zend.dojo.view.dojo.methods">
+        <title>Métodos Disponibles</title>
+
+        <para>
+            El ayudante de vista <code>dojo()</code> siempre devuelve una 
+            instancia del contenedor del marcador de posición dojo.  
+            Ese objeto contenedor dispone de los siguientes métodos:
+        </para>
+
+        <itemizedlist>
+            <listitem><para><code>setView(Zend_View_Interface $view)</code>: 
+                    establecer una instancia de vista en el contenedor.
+            </para></listitem>
+            <listitem><para><code>enable()</code>: habilitar explícitamente la
+                    integración de Dojo.</para></listitem>
+            <listitem><para><code>disable()</code>: deshabilitar la 
+                    integración de Dojo.</para></listitem>
+            <listitem><para><code>isEnabled()</code>: determinar cuándo la 
+                    integración de Dojo está habilitada o no.</para></listitem>
+            <listitem><para><code>requireModule($module)</code>: establecer una 
+                    sentencia <code>dojo.require</code></para></listitem>
+            <listitem><para><code>getModules()</code>: determinar qué módulos 
+                    han sido requeridos.</para></listitem>
+            <listitem><para><code>registerModulePath($module, $path)</code>:
+                    registrar un path de un módulo personalizado de Dojo.
+            </para></listitem>
+            <listitem><para><code>getModulePaths()</code>: obtener la lista de 
+                    los paths de módulos registrados.</para></listitem>
+            <listitem><para><code>addLayer($path)</code>: añadir una capa 
+                    (construcción personalizada) del path a utilizar.
+            </para></listitem>
+            <listitem><para><code>getLayers()</code>: conseguir una lista de 
+                    todos los paths de capas registrados (construcción personalizada). 
+            </para></listitem>
+            <listitem><para><code>removeLayer($path)</code>: eliminar la capa
+                    que concuerde con <code>$path</code> de la lista de capas 
+                    registradas (construcción personalizada).</para></listitem>
+            <listitem><para><code>setCdnBase($url)</code>: establecer la URL 
+                    base para un CDN; típicamente, una de las
+                    <classname>Zend_Dojo::CDN_BASE_AOL</classname> o
+                    <classname>Zend_Dojo::CDN_BASE_GOOGLE</classname>, pero sólo 
+                    necesita ser el string del URL antes del número de versión.
+            </para></listitem>
+            <listitem><para><code>getCdnBase()</code>: recuperar el CDN de la url
+                    base a utilizar.</para></listitem>
+            <listitem><para><code>setCdnVersion($version = null)</code>: 
+                    establecer cuál es la versión de Dojo a utilizar desde el CDN.
+            </para></listitem>
+            <listitem><para><code>getCdnVersion()</code>: recuperar que versión 
+                    de Dojo será utilizada desde el CDN.</para></listitem>
+            <listitem><para><code>setCdnDojoPath($path)</code>: establecer el 
+                    path relativo a un archivo dojo.js o dojo.xd.js sobre un CDN; 
+                    típicamente, uno de los 
+                    <classname>Zend_Dojo::CDN_DOJO_PATH_AOL</classname> o
+                    <classname>Zend_Dojo::CDN_DOJO_PATH_GOOGLE</classname>, 
+                    pero sólo debe ser el string del path detrás del número de 
+                    versión.</para></listitem>
+            <listitem><para><code>getCdnDojoPath()</code>: recuperar el último 
+                    segmento del path del CDN de la url apuntando al archivo 
+                    dojo.js.</para></listitem>
+            <listitem><para><code>useCdn()</code>: decirle al contenedor que 
+                    utilice el CDN; implícitamente permite integración.
+            </para></listitem>
+            <listitem><para><code>setLocalPath($path)</code>: decirle al 
+                    contenedor el path a una instalación local de Dojo 
+                    (deberá ser una ruta relativa al servidor, y contener el 
+                    propio archivo dojo.js); implícitamente permite integración.
+            </para></listitem>
+            <listitem><para><code>getLocalPath()</code>: determinar qué ruta 
+                    local a Dojo está siendo utilizada.</para></listitem>
+            <listitem><para><code>useLocalPath()</code>: ¿la integración está 
+                   utilizando un path local de Dojo?</para></listitem>
+            <listitem><para><code>setDjConfig(array $config)</code>: conjunto 
+                    de valores de configuración dojo/dijit 
+                    (espera un array asociativo).</para></listitem>
+            <listitem><para><code>setDjConfigOption($option, $value)</code>: 
+                    establecer un único valor de configuración para dojo/dijit.
+            </para></listitem>
+            <listitem><para><code>getDjConfig()</code>: obtener todos los 
+                     valores de configuración de dojo/dijit.</para></listitem>
+            <listitem><para><code>getDjConfigOption($option, $default =
+                    null)</code>: conseguir un único valor de configuración de 
+                    dojo/dijit.</para></listitem>
+            <listitem><para><code>addStylesheetModule($module)</code>: agregar 
+                    una hoja de estilo sobre la base del tema de un módulo.
+            </para></listitem>
+            <listitem><para><code>getStylesheetModules()</code>: obtener hojas 
+                    de estilo registradas como temas de módulos.
+            </para></listitem>
+            <listitem><para><code>addStylesheet($path)</code>: agregar una hoja 
+                    de estilo local para su uso con Dojo.</para></listitem>
+            <listitem><para><code>getStylesheets()</code>: obtener hojas de 
+                    estilo locales Dojo.</para></listitem>
+            <listitem><para><code>addOnLoad($spec, $function = null)</code>: 
+                    agregar un lambda para dojo.onLoad para llamadas. 
+                    Si se pasa un argumento, se supone que que puede ser tanto 
+                    el nombre de una función o dar por terminado javascript. 
+                    Si se pasan dos argumentos, el primero se supone que es el 
+                    nombre de la variable de la instancia de un objeto y el 
+                    segundo ya sea un nombre de método en ese objeto o un cierre 
+                    a utilizar con ese objeto.</para></listitem>
+            <listitem><para><code>prependOnLoad($spec, $function = null)</code>:
+                    exactamente como <code>addOnLoad()</code>, excluyendo 
+                    agregar al principio el comienzo de onLoad stack.
+            </para></listitem>
+            <listitem><para><code>getOnLoadActions()</code>: recuperar todas las 
+                    acciones dojo.onLoad registradas con el contenedor. Esto 
+                    será un array de arrays.</para></listitem>
+            <listitem><para><code>onLoadCaptureStart($obj = null)</code>:
+                    capturar los datos que se utilizarán como lambda para 
+                    dojo.onLoad(). Si se provee $obj, los códigos JS capturados 
+                    serán considerados un cierre a utilizar con ese objeto 
+                    Javascript.</para></listitem>
+            <listitem><para><code>onLoadCaptureEnd($obj = null)</code>: 
+                    finalizar la captura de datos para su uso con dojo.onLoad().
+             </para></listitem>
+            <listitem><para><code>javascriptCaptureStart()</code>:
+                    captura javascript arbitrario para ser incluido en Dojo JS 
+                    (onLoad, require, etc. statements).</para></listitem>
+            <listitem><para><code>javascriptCaptureEnd()</code>: finalizar la 
+                    captura de javascript.</para></listitem>
+            <listitem><para><code>__toString()</code>: emitir el contenedor a 
+                    un string; muestra todo el estilo HTML y elementos del script.
+            </para></listitem>
+        </itemizedlist>
+    </sect3>
+</sect2>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 1233 - 0
documentation/manual/es/module_specs/Zend_Dojo-View-Helpers.xml

@@ -0,0 +1,1233 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect2 id="zend.dojo.view.dijit">
+    <title>Ayudantes de Vistas Específicos de Dijit</title>
+
+    <para>
+        Del manual de Dojo: "Dijit es un sistema de widgets estratificados 
+        encima de dojo".  
+        Dijit incluye una variedad de diseños y forms de widgets diseñados para 
+        proporcionar características de accesibilidad, localización, y un 
+        look-and-feel estandarizado (y temable).
+    </para>
+
+    <para>
+        Zend Framework viene con una variedad de ayudantes de vista que le 
+        permiten suministrar y utilizar dijits dentro de sus scripts de vista. 
+        Hay tres tipos básicos:
+    </para>
+
+    <itemizedlist>
+        <listitem>
+            <para>
+                <emphasis>Layout Containers</emphasis>: estos están diseñados 
+                para ser utilizados dentro de sus scripts de vista o consumidos 
+                por los decoradores de forms, para forms, sub forms, y mostrar  
+                grupos. Envuelven las distintas clases ofrecidas en dijit.layout.  
+                Cada ayudante de vista dijit layout espera los siguientes 
+                argumentos:
+            </para>
+
+            <itemizedlist>
+                <listitem><para>
+                        <code>$id</code>: el nombre del contenedor o el DOM ID.
+                </para></listitem>
+
+                <listitem><para>
+                        <code>$content</code>: el contenido a envolver en el 
+                        contenedor esquematizado.
+                </para></listitem>
+
+                <listitem><para>
+                        <code>$params</code> (opcional): parámetros específicos 
+                        de dijit. Básicamente, cualquier atributo no HTML que 
+                        pueda utilizarse para configurar el esquema del 
+                        contenedor dijit.
+                </para></listitem>
+
+                <listitem><para>
+                        <code>$attribs</code> (optional): cualquier de los otros  
+                        atributos HTML que deberían utilizarse para mostrar el 
+                        contenedor div. Si se pasa la clave 'id' en este 
+                        array, será utilizada para el elemento DOM id del form, 
+                        y <code>$id</code> será utilizado por su nombre.
+                </para></listitem>
+            </itemizedlist>
+
+            <para>
+                Si no pasa argumentos a un ayudante de vista de esquemas dijit, 
+                el ayudante mismo será devuelto. 
+                Esto le permite capturar contenido, que a menudo es una manera 
+                más fácil para pasar contenido al esquema del contenedor. 
+                Ejemplos de esta funcionalidad se mostrarán más tarde en esta 
+                sección.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                <emphasis>Form Dijit</emphasis>: el dijit dijit.form.Form, 
+                aunque no es completamente necesario para su uso con elementos 
+                de dijit forms, se asegurará de que si hay un intento de 
+                enviar un form que no valide contra las validaciones del lado 
+                del cliente, se detendrá el envío y se emitirán mensajes 
+                de error de validación. El ayudante de vista dijit espera los 
+                siguientes argumentos:
+            </para>
+
+            <itemizedlist>
+                <listitem><para>
+                        <code>$id</code>: el nombre del contenedor o el DOM ID.
+                </para></listitem>
+
+                <listitem><para>
+                        <code>$attribs</code> (opcional): cualquier otro de los 
+                        atributos HTML que deberían ser utilizados para mostrar 
+                        el div del contenedor.
+                </para></listitem>
+
+                <listitem><para>
+                        <code>$content</code> (opcional): el contenido a envolver 
+                        en el form. Si no se pasa ninguno, se utilizará un string 
+                        vacío.
+                </para></listitem>
+            </itemizedlist>
+
+            <para>
+                El orden de los argumentos varía de los demás dijits a fin de 
+                mantener la compatibilidad con el standard <code>form()</code> 
+                del ayudante de vista.
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                <emphasis>Elementos del Form</emphasis>: éstos están diseñados 
+                para ser consumidos con <classname>Zend_Form</classname>, pero 
+                pueden ser utilizados standalone también en sus scripts de vista. 
+                Cada elemento de ayudante de vista dijit espera los siguientes 
+                argumentos:
+            </para>
+
+            <itemizedlist>
+                <listitem><para>
+                        <code>$id</code>: el nombre del elemento o el DOM ID.
+                </para></listitem>
+
+                <listitem><para>
+                        <code>$value</code> (opcional): el valor actual de ese 
+                        elemento.
+                </para></listitem>
+
+                <listitem><para>
+                        <code>$params</code> (opcional): parámetros específicos 
+                        de dijit. Básicamente, cualquier atributo no HTML que 
+                        pueda utilizarse para configurar un dijit.
+                </para></listitem>
+
+                <listitem><para>
+                        <code>$attribs</code> (opcional): cualquiera de los otros 
+                        atributos adicionales HTML que deberían ser utilizados 
+                        para mostrar el dijit. Si se pasa la clave 'id' en este  
+                        array, será utilizado por el elemento DOM id del form, 
+                        y <code>$id</code> será utilizado por su nombre.
+                </para></listitem>
+            </itemizedlist>
+
+            <para>
+                Algunos de los elementos requieren más argumentos; esto se 
+                observó con el elemento individual ayudante de descripciones.
+            </para>
+        </listitem>
+    </itemizedlist>
+
+    <para>
+        Con el fin de utilizar estos ayudantes de vista, necesita registrar el 
+        path a los ayudantes de vista dojo con su objeto vista.
+    </para>
+
+    <example id="zend.dojo.view.dijit.prefixpath">
+        <title>Registrando el Prefijo del Path al Ayudante de Vista de Dojo</title>
+
+        <programlisting role="php"><![CDATA[
+$view->addHelperPath('Zend/Dojo/View/Helper', 'Zend_Dojo_View_Helper');
+]]></programlisting>
+    </example>
+
+    <sect3 id="zend.dojo.view.dijit.layout">
+        <title>Elementos del Esquema Dijit</title>
+
+        <para>
+            La familia de elementos dijit.layout son para crear esquemas  
+            personalizados y previsibles para su sitio. 
+            Para cualquier pregunta sobre el uso general, <ulink
+                url="http://dojotoolkit.org/book/dojo-book-0-9/part-2-dijit/layout"> 
+            lea más sobre ellos en el manual de Dojo</ulink>.
+        </para>
+
+        <para>
+            Todos los elementos de los esquemas dijit tienen la firma 
+            <code>string ($id = null, $content = '', array $params =
+                array(), array $attribs = array())</code>. En todos los casos, 
+            si no pasa argumentos, será devuelto el mismo objeto ayudante. 
+            Esto le da acceso a los métodos <code>captureStart()</code> y
+            <code>captureEnd()</code>, que permiten capturar contenido en 
+            lugar de pasarlo al esquema del contenedor.
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    <emphasis>AccordionContainer</emphasis>:
+                    dijit.layout.AccordionContainer. Apilará todos los cuadros 
+                    juntos verticalmente; con un click en la barra del título de 
+                    un cuadro, se expandirá y mostrará ese cuadro en particular.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+<?php echo $view->accordionContainer(
+    'foo',
+    $content,
+    array(
+        'duration' => 200,
+    ),
+    array(
+        'style' => 'width: 200px; height: 300px;',
+    ),
+); ?>
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>AccordionPane</emphasis>: dijit.layout.AccordionPane.
+                    Para su uso en AccordionContainer.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+<?php echo $view->accordionPane(
+    'foo',
+    $content,
+    array(
+        'title' => 'Pane Title',
+    ),
+    array(
+        'style' => 'background-color: lightgray;',
+    ),
+); ?>
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>BorderContainer</emphasis>:
+                    dijit.layout.BorderContainer. Logra diseños con cuadros 
+                    opcionalmente redimensionables como se puede 
+                    ver en una aplicación tradicional.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+<?php echo $view->borderContainer(
+    'foo',
+    $content,
+    array(
+        'design' => 'headline',
+    ),
+    array(
+        'style' => 'width: 100%; height: 100%',
+    ),
+); ?>
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>ContentPane</emphasis>: dijit.layout.ContentPane. 
+                    Usarlo dentro de cualquier contenedor excepto AccordionContainer.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+<?php echo $view->contentPane(
+    'foo',
+    $content,
+    array(
+        'title'  => 'Pane Title',
+        'region' => 'left',
+    ),
+    array(
+        'style' => 'width: 120px; background-color: lightgray;',
+    ),
+); ?>
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>SplitContainer</emphasis>:
+                    dijit.layout.SplitContainer. Permite cuadros de contenido 
+                    redimensionables, discontinuado en Dojo en favor de 
+                    BorderContainer.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+<?php echo $view->splitContainer(
+    'foo',
+    $content,
+    array(
+        'orientation'  => 'horizontal',
+        'sizerWidth'   => 7,
+        'activeSizing' => true,
+    ),
+    array(
+        'style' => 'width: 400px; height: 500px;',
+    ),
+); ?>
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>StackContainer</emphasis>:
+                    dijit.layout.StackContainer. Todos los cuadros dentro de 
+                    un StackContainer se colocan en una pila; crea botones 
+                    o funcionalidades a ser revelados uno a uno.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+<?php echo $view->stackContainer(
+    'foo',
+    $content,
+    array(),
+    array(
+        'style' => 'width: 400px; height: 500px; border: 1px;',
+    ),
+); ?>
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>TabContainer</emphasis>:
+                    dijit.layout.TabContainer. Todos los cuadros dentro de un 
+                    TabContainer se colocan en una pila, con pestañas colocadas 
+                    a un lado para cambiar entre ellos.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+<?php echo $view->tabContainer(
+    'foo',
+    $content,
+    array(),
+    array(
+        'style' => 'width: 400px; height: 500px; border: 1px;',
+    ),
+); ?>
+]]></programlisting>
+            </listitem>
+        </itemizedlist>
+
+        <para>
+            Los siguientes métodos de captura están disponibles para todos los 
+            esquemas de contenedores:
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    <code>captureStart($id, array $params = array(), array $attribs = array())</code>:
+                    inicia la captura del contenido a incluir en un contenedor.
+                    <code>$params</code> hace referencia a dijit params para 
+                    utilizar con el contenedor, mientras que <code>$attribs</code> 
+                    se refiere a cualquier atributo general HTML a utilizar.
+                </para>
+
+                <para>
+                    Los contenedores pueden estar anidados durante la captura, 
+                    <emphasis>mientras no hayan IDs duplicados</emphasis>.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <code>captureEnd($id)</code>:
+                    finalizar la captura del contenido a incluir en un contenedor.
+                    <code>$id</code> debe referirse a un id anteriormente 
+                    utilizado con la llamada <code>captureStart()</code>. 
+                    Regresa el string representando al contenedor y su contenido, 
+                    como si simplemente pasara el contenido al ayudante mismo.
+                </para>
+            </listitem>
+        </itemizedlist>
+
+        <example id="zend.dojo.view.dijit.layout.borderexample">
+            <title>Ejemplo de esquema de BorderContainer dijit</title>
+
+            <para>
+                Los BorderContainers, particularmente cuando junto a la 
+                capacidad de capturar contenido, son útiles especialmente para 
+                lograr efectos complejos de diseño.
+            </para>
+
+            <programlisting role="php"><![CDATA[
+$view->borderContainer()->captureStart('masterLayout',
+                                       array('design' => 'headline'));
+
+echo $view->contentPane(
+    'menuPane',
+    'This is the menu pane',
+    array('region' => 'top'),
+    array('style' => 'background-color: darkblue;')
+);
+
+echo  $view->contentPane(
+    'navPane',
+    'This is the navigation pane',
+    array('region' => 'left'),
+    array('style' => 'width: 200px; background-color: lightblue;')
+);
+
+echo $view->contentPane(
+    'mainPane',
+    'This is the main content pane area',
+    array('region' => 'center'),
+    array('style' => 'background-color: white;')
+);
+
+echo $view->contentPane(
+    'statusPane',
+    'Status area',
+    array('region' => 'bottom'),
+    array('style' => 'background-color: lightgray;')
+);
+
+echo $view->borderContainer()->captureEnd('masterLayout');
+]]></programlisting>
+        </example>
+    </sect3>
+
+    <sect3 id="zend.dojo.view.dijit.form">
+        <title>Elementos de Dijit Form</title>
+
+        <para>
+            la validación de forms en Dojo y los dijits de entrada están en dijit.form.tree. 
+            Para más información sobre la utilización de estos elementos, 
+            así como los parámetros aceptados, por favor <ulink
+                url="http://dojotoolkit.org/book/dojo-book-0-9/part-2-dijit/form-validation-specialized-input">vea
+                la docuemntación de dijit.form</ulink>.
+        </para>
+
+        <para>
+            Los siguientes elementos de dijit form están disponibles en Zend 
+            Framework. Excepto cuando se señaló que todos tienen la firma
+            <code>string ($id,$value = '', array $params = array(), 
+            array $attribs = array())</code>.
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    <emphasis>Button</emphasis>: dijit.form.Button. Muestra un
+                    botón de form.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+<?php echo $view->button(
+    'foo',
+    'Show Me!',
+    array('iconClass' => 'myButtons'),
+); ?>
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>CheckBox</emphasis>: dijit.form.CheckBox. 
+                    Muestra un checkbox. Acepta opcionalmente un quinto 
+                    argumento, el array <code>$checkedOptions</code>, que puede 
+                    contener:
+                </para>
+
+                <itemizedlist>
+                    <listitem><para>
+                            un array indexado con dos valores, un valor 
+                            verificado y otro no, en ese orden; o
+                    </para></listitem>
+
+                    <listitem><para>
+                            un array asociativo con las claves 'checkedValue' y 
+                            'unCheckedValue'.
+                    </para></listitem>
+                </itemizedlist>
+
+                <para>
+                    Si <code>$checkedOptions</code> no fueron suministradas, se
+                    asume 1 y 0.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+<?php echo $view->checkBox(
+    'foo',
+    'bar',
+    array(),
+    array(),
+    array('checkedValue' => 'foo', 'unCheckedValue' => 'bar')
+); ?>
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>ComboBox</emphasis>:
+                    dijit.layout.ComboBox. Los ComboBoxes son un híbrido entre 
+                    un cuadro de selección y uno de texto con autocompletado. 
+                    La diferencia fundamental es que puede escribir una opción 
+                    que no está en la lista de las opciones disponibles, y que 
+                    todavía considera válido el input. Opcionalmente acepta un quinto 
+                    argumento, un array asociativo <code>$options</code>; si lo 
+                    hay, ComboBox será presentado como un <code>select</code>. 
+                    Note también que la <emphasis>label values</emphasis> del 
+                    array <code>$options</code> será devuelto al form -- y no 
+                    los valores en si mismos.
+                </para>
+
+                <para>
+                    Alternativamente, puede pasar información sobre un datastrore 
+                    dojo.data para utilizar con el elemento. 
+                    Si la hay, el ComboBox será presentado como un texto 
+                    <code>input</code>, y traerá sus opciones vía ese datastore.
+                </para>
+
+                <para>
+                    Para especificar un datastore, proporcionar una de las 
+                    siguientes <code>$params</code> combinaciones de claves:
+                </para>
+
+                <itemizedlist>
+                    <listitem>
+                        <para>
+                            La clave 'store', con un valor de array; el array 
+                            debe contener las claves:
+                        </para>
+
+                        <itemizedlist>
+                            <listitem><para>
+                                <emphasis>store</emphasis>: el nombre de la 
+                                variable javascript representando el datastore 
+                                (este podría ser el nombre que desea para su uso).
+                            </para></listitem>
+
+                            <listitem><para>
+                                <emphasis>type</emphasis>: el tipo de datastore 
+                                a usar; e.g., 'dojo.data.ItemFileReadStore'.
+                            </para></listitem>
+
+                            <listitem><para>
+                                <emphasis>params</emphasis> (opcional): un array 
+                                asociativo de pares clave/valor a utilizar para 
+                                configurar el datastore. El 'url' param es un 
+                                ejemplo típico.
+                            </para></listitem>
+                        </itemizedlist>
+                    </listitem>
+
+                    <listitem>
+                        <para>
+                            Las claves:
+                        </para>
+
+                        <itemizedlist>
+                            <listitem><para>
+                                <emphasis>store</emphasis>: un string indicando 
+                                el nombre del datastore a usar.
+                            </para></listitem>
+
+                            <listitem><para>
+                                <emphasis>storeType</emphasis>: un string indicando
+                                el tipo de datastore dojo.data a usar (e.g.,
+                                'dojo.data.ItemFileReadStore').
+                            </para></listitem>
+
+                            <listitem><para>
+                                <emphasis>storeParams</emphasis>: un array 
+                                asociativo de pares clave/valor con los cuales   
+                                configurar el datastore.
+                            </para></listitem>
+                        </itemizedlist>
+                    </listitem>
+                </itemizedlist>
+
+                <programlisting role="php"><![CDATA[
+// Como un elemento select:
+echo $view->comboBox(
+    'foo',
+    'bar',
+    array(
+        'autocomplete' => false,
+    ),
+    array(),
+    array(
+        'foo' => 'Foo',
+        'bar' => 'Bar',
+        'baz' => 'Baz',
+    )
+);
+
+// Como en elemento habilitado de dojo.data:
+echo $view->comboBox(
+    'foo',
+    'bar',
+    array(
+        'autocomplete' => false,
+        'store'        => 'stateStore',
+        'storeType'    => 'dojo.data.ItemFileReadStore',
+        'storeParams'  => array('url' => '/js/states.json'),
+    ),
+);
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>CurrencyTextBox</emphasis>:
+                    dijit.form.CurrencyTextBox. Se hereda de ValidationTextBox, 
+                    y proporciona validación de moneda del lado del cliente. 
+                    Se espera que el parámetro dijit 'currency' será siempre 
+                    proporcionado con el código adecuado de 3 caracteres de la 
+                    moneda. También puede especificar cualquiera de los 
+                    parámetros dijit válidos para ValidationTextBox y TextBox.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+echo $view->currencyTextBox(
+    'foo',
+    '$25.00',
+    array('currency' => 'USD'),
+    array('maxlength' => 20)
+);
+]]></programlisting>
+
+                <note>
+                    <title>Cuestiones con la Construcción</title>
+
+                    <para>
+                        Actualmente hay <ulink
+                            url="http://trac.dojotoolkit.org/ticket/7183">
+                        problemas conocidos con el uso de CurrencyTextBox en 
+                        la construcción de capas</ulink>. Una conocida 
+                        solución alternativa es garantizar que el meta tag  
+                        Content-Type de http-equiv en su documento esté 
+                        establecido al conjunto de caracteres utf-8, 
+                        que puede hacerlo llamando a:
+                    </para>
+
+                    <programlisting role="php"><![CDATA[
+$view->headMeta()->appendHttpEquiv('Content-Type',
+                                   'text/html; charset=utf-8');
+]]></programlisting>
+
+                    <para>
+                        Por supuesto, esto significa que necesitará para 
+                        garantizar que el marcador de posición 
+                        <code>headMeta()</code> esté dentro de una sentencia 
+                        "echo" de PHP en su script.
+                    </para>
+                </note>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>DateTextBox</emphasis>:
+                    dijit.form.DateTextBox. Es heredada de ValidationTextBox, y 
+                    ofrece tanto validación de fechas de lado del cliente, así 
+                    como un calendario desplegable desde el cual elegir una fecha. 
+                    Puede especificar cualquiera de los parámetros dijit 
+                    disponibles para ValidationTextBox o TextBox.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+echo $view->dateTextBox(
+    'foo',
+    '2008-07-11',
+    array('required' => true)
+);
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>Editor</emphasis>: dijit.Editor. Proporciona un 
+                    editor WYSIWYG mediante el cual los usuarios pueden crear o 
+                    editar el contenido. <code>dijit.Editor</code> es un 
+                    editor pluggable y extensible, con una variedad de parámetros 
+                    que puede utilizar para personalización; para más detalles vea 
+                    <ulink url="http://dojotoolkit.org/book/dojo-book-0-9/part-2-dijit/advanced-editing-and-display/editor-rich-text">la 
+                    documentación de dijit.Editor</ulink>.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+echo $view->editor('foo');
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>FilteringSelect</emphasis>:
+                    dijit.form.FilteringSelect. Similar a ComboBox, este es un 
+                    híbrido de select/text que puede hacer una lista de opciones 
+                    o aquellos retornados vía un dojo.data datastore. 
+                    A diferencia de ComboBox, sin embargo, FilteringSelect no 
+                    permite escribir una opción ni siquieraen en su lista. 
+                    Además, opera como un select standard en que los valores 
+                    de opción, no las etiquetas, son devueltos cuando el 
+                    form se envía.
+                </para>
+
+                <para>
+                    Por favor vea la información anterior sobre ComboBox para 
+                    ejemplos y las opciones disponibles para definir datastores.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>HorizontalSlider</emphasis> y
+                    <emphasis>VerticalSlider</emphasis>:
+                    dijit.form.HorizontalSlider y dijit.form.VerticalSlider.
+                    Los sliders permiten a los widgets de UI seleccionar números 
+                    en un rango dado; las variantes son horizontales y 
+                    verticales. 
+                </para>
+
+                <para>
+                    En lo más elemental, exigen los parámetros dijit 
+                    'minimum', 'maximum', y 'discreteValues'. 
+                    Estos definen el rango de valores. Otras opciones comunes 
+                    son las siguientes:
+                </para>
+
+                <itemizedlist>
+                    <listitem><para>
+                        'intermediateChanges' se puede ajustar para indicar 
+                        cuando disparar o no eventos onChange mientras el 
+                        handler está siendo arrastrado.
+                    </para></listitem>
+
+                    <listitem><para>
+                        'clickSelect' se establece para permitir hacer click 
+                        en un lugar del deslizador para ajustar el valor.
+                    </para></listitem>
+
+                    <listitem><para>
+                        'pageIncrement' puede especificar el valor de 
+                        aumento/decremento cuando se utilizan pageUp y pageDown.
+                    </para></listitem>
+
+                    <listitem><para>
+                        'showButtons' se puede ajustar para permitir ver los 
+                        botones de ambos extremos del deslizador para manipular 
+                        el valor.
+                    </para></listitem>
+                </itemizedlist>
+
+                <para>
+                    La implementación de Zend Framework crea un elemento oculto 
+                    para guardar el valor del deslizador.
+                </para>
+
+                <para>
+                    Opcionalmente puede desear mostrar una regla o etiquetas 
+                    para el deslizador. Para hacerlo, se asignará uno o más de 
+                    los parámetros dijit 'topDecoration' y/o 'bottomDecoration' 
+                    (HorizontalSlider) o 'leftDecoration' y/o 'rightDecoration' 
+                    (VerticalSlider). 
+                    Cada uno de éstos espera las siguientes opciones:
+                </para>
+
+                <itemizedlist>
+                    <listitem><para>
+                        <emphasis>container</emphasis>: nombre del contenedor.
+                    </para></listitem>
+
+                    <listitem><para>
+                        <emphasis>labels</emphasis> (opcional): un array de 
+                        etiquetas a utilizar. Use strings vacíos en cualquiera  
+                        de los extremos para dotar de etiquetas solamente a los 
+                        valores internos. Es necesario cuando se especifica 
+                        uno de las variantes dijit 'Labels'.
+                    </para></listitem>
+
+                    <listitem><para>
+                        <emphasis>dijit</emphasis> (opcional): uno de los 
+                        siguientes será por defecto la dijits Rule (regla)  
+                        HorizontalRule, HorizontalRuleLabels, VerticalRule, o
+                        VerticalRuleLabels.
+                    </para></listitem>
+
+                    <listitem>
+                        <para>
+                            <emphasis>params</emphasis> (opcional): los dijit 
+                            params son para configurar la Regla dijit en uso. 
+                            Los parámetros específicos de estos dijits incluyen:
+                        </para>
+
+                        <itemizedlist>
+                            <listitem><para>
+                                <emphasis>container</emphasis> (opcional):
+                                array de parámetros y atributos para el contenedor 
+                                de la regla.
+                            </para></listitem>
+
+                            <listitem><para>
+                                <emphasis>labels</emphasis> (opcional):
+                                array de parámetros y atributos para el 
+                                contenedor de la lista de etiquetas.
+                            </para></listitem>
+                        </itemizedlist>
+                    </listitem>
+
+                    <listitem><para>
+                        <emphasis>attribs</emphasis> (opcional): atributos HTML 
+                        para utilizar con las reglas/etiquetas. Esto debería 
+                        seguir el formato de opción <code>params</code> y ser 
+                        un array asociativo con las claves 'container' y 'labels'.
+                    </para></listitem>
+                </itemizedlist>
+
+                <programlisting role="php"><![CDATA[
+echo $view->horizontalSlider(
+    'foo',
+    1,
+    array(
+        'minimum'             => -10,
+        'maximum'             => 10,
+        'discreteValues'      => 11,
+        'intermediateChanges' => true,
+        'showButtons'         => true,
+        'topDecoration'       => array(
+            'container' => 'topContainer'
+            'dijit'     => 'HorizontalRuleLabels',
+            'labels'    => array(
+                ' ',
+                '20%',
+                '40%',
+                '60%',
+                '80%',
+                ' ',
+            ),
+            'params' => array(
+                'container' => array(
+                    'style' => 'height:1.2em; font-size=75%;color:gray;',
+                ),
+                'labels' => array(
+                    'style' => 'height:1em; font-size=75%;color:gray;',
+                ),
+            ),
+        ),
+        'bottomDecoration'    => array(
+            'container' => 'bottomContainer'
+            'labels'    => array(
+                '0%',
+                '50%',
+                '100%',
+            ),
+            'params' => array(
+                'container' => array(
+                    'style' => 'height:1.2em; font-size=75%;color:gray;',
+                ),
+                'labels' => array(
+                    'style' => 'height:1em; font-size=75%;color:gray;',
+                ),
+            ),
+        ),
+    )
+);
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>NumberSpinner</emphasis>:
+                    dijit.form.NumberSpinner. Text box numérico para entrada, 
+                    con botones para incremento y decremento.
+                </para>
+
+                <para>
+                    Espera bien un array asociativo del parámetro dijit 
+                    'constraints' o simplemente las claves 'min', 'max', 
+                    y 'places' (estas serían también las entradas esperadas  
+                    del parámetro de restricciones). 'places' puede ser 
+                    utilizada para indicar en cuánto se incrementará y 
+                    decrementará el número giratorio.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+echo $view->numberSpinner(
+    'foo',
+    5,
+    array(
+        'min'    => -10,
+        'max'    => 10,
+        'places' => 2,
+    ),
+    array(
+        'maxlenth' => 3,
+    )
+);
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>NumberTextBox</emphasis>:
+                    dijit.form.NumberTextBox. NumberTextBox ofrece la capacidad 
+                    de dar formato y mostrar entradas numéricas de una manera 
+                    localizada, así como validar entradas numéricas, opcionalmente 
+                    en contra de las restricciones dadas. 
+                </para>
+
+                <programlisting role="php"><![CDATA[
+echo $view->numberTextBox(
+    'foo',
+    5,
+    array(
+        'places' => 4,
+        'type'   => 'percent',
+    ),
+    array(
+        'maxlength' => 20,
+    )
+);
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>PasswordTextBox</emphasis>:
+                    dijit.form.ValidationTextBox está atada a una contraseña. 
+                    PasswordTextBox ofrece la posibilidad de crear una entrada 
+                    para contraseña que adhiere al actual tema dijit, así como 
+                    permitir la validación del lado del cliente. 
+                </para>
+
+                <programlisting role="php"><![CDATA[
+echo $view->passwordTextBox(
+    'foo',
+    '',
+    array(
+        'required' => true,
+    ),
+    array(
+        'maxlength' => 20,
+    )
+);
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>RadioButton</emphasis>: dijit.form.RadioButton. 
+                    Una serie de opciones entre las que sólo una puede ser 
+                    seleccionada. Esta se comporta en todos los sentidos 
+                    como una de radio normal, pero tiene un look-and-feel 
+                    consistente con otros dijits.
+                </para>
+
+                <para>
+                    RadioButton acepta un cuarto argumento como opción,
+                    <code>$options</code>, un array asociativo de pares 
+                    valor/etiqueta utilizado como opciones de radio. 
+                    También puede pasar estos como la clave <code>options</code> 
+                    de <code>$attribs</code>. 
+                </para>
+
+                <programlisting role="php"><![CDATA[
+echo $view->radioButton(
+    'foo',
+    'bar',
+    array(),
+    array(),
+    array(
+        'foo' => 'Foo',
+        'bar' => 'Bar',
+        'baz' => 'Baz',
+    )
+);
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>SimpleTextarea</emphasis>: dijit.form.SimpleTextarea.
+                    Estos actuarán como textareas normales, pero se estilizan  
+                    usando el tema actual de dijit. No necesita especificar los 
+                    atributos ya sea de las filas o de las columnas; 
+                    use <code>ems</code> o porcentajes del ancho y del alto en 
+                    su lugar.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+echo $view->simpleTextarea(
+    'foo',
+    'Start writing here...',
+    array(),
+    array('style' => 'width: 90%; height: 5ems;')
+);
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>SubmitButton</emphasis>: un dijit.form.Button está 
+                    atado a un elemento de entrada a enviar. Vea el ayudante 
+                    de vista de Button para más detalles; la diferencia 
+                    fundamental es que este botón puede enviar un form.
+                </para>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>Textarea</emphasis>: dijit.form.Textarea. Éstas 
+                    actuarán como textareas normales, salvo que en lugar de un 
+                    determinado número de filas, se expanden a medida que el 
+                    usuario tipea. El ancho debe especificarse mediante una 
+                    regla de estilo.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+echo $view->textarea(
+    'foo',
+    'Start writing here...',
+    array(),
+    array('style' => 'width: 300px;')
+);
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>TextBox</emphasis>: dijit.form.TextBox. Este 
+                    elemento está presente principalmente para proporcionar un 
+                    look-and-feel común entre los diversos elementos dijit, y a 
+                    ofrecer funcionalidades de base para otras clases derivadas 
+                    de TextBox (ValidationTextBox, NumberTextBox, CurrencyTextBox, 
+                    DateTextBox, y TimeTextBox).
+                </para>
+
+                <para>
+                    El parámetro común de dijit para los flags incluyen 'lowercase' 
+                    (emitido a minúsculas), 'uppercase' (emitido a mayúsculas), 
+                    'propercase' (emitido a Proper Case), 
+                    y trim (elimina los espacios en blanco iniciales y finales); 
+                    todos aceptan valores booleanos. Además, puede especificar 
+                    los parámetros 'size' y 'maxLength'.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+echo $view->textBox(
+    'foo',
+    'some text',
+    array(
+        'trim'       => true,
+        'propercase' => true,
+        'maxLength'  => 20,
+    ),
+    array(
+        'size' => 20,
+    )
+);
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>TimeTextBox</emphasis>: dijit.form.TimeTextBox.
+                    También de la familia TextBox, TimeTextBox 
+                    proporciona una selección desplazable drop down de la 
+                    cantidad de veces que un usuario podrá seleccionar. 
+                    Los parámetros Dijit le permiten especificar el tiempo 
+                    disponible para incrementos en el select así como un rango 
+                    visible de veces en disponibilidad.
+                </para>
+
+                <programlisting role="php"><![CDATA[
+echo $view->timeTextBox(
+    'foo',
+    '',
+    array(
+        'am.pm'            => true,
+        'visibleIncrement' => 'T00:05:00', // 5-minute increments
+        'visibleRange'     => 'T02:00:00', // show 2 hours of increments
+    ),
+    array(
+        'size' => 20,
+    )
+);
+]]></programlisting>
+            </listitem>
+
+            <listitem>
+                <para>
+                    <emphasis>ValidationTextBox</emphasis>:
+                    dijit.form.ValidateTextBox. Proporciona validaciones del 
+                    lado del cliente para un elemento de texto. 
+                    Se hereda desde TextBox.
+                </para>
+
+                <para>
+                    Los parámetros comunes de dijit incluyen:
+                </para>
+
+                <itemizedlist>
+                    <listitem><para>
+                        <emphasis>invalidMessage</emphasis>: un mensaje para 
+                        mostrar cuando se ha detectado una entrada inválida.
+                    </para></listitem>
+
+                    <listitem><para>
+                        <emphasis>promptMessage</emphasis>: un mensaje tooltip 
+                        de ayuda a utilizar.
+                    </para></listitem>
+
+                    <listitem><para>
+                        <emphasis>regExp</emphasis>: una expresión regular a 
+                        utilizar para validar el texto. La Expresión Regular no 
+                        requiere de marcadores de límites.
+                    </para></listitem>
+
+                    <listitem><para>
+                        <emphasis>required</emphasis>: si el elemento es  
+                        necesario o no. Si fuera necesario, y el elemento está 
+                        incrustado en un dijit.form.Form, será marcado como 
+                        inválido y no se enviará.
+                    </para></listitem>
+                </itemizedlist>
+
+                <programlisting role="php"><![CDATA[
+echo $view->validationTextBox(
+    'foo',
+    '',
+    array(
+        'required' => true,
+        'regExp'   => '[\w]+',
+        'invalidMessage' => 'No se permiten espacios o caracteres especiales',
+        'promptMessage'  => 'Una palabra consiste de caracteres  ' .
+                            'alfanuméricos y underscores solamente',
+    ),
+    array(
+        'maxlength' => 20,
+    )
+);
+]]></programlisting>
+            </listitem>
+        </itemizedlist>
+    </sect3>
+
+    <sect3 id="zend.dojo.view.dijit.custom">
+        <title>Dijits Personalizados</title>
+
+        <para>
+            Si ahonda mucho en Dojo, se encontrará escribiendo bastantes dijits  
+            personalizados, o utilizando dijits experimentales de Dojox. 
+            Si bien Zend Framework no puede apoyar a todos los dijit directamente, 
+            si proporciona algún apoyo rudimentario para tipos dijit 
+            arbitrarios vía el ayudante de vista <code>CustomDijit</code>.
+        </para>
+
+        <para>
+            La API del ayudante de vista <code>CustomDijit</code> es exactamente 
+            lo que cualquier otro dijit es, con una diferencia importante: 
+            el tercer argumento de "params" <emphasis>debe</emphasis> contener 
+            el atributo "dojotype". El valor de este atributo debe ser la clase 
+            Dijit que planea usar.
+        </para>
+
+        <para>
+            <code>CustomDijit</code> extiende la base del ayudante de vista 
+            <code>DijitContainer</code>, que también le permite capturar el 
+            contenido (utilizando el par de métodos 
+            <code>captureStart()</code>/<code>captureEnd()</code>). 
+            <code>captureStart()</code> también espera que pase el atributo 
+            "dojoType" a su argumento "params".
+        </para>
+
+        <example id="zend.dojo.view.dijit.custom.example">
+            <title>Usando CustomDijit para mostrar un dojox.layout.ContentPane</title>
+
+            <para>
+                <code>dojox.layout.ContentPane</code> es la siguiente generación 
+                de iteración de <code>dijit.layout.ContentPane</code>, y proporciona 
+                un superconjunto de capacidades de esa clase. 
+                Hasta que la funcionalidad se estabilice, seguirá viviendo en Dojox. 
+                Sin embargo, si quiere utilizarlo hoy en Zend Framework, puede 
+                hacerlo, utilizando el ayudante de vista <code>CustomDijit</code>.
+            </para>
+
+            <para>
+                Para lo más básico, puede hacer lo siguiente:
+            </para>
+
+            <programlisting role="php"><![CDATA[
+<?php echo $this->customDijit(
+    'foo',
+    $content,
+    array(
+        'dojoType' => 'dojox.layout.ContentPane',
+        'title'    => 'Custom pane',
+        'region'   => 'center'
+    )
+); ?>
+]]></programlisting>
+
+            <para>
+                Si quiere capturar el contenido en su lugar, simplemente use el 
+                método <code>captureStart()</code>, y pase el "DojoType" al 
+                argumento de "params":
+            </para>
+
+            <programlisting role="php"><![CDATA[
+<?php $this->customDijit()->captureStart(
+    'foo',
+    array(
+        'dojoType' => 'dojox.layout.ContentPane',
+        'title'    => 'Custom pane',
+        'region'   => 'center'
+    )
+); ?>
+This is the content of the pane
+<?php echo $this->customDijit()->captureEnd('foo'); ?>
+]]></programlisting>
+
+            <para>
+                Fácilmente puede extender también <code>CustomDijit</code> para 
+                crear apoyo para sus propios dijits personalizados. 
+                Como ejemplo, si extiende <code>dijit.layout.ContentPane</code> 
+                para crear su propia clase <code>foo.ContentPane</code>, puede 
+                crear el siguiente ayudante de apoyo:
+            </para>
+
+            <programlisting role="php"><![CDATA[
+class My_View_Helper_FooContentPane
+    extends Zend_Dojo_View_Helper_CustomDijit
+{
+    protected $_defaultDojoType = 'foo.ContentPane';
+
+    public function fooContentPane(
+        $id = null, $value = null,
+        array $params = array(), array $attribs = array()
+    ) {
+        return $this->customDijit($id, $value, $params, $attribs);
+    }
+}
+]]></programlisting>
+
+            <para>
+                Mientras que su dijit personalizado siga la misma base API que 
+                los dijits oficiales, utilizar o extender <code>CustomDijit</code> 
+                debería funcionar correctamente.
+            </para>
+        </example>
+    </sect3>
+</sect2>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 48 - 0
documentation/manual/es/module_specs/Zend_Dojo-View.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.dojo.view" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <title>Ayudantes de Dojo View</title>
+
+    <para>
+        Zend Framework provee los siguientes ayudantes específicos de Dojo: 
+    </para>
+
+    <itemizedlist>
+        <listitem><para>
+            <emphasis>dojo():</emphasis> configura el medio ambiente de Dojo 
+            para su página, incluyendo valores de configuración de Dojo, 
+            paths de módulos personalizados, sentencias de requerimientos de 
+            módulos, temas de hojas de estilo, uso de CDN, y más.
+        </para></listitem>
+    </itemizedlist>
+
+    <example id="zend.dojo.view.setup">
+        <title>Usando los Ayudantes de Dojo View</title>
+
+        <para>
+            Para utilizar los ayudantes de vista de Dojo, necesitará decirle a 
+            un objeto vista dónde encontrarlos. Puede hacerlo llamando a 
+            <code>addHelperPath()</code>:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$view->addHelperPath('Zend/Dojo/View/Helper/', 'Zend_Dojo_View_Helper');
+]]></programlisting>
+
+        <para>
+            Alternativamente, puede usar el método de 
+            <classname>Zend_Dojo</classname> <code>enableView()</code> 
+            para que haga el trabajo por usted:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+Zend_Dojo::enableView($view);
+]]></programlisting>
+    </example>
+
+    <xi:include href="Zend_Dojo-View-Dojo.xml" />
+    <xi:include href="Zend_Dojo-View-Helpers.xml" />
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 35 - 0
documentation/manual/es/module_specs/Zend_Dojo.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.dojo.introduction">
+    <title>Introducción</title>
+
+    <para>
+        Zend Framework trae incorporado <ulink
+            url="http://dojotoolkit.org">Dojo Toolkit</ulink> para brindar apoyo 
+        out-of-the-box al desarrollo de aplicaciones "ricas de internet". Los 
+        puntos de integración con Dojo incluyen:
+    </para>
+
+    <itemizedlist>
+        <listitem><para>Soporte JSON-RPC</para></listitem>
+        <listitem><para>Compatibilidad dojo.data</para></listitem>
+        <listitem><para>Ayudante de vista para ayudar a establecer el medio ambiente de Dojo</para></listitem>
+        <listitem><para>Ayudantes de Dijit-specific <classname>Zend_View</classname></para></listitem>
+        <listitem><para>Elementos y decoradores de Dijit-specific <classname>Zend_Form</classname></para></listitem>
+    </itemizedlist>
+
+    <para>
+        La propia distribución de Dojo puede encontrarse en el directorio 
+        <code>externals/dojo/</code> de la distribución de Zend Framework. 
+        Esta es una distribución fuente, que incluye completamente los fuentes 
+        javascript de Dojo, unidades de pruebas, y constructores de herramientas. 
+        Puede hacer un symlink a su directorio javascript, copiarlo, o 
+        utilizarlo como herramienta para crear sus propias construcciones 
+        personalizadas a fin de incluirlas en su proyecto. 
+        Alternativamente, puede usar una de las Content Delivery Networks que 
+        ofrece Dojo (ZF apoya tanto el AOL CDN oficial así como el Google CDN).
+    </para>
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 1 - 1
documentation/manual/es/module_specs/Zend_Form-Decorators.xml

@@ -146,7 +146,7 @@
         </para>
 
         <programlisting role="php"><![CDATA[
-interface Zend_Form_Decorator_Interface
+interface Zend_Decorator_Interface
 {
     public function __construct($options = null);
     public function setElement($element);