e76fa586f1
Ship dual-track learning (daily accumulation vs textbook),沪教/商务词书 APIs and UI, native iOS wrapper with bundled H5, and production book import on deploy. Co-authored-by: Cursor <cursoragent@cursor.com>
88 lines
2.4 KiB
Python
88 lines
2.4 KiB
Python
import re
|
|
from typing import Optional
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from services.dictionary_service import dictionary_service
|
|
|
|
|
|
def contains_chinese(text: str) -> bool:
|
|
return bool(re.search(r"[\u4e00-\u9fff]", text))
|
|
|
|
|
|
class TranslationService:
|
|
"""翻译服务:优先查离线词典表,未命中时返回占位结果(暂不接入外部 API)。"""
|
|
|
|
def translate(self, db: Session, text: str) -> dict:
|
|
text = text.strip()
|
|
if not text:
|
|
raise ValueError("输入不能为空")
|
|
|
|
if contains_chinese(text):
|
|
return self._zh_to_en(db, text)
|
|
return self._en_to_zh(db, text)
|
|
|
|
def _en_to_zh(self, db: Session, text: str) -> dict:
|
|
entry = dictionary_service.lookup_en(db, text)
|
|
if entry:
|
|
return self._build_response(
|
|
text,
|
|
entry.zh,
|
|
"en",
|
|
"zh",
|
|
entry.phonetic,
|
|
entry.example_en,
|
|
entry.example_cn,
|
|
)
|
|
return self._placeholder(text, "en", "zh")
|
|
|
|
def _zh_to_en(self, db: Session, text: str) -> dict:
|
|
entry = dictionary_service.lookup_zh(db, text)
|
|
if entry:
|
|
return self._build_response(
|
|
text,
|
|
entry.lemma_en,
|
|
"zh",
|
|
"en",
|
|
entry.phonetic,
|
|
entry.example_en,
|
|
entry.example_cn,
|
|
)
|
|
return self._placeholder(text, "zh", "en")
|
|
|
|
def _build_response(
|
|
self,
|
|
source: str,
|
|
target: str,
|
|
source_lang: str,
|
|
target_lang: str,
|
|
phonetic: Optional[str],
|
|
example_en: Optional[str],
|
|
example_cn: Optional[str],
|
|
) -> dict:
|
|
return {
|
|
"source_text": source,
|
|
"target_text": target,
|
|
"source_lang": source_lang,
|
|
"target_lang": target_lang,
|
|
"phonetic": phonetic,
|
|
"example_en": example_en,
|
|
"example_cn": example_cn,
|
|
"found": True,
|
|
}
|
|
|
|
def _placeholder(self, source: str, source_lang: str, target_lang: str) -> dict:
|
|
return {
|
|
"source_text": source,
|
|
"target_text": "",
|
|
"source_lang": source_lang,
|
|
"target_lang": target_lang,
|
|
"phonetic": None,
|
|
"example_en": None,
|
|
"example_cn": None,
|
|
"found": False,
|
|
}
|
|
|
|
|
|
translation_service = TranslationService()
|