El atributo lang de HTML: para qué sirve y qué ignora Google
El atributo lang de HTML declara el idioma de una página, por ejemplo <html lang="es">. Lo usan los lectores de pantalla, los navegadores y las herramientas de traducción. Google, en cambio, casi no lo tiene en cuenta: deduce el idioma del texto visible y usa hreflang para enlazar las versiones de idioma. Un valor incorrecto rara vez cuesta posiciones, pero sigue siendo un fallo, y en sitios multilingües suele delatar un problema de plantilla.
Para qué sirve
Puesto en el elemento raíz, lang se aplica a todo el documento. Cualquier elemento interior puede sobrescribirlo, así que una cita en inglés dentro de un artículo en español puede llevar <blockquote lang="en">.
Quienes más lo usan son las tecnologías de asistencia. El lector de pantalla elige la voz y las reglas de pronunciación según ese valor, de modo que una página en español marcada como en se lee con fonética inglesa y resulta casi incomprensible. Por eso las WCAG 2 lo exigen en el nivel A (criterio 3.1.1, Idioma de la página), mientras que el 3.1.2 cubre los fragmentos en otro idioma en el nivel AA. La auditoría de accesibilidad de Lighthouse marca tanto el atributo ausente como el valor no válido.
Qué hace Google con él
Poco. La documentación de Google sobre sitios multilingües explica que el idioma de una página se determina a partir del contenido visible, no de señales en el código como el atributo lang. Las versiones por idioma y país se conectan con anotaciones hreflang, en el HTML, en las cabeceras HTTP o en el sitemap. Nuestra guía del hreflang checker explica cómo comprobarlas.
lang es, por tanto, una cuestión de accesibilidad y de calidad, no una palanca de posicionamiento. Aun así sirve como control de coherencia: si el contenido, el hreflang y lang no coinciden, uno de los tres está mal.
Valores válidos: BCP 47 en la práctica
El valor tiene que ser una etiqueta de idioma BCP 47. Casi siempre es un código de idioma ISO 639-1, seguido si hace falta de un código de país ISO 3166-1. Algunos ejemplos correctos:
espara español sin países-MXpara el español de Méxicoes-419para el español de Latinoamérica (419 es un código de región UN M.49)pt-BRpara el portugués de Brasil
Las etiquetas no distinguen mayúsculas, aunque la convención es idioma en minúscula y país en mayúscula. El país es opcional: lang="es" es perfectamente válido y a menudo la mejor opción si el contenido no está pensado para un solo país.
Dos errores aparecen una y otra vez. es_ES, con guion bajo, es una cadena de locale sacada del código del servidor, no una etiqueta BCP 47. en-UK parece correcto pero no lo es: el código del Reino Unido es GB, y uk es el código del ucraniano.
Errores habituales en sitios de clientes
El más frecuente es un único valor para todos los idiomas. Los plugins de traducción y los front ends headless suelen reutilizar el mismo layout para cada versión, así que las páginas /es/ y /de/ salen con lang="en". El contenido y el hreflang dicen español, el elemento raíz dice inglés y quien usa un lector de pantalla oye la voz equivocada.
Después está el atributo que directamente no existe. Plantillas hechas a mano, constructores de landing y algunas exportaciones estáticas lo omiten.
Lo demás lo provocan las actualizaciones. En WordPress el atributo lo imprime language_attributes() en la cabecera del tema y sigue Ajustes > Generales > Idioma del sitio, así que un tema nuevo con <html lang="en-US"> escrito a mano lo pisa. Los temas de Shopify suelen usar {{ request.locale.iso_code }}, y un tema a medida con el valor fijo rompe todos los mercados traducidos. Pasa sobre todo en rediseños y cambios de plataforma, por eso está en la checklist SEO para migrar un sitio web.
Cómo comprobarlo
Mira el código fuente y busca la etiqueta <html> de apertura, o escribe document.documentElement.lang en la consola del navegador. Desde la terminal:
curl -s https://example.com/es/ | grep -o '<html[^>]*>'
curl muestra el HTML que envía el servidor. Si es un framework de JavaScript el que fija el atributo en el navegador, revisa también la página renderizada. Prueba una URL por idioma y una por tipo de plantilla (inicio, categoría, artículo, producto), porque el valor suele venir de plantillas distintas.
Vigilar lang y hreflang con Deltio
El escáner SEO de Deltio lee el atributo lang en cada URL monitorizada, junto con title, meta description, H1, canonical y hreflang. Marca el valor ausente o no válido y compara cada escaneo con el anterior: si un despliegue convierte lang="es" en lang="en", recibes una alerta por email o en Slack. Lo que no puede hacer es juzgar si el idioma declarado coincide con el texto de la página: eso sigue siendo trabajo humano.
Starter cuesta £24 al mes, o £20 con pago anual, y puedes probar Deltio gratis 14 días.
Preguntas frecuentes
- ¿El atributo lang influye en el posicionamiento en Google?
- No directamente. Google deduce el idioma de una página a partir del contenido visible y afirma que no se basa en el atributo lang. Sí importa para la accesibilidad, el comportamiento del navegador y otras herramientas que leen la página.
- ¿El valor de lang tiene que coincidir con el de hreflang?
- Ambos deben indicar el mismo idioma. Una página con hreflang="es" debería tener lang="es" o una variante regional como es-ES. No hace falta que las cadenas sean idénticas, pero un hreflang en español con lang="en" delata un error de plantilla.
- ¿Es válido lang="en-UK"?
- No. BCP 47 usa los códigos de país ISO 3166-1 y el del Reino Unido es GB, así que la etiqueta correcta es en-GB. UK no es un código de región válido, y uk en minúscula es el código del ucraniano.
- ¿Sigue haciendo falta la meta etiqueta content-language?
- La especificación HTML considera no conforme el pragma http-equiv content-language y recomienda usar el atributo lang. Google ignora ambos para detectar el idioma, así que no hay motivo para añadirla en páginas nuevas.
- ¿Deltio me avisa si cambia el atributo lang?
- Sí. El escáner SEO de Deltio lee el atributo lang en cada URL monitorizada, marca los valores ausentes o no válidos y compara escaneos consecutivos. Cualquier cambio llega como alerta por email o Slack.