必须将 lang 属性唯一设置在 标签上,如 ,以确保屏幕阅读器正确识别页面主语言;其他位置或写法均无效或不兼容。

必须写在 标签上,且只写一次;写错、写漏或写在其他地方,屏幕阅读器基本就“听不懂”你在说什么了。
lang 属性只能设在 标签上
浏览器和屏幕阅读器(如 NVDA、VoiceOver)只认根元素上的 lang 值。它决定了整页文本的默认发音规则、断词逻辑和标点朗读方式。
-
✅ 正确:页面主语言明确为简体中文(中国大陆) -
❌ 无效:不被解析为文档语言,仅影响该内部的局部行为(如有) -
<meta http-equiv="Content-Language" content="zh-CN">❌ 已废弃:HTML5 不再支持,完全被忽略 -
或❌ 风险高:空值视为“未知语言”,zh过于宽泛,部分读屏软件会 fallback 到英文引擎
为什么选 zh-CN 而不是 zh-Hans 或 zh
BCP 47 规范允许多种写法,但实际兼容性差异很大。屏幕阅读器依赖语言码加载对应语音库,拼错或粒度太粗都会导致误读。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
-
zh-CN:事实标准,覆盖拼音方案、词典、声调规则最全,NVDA/JAWS/VoiceOver 全部稳定识别 -
zh-Hans:强调“简体字”,但未绑定地域,某些旧版读屏或翻译插件可能无法匹配正确语音模型 -
zh:不区分简繁、不指明区域,iOS VoiceOver 可能跳过中文 TTS 引擎直接用英语朗读“行”“长”等多音字 - 别写
zh_china、zh_CN、Chinese:全部非法,会被静默忽略
多语言混排时怎么让屏幕阅读器“切换语种”
主语言靠 确立,但嵌入的英文术语、日文引用、代码注释等,必须显式标注子元素的 lang,否则读屏仍用中文规则硬读。
- 单个外文词:
<span lang="en">API</span>→ 读作 /ˈeɪ.piː.ˈaɪ/,不是“阿皮” - 整段英文:
<p lang="en">This is a code example.</p> - 代码块注释:
<pre class="brush:php;toolbar:false;" lang="en"># Initialize counter</pre>(注意不是lang="bash") - 避免滥用:
<div lang="en"> 包裹多个段落——语义不清,且可能干扰父级 <code>:lang(zh)CSS 匹配JS 动态改
lang对屏幕阅读器基本没用屏幕阅读器在 DOM 解析初期就读取
的lang,后续 JS 修改(如document.documentElement.lang = "en-US")不会触发语音引擎重载或重新分析文本。- SPA 多语言切换:不能只靠 JS patch,必须服务端渲染(SSR)或静态生成(SSG)不同
lang的 HTML 文件 - Next.js/Nuxt:确保
在首屏 HTML 中已存在,而不是等客户端 hydration 后才注入 - 强制刷新是目前最可靠方案:语言切换后
window.location.href = "/en/about",让读屏从头开始读 - 哪怕你把
lang改对了,已朗读过的节点也不会自动重读——这是最容易被忽略的“假成功”场景
- SPA 多语言切换:不能只靠 JS patch,必须服务端渲染(SSR)或静态生成(SSG)不同










