LOCALE::PO4A::TRANSTRACTOR.3PM(1) | User Contributed Perl Documentation | LOCALE::PO4A::TRANSTRACTOR.3PM(1) |
NOME¶
Locale::Po4a::TransTractor - trans(lator ex)trator tradutor extrator genérico.
DESCRIÇÃO¶
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 resultante.
Mais formalmente, recebe os seguintes argumentos como entrada:
- um documento para traduzir;
- Um ficheiro PO que contém as traduções para usar.
Como saída, produz:
- outro ficheiro PO, resultante da extração de cadeias traduzíveis no documento de entrada;
- um documento traduzido, com a mesma estrutura que o da entrada, mas com todas as cadeias traduzíveis substituídas com as traduções encontradas no ficheiro PO fornecido na entrada.
Aqui está uma representação gráfica disto:
Documento de entrada --\ / ---> documento de saída \ / (traduzido) +-> função analisar() ---+ / \ Entrada PO ------------/ \---> Saída PO (extraído)
FUNÇÕES QUE O SEU ANALISADOR DEVE SOBREPOR¶
- parse()
- Este é o lugar onde todo o trabalho tem lugar: a análise dos
documentos de entrada, a geração da saída e a
extração das cadeias traduzíveis. Isto é muito
simples de usar as funções disponíveis apresentadas
na secção abaixo FUNÇÕES INTERNAS. Veja
também o RESUMO, o qual apresenta um exemplo.
Esta função é invocada pela função process() abaixo, mas se escolher usar a função new() e, para adicionar conteúdo manualmente ao documento, terá que invocar esta função você mesmo.
- docheader()
- Esta função retorna o cabeçalho que devemos acrescentar ao documento produzido, citado corretamente para ser um comentário na língua apontada. Consulte a secção Educating developers about translations, de po4a(7), que é para o bem de todos.
RESUMO¶
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--; ) { # Not the first time we see <p>. # Reput the current line in input, # and put the built paragraph to output $self->unshiftline($line,$lref); # Now that the document is formed, translate it: # - Remove the leading tag $paragraph =~ s/^<p>//s; # - push to output the leading tag (untranslated) and the # rest of the paragraph (translated) $self->pushline( "<p>" . $self->translate($paragraph,$pararef) ); next PARAGRAPH; } else { # Append to the paragraph $paragraph .= $line; $pararef = $lref unless(length($pararef)); } # Reinit the loop ($line,$lref)=$self->shiftline(); } # Did not get a defined line? End of input file. return; } }
Depois de implementar a função de análise, pode usar a sua classe de documento, usando a interface pública apresentada na próxima secção.
INTERFACE PÚBLICA para scripts que usam o seu analisador¶
Construtor¶
- process(%)
- Esta função pode fazer tudo o que precisa fazer com um documento po4a numa invocação. Os argumentos dela devem ser empacotados como uma 'hash'. AÇÕES:
- a.
- Lê todos os ficheiros PO especificados em po_in_name
- b.
- Lê todos os documentos originais especificados em file_in_name
- c.
- Analisa o documento
- d.
- Lê e aplica todas as adendas especificadas
- e.
- Escreve o documento traduzido para o nome_ficheiro_saída (se dado)
- f.
- Escreve o ficheiro PO extraído para nome_po_saída (se dado)
ARGUMENTOS, além daqueles aceites pelo new() (com o tipo esperado):
- file_in_name (@)
- Lista de nomes de ficheiros onde devemos ler o documento de entrada.
- file_in_charset ($)
- Conjunto de caracteres usado no documento de entrada (se não for especificado, usa UTF-8).
- file_out_name ($)
- Nome do ficheiro onde devemos escrever o documento de saída.
- file_out_charset ($)
- Conjunto de caracteres usado no documento de saída (se não for especificado, usa UTF-8).
- po_in_name (@)
- Lista de nomes de ficheiros onde devemos ler os ficheiros de entrada do PO, que contêm a tradução que irá ser usada para traduzir o documento.
- po_out_name ($)
- Nome do ficheiro onde devemos escrever a saída do ficheiro PO, que contém as cadeias extraídas do documento de entrada.
- addendum (@)
- Lista de nomes de ficheiros de onde devemos ler a adenda.
- addendum_charset ($)
- Conjunto de caracteres para a adenda.
- new(%)
- Cria um novo documento de po4a. Opções aceites (no hash passado como parâmetro):
- verbose ($)
- Define o nível de detalhe.
- debug ($)
- Define a depuração.
- wrapcol ($)
- A coluna na qual devemos fazer a quebra de texto no documento de
saída (predefinição: 76).
O valor negativo significa não quebrar as linhas.
Também aceita as próximas opções para ficheiros PO subjacentes: porefs, copyright-holder, msgid-bugs-address, package-name, package-version, wrap-po.
Manipulando ficheiros de documentos¶
- read($$$)
- Adiciona outros dados do documento de entrada no final da array existente
"@{$self->{TT}{doc_in}}".
Esta função recebe dois argumentos obrigatórios e um opcional.
* O nome do ficheiro a ser lido no disco;
* O nome a ser usado como nome do ficheiro ao construir a referência no ficheiro PO;
* O conjunto de caracteres a ser usado para ler esse ficheiro (UTF-8 por predefinição)Esta matriz "@{$self->{TT}{doc_in}}" detém os dados desse documento de entrada como uma matriz de cadeias com significados alternativos.
* A cadeia $textline que detém cada linha de dados de texto de entrada.
* A cadeia "$filename:$linenum" que detém a sua localização 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.
- escrever($)
- Escreva o documento traduzido no nome do ficheiro dado.
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 na matriz.
Manipulando ficheiros PO¶
- readpo($)
- Adiciona o conteúdo dum ficheiro (que o nome é passado como argumento) para o actual PO de entrada. O conteúdo antigo não é descartado.
- writepo($)
- Gravar o ficheiro PO extraído no nome do ficheiro dado.
- stats()
- Retorna algumas estatísticas sobre a tradução feita
até agora. Note que não é a mesma estatística
que aquela escrita por msgfmt--statistic. Aqui, são
estatísticas sobre o uso recente do ficheiro PO, enquanto msgfmt
relata o estado do ficheiro. Ele é um envolvido para
função Locale::Po4a::Po::stats_get aplicada ao ficheiro de
entrada PO. Exemplo de uso:
[uso normal do documento po4a...] ($percent,$hit,$queries) = $document->stats(); print "Encontramos traduções para $percent\% ($hit from $queries) de cadeias.\n";
Manipulando a adenda¶
- addendum($)
- Por favor, consulte po4a(7) para obter mais
informações sobre o que são adendas e como os
tradutores devem escrevê-las. Para aplicar uma adenda ao documento
traduzido, basta passar o nome do ficheiro para esta função
e está feito ;)
Esta função retorna um inteiro não nulo em caso de erro.
FUNÇÕES INTERNAS usadas para escrever analisadores derivados¶
Obter a entrada, fornecer a saída¶
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 da matriz e solta-o da matriz. * Perl unshift preenche um item da matriz como o primeiro item da matriz. * Perl pop retorna o último item da matriz e solta-o da matriz. * Perl push acrescenta um item da matriz como o último item da matriz.
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.
- shiftline()
- Esta função retorna a primeira linha a ser analisada e a referência dele correspondente (empacotada como uma matriz) da matriz "@{$self->{TT}{doc_in}}" e descarta estes 2 primeiros itens da matriz. Aqui, a referência é fornecida por uma cadeia "$filename:$linenum".
- unshiftline($$)
- Desloca a última linha deslocada do documento de entrada e a referência dele correspondente de volta ao cabeçalho de "{$self->{TT}{doc_in}}".
- pushline($)
- Força uma nova linha no fim de "{$self->{TT}{doc_out}}".
- popline()
- Estoira a última linha forçada do final de "{$self->{TT}{doc_out}}".
Marcando cadeias como traduzíveis¶
Uma função é fornecida para lidar com o texto que deve ser traduzido.
- translate($$$)
- Argumentos obrigatórios:
- Uma cadeia para traduzir
- A referência desta cadeia (ou seja, posição no ficheiro de entrada)
- O tipo desta cadeia (ou seja, a descrição textual do papel estrutural dele; usado em Locale::Po4a::Po::gettextization(); ver também po4a(7), secção Gettextization: how does it work?)
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);
- wrap
- booleano que indica se podemos considerar que os espaços em branco na cadeia não são importantes. Se sim, a função canoniza a cadeia antes de procurar a tradução ou extraí-la, e envolve a tradução.
- wrapcol
- a coluna na qual devemos fazer a quebra da linha
(predefinição: o valor de wrapcol especificado
durante a criação do TransTractor ou 76).
O valor negativo será subtraído da predefinição.
- comment
- um comentário adicional para a entrada.
Ações:
- Coloca a cadeia de referência e tipo em po_out.
- Retorna a tradução da cadeia (como encontrada em po_in), de modo que o analisador pode construir o doc_out.
- Lida com os conjuntos de caracteres para recodificar as cadeias antes de as enviar para po_out e antes de voltar às traduções.
Funções diversas¶
- verbose()
- Retorna se a opção 'verbose' foi passada durante a criação do TransTractor.
- debug()
- Retorna se a opção de depuração foi passada durante a criação doTransTractor.
- get_in_charset()
- Esta função retorna o charset que foi fornecido como o conjunto de caracteres mestre
- get_out_charset()
- Esta função irá retornar o conjunto de
carácteres, que deviam ser usados na saída (em geral,
útil para substituir os conjuntos de carácteres detetados
à entrada do documento onde foi encontrado).
Vai usar o conjunto de caracteres de saída especificado na linha de comando. Se não fosse especificado, seria usado o conjunto de caracteres do 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.
DIREÇÕES FUTURAS¶
Uma falha do TransTractor atual é que ele não pode tratar de documentos traduzidos que contém todos os idiomas, como modelos debconf, ou ficheiros .desktop.
Para resolver este problema, as únicas mudanças na interface necessárias são:
- obter um 'hash' como po_in_name (uma lista por idioma)
- adicionar um argumento para traduzir para indicar a língua apontada
- fazer uma função pushline_all, que deveria fazer pushline do
conteúdo dele para todos idiomas, a usar uma sintaxe tipo mapa:
$self->pushline_all({ "Description[".$langcode."]=". $self->translate($line,$ref,$langcode) });
Vamos ver se é suficiente ;)
AUTORES¶
Denis Barbier <barbier@linuxfr.org> Martin Quinson (mquinson#debian.org) Jordi Vilalta <jvprat@gmail.com>
2025-09-14 | perl v5.40.1 |