95 lines
3.0 KiB
Python
95 lines
3.0 KiB
Python
import json
|
|
|
|
from flask import Blueprint, jsonify, request
|
|
|
|
from .auth import login_required
|
|
from .db import get_db, now_iso
|
|
from .translate_service import perform_translate
|
|
|
|
settings_bp = Blueprint("settings", __name__)
|
|
|
|
|
|
def get_user_settings(user_id):
|
|
conn = get_db()
|
|
try:
|
|
row = conn.execute(
|
|
"SELECT translator, api_url, api_key, extra_config, updated_at FROM settings WHERE user_id = ?",
|
|
(user_id,),
|
|
).fetchone()
|
|
if row is None:
|
|
return {
|
|
"translator": "local",
|
|
"api_url": "",
|
|
"api_key": "",
|
|
"extra_config": {},
|
|
"updated_at": "",
|
|
}
|
|
result = dict(row)
|
|
try:
|
|
result["extra_config"] = json.loads(result["extra_config"] or "{}")
|
|
except Exception:
|
|
result["extra_config"] = {}
|
|
return result
|
|
finally:
|
|
conn.close()
|
|
|
|
|
|
@settings_bp.get("/api/settings/translation")
|
|
@login_required
|
|
def get_translation_settings(user):
|
|
return jsonify(get_user_settings(user["id"]))
|
|
|
|
|
|
@settings_bp.put("/api/settings/translation")
|
|
@login_required
|
|
def update_translation_settings(user):
|
|
data = request.get_json(silent=True) or {}
|
|
translator = (data.get("translator") or "local").strip().lower()
|
|
if translator not in ("local", "mymemory", "custom"):
|
|
return jsonify({"error": "不支持的翻译方式"}), 400
|
|
extra_config = data.get("extra_config") or {}
|
|
if not isinstance(extra_config, dict):
|
|
return jsonify({"error": "extra_config 必须是对象"}), 400
|
|
conn = get_db()
|
|
try:
|
|
conn.execute(
|
|
"""
|
|
INSERT INTO settings (user_id, translator, api_url, api_key, extra_config, updated_at)
|
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
ON CONFLICT(user_id) DO UPDATE SET
|
|
translator = excluded.translator,
|
|
api_url = excluded.api_url,
|
|
api_key = excluded.api_key,
|
|
extra_config = excluded.extra_config,
|
|
updated_at = excluded.updated_at
|
|
""",
|
|
(
|
|
user["id"],
|
|
translator,
|
|
(data.get("api_url") or "").strip(),
|
|
(data.get("api_key") or "").strip(),
|
|
json.dumps(extra_config, ensure_ascii=False),
|
|
now_iso(),
|
|
),
|
|
)
|
|
conn.commit()
|
|
return jsonify(get_user_settings(user["id"]))
|
|
finally:
|
|
conn.close()
|
|
|
|
|
|
@settings_bp.post("/api/translate")
|
|
@login_required
|
|
def translate_text(user):
|
|
data = request.get_json(silent=True) or {}
|
|
text = (data.get("text") or "").strip()
|
|
if not text:
|
|
return jsonify({"error": "翻译内容不能为空"}), 400
|
|
source = (data.get("source") or "zh").strip()
|
|
target = (data.get("target") or "es").strip()
|
|
settings = get_user_settings(user["id"])
|
|
result = perform_translate(text, settings, source, target)
|
|
if not result.get("ok"):
|
|
return jsonify({"error": result.get("error", "翻译失败")}), 502
|
|
return jsonify(result)
|