85 lines
2.4 KiB
Python
85 lines
2.4 KiB
Python
from flask import Flask, request, send_file
|
|
from flask_cors import CORS
|
|
import os
|
|
from utils.docx_translator import DocxTranslator
|
|
import shutil
|
|
import time
|
|
|
|
app = Flask(__name__)
|
|
CORS(app, resources={
|
|
r"/*": {
|
|
"origins": ["chrome-extension://*"],
|
|
"methods": ["POST", "OPTIONS", "GET"],
|
|
"allow_headers": ["Content-Type"]
|
|
}
|
|
})
|
|
|
|
# 全局变量存储翻译进度
|
|
translation_progress = 0
|
|
|
|
UPLOAD_FOLDER = 'temp'
|
|
if not os.path.exists(UPLOAD_FOLDER):
|
|
os.makedirs(UPLOAD_FOLDER)
|
|
|
|
def update_progress(progress):
|
|
global translation_progress
|
|
translation_progress = progress
|
|
|
|
@app.route('/progress', methods=['GET'])
|
|
def get_progress():
|
|
return {'progress': translation_progress}
|
|
|
|
@app.route('/translate', methods=['POST'])
|
|
def translate_docx():
|
|
global translation_progress
|
|
translation_progress = 0
|
|
input_path = None
|
|
output_path = None
|
|
|
|
if 'file' not in request.files:
|
|
return {'error': 'No file provided'}, 400
|
|
|
|
file = request.files['file']
|
|
target_lang = request.form.get('target_lang', 'en')
|
|
|
|
if file.filename == '':
|
|
return {'error': 'No file selected'}, 400
|
|
|
|
try:
|
|
timestamp = str(int(time.time()))
|
|
safe_filename = f"{timestamp}_{file.filename}"
|
|
input_path = os.path.join(UPLOAD_FOLDER, safe_filename)
|
|
file.save(input_path)
|
|
|
|
translator = DocxTranslator()
|
|
output_path = translator.translate_document(
|
|
input_path,
|
|
target_lang=target_lang,
|
|
progress_callback=update_progress
|
|
)
|
|
|
|
temp_output = output_path + '.tmp'
|
|
shutil.copy2(output_path, temp_output)
|
|
|
|
return send_file(
|
|
temp_output,
|
|
as_attachment=True,
|
|
download_name=f"translated_{file.filename}"
|
|
)
|
|
|
|
except Exception as e:
|
|
return {'error': str(e)}, 500
|
|
|
|
finally:
|
|
try:
|
|
if input_path and os.path.exists(input_path):
|
|
os.remove(input_path)
|
|
if output_path and os.path.exists(output_path):
|
|
os.remove(output_path)
|
|
if 'temp_output' in locals() and os.path.exists(temp_output):
|
|
os.remove(temp_output)
|
|
except Exception as e:
|
|
print(f"Error cleaning up files: {e}")
|
|
|
|
if __name__ == '__main__':
|
|
app.run(debug=True, port=5000) |