| Versão original: Language information and text direction | Traduzido por: De Sena Viegas |
Conteúdos
Nesta secção do documento discutem-se dois tópicos importantes que influenciam a internacionalização do HTML: a especificação do idioma (através do atributo lang) e da direcção (através do atributo dir) do texto num documento.
A informação referente ao idioma , especificada através do atributo lang, poderá ser usada pelo agente de várias maneiras, a fim de controlar uma representação. As situações nas quais o autor forneceu informação referente ao idioma poderão ser úteis, como por exemplo:
O atributo lang especifica o idioma do conteúdo do elemento e os valores do atributo; se ele é ou não relevante para um determinado atributo, tudo depende da sintaxe e da semântica do atributo e da operação envolvida.
O objectivo do atributo
Por exemplo, se aparecerem caracteres do alfabeto grego no meio de um texto em Inglês:
<P><Q lang="en">Os seus super-poderes eram o resultado das radiações γ-</Q> disse ele.</P>
o agente (1) deverá tentar apresentar o conteúdo em Inglês da forma mais apropriada (por exemplo, no que respeita às aspas e outras marcas de citação) e (2) fazer o melhor possível para representar γ, mesmo que este carácter não pertença ao alfabeto Inglês.
Consulte a secção referente aos caracteres não representáveis, para informações mais detalhadas.
O valor do atributo lang é-nos dado sob a forma de um código de idioma, o qual identifica o idioma nativo escrito, falado ou usado de uma qualquer outra forma para se comunicar e transmitir informações entre as pessoas. As linguagens de computação estão explicitamente excluídas dos códigos dos idiomas.
A recomendação [RFC1766] define e explica os códigos dos idiomas a serem usados nos documentos HTML.
Resumidamente, os códigos dos idiomas consistem num código primário e ainda em possíveis séries de sub-códigos vazios:
código do idioma = código-primário ( "-" sub-código )*
Eis aqui alguns exemplos de códigos de idiomas:
No documento [ISO639] são previstas as abreviações dos idiomas, as quais são formadas apenas por duas letras. Este código constituído por duas letras inclui: fr (Francês), de (Alemão), it (Italiano),nl (Holandês), el (Grego), es (Espanhol), pt (Português), ar (Árabe), he(Hebreu), ru (Russo), zh (Chinês), ja (Japonês), hi (Hindu), ur (Urdu) e sa (Sânscrito).
Qualquer sub-código formado por duas letras é interpretado como sendo o código de um país, previsto em [ISO3166].
Os elementos herdam a informação do código do idioma em questão de acordo com a seguinte ordem de precedência (do maior para o menor):
Content-Language: en-cockney
Neste exemplo, o idioma principal do documento é o Francês ("fr"). Um dos parágrafos foi declarado como estando escrito em Espanhol ("es"), a seguir ao qual o idioma principal voltará a ser o Francês. O parágrafo seguinte inclui uma frase em Japonês, a seguir à qual o idioma principal voltará a ser o Francês.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML lang="fr">
<HEAD>
<TITLE>Documento multilíngue</TITLE>
</HEAD>
<BODY>
...Interpretado em Francês...
<P lang="es">...Interpretado em Espanhol...
<P>...Interpretado de novo em Francês...
<P>...o texto em Francês foi aqui interrompido por<EM lang="ja"> KIMONO, HITASHI, MINOLTA, HIROITO, caracteres
em Japonês</EM> o texto em Francês recomeça de novo aqui...
</BODY>
</HTML>
No contexto do HTML, o código do idioma deveria ser interpretado pelos agentes como sendo uma hierarquia de palavras ou "tokens" e não apenas uma única palavra ou "token". Quando um agente ajusta a apresentação do documento de acordo com a informação do idioma que foi recebida (digamos, através da comparação dos códigos do idioma das folhas de estilo e dos valores lang), ele deverá não só facultar sempre um resultado exacto, como também considerar os códigos principais como sendo suficientes. Assim, se o valor do atributo lang de "en-US" for estabelecido para o elemento HTML, o agente deverá primeiro dar preferência à informação do estilo usado em "en-US" e de seguida ao valor geral "en".
Nota: as hierarquias dos códigos dos idiomas não garantem que todos os idiomas que contenham um prefixo comum sejam compreendidas por todos aqueles que sejam fluentes em um ou mais idiomas. Elas permitem no entanto que o utente faça uso delas sempre que tal lhe seja útil ou necessário.
Definições do atributo
A somar à especificação do idioma de um documento, através do atributo lang, os autores poderão ter ainda de especificar a direccionalidade básica (LTR ou RTL) nalgumas partes do texto contido num documento, nas estruturas das tabelas, etc. Tal acção é realizada com a ajuda do atributo dir.
A especificação [UNICODE] atribui uma direccionalidade aos caracteres e define um algoritmo (complexo) para a determinação da direccionalidade do texto mais apropriada. Se o documento não conter os caracteres RTL, não será requerido que o agente aplique o algoritmo de bidireccionalidade [UNICODE]. Se o documento conter os caracteres RTL e se o agente usado pelo utente os exibir, então será necessário que o referido agente utilize o algoritmo de bidireccionalidade.
Embora o UNICODE especifique caracteres especiais que lidem com a direccionalidade do texto, o HTML oferece-nos estruturas que executam a mesma acção: o atributo dir (não confundir com o elemento DIR) e o elemento BDO. Assim, para expressar uma citação em Hebraico, será mais intuitivo escrever
<Q lang="he" dir="rtl">...citação em Hebraico...</Q>
do que usar as referências que lhe são equivalentes em UNICODE:
‫״...citação em Hebraico...״‬
Os agentes não terão de usar o atributo lang para determinar a direccionalidade do texto.
O atributo dir é herdado e po de ser anulado. Por favor, consulte a secção referente à herança da informação sobre a direcção do texto, para mais detalhes.
O exemplo que se segue ilustra o comportamento que é previsto para o algoritmo bidireccional. Ele envolve Inglês, com um "script" LTR (left-to-right) e Hebraico, com um "script" RTL (right-to-left).
Consideremos o seguinte exemplo de um texto:
Inglês1 HEBRAICO2 Inglês3 HEBRAICO4 Inglês5 HEBRAICO6
Os caracteres contidos neste exemplo (e em todos os exemplos relatados) são armazenados no computador da seguinte maneira: o primeiro carácter contido no ficheiro é o "I", o segundo é o "n", e o último é o "6".
Suponha que o idioma predominante no documento que contém este parágrafo é o Inglês. Isso significa que a direcção básica é LTR (da esquerda para a direita). A correcta representação desta linha seria:
Inglês1 2OCIARBEH Inglês3 4OCIARBEH Inglês5 6OCIARBEH
<------ <------ <------
H H H
------------------------------------------------->
I
As linhas representadas a tracejado indicam a estrutura da frase: O Inglês predomina e existem alguns textos em Hebraico que foram integrados no documento. Para se obter uma correcta representação não será necessário qualquer "markup" adicional, desde que os fragmentos em Hebraico sejam correctamente revertidos pelos agentes, aplicando-se o algoritmo de bidireccionalidade.
Por outro lado, se o idioma predominante no documento for o Hebraico, a base direccional será do tipo RTL (da direita para a esquerda). A sua correcta representação seria:
6OCIARBEH Inglês5 4OCIARBEH Inglês3 2OCIARBEH Inglês1
-------> -------> ------->
I I I
<-------------------------------------------------
H
Neste caso, a frase foi apresentada da direita para a esquerda (RTL) e as sequências em Inglês nela encaixadas foram devidamente invertidas por um algoritmo bidireccional.
O algoritmo bidireccional em UNICODE requer a base direccional do texto que é usada nos blocos de texto. Para especificar a direcção do elemento ao nível de bloco, aplica-se o atributo do elemento dir. O valor do atributo dir definido por defeito é igual "ltr" (texto da esquerda para a direita, do Inglês: "left-to-right").
Quando o atributo dir é definido para um elemento ao nível de um bloco, ele terá um efeito equivalente à duração do elemento e de qualquer elemento que tenha sido integrado ao nível desse bloco. Re-definindo o atributo dir pertencente a um elemento que tenha sido integrado num texto anula-se o valor que tenha sido herdado.
Para definir a base direccional do texto para um documento inteiro, coloque o atributo dir no interior das "tags" do elemento HTML.
Por exemplo:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <HTML dir="RTL"> <HEAD> <TITLE>...título definido da direita para a esquerda...</TITLE> </HEAD> ...texto da direita para a esquerda... <P dir="ltr">...texto da esquerda para a direita...</P> <P>...outra vez o texto da direita para a esquerda...</P> </HTML>
Por outro lado, os elementos "inline" não herdam o atributo dir. Isto significa que um elemento "inline" que não contenha o atributo dir não abrirá nenhum nível adicional de integração ou encaixamento no que diz respeito ao algoritmo bidireccional. (Aqui, considera-se que o elemento esteja em bloco ou "inline", baseando-se na sua apresentação por defeito. Note que os elementos INS e DEL podem ser de bloco ou "inline", de acordo com o seu contexto.)
O algoritmo bidireccional [UNICODE] inverte automaticamente as sequências de caracteres de acordo com a direccionalidade herdada (como definido nos exemplos anteriores). Contudo e de uma forma geral, apenas se poderá ter em conta um nível de integração. Para se conseguirem níveis adicionais com mudanças de direcções integradas, você terá de fazer uso do atributo
Consideremos agora o exemplo do mesmo texto da seguinte forma:
Inglês1 HEBRAICO2 Inglês3 HEBRAICO4 Inglês5 HEBRAICO6
Suponha que o idioma predominante no documento que contém este parágrafo é o Inglês. Além disso, essa frase em Inglês contém a extensão de uma secção, a qual vai de HEBRAICO2 a HEBRAICO4 e que contém uma citação em Inglês, denominada de "Inglês3". O texto será assim representado por:
Inglês1 4OCIARBEH Inglês3 2OCIARBEH Inglês5 6OCIARBEH
------->
I
<-----------------------
H
------------------------------------------------->
I
Para se obterem duas mudanças de direcção integradas, nós teremos de fornecer alguma informação adicional, através da delimitação explícita da segunda integração ou encaixamento do texto. Neste exemplo, nós usamos o elemento SPAN e o atributo dir para etiquetar o texto:
Inglês1 <SPAN dir="RTL">HEBRAICO2 Inglês3 HEBRAICO4</SPAN> Inglês5 HEBRAICO6
Os autores poderão ainda usar caracteres especiais em UNICODE, de forma a obter mudanças múltiplas de direcção dos textos integrados. Para se conseguir a integração de um texto do tipo LTR (da esquerda para a direita), delimita-se o texto integrado com os caracteres LEFT-TO-RIGHT EMBEDDING ("LRE", hexadécimal 202A) e POPDIRECTIONAL FORMATTING ("PDF", hexadécimal 202C). Para se obter uma integração do tipo RTL (da direita para a esquerda, do Inglês: right-to-left), delimita-se o texto integrado com os caracteres RIGHT-TO-LEFT EMBEDDING ("RTE", hexadécimal 202B) e PDF.
Usando a marcação da direccionalidade HTML através dos caracteres de Unicode. Os autores e desenhadores de software deverão estar conscientes do facto de que poderão surgir alguns conflitos, caso o atributo dir seja usado em elementos "inline" (incluíndo BDO), fazendo dessa forma concorrência com a correspondente formatação dos caracteres em [UNICODE]. Dever-se-á dar preferência a apenas um deles, usando-o no de forma exclusiva. O método de marcação ou etiquetagem oferece uma melhor garantia no que respeita à integridade estrutural de um documento e livra-nos de alguns problemas sempre que pretendermos editar textos HTML bidireccionais com a ajuda de um editor de texto simples, se bem que alguns softwares possam estar mais aptos a usar os caracteres em
<!ELEMENT BDO - - (%inline;)* -- anular I18N BiDi --> <!ATTLIST BDO %coreattrs; -- id, class, style, title -- lang %LanguageCode; #IMPLIED -- código do idioma -- dir (ltr|rtl) #REQUIRED -- direccionalidade -- >
"tag" de abertura: requerida
"tag" de encerramento: requerida
Definições do atributo
Atributos definidos noutro sítio:
O algoritmo de bidireccionalidade e o atributo dir são de uma maneira geral o suficiente para manejar as mudanças de direcção encaixadas. Poderão contudo surgir algumas situações em que da aplicação do algoritmo bidireccional resulte uma incorrecta representação dos dados. O elemento BDO permite aos autores desactivar o algoritmo bidireccional nos fragmentos de texto seleccionados.
Consideremos um documento contendo ainda o mesmo texto do exemplo anterior:
Inglês1 HEBRAICO2 Inglês3 HEBRAICO4 Inglês5 HEBRAICO6
mas suponhamos que o texto já foi processado na sua ordem visual. Uma das razões para tal, poderá ser o facto do standard MIME ([RFC2045], [RFC1556]) favorecer as ordens visuais, neste caso, que a sequência de caracteres ordenados da direita para a esquerda seja inserida na corrente de bytes também da direita para a esquerda. Num "email", o exemplo de cima poderá ser formatado, incluindo mudanças de linha, da seguinte forma:
Inglês1 2OCIARBEH Inglês3 4OCIARBEH Inglês5 6OCIARBEH
Neste caso entra-se em conflito com o algoritmo de bidireccionalidade [UNICODE], dado que o referido algoritmo inverteria 2WERBEH, 4WERBEH e 6WERBEH pela segunda vez, dispondo as palavras em Hebraico da esquerda para a direita em vez de as dispor de direita para a esquerda.
A solução para tal conflito seria anular o algoritmo bidireccional, introduzindo o excerto do email no elemento PRE (para conservar as mudanças de linha) e cada linha no elemento BDO, cujo atributo dir será por sua vez ajustado para LTR:
<PRE> <BDO dir="LTR">Inglês1 2OCIARBEH Inglês3</BDO> <BDO dir="LTR">4OCIARBEH Inglês5 6OCIARBEH</BDO> </PRE>
Desta maneira ordena-se ao algoritmo bidireccional "Deixa-me da esquerda para a direita!" produzindo-se assim a desejada apresentação:
Inglês1 2OCIARBEH Inglês3 4OCIARBEH Inglês5 6OCIARBEH
O elemento BDO deverá ser usado em cenários onde seja requerido o absoluto controlo sobre ordens de sequência (ex: números de referência de idiomas múltiplos). O uso do atributo dir é obrigatório para este elemento.
Os autores também poderão usar os caracteres especiais em Unicode para anular o algoritmo bidireccional – anular da esquerda para a direita, do Inglês: LEFT-TO-RIGHT OVERRIDE (202D) ou anular da direita para a esquerda, do Inglês: RIGHT-TO-LEFT OVERRIDE (hexadécimal 202E). O carácter POP DIRECTIONAL FORMATTING (hexadécimal 202C) finaliza ambas as anulações bidireccionais.
Nota: recorde-se que poderão surgir conflitos, caso o atributo dir seja usado nos elementos "inline" (incluíndo BDO) simultaneamente com os caracteres de formatação [UNICODE].
A bidireccionalidade e a codificação dos caracteres
De acordo com [RFC1555] e [RFC1556], existem convenções especiais para o uso dos valores do parâmetro "charset", de forma a se poder indicar a bidireccionalidade na correspondência MIME, em particular na distinção entre direccionalidade visual, implícita e explícita. O valor de parâmetro "ISO-8859-8" (para o Hebraico) implica uma codificação visual, "ISO-8859-8-i" uma bidireccionalidade implícita e "ISO-8859-8-e" uma direccionalidade explícita.
Dado que o HTML se serve do algoritmo de bidireccionalidade em UNICODE, os documentos em conformidade codificados através de ISO 8859-8 deverão ser etiquetados como "ISO-8859-8-i". O controlo direccional explícito também é possível por intermédio do HTML, mas não poderá ser expressado com a codificação ISO 8859-8, de modo que "ISO-8859-8-e" não se deveria usar.
O valor "ISO-8859-8" indica que o documento é formatado visualmente, utilizando o código de uma forma incorrecta (tal como TABLE com alinhamento à direita e nenhum ajustamento de linhas), de forma a assegurar uma razoável apresentação nos agentes mais antigos, os quais não estejam aptos a considerar os casos de bidireccionalidade. Esses documentos não estão em conformidade com a actual especificação. Se necessário, eles poderão ser estruturados de acordo com a corrente especificação (ao mesmo tempo que são correctamente representados pelos agentes mais antigos), adicionando-se-lhes a marcação BDO onde for necessário. Contrariamente aquilo que é dito em [RFC1555] e em [RFC1556], ISO-8859-6 (Arabic) não tem nada a ver com o ordenamento visual.
Dado que por vezes se dão algumas ambiguidades no caso da direccionalidade dos caracteres (ex: a pontuação), a especificação [UNICODE] inclui caracteres que permitem a sua resolução. O UNICODE inclui além disso alguns caracteres que permitem controlar o comportamento na junção de elementos, sempre que tal seja necessário (como é o caso de algumas situações envolvendo letras árabes). O HTML 4 inclui referências de caracteres para esses caracteres.
Os seguintes excertos da DTD apresentam algumas das entidades direccionais:
<!ENTITY zwnj CDATA "‌"--=separador de largura zero (do Inglês: zero width non-joiner)--> <!ENTITY zwj CDATA "‍"--=conector de largura zero , (do Inglês: zero width joiner)--> <!ENTITY lrm CDATA "‎"--=marca da esquerda para a direita--> <!ENTITY rlm CDATA "‏"--=marca da direita para a esquerda-->
A entidade zwnj (zero-widht-no-joiner) é usada para bloquear o comportamento de junção, nos contextos onde a união ocorre mas não deveria ocorrer. A entidade zwj (zero-width-joiner) é responsável pelo oposto ao exemplo acima referido;ela força a junção sempre que ela não ocorra, mas que assim o deva. Por exemple, a letra árabe "HEH" é usada para abreviar "Hijri", o nome do sistema de calendário Islâmico. Dado que a forma isolada de "HEH" se assemelha ao dígito "5", como é empregue na escrita Árabe (baseado nos dígitos Índicos), para se prevenirem eventuais confusões contendo "HEH" como dígito final "5" pertencente ao ano do calendário, usa-se em vez disso a forma inicial de "HEH". Não existe contudo qualquer contexto prosseguidor (como por exemplo uma letra de junção) ao qual se possa unir "HEH". O carácter zwj fornece-nos esse contexto.
Similarmente, nos textos Persas existem casos onde uma letra se uniria normalmente a uma letra subsequente, se bem que numa conecção cursiva tal não deva acontecer. O carácter zwnj é usado para bloquear a junção dos casos referidos.
Os outros caracteres, lrm e rlm, são usados para forçar a direccionalidade de caracteres cuja direccionalidade seja neutra. Por exemplo, se as aspas aparecerem entre uma letra árabe (da direita para a esquerda) e uma letra latina (da esquerda para a direita), a direcção das aspas não é clara (referem-se à citação do texto em Árabe ou à citação do texto em Latim?) Os caracteres lrm e rlm possuem uma propriedade direccional mas não possuem nenhuma propriedade relacionada com a largura nem com a mudança de palavra/linha. Consulte por favor o [UNICODE] para informações mais detalhadas.
Símbolos dos caracteres espelhados. De uma forma geral, o algoritmo bidireccional não reflecte os símbolos dos caracteres, deixando-os pois inalteráveis. Uma excepção à regra são os caracteres tal como os parênteses (veja em [UNICODE], quadro 4-7). Nos casos onde se seja necessário reflectir ou espelhar tais símbolos, como por exemplo no caso dos hieróglifos egiptos, do boustrophedon grego ou ainda no caso de efeitos especiais de desenho, aconselham-se os estilos.
Em geral, o uso das folhas de estilo para alterar a apresentação visual de um elemento de elemento de bloco para elemento "inline" ou vice-versa é extremamente fácil. Contudo, uma vez que o algoritmo de bidireccionalidade se baseia numa distinção feita entre elementos inline e (a nível) de bloco , dever-se-ão tomar cuidados especiais durante a referida transformação.
Quando um elemento "inline" não possuir o atributo dir e for transformado em elemento de bloco pela folha de estilo, ele herdará o referido atributo do elemento de bloco com um parente mais próximo, de forma a definir a direcção básica do bloco.
Quando um elemento de bloco não possuindo o atributo dir for transformado num elemento "inline" pela folha de estilo, a apresentação resultante deverá ser equivalente, em termos de formatação bidireccional, à formatação obtida pela soma explícita do atributo dir ao elemento transformado (atribuindo-se-lhe o valor herdado).