File size: 6,290 Bytes
737c030
e656608
da34b5e
1c122b7
891f160
e12cdaf
8040f65
891f160
e656608
 
 
 
e12cdaf
1549aa1
115098a
8040f65
e12cdaf
1549aa1
 
e12cdaf
 
 
1549aa1
 
 
e12cdaf
1549aa1
 
 
 
 
 
e12cdaf
 
1549aa1
 
 
e12cdaf
1549aa1
 
 
 
 
 
 
 
 
da34b5e
e12cdaf
1549aa1
e12cdaf
737c030
1549aa1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
da34b5e
1549aa1
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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
import streamlit as st
import importlib
from io import BytesIO
import time

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

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)
    st.markdown("<p style='text-align: center; color: #666;'>Translate text like Google Translate</p>", unsafe_allow_html=True)

    # Language Controls
    col1, col2 = st.columns([1, 1])
    with col1:
        detected_options = lang_detect.detect_language(st.session_state.get("user_text", "")) if st.session_state.get("user_text", "").strip() and len(st.session_state.get("user_text", "").strip()) >= 10 else [("English", 1.0, "English")]
        source_lang = detected_options[0][0] if detected_options else "English"
        native_lang_map = {
            "en": ("English", "English"), "fr": ("Français", "French"), "es": ("Español", "Spanish"),
            "de": ("Deutsch", "German"), "hi": ("हिन्दी", "Hindi"), "zh": ("中文", "Chinese"),
            "ar": ("العربية", "Arabic"), "ru": ("Русский", "Russian"), "ja": ("日本語", "Japanese")
        }
        source_lang_code = next((k for k, v in LANGUAGES.items() if v[1] == source_lang), "en")
        source_lang_display = st.selectbox("Source Language", [native_lang_map[source_lang_code][0]] + [v[0] for v in native_lang_map.values()], index=0, key="source_lang", help="Auto-detected, override if needed")
        source_lang = next((k for k, v in native_lang_map.items() if v[0] == source_lang_display), "en")
    with col2:
        target_lang_display = st.selectbox("Target Language", [v[0] for v in native_lang_map.values()], index=list(native_lang_map.values()).index(native_lang_map["hi"]), key="target_lang")
        target_lang = next((k for k, v in native_lang_map.items() if v[0] == target_lang_display), "hi")

    # Input Section
    if "user_text" not in st.session_state:
        st.session_state.user_text = ""
    col_input = st.container()
    with col_input:
        input_type = st.radio("Input", ["Text", "File Upload"], horizontal=True, label_visibility="collapsed")
        if input_type == "Text":
            user_text = st.text_area("", height=200, key="user_text", on_change=trigger_translation, args=(translation, lang_detect, audio_processor,))
        else:
            user_text = st.file_uploader("Drag and drop or upload file", type=["txt", "docx", "pdf"], key="doc_input", on_change=trigger_translation, args=(translation, lang_detect, audio_processor,))
            if user_text:
                st.session_state.user_text = user_text.read().decode("utf-8").strip()
        st.markdown(f"<small style='color: grey;'>Characters: {len(st.session_state.user_text)}/1000</small>", unsafe_allow_html=True)
        st.button("Translate", key="translate_btn", on_click=trigger_translation, args=(translation, lang_detect, audio_processor,))

    # Output Section
    col_output = st.container()
    with col_output:
        if "translated_text" in st.session_state and st.session_state.translated_text:
            st.text_area("", value=st.session_state.translated_text, height=200, key="output_area", disabled=True)
            col_c, col_a = st.columns([1, 1])
            with col_c:
                st.button("📋", key="copy_btn", on_click=copy_to_clipboard, help="Copy translation")
            with col_a:
                if st.button("🔊", key="audio_btn", on_click=play_audio, args=(audio_processor,)):
                    pass  # Handled by play_audio function

def trigger_translation(translation, lang_detect, audio_processor):
    user_text = st.session_state.user_text.strip()
    if user_text:
        spinner = st.empty()
        spinner.info("Translating...")
        start_time = time.time()
        try:
            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 = translation.translate(user_text, source_lang, "en")
                if not temp_translation or len(temp_translation.split()) < 2:
                    raise ValueError("Intermediate translation invalid")
                translated_text = translation.translate(temp_translation, "en", target_lang)
            else:
                translated_text = translation.translate(user_text, source_lang, target_lang)
            if not translated_text or len(translated_text.split()) < 2:
                raise ValueError("Final translation invalid")
            st.session_state.translated_text = translated_text
        except Exception as e:
            st.session_state.translated_text = user_text
            st.warning(f"Translation issue: {str(e)}. Using input as fallback.")
        finally:
            spinner.empty()
        st.session_state.translation_time = time.time() - start_time

def copy_to_clipboard():
    st.clipboard(st.session_state.translated_text)
    st.success("Copied to clipboard!")

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", start_time=0)
            st.success("Audio playing.")
        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", start_time=0)
                st.success("Fallback audio in English playing.")
            else:
                st.error("Audio generation failed. Try again later.")

if __name__ == "__main__":
    main()