Files
trade-assistant/browser-extension/background/background.js
T

62 lines
1.7 KiB
JavaScript

/**
* TradeMate Background Service Worker
* Handles context menus and clipboard operations.
*/
import { translate } from '../api/client.js';
chrome.runtime.onInstalled.addListener(() => {
chrome.contextMenus.create({
id: 'translate-selection',
title: 'TradeMate 翻译选中文本',
contexts: ['selection'],
});
});
chrome.contextMenus.onClicked.addListener(async (info, tab) => {
if (info.menuItemId === 'translate-selection') {
const selectedText = info.selectionText.trim();
if (!selectedText) return;
try {
const result = await translate(selectedText, 'zh');
const translated = result.translated_text || '翻译失败';
// Try to send to content script for display
if (tab?.id) {
chrome.tabs.sendMessage(tab.id, {
action: 'showTranslation',
original: selectedText,
translated,
}).catch(() => {
// Fallback: show in notification
notifyResult(translated);
});
} else {
notifyResult(translated);
}
} catch (err) {
notifyResult(`错误: ${err.message}`);
}
}
});
function notifyResult(text) {
chrome.notifications.create({
type: 'basic',
iconUrl: 'icons/icon48.png',
title: 'TradeMate 翻译',
message: text.slice(0, 200),
});
}
// Listen for popup API calls that need background processing
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.action === 'translateContext') {
translate(request.text, request.targetLang)
.then(result => sendResponse({ ok: true, data: result }))
.catch(err => sendResponse({ ok: false, error: err.message }));
return true; // Keep channel open for async response
}
});