必须写在<html>标签上且值为zh-CN,因为浏览器、屏幕阅读器、Chrome翻译按钮和Google搜索引擎仅在HTML解析最早阶段读取该属性;其他位置或写法均无效。

必须写在 <html> 标签上,且值为 zh-CN(短横线,大写 CN),其他任何位置或写法都无效。
为什么只能写在 <html> 标签上
浏览器、屏幕阅读器(如 NVDA、VoiceOver)、Chrome 翻译按钮、Google 搜索引擎,全部只在解析 HTML 字节流的最早阶段读取 <html lang="zh-CN">。这个时机一过,就再无机会触发语言相关行为。
-
<body lang="zh-CN">:仅影响极少数 CSS:lang()匹配和局部断词,不被识别为页面语言 -
<meta http-equiv="Content-Language" content="zh-CN">:HTML5 已废弃,所有现代浏览器忽略 -
document.documentElement.lang = "zh-CN"(JS 设置):页面已渲染完成,语音引擎不重载,翻译按钮不激活,SEO 无感知
zh-CN 的写法细节和常见错误
BCP 47 规范对大小写、分隔符、子标签顺序有严格要求。写错不会报错,但等于没写——搜索引擎跳过、读屏乱读、:lang(zh-CN) 样式不生效。
- ✅ 正确:
zh-CN(小写 zh + 短横线 + 大写 CN) - ❌ 错误:
zh_cn(下划线非法)、zh-china(非 IANA 注册码)、ZH-CN(语言码必须小写)、zh-Hans-CN(三段式不被 Chrome 支持,静默降级为zh) - ⚠️ 模糊但“能用但不推荐”:
zh—— iOS VoiceOver 可能跳过中文 TTS,Google Search Console 提示“未指定语言”
多语言混排时,zh-CN 怎么配合局部 lang
<html lang="zh-CN"> 只定义主语言,不影响内部外文内容的识别。英文引文、代码块、日语术语等,必须显式加 lang 属性,否则会被按中文规则硬读或断词错误。
立即学习“前端免费学习笔记(深入)”;
-
<p lang="en">API</p>→ 屏幕阅读器用英语发音引擎读 “A-P-I”,不是“阿皮” -
<pre lang="bash">curl -X POST</pre>→ 语法高亮工具和翻译插件才能正确识别命令语言 -
<blockquote lang="ja">こんにちは</blockquote>→ VoiceOver 自动切换日语语音库 - 语言切换时,若需同步更新局部内容,得遍历所有带
lang的元素并重设,不能只改<html>
最常被忽略的一点:静态站、SSR、SPA 的处理方式完全不同。硬编码、服务端注入、整页刷新——没有“一次 JS 改掉全部”的通用解法。别指望 lang 是个可响应式变量。



















