必须写在<html>标签上且值为zh-CN,其他位置或写法均无效;需严格遵循BCP 47规范,大小写、分隔符、子标签顺序错误将被静默忽略。

直接写对 <html lang="zh-CN"> 这一行,就能避开绝大多数警告。关键不是“怎么写”,而是“写在哪”和“怎么拼”。Lighthouse、W3C 验证器、Chrome DevTools 的无障碍检查,都只盯着这一个位置——而且校验极严,错一个字符就报 invalid language subtag。
必须写在 <html> 标签上
其他任何地方都不算数:
• <body lang="zh-CN"> → 无效,不触发翻译按钮,VoiceOver 忽略
• <meta http-equiv="Content-Language" content="zh-CN"> → HTML5 已弃用,所有现代浏览器静默忽略
• JS 动态设置 document.documentElement.lang = "zh-CN" → 页面加载后改,对已激活的读屏会话和 CSS :lang() 无影响
值必须严格符合 BCP 47 规范
大小写、分隔符、子标签顺序,一个都不能错:
- ✅ 正确:
zh-CN、en-US、ja-JP、fr-FR - ❌ 错误(全部被浏览器静默丢弃,等效于没写):
•zh_cn(下划线)
•ZH-CN(大写)
•zh-china(非标准子标签)
•Chinese(自然语言名,非语言代码)
•zh-CN(末尾空格)
中文推荐用 zh-CN,别图省事写 zh
zh 虽然语法合法,但实际问题多:
- iOS VoiceOver 可能跳过中文 TTS 引擎,把“用户”读成 /yóu sèr/
- Google Search Console 提示“未指定语言”
- 部分旧版 JAWS 或翻译插件匹配不准
-
zh-Hans语义更准,但 Safari 12 及更早版本不识别,兼容性有缺口
局部多语言内容要显式标注
不能靠继承,否则 :lang(zh) 伪类不匹配,读屏软件也会乱读:
立即学习“前端免费学习笔记(深入)”;
- 英文术语:
<code lang="en">useState</code> - 法语引文:
<blockquote lang="fr">Merci.</blockquote> - 代码注释:
<pre lang="en"># Initialize counter</pre>(不是lang="python") - 避免过度包裹:
<div lang="en"><p>...</p></div>会干扰语义和 CSS 匹配



















