39 lines
1.2 KiB
Python
39 lines
1.2 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""英译中,入库前统一翻译"""
|
||
import os
|
||
import re
|
||
from typing import Optional
|
||
|
||
|
||
def _is_mostly_chinese(text: str) -> bool:
|
||
if not text or len(text.strip()) < 2:
|
||
return False
|
||
chinese = len(re.findall(r"[\u4e00-\u9fff]", text))
|
||
return chinese / max(len(text), 1) > 0.3
|
||
|
||
|
||
def translate_to_chinese(text: str) -> str:
|
||
"""将文本翻译成中文,失败或已是中文则返回原文。Google 失败时尝试 MyMemory。"""
|
||
if not text or not text.strip():
|
||
return text
|
||
if os.environ.get("TRANSLATE_DISABLED", "0") == "1":
|
||
return text
|
||
s = str(text).strip()
|
||
if len(s) > 2000:
|
||
s = s[:2000]
|
||
if _is_mostly_chinese(s):
|
||
return text
|
||
for translator in ["google", "mymemory"]:
|
||
try:
|
||
if translator == "google":
|
||
from deep_translator import GoogleTranslator
|
||
out = GoogleTranslator(source="auto", target="zh-CN").translate(s)
|
||
else:
|
||
from deep_translator import MyMemoryTranslator
|
||
out = MyMemoryTranslator(source="auto", target="zh-CN").translate(s)
|
||
if out and out.strip() and out != s:
|
||
return out
|
||
except Exception:
|
||
continue
|
||
return text
|