onpage
Dichiara la lingua della pagina
MetricSpot controlla un attributo lang valido su <html>. Senza, gli screen reader leggono male, hreflang perde l'aggancio e gli strumenti di traduzione indovinano.
Cosa controlla questo check
Legge l’attributo lang sull’elemento radice <html> e verifica che sia un tag di lingua BCP 47 valido (en, en-US, es, de-AT, pt-PT). Il check fallisce quando:
- L’attributo manca.
- Il valore è vuoto (
lang=""). - Il valore non corrisponde a un subtag di lingua noto.
Perché è importante
L’attributo lang è una delle vittorie di igiene HTML più economiche — un attributo su un elemento — ma la sua assenza rompe tre consumatori diversi tutti insieme.
- Gli screen reader cambiano voce / motore di pronuncia in base a
lang. Una pagina francese conlang="en"viene letta dalla voce inglese che storpia ogni parola. NVDA, JAWS, VoiceOver e TalkBack si comportano tutti così. - La traduzione del browser (“Traduci questa pagina” di Chrome, il menu di traduzione di Safari) usa
langcome lingua sorgente. Senzalangdeve indovinare dal contenuto, cosa più lenta e meno affidabile su pagine brevi. - Aggancio hreflang. I tuoi tag
<link rel="alternate" hreflang="…">hanno bisogno di un’auto-dichiarazione sulla pagina radice — la documentazione di Google raccomanda esplicitamente di dichiararelangsu ogni pagina per corroborare la rete hreflang. - SEO. Google usa
langcome uno dei vari segnali per decidere per quale paese/lingua mostrare la pagina. Il report Targeting Internazionale di Search Console segnala le pagine senzalang. - Estrazione AI. I sistemi LLM multilingua spezzettano i contenuti usando la lingua dichiarata come indizio. Un
langdichiarato male abbassa il punteggio di confidenza del chunk.
Come risolvere
Imposta lang sull’elemento <html>. Usa un codice di due lettere per il contenuto generale, o lingua-regione se il tuo contenuto è specifico per regione:
<!DOCTYPE html>
<html lang="en">
…
<html lang="pt-PT"> <!-- European Portuguese, distinct from pt-BR -->
Siti multilingua — dichiara per pagina. Il lang su <html> deve corrispondere al contenuto principale della pagina, non alla lingua di default del sito. Se hai una traduzione spagnola a /es/, quella pagina ha bisogno di <html lang="es">, non di <html lang="en">.
Astro:
---
const { lang = "en" } = Astro.props;
---
<html lang={lang}>
Poi passa lang="es" dal tuo layout spagnolo.
Next.js (App Router):
// app/layout.tsx
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>{children}</body>
</html>
);
}
Per rotte per-locale: separa in app/[locale]/layout.tsx e leggi il locale dai params.
WordPress: l’elemento <html> è generato dalla chiamata language_attributes() del tuo tema, che legge la lingua del sito da Impostazioni → Generali. Il template lo fa già — il fallimento significa quasi sempre che il tema ha sovrascritto header.php e ha eliminato la chiamata. Rimetti <html <?php language_attributes(); ?>>.
Contenuto in lingue miste. Se un paragrafo o blocco è in una lingua diversa dalla pagina, dichiaralo inline:
<p>The French call it <span lang="fr">le mot juste</span>.</p>
Gli screen reader cambiano voce per lo span e poi tornano indietro.
Verifica tu stesso: DevTools → Console → document.documentElement.lang → dovrebbe restituire "en", non "".
Domande frequenti
Devo usare en o en-US?
Usa en a meno che il tuo contenuto non sia specificamente inglese americano (o specificamente britannico, australiano, ecc.) e ciò abbia importanza per traduzione/pronuncia. en copre tutte le varianti inglesi; en-US lo restringe. Per la maggior parte dei siti, il tag più largo è quello giusto.
Che differenza c’è tra lang e xml:lang?
lang è per HTML, xml:lang è per XML (e XHTML). Le pagine HTML5 moderne hanno bisogno solo di lang. Non aggiungerli entrambi — è solo rumore.
Il mio CMS imposta lang="en-US" ovunque. È sbagliato?
Non è sbagliato; è solo più ristretto di quanto serva. Per siti rivolti al pubblico statunitense, lascialo. Per siti con pubblico anglofono globale, passa a un semplice en.
Fonti
Ultimo aggiornamento 2026-05-11