| Locale::Po4a::TransTractor(3pm) | Ferramentas Po4a | Locale::Po4a::TransTractor(3pm) |
Locale::Po4a::TransTractor - genérico trans(lator ex)trator.
O objetivo do projeto po4a (PO for anything: PO para qualquer coisa) é facilitar traduções (e o mais interessante, a manutenção das traduções) a usar as ferramentas do gettext em áreas em que não se esperava, como na documentação.
Esta classe é o ancestral de todos os analisadores po4a usado para analisar um documento, para pesquisar cadeias traduzíveis, para extraí-las para um ficheiro PO e substitui-los pela tradução dela no documento de saída.
Mais formalmente, toma os seguintes argumentos como entrada:
Como saída, produz:
Aqui está uma representação gráfica deste:
Documento de entrada --\ / ---> documento de saída
\ / (traduzido)
+-> função analisar() ---+
/ \
Entrada PO ------------/ \---> Saída PO
(extraído)
Esta função é invocada pela função processo() abaixo, mas se escolher usar a função new() e, para adicionar conteúdo manualmente qo documento, terá que invocar esta função você mesmo.
O exemplo a seguir analisa uma lista de parágrafos que começam com "<p>". Pelo bem da simplicidade, assumimos que o documento está bem formatado, ou seja, que etiquetas '<p> são as etiquetas apenas presentes e que esta marca é no início de cada parágrafo.
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--; ) {
# Não é a primeira vez que vemos <p>.
# Reponha a linha atual na entrada,
# e pôr o parágrafo construído à saída
$self->unshiftline($line,$lref);
# Agora que o documento é formado, traduza-o:
# - Remova a etiqueta líder
$paragraph =~ s/^<p>//s;
# - Empurre à saída a etiqueta principal (não traduzido)
# e o resto do parágrafo (traduzido)
$self-> pushline( "<p>"
. $self->translate($paragraph,$pararef)
);
próximo PARAGRÁFO;
} else {
# Acrescente o parágrafo
$paragraph .= $line;
$pararef = $lref unless(lenght($pararef));
}
# Reiniciar o ciclo
($line,$lref)=$self->shiftline();
}
# Não tem uma linha definida? Fim do ficheiro de entrada.
return;
}
}
Depois de implementar a função de análise, pode usar a sua classe de documento, a usar a interface pública apresentada na próxima secção.
ARGUMENTOS, ao lado dos aceites por new() (com o tipo esperado):
Esse vetor
"@{$self->{TT}{doc_in}}"
detém os dados desse documento de entrada como um vetor e cadeias
com significados alternativos.
* A cadeia $textline a deter cada linha de dados
de texto de entrada.
* A cadeia "$filename:$linenum" a deter
a localização dele e chamada
como "referência"
("linenum" starts with 1)..
Por favor, note que ele não analisa nada. Deve usar a função parse() quando está feito com o empacotamento de ficheiros de entrada no documento.
Os dados desse documento traduzido são fornecidos por:
* "$self->docheader()" a deter o
texto de cabeçalho para o plugin e
* "@{$self->{TT}{doc_out}}" a deter
cada linha do principal texto traduzido no vetor.
[utilização normal do documento po4a ...]
($percent,$hit,$queries) = $document->stats();
print "Encontramos traduções para $percent\% ($hit from $queries) de cadeias.\n";
Esta função retorna um inteiro não nulo em caso de erro.
Quatro funções são fornecidas para obter entrada e retornar a saída. Elas são muito parecidas com shift/unshift e push/pop de Perl.
* Perl shift retorna o primeiro item do vetor e solta-o do vetor. * Perl unshift preenche um item no vetor como o primeiro item do vetor. * Perl pop retorna o último item do vetor e solta-o do vetor. * Perl push acrescenta um item ao vetor como o último item do vetor.
O primeiro par é sobre entrada, enquanto ao segundo é sobre saída. Mnemônico: na entrada, está interessada na primeira linha, que é o que o shift fornece e na saída quer adicionar o seu resultado ao final, como o push faz.
Uma função é fornecida para lidar com o texto que deve ser traduzido.
Esta função também pode ter alguns argumentos extras. Eles devem ser organizadas como uma 'hash'. Um exemplo:
$self->translate("string","ref","type",
'wrap' => 1);
Acões:
Ele vai usar o conjunto de carateres de saída especificado na linha de comando. Se não fosse especificado, será usado o conjunto de carateres PO de entrada e, se a entrada de PO tem o "charset" predefinido, irá retornar um conjunto de carácteres do documento de entrada, de modo a que nenhuma codificação é realizada.
Uma falha do TransTractor atual é que ele não pode tratar de documentos traduzidos a conter todas os idiomas, como modelos debconf, ou ficheiros desktops.
Para resolver este problema, as únicas mudanças na interface necessárias são:
$self->pushline_all({ "Description[".$langcode."]=".
$self->translate($line,$ref,$langcode)
});
Vai ver se é suficiente ;)
Denis Barbier <barbier@linuxfr.org> Martin Quinson (mquinson#debian.org) Jordi Vilalta <jvprat@gmail.com>
| 2023-01-03 | Ferramentas Po4a |