WCAG-succescriteria · Level A

WCAG 3.1.1: Taal van de pagina

WCAG 3.1.1 vereist dat de standaardmenselijke taal van elke webpagina programmatisch kan worden bepaald, voornamelijk door een geldig lang-attribuut in te stellen op het HTML-element. Dit stelt ondersteunende technologieën zoals schermlezers in staat om inhoud correct uit te spreken en helpt gebruikers met cognitieve en taalgerelateerde beperkingen de pagina te begrijpen.

Wat Deze Regel Betekent

WCAG 3.1.1 — Taal van de pagina is een succescriterium op Niveau A onder het principe Begrijpelijk. Het vereist dat de primaire menselijke taal van elke webpagina wordt blootgelegd op een manier die het mogelijk maakt dat ondersteunende technologieën deze programmatisch kunnen detecteren. In de praktijk betekent dit bijna altijd dat er een geldige lang-attribuut direct op het <html>-element van de pagina wordt geplaatst.

De waarde van het lang-attribuut moet een geldige BCP 47-taalcode zijn. BCP 47-codes bestaan uit een primaire taalsubtag (zoals en voor Engels, tr voor Turks, fr voor Frans) en optioneel een regiocode gescheiden door een koppelteken (zoals en-US, tr-TR of pt-BR). De taalcode moet nauwkeurig de dominante taal weerspiegelen waarin de inhoud van de pagina is geschreven. Een pagina die primair in het Turks is geschreven, moet lang='tr' of lang='tr-TR' declareren; een pagina die in het Engels is geschreven, moet lang='en' of een regionale variant declareren.

Een pagina voldoet aan dit criterium wanneer het <html>-element een lang-attribuut bevat waarvan de waarde een niet-lege, syntactisch geldige BCP 47-taalcode is die de primaire taal van de pagina correct identificeert. Een pagina voldoet niet wanneer het lang-attribuut volledig ontbreekt, wanneer de waarde leeg is (lang=''), of wanneer de waarde geen erkende BCP 47-taalcode is (bijvoorbeeld lang='turkish' of lang='en_US' met een underscore in plaats van een koppelteken).

Voor XHTML-pagina’s die met een XML-MIME-type worden geserveerd, moeten zowel het lang-attribuut als het XML-namespace-attribuut xml:lang aanwezig zijn, en hun waarden moeten overeenkomen. Een mismatch tussen de twee — zoals lang='en' naast xml:lang='tr' — vormt een schending van zowel dit criterium als de gerelateerde axe-core-regel html-xml-lang-mismatch.

WCAG vermeldt expliciet één uitzondering: als de pagina puur decoratief is, een CAPTCHA is die opzettelijk geen herkenbare taal heeft, of volledig uit niet-linguïstische inhoud bestaat (zoals een pagina die alleen een afbeelding zonder tekst bevat), dan is er mogelijk geen bepaalbare taal. Deze uitzondering is echter beperkt, en de overgrote meerderheid van pagina’s in de praktijk bevat voldoende tekst om een taalverklaring te vereisen.

Waarom Het Belangrijk Is

De primaire begunstigden van een correct gedeclareerde paginataal zijn schermlezersgebruikers, van wie de meerderheid blind is of een ernstige visuele beperking heeft. Schermlezers zoals NVDA, JAWS en VoiceOver gebruiken het lang-attribuut om de juiste tekst-naar-spraak (TTS)-stem en uitspraakengine te selecteren. Wanneer een Turkse gebruiker een pagina bezoekt die correct lang='tr' declareert, schakelt hun schermlezer over naar een Turkse TTS-stem, met toepassing van correcte Turkse fonologie, klemtoonpatronen en diakritische tekens. Zonder deze declaratie kan een schermlezer standaard de systeemtaal van de gebruiker of een volledig onjuiste taal gebruiken, wat leidt tot een brabbelachtige uitspraak waardoor de inhoud onbegrijpelijk wordt.

Neem een concreet scenario: een slechtziende Turkse burger bezoekt de website van een overheidsinstelling om een formulier van de overheid te downloaden. De site laat het lang-attribuut weg. De NVDA-installatie van de gebruiker gebruikt standaard een Engels TTS-profiel. Turkse woorden worden teruggelezen met Engelse fonologie — woorden als "şehir" (stad) of "başvuru" (aanvraag) worden onherkenbaar. De gebruiker kan het formulier niet invullen zonder hulp van een ziende persoon, waarmee het hele doel van de digitale dienst wordt ondermijnd.

Gebruikers met cognitieve en leerstoornissen profiteren ook. Browsers gebruiken het lang-attribuut om nauwkeurige vertaalsuggesties aan te bieden; sommige gebruikers met dyslexie vertrouwen op browsergebaseerde vertaalhulpmiddelen om inhoud om te zetten in een taal die zij gemakkelijker kunnen verwerken. Een onjuist of ontbrekend lang-attribuut zorgt ervoor dat deze hulpmiddelen de brontaal verkeerd identificeren, wat leidt tot slechte vertalingen of helemaal geen aanbod om te vertalen.

Gebruikers met motorische beperkingen die vertrouwen op spraakbesturingssoftware zoals Dragon NaturallySpeaking zijn afhankelijk van het feit dat de software de taal van een pagina correct interpreteert om gesproken commando’s te koppelen aan tekst op het scherm. Een verkeerd geïdentificeerde paginataal verbreekt deze koppeling.

Naast toegankelijkheid zijn er tastbare SEO-voordelen: zoekmachines gebruiken het lang-attribuut als een van meerdere signalen om de doeltaal en -regio van een pagina te bepalen, wat de nauwkeurigheid van gelokaliseerde zoekresultaten verbetert. Correcte taalmarkering verbetert ook de betrouwbaarheid van spelling- en grammaticacontrolefuncties in browsers voor alle gebruikers, niet alleen voor degenen die ondersteunende technologie gebruiken. Volgens de Wereldgezondheidsorganisatie hebben wereldwijd ongeveer 2,2 miljard mensen een vorm van visuele beperking, van wie een aanzienlijk deel op schermlezers vertrouwt — waardoor correcte taalverklaring een van de meest impactvolle en minst arbeidsintensieve toegankelijkheidsverbeteringen is.

Gerelateerde Axe-core-Regels

  • html-has-lang — Deze regel controleert of het <html>-element überhaupt een lang-attribuut heeft. Hij markeert elke pagina waar het lang-attribuut volledig ontbreekt op de root-<html>-tag, ongeacht of het attribuut elders in het document voorkomt. Dit is een van de meest voorkomende en meest impactvolle geautomatiseerde vondsten, omdat de oplossing neerkomt op het toevoegen van één attribuut.
  • html-lang-valid — Deze regel controleert of de waarde van het lang-attribuut op het <html>-element een geldige BCP 47-taalcode is. Hij markeert waarden die geen erkende taalcodes zijn, zoals lang='turkish' (dat de volledige Engelse naam gebruikt in plaats van de ISO 639-1-code tr), lang='en_US' (dat een underscore als scheidingsteken gebruikt in plaats van een koppelteken), of lang='xx' (een placeholder zonder toegewezen taal). Een lang-attribuut dat bestaat maar een ongeldige waarde bevat, is net zo problematisch als een ontbrekend attribuut, omdat ondersteunende technologieën er niet betrouwbaar op kunnen reageren.
  • html-xml-lang-mismatch — Deze regel is specifiek van toepassing op XHTML-pagina’s die zowel een lang-attribuut als een xml:lang-attribuut op het <html>-element hebben. Hij markeert gevallen waarin de twee attributen verschillende taalcodes specificeren — bijvoorbeeld lang='en' en xml:lang='tr'. Wanneer deze waarden conflicteren, ontvangen ondersteunende technologieën en XML-processors tegenstrijdige signalen en kunnen zij zich onvoorspelbaar gedragen. Beide waarden moeten dezelfde primaire taalsubtag specificeren.

Hoewel deze drie regels de meest voorkomende programmatische fouten afdekken, kunnen geautomatiseerde tools de semantische juistheid niet verifiëren — dat wil zeggen, ze kunnen niet bepalen of de gedeclareerde taal daadwerkelijk overeenkomt met de taal waarin de pagina is geschreven. Een pagina die volledig in het Turks is geschreven maar lang='en' declareert, zal alle drie de axe-core-regels doorstaan, maar toch niet voldoen aan WCAG 3.1.1, omdat de gedeclareerde taal niet de werkelijke primaire taal van de pagina weerspiegelt. Handmatige controle is daarom altijd vereist naast geautomatiseerde scans om te bevestigen dat de gedeclareerde taal correct is.

Hoe te Testen

  1. Geautomatiseerde scan met axe DevTools of Lighthouse: Open de pagina in Chrome of Firefox. Open DevTools (F12), ga naar het axe DevTools-paneel of het Lighthouse-tabblad en voer een volledige toegankelijkheidsaudit uit. Let specifiek op overtredingen onder de regels html-has-lang, html-lang-valid en html-xml-lang-mismatch. Axe zal het <html>-element markeren en de specifieke fout beschrijven. Lighthouse zal vergelijkbare problemen tonen onder de categorie Accessibility. Noteer alle gemarkeerde overtredingen en de aanbevolen oplossingen.
  2. Handmatige broninspectie: Bekijk de paginabron (Ctrl+U in de meeste browsers) en lokaliseer de openings-tag <html>. Controleer of deze een lang-attribuut bevat, of de attribuutwaarde een geldige BCP 47-code is (controleer tegen het IANA Language Subtag Registry), en of deze nauwkeurig de taal weerspiegelt waarin de inhoud van de pagina is geschreven. Controleer voor XHTML-pagina’s ook of een eventueel xml:lang-attribuut dezelfde primaire taalsubtag heeft als lang.
  3. Schermlezertest met NVDA en Firefox: Installeer NVDA (gratis, Windows) en open de pagina in Firefox. Druk op NVDA+T om de paginatitel te laten voorlezen en luister naar de gebruikte TTS-stem. Als de pagina in het Turks is, moet de stem een Turkse TTS-stem zijn en moeten Turkse woorden correct worden uitgesproken. Als u een Engelse of anderszins onjuiste stem hoort bij Turkse inhoud, is het lang-attribuut ontbrekend of onjuist. Herhaal dit met JAWS in Chrome en VoiceOver in Safari op macOS (Cmd+F5 om VoiceOver te activeren, navigeer vervolgens naar de pagina en luister naar de uitspraak van de bodytekst).
  4. Controle van taalherkenning door de browser: Open de pagina in Chrome. Let op de ingebouwde vertaalbalk van de browser — Chrome zal aanbieden pagina’s te vertalen die het identificeert als zijnde in een vreemde taal ten opzichte van de browserinstellingen. Als Chrome de paginataal onjuist identificeert of geen vertaling aanbiedt wanneer dat wel zou moeten, is dit een praktisch signaal dat het lang-attribuut onjuist of ontbrekend is. Dit is geen definitieve toegankelijkheidstest, maar wel een nuttige secundaire indicator.
  5. Controle van semantische juistheid (alleen handmatig): Lees de inhoud van de pagina door en bevestig dat de gedeclareerde lang-waarde overeenkomt met de daadwerkelijke primaire taal van de pagina. Geautomatiseerde tools kunnen deze controle niet uitvoeren. Let in het bijzonder op meertalige sites die verschillende taalversies vanaf verschillende URL’s aanbieden — elke URL-pagina moet zijn eigen correcte taal declareren en niet één globale standaard overnemen.

Hoe te Herstellen

Ontbrekend lang-attribuut — Onjuist

<!DOCTYPE html>
<html>
  <head>
    <meta charset='UTF-8'>
    <title>Başvuru Formu</title>
  </head>
  <body>
    <h1>Hoş Geldiniz</h1>
  </body>
</html>

Ontbrekend lang-attribuut — Juist

<!DOCTYPE html>
<html lang='tr'>
  <!-- lang='tr' vertelt schermlezers dat een Turkse TTS-stem moet worden gebruikt -->
  <head>
    <meta charset='UTF-8'>
    <title>Başvuru Formu</title>
  </head>
  <body>
    <h1>Hoş Geldiniz</h1>
  </body>
</html>

Ongeldige lang-attribuutwaarde — Onjuist

<!DOCTYPE html>
<html lang='turkish'>
  <!-- 'turkish' is geen geldige BCP 47-code; axe zal html-lang-valid markeren -->
  <head>
    <title>Kurumsal Site</title>
  </head>
  <body>
    <p>Şirketimiz hakkında bilgi edinmek için buraya tıklayın.</p>
  </body>
</html>

Ongeldige lang-attribuutwaarde — Juist

<!DOCTYPE html>
<html lang='tr'>
  <!-- Gebruik de ISO 639-1-code met twee letters 'tr', niet het Engelse woord 'turkish' -->
  <head>
    <title>Kurumsal Site</title>
  </head>
  <body>
    <p>Şirketimiz hakkında bilgi edinmek için buraya tıklayın.</p>
  </body>
</html>

XHTML xml:lang-mismatch — Onjuist

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
  'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' lang='en' xml:lang='tr'>
  <!-- lang en xml:lang komen niet overeen — html-xml-lang-mismatch-overtreding -->
  <head><title>XHTML Sayfası</title></head>
  <body><p>İçerik burada.</p></body>
</html>

XHTML xml:lang-mismatch — Juist

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
  'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' lang='tr' xml:lang='tr'>
  <!-- Zowel lang als xml:lang zijn 'tr' — consistent en geldig -->
  <head><title>XHTML Sayfası</title></head>
  <body><p>İçerik burada.</p></body>
</html>

Verkeerde taal gedeclareerd op een meertalige site — Onjuist

<!-- Engelstalige versie van de site, maar lang is globaal ingesteld op 'tr' -->
<html lang='tr'>
  <head><title>About Us</title></head>
  <body>
    <p>Welcome to our company. We specialize in accessible web solutions.</p>
  </body>
</html>

Verkeerde taal gedeclareerd op een meertalige site — Juist

<!-- Elke taalversie declareert zijn eigen correcte lang-attribuut -->
<html lang='en'>
  <!-- Dit is de Engelse pagina; de Turkse pagina op /tr/ declareert lang='tr' -->
  <head><title>About Us</title></head>
  <body>
    <p>Welcome to our company. We specialize in accessible web solutions.</p>
  </body>
</html>

Veelvoorkomende Fouten

  • De volledige Engelse naam van de taal gebruiken in plaats van de BCP 47-codelang='turkish', lang='english' of lang='arabic' schrijven in plaats van de juiste codes tr, en en ar. Deze waarden worden niet herkend door ondersteunende technologieën.
  • Een underscore gebruiken als regiocheidingstekenlang='en_US' of lang='tr_TR' schrijven in plaats van de vormen met koppelteken lang='en-US' en lang='tr-TR'. BCP 47 vereist koppeltekens, geen underscores.
  • Het lang-attribuut op <body> in plaats van op <html> zetten — het lang-attribuut moet op het root-<html>-element staan om te voldoen aan de axe-core-regel html-has-lang en om ondersteunende technologieën de paginaniveau-taalcontext te geven die ze nodig hebben voordat ze inhoud parseren.
  • lang als een lege string latenlang='' instellen wordt door de meeste ondersteunende technologieën hetzelfde behandeld als een ontbrekend attribuut en zal worden gemarkeerd door html-has-lang, omdat een lege string geen geldige taalcode is.
  • Een template uit een ander taalproject kopiëren zonder het lang-attribuut bij te werken — een zeer veelvoorkomend probleem in Turkse ontwikkelworkflows waar een Engelstalige boilerplate wordt hergebruikt en het lang='en' op de <html>-tag nooit wordt gewijzigd in lang='tr'.
  • Het juiste lang-attribuut declareren maar het niet bijwerken bij de lancering van een nieuwe taalversie van de site — meertalige sites die server-side rendering gebruiken, moeten ervoor zorgen dat het lang-attribuut dynamisch per locale wordt ingesteld en niet hard-coded is op één waarde in een gedeelde lay-outtemplate.
  • Aannemen dat een CMS of framework het lang-attribuut automatisch correct instelt — veel CMS-platforms (inclusief sommige configuraties van WordPress, Joomla en maatwerkframeworks) stellen standaard geen geldig lang-attribuut in. Ontwikkelaars moeten dit op templateniveau verifiëren en er niet van uitgaan dat het geregeld is.
  • Het lang-attribuut (voor HTML) verwarren met de Content-Language HTTP-header — de HTTP-header beïnvloedt caching en contentonderhandeling, maar wordt niet gebruikt door schermlezers. Het in-document lang-attribuut op <html> is het juiste mechanisme voor naleving van WCAG 3.1.1.
  • Een geldige maar onjuiste regionale subtag gebruiken die een ander dialect impliceert — bijvoorbeeld lang='zh-TW' (Traditioneel Chinees, Taiwan) declareren op een pagina die in Vereenvoudigd Chinees (zh-CN) is geschreven, kan ertoe leiden dat een schermlezer het verkeerde stemprofiel en de verkeerde uitspraakregels selecteert.
  • Vergeten lang in te stellen op dynamisch geïnjecteerde volledige pagina-inhoud in single-page applications (SPA’s) — als een SPA inhoud in meerdere talen binnen dezelfde documentshell laadt zonder het lang-attribuut bij te werken, krijgen gebruikers die tussen taalsecties navigeren geen correcte TTS-uitspraak voor nieuwe inhoudssecties.

Relatie met de Toegankelijkheidsregelgeving van Turkije

WCAG 3.1.1 Taal van de pagina heeft directe juridische betekenis in Turkije onder de Presidential Circular 2025/10, gepubliceerd in het Staatsblad nr. 32933 op 21 juni 2025. Deze circulaire stelt verplichte webtoegankelijkheidseisen vast die zijn afgestemd op WCAG 2.2 en wijst Niveau A-conformiteit aan als de minimaal verplichte standaard voor alle betrokken entiteiten.

De circulaire heeft betrekking op een breed scala aan organisaties in zowel de publieke als de private sector. Publieke instellingen — waaronder ministeries, gemeenten, staatsuniversiteiten, openbare ziekenhuizen en alle centrale en lokale overheidsorganen — moeten binnen één jaar na publicatie van de circulaire volledige Niveau A-conformiteit bereiken. Entiteiten in de private sector die onder de regeling vallen, hebben een tweejarige nalevingstermijn en omvatten e-commerceplatforms, banken en financiële instellingen, particuliere ziekenhuizen en zorgaanbieders, telecomoperators met 200.000 of meer abonnees, reisbureaus, particuliere vervoersbedrijven en particuliere scholen die opereren onder een vergunning van het Ministry of National Education (MoNE).

Omdat WCAG 3.1.1 een criterium op Niveau A is, valt het binnen de verplichte basislijn voor elke entiteit die onder de circulaire valt. De website van een Turkse overheidsinstelling die lang='tr' weglaat uit het <html>-element — of een onjuiste of ongeldige taalcode declareert — voldoet rechtstreeks niet aan een wettelijk voorgeschreven standaard. Voor organisaties in de private sector, zoals banken en e-commerceplatforms, vormt dezelfde fout binnen hun nalevingstermijn een overtreding van de regelgeving.

De praktische implicatie voor Turkse webteams is aanzienlijk: elke paginatemplate, elke CMS-lay-out, elke SPA-shell en elke dynamisch gegenereerde pagina moet worden geaudit om de aanwezigheid van een geldig lang='tr' (of een passende variant) op het root-HTML-element te bevestigen. Dit is niet slechts een best practice-aanbeveling — onder Circular 2025/10 is het een wettelijke verplichting. Aangezien de axe-core-regels html-has-lang en html-lang-valid het merendeel van deze fouten automatisch kunnen detecteren, is er geen technische barrière om dit probleem te identificeren en op te lossen voordat de nalevingstermijnen verstrijken.

Organisaties die onder de circulaire vallen, moeten naleving van WCAG 3.1.1 behandelen als een remediëringsitem met de hoogste prioriteit: het is een van de gemakkelijkste criteria om te herstellen (één attribuut op één element), maar het heeft een buitenproportioneel grote impact op de toegankelijkheid van elke pagina voor schermlezersgebruikers — de groep wier rechten de regelgeving het meest direct beoogt te beschermen.