必须在标签上唯一声明lang属性,值须合法如zh-cn;其他位置声明无效,动态内容需手动补全,表格单元格须单独标注语言。

直接检查html>标签是否缺失lang属性
这是最常见也最关键的漏点:整个页面只允许且必须在标签上声明一次lang。如果它根本没出现,或写在、<div>甚至<code><meta>里,就等于没设。
打开浏览器开发者工具(F12),切换到 Elements 面板,第一眼就盯住顶部的节点。如果没有lang属性,或者值为空(lang="")、非法(如lang="ZH-CN"、lang="zh_ch"、lang="Chinese"),问题就在这里。
-
lang="zh"虽不报错,但属于粒度太粗——iOS VoiceOver可能跳过中文TTS引擎,Chrome翻译按钮也可能不触发 -
完全无效,<title></title>和<meta name="description">不会继承它,语义已“失联” -
<meta http-equiv="Content-Language" content="zh-CN">是HTML5已弃用的写法,辅助技术全都不认
用CSS选择器快速高亮未标注语言的表格单元格
表格内容常混排多语言,但<table>或<code><tr>上的<code>lang不会向下继承。屏幕阅读器会用的默认语言硬读所有<td>,导致日文、阿拉伯文发音错乱。
<p>在控制台执行以下代码,能立刻标出所有未显式声明<code>lang的<td>和<code><th>:
<pre class="brush:php;toolbar:false;">$$('td:not([lang]), th:not([lang])').forEach(el => el.style.outline = '2px solid #ff6b6b')</pre>
<p>注意:<code><td><div lang="ja">東京</div></td>这种写法无效——<div>不传递语言语义,必须把<code>lang直接写在<td>或<code><th>上。
<h3>用正则批量扫描HTML源码中lang缺失或错位的位置</h3>
<p>人工扫源码容易漏,尤其当页面由模板拼接、SSR生成或第三方脚本注入时。可用以下正则快速定位风险点:</p>
<ul>
<li>查<code>是否缺失lang:]*\s+lang=)(匹配开头后无<code>lang=的标签)
lang是否误写在非位置:]+?lang=(匹配除外所有带lang=的开始标签)lang\s*=\s*["']([^"'\s_]+?-[A-Z]+?|[^"'\s]+?_[^"'\s]+?)["']
这些正则可在VS Code、Sublime或Chrome控制台用new RegExp()测试。注意:它不替代DOM解析,仅作初筛;若HTML严重 malformed(如未闭合标签),优先用DOMDocument::loadHTML()类方案。
动态渲染内容中lang属性被覆盖或丢失的排查路径
JS修改document.documentElement.lang基本无效——屏幕阅读器只在初始HTML解析阶段读取该值。SPA切换语言后,旧节点仍按原始lang参与拼写检查、字体fallback和CSS :lang()匹配。
- 检查首屏HTML是否已输出正确
,而不是靠JS后期赋值 - 搜索代码中是否有
innerHTML拼接、document.write或框架v-html等操作,它们生成的节点不会自动继承根lang,需手动补lang属性 - 第三方组件(如富文本编辑器、评论插件)插入的
<p></p>或<blockquote></blockquote>,常遗漏lang,要监听其挂载完成事件后主动补
真正难的不是设对一个lang="zh-CN",而是让每个动态插入、跨框架、第三方脚本生成的文本节点,都带着准确的语言上下文被解析。











