translate="no"仅提示浏览器跳过翻译,不能实现自动翻译;它必须写为字面值"no",需配合可信lang值,且动态插入元素、input/textarea的value须手动添加该属性。

translate 属性不能实现自动翻译,它只是告诉浏览器“这段文本别动”,仅影响 Chrome、Edge 等内置翻译功能的文本提取行为;真要自动翻译,得靠 translate.js 这类运行时框架驱动文案替换。
为什么加了 translate="no" 还被翻译?
不是属性没生效,而是 Chrome 只在初始 HTML 解析阶段读取它,且依赖三个硬性前提:
-
translate="no"必须写成字面值,translate="false"或translate=""都无效 - 若设在
上,必须配合可信的lang值(如lang="zh-CN"),只写lang="zh"会被忽略 - 动态插入的节点(如用
innerHTML或appendChild()添加)不会继承父级translate状态,必须手动补上
<input> 和 <textarea></textarea> 的 value 为什么总被误译?
它们的 value 属性不继承父元素的 translate 设置——这是明确例外。哪怕整个表单都套了 translate="no",<input value="v5.2.0"> 仍可能被翻成“五点二零”。
- 必须为每个需要保护的
<input>或<textarea></textarea>单独加translate="no" - 若
value是 JS 动态赋值(如el.value = "XZ-3000"),得同步调用el.setAttribute("translate", "no") -
<select></select>的<option></option>文本受继承,但其value属性本身不参与翻译,无需额外处理
哪些内容必须加 translate="no",哪些纯属浪费?
不是所有英文都要锁死。真正该保护的是语义固定、大小写/符号敏感、机器可读优先于人类可读的内容:
- 代码标识符:
fetch()、useState、npm install -D vite - 版本号:
v5.2.0、React 18.3(数字和点不能变成“五点二零”) - 路径与 ID:
/api/v1/users/:id、abc123-token、XZ-3000 - 时间格式字符串(非渲染内容):
datetime="2024-06-15"外层建议套translate="no" - 用户生成的 token、密钥、base64 片段
按钮文字(Submit)、提示文案(Invalid email)、菜单项(Settings)本就该被翻译,加了反而导致中文化界面混入英文残留。
translate 和 lang 混用时最常踩的坑
lang 表示语言类型,translate 控制是否允许翻译,两者职责分离但必须协同生效:
-
<div lang="en">React</div>→ Chrome 仍可能把它译成“反应”,因为没禁译指令 - 正确写法是:
<div lang="en" translate="no">React</div> - 第三方组件库(如 Ant Design)输出的 DOM 可能自带
translate,覆盖前务必 inspect 实际渲染的 HTML,不能只看模板源码
真正容易被忽略的,是动态插入内容必须手动补 translate="no"——DOM 插入后不会自动继承,这点连很多资深前端都会漏掉。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











