import gradio as gr import pandas as pd import tempfile import csv from translator import translate_english_text, enforce_formal_german from templates import TEMPLATES # ---------------- SINGLE EMAIL ---------------- def generate_and_translate(template_name, tone, name, sender, target_language): template_data = TEMPLATES[template_name][tone] subject_en = template_data["subject"] body_en = template_data["body"].format( name=name or "there", sender=sender or "Your Name" ) subject_tr = translate_english_text(subject_en, target_language) body_tr = translate_english_text(body_en, target_language) if target_language == "German" and tone == "Formal": body_tr = enforce_formal_german(body_tr) final_email = f"Subject: {subject_tr}\n\n{body_tr}" tmp = tempfile.NamedTemporaryFile( delete=False, suffix=".txt", mode="w", encoding="utf-8" ) tmp.write(final_email) tmp.close() return subject_tr, body_tr, final_email, tmp.name # ---------------- BATCH CSV ---------------- def batch_translate_csv(csv_file): if csv_file is None: return None df = pd.read_csv(csv_file.name) rows = [] for _, row in df.iterrows(): template = row["template"].strip().replace(" ", "-") tone = row["tone"].strip() name = row["name"] sender = row["sender"] language = row["language"] tpl = TEMPLATES[template][tone] subject_tr = translate_english_text(tpl["subject"], language) body_tr = translate_english_text( tpl["body"].format(name=name, sender=sender), language ) if language == "German" and tone == "Formal": body_tr = enforce_formal_german(body_tr) rows.append({ "template": template, "tone": tone, "name": name, "language": language, "subject": subject_tr, "email_body": body_tr }) out_df = pd.DataFrame(rows) tmp = tempfile.NamedTemporaryFile( delete=False, suffix=".csv", mode="w", encoding="utf-8", newline="" ) out_df.to_csv( tmp.name, index=False, encoding="utf-8-sig", quoting=csv.QUOTE_ALL ) tmp.close() return tmp.name # ---------------- UI ---------------- with gr.Blocks( theme=gr.themes.Soft(primary_hue="orange"), css=".container {max-width:1200px; margin:auto}" ) as demo: gr.Markdown( """ # 🌍 Cross-Border Sales Email Generator ### Tone-aware, multilingual, production-ready """ ) with gr.Tabs(): # ---------- SINGLE EMAIL TAB ---------- with gr.Tab("Single Email"): with gr.Row(): with gr.Column(scale=1): template = gr.Dropdown( choices=list(TEMPLATES.keys()), label="Email Template" ) tone = gr.Radio( ["Formal", "Casual"], label="Tone", value="Formal" ) name = gr.Textbox(label="Recipient Name") sender = gr.Textbox(label="Sender Name") language = gr.Dropdown( choices={ "🇩🇪 German": "German", "🇷🇺 Russian": "Russian" }, label="Customer Language" ) submit_btn = gr.Button("Generate & Translate", variant="primary") with gr.Column(scale=1): subject_out = gr.Textbox(label="Translated Subject") body_out = gr.Textbox(label="Translated Email Body", lines=8) final_out = gr.Textbox(label="Final Email", lines=10) file_out = gr.File(label="Download Email (.txt)") submit_btn.click( fn=generate_and_translate, inputs=[template, tone, name, sender, language], outputs=[subject_out, body_out, final_out, file_out] ) # ---------- BATCH CSV TAB ---------- with gr.Tab("Batch CSV"): csv_in = gr.File(label="Upload CSV File") csv_out = gr.File(label="Download Translated CSV") batch_btn = gr.Button("Process CSV", variant="primary") batch_btn.click( fn=batch_translate_csv, inputs=csv_in, outputs=csv_out ) demo.launch()