tx3bas commited on
Commit
f14054c
·
verified ·
1 Parent(s): fb21dfd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -51
app.py CHANGED
@@ -1,75 +1,52 @@
1
  import gradio as gr
2
  from mtranslate import translate
3
- import re
4
  import json
5
- import uuid
6
 
7
- # Diccionario de idiomas (sin cambios)
8
  lang_dict = {
9
  'Auto': 'auto',
10
  'Español': 'es',
11
  'English': 'en',
12
- # ... resto del diccionario ...
13
  }
14
 
15
  lang_list = [k for k in lang_dict.keys() if k != 'Auto']
16
  source_lang_list = ['Auto'] + lang_list
17
 
18
- def split_text(text, limit=4000):
19
- sentences = re.split(r'([;.])', text)
20
- chunks = []
21
- chunk = ''
22
- for i in range(0, len(sentences), 2):
23
- sentence = sentences[i] + (sentences[i+1] if i+1 < len(sentences) else '')
24
- if len(chunk) + len(sentence) > limit:
25
- chunks.append(chunk)
26
- chunk = ''
27
- chunk += sentence
28
- if chunk:
29
- chunks.append(chunk)
30
- return chunks
31
-
32
  def translate_html_content(text, source_lang, target_lang):
33
- # Patrón para identificar etiquetas HTML completas
34
- html_tag_pattern = re.compile(r'<[^>]+>')
35
-
36
- # Encontrar todas las etiquetas HTML
37
- tags = html_tag_pattern.findall(text)
38
-
39
- # Reemplazar cada etiqueta con un marcador único
40
- markers = {f"{{{uuid.uuid4()}}}": tag for tag in tags}
41
- for marker, tag in markers.items():
42
- text = text.replace(tag, marker)
43
-
44
- # Dividir el texto en chunks respetando los marcadores
45
- chunks = split_text(text)
46
-
47
- # Traducir cada chunk
48
- translated_chunks = []
49
- for chunk in chunks:
50
- # Traducir el chunk
51
- translated_chunk = translate(chunk, target_lang, source_lang)
52
- # Limpiar caracteres escapados no deseados
53
- translated_chunk = translated_chunk.replace('\\"', '"').replace('\\n', '\n').replace('\\\\', '\\')
54
- translated_chunks.append(translated_chunk)
55
-
56
- # Unir los chunks traducidos
57
- translated_text = ''.join(translated_chunks)
58
 
59
- # Restaurar las etiquetas originales
60
- for marker, tag in markers.items():
61
- translated_text = translated_text.replace(marker, tag)
 
 
 
 
 
62
 
63
- return translated_text
 
64
 
65
  def main(Texto, source_lang, target_lang):
 
 
 
66
  source_code = lang_dict[source_lang]
67
  target_code = lang_dict[target_lang]
68
 
 
69
  translated_text = translate_html_content(Texto, source_code, target_code)
70
- # Escapar solo para el botón de copiar, no para la salida visual
 
71
  escaped_text = json.dumps(translated_text)[1:-1]
72
 
 
73
  html_output = f"""
74
  <div style="position: relative; min-height: 100px;">
75
  <div id="translated-content">{translated_text}</div>
@@ -81,15 +58,15 @@ def main(Texto, source_lang, target_lang):
81
  """
82
  return html_output
83
 
84
- # Configuración de la interfaz (sin cambios)
85
  iface = gr.Interface(
86
  fn=main,
87
  inputs=[
88
- "text",
89
  gr.Dropdown(source_lang_list, value="Auto", label="Idioma origen"),
90
  gr.Dropdown(lang_list, value="Español", label="Idioma destino")
91
  ],
92
- outputs="text",
93
  title="Traducción sin límites",
94
  description="Ingresa el texto que deseas traducir y selecciona los idiomas. ¡No hay límites!",
95
  article="Desarrollada por © Artxe Web"
 
1
  import gradio as gr
2
  from mtranslate import translate
3
+ from bs4 import BeautifulSoup
4
  import json
 
5
 
6
+ # Diccionario de idiomas
7
  lang_dict = {
8
  'Auto': 'auto',
9
  'Español': 'es',
10
  'English': 'en',
11
+ # Agrega más idiomas según necesites
12
  }
13
 
14
  lang_list = [k for k in lang_dict.keys() if k != 'Auto']
15
  source_lang_list = ['Auto'] + lang_list
16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  def translate_html_content(text, source_lang, target_lang):
18
+ """
19
+ Traduce el contenido de texto dentro de un HTML, preservando las etiquetas.
20
+ """
21
+ # Parsear el HTML con BeautifulSoup
22
+ soup = BeautifulSoup(text, 'html.parser')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
+ # Recorrer todos los nodos de texto
25
+ for node in soup.find_all(text=True):
26
+ text_to_translate = node.strip()
27
+ if text_to_translate:
28
+ # Traducir el texto si no está vacío
29
+ translated_text = translate(text_to_translate, target_lang, source_lang)
30
+ # Reemplazar el nodo original con el texto traducido
31
+ node.replace_with(translated_text)
32
 
33
+ # Devolver el HTML como string
34
+ return str(soup)
35
 
36
  def main(Texto, source_lang, target_lang):
37
+ """
38
+ Función principal que procesa la entrada y genera la salida con un botón de copiar.
39
+ """
40
  source_code = lang_dict[source_lang]
41
  target_code = lang_dict[target_lang]
42
 
43
+ # Traducir el contenido HTML
44
  translated_text = translate_html_content(Texto, source_code, target_code)
45
+
46
+ # Escapar el texto solo para el botón de copiar
47
  escaped_text = json.dumps(translated_text)[1:-1]
48
 
49
+ # Generar la salida HTML con el botón de copiar
50
  html_output = f"""
51
  <div style="position: relative; min-height: 100px;">
52
  <div id="translated-content">{translated_text}</div>
 
58
  """
59
  return html_output
60
 
61
+ # Configuración de la interfaz de Gradio
62
  iface = gr.Interface(
63
  fn=main,
64
  inputs=[
65
+ gr.Textbox(label="Texto a traducir", lines=10),
66
  gr.Dropdown(source_lang_list, value="Auto", label="Idioma origen"),
67
  gr.Dropdown(lang_list, value="Español", label="Idioma destino")
68
  ],
69
+ outputs=gr.HTML(label="Texto traducido"),
70
  title="Traducción sin límites",
71
  description="Ingresa el texto que deseas traducir y selecciona los idiomas. ¡No hay límites!",
72
  article="Desarrollada por © Artxe Web"