lang属性必须写在标签上才生效,是页面语言声明的唯一有效位置;写在、等其他元素上对屏幕阅读器、翻译按钮、seo均无效,且双语混排时需为非主语言内容显式标注lang。

lang属性必须写在html>根标签上才能生效
页面语言声明不是可选装饰,lang只在标签上起作用。写在、<div>甚至<code><p></p>里,对屏幕阅读器、翻译按钮、SEO 都无效——它们只认这一处。
双语并列时,主语言靠这个根声明定调。比如中英混排页面,应设,表示“整页以简体中文为主”,后续所有英文片段才需要显式标注为例外。
- 错:
→ 读屏软件忽略,Google 翻译按钮不出现 - 错:
<div lang="en">API</div>→ 仅影响断词,不触发英文语音引擎 - 对:
+<span lang="en">API</span>
双语并列词组要用嵌套lang,不能只靠父级
像「排序/sort」这种写法,如果只给外层<p></p>设lang="zh-CN",翻译插件仍可能把sort当成待译内容,尤其当页面的lang被误设为en时。
必须让每个语言单元自我声明:中文部分靠根lang兜底,英文部分用内联lang="en"显式覆盖。
- 错:
<p lang="zh-CN">排序/sort</p>→sort无语言标记,插件自由发挥 - 对:
<p lang="zh-CN">排序<span lang="en">/sort</span></p> - 更稳:
<p lang="zh-CN">排序<code lang="en">sort(<code>本身语义更强,多数插件默认跳过翻译)
mark标签高亮重点时必须加translate="no"
<mark></mark>本身不带语言信息,但常被用于包裹代码复杂度、术语对照等关键内容。翻译插件看到<mark>O(n²)</mark>,可能把它当普通文本翻成“欧恩平方”,彻底失真。
唯一可靠做法是直接在<mark></mark>上加translate="no",而不是指望父级lang或全局设置。
- 错:
<p lang="zh-CN"><mark>O(n²)</mark></p>→ 插件照翻 - 对:
<p lang="zh-CN"><mark translate="no">O(n²)</mark></p> - 注意:
translate="no"必须写在<mark></mark>自身,写在<p></p>上无效;旧版插件可能忽略,但 Chrome 官方翻译、DeepL 扩展均支持
动态插入双语内容时lang属性不能靠JS补
SPA 或通过innerHTML、textContent插入的句子,如果没在 HTML 字符串里自带lang,JS 后期用el.lang = "en"或el.setAttribute("lang", "en")补,对屏幕阅读器和翻译工具基本无效——它们只在初始 HTML 解析阶段读取语言信息。
真正有效的做法,是在生成 HTML 字符串时就写死lang属性。
- 错:
el.innerHTML = "API"; el.lang = "en";→ 语音引擎已加载完毕,不重读 - 对:
el.innerHTML = '<span lang="en">API</span>'; - 更安全:
el.innerHTML = '<code lang="en">API';(双重保障:语义+不可译)
最容易被忽略的是:双语混排不是“写了lang就完事”,而是每一处非主语言内容都得主动声明——哪怕只是单个英文缩写。漏掉一个lang="en",就可能让屏幕阅读器把“URL”读成“优儿艾尔”,或者让翻译插件把“HTTP 状态码”翻成“超文本传输协议状态码”,反而更难懂。











