lang属性必须写在标签上,其他位置无效;浏览器、屏幕阅读器和chrome翻译按钮仅在解析html最早阶段读取该声明,写在、或js动态设置均无效。

lang属性必须写在html>标签上,其他位置无效
浏览器、屏幕阅读器(如 NVDA、VoiceOver)和 Chrome 翻译按钮只在解析 HTML 最早阶段读取 这个声明。写在 、<div> 或用 JS 动态设置(比如 <code>document.documentElement.lang = "en-US"),都晚于这个时机,等于没设。
常见错误包括:
-
:只影响 CSS 的:lang()匹配和局部断词,不改变页面级语言 -
<meta http-equiv="Content-Language" content="en-US">:HTML5 已废弃,所有现代浏览器和辅助技术完全忽略 -
或:非法值,会被静默降级为“未知语言”
en-US 和 en-GB 怎么选,能不能只写 en
优先用 en-US 或 en-GB,不要用 en 这种模糊值。BCP 47 规范要求子标签区分大小写、用连字符连接,且地区码影响实际行为:
-
en-US:触发美式拼写检查、美式语音合成(如 “color” 不读成 “colour”)、Chrome 翻译按钮默认显示“翻译为中文” -
en-GB:影响标点渲染(如引号方向)、词典匹配(如 “favour” 正确切分),部分旧版读屏对enfallback 到美式发音 -
en:不被推荐,某些搜索引擎会弱化语言信号,导致多语言混排时英文段落被误判为未标注语言
中英文混排时,局部 lang 怎么加才有效
主语言设为 en-US 后,中文内容必须显式标注在对应元素上,不能靠继承。浏览器和读屏软件不会从 或父容器“猜”子内容语言。
- ✅ 正确:
<p lang="zh-CN">这是中文段落</p>——<p></p>支持lang,语义明确 - ✅ 正确:
<td lang="ja">東京</td>—— 表格单元格必须直接加lang,<table lang="en-US"> 对它无效 <li>❌ 无效:<code><div lang="zh-CN"><p>这是中文段落</p></div>——<div> 没有语言语义,读屏只认 <code><p></p>自身是否带lang - ❌ 无效:
<p><span lang="zh-CN">中文</span></p>——<span></span>虽支持lang,但不如<p></p>或<blockquote></blockquote>这类语义块级元素稳定,部分旧读屏可能忽略 - 屏幕阅读器启动时已锁定语音库,改了
lang也不会切换发音引擎 - Chrome 翻译按钮在 DOM 加载完成前就判断是否显示,JS 设置太晚
- SEO 抓取器只读初始 HTML 字符串,不执行 JS
动态页面怎么确保 lang 生效
服务端渲染或静态生成的 HTML 必须在首屏响应中就包含正确的 。JS 后期修改会失败,因为:
如果你用 React/Vue,别在 useEffect 或 mounted 里改 document.documentElement.lang;应该在 SSR 阶段或 HTML 模板里硬编码。单页应用若需多语言切换,得整页 reload 或用 外部模板控制。
最易被忽略的一点:lang 值一旦写错(比如大小写错位、用了下划线、漏了连字符),浏览器不会报错,而是静默失效——你得手动检查源码,不能只信 DevTools 里看到的 DOM 属性值。











