2026-01-19 11:14:41 +08:00

72 lines
2.4 KiB
Python

# translate.py
import hashlib
import random
import requests
import settings
def iso_to_baidu_lang(iso_code: str) -> str:
"""将 ISO 639-1 语言代码转换为百度翻译所需代码"""
code = settings.BAIDU_LANG_MAP.get(iso_code.lower())
if code is None:
raise ValueError(f"不支持的语言代码: {iso_code}")
return code
def translate_text(text: str, source_lang: str = "auto", target_lang: str = "zh") -> dict:
"""
使用百度翻译 API 进行多语言翻译
:param text: 原文
:param source_lang: 源语言 ISO 代码(如 'ko', 'en'),默认 'auto' 自动检测
:param target_lang: 目标语言 ISO 代码,默认 'zh'
:return: {'success': bool, 'translated_text': str, 'error': str (optional)}
"""
if not text or not text.strip():
return {"success": False, "error": "输入文本为空"}
try:
from_lang = "auto" if source_lang == "auto" else iso_to_baidu_lang(source_lang)
to_lang = iso_to_baidu_lang(target_lang)
except ValueError as e:
return {"success": False, "error": str(e)}
q = text[:settings.MAX_TEXT_LENGTH]
try:
salt = random.randint(32768, 65536)
sign_str = settings.BAIDU_APP_ID + q + str(salt) + settings.BAIDU_SECRET_KEY
sign = hashlib.md5(sign_str.encode()).hexdigest()
payload = {
'q': q,
'from': from_lang,
'to': to_lang,
'appid': settings.BAIDU_APP_ID,
'salt': salt,
'sign': sign
}
response = requests.post(
"https://fanyi-api.baidu.com/api/trans/vip/translate",
data=payload,
timeout=settings.TIMEOUT
)
response.raise_for_status()
result = response.json()
if 'error_code' in result:
error_msg = f"百度API错误 {result.get('error_code')}: {result.get('error_msg', '')}"
return {"success": False, "error": error_msg}
if 'trans_result' not in result or not result['trans_result']:
return {"success": False, "error": "翻译结果为空"}
translated = result['trans_result'][0]['dst']
return {"success": True, "translated_text": translated}
except requests.exceptions.RequestException as e:
return {"success": False, "error": f"网络请求失败: {str(e)}"}
except Exception as e:
return {"success": False, "error": f"未知错误: {str(e)}"}