Spaces:
Sleeping
Sleeping
File size: 3,847 Bytes
7b54c20 92db159 4465a0f 7b54c20 4465a0f aa2aa8e 10fb3da d6d3f42 7b54c20 4465a0f d9d5509 4465a0f d9d5509 4465a0f 7b54c20 4465a0f 7b54c20 4465a0f 7b54c20 4465a0f b695d62 4465a0f b695d62 4465a0f b695d62 4465a0f 7b54c20 4465a0f c2cfdef d6d3f42 4465a0f |
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 108 109 110 111 |
import streamlit as st
from mtranslate import translate
from bs4 import BeautifulSoup, NavigableString
import re
import time
import html
# Diccionario de idiomas y sus códigos
lang_dict = {
'Auto': 'auto',
'Español': 'es',
'English': 'en',
'Francés': 'fr',
'Alemán': 'de',
'Italiano': 'it',
'Portugués': 'pt',
'Chino': 'zh',
'Japonés': 'ja',
'Ruso': 'ru',
}
lang_list = list(lang_dict.keys())
source_lang_list = ['Auto'] + lang_list
# --- FUNCIONES ---
def split_text(text, limit=4000):
sentences = re.split(r'([;.])', text)
chunks = []
chunk = ''
for i in range(0, len(sentences), 2):
sentence = sentences[i] + (sentences[i+1] if i+1 < len(sentences) else '')
if len(chunk) + len(sentence) > limit:
chunks.append(chunk)
chunk = ''
chunk += sentence
if chunk:
chunks.append(chunk)
return chunks
def translate_html_content(text, source_lang, target_lang):
soup = BeautifulSoup(text, 'html.parser')
for node in soup.find_all(string=True): # Cambiado de text=True a string=True
if isinstance(node, NavigableString) and node.strip():
original_text = node.strip()
chunks = split_text(original_text)
translated_chunks = [translate(chunk, target_lang, source_lang) for chunk in chunks]
translated_text = ''.join(translated_chunks)
# Verificar espacios antes y después del nodo
if node.previous_sibling and isinstance(node.previous_sibling, NavigableString):
translated_text = ' ' + translated_text
if node.next_sibling and isinstance(node.next_sibling, NavigableString): # Verificación corregida
if not node.next_sibling.startswith(' '):
translated_text += ' '
node.replace_with(translated_text)
return str(soup)
def main():
st.title("🌍 Traductor HTML Inteligente")
with st.expander("ℹ️ Instrucciones"):
st.write(
"- Introduce tu texto o HTML en la caja de texto.\n"
"- Selecciona el idioma de origen y el idioma de destino.\n"
"- Haz clic en 'Traducir' para obtener el texto traducido."
)
text = st.text_area("✍️ Introduce el texto o HTML aquí:", height=200)
col1, col2 = st.columns(2)
with col1:
source_lang = st.selectbox("🌐 Idioma de origen:", source_lang_list)
with col2:
target_lang = st.selectbox("🎯 Idioma de destino:", lang_list, index=1)
if st.button("🚀 Traducir"):
if text.strip():
with st.spinner("⏳ Traduciendo..."):
translated_text = translate_html_content(text, lang_dict[source_lang], lang_dict[target_lang])
st.session_state.translated_text = translated_text
time.sleep(2) # Simulación de carga
st.subheader("📝 Resultado de la traducción:")
st.write(translated_text)
# Botón de copiar
copy_button = f"""
<button onclick="copyToClipboard()">📋 Copiar</button>
<script>
function copyToClipboard() {{
var text = `{html.escape(translated_text)}`;
navigator.clipboard.writeText(text).then(function() {{
alert('Texto copiado al portapapeles');
}}, function(err) {{
console.error('No se pudo copiar el texto: ', err);
}});
}}
</script>
"""
st.markdown(copy_button, unsafe_allow_html=True)
else:
st.warning("⚠️ Por favor, introduce un texto antes de traducir.")
if "translated_text" not in st.session_state:
st.session_state.translated_text = ""
# Ejecutar la app
main()
|