| Locale::Po4a::TransTractor(3pm) | Ferramentas do Po4a | Locale::Po4a::TransTractor(3pm) |
Locale::Po4a::TransTractor - extrator de tradução genérico.
O objetivo do projeto po4a (PO for anything, ou PO para qualquer coisa) é facilitar traduções (e o mais interessante, a manutenção das traduções) usando as ferramentas do gettext em áreas em que não se esperava, como documentação.
Essa classe é o ancestral de todo analisador po4a usado para analisar um documento, para pesquisar strings traduzíveis, para extraí-las para um arquivo PO e para substitui-las por suas traduções no documento de saída.
Mais formalmente, ele leva os seguintes argumentos como entrada:
Como saída, ele produz:
Aqui está uma representação gráfica disso:
Doc. de entrada -\ /---> Doc. de saída
\ / (traduzido)
+---> função parse() -----+
/ \
PO de entrada ---/ \---> PO de saída
(extraído)
Essa função é chamada pela função process() abaixo, mas se você escolher usar a função new() e adicionar o conteúdo manualmente a seu documento, você terá que chamar essa função você mesmo.
O exemplo a seguir analisa uma linha de parágrafos começando com "<p>". Em nome da simplicidade, nós presumimos que o documento está bem formatado, ou seja, que as marcações "<p>" são as únicas marcações apresentadas e que essa marcação está exatamente no começo 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>.
# Colocar novamnete a linha atual na entrada,
# e colocar o parágrafo compilado na saída
$self->unshiftline($line,$lref);
# Agora que o documento está formado, traduza-o:
# - Remove a marcação no começo
$paragraph =~ s/^<p>//s;
# - envia para a saída a marcação no começo (não
# traduzida) e o resto do parágrafo (traduzido)
$self->pushline( "<p>"
. $self->translate($paragraph,$pararef)
);
next PARAGRAPH;
} else {
# Anexa ao parágrafo
$paragraph .= $line;
$pararef = $lref unless(length($pararef));
}
# Reinicia o loop
($line,$lref)=$self->shiftline();
}
# Não conseguiu uma linha definida? Termina com o
# arquivo de entrada.
return;
}
}
Uma vez que você tenha implementada a função de análise, você pode usar sua classe de documento, usando a interface pública apresentada na seção seguinte.
ARGUMENTOS, além dos aceitos por new() (com o tipo esperado):
Esse vetor
"@{$self->{TT}{doc_in}}"
detém os dados desse documento de entrada como um vetor e strings
com significados alternativos.
* A string $textline detendo cada linha de dados
de texto de entrada.
* A string "$filename:$linenum" detendo
sua localização e chamada
como "referência"
("linenum" inicia com 1).
Por favor note que ele analisa nada. Você deveria usa a função parse() quando você acabar de empacotar os arquivos de entrada no documento.
Os dados desse documento traduzido são fornecidos por:
* "$self->docheader()" detendo o
texto de cabeçalho para o plugin, e
* "@{$self->{TT}{doc_out}}" detendo
cada linha do principal texto traduzido no vetor.
[uso normal de um documento po4a...]
($percent,$hit,$queries) = $document->stats();
print "Nós encontramos de $percent\% ($hit de $queries) das strings.\n";
Essa função retorna um inteiro não nulo quando há um 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, você está interessada na primeira linha, que é o que o shift fornece, e na saída você quer adicionar seu resultado ao final, como o push faz.
Uma função é fornecida para manipular o texto que deveria ser traduzido.
Essa função também pode levar alguns argumentos extras. Eles devem ser organizados como um hash. Por exemplo:
$self->translate("string","ref","type",
'wrap' => 1);
Ações:
Ele vai usar o conjunto de caracteres de saída especificado na linha de comando. Se não tiver sido especificado, ele vai usar o conjunto de caracteres do PO de entrada, e se o PO de entrada possuir o "CHARSET" padrão, ele vai retornar o conjunto de caracteres do documento de entrada, de forma que nenhuma codificação é realizada.
Um problema do atual TransTractor é que ele não consegue manipular documento traduzido contendo todos idiomas, como modelos de debconf, ou arquivos .desktop.
Para resolver esse problema, as únicas alterações necessárias na interface são:
$self->pushline_all({ "Description[".$langcode."]=".
$self->translate($line,$ref,$langcode)
});
Veremos se isso é o suficiente ;)
Denis Barbier <barbier@linuxfr.org> Martin Quinson (mquinson#debian.org) Jordi Vilalta <jvprat@gmail.com>
| 2023-01-03 | Ferramentas do Po4a |