import tkinter as tk
from tkinter import ttk, messagebox
import urllib.request
import urllib.parse
import json
import threading


class TranslatorApp:
    def __init__(self, root):
        self.root = root
        self.root.title("022. 翻译软件")
        self.root.geometry("700x450")
        self.root.resizable(False, False)

        self.setup_ui()

    def setup_ui(self):
        # 标题
        tk.Label(
            self.root, text="🌐 翻译软件",
            font=("微软雅黑", 18, "bold")
        ).pack(pady=10)

        # 输入区
        input_frame = tk.Frame(self.root)
        input_frame.pack(pady=5, padx=20, fill=tk.BOTH)

        tk.Label(
            input_frame, text="原文：",
            font=("微软雅黑", 10)
        ).pack(anchor="w")

        self.input_text = tk.Text(
            input_frame, height=8, font=("Consolas", 12),
            relief=tk.SUNKEN, bd=2
        )
        self.input_text.pack(fill=tk.BOTH, expand=True)

        # 按钮区
        btn_frame = tk.Frame(self.root)
        btn_frame.pack(pady=10)

        self.translate_btn = tk.Button(
            btn_frame, text="翻 译",
            width=12, height=2,
            bg="#4CAF50", fg="white",
            font=("微软雅黑", 11, "bold"),
            command=self.start_translate
        )
        self.translate_btn.pack(side=tk.LEFT, padx=10)

        tk.Button(
            btn_frame, text="清 空",
            width=12, height=2,
            bg="#FF9800", fg="white",
            font=("微软雅黑", 11),
            command=self.clear_text
        ).pack(side=tk.LEFT, padx=10)

        tk.Button(
            btn_frame, text="复 制",
            width=12, height=2,
            bg="#2196F3", fg="white",
            font=("微软雅黑", 11),
            command=self.copy_result
        ).pack(side=tk.LEFT, padx=10)

        # 输出区
        output_frame = tk.Frame(self.root)
        output_frame.pack(pady=5, padx=20, fill=tk.BOTH)

        tk.Label(
            output_frame, text="译文：",
            font=("微软雅黑", 10)
        ).pack(anchor="w")

        self.output_text = tk.Text(
            output_frame, height=8, font=("Consolas", 12),
            relief=tk.SUNKEN, bd=2, bg="#f9f9f9"
        )
        self.output_text.pack(fill=tk.BOTH, expand=True)

        # 状态栏
        self.status = tk.Label(
            self.root, text="就绪",
            anchor="w", relief=tk.SUNKEN
        )
        self.status.pack(side=tk.BOTTOM, fill=tk.X)

    def start_translate(self):
        text = self.input_text.get("1.0", tk.END).strip()
        if not text:
            messagebox.showwarning("提示", "请输入要翻译的内容！")
            return

        self.translate_btn.config(state="disabled", text="翻译中...")
        self.status.config(text="正在翻译...")

        # 使用线程，防止界面卡死
        threading.Thread(
            target=self.translate, args=(text,), daemon=True
        ).start()

    def translate(self, text):
        try:
            # MyMemory 翻译接口（免费，无需 API Key）
            url = "https://api.mymemory.translated.net/get"
            params = {
                "q": text,
                "langpair": "zh|en" if any('\u4e00' <= ch <= '\u9fff' for ch in text) else "en|zh"
            }

            data = urllib.parse.urlencode(params).encode("utf-8")
            req = urllib.request.Request(url, data)
            req.add_header("User-Agent", "Mozilla/5.0")

            with urllib.request.urlopen(req, timeout=10) as response:
                result = json.loads(response.read().decode("utf-8"))

            translated = result["responseData"]["translatedText"]

            # 更新 UI（必须在主线程）
            self.root.after(0, self.show_result, translated)

        except urllib.error.URLError:
            self.root.after(0, self.show_error, "网络连接失败，请检查网络！")
        except Exception as e:
            self.root.after(0, self.show_error, f"翻译失败：{str(e)}")

    def show_result(self, translated):
        self.output_text.delete("1.0", tk.END)
        self.output_text.insert("1.0", translated)
        self.status.config(text="翻译完成")
        self.translate_btn.config(state="normal", text="翻 译")

    def show_error(self, msg):
        messagebox.showerror("错误", msg)
        self.status.config(text="翻译失败")
        self.translate_btn.config(state="normal", text="翻 译")

    def clear_text(self):
        self.input_text.delete("1.0", tk.END)
        self.output_text.delete("1.0", tk.END)
        self.status.config(text="已清空")

    def copy_result(self):
        text = self.output_text.get("1.0", tk.END).strip()
        if text:
            self.root.clipboard_clear()
            self.root.clipboard_append(text)
            self.status.config(text="已复制到剪贴板")
        else:
            messagebox.showwarning("提示", "没有可复制的内容！")


if __name__ == "__main__":
    root = tk.Tk()
    TranslatorApp(root)
    root.mainloop()