Spaces:
Running
Running
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!*") | |