diff --git a/src/components/MarkdownRenderer.tsx b/src/components/MarkdownRenderer.tsx index 4ea5ff0..5ec1e27 100644 --- a/src/components/MarkdownRenderer.tsx +++ b/src/components/MarkdownRenderer.tsx @@ -549,7 +549,7 @@ const MarkdownImage: React.FC<{ src?: string; alt?: string; baseUrl?: string }> {!isLoading && !hasError && ( -
+
{isInsideLink ? (language === 'zh' ? '单击放大 · Ctrl+点击打开链接' : 'Click to zoom · Ctrl+Click to open link') @@ -567,6 +567,7 @@ const MarkdownImage: React.FC<{ src?: string; alt?: string; baseUrl?: string }> {!isLoading && !hasError && isInsideLink && parentLinkHref && (
{ e.stopPropagation(); diff --git a/src/utils/domTextScanner.ts b/src/utils/domTextScanner.ts index 3217d66..a12a6dd 100644 --- a/src/utils/domTextScanner.ts +++ b/src/utils/domTextScanner.ts @@ -56,6 +56,10 @@ function extractTextPreservingInlineCode(element: HTMLElement): ExtractedText { return; } + if (el.hasAttribute('data-translate') && el.getAttribute('data-translate') === 'false') { + return; + } + if (tag === 'code' && !el.closest('pre')) { hasInlineCode = true; result += `${escapeHtml(el.textContent || '')}`; @@ -135,6 +139,7 @@ export function wrapTextNodesWithAttr(element: HTMLElement, attr: string, value: const parent = node.parentElement; if (!parent) continue; if (parent.tagName === 'CODE' || parent.tagName === 'PRE' || parent.closest('pre')) continue; + if (parent.closest('[data-translate="false"]')) continue; if (!node.textContent?.trim()) continue; replacements.push({ textNode: node as Text, parent }); }