import json
import streamlit as st
from pyodide.code import run_js
from js import JSON
# Model names
URDU_MODEL = "Xenova/opus-mt-en-ur"
FRENCH_MODEL = "Xenova/opus-mt-en-fr"
st.set_page_config(
page_title="English Translator",
page_icon="🌍"
)
# Student information
st.title("Dawar Shariq | B04-0923-000022")
st.subheader("English to Urdu / French Translator")
st.write(
"Enter English text below to translate it into Urdu. "
"If Urdu is unavailable, French translation will be used."
)
# Load and cache translation models
if "translator" not in st.session_state:
st.session_state["translator"] = None
if "language" not in st.session_state:
st.session_state["language"] = None
if "model_name" not in st.session_state:
st.session_state["model_name"] = None
# Input widget
text = st.text_area(
"Enter English Text:",
height=150,
max_chars=2000,
placeholder="Type your English text here..."
)
# Translation button
if st.button("Translate"):
if not text.strip():
st.warning("Please enter some English text first.")
else:
try:
# Load Transformers.js
if st.session_state["translator"] is None:
msg = st.empty()
msg.info("Loading translation model... Please wait.")
mod = await run_js(
"import('https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.8.1')"
)
# Try Urdu model first
try:
translator = await mod.pipeline(
"translation",
URDU_MODEL
)
st.session_state["translator"] = translator
st.session_state["language"] = "Urdu"
st.session_state["model_name"] = URDU_MODEL
except Exception:
# French fallback
msg.warning(
"Urdu model unavailable. Loading French model..."
)
translator = await mod.pipeline(
"translation",
FRENCH_MODEL
)
st.session_state["translator"] = translator
st.session_state["language"] = "French"
st.session_state["model_name"] = FRENCH_MODEL
msg.empty()
# Use cached model
translator = st.session_state["translator"]
# Perform translation
raw = await translator(text)
result = json.loads(JSON.stringify(raw))[0]
translated_text = result["translation_text"]
language = st.session_state["language"]
# Display original text
st.subheader("Original English Text")
st.write(text)
# Display translated result
st.subheader("Translated Text (" + language + ")")
st.write(translated_text)
# Required feature: Character counts
st.subheader("Character Counts")
english_count = len(text)
translated_count = len(translated_text)
col1, col2 = st.columns(2)
with col1:
st.metric(
"English Characters",
english_count
)
with col2:
st.metric(
language + " Characters",
translated_count
)
st.caption(
"Model used: " + st.session_state["model_name"]
)
except Exception as e:
st.error("Translation failed: " + str(e))