Provided by: po4a_0.34-2_all bug

NOMBRE

       po4a - marco de trabajo para traducir documentaciA~Xn y otro material

IntroducciA~Xn

       El objetivo del proyecto po4a (po para todo) es facilitar la
       traducciA~Xn (y mA~Xs interesante, el mantenimiento de las
       traducciones) usando las herramientas de gettext en A~Xreas dA~Xnde no
       eran de esperar, como en la documentaciA~Xn.

Tabla de contenidos

       Este documento estA~X organizado de la siguiente forma:

       1 AXPorquA~X debo usar po4a? AXPara quA~X sirve?
           Este capA~tulo introductorio explica la motivaciA~Xn del proyecto y
           su filosofA~a. DeberA~a leerlo primero si estA~X en el proceso de
           evaluaciA~Xn de po4a para sus propias traducciones.

       2 AXCA~Xmo usar po4a?
           Este capA~tulo es como un manual de referencia, dA~Xnde se intenta
           contestar las preguntas de los usuarios, y se le ofrece una idea
           general del proceso. Le introduce al mA~Xtodo de trabajo con po4a y
           sirve como documentaciA~Xn introductoria de las herramientas
           especA~ficas.

           AXCA~Xmo empezar una nueva traducciA~Xn?
           AXCA~Xmo transformar la traducciA~Xn de vuelta a un archivo de
           documentaciA~Xn?
           AXCA~Xmo actualizar una traducciA~Xn con po4a?
           AXCA~Xmo convertir una traducciA~Xn ya existente a po4a?
           AXCA~Xmo aA~Xadir texto extra en las traducciones (como el nombre
           del traductor)?
           AXCA~Xmo hacer todo esto en una sola invocaciA~Xn a programa?
       3 AXCA~Xmo funciona?
           Este capA~tulo ofrece una breve explicaciA~Xn del funcionamiento
           interno de po4a, de forma que se pueda sentir mA~Xs seguro para
           ayudarnos a mantenerlo y mejorarlo. TambiA~Xn le puede ayudar a
           entender porquA~X no hace lo que esperaba, y cA~Xmo solucionar sus
           problemas.

       4 Preguntas Frecuentes
           Este capA~tulo agrupa las Preguntas Frecuentes. De hecho, la
           mayoria de preguntas actuales se pueden formular asA~: "AXPorquA~X
           se ha diseA~Xado asA~, y no asA~?" Si piensa que po4a no es la
           soluciA~Xn ideal para la traducciA~Xn de documentaciA~Xn, deberA~a
           considerar leer A~Xsta secciA~Xn. Si no responde su pregunta,
           contacte con nosotros en la lista de correo
           <po4a-devel@lists.alioth.debian.org>. Queremos escuchar su
           opiniA~Xn.

       5 Notas especA~ficas de los mA~Xdulos
           Este capA~tulo presenta los puntos especA~ficos de cada mA~Xdulo
           desde el punto de vista tanto del traductor como del autor
           original. Lea esto para aprender la sintaxis que se encontrarA~X
           cuando traduzca textos con un mA~Xdulo, o las reglas que debe
           seguir en el documento original para facilitar la vida del
           traductor.

           Actualmente A~Xsta secciA~Xn no forma parte de A~Xste documento. En
           realidad estA~X en la documentaciA~Xn de cada mA~Xdulo. Esto
           permite asegurar que la informaciA~Xn estA~X actualizada al
           mantener la documentaciA~Xn y el cA~Xdigo juntos.

       6 Fallos conocidos y caracterA~sticas solicitadas
           Unos cuantos aA~Xn :(

AXPorquA~X debo usar po4a? AXPara quA~X sirve?

       Me gusta la idea del software de cA~Xdigo abierto, lo que hace posible
       que todo el mundo pueda acceder al software y a su cA~Xdigo fuente.
       Pero al ser francA~Xs soy bien consciente de que la licencia no es la
       A~Xnica restricciA~Xn de la libertad del software: los programas libres
       no traducidos son inservibles para gente de habla no inglesa, y
       todavA~a queda bastante faena para hacerlos disponibles para todos.

       La percepciA~Xn de A~Xsta situaciA~Xn por los responsables del software
       libre ha mejorado drA~Xsticamente recientemente. Nosotros, como
       traductores, hemos ganado la primera batalla y hemos convencido a todo
       el mundo de la importancia de las traducciones. Pero por desgracia,
       A~Xsta era la parte fA~Xcil. Ahora tenemos que ponernos en marcha y
       empezar a traducir.

       Actualmente, el software libre se beneficia de un nivel decente de
       traducciA~Xn, gracias al maravilloso paquete de herramientas gettext.
       Este puede extraer las cadenas a traducir de un programa, presentarlas
       en un formato uniforme a los traductores, y luego usar el resultado de
       su trabajo en tiempo de ejecuciA~Xn para mostrar los mensajes
       traducidos al usuario.

       Pero la situaciA~Xn es bastante diferente para la documentaciA~Xn.
       Demasiado a menudo, la documentaciA~Xn traducida no es suficientemente
       visible (no se distribuye como parte del programa), sA~Xlo lo estA~X
       parcialmente, o no estA~X actualizada. La A~Xltima situaciA~Xn es la
       peor de todas. Para los usuarios, las traducciones anticuadas pueden
       ser peor que si no existiera la traducciA~Xn, si describen viejos
       comportamientos del programa que ya no se usan.

   El problema a solucionar
       Traducir documentaciA~Xn no es muy difA~cil por sA~ solo. Los textos
       son bastante mA~Xs largos que los mensajes de programa, y por lo tanto,
       tardan mA~Xs en traducirse, pero no se necesitan conocimientos
       tA~Xcnicos para hacerlo. La parte difA~cil llega cuando se debe
       mantener el trabajo. Detectar quA~X partes han cambiado y se necesitan
       actualizar es muy difA~cil, lleva a errores y es bastante desagradable.
       Creo que A~Xsto explica porquA~X tantas de las traducciones de
       documentaciA~Xn que hay por ahA~ estA~Xn anticuadas.

   Las respuestas de po4a
       Luego, el objetivo de po4a es hacer la traducciA~Xn de documentaciA~Xn
       mantenible. La idea es reusar la metodologA~a de gettext en A~Xste
       nuevo campo. Como en gettext, los textos se extraen de su
       localizaciA~Xn original, para ser presentados en un formato uniforme a
       los traductores. Las herramientas clA~Xsicas de gettext ayudan a
       actualizar el trabajo cuando aparece una nueva versiA~Xn del original.
       Pero a diferencia del modelo clA~Xsico de gettext, las traducciones son
       reinyectadas en la estructura del documento original de forma que
       pueden ser procesadas y distribuidas igual que la versiA~Xn inglesa.

       Gracias a esto, descubrir quA~X partes del documento han cambiado y se
       necesita actualizar se vuelve muy fA~Xcil. Otro punto fuerte es que las
       herramientas harA~Xn prA~Xcticamente toda la faena cuando la estructura
       del documento original se reorganice y cuando algunos capA~tulos se
       muevan, se junten o se separen. Al extraer el texto a traducir de la
       estructura del documento, tambiA~Xn le mantiene lejos de la complejidad
       del formateo de texto y reduce las oportunidades de daA~Xar el
       documento (aunque no le prevenga completamente de hacerlo).

       Por favor, lea tambiA~Xn las "Preguntas Frecuentes" mA~Xs abajo en
       A~Xste documento para una lista mA~Xs completa de ventajas y
       desventajas de esta soluciA~Xn.

   Formatos soportados
       Actualmente se han implementado satisfactoriamente algunos tipos de
       formatos de texto:

       nroff

       The good old manual pages’ format, used by so much programs out there.
       The po4a support is very welcome here since this format is somewhat
       difficult to use and not really friendly to the newbies.  The
       Locale::Po4a::Man(3pm) module also supports the mdoc format, used by
       the BSD man pages (they are also quite common on Linux).

       pod

       Este es el formato de DocumentaciA~Xn Online de Perl. El lenguaje y sus
       mismas extensiones estA~Xn documentadas asA~, igual que la mayorA~a de
       scripts de Perl. Hace muy fA~Xcil mantener la documentaciA~Xn cerca del
       cA~Xdigo al mezclarlos en el mismo archivo. Facilita la vida del
       programador, pero por desgracia, no la del traductor.

       sgml

       Aunque hoy en dA~a casi haya sido sustituido por XML, A~Xste formato
       aA~Xn es usado habitualmente para documentos mA~Xs extensos que algunas
       pantallas. Este permite hacer libros completos. Actualizar una
       traducciA~Xn de documentos tan largos puede ser realmente un infierno.
       A menudo diff se vuelve inA~Xtil cuando se ha reindentado el texto
       original despuA~Xs de la actualizaciA~Xn. Afortunadamente, po4a le
       puede ayudar en ese proceso.

       Actualmente, sA~Xlo estA~Xn soportados los DTDs de debiandoc y de
       docbook, pero aA~Xadir soporte para uno nuevo es realmente fA~Xcil.
       Incluso es posible usar po4a en un dtd desconocido de sgml sin cambiar
       el cA~Xdigo, pasando la informaciA~Xn necesaria en la lA~nea de
       comandos. Consulte Locale::Po4a::Sgml(3pm) para mA~Xs detalles.

       TeX / LaTeX

       The LaTeX format is a major documentation format used in the Free
       Software world and for publications.  The Locale::Po4a::LaTeX(3pm)
       module was tested with the Python documentation, a book and some
       presentations.

       texinfo

       All the GNU documentation is written in this format (that’s even one of
       the requirement to become an official GNU project).  The support for
       Locale::Po4a::Texinfo(3pm) in po4a is still at the beginning.  Please
       report bugs and feature requests.

       xml

       The XML format is a base format for many documentation formats.

       Currently, the docbook DTD is supported by po4a. See
       Locale::Po4a::Docbook(3pm) for details.

       otros

       Po4a tambiA~Xn puede tratar algunos formatos raros o especA~ficos, tal
       como la documentaciA~Xn de las opciones de compilaciA~Xn del kernel
       2.4.x o los diagramas producidos por la herramienta dia. AA~Xadir uno
       nuevo acostumbra a ser una tarea muy fA~Xcil y la tarea principal es
       conseguir un analizador para su formato. Consulte
       Locale::Po4a::TransTractor(3pm) para mA~Xs informaciA~Xn.

   Formatos no soportados
       Unfortunately, po4a still lacks support for several documentation
       formats.

       There is a whole bunch of other formats we would like to support in
       po4a, and not only documentation ones. Indeed, we aim at plugging all
       "market holes" left by the classical gettext tools.  It encompass
       package descriptions (deb and rpm), package installation scripts
       questions, package changelogs, and all specialized file formats used by
       the programs such as game scenarios or wine resource files.

AXCA~Xmo usar po4a?

       Este capA~tulo es como un manual de referencia, dA~Xnde se intenta
       contestar las preguntas de los usuarios, y se le ofrece una idea
       general del proceso. Le introduce al mA~Xtodo de trabajo con po4a y
       sirve como documentaciA~Xn introductoria de las herramientas especA~‐
       ficas.

   VisiA~Xn esquemA~Xtica
       El siguiente esquema le da una visiA~Xn global del proceso de
       traducciA~Xn de documentaciA~Xn usando po4a. No se asuste por su
       aparente complejidad, eso es debido a que aquA~ se representa el
       proceso completo. Una vez haya convertido su proyecto a po4a, sA~Xlo es
       relevante la parte derecha del grA~Xfico. En este ejemplo se habla de
       sgml, pero es aplicable a todos los mA~Xdulos. Cada parte del dibujo se
       detallarA~X en las prA~Xximas secciones.

         fr.sgml  original.sgml ---->--------+------>----------->-------+
            |         |                      |                          |
            V         V        { actualizaciA~Xn del original }           |
            |         |                      |                          |
            +--<---<--+                      V                          |
            |         |              original.new.sgml----->------->----+
            V         V                      |                          |
         [po4a-gettextize]      +--->---->---+                          |
            |         |         |            V                          |
            |         |         |     [po4a-updatepo]                   |
            |         V         ^            |                          V
            V    original.pot   |            V                          |
            |         |         |          fr.po                        |
            |         |         |         (difuso)                      |
            |   { traducciA~Xn }  |            |                          |
            |         |         ^            V                          V
            |         |         |     {ediciA~Xn manual}                  |
            V         V         |            |                          |
            |         |         |            V                          V
            |         |         +--<----   fr.po       apA~Xndice   original.sgml
            +---->----+---->------->--->  (al dia)    (opcional)    (al dA~a)
                                             |            |             |
                                             v            v             v
                                             +------>-----+------<------+
                                                          |
                                                          v
                                                  [po4a-translate]
                                                          |
                                                          V
                                                       fr.sgml
                                                      (al dia)

       En la parte izquierda se muestra la conversiA~Xn de una traducciA~Xn
       que no usa po4a a este sistema. Arriba de la parte derecha se
       representa la acciA~Xn del autor original (actualizar la
       documentaciA~Xn). En medio de la parte derecha se simbolizan las
       acciones automA~Xticas de po4a. Se extrae el nuevo material, y se
       compara con la traducciA~Xn existente. Se encuentran las partes que no
       han cambiado, y se usa la traducciA~Xn previa. Las partes parcialmente
       modificadas tambiA~Xn se conectan con la traducciA~Xn anterior, pero se
       aA~Xade un marcador indicando que la traducciA~Xn se debe actualizar.
       La parte de abajo de la figura muestra como se construye el documento
       formateado.

       Actualmente, como traductor, la A~Xnica operaciA~Xn manual que debe
       hacer es la parte marcada como {ediciA~Xn manual}. Si, lo siento, pero
       po4a le ayuda a traducir. No traduce nada sA~Xlo...

   AXCA~Xmo empezar una nueva traducciA~Xn?
       Esta secciA~Xn presenta los pasos necesarios para iniciar una nueva
       traducciA~Xn con po4a. Los refinamientos involucrados en la
       conversiA~Xn de un proyecto existente al este sistema se detallan en la
       secciA~Xn pertinente.

       Para iniciar una nueva traducciA~Xn utilizando po4a, debe seguir los
       siguientes pasos:

       - Extraer el texto que se tiene que traducir del documento original a
         un nuevo archivo pot (el formato de gettext). Para hacerlo puede usar
         el programa po4a-gettextize asA~:

           $ po4a-gettextize -f <formato> -m <principal.doc> -p <traducciA~Xn.pot>

         <formato> es naturalmente el formato usado en el documento
         <principal.doc>. Tal como era de esperar, la salida va a
         <traducciA~Xn.pot>.  Consulte po4a-gettextize(1) para mA~Xs detalles
         sobre las opciones existentes.

       - Ahora toca traducir lo que se deba. Para eso, cambie el nombre del
         fichero pot a doc.XX.po, por ejemplo (donde XX es el cA~Xdigo ISO639
         del idioma al que estA~X traduciendo, por ejemplo "fr" para el
         francA~Xs), y edite el fichero resultante. A menudo es buena idea no
         llamar al fichero XX.po para evitar confusiones con la traducciA~Xn
         de los mensajes de programa, pero eso es cosa suya.  No se olvide de
         actualizar las cabeceras de los ficheros po, son importantes.

         La traducciA~Xn en sA~ misma se puede hacer con el modo po de Emacs o
         kbabel (basado en KDE) o gtranslator (basado en GNOME), o cualquier
         programa que prefiera. Incluso el clA~Xsico vi puede bastar, aunque
         no tenga un modo especializado para esta tarea.

         Si quiere aprender mA~Xs, definitivamente debe consultar la
         documentaciA~Xn de gettext, disponible en el paquete gettext-doc.

   AXCA~Xmo transformar la traducciA~Xn de vuelta a un archivo de
       documentaciA~Xn?
       Una vez haya terminado la traducciA~Xn, querrA~X obtener la
       documentaciA~Xn traducida para distribuirla a los usuarios junto con el
       original. Para eso, utilice el programa po4a-translate(1) asA~ (donde
       XX es el cA~Xdigo del idioma):

         $ po4a-translate -f <format> -m <master.doc> -p <doc.XX.po> -l <XX.doc>

       Igual que antes, <formato> es el formato usado en el documento
       <principal.doc>. Pero esta vez el fichero po pasado con el parA~Xmetro
       -p es parte de la entrada. Esta es su traducciA~Xn. La salida va a
       <XX.doc>

       Consulte po4a-translate(1) para mA~Xs detalles.

   AXCA~Xmo actualizar una traducciA~Xn con po4a?
       Para actualizar su traducciA~Xn cuando el fichero original cambie, use
       el programa po4a-updatepo(1) asA~:

         $ po4a-updatepo -f <formato> -m <nuevo_original.doc> -p <existente.XX.po>

       (Consulte po4a-updatepo(1) para mA~Xs detalles)

       Naturalmente, los nuevos pA~Xrrafos del documento no se traducirA~Xn
       mA~Xgicamente en el fichero "po" con esta operaciA~Xn, y necesitarA~X
       actualizar el fichero "po" manualmente. Asimismo, puede tener que
       rehacer las traducciones de los pA~Xrrafos que se hayan modificado un
       poco. Para asegurar que no se olvidarA~X ninguna, se marcan como
       "difusas" durante el proceso, y deberA~X quitar la marca manualmente
       antes que se pueda usar la traducciA~Xn en po4a-translate.  Igual que
       para la traducciA~Xn inicial, aquA~ lo mejor es usar su editor po
       favorito.

       Una vez su fichero "po" estA~X otra vez actualizado, sin ninguna cadena
       por traducir ni cadenas difusas, puede generar el fichero de
       documentaciA~Xn traducido, tal como se ha explicado en la secciA~Xn
       anterior.

   AXCA~Xmo convertir una traducciA~Xn ya existente a po4a?
       Seguramente usted acostumbraba a traducir manualmente el documento
       felizmente hasta que llegA~X una reorganizaciA~Xn del documento
       original. Entonces, despuA~Xs de algunos intentos fracasados con diff o
       herramientas similares, quiere pasarse a po4a. Pero por supuesto, no
       quiere perder su proceso de traducciA~Xn. No se preocupe, las
       herramientas po4a tambiA~Xn tienen en cuenta este caso, se llama
       gettextizaciA~Xn.

       La condiciA~Xn mA~Xs importante es que tanto el documento traducido
       como el original tengan la misma estructura de forma que las
       herramientas puedan encajar los contenidos correctamente.

       Si estA~X de suerte (es decir, si las estructuras de ambos documentos
       encajan a la perfecciA~Xn), todo funcionarA~X a la perfecciA~Xn y
       habrA~X terminado en unos segundos. En caso contrario, deberA~X
       entender porquA~X este proceso tiene un nombre tan feo, y deberA~a
       estar preparado para un poco de faena sucia. De cualquier forma,
       recuerde que este es el precio a pagar para conseguir luego la
       comodidad de po4a. Y la mejor parte es que solo deberA~X hacer esto una
       vez.

       No puedo emfatizarlo mA~Xs. Para facilitar el proceso, es importante
       encontrar la versiA~Xn exacta que se usA~X en la traducciA~Xn. La mejor
       situaciA~Xn se da cuando se anotA~X quA~X revisiA~Xn del cvs se usA~X
       para la traducciA~Xn y no se modificA~X durante el proceso de
       traducciA~Xn, de forma que pueda usarla.

       No funcionarA~X bien si usa el texto original actualizado con una
       traducciA~Xn vieja. Es un proceso posible, pero mA~Xs difA~cil, y
       realmente se debe evitar en la medida que sea posible. De hecho,
       imagino que si no consigue encontrar el texto original, la mejor
       soluciA~Xn es encontrar a alguien que haga la gettextizaciA~Xn por
       usted (pero por favor, que no sea yo ;).

       QuizA~X sea demasiado catastrA~Xfico. Aunque las cosas vayan mal, sigue
       siendo mucho mA~Xs rA~Xpido que traducirlo todo otra vez. Yo hice la
       gettextizaciA~Xn de la traducciA~Xn al francA~Xs existente de la
       documentaciA~Xn de Perl en un dA~a, a pesar de que las cosas fueron
       mal. Eran mA~Xs de dos megabytes de texto, y una traducciA~Xn nueva
       hubiera podido durar como mA~nimo meses.

       PermA~tame explicar primero las bases del proceso, y luego ya
       volveremos a los trucos para conseguirlo cuando el proceso vaya mal.
       Para facilitar la comprensiA~Xn, se toma otra vez como ejemplo el
       mA~Xdulo sgml, pero no importa el formato usado:

       Una vez haya conseguido el original viejo, la gettextizaciA~Xn puede
       ser tan fA~Xcil como:

        $ po4a-gettextize -f <format> -m <old.original> -l <old.translation> -p <doc.XX.po>

       Si estA~X de suerte, eso es todo. Ha convertido su vieja traducciA~Xn a
       po4a y ya puede empezar con la tarea de actualizaciA~Xn. Simplemente
       siga el proceso explicado unas secciones antes para sincronizar su
       fichero po con el documento original mA~Xs nuevo, y actualice la
       traducciA~Xn segA~Xn convenga.

       Tenga en cuenta que aunque parezca que todo ha ido bien, aA~Xn queda
       lugar para los errores en este proceso. El caso es que po4a no es capaz
       de entender el texto para asegurarse de que la traducciA~Xn se refiere
       al original dado. Es por eso que las cadenas se marcan como "difusas"
       durante el proceso. Debe comprobar cuidadosamente cada cadena antes de
       eliminar la marca.

       A menudo las estructuras de los documentos no encajan a la
       perfecciA~Xn, impidiendo a po4a-gettextize realizar su tarea. Llegados
       a este punto, todo el juego se traslada a la ediciA~Xn de los ficheros
       para hacer encajar sus malditas estructuras.

       Le puede ayudar leer la secciA~Xn "GettextizaciA~Xn: AXCA~Xmo
       funciona?" de mA~Xs abajo. La comprensiA~Xn del funcionamiento interno
       del proceso le ayudarA~X a hacerlo funcionar. El punto bueno es que
       po4a-gettextize da mucha informaciA~Xn cuando algo no va bien. Primero,
       apunta dA~Xnde se encontrA~X la discrepancia de estructuras en los
       documentos. Luego le mostrarA~X las cadenas que no encajan, su
       posiciA~Xn en el texto, y el tipo de cada una. AdemA~Xs, el fichero po
       generado hasta el momento se guardarA~X en gettextization.failed.po.

       -   Elimine todas las partes extra de las traducciones, como secciones
           donde se especifique el nombre del traductor, o los agradecimientos
           de gente que colaborA~X con la traducciA~Xn. Los apA~Xndices,
           descritos en la siguiente secciA~Xn, le permitirA~Xn volver a
           aA~Xadir estos contenidos.

       -   No dude de editar tanto el original como la traducciA~Xn. Lo mA~Xs
           importante es conseguir el fichero po. Ya tendrA~X tiempo de
           actualizarlo luego. Una vez dicho esto, es preferible editar la
           traducciA~Xn cuando se puedan editar ambos, ya que esto facilita
           las cosas una vez se termine la gettextizaciA~Xn.

       -   Si es necesario, elimine algunas partes del original si no estaban
           traducidas. Cuando mA~Xs adelante sincronice el po con el
           documento, volverA~Xn por sA~ solas.

       -   Si cambiA~X un poco la estructura (para juntar dos pA~Xrrafos, o
           partir alguno), deshaga esos cambios. Si se trata de un asunto con
           el original, debe informar al autor original del texto. Arreglarlo
           solo en la traducciA~Xn solo ofrece la soluciA~Xn a una parte de la
           comunidad. Y ademA~Xs, es imposible cuando se usa po4a ;)

       -   A veces el contenido del pA~Xrrafo encaja, pero su tipo no.
           Arreglar eso depende mucho del formato. En pod y nroff, a menudo es
           culpa de que una de las dos lA~neas empieza con un espacio y la
           otra no. En estos formatos, este pA~Xrrafo no podrA~a justificarse
           y se volverA~a de un tipo diferente. Simplemente elimine el espacio
           y ya estA~X. TambiA~Xn puede tratarse de un error tipogrA~Xfico en
           el nombre del tag.

           AdemA~Xs, dos pA~Xrrafos pueden juntarse en el pod cuando la lA~nea
           de separaciA~Xn contiene algunos espacios, o cuando no hay una lA~‐
           nea de separaciA~Xn antes de la lA~nea =item y del contenido del
           elemento.

       -   A veces, hay una desincronizaciA~Xn entre archivos, y la
           traducciA~Xn se encaja con un pA~Xrrafo original equivocado. Este
           es un signo de que ya habA~a un problema antes de juntar los
           ficheros. Compruebe gettextization.failed.po para ver cuando
           empieza la desincronizaciA~Xn, y arrA~Xglelo allA~.

       -   A veces le puede dar la impresiA~Xn que po4a se comiA~X algunas
           partes del texto, ya sea del original o de la traducciA~Xn.
           gettextization.failed.po indica que ambos encajaban correctamente,
           y luego fallA~X porque intentA~X encajar un pA~Xrrafo con el
           anterior o el posterior al correcto, como si el correcto hubiera
           desaparecido. Maldiga po4a como yo hice la primera vez que me
           pasA~X. Abundantemente.

           Esta situaciA~Xn se debe a que el mismo pA~Xrrafo se repite a lo
           largo del documento. En ese caso, no se crea una nueva entrada en
           el fichero po, sino que se le aA~Xade una nueva referencia a la ya
           existente.

           Por lo tanto, cuando el mismo pA~Xrrafo aparece dos veces en el
           original pero no estA~X traducido exactamente igual cada vez,
           tendrA~X esa sensaciA~Xn de que desapareciA~X un pA~Xrrafo del
           original. Simplemente elimine la nueva traducciA~Xn. Si cree que la
           segunda traducciA~Xn es mejor, quA~tela de donde estA~X, y
           sustituya a la primera.

           En el caso contrario, si hay dos pA~Xrrafos parecidos pero
           diferentes que se tradujeron de la misma forma, le puede dar la
           impresiA~Xn de que desapareciA~X un pA~Xrrafo de la traducciA~Xn.
           La soluciA~Xn es aA~Xadir una cadena estA~Xpida al pA~Xrrafo
           original (algo como "soy diferente") para solucionarlo. No se
           asuste. Estas cosas desaparecerA~Xn durante la sincronizaciA~Xn, y
           cuando el texto aA~Xadido sea suficientemente corto, gettext
           encajara su traducciA~Xn con el texto existente (marcA~Xndolo como
           difuso, pero no importa, ya que todas las cadenas se marcan como
           difusas durante la gettextizaciA~Xn).

       Con un poco de suerte estos trucos le ayudarA~Xn a realizar su
       gettextizaciA~Xn y a obtener su preciado fichero po. Ahora estA~X
       preparado para sincronizar su fichero y empezar la traducciA~Xn. Tenga
       en cuenta que en textos grandes la primera sincronizaciA~Xn puede
       tardar mucho tiempo.

       Por ejemplo, el primer po4a-updatepo de la traducciA~Xn al francA~Xs de
       la documentaciA~Xn de Perl (un fichero po de 5.5 Mb) tomA~X alrededor
       de dos dias enteros en una mA~Xquina G5 a 1Ghz. Si, 48 horas. Pero las
       siguientes veces tan solo tardaba una docena de segundos en mi viejo
       portatil. Eso es porque la primera vez, la mayorA~a de msgids del
       fichero po no encajan con ninguno de los del fichero pot. Eso obliga a
       gettext a buscar la cadena mA~Xs parecida usando un costoso algoritmo
       de proximidad de cadenas.

   AXCA~Xmo aA~Xadir texto extra en las traducciones (como el nombre del
       traductor)?
       Debido al uso de gettext, esto se vuelve mA~Xs difA~cil en po4a que
       antes, que simplemente se editaba el nuevo fichero paralelamente al
       original. Pero sigue siendo posible, gracias a los llamados
       apA~Xndices.

       Para ayudar a la comprensiA~Xn, considere los apA~Xndices como unos
       parches aplicados al documento traducido despuA~Xs del proceso. Son
       bastante diferentes que los parches habituales (solo tienen una lA~nea
       de contexto, que puede incluir una expresiA~Xn regular de perl, y
       A~Xnicamente puede aA~Xadir texto, sin eliminar nada), pero las
       funcionalidades son las mismas.

       Su objetivo es permitir al traductor aA~Xadir contenido extra al
       documento, que no es traducciA~Xn del documento original. El uso mA~Xs
       habitual es aA~Xadir una secciA~Xn sobre la traducciA~Xn en sA~ misma,
       listando los colaboradores y explicando como informar de los errores de
       la traducciA~Xn.

       Los apA~Xndices se deben proporcionar como ficheros a parte. La primera
       lA~nea forma una cabecera que indica el lugar del documento resultante
       donde se debe colocar. El resto del fichero de apA~Xndice se
       aA~XadirA~X tal cual en la posiciA~Xn determinada del documento
       resultante.

       La cabecera tiene una sintaxis muy rA~gida: debe empezar con la cadena
       "PO4A-HEADER:", seguida por una lista de campos "llave=valor" separados
       por punto y coma (;). Los espacios en blanco SON importantes. Tenga en
       cuenta que no puede usar el caracter punto y coma (;) en los valores, y
       que las comillas no ayudan.

       Una vez mA~Xs, suena espantoso, pero los ejemplos de mA~Xs abajo
       deberA~an ayudarle a encontrar la forma de escribir la lA~nea de
       cabecera que necesita. Para ilustrar la discusiA~Xn, asuma que quiere
       aA~Xadir una secciA~Xn llamada "Sobre esta traducciA~Xn" despuA~Xs de
       la llamada "Sobre este documento".

       AquA~ hay las posibles llaves de la cabecera:

       position (obligatoria)
           una expresiA~Xn regular. Se colocarA~X el apA~Xndice cerca de la
           lA~nea que encaje con esta expresiA~Xn regular.  Tenga en cuenta
           que estamos hablando del documento traducido, no del original. Si
           hay mA~Xs de una linea que encaje (o ninguna), la adiciA~Xn
           fallarA~X. Siempre es mejor dar un error que insertar el apA~Xndice
           en el sitio equivocado.

           A continuaciA~Xn, esta lA~nea se llamarA~X punto de posiciA~Xn. El
           punto donde se insertarA~X el apA~Xndice se llamarA~X punto de
           inserciA~Xn. Estos dos puntos son muy cercanos, pero no iguales.
           Por ejemplo, si desea insertar una nueva secciA~Xn, es mA~Xs
           fA~Xcil poner el punto de posiciA~Xn en el tA~tulo de la secciA~Xn
           anterior, y explicarle a po4a donde termina la secciA~Xn (recuerde
           que el punto de posiciA~Xn viene dado por la expresiA~Xn regular,
           que debe encajar una A~Xnica linea).

           La localizaciA~Xn del punto de inserciA~Xn respecto al punto de
           posiciA~Xn estA~X controlado por los campos "mode", "beginboundary"
           y "endboundary" que se explican a continuaciA~Xn.

           En nuestro caso tendrA~amos:

                position=<title>Sobre este documento</title>

       mode (obligatoria)
           Puede valer "before" (antes) o "after" (despuA~Xs), especificando
           la posiciA~Xn del apA~Xndice, relativa al punto de posiciA~Xn.

           Como queremos que la nueva secciA~Xn se situe debajo de la que
           hemos encajado, tenemos:

                mode=after

       beginboundary (usada sA~Xlo cuando mode=after, y obligatoria en este
       caso)
       endboundary (A~dem)
           ExpresiA~Xn regular que encaje el final de la secciA~Xn despuA~Xs
           del que va el apA~Xndice.

           Cuando mode=after, el punto de inserciA~Xn estA~X despuA~Xs del
           punto de posiciA~Xn, pero no justamente despuA~Xs! EstA~X situado
           al final de la secciA~Xn que empieza en el punto de posiciA~Xn, es
           decir, antes o despuA~Xs de la lA~nea encajada por el parA~Xmetro
           "???boundary", dependiendo de si usA~X "beginboundary" o
           "endboundary".

           En nuestro caso, podemos decidirnos por indicar el final de la
           secciA~Xn que encajamos aA~Xadiendo:

              endboundary=</section>

           o indicar el principio de la siguiente secciA~Xn indicando:

              beginboundary=<section>

           En ambos casos, se colocarA~X nuestro apA~Xndice despuA~Xs de
           </section> y antes de <section>. La primera opciA~Xn es mejor
           porque funcionarA~X aunque se reorganice el documento.

           Las dos formas existen debido a que los formatos de documentaciA~Xn
           son diferentes. En algunos de ellos, hay una forma de marcar el
           final de una secciA~Xn (tal como el "</section>" que hemos usado),
           mientras que otros no marcan explA~citamente el final de una
           secciA~Xn (como en nroff). En el primer caso, es preferible encajar
           un boundary con el final de secciA~Xn, para que el punto de
           inserciA~Xn venga despuA~Xs. En el segundo caso, deberA~X encajar
           un boundary con el principio de la siguiente secciA~Xn para que el
           punto de inserciA~Xn venga justo antes suyo.

       Puede parecer oscuro, pero espero que los prA~Xximos ejemplos le
       iluminen.

       Para concluir el ejemplo usado hasta el momento, para insertar una
       secciA~Xn llamada "Sobre esta traducciA~Xn" despuA~Xs de la secciA~Xn
       "Sobre este documento" en un documento sgml, debe usar una de estas
       lA~neas de cabecera:
          PO4A-HEADER: mode=after; position=Sobre este documento; endboundary=</section>
          PO4A-HEADER: mode=after; position=Sobre este documento; beginboundary=<section>

       Si quiere aA~Xadir algo despuA~Xs de la siguiente secciA~Xn de nroff:
           .SH "AUTORES"

         Debe poner un "position" que encaje esta linea, y un "beginboundary"
         que encaje el principio de la siguiente secciA~Xn (es decir "^\.SH").
         Entonces el apA~Xndice se aA~XadirA~X despuA~Xs del punto de
         posiciA~Xn e immediatamente antes de la primera lA~nea que encaje el
         "beginboundary". AsA~ es:

          PO4A-HEADER:mode=after;position=AUTORES;beginboundary=\.SH

       Si desea aA~Xadir algo dentro de una secciA~Xn (como despuA~Xs de
       "Copyright Big Dude") en vez de aA~Xadir una secciA~Xn completa, ponga
       un "position" que encaje con esta lA~nea, y ponga un "beginboundary"
       que encaje cualquier linea.
          PO4A-HEADER:mode=after;position=Copyright Big Dude, 2004;beginboundary=^

       Si desea aA~Xadir algo al final del documento, especifique un
       "position" que encaje cualquier linea del documento (pero sA~Xlo una
       lA~nea. Po4a no procederA~X si no es A~Xnica), y ponga un "endboundary"
       que no encaje con nada. No utilice cadenas simples como ""EOF"", sino
       las que tengan menos probabilidad de salir en el documento.
          PO4A-HEADER:mode=after;position=<title>Acerca de</title>;beginboundary=BoundaryFalsoDePo4a

       En cualquier caso, recuerde que se trata de expresiones regulares. Por
       ejemplo, si desea encajar el final de una secciA~Xn de nroff que
       termine con la lA~nea

         .fi

       no utilice ".fi" como endboundary, porque esto encajarA~X con "el[
       fi]chero", que obviamente no es lo que esperA~Xbamos. El endboundary
       correcto en este caso serA~a: "^\.fi$".

       Si el apA~Xndice no va donde esperaba, pruebe pasando el parA~Xmetro
       -vv a las herramientas, para que le explique quA~X hace al colocar el
       apA~Xndice.

       Ejemplo mA~Xs detallado

       Documento original (en formato pod):

        |=head1 NAME
        |
        |dummy - a dummy program
        |
        |=head1 AUTHOR
        |
        |me

       Luego, el siguiente apA~Xndice asegurarA~X que se aA~Xade una secciA~Xn
       (en espaA~Xol) sobre el traductor al final del fichero.

        |PO4A-HEADER:mode=after;position=AUTOR;beginboundary=^=head
        |
        |=head1 TRADUCTOR
        |
        |yo

       Para poner su apA~Xndice antes de AUTHOR, utilice la siguiente
       cabecera:

        PO4A-HEADER:mode=after;position=NOMBRE;beginboundary=^=head1

       Esto funciona porque la siguiente linea que encaja el beginboundary
       /^=head1/ despuA~Xs de la secciA~Xn "NAME" (traducido a "NOMBRE" en
       espaA~Xol), es la que declara los autores. Por lo tanto, se colocarA~X
       el apA~Xndice entre ambas secciones.

   AXCA~Xmo hacer todo esto en una sola invocaciA~Xn a programa?
       El uso de po4a ha demostrado que puede dar lugar a errores ya que se
       debe llamar a dos programas diferentes en el orden adecuado
       (po4a-updatepo y luego po4a-translate), y cada uno necesita mA~Xs de 3
       parA~Xmetros. AdemA~Xs, era difA~cil con este sistema usar solo un
       fichero po para todos los documentos cuando se usaba mA~Xs de un
       formato.

       El programa po4a(1) se diseA~XA~X para solucionar esas dificultades.
       Una vez su proyecto se haya convertido al sistema, usted escribe un
       simple fichero de configuraciA~Xn explicando dA~Xnde estA~Xn los
       ficheros de traducciA~Xn (po y pot), dA~Xnde estA~Xn los documentos
       originales, sus formatos, y dA~Xnde se deben guardar las traducciones.

       Luego, una simple llamada a po4a(1) con este fichero asegura que los
       ficheros po se sincronicen con el documento original, y que se generan
       correctamente los documentos traducidos. Por supuesto, le interesarA~X
       llamar el programa dos veces: una antes de editar el fichero po para
       actualizarlo, y otra para actualizar completamente los documentos
       traducidos. Pero sA~Xlo necesita recordar una lA~nea de comandos.

AXCA~Xmo funciona?

       Este capA~tulo ofrece una breve explicaciA~Xn del funcionamiento
       interno de po4a, de forma que se pueda sentir mA~Xs seguro para
       ayudarnos a mantenerlo y mejorarlo. TambiA~Xn le puede ayudar a
       entender porquA~X no hace lo que esperaba, y cA~Xmo solucionar sus
       problemas.

   VisiA~Xn general
       La arquitectura de po4a es orientada a objetos (en Perl. Muy pulcro,
       no?). El antecesor de todas las clases analizadoras se llama
       TransTractor. Este extraA~Xo nombre viene del hecho de que al mismo
       tiempo se encarga de traducir el documento (translate) y de extraer las
       cadenas (extract).

       MA~Xs formalmente, toma un documento a traducir ademA~Xs del fichero po
       que contiene las traducciones a usar para producir dos salidas
       separadas: Otro fichero po (resultante de la extracciA~Xn de las
       cadenas traducibles del documento de entrada), y un documento traducido
       (con la misma estructura que el de entrada, pero con las cadenas
       traducibles reemplazadas por el contenido del po de entrada). AquA~ hay
       una representaciA~Xn grA~Xfica:

          Documento de entrada -\                        /---> Documento de salida
                                 \    TransTractor::    /         (traducido)
                                  +-->--  parse()  ----+
                                 /                       \
          po de entrada --------/                         \---> po de salida
                                                                  (extraA~do)

       Esta pequeA~Xa estructura es el nA~Xcleo de toda la arquitectura de
       po4a. Si omite el po de entrada y el documento de salida, obtiene
       po4a-gettextize. Si proporciona ambas entradas y descarta el po de
       salida, obtiene po4a-translate.

       TransTractor::parse() es una funciA~Xn virtual implementada por cada
       mA~Xdulo. AquA~ hay un pequeA~Xo ejemplo que muestra como funciona.
       Analiza una lista de pA~Xrrafos, cada uno empezando con <p>

         1 sub parse {
         2   PARRAFO: while (1) {
         3     $my ($parrafo,$parraref,$linea,$lref)=("","","","");
         4     $my $primera=1;
         5     while (($linea,$lref)=$document->shiftline() && defined($linea)) {
         6       if ($line =~ m/<p>/ && !$primera--; ) {
         7         $document->unshiftline($linea,$lref);
         8
         9         $parrafo =~ s/^<p>//s;
        10         $document->pushline("<p>".$document->translate($parrafo,$parraref));
        11
        12         next PARRAFO;
        13       } else {
        14         $parrafo .= $linea;
        15         $parraref = $lref unless(length($parraref));
        16       }
        17     }
        18     return; # No tenemos la lA~nea definida? Final del archivo de entrada.
        19   }
        20 }

       En la lA~nea 6, encontramos <p> por segunda vez. Esta es la seA~Xal de
       que hemos encontrado el siguiente pA~Xrrafo. Entonces debemos devolver
       la lA~nea obtenida de vuelta al documento (lA~nea 7) y enviar el
       pA~Xrrafo que hemos construido hacia la salida. DespuA~Xs de eliminar
       el <p> inicial, en la lA~nea 9, insertamos la concatenaciA~Xn del tag
       con la traducciA~Xn del resto del pA~Xrrafo.

       Esta funciA~Xn translate() estA~X muy bien. EnvA~a su parA~Xmetro hacia
       el fichero po de salida (extracciA~Xn) y devuelve su traducciA~Xn como
       se encuentre en el fichero po de entrada (traducciA~Xn). Como es usada
       como parte del parA~Xmetro de pushline(), esta traducciA~Xn pasa hacia
       el documento de salida.

       Como mola, no? Es posible construir un mA~Xdulo completo de po4a en
       menos de 20 lA~neas si el formato es suficientemente simple...

       EncontrarA~X mA~Xs sobre esto en Locale::Po4a::TransTractor(3pm).

   GettextizaciA~Xn: AXCA~Xmo funciona?
       La idea aquA~ es tomar el documento original y su traducciA~Xn, y
       considerar que la enA~Xsima cadena extraida de la traducciA~Xn es la
       traducciA~Xn de la enA~Xsima cadena extraida del original. Para que
       funcione, ambos ficheros deben compartir exactamente la misma
       estructura. Por ejemplo, si los ficheros tienen la siguiente
       estructura, es muy poco probable que la cuarta cadena de la
       traducciA~Xn (de tipo ’capA~tulo’) sea la traducciA~Xn de la cuarta
       cadena del original (de tipo ’pA~Xrrafo’).

           Original         TraducciA~Xn

         capA~tulo           capA~tulo
           pA~Xrrafo            pA~Xrrafo
           pA~Xrrafo            pA~Xrrafo
           pA~Xrrafo          capA~tulo
         capA~tulo             pA~Xrrafo
           pA~Xrrafo            pA~Xrrafo

       Para eso, los analizadores de po4a se utilizan tanto para el fichero
       original como para el traducido para extraer los ficheros po, y luego
       se construye un tercer fichero po a partir de ellos tomando las cadenas
       del segundo como traducciones de las del primero. Para comprobar que
       las cadenas que juntamos se correspondan, los analizadores de
       documentos de po4a deben dar informaciA~Xn sobre el tipo sintA~Xctico
       de las cadenas extraA~das en el documento (todos los que hay lo hacen,
       el suyo tambiA~Xn lo tiene que hacer). Luego se utiliza esa
       informaciA~Xn para asegurar que ambos documentos tienen la misma
       sintaxis. En el ejemplo anterior, nos permitirA~a detectar que la
       cuarta cadena es un pA~Xrrafo en un caso, y un tA~tulo de capA~tulo en
       el otro, y tratarlo como un error.

       En teoria, la detecciA~Xn de este problema serA~a posible, y se
       resincronizan los ficheros luego (igual que hace diff). Pero no estA~X
       claro quA~X deberA~amos hacer con las cadenas antes de las
       desincronizaciones, y podrA~a producir malos resultados a veces. Es por
       eso que la implementaciA~Xn actual no intenta resincronizar nada, e
       informa extensamente del fallo cuando algo va mal, requiriendo la
       modificaciA~Xn manual de los ficheros para arreglar el problema.

       Incluso con estas precauciones, las cosas se pueden estropear muy
       fA~Xcilmente. Es por eso que todas las traducciones encontradas asA~ se
       marcan como difusas, para asegurar que el traductor las repase y las
       corrija.

   ApA~Xndices: AXCA~Xmo funcionan?
       Bien, esto es muy simple. El documento traducido no se escribe
       directamente al disco, sino que se mantiene en memoria hasta que se
       aplican todos los apA~Xndices. Los algoritmos involucrados son
       sencillos. Buscamos una lA~nea que encaje con la expresiA~Xn regular de
       posiciA~Xn, e insertamos el apA~Xndice antes si estaba en mode=before.
       Sino, buscamos la siguiente linea que encaje en el rango e insertamos
       el apA~Xndice despuA~Xs de esta lA~nea si es un "endboundary" o antes
       de esta lA~nea si es un "beginboundary".

Preguntas Frecuentes

       Este capA~tulo agrupa las Preguntas Frecuentes. De hecho, la mayoria de
       preguntas actuales se pueden formular asA~: "AXPorquA~X se ha
       diseA~Xado asA~, y no asA~?" Si piensa que po4a no es la soluciA~Xn
       ideal para la traducciA~Xn de documentaciA~Xn, deberA~a considerar leer
       A~Xsta secciA~Xn. Si no responde su pregunta, contacte con nosotros en
       la lista de correo <po4a-devel@lists.alioth.debian.org>. Queremos
       escuchar su opiniA~Xn.

   AXPorquA~X traducir cada pA~Xrrafo por separado?
       Si, en po4a, cada pA~Xrrafo se traduce por separado (de hecho, cada
       mA~Xdulo lo decide, pero todos los existentes lo hacen, y los suyos
       deben hacerlo tambiA~Xn).  Hay dos ventajas principales al hacerlo
       asA~:

       · Cuando las partes tA~Xcnicas del documento se esconden, el traductor
         no se puede confundir con ellas. Como menos marcas presentemos al
         traductor, menos errores podrA~X hacer.

       · El hecho de cortar el documento ayuda a aislar los cambios en el
         documento original. Cuando se modifica el original, es fA~Xcil
         encontrar quA~X partes de la traducciA~Xn se necesita actualizar con
         este proceso.

       Incluso con estas ventajas, a alguna gente no le gusta la idea de
       traducir cada pA~Xrrafo por separado. AquA~ hay algunas respuestas que
       les puedo dar:

       · Esta idea ha mostrado resultados satisfactorios en el proyecto KDE y
         permite a la gente producir la cantidad mA~Xs grande de
         documentaciA~Xn traducida y actualizada que conozco.

       · Los traductores aA~Xn pueden usar el contexto para traducir, ya que
         las cadenas del fichero po estA~Xn en el mismo orden que las del
         documento original. Traducir secuencialmente es comparable a usar
         po4a o no.  Y en cualquier caso, la mejor forma de obtener el
         contexto sigue siendo el convertir el documento a un formato
         imprimible, ya que los textos formateados no son leA~bles, en mi
         opiniA~Xn.

       · Los traductores profesionales utilizan esta aproximaciA~Xn. Estoy de
         acuerdo en que ellos tienen diferentes objetivos que los traductores
         de cA~Xdigo abierto. Por ejemplo, el mantenimiento les es a menudo
         menos crA~tico, ya que el contenido cambia muy poco.

   AXPorquA~X no realizar las divisiones a nivel de frases (o menores)?
       A veces las herramientas de traducciA~Xn profesionales parten los
       documentos a nivel de frases para maximizar la reusabilidad de las
       traducciones previas, y acelerar el proceso. El problema es que la
       misma frase puede tener varias traducciones, dependiendo del contexto.

       Los pA~Xrrafos son por definiciA~Xn mA~Xs largos que las frases. Con un
       poco de suerte se podrA~X asegurar que si se tiene el mismo pA~Xrrafo
       en dos documentos, tendrA~Xn el mismo significado (y traducciA~Xn), sin
       importar el contexto de cada caso.

       Partirlo en partes mA~Xs pequeA~Xas que frases serA~a muy malo. PodrA~a
       tomar mucho tiempo explicar el motivo aquA~, pero si le interesa puede
       consultar la pA~Xgina de manual de Locale::Maketext::TPJ13(3pm) (que
       viene con la documentaciA~Xn de Perl), por ejemplo. Brevemente, cada
       idioma tiene sus reglas de sintaxis especA~ficas, y no hay forma de
       construir frases encajando partes de frases para todos los idiomas
       existentes (incluso para 5 de los 10 idiomas mA~Xs hablados, o incluso
       menos).

   AXPorquA~X no se pone el original como comentario junto con la traducciA~Xn
       (o de otra forma)?
       A simple vista, gettext no parece estar adaptado a todos los tipos de
       traducciones. Por ejemplo, no parecA~a adaptado a debconf, la interfaz
       que usan todos los paquetes de Debian para sus interacciones con el
       usuario durante la instalaciA~Xn. En ese caso, los textos a traducir
       eran muy cortos (una docena de lineas para cada paquete), y era muy
       difA~cil poner las traducciones en un fichero especA~fico ya que tiene
       que estar disponible antes de la instalaciA~Xn del paquete.

       Es por eso que los desarrolladores de debconf decidieron implementar
       otra soluciA~Xn, donde las traducciones estuvieran situadas en el mismo
       fichero que el original. Es bastante atractivo. Se podrA~a querer
       hacerlo en xml, por ejemplo. TendrA~a esta pinta:

        <section>
         <title lang="en">My title</title>
         <title lang="fr">Mon titre</title>

         <para>
          <text lang="en">My text.</text>
          <text lang="fr">Mon texte.</text>
         </para>
        </section>

       Pero fue tan problemA~Xtico que se terminA~X usando una
       implementaciA~Xn basada en po. Solo se puede editar el original en el
       archivo, y las traducciones se deben hacer en los ficheros po extraA~‐
       dos del patrA~Xn principal (y vueltos al paquete en tiempo de
       compilaciA~Xn). El sistema antiguo se considerA~X obsoleto debido a
       varios problemas:

       ·   problemas de mantenimiento

           Si varios traductores envA~an un parches a la vez, es difA~cil de
           juntarlos.

           AXComo detectarA~X los cambios en el original, que se deban aplicar
           a las traducciones? Para poder usar diff, se debe tener en cuenta
           quA~X version del original se tradujo. Es decir, se necesita un
           fichero po en su fichero ;)

       ·   problemas de codificaciA~Xn

           La soluciA~Xn es viable cuando solo se utilizan idiomas europeos,
           pero la introducciA~Xn del Koreano, Ruso y/o Arabe complica
           realmente la cosa. La soluciA~Xn serA~a UTF, pero aA~Xn hay algunos
           problemas con A~Xl.

           AdemA~Xs, estos problemas son difA~ciles de detectar (es decir,
           solo los lectores Koreanos detectarA~Xn que falla la codificaciA~Xn
           del Koreano [por culpa del traductor ruso])

       gettext soluciona todos estos problemas a la vez.

   AXPero gettext no se diseA~XA~X para este uso!
       Es cierto, pero hasta el momento nadie ha propuesto una soluciA~Xn
       mejor. La A~Xnica alternativa conocida es la traducciA~Xn manual, con
       todos los problemas de mantenimiento.

   AXQuA~X hay de las otras herramientas de traducciA~Xn de documentaciA~Xn
       que usan gettext?
       Hasta donde yo sA~X, sA~Xlo hay dos de ellas:

       poxml
           Esta es la herramienta desarrollada por la gente de KDE para tratar
           DocBook XML. Me parecec que este fue el primer programa a extraer
           cadenas de texto a traducir desde la documentacion a los ficheros
           po, e inyectarlas de vuelta despuA~Xs de la traducciA~Xn.

           Unicamente puede tratar XML, y solo un DTD particular. Estoy
           bastante insatisfecho con el trato que hacen de las listas, que
           terminan en un A~Xnico msgid. Cuando la lista crece, el bloque se
           hace difA~cil de tratar.

       po-debiandoc
           Este programa hecho por Denis Barbier es un tipo de precursor del
           mA~Xdulo sgml de po4a, que mA~Xs o menos lo deja obsoleto. Como su
           nombre indica, A~Xnicamente trata el dtd de debiandoc, que ademA~Xs
           es un dtd anticuado.

       Las principales ventajas de po4a sobre ellos son la facilidad de
       adiciA~Xn de contenidos extra (que es aA~Xn peor allA~) y la habilidad
       de realizar la gettextizaciA~Xn.

   Educando a los desarrolladores sobre las traducciones
       When you try to translate documentation or programs, you face three
       kinds of problems; linguistics (not everybody speaks two languages),
       technical (that’s why po4a exists) and relational/human. Not all
       developers understand the necessity of translating stuff. Even when
       good willed, they may ignore how to ease the work of translators. To
       help with that, po4a comes with lot of documentation which can be
       referred to.

       Otro punto importante es que cada fichero traducido empieza con un
       breve comentario indicando quA~X es el fichero, y como usarlo. Esto
       deberA~a ayudar a los pobres desarrolladores avalanchados con montones
       de ficheros en diferentes idiomas que no entienden, y ayudarles a
       tratarlos correctamente.

       In the po4a project, translated documents are not source files anymore.
       Since sgml files are habitually source files, it’s an easy mistake.
       That’s why all files present this header:

        |       *****************************************************
        |       *           GENERATED FILE, DO NOT EDIT             *
        |       * THIS IS NO SOURCE FILE, BUT RESULT OF COMPILATION *
        |       *****************************************************
        |
        | This file was generated by po4a-translate(1). Do not store it (in cvs,
        | for example), but store the po file used as source file by po4a-translate.
        |
        | In fact, consider this as a binary, and the po file as a regular source file:
        | If the po gets lost, keeping this translation up-to-date will be harder ;)

       Likewise, gettext’s regular po files only need to be copied to the po/
       directory. But this is not the case of the ones manipulated by po4a.
       The major risk here is that a developer erases the existing translation
       of his program with the translation of his documentation. (Both of them
       can’t be stored in the same po file, because the program needs to
       install its translation as an mo file while the documentation only uses
       its translation at compile time). That’s why the po files produced by
       the po-debiandoc module contain the following header:

        #
        #  ADVISES TO DEVELOPERS:
        #    - you do not need to manually edit POT or PO files.
        #    - this file contains the translation of your debconf templates.
        #      Do not replace the translation of your program with this !!
        #        (or your translators will get very upset)
        #
        #  ADVISES TO TRANSLATORS:
        #    If you are not familiar with the PO format, gettext documentation
        #     is worth reading, especially sections dedicated to this format.
        #    For example, run:
        #         info -n '(gettext)PO Files'
        #         info -n '(gettext)Header Entry'
        #
        #    Some information specific to po-debconf are available at
        #            /usr/share/doc/po-debconf/README-trans
        #         or http://www.debian.org/intl/l10n/po-debconf/README-trans
        #

   RESUMEN de las ventajas de la aproximaciA~Xn basada en gettext
       · The translations are not stored along with the original, which makes
         it possible to detect if translations become out of date.

       · The translations are stored in separate files from each other, which
         prevents translators of different languages from interfering, both
         when submitting their patch and at the file encoding level.

       · EstA~X basado internamente en "gettext" (pero "po4a" ofrece una
         interfaz muy simple de forma que no se necesita entender el
         funcionamiento interno para usarlo). De esa forma no tenemos que
         reinventar la rueda, y debido a su extenso uso, podemos imaginar que
         esas erramientas estA~Xn mA~Xs o menos libres de fallos.

       · No ha cambiado nada para el usuario final (a parte de que
         probablemente las traducciones estarA~Xn mejor mantenidas :). El
         fichero de documentaciA~Xn resultante es exactamente el mismo.

       · No hace falta que los traductores aprendan una nueva sintaxis de
         fichero, y sus editores favoritos de ficheros po (como el modo po de
         emacs, kbabel o gtranslator) servirA~Xn a la perfecciA~Xn.

       · Gettext offers a simple way to get statistics about what is done,
         what should be reviewed and updated, and what is still to do. Some
         example can be found at those addresses:

          - http://kbabel.kde.org/img/previewKonq.png
          - http://www.debian.org/intl/l10n/

       Pero no todo es bonito, y esta aproximaciA~Xn tambiA~Xn tiene algunas
       desventajas con las que debemos cargar.

       · Los apA~Xndices son... extraA~Xos a primera vista.

       · No puede adaptar el texto traducido a su gusto, como partir
         pA~Xrrafos por aquA~, y juntar esos dos allA~. Pero segA~Xn como, si
         estA~X en desacuerdo con el original, deberA~a informarlo como un
         bug, de todas formas.

       · Incluso con una interfaz fA~Xcil, sigue siendo una nueva herramienta
         que la gente debe aprender.

         Uno de mis sueA~Xos es integrar de alguna forma po4a con gtranslator
         o kbabel. Cuando se abra un archivo sgml, se extraen las cadenas
         automA~Xticamente. Al guardar se guarda un fichero sgml traducido en
         el disco. Si consiguiA~Xramos hacer un mA~Xdulo para MS Word (TM) (o
         al menos para RTF) incluso podrA~an usarlo traductores profesionales.

Fallos conocidos y caracterA~sticas solicitadas

       El asunto mA~Xs importante (a parte de los mA~Xdulos faltantes) es el
       trato de las codificaciones. La forma de hacerlo es aA~Xadiendo el
       pragma UTF8 de perl y recodificando las cadenas en la salida, pero
       aA~Xn no estA~X hecho.

       We would also like to factorise some code (about file insertion) of the
       sgml module back into the TransTractor so that all modules can benefit
       from this, but this is not user visible.

AUTORES

        Denis Barbier <barbier,linuxfr.org>
        Martin Quinson (mquinson#debian.org)

TRADUCCION

        Jordi Vilalta <jvprat@gmail.com>