File size: 4,288 Bytes
d5c1c18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5c0fbc8
 
 
 
d5c1c18
 
 
 
 
 
 
 
 
5c0fbc8
 
 
d5c1c18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5c0fbc8
 
 
 
 
 
 
 
 
d5c1c18
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import streamlit as st
from transformers import MarianMTModel, MarianTokenizer

# Map of language codes to full language names and flag images
language_dict = {
    "en": "English",
    "de": "German",
    "fr": "French",
    "es": "Spanish",
    "it": "Italian",
    "nl": "Dutch",
    "pt": "Portuguese",
    "ro": "Romanian",
    "ru": "Russian",
    "zh": "Chinese"
}

# Reverse map for language selection
language_codes = {v: k for k, v in language_dict.items()}

# Add custom CSS for styling
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)

# Custom Exception for Same Source and Target Language
class SameLanguageException(Exception):
    pass

# Function to load model and tokenizer
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

# Function to translate text
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)

    # Tokenize the input text
    inputs = tokenizer(text, return_tensors="pt", padding=True)

    # Translate the text
    translated = model.generate(**inputs)

    # Decode the translated text
    translated_text = tokenizer.decode(translated[0], skip_special_tokens=True)

    return translated_text

# Language selector with flags and names
def language_selector():
    # Use two columns to display the language selectors
    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]

# Main application function
def run_app():
    st.title("🌍 Interactive Language Translation App")

    st.subheader("Translate your text in real-time with ease! 🌐")

    # Select source and target languages
    src_lang_code, tgt_lang_code = language_selector()

    # Text input field with placeholder
    text_input = st.text_area("Enter text to translate", placeholder="Type here...", height=150)

    # Option to upload a text file for input
    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)

    # Button for translation
    if st.button("πŸ”„ Translate", key="translate"):
        if text_input:
            try:
                with st.spinner("πŸ”„ Translating... Please wait..."):
                    # Translate the text
                    translated_text = translate_text(text_input, src_lang_code, tgt_lang_code)
                    # Display translated text directly in the success container
                    st.success(f"βœ… Translation: {translated_text}")
                st.balloons()  # Show animation when translation is complete
            except SameLanguageException as e:
                st.error(f"❌ Error: {str(e)}")
        else:
            st.warning("⚠️ Please enter or upload some text to translate.")

# Run the Streamlit app
if __name__ == "__main__":
    run_app()