Declaração de idioma em HTML

Questão

Como devo definir o idioma do conteúdo em minha página em HTML?

Resposta Rápida

Sempre use um atributo de idioma na tag html para declarar o idioma padrão do texto na página. Quando a página contiver conteúdos em outro idioma, adicione um atributo de idioma a um elemento que cerque tal conteúdo.

Use o atributo lang para páginas apresentadas como HTML, e o atributo xml:lang para páginas apresentadas como XML. Para documentos poliglotas em XHTML 1.x e HTML5, use os dois juntos.

Use as tags de idiomas listadas no Registro de Subtags de Idiomas IANA. Você consegue localizar subtags por meio da ferramenta não oficial Pesquisa de Subtag de Idioma.

Use elementos agrupados para lidar com conteúdos e valores de atributos no mesmo elemento que estejam em idiomas distintos.

Detalhes

Noções básicas

Sempre use um atributo de idioma no elemento html . Este será herdado por todos os demais elementos, desse modo definindo o idioma padrão do texto no elemento head do documento.

Observe que você deve usar o elemento html em lugar do elemento body, pois o elemento body não engloba o texto dentro do elemento head do documento.

Se você tiver algum conteúdo na página que esteja em um idioma diferente no declarado no elemento html, use atributos de idiomas nos elementos em torno desse conteúdo. Isso permite que você defina seu estilo ou o processe de forma diferente.

Em algumas partes de seu código, você poderá encontrar um problema. Se você tiver textos em diversos idiomas no elemento title , não poderá sinalizar partes do texto para idiomas distintos, pois o atributo title permite apenas caracteres – não sinalizações. O mesmo se aplica para múltiplos idiomas em valores de atributos. Até este momento, não há uma boa solução para isso.

Escolhendo o atributo correto

Se seu documento for em HTML (ou seja, disponibilizado como text/html), use o atributo lang para definir o idioma de um documento ou de um trecho de texto. Por exemplo, os seguintes atributos definem o idioma padrão como francês:

<html lang="fr">

Ao disponibilizar páginas em XHTML 1.x ou poliglotas como text/html, use os atributos lang e xml:lang em conjunto todas as vezes que quiser definir o idioma. O atributo xml:lang é a forma padrão de identificar informações sobre o idioma em XML. Assegure-se de que os valores de ambos os atributos sejam idênticos.

<html lang="fr" xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml">

O atributo xml:lang não é realmente útil para trabalhar o arquivo como HTML, mas assume o comando do atributo lang todas as vezes em que você processa ou disponibiliza o documento como XML. O uso do atributo lang é permitido pela sintaxe do XHTML, podendo ser também reconhecido por navegadores. Entretanto, ao se usar outros analisadores XML (como a função lang() em XSLT), não se pode confiar que o atributo lang será reconhecido.

Se você for disponibilizar sua página como XML (ou seja, usando um tipo de MIME como application/xhtml+xml), não precisará do atributo lang . Apenas o atributo xml:lang já bastará.

<html xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml">

E se o conteúdo do elemento e os valores do atributo estiverem em idiomas distintos?

Pode acontecer de o idioma do texto em um atributo e o conteúdo do elemento estarem em idiomas diferentes. Por exemplo, no canto direito superior deste artigo há links para versões traduzidas desta página. O link exibe o idioma da página de destino usando o idioma da página de destino, mas um atributo title associado contém uma alusão no idioma da página atual:

Captura de tela exibindo informações que trazem a palavra "Espanhol" emergindo do documento de texto 'Español'.

Se seu código tiver a aparência a seguir, os atributos de idioma iriam na verdade indicar que não apenas o conteúdo, mas também o texto do atributo title está em espanhol. Isso está obviamente incorreto.

 Codificação ruim. Não copie!

<a lang="es" title="Espanhol" href="qa-html-language-declarations.es">Español</a>

Em vez disso, mova o atributo que contém texto em um idioma diferente para outro elemento, como mostrado neste exemplo, em que o elemento span herda a configuração padrão en do elemento html .

<span title="Espanhol"><a lang="es" href="qa-html-language-declarations.es">Español</a></span>

E se não houver um elemento ao qual vincular seu atributo?

Se você deseja especificar o idioma de algum conteúdo, mas não há marcação alguma em torno dele, use um elemento como span ou div em torno do conteúdo. Eis um exemplo:

<p>Você diria isso em chinês como <span lang="zh-Hans">中国科学院文献情报中心</span>.</p>

Escolhendo valores de idiomas

Para se certificar de que todos os agentes de usuário reconheçam o idioma a que você se refere, é preciso seguir uma abordagem padronizada ao atribuir valores de atributo de idioma. Você também precisa levar em conta como se referir de forma padronizada às diferenças dialetais em um idioma; como, por exemplo, as diferenças entre o inglês estadunidense e o britânico, que apresentam diferenças significativas de grafia e pronúncia.

As regras para criação de valores de atributo de idioma são descritas por uma especificação IETF chamada BCP 47. Além de especificar como usar tags de idioma simples, como en para inglês ou fr para francês, a BCP 47 descreve como compor tags de idiomas que lhe permitam especificar dialetos regionais, alfabetos e outras variantes relacionadas àquele idioma.

A BCP 47 agrega todas as regras e vai além, trazendo a norma ISO para conjuntos de idiomas e códigos de países. Para localizar códigos específicos, você deve consultar o Registro de Subtags de Idiomas IANA.

Para uma introdução breve, ainda que abrangente, à sintaxe das tags BCP 47, leia Tags de idioma em HTML e XML. Para obter ajuda na escolha da tag de idioma correta dentre as inúmeras tags e combinações possíveis, veja Escolhendo uma tag de idioma.

Informações Adicionais

Especificando metadados sobre o idioma do público

Se você desejar criar metadados que descrevam o idioma do público alvo de uma página, em vez do idioma de um trecho de texto específico, consiga isso fazendo com que o servidor envie informações no cabeçalho HTTP Content-Language. Se você pretende que o público alvo fale mais de um idioma, o cabeçalho HTTP permite que você use uma lista de idiomas separados por vírgula.

Eis aqui um exemplo de um cabeçalho HTTP que declara que a fonte é uma mistura de inglês, hindi e punjabi:

Content-Language: en, hi, pa

Observe que essa abordagem não será eficaz se sua página for acessada em um disco rígido, disco ou outra localização fora do servidor. Atualmente, não há um modo amplamente reconhecido de se usar esse tipo de metadado dentro de uma página.

No passado, muitas pessoas usavam um elemento meta com o atributo http-equiv definido como Content-Language. Devido a antigas confusões e aplicações inconsistentes deste elemento, a especificação do HTML5 removeu a sua conformidade em HTML, de forma que não é mais possível utilizá-lo.

Para compatibilidade com versões anteriores, o HTML5 descreve um algoritmo pelo qual o idioma padrão do conteúdo pode ser estimado a partir do HTTP ou da informação meta Content-Language sob certas condições. Isso, no entanto, é apenas um mecanismo de suporte para os casos em que nenhum atributo de idioma tenha sido usado na tag html. Se você utilizou o atributo de idioma na tag html , como sempre deve ser, tal suporte será irrelevante.

Para informações sobre Content-Language em HTTP e em elementos meta , veja HTTP e meta para informação de idioma.

Várias coisas que são irrelevantes

À guisa de informação extra, e apenas para que nada deixe de ser mencionado, talvez valha a pena mencionar alguns outros pontos que não são relevantes para essa discussão.

Em primeiro lugar, não é possível declarar o idioma de um texto usando CSS.

Em segundo lugar, o DOCTYPE que deve iniciar qualquer arquivo HTML pode conter o que para algumas pessoas parece ser uma declaração de idioma. O DOCTYPE no exemplo abaixo contém o texto EN, que significa 'Inglês'. Isso, contudo, indica o idioma do esquema associado a esse documento, não tendo nada a ver com o idioma do documento em si.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Em terceiro lugar, as pessoas algumas vezes supõem que informações sobre o idioma natural podem ser deduzidas a partir da codificação de caracteres. A codificação dos caracteres, contudo, não possibilita uma identificação inequívoca de um idioma natural: seria necessário que houvesse uma identificação individual entre codificação e idioma para que essa dedução funcionasse, o que não há. Por exemplo, uma única codificação de caractere poderia ser usada para diversos idiomas; por exemplo, Latin 1 (ISO-8859-1) poderia codificar tanto francês como inglês, bem como uma imensa quantidade de outros idiomas. Além disso, a codificação de caractere pode variar para um único idioma. Árabe, por exemplo, poderia usar codificações como 'Windows-1256', 'ISO-8859-6' ou 'UTF-8'.

Todos esses exemplos de codificação, contudo, são atualmente irrelevantes, visto que todo conteúdo deve ser criado em UTF-8, que cobre até mesmo os idiomas mais raros com uma única codificação de caractere.

O mesmo vale para a direção do texto. Como ocorre com codificação e idioma, nem sempre há uma correspondência exclusiva entre idioma e script e, portanto, direcionalidade. O azerbaijanês, por exemplo, pode ser escrito tanto da direita para a esquerda (árabe) como da esquerda para a direita (latim ou cirílico), e o código de idioma az pode ser relevante para ambas as opções. Além disso, a marcação de direção do texto utilizada com texto alinhado aplica uma diversidade de valores distintos ao texto, no qual o idioma é uma simples chave que não está à altura das tarefas necessárias.