必须在语义化文本标签(如、、)上显式设置符合bcp 47标准的lang属性,通用容器(如)无效;中英文混排需分层标注,外语词须用内嵌语义标签单独声明lang,且值须严格为zh-cn、en-us等合法格式。

必须逐词/逐短语显式标注,不能靠父容器继承,也不能用“看起来像”来猜语言。
lang 属性只在语义化文本标签上生效
浏览器和屏幕阅读器(如 NVDA、VoiceOver)只识别 <p></p>、<span></span>、<th>、<code><td>、<code><code> 等承载自然语言文本的元素上的 lang 值。<div>、<code><section></section> 或 <article></article> 这类通用容器即使加了 lang,也不会触发语音引擎切换或拼写检查——它们没有语言语义。
常见错误现象:
-
<div lang="ja">ユーザー</div>→ 读屏软件仍按页面默认语言朗读 -
<p>调用 </p> <div lang="en">useState</div>→ 英文部分被中文引擎硬读
正确做法是用有语义的包裹:用 <code lang="en">useState 或 <span lang="ja">ユーザー</span>。
中英文混排时,不能整个段落统一设 lang
一个 <p></p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5493" title="html-to-pptx"><img
src="https://img.php.cn/upload/skill/000/000/081/179051045119472.jpg" alt="html-to-pptx" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5493" title="html-to-pptx" class="overflowclass">html-to-pptx</a>
<p class="overflowclass">将多页 HTML 演示文稿转换为美化的 PPTX 文件,便于分享和分发。</p>
</div>
<a rel="nofollow" href="/xiazai/skill5493" title="html-to-pptx" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div> 里既有中文说明又有英文术语(比如“使用 fetch 发起请求”),若整段设 lang="zh-CN",fetch 会被读成“弗奇”;若设 lang="en",中文部分会被切成音节乱读。
实操要点:
- 主语言用外层标签声明:
<p lang="zh-CN">…</p> - 外语词/缩写/代码用内嵌语义标签包裹并单独标
lang:<code lang="en">fetch、<span lang="fr">bonjour</span> - 避免用
<span></span>包英文却漏掉lang—— 没声明就等于没语言意图
lang 值必须严格匹配 BCP 47 标准,大小写和分隔符都不能错
写错值浏览器不报错,但等同于没写:zh_CN、english、zh-hans(小写 h)、EN-US(大写 EN)都会导致降级为 und(未知语言),进而让屏幕阅读器、SEO、CSS :lang() 全部失效。
必须用的写法:
-
zh-CN(不是zh_CN或zh-Hans,除非你明确区分简繁) -
en-US(不是en-us或english) -
ja、ko、fr单语言码足够,无需加地域后缀 - 技术词如
API、UI、HTTP统一用lang="en",不是因为“是缩写”,而是因其发音规则归属英语
表格和代码块里的外语词最容易被忽略
表格单元格和 <pre class="brush:php;toolbar:false;"></pre>/<code> 是高频混排场景,但也是 lang 遗漏重灾区。浏览器不会从 <table> 或 <code><pre class="brush:php;toolbar:false;"></pre> 继承语言,哪怕你写了 <table lang="en">,里面的日文 <code><td>東京</td> 仍被读成中文音节。
关键操作:
-
<td lang="ja">東京</td>✅ 直接写在<td> 上<li> <code><pre class="brush:php;toolbar:false;" lang="bash">curl -X POST</pre>❌bash不是合法语言标签,应改为lang="en"或留空 -
<code lang="sql">SELECT * FROM users❌ 同理,sql非 BCP 47,应为lang="en" - 数值、日期、单位(如
2026-09-21、USD)不用加lang,它们无发音规则
最常被跳过的点:动态渲染的表格或代码块,JS 插入 DOM 后没补 lang 属性——读屏软件只看首屏 HTML 中已存在的声明,后期用 JS 改 el.lang = "ja" 不会触发语音引擎重载。










