.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man v6.0.2 (Pod::Simple 3.45) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Required to disable full justification in groff 1.23.0. .if n .ds AD l .\" ======================================================================== .\" .IX Title "LOCALE::PO4A::TRANSTRACTOR.3PM 1" .TH LOCALE::PO4A::TRANSTRACTOR.3PM 1 2025-11-22 "perl v5.42.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH NOME .IX Header "NOME" Locale::Po4a::TransTractor \- trans(lator ex)trator tradutor extrator genérico. .SH DESCRIÇÃO .IX Header "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. .PP 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. .PP Mais formalmente, recebe os seguintes argumentos como entrada: .IP \- 2 um documento para traduzir; .IP \- 2 Um ficheiro PO que contém as traduções para usar. .PP Como saída, produz: .IP \- 2 outro ficheiro PO, resultante da extração de cadeias traduzíveis no documento de entrada; .IP \- 2 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. .PP Aqui está uma representação gráfica disto: .PP .Vb 6 \& Documento de entrada \-\-\e / \-\-\-> documento de saída \& \e / (traduzido) \& +\-> função analisar() \-\-\-+ \& / \e \& Entrada PO \-\-\-\-\-\-\-\-\-\-\-\-/ \e\-\-\-> Saída PO \& (extraído) .Ve .SH "FUNÇÕES QUE O SEU ANALISADOR DEVE SOBREPOR" .IX Header "FUNÇÕES QUE O SEU ANALISADOR DEVE SOBREPOR" .IP \fBparse()\fR 4 .IX Item "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 \&\fBFUNÇÕES INTERNAS\fR. Veja também o \fBRESUMO\fR, o qual apresenta um exemplo. .Sp Esta função é invocada pela função \fBprocess()\fR abaixo, mas se escolher usar a função \fBnew()\fR e, para adicionar conteúdo manualmente ao documento, terá que invocar esta função você mesmo. .IP \fBdocheader()\fR 4 .IX Item "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 \fBEducating developers about translations\fR, de \&\fBpo4a\fR\|(7), que é para o bem de todos. .SH RESUMO .IX Header "RESUMO" O exemplo a seguir analisa uma lista de parágrafos que começam com "

". Pelo bem da simplicidade, assumimos que o documento está bem formatado, ou seja, que etiquetas \*(Aq

são as etiquetas apenas presentes e que esta marca é no início de cada parágrafo. .PP .Vb 2 \& 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/

/ && !$first\-\-; ) { \& # Not the first time we see

. \& # 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/^

//s; \& \& # \- push to output the leading tag (untranslated) and the \& # rest of the paragraph (translated) \& $self\->pushline( "

" \& . $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; \& } \& } .Ve .PP 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. .SH "INTERFACE PÚBLICA para scripts que usam o seu analisador" .IX Header "INTERFACE PÚBLICA para scripts que usam o seu analisador" .SS Construtor .IX Subsection "Construtor" .IP process(%) 4 .IX Item "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 \*(Aqhash\*(Aq. AÇÕES: .RS 4 .IP a. 3 .IX Item "a." Lê todos os ficheiros PO especificados em po_in_name .IP b. 3 .IX Item "b." Lê todos os documentos originais especificados em file_in_name .IP c. 3 .IX Item "c." Analisa o documento .IP d. 3 .IX Item "d." Lê e aplica todas as adendas especificadas .IP e. 3 .IX Item "e." Escreve o documento traduzido para o nome_ficheiro_saída (se dado) .IP f. 3 .IX Item "f." Escreve o ficheiro PO extraído para nome_po_saída (se dado) .RE .RS 4 .Sp ARGUMENTOS, além daqueles aceites pelo \fBnew()\fR (com o tipo esperado): .IP "file_in_name (@)" 4 .IX Item "file_in_name (@)" Lista de nomes de ficheiros onde devemos ler o documento de entrada. .IP "file_in_charset ($)" 4 .IX Item "file_in_charset ($)" Conjunto de caracteres usado no documento de entrada (se não for especificado, usa UTF\-8). .IP "file_out_name ($)" 4 .IX Item "file_out_name ($)" Nome do ficheiro onde devemos escrever o documento de saída. .IP "file_out_charset ($)" 4 .IX Item "file_out_charset ($)" Conjunto de caracteres usado no documento de saída (se não for especificado, usa UTF\-8). .IP "po_in_name (@)" 4 .IX Item "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. .IP "po_out_name ($)" 4 .IX Item "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. .IP "addendum (@)" 4 .IX Item "addendum (@)" Lista de nomes de ficheiros de onde devemos ler a adenda. .IP "addendum_charset ($)" 4 .IX Item "addendum_charset ($)" Conjunto de caracteres para a adenda. .RE .RS 4 .RE .IP new(%) 4 .IX Item "new(%)" Cria um novo documento de po4a. Opções aceites (no hash passado como parâmetro): .RS 4 .IP "verbose ($)" 4 .IX Item "verbose ($)" Define o nível de detalhe. .IP "debug ($)" 4 .IX Item "debug ($)" Define a depuração. .IP "wrapcol ($)" 4 .IX Item "wrapcol ($)" A coluna na qual devemos fazer a quebra de texto no documento de saída (predefinição: 76). .Sp O valor negativo significa não quebrar as linhas. .RE .RS 4 .Sp Também aceita as próximas opções para ficheiros PO subjacentes: \fBporefs\fR, \&\fBcopyright\-holder\fR, \fBmsgid\-bugs\-address\fR, \fBpackage\-name\fR, \&\fBpackage\-version\fR, \fBwrap\-po\fR. .RE .SS "Manipulando ficheiros de documentos" .IX Subsection "Manipulando ficheiros de documentos" .IP read($$$) 4 .IX Item "read($$$)" Adiciona outros dados do documento de entrada no final da array existente \&\f(CW\*(C`@{$self\->{TT}{doc_in}}\*(C'\fR. .Sp 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) .Sp Esta matriz \f(CW\*(C`@{$self\->{TT}{doc_in}}\*(C'\fR detém os dados desse documento de entrada como uma matriz de cadeias com significados alternativos. * A cadeia \f(CW$textline\fR que detém cada linha de dados de texto de entrada. * A cadeia \f(CW\*(C`$filename:$linenum\*(C'\fR que detém a sua localização e chamada como "referência" (\f(CW\*(C`linenum\*(C'\fR starts with 1).. .Sp Por favor, note que ele não analisa nada. Deve usar a função \fBparse()\fR quando está feito com o empacotamento de ficheiros de entrada no documento. .IP escrever($) 4 .IX Item "escrever($)" Escreva o documento traduzido no nome do ficheiro dado. .Sp Os dados desse documento traduzido são fornecidos por: * \f(CW\*(C`$self\->docheader()\*(C'\fR a deter o texto de cabeçalho para o plugin e * \f(CW\*(C`@{$self\->{TT}{doc_out}}\*(C'\fR a deter cada linha do principal texto traduzido na matriz. .SS "Manipulando ficheiros PO" .IX Subsection "Manipulando ficheiros PO" .IP readpo($) 4 .IX Item "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. .IP writepo($) 4 .IX Item "writepo($)" Gravar o ficheiro PO extraído no nome do ficheiro dado. .IP \fBstats()\fR 4 .IX Item "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: .Sp .Vb 1 \& [uso normal do documento po4a...] \& \& ($percent,$hit,$queries) = $document\->stats(); \& print "Encontramos traduções para $percent\e% ($hit from $queries) de cadeias.\en"; .Ve .SS "Manipulando a adenda" .IX Subsection "Manipulando a adenda" .IP addendum($) 4 .IX Item "addendum($)" Por favor, consulte \fBpo4a\fR\|(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 ;) .Sp Esta função retorna um inteiro não nulo em caso de erro. .SH "FUNÇÕES INTERNAS usadas para escrever analisadores derivados" .IX Header "FUNÇÕES INTERNAS usadas para escrever analisadores derivados" .SS "Obter a entrada, fornecer a saída" .IX Subsection "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. .PP .Vb 4 \& * 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. .Ve .PP 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. .IP \fBshiftline()\fR 4 .IX Item "shiftline()" Esta função retorna a primeira linha a ser analisada e a referência dele correspondente (empacotada como uma matriz) da matriz \f(CW\*(C`@{$self\->{TT}{doc_in}}\*(C'\fR e descarta estes 2 primeiros itens da matriz. Aqui, a referência é fornecida por uma cadeia \f(CW\*(C`$filename:$linenum\*(C'\fR. .IP unshiftline($$) 4 .IX Item "unshiftline($$)" Desloca a última linha deslocada do documento de entrada e a referência dele correspondente de volta ao cabeçalho de \f(CW\*(C`{$self\->{TT}{doc_in}}\*(C'\fR. .IP pushline($) 4 .IX Item "pushline($)" Força uma nova linha no fim de \f(CW\*(C`{$self\->{TT}{doc_out}}\*(C'\fR. .IP \fBpopline()\fR 4 .IX Item "popline()" Estoira a última linha forçada do final de \f(CW\*(C`{$self\->{TT}{doc_out}}\*(C'\fR. .SS "Marcando cadeias como traduzíveis" .IX Subsection "Marcando cadeias como traduzíveis" Uma função é fornecida para lidar com o texto que deve ser traduzido. .IP translate($$$) 4 .IX Item "translate($$$)" Argumentos obrigatórios: .RS 4 .IP \- 2 Uma cadeia para traduzir .IP \- 2 A referência desta cadeia (ou seja, posição no ficheiro de entrada) .IP \- 2 O tipo desta cadeia (ou seja, a descrição textual do papel estrutural dele; usado em \fBLocale::Po4a::Po::gettextization()\fR; ver também \fBpo4a\fR\|(7), secção \fBGettextization: how does it work?\fR) .RE .RS 4 .Sp Esta função também pode ter alguns argumentos extras. Eles devem ser organizadas como uma \*(Aqhash\*(Aq. Um exemplo: .Sp .Vb 2 \& $self\->translate("string","ref","type", \& \*(Aqwrap\*(Aq => 1); .Ve .IP \fBwrap\fR 4 .IX Item "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. .IP \fBwrapcol\fR 4 .IX Item "wrapcol" a coluna na qual devemos fazer a quebra da linha (predefinição: o valor de \&\fBwrapcol\fR especificado durante a criação do TransTractor ou 76). .Sp O valor negativo será subtraído da predefinição. .IP \fBcomment\fR 4 .IX Item "comment" um comentário adicional para a entrada. .RE .RS 4 .Sp Ações: .IP \- 2 Coloca a cadeia de referência e tipo em po_out. .IP \- 2 Retorna a tradução da cadeia (como encontrada em po_in), de modo que o analisador pode construir o doc_out. .IP \- 2 Lida com os conjuntos de caracteres para recodificar as cadeias antes de as enviar para po_out e antes de voltar às traduções. .RE .RS 4 .RE .SS "Funções diversas" .IX Subsection "Funções diversas" .IP \fBverbose()\fR 4 .IX Item "verbose()" Retorna se a opção \*(Aqverbose\*(Aq foi passada durante a criação do TransTractor. .IP \fBdebug()\fR 4 .IX Item "debug()" Retorna se a opção de depuração foi passada durante a criação doTransTractor. .IP \fBget_in_charset()\fR 4 .IX Item "get_in_charset()" Esta função retorna o charset que foi fornecido como o conjunto de caracteres mestre .IP \fBget_out_charset()\fR 4 .IX Item "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). .Sp 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. .SH "DIREÇÕES FUTURAS" .IX Header "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. .PP Para resolver este problema, as únicas mudanças na interface necessárias são: .IP \- 2 obter um \*(Aqhash\*(Aq como po_in_name (uma lista por idioma) .IP \- 2 adicionar um argumento para traduzir para indicar a língua apontada .IP \- 2 fazer uma função pushline_all, que deveria fazer pushline do conteúdo dele para todos idiomas, a usar uma sintaxe tipo mapa: .Sp .Vb 3 \& $self\->pushline_all({ "Description[".$langcode."]=". \& $self\->translate($line,$ref,$langcode) \& }); .Ve .PP Vamos ver se é suficiente ;) .SH AUTORES .IX Header "AUTORES" .Vb 3 \& Denis Barbier \& Martin Quinson (mquinson#debian.org) \& Jordi Vilalta .Ve