fix(assistant): 拦截本地文件路径粘贴/拖拽,清洗消息中的本地路径引用 (#226)

用户将 C:\...\image.png 等本地路径粘贴到晴辰助手输入框,消息发送到
OpenAI 兼容 API 时触发 "Only base64, http or https URLs are supported"
错误;由于历史上下文包含坏消息,后续对话会继续报错形成循环。

三处修复:
1. paste 事件:如果剪贴板是纯文本且为本地路径(Windows/Unix/file://),
   阻止默认粘贴并 toast 提示用户
2. drop 事件:若拖入的是路径文本(无 files),同样拦截并提示
3. buildMessageContent:调用 sanitizeUserTextForApi,把
   ![alt](C:\...) 这类 markdown 图片替换为占位文本 "[本地文件(已忽略)]",
   让已经输入路径的老会话也能自愈,不再循环报错

路径识别支持:
- Windows 绝对路径(C:\... / D:/...)
- macOS/Linux 常见路径前缀(/Users /home /mnt /media /opt /tmp /var /root)
- file:// URL

翻译覆盖 11 种语言(zh-CN/zh-TW/en/ja/ko/vi/es/pt/ru/fr/de)。

Refs: #226
This commit is contained in:
晴天
2026-04-20 03:07:24 +08:00
parent 97e2fb507b
commit 3a4566d26a
2 changed files with 59 additions and 4 deletions

View File

@@ -67,6 +67,20 @@ export default {
imageTooLarge: _('图片太大,请选择小于 10MB 的图片', 'Image too large, please select one under 10MB', '圖片太大,請選擇小於 10MB 的圖片'),
imageMessage: _('(图片消息)', '(image message)', '(圖片訊息)'),
image: _('图片', 'Image', '圖片'),
localPathBlocked: _(
'请直接粘贴或拖拽图片本身,而不是本地文件路径',
'Please paste or drag the image itself, not a local file path',
'請直接貼上或拖曳圖片本身,而不是本地檔案路徑',
'画像自体を貼り付けるかドラッグしてください(ローカルパスは不可)',
'이미지 자체를 붙여넣거나 드래그하세요 (로컬 경로 불가)',
'Vui lòng dán hoặc kéo hình ảnh, không phải đường dẫn tệp cục bộ',
'Pegue o arrastre la imagen en sí, no una ruta de archivo local',
'Cole ou arraste a imagem em si, não um caminho de arquivo local',
'Пожалуйста, вставьте или перетащите само изображение, а не локальный путь',
'Veuillez coller ou faire glisser l\'image elle-même, pas un chemin local',
'Bitte fügen Sie das Bild selbst ein oder ziehen Sie es, keinen lokalen Pfad',
),
localPathSanitized: _('[本地文件(已忽略,请直接上传图片)]', '[local file (ignored — please upload the image)]', '[本地檔案(已忽略,請直接上傳圖片)]'),
newSession: _('新建会话', 'New Session', '新建對話', '新しいセッション', '새 세션', 'Phiên mới', 'Nueva sesión', 'Nova sessão', 'Новая сессия', 'Nouvelle session', 'Neue Sitzung'),
deleteSession: _('删除会话', 'Delete Session', '刪除對話', 'セッション削除', '세션 삭제', 'Xóa phiên', 'Eliminar sesión', 'Excluir sessão', 'Удалить сессию', 'Supprimer la session', 'Sitzung löschen'),
noSessions: _('暂无会话', 'No sessions', '暫無對話', 'セッションなし', '세션 없음', 'Không có phiên', 'Sin sesiones', 'Sem sessões', 'Нет сессий', 'Aucune session', 'Keine Sitzungen'),