Sobre este problema HTML
O atributo xml:lang é um remanescente do XHTML, onde era a forma padrão de declarar o idioma de um elemento. No HTML5 (a serialização text/html), o atributo lang é a forma adequada de especificar o idioma. A especificação HTML permite xml:lang por motivos de compatibilidade, mas apenas se for acompanhado por um atributo lang com um valor idêntico. Se xml:lang aparecer sozinho, ou se o seu valor não corresponder ao atributo lang, o documento não está em conformidade.
Isto é importante por várias razões. Leitores de ecrã e outras tecnologias assistivas dependem do atributo lang—não do xml:lang—para determinar a pronúncia e o comportamento específico do idioma. Os motores de busca também usam lang para indexação de conteúdo e deteção de idioma. Ter xml:lang sem lang significa que a declaração de idioma pode ser totalmente ignorada, prejudicando tanto a acessibilidade como o SEO.
Em documentos HTML5 modernos, raramente há uma razão para incluir xml:lang. O atributo lang sozinho cobre todos os casos de uso. O único cenário onde você pode precisar de ambos é se o seu documento deve ser compatível com parsers HTML e XHTML (markup poliglota), caso em que os dois atributos devem ter o mesmo valor.
Como corrigir
Você tem duas opções:
-
Remover
xml:lange usar apenaslang(recomendado para documentos HTML5). -
Adicionar um atributo
langque corresponda ao valor existente dexml:lang(para documentos poliglotas).
Se mantiver ambos os atributos, certifique-se de que os valores são exatamente os mesmos—incluindo maiúsculas/minúsculas e subtags. Por exemplo, lang="en-US" deve ser emparelhado com xml:lang="en-US", não xml:lang="en".
Exemplos
Incorreto: xml:lang sem lang
<html xml:lang="en">
<head>
<title>My Page</title>
</head>
<body>
<p xml:lang="fr">Bonjour le monde</p>
</body>
</html>
Isto desencadeia o erro de validação porque tanto os elementos <html> como <p> têm xml:lang mas nenhum atributo lang.
Incorreto: Valores não correspondentes
<html lang="en" xml:lang="en-US">
<head>
<title>My Page</title>
</head>
<body>
<p>Hello world</p>
</body>
</html>
Embora ambos os atributos estejam presentes, os valores "en" e "en-US" não correspondem, o que também é inválido.
Correto: Usar apenas lang (recomendado)
<!DOCTYPE html>
<html lang="en">
<head>
<title>My Page</title>
</head>
<body>
<p lang="fr">Bonjour le monde</p>
</body>
</html>
Esta é a abordagem mais limpa para documentos HTML5. O atributo lang é tudo o que você precisa.
Correto: Ambos os atributos com valores correspondentes (poliglota)
<!DOCTYPE html>
<html lang="en" xml:lang="en">
<head>
<title>My Page</title>
</head>
<body>
<p lang="fr" xml:lang="fr">Bonjour le monde</p>
</body>
</html>
Se deve manter xml:lang, cada elemento que o tenha também deve ter lang com exatamente o mesmo valor.
Encontre problemas como este automaticamente
O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.