Ungültige Sprachangabe im Text (valid-lang)

Die Regel valid-lang meldet ein lang-Attribut an einem Element innerhalb der Seite – einem Zitat, einem Link im Sprachumschalter, einem Absatz –, dessen Wert kein gültiger Sprachcode ist, etwa fr_FR oder französisch. Screenreader können für diese Passage nicht auf die richtige Aussprache umschalten. Die Lösung ist ein korrekt geschriebener Code: lang="fr".

Was die Regel bedeutet

WCAG 3.1.2 Sprache von Teilen verlangt, dass Software die Sprache jeder Passage oder Wendung ermitteln kann, die von der Seitensprache abweicht. In HTML zeichnen Sie eine solche Passage mit lang an dem Element aus, das sie umschließt.

valid-lang prüft jedes Element außer <html>, das lang (oder xml:lang) trägt. Die Regel nimmt den Teil vor dem ersten Bindestrich und vergleicht ihn mit der Liste bekannter Sprachcodes von axe-core. Sie schlägt an bei:

  • Locale-Bezeichnern mit Unterstrich: fr_FR, de_DE;
  • Sprachnamen statt Codes: französisch, english;
  • Codes, die es nicht gibt, etwa dk für Dänisch (richtig: da).

Nicht gemeldet werden:

  • ein leeres lang="" – das ist erlaubt und bedeutet „Sprache unbekannt“;
  • Elemente ohne eigenen Text, etwa ein leeres <span lang="xx">;
  • eine anderssprachige Passage ganz ohne lang. Das ist der häufigste Verstoß gegen 3.1.2, und keine automatische Regel findet ihn, weil dazu jemand die Sprache erkennen muss.

WCAG 3.1.2 kennt Ausnahmen: Eigennamen, Fachbegriffe, Wörter unbestimmter Sprache und Wörter, die Teil der umgebenden Sprache geworden sind – etwa „Computer“ oder „Team“ im Deutschen –, brauchen kein lang.

Wen es betrifft

Vor allem blinde und sehbehinderte Menschen mit Screenreader. Screenreader wie NVDA, JAWS und VoiceOver können beim Sprachwechsel die Stimme umstellen – aber nur, wenn das Markup es mit einem lesbaren Code sagt. Mit einem ungültigen Code wird ein französisches Zitat auf einer deutschen Seite mit deutscher Aussprache vorgelesen und ist schwer zu verstehen. Dasselbe gilt für Übersetzungswerkzeuge und für Menschen, die sich Texte zur Unterstützung beim Lesen vorlesen lassen.

Warum die Prüfung anschlägt

  • Sprachumschalter, die an jedem Link die CMS-Locale ausgeben: lang="de_DE", lang="fr_FR".
  • Übersetzungs-Plugins, die übersetzte Textteile mit ihren internen Locale-Bezeichnern umschließen.
  • Sprachnamen aus einem Redaktionsfeld, etwa lang="englisch" aus der Sprachauswahl eines Texteditors.
  • Tippfehler und Ländercodes: lang="jp" statt ja, lang="dk" statt da.
  • Nicht ersetzte Platzhalter im Template, etwa lang="{{ item.locale }}".

So beheben Sie es

  1. Finden Sie die Quelle des Werts – meist das Template des Sprachumschalters oder das Plugin, das Übersetzungen auszeichnet.
  2. Schreiben Sie BCP-47-Codes: den Sprachcode, optional mit Bindestrich und Region (fr, fr-CA). Unterstriche werden zu Bindestrichen.
  3. Zeichnen Sie bei der Gelegenheit anderssprachige Passagen aus, die noch gar kein lang haben – auf die weist die Regel Sie nie hin.
<!-- Vorher: Locale-Bezeichner im Sprachumschalter -->
<nav class="sprachwahl" aria-label="Sprache">
  <a href="/en/" hreflang="en" lang="en_GB">English</a>
  <a href="/fr/" hreflang="fr" lang="fr_FR">Français</a>
</nav>
<!-- Nachher: gültige Sprachcodes, jeder Name wird in seiner Sprache vorgelesen -->
<nav class="sprachwahl" aria-label="Sprache">
  <a href="/en/" hreflang="en" lang="en">English</a>
  <a href="/fr/" hreflang="fr" lang="fr">Français</a>
</nav>

Ein anderssprachiges Zitat zeichnen Sie genauso aus – an dem Element, das genau diese Passage enthält:

<p>Das Motto des Hauses lautet <q lang="fr">Liberté, égalité, fraternité</q>.</p>

So prüfen Sie es von Hand

  1. Listen Sie in der Browserkonsole alle Sprachwechsel auf: document.querySelectorAll('[lang]'). Prüfen Sie jeden Wert gegen das IANA-Register der Sprachcodes.
  2. Lesen Sie die Seite und suchen Sie nach anderssprachigen Wörtern und Passagen ohne lang – Zitate, Produktnamen, die ganze Sätze sind, Song- oder Filmtitel, die Namen der anderen Sprachversionen im Umschalter.
  3. Hören Sie mit einem Screenreader (NVDA unter Windows, VoiceOver unter macOS) bei eingeschalteter automatischer Sprachumschaltung hin: Wechselt die Stimme dort, wo die Sprache wechselt?
  4. Denken Sie an die Ausnahmen: Eigennamen und eingebürgerte Lehnwörter brauchen keine Auszeichnung.

Zugehöriges WCAG-Kriterium

3.1.2 Sprache von Teilen, Stufe AA. Verwandt: 3.1.1 Sprache der Seite für die Seitensprache am <html>-Element, die dasselbe Codeformat nutzt.

So meldet Reviseberg diese Regel

Reviseberg führt valid-lang auf jeder gecrawlten Seite bei 1280 px aus. Sprachumschalter stehen im Header, deshalb erscheint ein ungültiger Code dort als ein Element pro Sprachlink auf jeder Seite. In der Befundliste sehen Sie die Regel mit Schweregrad, WCAG-Kriterium 3.1.2 und Stufe, der Zahl der Elemente und Seiten und den Punkten, die ein Fix zurückbringt. Im Detail stehen der Selektor, der HTML-Ausschnitt mit dem ungültigen Wert und alle betroffenen Seiten. Befunde können Sie mit Begründung als „ignorieren“, „nicht behebbar“ oder „Fehlalarm“ markieren; jede Entscheidung wird protokolliert.

Weil Passagen ganz ohne lang automatisch nicht zu finden sind, macht ein Crawl ohne Befund 3.1.2 nicht zu einem bestandenen Kriterium: Es gilt als teilweise geprüft, bis ein Mensch ein manuelles Ergebnis erfasst.

Verwandte Regeln

  • undefined – dieselbe Prüfung für die Seitensprache am <html>-Element.
  • undefined – die Seite hat gar keine Sprache.
  • undefined – Links, etwa im Sprachumschalter, brauchen einen lesbaren Namen.

Sprachauszeichnung auf Ihrer ganzen Website prüfen – kostenloser Scan

Häufige Fragen

Muss ich jedes Fremdwort mit lang auszeichnen?

Nein. Eigennamen, Fachbegriffe und Wörter, die Teil der umgebenden Sprache geworden sind, nimmt WCAG 3.1.2 aus. Auszeichnen sollten Sie Passagen und Wendungen, die man anders aussprechen würde.

Ist lang="" ein Fehler?

Nein. Ein leerer Wert bedeutet ausdrücklich „Sprache unbekannt“, und valid-lang meldet ihn nicht.

Sollen die Namen im Sprachumschalter ein lang tragen?

Ja, wenn jeder Name in seiner eigenen Sprache geschrieben ist („English“, „Français“). Dann spricht ein Screenreader jeden richtig aus.

Warum findet der Scan nichts, obwohl meine Seite ein englisches Zitat ohne Auszeichnung enthält?

Weil die Regel nur vorhandene lang-Attribute prüft. Eine Passage ohne lang sieht für jede automatische Prüfung aus wie Text in der Seitensprache.

Quellen

  1. W3C, Understanding SC 3.1.2 Language of Parts – https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts
  2. Deque University, axe-core 4.13 Regel valid-lang – https://dequeuniversity.com/rules/axe/4.13/valid-lang
  3. W3C, Technique H58: Using language attributes to identify changes in the human language – https://www.w3.org/WAI/WCAG22/Techniques/html/H58
  4. W3C Internationalization, Language tags in HTML and XML – https://www.w3.org/International/articles/language-tags/
  5. IANA, Language Subtag Registry – https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry

Sehen Sie, was ein Scan auf Ihrer Website findet

Eine Seite in rund 30 Sekunden, ohne E-Mail. Der vollständige Bericht umfasst bis zu 100 Seiten und einen Tastatur-Durchlauf.