L'attribut lang en HTML : à quoi il sert et ce que Google ignore
L'attribut lang en HTML déclare la langue d'une page, par exemple <html lang="fr">. Les lecteurs d'écran, les navigateurs et les outils de traduction s'en servent. Google, lui, l'ignore presque : il déduit la langue du texte visible et s'appuie sur hreflang pour relier les versions linguistiques. Une valeur fausse coûte rarement des positions, mais c'est un défaut réel, et sur un site multilingue il trahit souvent un problème de template.
À quoi sert l'attribut
Placé sur l'élément racine, lang s'applique à tout le document. N'importe quel élément peut le redéfinir : une citation en anglais dans un article français peut porter <blockquote lang="en">.
Les premiers concernés sont les technologies d'assistance. Le lecteur d'écran choisit la voix et les règles de prononciation selon cette valeur. Une page française déclarée en en est lue avec une phonétique anglaise, quasi incompréhensible. C'est pourquoi les WCAG 2 en font une exigence de niveau A (critère 3.1.1, Langue de la page), le 3.1.2 couvrant les passages dans une autre langue au niveau AA. L'audit d'accessibilité de Lighthouse signale aussi bien l'attribut absent que la valeur invalide.
Ce que Google en fait
Pas grand-chose. La documentation de Google sur les sites multilingues indique que la langue d'une page est déterminée à partir de son contenu visible, et non de signaux dans le code comme l'attribut lang. Les versions par langue et par pays se relient avec des annotations hreflang, dans le HTML, les en-têtes HTTP ou le sitemap. Notre guide du hreflang checker explique comment les vérifier.
lang relève donc de l'accessibilité et de la qualité, pas du classement. Il reste un bon test de cohérence : si le contenu, le hreflang et lang ne disent pas la même chose, l'un des trois se trompe.
Valeurs valides : BCP 47 en pratique
La valeur doit être une étiquette de langue BCP 47. Le plus souvent, un code de langue ISO 639-1, suivi au besoin d'un code pays ISO 3166-1. Quelques exemples corrects :
frpour le français sans paysfr-CApour le français du Canadapt-BRpour le portugais du Brésiles-419pour l'espagnol d'Amérique latine (419 est un code région UN M.49)
La casse n'a pas d'importance, mais l'usage veut la langue en minuscules et le pays en majuscules. Le pays est facultatif : lang="fr" est tout à fait valide, souvent préférable si le contenu ne vise pas un seul pays.
Deux erreurs reviennent sans cesse. fr_FR, avec un tiret bas, est une chaîne de locale issue du code serveur, pas une étiquette BCP 47. en-UK a l'air juste mais ne l'est pas : le code du Royaume-Uni est GB, et uk désigne l'ukrainien.
Les erreurs courantes sur les sites clients
La plus fréquente : une seule valeur pour toutes les langues. Les plugins de traduction et les front ends headless réutilisent souvent le même layout pour chaque version, si bien que les pages /fr/ et /de/ partent avec lang="en". Le contenu et le hreflang disent français, l'élément racine dit anglais, et l'utilisateur de lecteur d'écran entend la mauvaise voix.
Vient ensuite l'attribut absent. Templates codés à la main, outils de landing pages et certains exports statiques l'oublient.
Les mises à jour font le reste. Sur WordPress, l'attribut est généré par language_attributes() dans l'en-tête du thème et suit Réglages > Général > Langue du site : un nouveau thème qui écrit <html lang="en-US"> en dur passe par-dessus. Les thèmes Shopify utilisent normalement {{ request.locale.iso_code }}, et un thème sur mesure avec une valeur figée casse tous les marchés traduits. Cela arrive surtout lors d'une refonte ou d'un changement de plateforme, d'où sa place dans la checklist SEO de migration de site.
Comment le vérifier
Affichez le code source et regardez la balise <html> d'ouverture, ou tapez document.documentElement.lang dans la console du navigateur. En ligne de commande :
curl -s https://example.com/fr/ | grep -o '<html[^>]*>'
curl montre le HTML envoyé par le serveur. Si un framework JavaScript définit l'attribut côté navigateur, contrôlez aussi la page rendue. Testez une URL par langue et une par type de template (accueil, catégorie, article, produit) : la valeur vient souvent de templates différents.
Surveiller lang et hreflang avec Deltio
Le scanner SEO de Deltio lit l'attribut lang sur chaque URL surveillée, avec le title, la meta description, le H1, le canonical et le hreflang. Il signale une valeur absente ou invalide et compare chaque scan au précédent : si un déploiement transforme lang="fr" en lang="en", vous recevez une alerte par email ou sur Slack. Il ne peut pas, en revanche, juger si la langue déclarée correspond au texte de la page : cela reste un travail humain.
Starter coûte £24 par mois, £20 en facturation annuelle, et vous pouvez essayer Deltio gratuitement 14 jours.
Questions fréquentes
- L'attribut lang influence-t-il le classement Google ?
- Pas directement. Google déduit la langue d'une page de son contenu visible et indique ne pas s'appuyer sur l'attribut lang. Il compte en revanche pour l'accessibilité, le comportement du navigateur et les autres outils qui lisent la page.
- La valeur de lang doit-elle correspondre au hreflang ?
- Les deux doivent désigner la même langue. Une page annotée hreflang="fr" devrait avoir lang="fr" ou une variante régionale comme fr-FR. Les chaînes n'ont pas à être identiques, mais un hreflang français avec lang="en" signale une erreur de template.
- lang="en-UK" est-il valide ?
- Non. BCP 47 utilise les codes pays ISO 3166-1, et celui du Royaume-Uni est GB : l'étiquette correcte est donc en-GB. UK n'est pas un code région valide, et uk en minuscules désigne l'ukrainien.
- Faut-il encore la balise meta content-language ?
- La spécification HTML juge non conforme le pragma http-equiv content-language et recommande l'attribut lang à la place. Google ignore les deux pour détecter la langue, il n'y a donc aucune raison de l'ajouter sur de nouvelles pages.
- Deltio m'alerte-t-il si l'attribut lang change ?
- Oui. Le scanner SEO de Deltio lit l'attribut lang sur chaque URL surveillée, signale les valeurs absentes ou invalides et compare les scans successifs. Tout changement est envoyé en alerte par email ou sur Slack.