Skip to content

feat: 支持 Web Component Shadow DOM 内容翻译#101

Open
cpxGithub wants to merge 1 commit intoxnx3:masterfrom
cpxGithub:feature/web-component-shadow-dom-support
Open

feat: 支持 Web Component Shadow DOM 内容翻译#101
cpxGithub wants to merge 1 commit intoxnx3:masterfrom
cpxGithub:feature/web-component-shadow-dom-support

Conversation

@cpxGithub
Copy link
Copy Markdown

问题描述

translate.js 目前无法翻译 Web Component 内部通过 attachShadow() 创建的 Shadow DOM 内容。原因在于:

  • DOM 遍历使用 node.childNodes,无法穿透 Shadow DOM 边界
  • MutationObserver 仅观察 Light DOM,Shadow DOM 内的动态变化无法被捕获

改动内容

新增 translate.element.shadowComponent 模块,共 4 处最小改动(56 行新增,不改动任何现有逻辑):

  1. 新增 shadowComponent 模块:基于 WeakSet 实现防重复注册,observe() 将 shadowRoot 纳入现有 MutationObserver,scanAndObserve() 递归扫描嵌套 shadow host
  2. whileNodes 穿透 shadowRoot:每次翻译扫描时自动进入 shadow DOM,天然支持任意嵌套深度
  3. listener.callback 检测动态新增的 shadow host:Web Component 动态挂载时立即注册监听
  4. addListener 启动时扫描全页已有 shadow host:弥补 listener 启动晚于组件挂载的时序差

覆盖场景

场景 支持情况
初始翻译时已存在的 shadow DOM 内容
shadow DOM 内部动态渲染
Web Component 动态挂载后翻译
嵌套 Web Component(任意深度)
closed 模式 shadow root ✅ 静默跳过,无副作用
Slot 内容(Light DOM) ✅ 现有逻辑已覆盖

性能

  • WeakSet.has() O(1) 判重,shadow host 移除后自动 GC
  • node.shadowRoot 属性读取 O(1),每次 whileNodes 一次
  • scanAndObserve() 仅在 listener 启动时执行一次

新增 translate.element.shadowComponent 模块,通过四处最小改动实现
Shadow DOM 穿透能力,不改动任何现有逻辑:

1. 新增 shadowComponent 模块(WeakSet 防重复 + observe/scanAndObserve 方法)
2. whileNodes 中穿透 shadowRoot,天然支持任意嵌套深度
3. listener.callback 检测动态新增的 shadow host 并注册监听
4. addListener 启动时一次性扫描全页已有 shadow host

覆盖场景:初始翻译、动态渲染、动态挂载、嵌套 Web Component、closed shadow root 静默跳过
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant