blib::man::Xml(3pm)

NOMBRE
Locale::Po4a::Xml - Convierte documentos XML y derivados desde/a archivos PO

DESCRIPCION
El objetivo del proyecto po4a (po para todo) es facilitar la traduccion (y mas interesante, el mantenimiento de las traducciones) usando las herramientas de gettext en areas donde no eran de esperar, como en la documentacion.

Locale::Po4a::Xml es un modulo para ayudar en la traduccion de documentacion en el formato XML a otros lenguajes [humanos]. Tambien se puede usar como base para construir modulos para documentos basados en XML.

Tenga en cuenta que este modulo aun esta en desarrollo, y no se distribuye en los lanzamientos oficiales de po4a porque aun no lo consideramos suficientemente maduro. Si desea probarlo de todas formas, obtengalo del CVS.

TRADUCIENDO CON PO4A::XML
Este modulo puede usarse directamente para tratar documentos XML genericos. Esto extraera el contenido de todos los tags, y ningun atributo, ya que ahi es donde se escribe el texto en la mayoria de documentos basados en XML.

Hay algunas opciones (descritas en la siguiente seccion) que pueden personalizar este comportamiento. Si eso no es suficiente para su formato de documento, le animo a que escriba su propio modulo derivado de este, para describir los detalles de su formato. Consulte la seccion "Escribiendo modulos derivados" de mas abajo, para una descripcion del proceso.

OPCIONES ACEPTADAS POR ESTE MODULO
La opcion debug global provoca que este modulo muestre las cadenas excluidas, para ver si se salta algo importante.

Estas son las opciones particulares de este modulo:

nostrip
    Evita que se quiten los espacios alrededor de las cadenas extraidas.

wrap
    Canoniza las cadenas a traducir, considerando que los espacios en blanco no son importantes, y justifica el documento traducido. Tienen preferencia sobre esta, las opciones personalizadas de cada tag. Consulte la opcion "tags" de mas abajo.

caseinsensitive
    Realiza las busquedas de tags y atributos sin tener en cuenta mayusculas y minusculas. Si esta definido, tratara <BooK>laNG y <BOOK>Lang como <book>lang.

tagsonly
    Extracts only the specified tags in the "tags" option. Otherwise, it will extract all the tags except the ones specified.

doctype
    Cadena que intentara encajar con la primera linea del doctype del documento (si esta definida). Si no encaja, se considerara que el documento es de un tipo equivocado.

tags
    Lista separada por espacios de los tags que desea traducir o omitir. Por defecto, los tags especificados seran excluidos, pero si utiliza la opcion "tagsonly", los tags especificados seran los unicos incluidos. Los tags deben estar en la forma <aaa>, pero puede juntar algunos (<bbb><aaa>) para indicar que el contenido del tag <aaa> solo se debe traducir cuando este dentro del tag <bbb>.

    Tambien puede especificar algunas opciones de tags poniendo algunos caracteres delante de la jerarquia de tags. Por ejemplo, puede poner 'w' (justificar) o 'W' (no justificar) para hacer caso omiso del comportamiento por defecto especificaco por la opcion global "wrap".

    Ejemplo: W<chapter><title>

attributes
    Lista separada por espacios de los atributos de tags que quiere traducir. Puede especificar los atributos por su nombre (por ejemplo, "lang"), pero puede an~adirle como prefijo una jerarquia de tags, para especificar que este tag solo se debe traducir cuando este dentro del tag especificado. Por ejemplo: <bbb><aaa>lang indica que el atributo lang solo se traducira cuando este dentro del tag <aaa>, y este este dentro de un tag <bbb>.

inline
    Lista separada por espacios de los tags que quiere tratar como inline (que no rompen la secuencia). Por defecto, todos los tags rompen la secuencia. Sigue la misma sintaxis que la opcion tags.

nodefault
    Space separated list of tags that the module should not try to set by default in the "tags" or "inline" category.

ESCRIBIENDO MODULOS DERIVADOS

  DEFINIR QUE TAGS Y ATRIBUTOS TRADUCIR
La personalizacion mas simple es definir que tags y atributos quiere que el analizador traduzca. Esto se debe hacer en la funcion initialize. Primero debe llamar a la inicializacion principal, para obtener las opciones de linea de comandos, y luego, an~adir sus definiciones personalizadas al hash de opciones. Si quiere tratar nuevas opciones de la linea de comandos, debe definirlas antes de llamar a la funcion initialize principal:

  $self->{options}{'nueva_opcion'}='';
  $self->SUPER::initialize(%options);
  $self->{options}{'tags'}.=' <p> <head><title>';
  $self->{options}{'attributes'}.=' <p>lang id';
  $self->{options}{'inline'}.=' <br>';
  $self->treat_options;

  REDEFINIENDO LA FUNCION found_string
Otro paso simple es redefinir la funcion "found_string", que recibe las cadenas extraidas por el analizador, para traducirlas. Ahi puede controlar que cadenas quiere traducir, y realizar pequen~as traducciones anyes o despues de la traduccion misma.

Recibe el texto extraido, la referencia de donde esta, y un hash que contiene informacion extra para controlar que cadenas traducir, como traducirlas y generar el comentario.

El contenido de las opciones depende del tipo de cadena que sea (especificado en una entrada del hash):

type="tag"
    La cadena encontrada es el contenido de un tag traducible. La entrada "tag_options" contiene los caracteres de opciones que hubiera delante de la jerarquia de tags en la opcion "tags" del modulo.

type="attribute"
    Significa que la cadena encontrada es el valor de un atributo traducible. La entrada "attribute" contiene el nombre del atributo.

Debe devolver el texto que reemplazara al original en el documento traducido. Aqui hay un ejemplo basico de esta funcion:

  sub found_string {
    my ($self,$texto,$ref,$opciones)=@_;
    $texto = $self->translate($texto,$ref,"tipo ".$opciones->{'type'},
      'wrap'=>$self->{options}{'wrap'});
    return $texto;
  }

Hay otro ejemplo simple en el nuevo modulo de Dia, que solo filtra algunas cadenas.

  MODIFICANDO LOS TIPOS DE TAGS
Esta personalizacion es mas compleja, pero le permite (practicamente) una personalizacion total. Esta basada en una lista de hashes, cada uno de los cuales define el comportamiento de un tipo de tags. La lista debe estar ordenada para que los tags mas generales esten despues de los mas concretos (ordenado primero por la llave beginning y luego por la end). Para definir un tipo de tag debe construir un hash con las siguientes llaves:

beginning
    Especifica el principio del tag, despues del "<".

end Especifica el final del tag, antes de ">".

breaking
    Indica si esta clase de tags rompe la secuencia. Un tag no rompedor (inline) es uno que puede tomarse como parte del contenido de otro tag. Puede tomar valores falso (0), cierto (1) o indefinido. Si se deja indefinido, deebera definir la funcion f_breaking que indicara si un tag concreto de esta clase es rompedor o no.

f_breaking
    Es una funcion que dira si el siguiente tag es rompedor o no. Debe definirla si deja la opcion "breaking" indefinida.

f_extract
    Si deja esta llave indefinida, la funcion de extraccion generica debera extraer el tag por si misma. Es interesante para tags que pueden que pueden contener otros tags o estructuras especiales dentro, y que puedeen confundir al analizador principal. Esta funcion recibe un booleano que indica si el tag se debe eliminar del documento de entrada o no.

f_translate
    Esta funcion devuelve el tag (en el formato de get_string_until()) y devuelve el tag traducido (atributos y toda la informacion necesaria traducidos) como una unica cadena.

FUNCIONES INTERNAS utilizadas para escribir analizadores derivados

  TRABAJANDO CON TAGS

get_path()
    Esta funcion devuelve la ruta hasta el tag actual desde la raiz del documento, de la forma <html><body><p>.

tag_type()
    Esta funcion devuelve el indice de la lista tag_types que encaja con el siguiente tag en el documento de entrada, o -1 si se esta al final del fichero.

extract_tag($$)
    Esta funcion devuelve el proximo tag del documento de entrada sin el principio ni el final, en forma de array, para mantener las referencias del fichero de entrada. Tiene dos parametros: el tipo del tag (tal como devuelve tag_type) y un booleano, que indica si se debe eliminar del fichero de entrada.

get_tag_name(@)
    Esta funcion devuelve el nombre del tag pasado como parametro, en la forma de array devuelta por extract_tag.

breaking_tag()
    Esta funcion devuelve un booleano que indica si el siguiente tag del documento de entrada es un tag "rompedor" o no (es un tag inline). Esto deja el documento de entrada intacto.

treat_tag()
    Esta funcion traduce el siguiente tag del documento de entrada. Usa las funciones de traduccion personalizadas de cada tipo de tag.

tag_in_list($@)
    Esta funcion devuelve una cadena que dice si el primer parametro (una gerarquia de tags) encaja con alguno de los tags del segundo parametro (una lista de tags o jerarquias de tags). Si no encaja, devuelve 0. Sino, devuelve las opciones del tag encajado (los caracteres delante del tag) o 1 (si el tag no tiene opciones).

  TRABAJANDO CON ATRIBUTOS

treat_attributes(@)
    Esta funcion trata la traduccion de los atributos de los tags. Recibe un tag sin las marcas de principio / final, y luego busca los atributos, y traduce los traducibles (especificados por la opcion "attributes" del modulo). Devuelve una cadena con el tag traducido.

  TRABAJANDO CON LAS OPCIONES DEL MODULO

treat_options()
    Esta funcion llena las estructuras internas que contienen los datos tags, atributos e "inline" con las opciones del modulo (especificadas en la linea de comandos o en la funcion de inicializacion).

  OBTENIENDO EL TEXTO DEL DOCUMENTO DE ENTRADA

get_string_until($%)
    Esta funcion devuelve una lista con las lineas (y referencias) del documento de entrada hasta que encuentra el primer parametro. El segundo parametro es un hash de opciones. El valor 0 significa desactivado (por defecto) y 1, activado.

    Las opciones validas son:

    include
        Esto hace que el array de retorno contenga la cadena buscada

    remove
        Esto elimina de la entrada la cadena

    unquoted
        Esto asegura que el texto buscado se encuentra fuera de fragmentos encomillados

skip_spaces(\@)
    Esta funcion recibe como parametro la referencia a un parrafo (en el formato devuelto por get_string_until), salta los espacios del principio y los devuelve como una cadena simple.

join_lines(@)
    Esta funcion devuelve una simple cadena con el texto del array del parametro (descartando las referencias).

ESTADO DE ESTE MODULO
Este modulo puede traducir tags y atributos.

El soporte para entidades y inclusion de ficheros esta en la lista de tareas pendientes.

La escritura de modulos derivados es aun muy limitada.

LISTA DE TAREAS PENDIENTES
DOCTYPE (ENTIDADES)

There is a minimal support for the translation of entities. They are translated as a whole, and tags are not taken into account. Multilines entities are not supported and entities are always rewrapped during the translation.

FICHEROS INCLUIDOS

"MODIFICAR LOS TIPOS DE TAGS DESDE LOS MODULOS HERENCIADOS (mover la estructura tag_types dentro del hash $self?)

un tag rompedor dentro de un tag no-rompedor (posible?) provoca comentarios muy feos

VER TAMBIEN
po4a(7), Locale::Po4a::TransTractor(3pm), Locale::Po4a::Pod(3pm).

AUTORES
 Jordi Vilalta <jvprat@gmail.com>

TRADUCCION
 Jordi Vilalta <jvprat@gmail.com>

DERECHO DE COPIA Y LICENCIA
Copyright (c) 2004 por Jordi Vilalta <jvprat@gmail.com>

Esto es software libre; puedes redistribuirlo y/o modificarlo bajo las condiciones de la GPL (ver el archivo COPYING).