| 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 ""
|
|
|