Files
PopLingo/popup/popup.js
T
zzzjy eb00b23de8 Initial commit: 译泡 PopLingo v1.0.0
AI 划词翻译 Chrome 扩展(Manifest V3):
- 支持 DeepSeek/OpenAI/Kimi/智谱/通义/Gemini/Claude/Ollama 等 10 种服务商
- 流式输出、左右分栏对照、原文一键展开收起
- 划词图标/自动翻译/Alt+T 快捷键/右键菜单四种触发方式
2026-09-17 00:43:32 +08:00

49 lines
2.0 KiB
JavaScript

/* global chrome */
const LANGS = ['简体中文', '繁體中文', 'English', '日本語', '한국어', 'Français', 'Deutsch', 'Español', 'Português', 'Italiano', 'Русский', 'العربية', 'हिन्दी', 'ไทย', 'Việt Nam', 'Indonesia'];
const PRESETS = {
deepseek: 'DeepSeek', openai: 'OpenAI', kimi: '月之暗面 Kimi', zhipu: '智谱 GLM',
qwen: '通义千问', siliconflow: '硅基流动', gemini: 'Google Gemini',
anthropic: 'Anthropic Claude', ollama: 'Ollama(本地)', custom: '自定义(OpenAI 兼容)'
};
const $ = id => document.getElementById(id);
async function init() {
const cfg = await chrome.storage.sync.get({
enabled: true, preset: 'deepseek', model: '', apiKey: '',
targetLang: '简体中文', triggerMode: 'icon'
});
const langSel = $('targetLang');
LANGS.forEach(l => {
const o = document.createElement('option');
o.value = l; o.textContent = l;
langSel.appendChild(o);
});
langSel.value = cfg.targetLang;
$('triggerMode').value = cfg.triggerMode;
$('enabledToggle').checked = cfg.enabled;
updateStatus(cfg.enabled);
$('providerName').textContent = PRESETS[cfg.preset] || cfg.preset;
$('modelName').textContent = cfg.model || '(未设置)';
$('keyStatus').textContent = cfg.apiKey ? '已配置' : '未配置';
$('keyStatus').className = 'value ' + (cfg.apiKey ? 'ok' : 'warn');
$('enabledToggle').addEventListener('change', e => {
chrome.storage.sync.set({ enabled: e.target.checked });
updateStatus(e.target.checked);
});
langSel.addEventListener('change', () => chrome.storage.sync.set({ targetLang: langSel.value }));
$('triggerMode').addEventListener('change', () => chrome.storage.sync.set({ triggerMode: $('triggerMode').value }));
$('openOptions').addEventListener('click', () => chrome.runtime.openOptionsPage());
}
function updateStatus(on) {
$('statusText').textContent = on ? 'AI 划词翻译 · 已开启' : 'AI 划词翻译 · 已停用';
}
init();