Spaces:
Sleeping
Sleeping
| 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() | |