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

HTMLHint 的 html-lang-require 规则能直接报错
只要没写 <html lang="...">,HTMLHint 就会在控制台标出错误,定位到具体行号。它不关心值对不对,只管“有没有”。这是最基础的兜底检查。
实操建议:
- 在项目根目录放
.htmlhintrc文件,启用html-lang-require(默认已开启) - 命令行运行
npx htmlhint index.html,看到类似index.html:1:1: Missing required attribute "lang"就说明根节点缺失 - 注意:这个规则不会检测
<body lang>或<div lang>—— 它只认<html>标签
浏览器 DevTools 控制台查 document.documentElement.lang
打开页面后,在 Console 里输 document.documentElement.lang,返回值必须是非空字符串且符合 BCP 47 格式(如 zh-CN、en-US)。空值、zh、zh_CN、Chinese 都算不规范。
常见问题:
立即学习“前端免费学习笔记(深入)”;
-
""(空字符串)→ 源码里写了<html lang="">,等同于未声明 -
"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> 是否显式声明
表格里的外语词,<table lang="en"> 或 <tr lang="ja"> 全无效。必须每个 <td> 或 <th> 单独加 lang,且值要和内容真实语言一致。
容易被忽略的点:
-
<td lang="en">ユーザー</td>→ 日文假名写成en,屏幕阅读器会按英语音节硬读,发音完全错误 -
<td>调用 <code lang="en">useState</td> → 外层<td>必须设lang="zh-CN",否则中文部分可能被英文引擎切音节 - JS 动态渲染表格时,
lang必须随数据一起注入,不能靠后期el.setAttribute('lang', 'ja')补 —— 读屏软件已加载完毕,不重算
真正难的不是写对根节点,而是让每个外文词都“说对母语”。lang 不是装饰属性,它是浏览器、读屏软件、搜索引擎共同依赖的语言信标,漏一个、错一个,整条链路就可能静默失效。



















