自訂 DOM 規則
配置自訂 DOM 規則以控制特定網站的翻譯行為
概述
Read Frog 讓你定義自訂 DOM 規則來控制特定網站上元素的翻譯方式。這些規則在 dom-rules.ts 中定義,支持兩種主要行為:
- 強制元素不翻譯 - 跳過特定元素的翻譯
- 強制區塊級翻譯 - 讓內嵌元素以區塊級元素的方式翻譯(帶換行)
設定檔位置
自訂規則定義在 extension 仓库:
src/utils/constants/dom-rules.ts可用規則類型
1. 自訂不遍歷元素選擇器
使用 CUSTOM_DONT_WALK_INTO_ELEMENT_SELECTOR_MAP 來阻止特定網域上某些元素的翻譯。
語法:
export const CUSTOM_DONT_WALK_INTO_ELEMENT_SELECTOR_MAP: Record<string, string[]> = {
'example.com': [
'.selector-1',
'#element-id',
'custom-element > *',
],
}範例:
export const CUSTOM_DONT_WALK_INTO_ELEMENT_SELECTOR_MAP: Record<string, string[]> = {
'chatgpt.com': [
'.ProseMirror',
],
'arxiv.org': [
'.ltx_listing',
],
'www.reddit.com': [
'faceplate-screen-reader-content > *',
'reddit-header-large *',
'shreddit-comment-action-row > *',
],
'www.youtube.com': [
'#masthead-container *',
'#guide-inner-content *',
'#metadata *',
'#channel-name',
'.translate-button',
'.yt-lockup-metadata-view-model__metadata',
'.yt-spec-avatar-shape__badge-text',
'.shortsLockupViewModelHostOutsideMetadataSubhead',
'ytd-comments-header-renderer',
'#top-row',
'#header-author',
'#reply-button-end',
'#more-replies',
'#info',
'#badges *',
],
}使用場景:
- 跳過導覽選單和頁頭
- 排除互動式 UI 元素
- 防止翻譯程式碼編輯器或技術內容
- 避免翻譯元資料部分
2. 自訂強制區塊級翻譯選擇器
使用 CUSTOM_FORCE_BLOCK_TRANSLATION_SELECTOR_MAP 強制內嵌元素以區塊級元素的方式翻譯(帶換行)。
語法:
export const CUSTOM_FORCE_BLOCK_TRANSLATION_SELECTOR_MAP: Record<string, string[]> = {
'example.com': [
'.force-block-selector',
],
}範例:
export const CUSTOM_FORCE_BLOCK_TRANSLATION_SELECTOR_MAP: Record<string, string[]> = {
'github.com': [
'.react-directory-row-commit-cell *',
],
}使用場景:
- 強制提交資訊顯示在單獨的行上
- 確保列表項目單獨翻譯
- 透過分割密集的內嵌內容來提高可讀性
如何新增自訂規則
步驟 1: 確定網站域名
使用瀏覽器網址列中顯示的準確網域:
- 對於
https://example.com使用'example.com' - 對於
https://www.example.com使用'www.example.com'
步驟 2: 尋找元素選擇器
使用瀏覽器開發者工具尋找 CSS 選擇器:
- 打開網站
- 右鍵點選要定位的元素
- 選擇"檢查"或"檢查元素"
- 在開發者工具中右鍵點選 HTML 元素
- 複製選擇器(CSS Selector 或建立自己的選擇器)
步驟 3: 新增規則到配置
開啟 dom-rules.ts 並加入你的規則:
export const CUSTOM_DONT_WALK_INTO_ELEMENT_SELECTOR_MAP: Record<string, string[]> = {
// ... 现有规则 ...
'your-website.com': [
'.header-navigation',
'#sidebar-menu',
'.code-block',
],
}步驟 4: 測試你的規則
-
運行開發伺服器:
pnpm dev -
導航到網站
-
驗證元素是否正確處理
-
根據需要調整選擇器
最佳實踐
選擇器特異性
- 足夠具體 以僅定位預期的元素
- 避免過於寬泛的選擇器 如單獨的
*或div - 使用類別名稱、ID 或元素組合
性能考慮
- 保持選擇器數量合理
- 在實際頁面上測試以確保效能可接受
- 當簡單選擇器可以工作時,避免複雜的後代選擇器
可維護性
- 將相關選擇器分組在一起
- 加入註解解釋為什麼需要這些規則
- 盡可能使用有意義的選擇器名稱
常見模式
排除導航元素
'example.com': [
'nav *',
'header *',
'.navigation',
]排除互動式 UI
'example.com': [
'button',
'input',
'select',
'.modal',
'.dropdown',
]排除技術內容
'example.com': [
'pre',
'code',
'.code-block',
'.terminal',
]全域 DOM 規則
除了自訂規則外,Read Frog 還有幾個適用於所有網站的全域規則:
強制區塊級標籤
始終被視為區塊級元素的標籤:
export const FORCE_BLOCK_TAGS = new Set([
'BODY',
'H1',
'H2',
'H3',
'H4',
'H5',
'H6',
'BR',
'FORM',
'SELECT',
'BUTTON',
'LABEL',
'UL',
'OL',
'LI',
'BLOCKQUOTE',
'PRE',
'ARTICLE',
'SECTION',
'FIGURE',
'FIGCAPTION',
'HEADER',
'FOOTER',
'MAIN',
'NAV',
])不遍歷和翻譯的標籤
永遠不會被遍歷進行翻譯的元素:
export const DONT_WALK_AND_TRANSLATE_TAGS = new Set([
'HEAD',
'TITLE',
'HR',
'INPUT',
'TEXTAREA',
'IMG',
'VIDEO',
'AUDIO',
'CANVAS',
'SOURCE',
'TRACK',
'META',
'SCRIPT',
'NOSCRIPT',
'STYLE',
'LINK',
'PRE',
'svg',
...MATH_TAGS,
])故障排除
規則不起作用
- 檢查域名拼字 - 確保域名完全匹配
- 驗證選擇器語法 - 在瀏覽器開發者工具控制台中測試選擇器
- 清除快取 - 重新載入擴充功能並重新整理頁面
- 檢查選擇器特異性 - 元素可能被更具體的規則匹配
元素仍在翻譯
- 檢查元素是否為被排除元素的子元素
- 驗證選擇器是否定位到正確的元素
- 尋找頁面載入後動態載入的元素
翻譯破壞頁面佈局
- 謹慎使用強制塊級規則
- 在同一網站的多個頁面上測試
- 考慮使用
!translate規則而不是強制區塊級
貢獻自訂規則
如果你創建了對其他人有益的規則,請考慮貢獻它們:
- 在多個頁面上徹底測試
- 記錄為什麼需要這些規則
- 提交包含你的變更的 Pull Request
- 遵循贡献指南
查看代码贡献指南以了解提交更改的更多詳細資訊。
