hetshah2708's picture
Create app.py
6cbffa8 verified
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()