贡献代码
自定义 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
- 遵循贡献指南
查看代码贡献指南了解提交更改的更多详细信息。