valid-lang

El atributo lang del elemento debe ser sintácticamente válido

automaticWCAG 3.1.2 (AA)confianza: highgravedad: moderateunderstandable

Comprueba que cualquier elemento (que no sea el <html> raíz) con un atributo lang no vacío usa una etiqueta de idioma sintácticamente válida.

Ámbito de aplicación. Se aplica a cualquier elemento que no sea el <html> raíz con un atributo lang no vacío Y al menos algo de texto, sin espacios en blanco, al que ese elemento efectivamente aplica su idioma, según ACT de46e4:

  • El texto/alt descendiente está gobernado únicamente por el ancestro más cercano que lleva lang; un descendiente anidado con su propio lang no vacío define un nuevo ámbito para todo lo que hay dentro de él, de modo que ese subárbol deja de contar para la aplicabilidad del elemento exterior (cuenta para la del elemento anidado, si ese también se está evaluando).
  • Un atributo alt no vacío en img/area/input[type=image] cuenta como texto al que se aplica ese idioma, igual que un nodo de texto.
  • El texto (o alt) que CSS mantiene fuera del árbol de renderizado (display:none, el atributo hidden, ...) no cuenta. Un <area> lo dibuja la imagen que usa su mapa, así que ni su propio display ni el de su mapa dejan fuera su alt. aria-hidden y el posicionamiento fuera de pantalla NO eximen al texto, según los propios ejemplos fallidos de ACT para ambos casos; solo el no renderizado real lo hace.

Resultado esperado. La subetiqueta principal de idioma del valor de lang (la parte anterior al primer guion) es una subetiqueta de idioma registrada, como exige ACT de46e4. WCAG 3.1.2 (Idioma de las partes) exige que, cuando el idioma de un fragmento difiere del idioma predeterminado de la página, se identifique mediante programación. Una etiqueta cuya subetiqueta principal es desconocida no identifica ningún idioma real; una subetiqueta posterior mal formada (lang="en-US_x") sigue identificando el inglés y aquí pasa, ya que es un error de validez del marcado y no un idioma ausente.

Qué informa un hallazgo.

  • reasonCode: DEFAULT_LANG_INVALID cuando ningún ancestro (a través de los shadow hosts, <html> incluido) tiene un lang no vacío, de modo que este fija el idioma del que parte su texto, como hace <body lang> en una página cuyo <html> no tiene ninguno; ELEMENT_LANG_INVALID cuando cambia un idioma heredado. Ambos incumplen el 3.1.2, como en ACT de46e4.
  • value: el valor del atributo lang, sin los espacios en blanco del principio y del final.

Estos campos de data.details ayudan a leer y reproducir un hallazgo. Salvo reasonCode y los pocos campos que Esquema de salida indica como estables, no son un contrato estable: un campo puede cambiar de nombre o desaparecer en una versión menor, así que no construyas sobre ellos.

Ejemplos

pass
<p lang="fr">Bonjour</p>

"fr" es una etiqueta de idioma BCP 47 sintácticamente válida.

fail
<p lang="xyz123!!">???</p>

El valor no tiene una sintaxis BCP 47 válida.

Ver código fuente