改 document.documentelement.lang 无效,因为浏览器、屏幕阅读器等依赖各元素自身的 lang 属性而非继承值;必须遍历所有带 lang 属性的元素并逐一更新。

只改 document.documentElement.lang 为什么没用
因为浏览器、屏幕阅读器、字体回退链、标点渲染规则,全部依赖每个元素自身的 lang 属性,而不是继承值。改根节点只是“贴了个标签”,已渲染的 <p></p>、<label></label>、<blockquote></blockquote> 仍按旧 lang 解析。
常见错误现象:
• 中文页面切换英文后,<p lang="zh-Hans">欢迎</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5117" title="HTML Extract"><img
src="https://img.php.cn/upload/skill/000/000/081/179033952939354.jpg" alt="HTML Extract" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5117" title="HTML Extract" class="overflowclass">HTML Extract</a>
<p class="overflowclass">使用 MinerU 从 HTML 页面和文件中提取内容,将 HTML 转换为保持标题、列表、表格及文本层次结构的干净、结构化 Markdown。F...</p>
</div>
<a rel="nofollow" href="/xiazai/skill5117" title="HTML Extract" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div> 还读作“huānyíng”
• <pre class="brush:php;toolbar:false;" lang="bash">npm install</pre> 的等宽字体被中文字体覆盖
• 日文引文 <cite lang="ja">こんにちは</cite> 顿号间距异常
- 必须遍历所有带
lang属性的元素:document.querySelectorAll('[lang]') - 对每个匹配元素执行
el.lang = newLang,包括<input placeholder>外的语义标签 - 已有特殊语言内容(如
<code lang="sql">)保留原值,不参与主语言切换
data-i18n 标记漏翻译的真正原因
不是脚本没运行,而是 DOM 深度超 6 层时,多数 i18n 工具(含 node-static-i18n 和手写遍历逻辑)会主动截断或跳过内层节点——这是为防栈溢出或性能卡顿做的硬限制。
常见错误现象:
• document.querySelectorAll('[data-i18n]').length 返回数量明显少于预期
• SSR 首屏 HTML 中,data-i18n 出现在 <div><div><div><div><div><p data-i18n="tip"></p></div></div></div></div></div>,第 7 层失效
• 动态插入的弹窗、表格行、懒加载模块,内部 data-i18n 完全不生效
- 用浏览器 Elements 面板右键 → “Reveal in Elements panel”,手动数从
到目标节点的层级,确保 ≤6 - 把纯样式
<div> 替换为语义标签:<code><main></main>、<section></section>、@#@#@#@#@#@#@#@#@#@0”)要用 <code>innerHTML替换,且语言包中对应值必须是可信纯 HTML 片段,禁止拼接用户输入 实际项目里最常被忽略的,是 DOM 深度与lang属性同步这两件事——它们不会报错,但会让部分文字“静默失效”,直到用户投诉才暴露。










