|
import threading
|
|
import time
|
|
from datetime import datetime
|
|
import os
|
|
import traceback
|
|
from flask import current_app
|
|
from app.extensions import db
|
|
from app.models.comparison import Comparison
|
|
from app.models.prompt import Prompt
|
|
from app.models.translate import Translate
|
|
from app.translate import word, excel, powerpoint, pdf, gptpdf, txt, csv_handle, md, to_translate
|
|
|
|
|
|
def main_wrapper(task_id, config, origin_path):
|
|
"""
|
|
翻译任务核心逻辑(支持多参数)[^4]
|
|
:param task_id: 任务ID
|
|
:param origin_path: 原始文件绝对路径
|
|
:param target_path: 目标文件绝对路径
|
|
:param config: 翻译配置字典
|
|
:return: 是否成功
|
|
"""
|
|
try:
|
|
|
|
task = Translate.query.get(task_id)
|
|
if not task:
|
|
current_app.logger.error(f"任务 {task_id} 不存在")
|
|
return False
|
|
|
|
|
|
|
|
_init_translate_config(task)
|
|
to_translate.init_openai(config['api_url'], config['api_key'])
|
|
|
|
extension = os.path.splitext(origin_path)[1].lower()
|
|
print('文件扩展名',extension,origin_path)
|
|
|
|
handler_map = {
|
|
('.docx', '.doc'): word,
|
|
('.xlsx', '.xls'): excel,
|
|
('.pptx', '.ppt'): powerpoint,
|
|
('.pdf',): pdf,
|
|
('.txt',): txt,
|
|
('.csv',): csv_handle,
|
|
('.md',): md
|
|
}
|
|
|
|
|
|
for ext_group, handler in handler_map.items():
|
|
if extension in ext_group:
|
|
|
|
|
|
|
|
|
|
status = handler.start(
|
|
|
|
|
|
trans=config
|
|
)
|
|
print('config配置项', config)
|
|
return status
|
|
|
|
current_app.logger.error(f"不支持的文件类型: {extension}")
|
|
return False
|
|
|
|
except Exception as e:
|
|
current_app.logger.error(f"翻译任务执行异常: {str(e)}", exc_info=True)
|
|
return False
|
|
|
|
|
|
def _init_translate_config1(task):
|
|
"""初始化翻译配置(如OpenAI)"""
|
|
if task.api_url and task.api_key:
|
|
import openai
|
|
openai.api_base = task.api_url
|
|
openai.api_key = task.api_key
|
|
|
|
def pdf_handler(config, origin_path):
|
|
return gptpdf.start(config)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _init_translate_config(trans):
|
|
"""
|
|
初始化翻译配置[^5]
|
|
:param trans: 翻译任务对象
|
|
"""
|
|
|
|
if trans.api_url and trans.api_key:
|
|
set_openai_config(trans.api_url, trans.api_key)
|
|
|
|
|
|
if trans.comparison_id:
|
|
comparison = get_comparison(trans.comparison_id)
|
|
trans.prompt = f"{comparison}\n{trans.prompt}"
|
|
|
|
|
|
if trans.prompt_id:
|
|
prompt = get_prompt(trans.prompt_id)
|
|
trans.prompt = prompt
|
|
|
|
|
|
def set_openai_config(api_url, api_key):
|
|
"""
|
|
设置OpenAI API配置[^6]
|
|
"""
|
|
import openai
|
|
openai.api_base = api_url
|
|
openai.api_key = api_key
|
|
|
|
|
|
def get_comparison(comparison_id):
|
|
"""
|
|
加载术语对照表
|
|
:param comparison_id: 术语对照表ID
|
|
:return: 术语对照表内容
|
|
"""
|
|
comparison = db.session.query(Comparison).filter_by(id=comparison_id).first()
|
|
if comparison and comparison.content:
|
|
return comparison.content.replace(',', ':').replace(';', '\n')
|
|
return ""
|
|
|
|
|
|
def get_prompt(prompt_id):
|
|
"""
|
|
加载提示词模板
|
|
:param prompt_id: 提示词模板ID
|
|
:return: 提示词内容
|
|
"""
|
|
prompt = db.session.query(Prompt).filter_by(id=prompt_id).first()
|
|
if prompt and prompt.content:
|
|
return prompt.content
|
|
return ""
|
|
|