import gradio as gr from transformers import pipeline # Initialize translation pipelines en_to_fr = pipeline("translation", model="Helsinki-NLP/opus-mt-en-fr") fr_to_en = pipeline("translation", model="Helsinki-NLP/opus-mt-fr-en") en_to_ja = pipeline("translation", model="Helsinki-NLP/opus-mt-en-jap") ja_to_en = pipeline("translation", model="Helsinki-NLP/opus-mt-jap-en") en_to_es = pipeline("translation", model="Helsinki-NLP/opus-mt-en-es") es_to_en = pipeline("translation", model="Helsinki-NLP/opus-mt-es-en") en_to_zh = pipeline("translation", model="Helsinki-NLP/opus-mt-en-zh") zh_to_en = pipeline("translation", model="Helsinki-NLP/opus-mt-zh-en") fr_to_es = pipeline("translation", model="Helsinki-NLP/opus-mt-fr-es") es_to_fr = pipeline("translation", model="Helsinki-NLP/opus-mt-es-fr") # Dictionary to map language pairs to translation pipelines direct_translators = { "English-French": en_to_fr, "French-English": fr_to_en, "English-Japanese": en_to_ja, "Japanese-English": ja_to_en, "English-Spanish": en_to_es, "Spanish-English": es_to_en, "English-Mandarin": en_to_zh, "Mandarin-English": zh_to_en, "French-Spanish": fr_to_es, "Spanish-French": es_to_fr } # Two-step translation pairs (using English as pivot) two_step_pairs = [ "French-Mandarin", "Mandarin-French", "French-Japanese", "Japanese-French", "Spanish-Japanese", "Japanese-Spanish", "Spanish-Mandarin", "Mandarin-Spanish", "Japanese-Mandarin", "Mandarin-Japanese" ] # Language emoji mapping for visual appeal language_emojis = { "English": "🇬🇧", "French": "🇫🇷", "Japanese": "🇯🇵", "Spanish": "🇪🇸", "Mandarin": "🇨🇳" } def translate_two_step(text, source_lang, target_lang): """Perform translation in two steps using English as an intermediate language.""" # First step: translate to English source_to_en_key = f"{source_lang}-English" source_to_en = direct_translators.get(source_to_en_key) if not source_to_en: return f"Error: Cannot translate from {source_lang} to English." # Translate source to English english_text = source_to_en(text)[0]["translation_text"] # Second step: translate from English to target en_to_target_key = f"English-{target_lang}" en_to_target = direct_translators.get(en_to_target_key) if not en_to_target: return f"Error: Cannot translate from English to {target_lang}." # Translate English to target return en_to_target(english_text)[0]["translation_text"] def get_translator(source_lang, target_lang): """Get the appropriate translation method based on source and target languages.""" key = f"{source_lang}-{target_lang}" # Direct translation available if key in direct_translators: return lambda text: direct_translators[key](text)[0]["translation_text"] # Two-step translation needed elif key in two_step_pairs: return lambda text: translate_two_step(text, source_lang, target_lang) # No translation path available else: return None def translate(text, source_lang, target_lang): """Translate text from source language to target language.""" if not text: return "" if source_lang == target_lang: return text translator = get_translator(source_lang, target_lang) if translator: return translator(text) else: return f"Translation from {source_lang} to {target_lang} is not supported." def update_translation_info(source, target): """Update information about the translation path with friendly, colorful message.""" if source == target: return f"
✨ Both languages are the same! No translation needed. ✨
" key = f"{source}-{target}" emoji_source = language_emojis.get(source, "") emoji_target = language_emojis.get(target, "") if key in direct_translators: return f"
✅ Direct translation: {emoji_source} {source} → {emoji_target} {target}
" elif key in two_step_pairs: return f"
🔄 Two-step translation: {emoji_source} {source} → 🇬🇧 English → {emoji_target} {target}
" else: return f"
⚠️ Translation from {emoji_source} {source} to {emoji_target} {target} is not supported
" def swap_languages(source, target): """Swap source and target languages.""" return target, source # Custom CSS custom_css = """ .gradio-container { background: linear-gradient(135deg, #f5f7fa 0%, #e4ecfb 100%); } .main-div { border-radius: 20px; box-shadow: 0 10px 25px rgba(0,0,0,0.1); background-color: white; padding: 20px; margin: 10px; } .title { text-align: center; color: #4a69bd; font-size: 2.5em; margin-bottom: 10px; text-shadow: 2px 2px 4px rgba(0,0,0,0.1); } .subtitle { text-align: center; color: #6a89cc; margin-bottom: 20px; } .translate-button { background-color: #4a69bd !important; color: white !important; border-radius: 30px !important; padding: 10px 20px !important; font-size: 1.2em !important; transition: transform 0.3s ease !important; } .translate-button:hover { transform: scale(1.05) !important; background-color: #6a89cc !important; } .swap-button { background-color: #fbc531 !important; border-radius: 50% !important; width: 50px !important; height: 50px !important; padding: 0 !important; display: flex !important; justify-content: center !important; align-items: center !important; transition: transform 0.3s ease !important; } .swap-button:hover { transform: rotate(180deg) !important; } .language-select { border-radius: 10px !important; border: 2px solid #b2bec3 !important; } .text-area { border-radius: 10px !important; border: 2px solid #b2bec3 !important; font-size: 1.1em !important; } .result-area { border-radius: 10px !important; border: 2px solid #6a89cc !important; background-color: #f8f9fa !important; font-size: 1.1em !important; } .footer { text-align: center; margin-top: 20px; color: #7f8c8d; font-size: 0.9em; } .examples-container { margin-top: 20px; padding: 15px; background-color: #f8f9fa; border-radius: 10px; border: 2px dashed #b2bec3; } """ # Create Gradio interface with gr.Blocks(css=custom_css) as demo: with gr.Column(elem_classes="main-div"): gr.Markdown("# 🌍 Happy Translator 🌎", elem_classes="title") gr.Markdown("### Connect with the world through language! ✨", elem_classes="subtitle") with gr.Row(): with gr.Column(scale=2): source_lang = gr.Dropdown( choices=["English", "French", "Japanese", "Spanish", "Mandarin"], label=f"From Language", value="English", elem_classes="language-select" ) with gr.Column(scale=1): swap_btn = gr.Button("🔄", elem_classes="swap-button") with gr.Column(scale=2): target_lang = gr.Dropdown( choices=["English", "French", "Japanese", "Spanish", "Mandarin"], label=f"To Language", value="French", elem_classes="language-select" ) translation_info = gr.HTML() # Update translation path info when languages change source_lang.change( update_translation_info, inputs=[source_lang, target_lang], outputs=translation_info ) target_lang.change( update_translation_info, inputs=[source_lang, target_lang], outputs=translation_info ) # Handle language swap swap_btn.click( swap_languages, inputs=[source_lang, target_lang], outputs=[source_lang, target_lang] ).then( update_translation_info, inputs=[source_lang, target_lang], outputs=translation_info ) with gr.Row(): with gr.Column(): source_text = gr.Textbox( label="Type your text here", placeholder="Enter text to translate...", lines=5, elem_classes="text-area" ) with gr.Column(): target_text = gr.Textbox( label="Translation Result", lines=5, elem_classes="result-area" ) translate_btn = gr.Button("✨ Translate ✨", elem_classes="translate-button") # Fun greeting examples with language-appropriate phrases with gr.Column(elem_classes="examples-container"): gr.Markdown("### Try these fun examples! 🎉", elem_classes="subtitle") examples = [ ["Hello, how are you today? I'm having a wonderful day!"], ["I would like to visit Japan someday and see the cherry blossoms."], ["Bonjour, comment allez-vous aujourd'hui? Je passe une journée merveilleuse!"], ["J'aimerais visiter le Japon un jour et voir les cerisiers en fleurs."], ["こんにちは、今日はお元気ですか?素晴らしい一日を過ごしています!"], ["いつか日本を訪れて桜を見たいです。"], ["Hola, ¿cómo estás hoy? ¡Estoy teniendo un día maravilloso!"], ["Me gustaría visitar Japón algún día y ver los cerezos en flor."], ["你好,今天好吗?我今天过得很愉快!"], ["我希望有一天能去日本看樱花。"] ] gr.Examples( examples=examples, inputs=source_text ) # Set up translation function translate_btn.click( translate, inputs=[source_text, source_lang, target_lang], outputs=target_text ) # Also translate when Enter is pressed in the source text box source_text.submit( translate, inputs=[source_text, source_lang, target_lang], outputs=target_text ) gr.Markdown("### Made with ❤️ for language lovers everywhere", elem_classes="footer") # Display initial translation info on load demo.load( update_translation_info, inputs=[source_lang, target_lang], outputs=translation_info ) if __name__ == "__main__": demo.launch(share=True)