lang属性不自动切换读屏语音,但能避免错读专有名词和缩写;必须精确设置在对应标签上并继承生效,区域变体(如zh-cn)影响发音与字形,与aria-label共存时仅控制朗读方式而非文本内容。

lang属性不自动切换读屏语音,但能避免错读专有名词和缩写
盲人用读屏软件听网页时,lang属性不会让软件“自动切语言”,但它决定了语音引擎用哪套发音规则来朗读文本。比如中文页面里夹一句英文“API”或“PDF”,没设lang="en",NVDA可能按中文拼音念成“a-p-i”或“p-d-f”,而不是标准英文读法 /ˌeɪ.piːˈaɪ/。这不是功能缺失,是发音策略没对齐。
lang必须写在html>标签上,子元素继承但不能覆盖
只给某个段落加lang="ja"没用——读屏器优先信任根节点的lang值。如果整页是中文,但某段日文内容需要准确朗读,正确做法是:
- 在
标签上写lang="zh-CN"(全局基准) - 对日文段落包裹
<span lang="ja">こんにちは</span> - 避免在
<div>或<code><p></p>上重复写lang,除非内容语种真不同常见错误:把
lang="en"写在或某个按钮上,结果读屏仍按中文引擎处理,因为没声明,浏览器默认 fallback 到系统语言。lang值要精确到区域变体,别用"en"这种泛称
lang="en"和lang="en-US"在部分读屏器(如 JAWS 2023+)中发音差异明显:前者可能用英国口音读“schedule”为 /ˈʃɛdjuːl/,后者按美式读 /ˈskɛdʒuːl/。中文同理:lang="zh-CN"(简体)、lang="zh-TW"(繁体)对应不同字形和读音库。写泛称等于放弃控制权。验证方法:用 Chrome DevTools 打开 Accessibility Inspector,选中元素,看 Computed Role 下方是否显示正确的 Language 值。若显示“und”(undefined),说明
lang没生效或值非法。lang和aria-label混用时,优先级以aria-label为准
当一个按钮同时有
aria-label="删除"和lang="ja",读屏器会用aria-label的文本内容,再按lang指定的规则朗读——也就是说,lang只管“怎么读”,不管“读什么”。这点容易被忽略:很多人以为加了lang="en"就能让aria-label="Submit"自动生效,其实前提是aria-label本身得是英文字符串。更隐蔽的问题是动态渲染场景:React/Vue 组件里用 JS 拼接
aria-label,但没同步更新lang属性。例如中英双语切换时,只改了文案,忘了改,读屏就会用中文引擎读英文词,结果“dashboard”被念成“代什博德”。











