diff --git a/src/entrypoints/background.ts b/src/entrypoints/background.ts index d1b177b..90f0771 100644 --- a/src/entrypoints/background.ts +++ b/src/entrypoints/background.ts @@ -65,8 +65,8 @@ export default defineBackground(() => { const tabId = sender?.tab?.id; if (!tabId) { - console.warn('[RightClickRestorer] Injection request missing tabId'); - return { success: false, message: 'Missing tabId' }; + console.warn('[RightClickRestorer] 注入请求缺少 tabId'); + return { success: false, message: '缺少 tabId' }; } try { @@ -79,7 +79,7 @@ export default defineBackground(() => { return { success: true }; } catch (err) { const errorMsg = err instanceof Error ? err.message : String(err); - console.error('[RightClickRestorer] executeScript failed:', errorMsg); + console.error('[RightClickRestorer] 执行脚本失败:', errorMsg); return { success: false, message: errorMsg }; } }); diff --git a/src/entrypoints/content/uiPopover.ts b/src/entrypoints/content/uiPopover.ts index faf985e..e9a514c 100644 --- a/src/entrypoints/content/uiPopover.ts +++ b/src/entrypoints/content/uiPopover.ts @@ -137,12 +137,11 @@ function escapeHtml(text: string): string { } function positionPopover(popover: HTMLElement, x: number, y: number): void { - // 此时借助 visibility: hidden,元素在隐藏状态下拥有真实的布局高宽 const rect = popover.getBoundingClientRect(); const viewportWidth = window.innerWidth; const viewportHeight = window.innerHeight; - let left = x + 8; // 微微追加水平偏置,防范直接遮挡用户的鼠标落点 + let left = x + 8; let top = y + 8; if (left + rect.width > viewportWidth - 16) { @@ -178,7 +177,7 @@ function showPopover( const titleSpan = document.createElement('span'); titleSpan.className = 'popover-title'; - titleSpan.textContent = title; // ✅ 强安全性护航 + titleSpan.textContent = title; const closeBtn = document.createElement('button'); closeBtn.className = 'popover-close'; @@ -194,10 +193,9 @@ function showPopover( const contentContainer = document.createElement('div'); contentContainer.className = 'popover-content'; - contentContainer.innerHTML = contentHtml; // 内部拼装的方法已提前完成全消毒转义 + contentContainer.innerHTML = contentHtml; popover.appendChild(contentContainer); - // 提前移除激活类名,使 visibility: hidden 起效以供测量 popover.classList.remove('visible'); requestAnimationFrame(() => { @@ -226,7 +224,6 @@ export function hidePopover(): void { } export function showTimestampResult(x: number, y: number, timestamp: string, result: string): void { - // 对外部传来的参数先全数塞入 escapeHtml 大闸进行纯氧化清洗 const cleanTimestamp = escapeHtml(timestamp); const cleanResult = escapeHtml(result); @@ -236,7 +233,7 @@ export function showTimestampResult(x: number, y: number, timestamp: string, res
转换结果
${cleanResult}
`; - showPopover(x, y, content, '⏰ 时间戳转换'); + showPopover(x, y, content, '转换结果'); } export function showTextStatsResult( @@ -246,7 +243,6 @@ export function showTextStatsResult( stats: { characters: number; words: number; lines: number; bytes: number }, ): void { const truncatedText = text.length > 50 ? text.substring(0, 50) + '...' : text; - // 对选中的脏文本先进行严格转义 const cleanText = escapeHtml(truncatedText); const content = ` @@ -271,5 +267,5 @@ export function showTextStatsResult( `; - showPopover(x, y, content, '📊 文本统计'); + showPopover(x, y, content, '统计结果'); } diff --git a/src/pages/Base64Converter/components/Base64ConverterSection.tsx b/src/pages/Base64Converter/components/Base64ConverterSection.tsx index 10c7088..75d19e4 100644 --- a/src/pages/Base64Converter/components/Base64ConverterSection.tsx +++ b/src/pages/Base64Converter/components/Base64ConverterSection.tsx @@ -41,6 +41,7 @@ export default function Base64ConverterSection({ mode }: Base64ConverterSectionP setCustomFileName, resetAll, safeFileSelect, + maxFileSizeStr, } = useBase64Converter({ mode }); const handleDirectionChange = (next: Base64ConvertDirection) => { @@ -136,7 +137,7 @@ export default function Base64ConverterSection({ mode }: Base64ConverterSectionP {mode === 'image' ? '点击或拖拽图像到此处' : '点击或拖拽文件到此处'} - {'最大文件大小:{{max}}'} + {`最大文件大小:${maxFileSizeStr}`} {mode === 'image' && ( diff --git a/src/pages/Base64Converter/components/DecodeResultPaper.tsx b/src/pages/Base64Converter/components/DecodeResultPaper.tsx index dc9ebb2..0abfeb3 100644 --- a/src/pages/Base64Converter/components/DecodeResultPaper.tsx +++ b/src/pages/Base64Converter/components/DecodeResultPaper.tsx @@ -14,7 +14,7 @@ import { Label } from '@/components/ui/label'; import { formatBytes } from '@/utils/format'; interface DecodeResultPaperProps { - /** 标题文案,由调用方传入 i18n key 对应的值(如 decodedFileOutput / decodedImageOutput) */ + /** 标题文案 */ title: string; /** 解码后推断的 MIME 类型 */ mimeType: string; diff --git a/src/pages/TestDataGenerator/components/GenerateButton.tsx b/src/pages/TestDataGenerator/components/GenerateButton.tsx index 0b577fc..14b0e06 100644 --- a/src/pages/TestDataGenerator/components/GenerateButton.tsx +++ b/src/pages/TestDataGenerator/components/GenerateButton.tsx @@ -35,7 +35,7 @@ export default function GenerateButton({ {progress && (
- {'已生成 {{current}} / {{total}} 条'} + {`已生成 ${progress.generated} / ${progress.total} 条`} {progress.progress}%
@@ -46,7 +46,7 @@ export default function GenerateButton({
{progress.estimatedTimeLeft !== undefined && (

- {'预计剩余 {{time}} 秒'} + {`预计剩余 ${progress.estimatedTimeLeft} 秒`}

)}
diff --git a/src/utils/base64Converter.ts b/src/utils/base64Converter.ts index ce95bc5..a4ae322 100644 --- a/src/utils/base64Converter.ts +++ b/src/utils/base64Converter.ts @@ -165,12 +165,12 @@ export function isSupportedImageExtension(fileName: string): boolean { export function fileToBase64(file: File): Promise { return new Promise((resolve, reject) => { if (!file) { - reject(new Error('No file provided')); + reject(new Error('未提供文件')); return; } if (!isFileSizeValid(file.size)) { - reject(new Error(`File size exceeds the limit (${MAX_FILE_SIZE / 1024 / 1024} MB)`)); + reject(new Error(`文件大小超出限制(最大 ${MAX_FILE_SIZE / 1024 / 1024} MB)`)); return; } @@ -192,7 +192,7 @@ export function fileToBase64(file: File): Promise { }; reader.onerror = () => { - reject(new Error('Failed to read file')); + reject(new Error('读取文件失败')); }; reader.readAsDataURL(file); @@ -296,7 +296,7 @@ export function base64ToBlob(input: string): Base64ToBlobResult { const cleaned = prefixMatch ? trimmed.slice(prefixMatch[0].length) : trimmed; if (!isValidBase64(cleaned)) { - throw new Error('Invalid Base64 string'); + throw new Error('无效的 Base64 字符串'); } const bytes = base64ToBytes(cleaned);