# lang attribute must have a valid value

> Canonical HTML version: https://rocketvalidator.com/accessibility-validation/axe/4.11/valid-lang
> Attribution: Rocket Validator (https://rocketvalidator.com)
> License: CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/)

Screen readers rely on language information to select the correct pronunciation engine for content. Each language has its own sound library with unique pronunciation rules, intonation, and phonetic patterns. When a screen reader encounters a `lang` attribute with a valid value, it seamlessly switches to the appropriate library. But when the value is invalid — for example, `lang="egnlish"` instead of `lang="en"` — the screen reader cannot identify the language and falls back to its default, reading the foreign-language text with completely wrong pronunciation.

This primarily affects **blind users** and **deafblind users** who depend on screen readers, as well as **users with cognitive disabilities** who may rely on text-to-speech tools. Imagine hearing Spanish text pronounced with English phonetic rules — it would be nearly incomprehensible.

Note that this rule specifically checks `lang` attributes on elements *within* the page (not the `<html>` element itself, which is covered by a separate rule). It applies whenever you use the `lang` attribute to indicate that a section of content is in a different language than the rest of the page.

## Related WCAG Success Criteria

This rule maps to **WCAG 2.0 / 2.1 / 2.2 Success Criterion 3.1.2: Language of Parts** (Level AA). This criterion requires that the human language of each passage or phrase in the content can be programmatically determined, except for proper names, technical terms, and words of indeterminate language. Using a valid language code is essential to meeting this requirement — an invalid code fails to programmatically convey the language.

This rule is also referenced by the **Trusted Tester** methodology, **EN 301 549**, and **RGAA**.

## How to Fix It

1. **Use valid language codes.** Language values must conform to the [BCP 47](https://www.ietf.org/rfc/bcp/bcp47.txt) standard. In practice, this means using two- or three-letter codes from the [IANA Language Subtag Registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry). Common examples include `en` (English), `fr` (French), `es` (Spanish), `de` (German), `zh` (Chinese), `ar` (Arabic), and `ja` (Japanese).

2. **Check for typos.** Invalid values are often caused by misspellings (e.g., `lang="enlish"`) or using full language names instead of codes (e.g., `lang="French"` instead of `lang="fr"`).

3. **Use dialect subtags when appropriate.** You can specify regional variants such as `en-US` (American English), `en-GB` (British English), or `fr-CA` (Canadian French). The primary subtag alone is also valid.

4. **Set the `dir` attribute for RTL languages.** If you're marking content in a right-to-left language like Arabic or Hebrew, pair the `lang` attribute with `dir="rtl"` to ensure correct text rendering.

## Examples

### Incorrect: Invalid language code

```html
<p>Welcome to our site. <span lang="spn">Bienvenidos a nuestro sitio.</span></p>
```

The value `spn` is not a valid language subtag. Screen readers cannot identify this as Spanish.

### Incorrect: Full language name instead of code

```html
<p>Here is a quote: <q lang="Japanese">素晴らしい</q></p>
```

The value `Japanese` is not a valid BCP 47 language code.

### Correct: Valid two-letter language code

```html
<p>Welcome to our site. <span lang="es">Bienvenidos a nuestro sitio.</span></p>
```

The value `es` is the valid language subtag for Spanish.

### Correct: Valid language code with regional subtag

```html
<p>The Canadian term is <span lang="fr-CA">dépanneur</span>.</p>
```

The value `fr-CA` correctly identifies Canadian French.

### Correct: RTL language with direction attribute

```html
<p>The Arabic word for peace is <span lang="ar" dir="rtl">سلام</span>.</p>
```

The value `ar` is the valid subtag for Arabic, and `dir="rtl"` ensures proper text directionality.

### Correct: Multiple language switches on one page

```html
<p>
  In English we say "goodbye," in German it's
  <span lang="de">Auf Wiedersehen</span>, and in Japanese it's
  <span lang="ja">さようなら</span>.
</p>
```

Each inline element uses a valid language code, allowing the screen reader to switch pronunciation engines as needed.
