72 lines
2.4 KiB
Python
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)}"}
|