lang值错误(如缺失区域码或与页面语言矛盾)会导致浏览器判定语言不可信,从而忽略translate="no";必须符合bcp 47标准(如zh-cn、en-us),且lang与translate="no"须显式共存于同一元素,初始html中声明才生效。

lang 属性本身不优化翻译质量,它只告诉浏览器“这是什么语言”;真正控制是否翻译、防误译的,是 translate 属性——但 lang 必须配对正确,translate="no" 才能生效。
为什么 lang 写错会导致 translate="no" 失效
Chrome 等浏览器会校验 lang 值的可信度:如果页面整体是中文,但 ,或只写 lang="zh"(缺区域码),浏览器会判定语言声明不可信,直接忽略子元素上的 translate="no"。
- 必须符合 BCP 47 标准,比如中文页用
lang="zh-CN"或lang="zh-Hans",英文页用lang="en-US" -
是整页禁译最稳写法,但仅限初始 HTML 中声明;JS 后续改document.documentElement.lang无效 - 第三方组件(如 Ant Design)渲染出的 DOM 可能自带
lang,覆盖前务必 inspect 实际输出,不能只看模板源码
哪些地方必须同时写 lang 和 translate="no"
不是所有英文都该锁死。真正需要保护的是大小写、符号、顺序一变就失效的内容,且必须显式声明语言归属 + 禁译指令:
-
<div lang="en" translate="no">fetch()</div>—— 函数名被译成“获取()”就彻底失效 -
<code lang="en" translate="no">npm install -D vite—— 命令行一旦被拆解翻译,无法执行 -
<time datetime="2024-06-15" lang="en" translate="no">2024/06/15</time>—— 外层加translate="no"防止被转成本地格式干扰机器解析 -
<input value="API_KEY" lang="en" translate="no">——value不继承父级设置,必须单独加
lang 和 translate 的常见误用组合
这两个属性职责分离,但常被混用或漏配:
-
<div lang="en">React</div>→ Chrome 仍可能翻成“反应”,因为没下禁译指令 -
<div translate="no">React</div>→ 若页面lang缺失或矛盾,Chrome 可能降级处理,照样翻 -
但没写lang→ 属性形同虚设,Chrome 不认 -
translate="false"、translate=""、translate="off"→ 全无效,必须字面值写成translate="no"
动态内容怎么补 lang 和 translate="no"
Chrome 只在初始 HTML 解析时读取这两个属性,JS 动态插入的内容完全不继承:
- 用
innerHTML插入代码块时,比如<pre class="brush:php;toolbar:false;"><code>v5.2.0</code></pre>,即使外层有translate="no",新节点仍会被提取翻译 - 动态创建元素必须手动设置:
const el = document.createElement("code"); el.setAttribute("lang", "en"); el.setAttribute("translate", "no"); el.textContent = "useState"; -
<textarea></textarea>的内容若由 JS 赋值(如el.value = "/api/v1/users/:id"),得同步调用el.setAttribute("translate", "no")
最容易被忽略的,是动态节点和第三方组件输出的实际 DOM 结构——它们可能自带 lang 或 translate,覆盖前不 inspect 就等于白配。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











