lang属性必须写在标签上,其他位置无效;值须严格遵循bcp 47规范(如zh-cn),否则被静默忽略,导致翻译按钮不显示、屏幕阅读器误读、seo识别错误。

lang 属性必须写在 标签上,其他位置全无效——这是浏览器、屏幕阅读器(如 VoiceOver、NVDA)、Chrome 翻译按钮和 Google 搜索识别页面语言的唯一依据。
为什么只能写在 标签上
浏览器和辅助技术在解析 HTML 的第一个字节时就提取 ,并据此加载对应语音库、切分中文词组、触发翻译入口。一旦解析完成,后续任何修改都来不及生效。
-
:仅影响 CSS:lang()匹配和极少数断词行为,不改变页面级语言 -
<meta http-equiv="Content-Language" content="zh-CN">:HTML5 已废弃,所有现代浏览器(Chrome/Firefox/Safari)完全忽略 -
document.documentElement.lang = "en-US"(JS 设置):页面已加载,语音引擎不会重载,翻译按钮不刷新,:lang()伪类也不重新计算
lang 值怎么写才不被静默忽略
必须严格遵循 BCP 47 规范,大小写、连字符、顺序都不能错;非法值(如 zh_china、Chinese、en_US)会被浏览器或读屏软件直接跳过,当成“未知语言”处理。
- 中文优先用
zh-CN:兼容性最稳,拼音、声调、标点排版、字体回退全支持;zh-Hans未绑定地域,旧版 Safari 可能匹配不准;zh过于宽泛,iOS VoiceOver 可能 fallback 到英文 TTS - 英文必须用
en-US或en-GB:不能用english(非标准)、en_US(下划线非法)、EN-us(大小写错位) - 法语、葡萄牙语等小语种对大小写敏感:
fr-FR合法,FR-fr不合法 -
lang=""比不写还糟:明确告诉辅助工具“语言未知”,可能导致整页按英文规则朗读中文多音字
多语言混排时 lang 怎么真正起作用
主语言靠 确立,但嵌入的外文内容必须显式标注子元素的 lang,否则读屏仍用中文规则硬读,比如把 “API” 读成“阿皮”。
- 单个术语:
<span lang="en">API</span> - 整段英文:
<p lang="en">This is a code example.</p> - 代码注释:
<pre class="brush:php;toolbar:false;" lang="en"># Initialize counter</pre>(注意不是lang="bash") - 引文类语义更可靠:
<blockquote lang="fr">…</blockquote>、<q lang="ja">…</q> - 避免滥用:
<div lang="en"> 包裹多个段落 —— 语义不清,干扰父级 <code>:lang(zh)CSS 匹配最容易被忽略的是:动态渲染页面(如 React SSR、Next.js)必须在首屏 HTML 字符串中就写出正确的
;服务端没写,客户端 JS 补救不了——语音、翻译、SEO 全失效。











