lang必须写在<html>标签上,其他位置无效;中英文混排需逐块显式标注;zh-CN为最兼容标准;JS动态改lang对已渲染内容无效。

lang必须写在标签上,其他位置全无效
屏幕阅读器(NVDA、VoiceOver、JAWS)只在初始解析时读取<html>的lang属性,用它决定整页默认语音引擎。写在<body>、<div>或<meta>里,等于没写——既不触发语音切换,也不影响SEO和浏览器翻译提示。
常见错误包括:<html lang="zh">(太宽泛,旧版JAWS可能fallback到英文TTS)、<html lang="zh_CN">(下划线非法,浏览器静默忽略)、<html lang="Chinese">(非BCP 47标准,完全不识别)、<html lang="zh-CN ">(末尾空格导致Lighthouse报invalid language subtag)。
中英文混排必须逐块显式标注lang
根lang="zh-CN"只管默认行为;遇到英文术语、代码、引文,读屏软件仍会用中文规则硬读,比如把API读成“阿皮”,React读成“瑞克特”。必须按语义粒度加lang:
- 单个外文词:
<span lang="en">HTTPS</span>—— 触发英文音素切分 - 技术标识符:
<code lang="en">fetch()</code>—— 比<span>更语义准确,部分读屏对<code>有特殊停顿处理 - 整段英文说明:
<p lang="en">The response is a JSON object.</p> - 避免滥用:
<div lang="en">包裹多段落 —— 语义不清,还可能干扰:lang(zh)CSS选择器匹配
繁体、简体、书写变体的lang值怎么选
对主流读屏软件而言,zh-CN和zh-Hans发音准确性和声调处理几乎一致,但兼容性有实际分水岭:
立即学习“前端免费学习笔记(深入)”;
-
zh-CN是IETF事实标准,Windows Narrator、iOS VoiceOver、NVDA 2022+ 全部稳定加载普通话语音库 -
zh-Hans强调“简体字形”,适合大陆+新加坡+马来西亚部署,但旧版JAWS(如v2018)可能无法匹配完整词典 -
zh-Hans-CN是非法组合,IANA不接受嵌套区域+书写变体,浏览器直接丢弃 - 繁体场景优先用
zh-TW(台湾本地适配最强),zh-Hant可用于港澳通用,但部分翻译插件支持不稳定
JS动态改lang对已渲染内容完全无效
React/Vue应用里执行document.documentElement.lang = "en-US",只影响后续插入的DOM节点,对页面已存在的文本、已挂载的组件、已绑定的CSS伪类(如:lang(en))均无重计算效果。
这意味着:
- 语言切换后,旧内容不会自动重读,用户得手动刷新或重新聚焦
- 不能靠JS补救初始
lang缺失——一旦解析完成,语音引擎就固定了 - 服务端渲染(SSR)或静态生成时,必须确保首屏HTML的
<html lang="xxx">已正确输出
最常被忽略的一点是:语音是否自然,80%取决于lang是否准确、是否嵌套得当,而不是用了多高级的TTS库。它不炫技,但错不得。



















