import streamlit as st from deep_translator import GoogleTranslator import json import re # Fetch supported languages dynamically SUPPORTED_LANGUAGES = GoogleTranslator().get_supported_languages() # Default languages (including Greek 'el') DEFAULT_LANGUAGES = ["fr", "es", "de", "hi", "el"] # French, Spanish, German, Hindi, Greek DEFAULT_LANGUAGES = [lang for lang in DEFAULT_LANGUAGES if lang in SUPPORTED_LANGUAGES] st.title("🌍 Multi-Language Translator") # Language selection target_languages = st.multiselect("🎯 Select target languages", SUPPORTED_LANGUAGES, default=DEFAULT_LANGUAGES) # Input type selection input_type = st.radio("📌 Choose input method", ["Text", "TXT File", "JSON File"]) def translate_text(text, lang): """Translate text while preserving placeholders inside {{ }}""" placeholders = re.findall(r"(\{\{.*?\}\})", text) # Extract placeholders translated_text = GoogleTranslator(source="auto", target=lang).translate(text) # Restore placeholders to keep them unchanged for placeholder in placeholders: translated_text = translated_text.replace(GoogleTranslator(source="auto", target=lang).translate(placeholder), placeholder) return translated_text def translate_json_values(json_data, lang): """ Translate JSON values while preserving the original keys in quotes. """ translated_json = {} for key, value in json_data.items(): if isinstance(value, dict): # Recursive translation for nested dictionaries translated_json[key] = translate_json_values(value, lang) elif isinstance(value, list): # Translate list elements translated_json[key] = [translate_text(item, lang) if isinstance(item, str) else item for item in value] elif isinstance(value, str): # Translate string values only translated_json[key] = translate_text(value, lang) else: # Keep numbers/booleans unchanged translated_json[key] = value return translated_json if input_type == "Text": user_text = st.text_area("✏ Enter text to translate:") if st.button("Translate"): if user_text.strip(): results = {lang: translate_text(user_text, lang) for lang in target_languages} st.json(results) # Provide download button for TXT file for lang, translated_text in results.items(): file_name = f"translated_{lang}.txt" st.download_button( label=f"⬇ Download Translated TXT ({lang})", data=translated_text, file_name=file_name, mime="text/plain" ) else: st.warning("Please enter text to translate.") elif input_type == "TXT File": uploaded_file = st.file_uploader("📄 Upload a TXT file", type=["txt"]) if uploaded_file: content = uploaded_file.read().decode("utf-8") if st.button("Translate"): results = {lang: translate_text(content, lang) for lang in target_languages} st.json(results) # Provide download button for translated TXT files for lang, translated_text in results.items(): file_name = f"translated_{lang}.txt" st.download_button( label=f"⬇ Download Translated TXT ({lang})", data=translated_text, file_name=file_name, mime="text/plain" ) elif input_type == "JSON File": uploaded_json = st.file_uploader("📂 Upload a JSON file", type=["json"]) if uploaded_json: content = json.load(uploaded_json) translated_results = {lang: translate_json_values(content, lang) for lang in target_languages} st.json(translated_results) # Provide download button for translated JSON files for lang, data in translated_results.items(): file_name = f"translated_{lang}.json" st.download_button( label=f"⬇ Download Translated JSON ({lang})", data=json.dumps(data, indent=4, ensure_ascii=False), file_name=file_name, mime="application/json" ) st.markdown("🚀 *Supports over 100 languages!*")