import streamlit as st
from backend import load_model, translate
# -----------------------------
# PAGE CONFIG
# -----------------------------
st.set_page_config(page_title="Kurdish Translator", layout="wide")
# Initialize session state
if "theme" not in st.session_state:
st.session_state.theme = "dark"
if "src_lang" not in st.session_state:
st.session_state.src_lang = "English"
if "tgt_lang" not in st.session_state:
st.session_state.tgt_lang = "Kurdish"
if "output_text" not in st.session_state:
st.session_state.output_text = ""
# Theme colors
THEME = st.session_state.theme
bg = "#111111" if THEME == "dark" else "#ffffff"
fg = "#ffffff" if THEME == "dark" else "#000000"
card_bg = "rgba(255,255,255,0.07)" if THEME == "dark" else "rgba(0,0,0,0.05)"
input_bg = "#1e1e1e" if THEME == "dark" else "#f5f5f5"
button_bg = "#2d2d2d" if THEME == "dark" else "#e0e0e0"
st.markdown(
f"""""",
unsafe_allow_html=True
)
# -----------------------------
# LOAD MODEL
# -----------------------------
@st.cache_resource
def get_model():
return load_model()
# Show custom loader while model is loading
if "model_loaded" not in st.session_state:
loader_container = st.empty()
loader_container.markdown(
"""
Loading translation model...
""",
unsafe_allow_html=True
)
model = get_model()
st.session_state.model_loaded = True
loader_container.empty()
st.rerun()
else:
model = get_model()
# -----------------------------
# CALLBACK FUNCTIONS
# -----------------------------
def swap_languages():
st.session_state.src_lang, st.session_state.tgt_lang = (
st.session_state.tgt_lang,
st.session_state.src_lang
)
def toggle_theme():
st.session_state.theme = "dark" if st.session_state.theme == "light" else "light"
# -----------------------------
# UI
# -----------------------------
st.title("Kurdish ↔ English Translator (NLLB + LoRA)")
col1, colSwap, colTheme, col2 = st.columns([1, 0.6, 0.8, 1])
with col1:
src_lang = st.selectbox(
"From:",
["English", "Kurdish"],
key="src_lang"
)
with colSwap:
st.button("⇆ Swap", use_container_width=True, on_click=swap_languages)
with colTheme:
theme_icon = "🌙" if THEME == "light" else "☀️"
st.button(theme_icon, use_container_width=True, on_click=toggle_theme)
with col2:
tgt_lang = st.selectbox(
"To:",
["Kurdish", "English"],
key="tgt_lang"
)
lang_codes = {
"English": "eng_Latn",
"Kurdish": "ckb_Arab"
}
src_code = lang_codes[st.session_state.src_lang]
tgt_code = lang_codes[st.session_state.tgt_lang]
text = st.text_area("Enter text:", height=180)
# -----------------------------
# TRANSLATE BUTTON
# -----------------------------
if st.button("Translate", type="primary", use_container_width=True):
if not text.strip():
st.warning("Please enter some text.")
else:
# Show loader
loader_placeholder = st.empty()
loader_placeholder.markdown(
"",
unsafe_allow_html=True
)
try:
output = translate(src_code, tgt_code, model, text)
st.session_state.output_text = output
except Exception as e:
st.error(f"Translation error: {str(e)}")
st.session_state.output_text = ""
finally:
# Remove loader
loader_placeholder.empty()
# Display output if available
if st.session_state.output_text:
st.subheader("Output")
st.markdown(
f"{st.session_state.output_text}
",
unsafe_allow_html=True
)
# Copy section
st.code(st.session_state.output_text, language=None)
st.caption("👆 Select and copy the text above (Ctrl+C / Cmd+C)")