File size: 4,052 Bytes
737c030
e656608
da34b5e
891f160
ec946c9
aa9d2fe
 
 
8040f65
891f160
e656608
 
 
 
e12cdaf
1549aa1
8040f65
460acea
14a91a0
1549aa1
14a91a0
e12cdaf
1549aa1
14a91a0
460acea
1549aa1
460acea
1549aa1
460acea
14a91a0
 
ec946c9
460acea
 
 
 
 
 
 
1549aa1
 
14a91a0
 
460acea
 
 
 
 
 
 
14a91a0
460acea
 
1549aa1
 
 
 
 
 
14a91a0
1549aa1
 
 
14a91a0
8040f65
891f160
 
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
import streamlit as st
import importlib
from io import BytesIO

st.set_page_config(page_title="Multilingual Translator", page_icon="🌐", layout="centered")

# Import LANGUAGES from translation.py
from translation import LANGUAGES

def main():
    translation = importlib.import_module("translation")
    lang_detect = importlib.import_module("lang_detect")
    audio_processor = importlib.import_module("audio_processor")

    # Header
    st.markdown("<h1 style='text-align: center; color: #4285F4;'>Multilingual Translator</h1>", unsafe_allow_html=True)

    # Language and Input/Output Layout
    col1, col2 = st.columns(2)
    with col1:
        detected_options = lang_detect.detect_language(st.session_state.get("input_text", "")) if st.session_state.get("input_text", "").strip() and len(st.session_state.get("input_text", "").strip()) >= 10 else [("English", 1.0, "English")]
        source_lang = detected_options[0][0] if detected_options else "English"
        source_lang_code = next((k for k, v in LANGUAGES.items() if v[1] == source_lang), "en")
        source_lang_display = st.selectbox("Source", options=[LANGUAGES[source_lang_code][0]] + [v[0] for v in LANGUAGES.values()], index=0, key="source_lang")
        input_type = st.radio("Input", ["Text", "File"], horizontal=True, key="input_type")
        if input_type == "Text":
            input_text = st.text_area("", height=200, key="input_text", on_change=trigger_translation, args=(translation, lang_detect, audio_processor,))
        else:
            input_text = st.file_uploader("", type=["txt", "docx", "pdf"], key="file_input", on_change=trigger_translation, args=(translation, lang_detect, audio_processor,))
            if input_text:
                st.session_state.input_text = input_text.read().decode("utf-8").strip()
        st.button("Translate", key="translate_btn", on_click=trigger_translation, args=(translation, lang_detect, audio_processor,))
    with col2:
        target_lang_display = st.selectbox("Target", options=[v[0] for v in LANGUAGES.values()], index=list(LANGUAGES.values()).index(LANGUAGES["hi"]), key="target_lang")
        target_lang = next((k for k, v in LANGUAGES.items() if v[0] == target_lang_display), "hi")
        if "translated_text" in st.session_state:
            st.text_area("", value=st.session_state.translated_text, height=200, key="output_text", disabled=True)
        if st.button("", key="audio_btn", on_click=play_audio, args=(audio_processor,), help="Play audio"):
            pass  # Handled by play_audio

def trigger_translation(translation, lang_detect, audio_processor):
    text = st.session_state.input_text.strip()
    if text:
        source_lang = next((k for k, v in LANGUAGES.items() if v[0] == st.session_state.source_lang), "en")
        target_lang = next((k for k, v in LANGUAGES.items() if v[0] == st.session_state.target_lang), "hi")
        if source_lang != "en" and target_lang != "en":
            temp = translation.translate(text, source_lang, "en")
            if temp and len(temp.split()) >= 2:
                st.session_state.translated_text = translation.translate(temp, "en", target_lang)
            else:
                st.session_state.translated_text = text
        else:
            st.session_state.translated_text = translation.translate(text, source_lang, target_lang) or text

def play_audio(audio_processor):
    if "translated_text" in st.session_state and st.session_state.translated_text:
        target_lang = next((k for k, v in LANGUAGES.items() if v[0] == st.session_state.target_lang), "hi")
        audio = audio_processor.text_to_speech(st.session_state.translated_text, target_lang)
        if audio and audio.getbuffer().nbytes > 0:
            st.audio(audio, format="audio/mp3")
        else:
            audio_fallback = audio_processor.text_to_speech(st.session_state.translated_text, "en")
            if audio_fallback and audio_fallback.getbuffer().nbytes > 0:
                st.audio(audio_fallback, format="audio/mp3")

if __name__ == "__main__":
    main()