Requires that passages and phrases in a different language than the page default are marked, so assistive technology pronounces them correctly.
A page in English with a French quotation, or a Turkish page with an English product name, is read wrongly when the screen reader assumes one language throughout. The French phrase gets English pronunciation and becomes unintelligible.
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, words of indeterminate language, and words or phrases that have become part of the vernacular of the surrounding text.
lang attribute on the element that contains text in a different language than the page default (H58). A phrase can be a single word.lang takes the page default, which must be declared under 3.1.1.Screen reader and text-to-speech users, who hear each phrase with the right pronunciation. Braille users whose software switches braille tables. People with reading, cognitive or language disabilities who rely on text-to-speech. People who rely on captions that show language changes. Language learners and translation tools benefit too.
The European Accessibility Act (Directive (EU) 2019/882) applies to in-scope products and services placed on the market after 28 June 2025. Recital 47 names four principles for websites and mobile applications: perceivable, operable, understandable and robust. A programmatically available language for each passage is part of "understandable".
The technical counterpart is the standard EN 301 549, which incorporates WCAG 3.1.2 by reference and turns it into separate clauses for each kind of ICT.
| Clause | Type of ICT | What it requires |
|---|---|---|
| 9.3.1.2 | Web pages | Web content must satisfy WCAG success criterion 3.1.2. |
| 10.3.1.2 | Non-web documents (PDF, Office files) | Documents must mark the language of passages where the standard applies the criterion to them. |
| 11.3.1.2 | Non-web software (native mobile apps) | Software must identify the language of passages that differ from its own language. |
Whether and how the criterion applies to non-web documents is stated in clause 10 of the standard. Clause numbers follow the "9. + WCAG number" pattern of EN 301 549. In V3.2.1 the software clause is divided into further subclauses for open and closed functionality. Check the exact numbers in the standard when you cite them.
Standard version: EN 301 549 V4.1.1 (September 2026) is based on WCAG 2.2 and is the first version prepared specifically for the EAA. It has not yet been cited in the Official Journal of the European Union, so for now it is best treated as a voluntary technical route to the EAA's requirements. Once cited, it will give a presumption of conformity. The text of criterion 3.1.2 is the same in WCAG 2.1 and 2.2. It is a Level AA criterion.
A note on EAA scope: Article 2(4) of the Directive excludes certain content from the requirements, for example office file formats published before 28 June 2025 and archives that are not updated after that date. Content you publish or change after that date is not covered by these exclusions.
Directive (EU) 2019/882, EUR-Lex, opens in a new tab
Wrap it with the right lang (H58).
<p>As the French say, c'est la vie.</p><p>As the French say, <span lang="fr">c'est la vie</span>.</p>Mark the quotation, not the whole page.
<blockquote>Die Bremer Stadtmusikanten …</blockquote><blockquote lang="de">Die Bremer Stadtmusikanten …</blockquote>Label each language name in its own language and mark it, so a screen reader pronounces it properly.
<a href="/de">Deutsch</a> <a href="/tr">Türkçe</a><a href="/de" lang="de" hreflang="de">Deutsch</a>
<a href="/tr" lang="tr" hreflang="tr">Türkçe</a>No markup is required for the exceptions, although it is still allowed.
<p>We met <span lang="fr">Albert Camus</span> at the rendezvous.</p> <!-- optional, not required --><p>We met Albert Camus at the rendezvous.</p> <!-- exempt: proper name and vernacular -->Put the lang attribute on the element that holds the foreign text.
<a href="/menu">Plat du jour</a><a href="/menu"><span lang="fr">Plat du jour</span></a>A region subtag can be used on a passage too.
<p>In Brazil: obrigado pelo apoio.</p><p>In Brazil: <span lang="pt-BR">obrigado pelo apoio</span>.</p>Native apps can mark the language of a passage for the screen reader. The attribute is applied to the text, not to the whole screen.
import UIKit
// The speech language attribute tells VoiceOver how to pronounce this passage
let label = UILabel()
let attributed = NSMutableAttributedString(string: "As the French say, c'est la vie.")
let range = (attributed.string as NSString).range(of: "c'est la vie")
attributed.addAttribute(.accessibilitySpeechLanguage, value: "fr", range: range)
label.attributedText = attributed
label.accessibilityAttributedLabel = attributedimport android.os.Bundle
import android.text.SpannableString
import android.text.Spanned
import android.text.style.LocaleSpan
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import java.util.Locale
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val text = SpannableString("As the French say, c'est la vie.")
val start = text.indexOf("c'est la vie")
// LocaleSpan tells TalkBack which language the passage is in
text.setSpan(LocaleSpan(Locale.FRENCH), start, start + "c'est la vie".length,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
findViewById<TextView>(R.id.label).text = text
}
}lang attribute?valid-lang) detect invalid values. They cannot find passages that should be marked, so a person must read the content.lang: The screen reader mispronounces them.lang="fr-FR" is fine, marking it as lang="french" is not.lang.aria-label: Language changes inside an accessible name can be lost, so check the markup and prefer visible text marked with lang.