Locale::Po4a::TransTractor(3pm) | Ferramentas Po4a | Locale::Po4a::TransTractor(3pm) |
NOME¶
Locale::Po4a::TransTractor - genérico trans(lator ex)trator.
DESCRIÇÃO¶
O objetivo do projeto po4a (PO para tudo) é facilitar traduções (e mais interessante, a manutenção das traduções) usando ferramentas gettext em áreas onde eles não eram esperados como documentação.
Esta classe é o ancestral de todos os analisadores po4a usado para analisar um documento, para pesquisar sequências traduzíveis, para extraí-las para um ficheiro PO e substitui-los por sua tradução no documento de saída.
Mais formalmente, toma 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 sequências traduzíveis em documento de entrada;
- um documento traduzido, com a mesma estrutura do que o de entrada, mas com todas as sequências traduzíveis substituídas com as traduções encontradas no ficheiro PO fornecido na entrada.
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)
FUNÇÕES QUE O SEU ANALISADOR DEVERIA SUBSTITUIR¶
- 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 sequências traduzíveis. Isto
é muito simples usando as funções disponíveis
apresentadas na secção abaixo INTERNAL FUNCTIONS. Ver
também o SYNOPSIS, o qual apresenta um exemplo.
Esta função é invocada pelo processo() função abaixo, mas se você escolher para usar a nova() função e, para adicionar conteúdo manualmente para o 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.
SINOPSE¶
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); # Agora que o documento é formado, traduza-o: # - Remova a etiqueta líder $paragraph =~ s/^<p>//s; # - Empurre para a saída a etiqueta principal (não traduzido) # e o resto do parágrafo (traduzido) $self-> pushline( "<p>" . $document->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, você pode usar a sua classe de documento, usando a interface pública apresentada na próxima secção.
INTERFACE PÚBLICA para scripts usando o seu analisador¶
Construtor¶
- process(%)
- Esta função pode fazer tudo o que você precisa fazer com um documento po4a numa invocação. Os seus argumentos 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 file_out_name (se dado)
- f.
- Escreve o ficheiro PO extraído para po_out_name (se dado)
ARGUMENTOS, ao lado dos aceites por new() (com o tipo esperado):
- file_in_name (@)
- Lista de nomes de ficheiros onde devemos ler o documento de entrada.
- file_in_charset ($)
- O conjunto de carateres utilizado no documento de entrada (se não for especificado, ele vai tentar detectá-lo a partir do documento de entrada).
- file_out_name ($)
- Nome do ficheiro onde devemos escrever o documento de saída.
- file_out_charset ($)
- Conjunto de carateres utilizado no documento de saída (se não for especificado, será usado o conjunto de carateres do ficheiro PO).
- 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 sequências extraídas do documento de entrada.
- addendum (@)
- Lista de nomes de ficheiros que devemos ler a adenda de.
- addendum_charset ($)
- Conjunto de carateres para a adenda.
- new(%)
- Criar um documento po4a novo. Opções aceitas (mas está num 'hash'):
- verbose ($)
- Define o nivel de detalhe
- debug ($)
- Define a depuração
Manipulação de ficheiros de documentos¶
- ler($)
- Adicionar outro documento de entrada na extremidade do existente. O
argumento é o nome do ficheiro para ler.
Por favor, note que ele não analisa nada. Você deve usar a função parse() quando está feito com o empacotamento de ficheiros de entrada no documento.
- escrever($)
- Escreva o documento traduzido para o nome do ficheiro dado.
Manipulando ficheiros PO¶
- readpo($)
- Adicionar 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 para o 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 a impressa 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:
[utilização normal do documento po4a ...] ($percent,$hit,$queries) = $document->stats(); print "Encontramos traduções para $percent\% ($hit from $queries) de sequências.\n";
Manipulação da 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 você está feito ;)
Esta função retorna um inteiro não nulo em caso de erro.
FUNÇÕES INTERNAS usadas para escrever analises derivadas¶
Obtenção de entrada, fornecendo saída¶
Quatro funções são fornecidas para obter o retorno da entrada e da saída. São muito semelhantes ao 'shift/unshift' e 'push/pop'. O primeiro par é sobre a entrada, enquanto o segundo é sobre a saída. Mnemónico: na entrada, você está interessado em primeira linha, que o 'shift' dá e, na saída que deseja adicionar o seu resultado no final, como 'push' faz.
- shiftline()
- Esta função retorna a próxima linha do doc_in para ser analisada e suareferência (embalada como uma matriz).
- unshiftline($$)
- 'Unshifts' uma linha do documento de entrada e a sua referência.
- pushline($)
- Empurrar uma nova linha para o doc_out
- popline()
- 'Pop' a última linha empurrada do doc_out.
Sequências de marcação como traduzível¶
Uma função é fornecida para lidar com o texto que deve ser traduzido.
- translate($$$)
- Argumentos obrigatórios:
- Uma sequência para traduzir
- A referência desta sequência (ou seja, em posição de ficheiro de entrada)
- O tipo desta sequência (ou seja, a descrição textual do seu papel estrutural; usado em Locale::Po4a::Po::gettextization(); ver também po4a(7), secção Gettextization: como é que funciona?)
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 sequência não são importantes. Se sim, a função canoniza a sequência antes de procurar a tradução ou extraí-la, e envolve a tradução.
- wrapcol
- a coluna em que nos devemos envolver (padrão: 76)
- comment
- um comentário extra para a entrada.
Acões:
- Coloca a sequência de referência, e tipo em po_out.
- Retorna a tradução da sequência (como encontrada em po_in), de modo que o analisador pode construir o doc_out.
- Lida com os conjuntos de carateres para recodificar as sequências 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 aprovada durante a criação do TransTractor.
- debug()
- Retorna se a opção de depuração foi aprovada durante a criação doTransTractor.
- detected_charset($)
- Isto diz TransTractor que um conjunto de carateres novo (o primeiro argumento) foi detetado a partir do documento de entrada. Normalmente pode ser lido a partir do cabeçalho do documento. Apenas o primeiro conjunto de carateres permanecerá, vindo a partir dos argumentos de process() ou detetados a partir do documento.
- get_out_charset()
- Esta função irá retornar o conjunto de caracteres,
que deviam ser usados na saída (em geral,
útil para substituir os conjuntos de carateresdetetados à
entrada do documento onde foi encontrado).
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 padrão "charset", irá retornar conjunto de carateres do documento de entrada, de modo a que nenhuma codificação é realizada.
- recode_skipped_text($)
- Esta função retorna o texto recodificado passado como argumento, a partir do conjunto de carateres do documento para os do documento de saída. Isto não é necessário quando traduzir uma sequência (translate() recodifica tudo em si), mas é para quando saltar uma sequência do documento de entrada e quer que o documento de saída seja consistente com a codificação global.
DIREÇÕES FUTURAS¶
Uma falha do TransTractor atual é que ele não pode tratar de documentos traduzidos contendo todas os idiomas, como modelos debconf, ou ficheiros desktops.
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, o que seria 'pushline' e seu
conteúdo para toda a linguagem, usando uma sintaxe mapa como:
$self->pushline_all({ "Description[".$langcode."]=". $self->translate($line,$ref,$langcode) });
Vai ver se é suficiente ;)
AUTORES¶
Denis Barbier <barbier@linuxfr.org> Martin Quinson (mquinson#debian.org) Jordi Vilalta <jvprat@gmail.com>
2014-05-02 | Ferramentas Po4a |