html-lang-require规则仅检查标签是否声明lang属性,不校验值是否规范;报错如“missing required attribute 'lang'”即表示根节点缺失,需在.htmlhintrc中启用并用npx htmlhint执行检测。

HTMLHint 的 html-lang-require 规则能直接报错
只要没写 ,HTMLHint 就会在控制台标出错误,定位到具体行号。它不关心值对不对,只管“有没有”。这是最基础的兜底检查。
实操建议:
- 在项目根目录放
.htmlhintrc文件,启用html-lang-require(默认已开启) - 命令行运行
npx htmlhint index.html,看到类似index.html:1:1: Missing required attribute "lang"就说明根节点缺失 - 注意:这个规则不会检测
或<div lang> —— 它只认 <code>标签浏览器 DevTools 控制台查
document.documentElement.lang打开页面后,在 Console 里输
document.documentElement.lang,返回值必须是非空字符串且符合 BCP 47 格式(如zh-CN、en-US)。空值、zh、zh_CN、Chinese都算不规范。常见问题:
-
""(空字符串)→ 源码里写了,等同于未声明 -
"zh"→ 虽然语法合法,但 VoiceOver 和 Google Search Console 会降级处理 -
"zh-CN "(末尾带空格)→ 值被截断或解析失败,CSS:lang(zh-CN)不匹配
用 Nu Html Checker 验证值是否符合标准
W3C 的 Nu Html Checker 会严格校验
lang值是否在 IANA 语言子标签注册库中存在。比如zh-Hans会被接受,但zh-china或en_US会直接报错。为什么不能只靠肉眼判断?
- 大小写敏感:
fr-fr❌,fr-FR✅ - 连字符强制:
pt_BR❌,pt-BR✅ - 地区码非必需但强烈建议:
en合法,但en-US更可靠,尤其对字体 fallback 和 TTS 引擎
多语言单元格要单独检查
<td lang> 是否显式声明 <p>表格里的外语词,<code><table lang="en"> 或 <code><tr lang="ja"> 全无效。必须每个 <code><td> 或 <code><th> 单独加 <code>lang,且值要和内容真实语言一致。容易被忽略的点:
-
<td lang="en">ユーザー</td>→ 日文假名写成en,屏幕阅读器会按英语音节硬读,发音完全错误 -
<td>调用 <code lang="en">useState→ 外层<td> 必须设 <code>lang="zh-CN",否则中文部分可能被英文引擎切音节 - JS 动态渲染表格时,
lang必须随数据一起注入,不能靠后期el.setAttribute('lang', 'ja')补 —— 读屏软件已加载完毕,不重算
真正难的不是写对根节点,而是让每个外文词都“说对母语”。
lang不是装饰属性,它是浏览器、读屏软件、搜索引擎共同依赖的语言信标,漏一个、错一个,整条链路就可能静默失效。 -











