|
|
import streamlit as st |
|
|
from transformers import MarianMTModel, MarianTokenizer |
|
|
|
|
|
|
|
|
language_dict = { |
|
|
"en": "English", |
|
|
"de": "German", |
|
|
"fr": "French", |
|
|
"es": "Spanish", |
|
|
"it": "Italian", |
|
|
"nl": "Dutch", |
|
|
"pt": "Portuguese", |
|
|
"ro": "Romanian", |
|
|
"ru": "Russian", |
|
|
"zh": "Chinese" |
|
|
} |
|
|
|
|
|
|
|
|
language_codes = {v: k for k, v in language_dict.items()} |
|
|
|
|
|
|
|
|
st.markdown(""" |
|
|
<style> |
|
|
.stTextInput, .stTextArea { |
|
|
background-color: #f4f6f8; |
|
|
padding: 10px; |
|
|
border-radius: 8px; |
|
|
} |
|
|
.stButton { |
|
|
background-color: #4CAF50; |
|
|
color: black; |
|
|
padding: 10px 20px; |
|
|
border-radius: 5px; |
|
|
} |
|
|
.stButton:hover { |
|
|
background-color: #45a049; |
|
|
} |
|
|
.stText { |
|
|
font-size: 1.2em; |
|
|
font-family: 'Helvetica', sans-serif; |
|
|
} |
|
|
.footer { |
|
|
padding: 10px; |
|
|
background-color: #f1f1f1; |
|
|
text-align: center; |
|
|
} |
|
|
h1 { |
|
|
color: #4CAF50; |
|
|
} |
|
|
</style> |
|
|
""", unsafe_allow_html=True) |
|
|
|
|
|
|
|
|
class SameLanguageException(Exception): |
|
|
pass |
|
|
|
|
|
|
|
|
def load_translation_model(src_lang, tgt_lang): |
|
|
model_name = f'Helsinki-NLP/opus-mt-{src_lang}-{tgt_lang}' |
|
|
model = MarianMTModel.from_pretrained(model_name) |
|
|
tokenizer = MarianTokenizer.from_pretrained(model_name) |
|
|
return model, tokenizer |
|
|
|
|
|
|
|
|
def translate_text(text, src_lang, tgt_lang): |
|
|
if src_lang == tgt_lang: |
|
|
raise SameLanguageException("Source and target languages must be different.") |
|
|
|
|
|
model, tokenizer = load_translation_model(src_lang, tgt_lang) |
|
|
|
|
|
|
|
|
inputs = tokenizer(text, return_tensors="pt", padding=True) |
|
|
|
|
|
|
|
|
translated = model.generate(**inputs) |
|
|
|
|
|
|
|
|
translated_text = tokenizer.decode(translated[0], skip_special_tokens=True) |
|
|
|
|
|
return translated_text |
|
|
|
|
|
|
|
|
def language_selector(): |
|
|
|
|
|
col1, col2 = st.columns(2) |
|
|
|
|
|
with col1: |
|
|
source_language = st.selectbox( |
|
|
"Select source language", |
|
|
list(language_dict.values()), |
|
|
key="source_language" |
|
|
) |
|
|
|
|
|
with col2: |
|
|
target_language = st.selectbox( |
|
|
"Select target language", |
|
|
list(language_dict.values()), |
|
|
key="target_language" |
|
|
) |
|
|
|
|
|
return language_codes[source_language], language_codes[target_language] |
|
|
|
|
|
|
|
|
def run_app(): |
|
|
st.title("π Interactive Language Translation App") |
|
|
|
|
|
st.subheader("Translate your text in real-time with ease! π") |
|
|
|
|
|
|
|
|
src_lang_code, tgt_lang_code = language_selector() |
|
|
|
|
|
|
|
|
text_input = st.text_area("Enter text to translate", placeholder="Type here...", height=150) |
|
|
|
|
|
|
|
|
uploaded_file = st.file_uploader("Or upload a text file", type=["txt"]) |
|
|
|
|
|
if uploaded_file is not None: |
|
|
text_input = uploaded_file.read().decode("utf-8") |
|
|
st.text_area("File content", value=text_input, height=150) |
|
|
|
|
|
|
|
|
if st.button("π Translate", key="translate"): |
|
|
if text_input: |
|
|
try: |
|
|
with st.spinner("π Translating... Please wait..."): |
|
|
|
|
|
translated_text = translate_text(text_input, src_lang_code, tgt_lang_code) |
|
|
|
|
|
st.success(f"β
Translation: {translated_text}") |
|
|
st.balloons() |
|
|
except SameLanguageException as e: |
|
|
st.error(f"β Error: {str(e)}") |
|
|
else: |
|
|
st.warning("β οΈ Please enter or upload some text to translate.") |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
run_app() |