| Locale::Po4a::TransTractor(3pm) | Herramientas de po4a | Locale::Po4a::TransTractor(3pm) |
Locale::Po4a::TransTractor - Trans(lator ex)tractor genérico (traductor extractor).
El objetivo del proyecto po4a («PO for anything», PO para todo) es facilitar la traducción (y más interesante, el mantenimiento de las traducciones) usando las herramientas de gettext en ámbitos dónde no previstos, como la documentación.
Esta clase es la antecesora de todos los analizadores de po4a usados para analizar un documento buscando cadenas traducibles, extraerlas a un fichero PO y reemplazarlas por su traducción en el documento de salida.
Más formalmente, toma los siguientes parámetros como entrada:
Como salida produce:
Aquí tiene una representación gráfica:
Documento de entrada -\ /---> Documento de salida
\ / (traducido)
+-> función parse() --+
/ \
PO de entrada --------/ \---> PO de salida
(extraído)
Esta función es invocada por la función «process()» a continuación, pero si elije usar la función «new()», y añadir contenido manualmente a su documento, deberá invocar ésta función manualmente.
El siguiente ejemplo analiza una lista de párrafos que empiezan con «<p>». Para simplificar, suponemos que el documento está correctamente formateado, es decir, que sólo hay presentes etiquetas '<p>', y que esta etiqueta está justo al principio de cada párrafo.
sub parse {
my $self = shift;
PARAGRAPH: while (1) {
my ($paragraph,$pararef)=("","");
my $first=1;
my ($line,$lref)=$self->shiftline();
while (defined($line)) {
if ($line =~ m/<p>/ && !$first--; ) {
# No es la primera vez que vemos <p>.
# Devuelve la línea actual a la entrada,
# y pon el párrafo construido en la salida.
$self->unshiftline($line,$lref);
# Ahora que tenemos el documento creado, lo traducimos:
# - Eliminamos la etiqueta inicial
$paragraph =~ s/^<p>//s;
# - Ponemos en la salida la etiqueta inicial (sin traducir) y el
# resto del párrafo (traducido)
$self>pushline( "<p>"
. $self->translate($paragraph,$parraref)
);
next PARAGRAPH;
} else {
# Añadir al párrafo.
$paragraph .= $line;
$pararef = $lref unless(length($pararef));
}
# Reiniciar el bucle
($line,$lref)=$self->shiftline();
}
¿ # ¿No se obtuvo una línea definida? Fin del fichero de entrada.
return;
}
}
Una vez haya implementado la función de análisis, ya puede usar su clase de documento usando la interfaz pública presentada en la siguiente sección.
ARGUMENTOS, aparte de los aceptados por «new()» (con el tipo esperado):
This array
"@{$self->{TT}{doc_in}}" holds this
input document data as an array of strings with alternating meanings.
* The string $textline holding each line of the
input text data.
* The string "$filename:$linenum"
holding its location and called as
"reference" ("linenum" starts
with 1).
Cabe destacar que esto no analiza nada. Debe usar la función «parse()» cuando haya terminado de cargar los ficheros de entrada en el documento.
Estos datos de documentos traducidos se proporcionan por:
* "$self->docheader()" que contiene
el texto de cabecera de la extensión, y
* "@{$self->{TT}{doc_out}}" que
contiene cada línea del texto traducido principal de la
matriz.
[uso normal del documento po4a...]
($porcentaje,$aciertos,$solicitudes) = $documento->stats();
print "Se han encontrado traducciones para el $porcentaje\% ($aciertos de $solicitudes) de cadenas.\n";
Esta función devuelve un entero no nulo en caso de error.
Se proporcionan cuatro funciones para obtener la entrada y salida de vuelta. Son muy similares a shift/unshift y push/pop de Perl.
* Perl shift devuelve el primer elemento de matriz y lo elimina de la matriz. * Perl unshift añade un elemento al matriz como el primer elemento del a matriz. * Perl pop devuelve el último elemento de la matriz y lo elimina de la matriz. * Perl push añade un elemento a la matriz como el último elemento de la matriz.
El primer par trata la entrada, mientras que el segundo trata la salida. Truco mnemoténico: en la entrada, está interesado en la primera línea, lo que ofrece shift, y en la salida desea insertar el resultado al final, como hace push.
Se proporciona una función para tratar el texto que se debe traducir.
Esta función también puede tomar algunos argumentos adicionales. Estos deben estar en una tabla de elementos asociativos («hash»). Por ejemplo:
$self->translate("string","ref","type",
'wrap' => 1);
Acciones:
Utilizará el juego de caracteres especificado en la linea de órdenes. Si no se ha especificado, utilizará el juego de caracteres del PO de entrada, y si el PO de entrada aún tiene el «CHARSET» predefinido, devolverá el juego de caracteres del documento de entrada, para que no se realice ninguna codificación.
Una deficiencia del TransTractor actual es que no puede tratar documentos traducidos que contengan todos los idiomas, como las plantillas de debconf, o en los ficheros «.desktop».
Para tratar este problema, los únicos cambios necesarios en la interfaz son:
$self->pushline_all({ "Description[".$langcode."]=".
$self->translate($line,$ref,$langcode)
});
Ya veremos si es suficiente ;)
Denis Barbier <barbier@linuxfr.org> Martin Quinson (mquinson#debian.org) Jordi Vilalta <jvprat@gmail.com>
Jordi Vilalta <jvprat@gmail.com> Omar Campagne <ocampagne@gmail.com>
| 2023-01-03 | Herramientas de po4a |