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

class TranslatorApp:
    def __init__(self, root):
        self.root = root
        self.root.title("翻译助手")
        self.root.geometry("600x500")
        self.root.resizable(True, True)
        
        # 语言映射（界面显示名称 -> API代码）
        self.languages = {
            "英语": "en",
            "中文(简体)": "zh-CN",
            "日语": "ja",
            "韩语": "ko",
            "法语": "fr",
            "德语": "de",
            "西班牙语": "es",
            "俄语": "ru"
        }
        
        self.create_widgets()
        
    def create_widgets(self):
        # 源语言选择区域
        frame_src = tk.Frame(self.root)
        frame_src.pack(pady=5, fill=tk.X, padx=10)
        
        tk.Label(frame_src, text="源语言:").pack(side=tk.LEFT)
        self.src_lang = ttk.Combobox(frame_src, values=list(self.languages.keys()), state="readonly", width=15)
        self.src_lang.set("中文(简体)")
        self.src_lang.pack(side=tk.LEFT, padx=5)
        
        # 目标语言选择区域
        frame_dst = tk.Frame(self.root)
        frame_dst.pack(pady=5, fill=tk.X, padx=10)
        
        tk.Label(frame_dst, text="目标语言:").pack(side=tk.LEFT)
        self.dst_lang = ttk.Combobox(frame_dst, values=list(self.languages.keys()), state="readonly", width=15)
        self.dst_lang.set("英语")
        self.dst_lang.pack(side=tk.LEFT, padx=5)
        
        # 输入文本区域
        tk.Label(self.root, text="输入文本:").pack(anchor=tk.W, padx=10, pady=(10,0))
        self.input_text = scrolledtext.ScrolledText(self.root, height=8, wrap=tk.WORD)
        self.input_text.pack(fill=tk.BOTH, padx=10, pady=5, expand=True)
        
        # 按钮区域
        btn_frame = tk.Frame(self.root)
        btn_frame.pack(pady=5)
        self.translate_btn = tk.Button(btn_frame, text="翻译", command=self.start_translate, width=10)
        self.translate_btn.pack(side=tk.LEFT, padx=5)
        self.clear_btn = tk.Button(btn_frame, text="清空", command=self.clear_all, width=10)
        self.clear_btn.pack(side=tk.LEFT, padx=5)
        
        # 输出文本区域
        tk.Label(self.root, text="翻译结果:").pack(anchor=tk.W, padx=10, pady=(5,0))
        self.output_text = scrolledtext.ScrolledText(self.root, height=8, wrap=tk.WORD, state=tk.DISABLED)
        self.output_text.pack(fill=tk.BOTH, padx=10, pady=5, expand=True)
        
        # 状态栏
        self.status_var = tk.StringVar()
        self.status_var.set("就绪")
        self.status_bar = tk.Label(self.root, textvariable=self.status_var, bd=1, relief=tk.SUNKEN, anchor=tk.W)
        self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)
        
    def clear_all(self):
        """清空输入和输出"""
        self.input_text.delete(1.0, tk.END)
        self.output_text.config(state=tk.NORMAL)
        self.output_text.delete(1.0, tk.END)
        self.output_text.config(state=tk.DISABLED)
        self.status_var.set("已清空")
        
    def start_translate(self):
        """启动翻译线程"""
        src = self.src_lang.get()
        dst = self.dst_lang.get()
        text = self.input_text.get(1.0, tk.END).strip()
        
        if not text:
            messagebox.showwarning("提示", "请输入要翻译的文本")
            return
        
        if src == dst:
            messagebox.showwarning("提示", "源语言和目标语言不能相同")
            return
        
        # 禁用按钮，显示忙碌状态
        self.translate_btn.config(state=tk.DISABLED)
        self.status_var.set("翻译中，请稍候...")
        
        # 在线程中执行翻译
        thread = threading.Thread(target=self.translate, args=(text, src, dst))
        thread.daemon = True
        thread.start()
    
    def translate(self, text, src, dst):
        """执行翻译（在线程中运行）"""
        try:
            src_code = self.languages[src]
            dst_code = self.languages[dst]
            
            # 对文本进行URL编码
            encoded_text = urllib.parse.quote(text)
            url = f"http://api.mymemory.translated.net/get?q={encoded_text}&langpair={src_code}|{dst_code}"
            
            # 发送请求
            req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
            with urllib.request.urlopen(req, timeout=10) as response:
                data = json.loads(response.read().decode('utf-8'))
            
            # 解析结果
            if 'responseData' in data and 'translatedText' in data['responseData']:
                result = data['responseData']['translatedText']
                # 某些情况下API会返回原始文本，需要去除可能的html实体
                result = result.replace('&#39;', "'").replace('&quot;', '"').replace('&amp;', '&')
                # 更新UI（必须在主线程中）
                self.root.after(0, self.update_result, result)
                self.root.after(0, self.status_var.set, "翻译完成")
            else:
                error_msg = data.get('responseDetails', '未知错误')
                self.root.after(0, self.translate_error, f"翻译失败：{error_msg}")
        
        except urllib.error.URLError as e:
            self.root.after(0, self.translate_error, f"网络错误：{e.reason}")
        except json.JSONDecodeError:
            self.root.after(0, self.translate_error, "数据解析错误")
        except Exception as e:
            self.root.after(0, self.translate_error, f"发生错误：{str(e)}")
        finally:
            # 无论成功失败，重新启用按钮
            self.root.after(0, self.enable_button)
    
    def update_result(self, result):
        """更新输出文本框（主线程）"""
        self.output_text.config(state=tk.NORMAL)
        self.output_text.delete(1.0, tk.END)
        self.output_text.insert(1.0, result)
        self.output_text.config(state=tk.DISABLED)
    
    def translate_error(self, error_msg):
        """显示翻译错误"""
        messagebox.showerror("错误", error_msg)
        self.status_var.set("翻译失败")
    
    def enable_button(self):
        """重新启用翻译按钮"""
        self.translate_btn.config(state=tk.NORMAL)

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