UNPKG

mute-english-api

Version:

提供英语词典和百度翻译等API服务的npm包,支持多种翻译服务集成

168 lines (145 loc) 5.16 kB
/** * 百度翻译服务模块 * 提供文本翻译功能 */ import configManager from '../config/index.js'; import { MD5 } from '../utils/crypto.js'; /** * 百度翻译API函数 * @param {string} query - 需要翻译的文本,多个query可以用\n连接 * @param {string} from - 源语言,默认为'en' * @param {string} to - 目标语言,默认为'zh' * @returns {Promise<Object>} - 翻译结果 */ export async function translateText(query, from = 'en', to = 'zh') { try { // 参数验证 if (!query || typeof query !== 'string') { throw new Error('query参数不能为空且必须是字符串'); } if (!configManager.validateBaiduTranslateConfig()) { throw new Error('请先使用 setBaiduTranslateConfig() 设置百度翻译API的APPID和KEY,或通过环境变量 BAIDU_TRANSLATE_APPID 和 BAIDU_TRANSLATE_KEY 设置'); } const config = configManager.getBaiduTranslateConfig(); // 生成时间戳作为salt const salt = Date.now().toString(); // 生成签名 const str1 = config.appid + query + salt + config.key; const sign = MD5(str1); // 构建请求参数 const params = new URLSearchParams({ q: query, appid: config.appid, salt: salt, from: from, to: to, sign: sign }); // 发送请求 const response = await fetch(`${config.apiUrl}?${params}`, { method: 'GET', headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }); if (!response.ok) { throw new Error(`HTTP错误: ${response.status}`); } const result = await response.json(); // 检查API返回的错误 if (result.error_code) { throw new Error(`百度翻译API错误: ${result.error_code} - ${result.error_msg}`); } return { success: true, data: result, translated: result.trans_result?.map(item => item.dst).join('\n') || '' }; } catch (error) { console.error('翻译失败:', error); return { success: false, error: error.message, data: null, translated: '' }; } } /** * 设置百度翻译API配置 * @param {string} appid - 百度翻译API的APPID * @param {string} key - 百度翻译API的KEY */ export function setBaiduTranslateConfig(appid, key) { configManager.setBaiduTranslateConfig(appid, key); } /** * 获取百度翻译支持的语言列表 * @returns {Object} 支持的语言代码和名称映射 */ export function getSupportedLanguages() { const config = configManager.getBaiduTranslateConfig(); return config.supportedLanguages; } /** * 验证语言代码是否受支持 * @param {string} langCode - 语言代码 * @returns {boolean} 是否支持该语言 */ export function isLanguageSupported(langCode) { const supportedLanguages = getSupportedLanguages(); return langCode in supportedLanguages; } /** * 批量翻译函数 * @param {Array<string>} queries - 需要翻译的文本数组 * @param {string} from - 源语言,默认为'en' * @param {string} to - 目标语言,默认为'zh' * @param {number} delay - 请求间隔时间(毫秒),默认1000ms,避免频率限制 * @returns {Promise<Array>} - 翻译结果数组 */ export async function batchTranslate(queries, from = 'en', to = 'zh', delay = null) { if (!Array.isArray(queries)) { throw new Error('queries参数必须是数组'); } const config = configManager.getBaiduTranslateConfig(); const actualDelay = delay !== null ? delay : config.defaults.delay; const results = []; for (let i = 0; i < queries.length; i++) { const result = await translateText(queries[i], from, to); results.push(result); // 添加延迟,避免API频率限制 if (i < queries.length - 1) { await new Promise(resolve => setTimeout(resolve, actualDelay)); } } return results; } /** * 检测文本语言(通过百度翻译API) * @param {string} text - 需要检测的文本 * @returns {Promise<Object>} - 检测结果 */ export async function detectLanguage(text) { const result = await translateText(text, 'auto', 'en'); if (result.success && result.data && result.data.from) { return { success: true, language: result.data.from, languageName: getSupportedLanguages()[result.data.from] || '未知语言' }; } return { success: false, error: '语言检测失败' }; } // 导出默认对象以保持兼容性 export default { translateText, setBaiduTranslateConfig, getSupportedLanguages, isLanguageSupported, batchTranslate, detectLanguage };