Locale::Po4a::Xml - converte documentos XML e derivados de/para
arquivos PO
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.
Locale::Po4a::Xml é um módulo para ajudar a
tradução de documentos XML para outros idiomas. Ele
também pode ser usado como uma base para compilar módulos para
documentos baseados em XML.
Esse módulo pode ser usado diretamente para manipular
documentos XML genéricos. Ele vai extrair o conteúdo de todas
as marcações, porém de nenhum atributo, já que
é onde o texto está escrito na maioria dos documentos baseados
em XML.
Há algumas opções (descritas na
próxima seção) que podem personalizar este
comportamento. Se isso não se adequar ao formato do seu documento,
encorajamos você a escrever seu próprio módulo derivado
deste, para descrever os detalhes do seu formato. Veja a seção
abaixo ESCREVENDO MÓDULOS DERIVADOS, para a
descrição do processo.
A opção de depuração global causa esse
módulo a mostrar as strings excluídas, para ver se ignora
alguma coisa importante.
Estas são as opções específicas deste
módulo:
- nostrip
- Previne-o de cortar espaços em volta das strings
extraídas.
- wrap
- Canoniza a string para traduzir, considerando que espaços em branco
não são importantes e dimensiona o documento traduzido. Essa
opção pode ser sobrescrita por opções
personalizadas de marcação. Veja a opção
translated abaixo.
- unwrap_attributes
- Atributos são quebrados por padrão. Essa opção
desabilita a quebra.
- caseinsensitive
- Isso faz com que a pesquisa por marcações e atributos
funcione de uma forma que diferencie letras maiúsculas das
minúsculas. Se essa opção estiver definida, ela vai
tratar <BooK>laNG e <BOOK>Lang como <book>lang.
- escapequotes
- Escapa aspas em strings de saída. Necessário, por exemplo,
para criação de recursos de string para usar por ferramentas
de compilação de Android.
Veja também:
https://developer.android.com/guide/topics/resources/string-resource.html
- includeexternal
- Quando definida, entidades externas são incluídas no
documento gerado (traduzido) e para a extração de strings.
Se não estiver definido, você terá que traduzir
entidades externas separadamente como documentos independentes.
- ontagerror
- Essa opção define o comportamento do módulo quando
ele encontrar uma sintaxe XML inválida (uma marcação
fechando que não corresponde a última marcação
abrindo). Ele pode levar os seguintes valores:
- fail
- Esse é o valor padrão. O módulo vai sair com um
erro.
- warn
- O módulo vai continuar e vai fazer um aviso.
- silent
- O módulo vai continuar sem qualquer aviso.
Tenha cuidado ao usar essa opção. Ela geralmente
é recomendada para corrigir o arquivo de entrada.
- tagsonly
- Nota: essa opção é obsoleta.
Extrai apenas as marcações especificadas na
opção tags. Do contrário, ela
extrairá todas as marcações, com
exceção daquelas especificadas.
- doctype
- String que tentará corresponder com a primeira linha do tipo de
documento (doctype) do documento (se definido). Se não estiver
definido, um aviso vai indicar que o documento pode ser um tipo
incorreto.
- addlang
- String indicando o caminho (ex.: <bbb><aaa>) de uma
marcação na qual um atributo lang="..." deve ser
adicionado. O idioma será definido como o nome base do arquivo PO
sem qualquer extensão.
- optionalclosingtag
- Booleano indicando se as tags de fechamento são opcionais (como em
HTML). Por padrão, as tags de fechamento ausentes geram um erro
tratado de acordo com ontagerror.
- tags
- Nota: Essa opção é obsoleta. Você deveria usar
as opções translated e untranslated ao
invés dessa.
Lista separada por espaço de marcações
que você deseja traduzir ou ignorar. Por padrão, as
marcações especificadas serão excluídas, mas
se você usar a opção "tagsonly", as
marcações especificadas serão as únicas
incluídas. As marcações devem estar na forma
<aaa>, mas você pode juntar algumas
(<bbb><aaa>) para informar que o conteúdo da tag
<aaa> será traduzido apenas quando ela estiver dentro de
uma marcação <bbb>.
Você também pode especificar algumas
opções de marcação para colocar alguns
caracteres na frente da hierarquia de marcações. Por
exemplo, você pode colocar um w (wrap) or W
(não aplica wrap) para sobrescrever o comportamento padrão
especificado pela opção global wrap.
Exemplo: W<capítulo><título>
- attributes
- Lista separada por espaço de atributos da marcação
que você deseja traduzir. Você pode especificar os atributos
por seus nomes (por exemplo, "lang"), mas você pode
prefixar com uma hierarquia de marcações, para especificar
que esse atributo vai ser traduzido apenas quando ele estiver na
marcação especificada. Por exemplo:
<bbb><aaa>lang especifica que o atributo lang será
traduzido apenas se ele estiver dentro de uma marcação
<aaa> e dentro de uma marcação <bbb>.
- foldattributes
- Não traduz atributos nas marcações integradas. Ao
invés disso, substitui todos os atributos de uma
marcação por po4a-id=<id>.
Isso é útil quando os atributos não devam
ser traduzidos, pois isso simplifica as strings para tradutores e evita
erros de escrita.
- customtag
- Lista separada por espaço de marcações que não
deveriam ser tratadas como marcações. Essas
marcações são tratadas como integradas e não
precisam ser fechadas.
- break
- Lista separada por espaço de marcações que deveriam
interromper a sequência. Por padrão, todas as
marcações interrompem a sequência.
As marcações estar na forma <aaa>, mas
você pode juntar alguns (<bbb><aaa>), se uma
marcação (<aaa>) deveria ser considerada apenas
quando ela estiver dentro de outra marcação
(<bbb>).
Note que uma tag deve ser listada em apenas uma string de
configuração de break, inline
placeholder ou customtag.
- inline
- Lista separada por espaço de marcações que deveriam
ser tratadas como integradas. Por padrão, todas as
marcações interrompem a sequência.
As marcações estar na forma <aaa>, mas
você pode juntar alguns (<bbb><aaa>), se uma
marcação (<aaa>) deveria ser considerada apenas
quando ela estiver dentro de outra marcação
(<bbb>).
- placeholder
- Lista separada por espaço de marcações que devem ser
tratadas como placeholders. Elas não interrompem a
sequência, mas o conteúdo desses placeholders é
traduzido separadamente.
A localização do placeholder em seu bloco
será marcado com uma string similar a:
<placeholder type=\"footnote\" id=\"0\"/>
As marcações estar na forma <aaa>, mas
você pode juntar alguns (<bbb><aaa>), se uma
marcação (<aaa>) deveria ser considerada apenas
quando ela estiver dentro de outra marcação
(<bbb>).
- break-pi
- Por padrão, as Instruções de Processamento (ou seja,
tags "<? ... ?>") são
tratadas como tags embutidas. Passe essa opção se desejar
que as I.P. sejam tratadas como tag de quebra. Note que tags PHP
não processadas são tratadas como Instruções
de Processamento pelo analisador.
- nodefault
- Lista separada por espaço de marcações que o
módulo não deveria tentar definir por padrão em
qualquer categoria.
Se você tiver uma tag que tenha sua
configuração padrão pela subclasse deste
módulo, mas desejar definir uma configuração
alternativa, será necessário listar essa tag como parte da
string de configuração nodefault.
- cpp
- Diretivas de suporte do preprocessador C. Quando essa opção
está definida, po4a vai considerar as diretivas do preprocessador
como separadores de parágrafo. Isso é importante se o
arquivo XML deve ser preprocessado porque, do contrário, as
diretivas podem ser inseridas no meio de linhas se po4a considerar que
elas pertencem ao parágrafo atual, e elas não serão
reconhecidas pelo preprocessador. Nota: as diretivas do preprocessador
devem aparecer apenas entre marcações (elas não podem
interromper uma marcação).
- translated
- Lista separada por espaço de marcações que
você deseja traduzir.
As marcações estar na forma <aaa>, mas
você pode juntar alguns (<bbb><aaa>), se uma
marcação (<aaa>) deveria ser considerada apenas
quando ela estiver dentro de outra marcação
(<bbb>).
Você também pode especificar algumas
opções de marcação para colocar alguns
caracteres na frente da hierarquia de marcações. Isso
sobrescreve o comportamento padrão especificado pelas
opções globais wrap e
defaulttranslateoption.
- w
- Tags deveriam ser traduzidas e o conteúdo pode ser
redimensionado.
- W
- Tags deveriam ser traduzidas e o conteúdo não deveria ser
redimensionado.
- i
- Tags deveriam ser traduzidas integradas.
- p
- Tags deveriam ser traduzidas como placeholders.
Internamente, o analisador XML só se preocupa com essas
quatro opções: w W i p.
* As tags listadas em break são definidas como
w ou W dependendo da opção wrap.
* As tags listadas em inline são definidas como
i.
* As tags listadas em placeholder são definidas como
p.
* As tags listadas em untranslated estão sem nenhuma
dessas opções definidas.
Você pode verificar o comportamento real do
parâmetro interno invocando po4a com a opção
--debug.
Exemplo: W<capítulo><título>
Note que uma tag deve estar listada na string de
configuração translated ou untranslated.
- untranslated
- Lista separada por espaço de marcações que
você não deseja traduzir.
As marcações estar na forma <aaa>, mas
você pode juntar alguns (<bbb><aaa>), se uma
marcação (<aaa>) deveria ser considerada apenas
quando ela estiver dentro de outra marcação
(<bbb>).
Note que uma tag inline traduzível em uma tag
não traduzida é tratada como uma tag de quebra
traduzível, a configuração i é
descartada e w ou W é definida dependendo da
opção wrap.
- defaulttranslateoption
- As categorias padrão para marcações que estão
em nenhum entre "translated", "untranslated",
"break", "inline" ou "placeholder".
Este é um conjunto de letras, conforme definido em
translated, e essa configuração é
válida apenas para tags traduzíveis.
DEFINA QUAIS MARCAÇÕES E ATRIBUTOS DEVEM SER
TRADUZIDOS
A personalização mais simples é definir quais
marcações e atributos você deseja que o analisador
traduzida. Isso deveria ser feito na função
"initialize". Primeiro, você deveria chamar o
"initialize" principal, para obter as opções de
linha de comando e, então, anexe suas definições
personalizadas aos hash de opções. Se você deseja
tratar algumas novas opções a partir da linha de comando,
você deveria defini-las antes de chamar o "initialize"
principal:
$self->{options}{'new_option'}='';
$self->SUPER::initialize(%options);
$self->{options}{'_default_translated'}.=' <p> <head><title>';
$self->{options}{'attributes'}.=' <p>lang id';
$self->{options}{'_default_inline'}.=' <br>';
$self->treat_options;
Você deveria usar as opções
_default_inline, _default_break, _default_placeholder,
_default_translated, _default_untranslated e
_default_attributes nos módulos derivados. Isso permite que
usuários sobrescrevam o comportamento padrão definido em seu
módulo com opções de linha de comando.
Se você não gostar do comportamento padrão
deste módulo xml e seus módulos derivados, poderá
fornecer opções de linha de comando para alterar seu
comportamento.
Veja Locale::Po4a::Docbook(3pm),
SOBRESCREVENDO A FUNÇÃO found_string
Outro passo simples é sobrescrever a função
"found_string", que recebe as strings extraídas do
analisador, para traduzi-las. Lá, você pode controlar quais
strings você deseja traduzir e realizar transformações
nelas antes ou após a tradução em si.
Ela recebe o texto extraído, a referência de onde
ele estava e um hash que contém informações extras para
controlar quais strings devem ser traduzidas, como traduzi-las e para gerar
o comentário.
O conteúdo dessas opções dependem do tipo de
string (especificado em uma entrada dessa hash):
- type="tag"
- A string encontrada é o conteúdo de uma
marcação traduzível. A entrada
"tag_options" contém os caracteres da opção
na frente da hierarquia de marcação na opção
"tags" do módulo.
- type="attribute"
- Significa que a string encontrada é o valor de um atributo
traduzível. A entrada "atributo" possui o nome do
atributo.
Ela deve retornar o texto que vai substituir o original no
documento traduzido. Aqui está um exemplo básico dessa
função:
sub found_string {
my ($self,$text,$ref,$options)=@_;
$text = $self->translate($text,$ref,"type ".$options->{'type'},
'wrap'=>$self->{options}{'wrap'});
return $text;
}
Há um outro exemplo simples no novo módulo do Dia, o
qual filtra apenas algumas strings.
MODIFICANDO TIPOS DE MARCAÇÕES (A FAZER)
Isso é mais complexo, mas permite quase que uma
personalização total. É baseado em uma lista de hashes,
cada um definindo um comportamento do tipo de marcação. A
lista deveria ser organizado de forma que a maioria das
marcações gerais estão após aquelas mais
concretas (organizadas primeiro pelas chaves iniciais e, então, pelas
finais). Para definir um tipo de marcação, você
terá que fazer um hash com as seguintes chaves:
- beginning
- Especifica o começo da marcação, após do
"<".
- end
- Especifica o fim da marcação, antes do
">".
- breaking
- Informa se essa é uma classe de interrupção de
marcação. Uma marcação de
não-interrupção (integrada) é aquela que pode
ser levada como parte do conteúdo de outra marcação.
Ela pode levar os valores falso (0), verdadeiro (1) ou indefinido. Se
você deixa-la como indefinida, você terá que definir
a função f_breaking que vai dizer se uma
marcação concreta dessa classe é uma
marcação de interrupção ou não.
- f_breaking
- Essa é uma função que vai dizer se a próxima
marcação é uma de interrupção ou
não. Ela deveria ser definida se a opção
breaking não estiver.
- Se você deixar essa chave indefinida, a função de
extração genérica terá ela mesma que extrair a
marcação. Isso é útil para
marcações que podem ter outras marcações ou
estruturas especiais nelas, de forma que o analisador principal não
fique doido. Essa função recebe um booleano que informa se a
marcação deveria, ou não, ser removida do fluxo de
entrada.
- f_translate
- Essa função recebe a marcação (no formato de
get_string_until() ) e retorna a marcação traduzida
(atributos traduzidos ou todas as transformações
necessárias) como uma string única.
TRABALHANDO COM MARCAÇÕES
- get_path()
- Essa função retorna o caminho da marcação
atual da raiz do documento, na forma de <html><body><p>.
Um vetor adicional de marcações (sem sinais de
maior que, menor que) podem ser passados como argumentos. Esses
elementos de caminho são adicionados ao final do caminho
atual.
- tag_type()
- Essa função retorna o índice da lista tag_types que
ajusta à próxima aba no fluxo de entrada, ou -1 se ela
está ao final do arquivo de entrada.
Aqui, a tag tem estrutura iniciada por < e finalizada por
> e pode conter várias linhas.
Isso funciona no vetor
"@{$self->{TT}{doc_in}}" detendo os
dados do documento de entrada e referência indiretamente via
"$self->shiftline()" e
"$self->unshiftline($$)".
- Essa função retorna a marcação seguinte do
fluxo de entrada sem o início e fim, em uma forma de vetor, para
manter a referência do arquivo de entrada. Ela tem dois
parâmetros: o tipo da marcação (como retornada por
tag_type) e um booleano, que indica se ela deveria ser removida do fluxo
de entrada.
Isso funciona no vetor
"@{$self->{TT}{doc_in}}" detendo os
dados do documento de entrada e referência indiretamente via
"$self->shiftline()" e
"$self->unshiftline($$)".
- get_tag_name(@)
- Essa função retorna o nome da marcação passada
como um argumento, na forma de vetor retornado por extract_tag.
- breaking_tag()
- Essa função retorna um booleano que informa se a
próxima marcação no fluxo de entrada é uma
marcação de interrupção ou não
(marcação integrada). Ela deixa o fluxo de entrada
intacto.
- treat_tag()
- Essa função traduz a próxima marcação
do fluxo de entrada, usando as funções de
tradução personalizada de cada tipo de
marcação.
Isso funciona no vetor
"@{$self->{TT}{doc_in}}" detendo os
dados do documento de entrada e referência indiretamente via
"$self->shiftline()" e
"$self->unshiftline($$)".
- tag_in_list($@)
- Essa função retorna um valor de string que informa se o
primeiro argumento (uma hierarquia de marcações) corresponde
a qualquer das marcações do segundo argumento (uma lista de
marcações ou hierarquias de marcações). Se ela
não corresponder, retorna 0. Do contrário, retorna as
opções da marcação correspondente (os
caracteres na frente da marcação) ou 1 (se aquela
marcação não possuir opções).
TRABALHANDO COM ATRIBUTOS
- treat_attributes(@)
- Essa função manipula a tradução dos atributos
das marcações. Ela recebe a marcação sem as
marcas de início / fim e, então, ela encontra os atributos e
traduz os traduzíveis (especificado pela opção do
módulo attributes). Isso retorna uma string simples com a
marcação traduzida.
TRABALHANDO COM CONTEÚDOS MARCADOS
- treat_content()
- Essa função obtém o texto até a próxima
tag de quebra (não em linha) do fluxo de entrada. Traduza-a usando
as funções de tradução personalizadas de cada
tipo de marcação.
Isso funciona no vetor
"@{$self->{TT}{doc_in}}" detendo os
dados do documento de entrada e referência indiretamente via
"$self->shiftline()" e
"$self->unshiftline($$)".
TRABALHANDO COM AS OPÇÕES DO MÓDULO
- treat_options()
- Essa função preenche as estruturas internal que
contém as marcações, atributos e dados integrados com
as opções do módulo (especificado na linha de comando
ou na função "inicialize").
OBTENDO TEXTO DO DOCUMENTO DE ENTRADA
- get_string_until($%)
- Essa função retorna um vetor com as linhas (e
referências) do documento de entrada até encontrar o
primeiro argumento. O segundo argumento é um hash de
opções. Valor 0 significa desabilitado (o padrão) e
1, habilitado.
As opções válidas são:
- include
- Isso faz o vetor resultante conter o texto pesquisado
- remove
- Isso remove o fluxo retornado da entrada
- unquoted
- Isso garante que o texto pesquisado não está entre
aspas
- regex
- Isso indica que o primeiro argumento é uma expressão regular
e não uma string simples
- skip_spaces(\@)
- Essa função recebe como argumento a referência para
um parágrafo (no formato retornado por get_string_until), ignora
seu espaço inicial e retorna-as como uma string simples.
- join_lines(@)
- Essa função retorna uma string simples com o texto de um
vetor de argumentos (descartando as referências).
Esse módulo pode traduzir marcações e
atributos.
DOCTYPE (ENTIDADES)
Há um suporte mínimo para a tradução
de entidades. Elas são traduzidos como um todo e
marcações não são levadas em conta. Não
há suporte a entidades multilinhas, sofrendo elas uma quebra de linha
durante a tradução.
MODIFICAR TIPOS DE MARCAÇÃO DE MÓDULOS
HERDADOS (move a estrutura de tag_types para dentro do
$self hash?)
Jordi Vilalta <jvprat@gmail.com>
Nicolas François <nicolas.francois@centraliens.net>
Copyright © 2004 Jordi Vilalta <jvprat@gmail.com>
Copyright © 2008-2009 Nicolas François <nicolas.francois@centraliens.net>
Esse programa é um software livre; você pode
redistribuí-lo e/ou modificá-lo sob os termos da GPL (veja o
arquivo COPYING).