Spaces:
Running
Running
| import streamlit as st | |
| import fitz # pymupdf pour la manipulation PDF | |
| from deep_translator import GoogleTranslator | |
| import time | |
| import re | |
| # Configuration de base pour l'interface Streamlit | |
| st.set_page_config( | |
| page_title="Traduction de Livre Électronique", | |
| page_icon="\U0001F4D6", | |
| layout="centered", | |
| initial_sidebar_state="expanded", | |
| ) | |
| # Titre et description de l'application | |
| st.title("\U0001F4DA Application de Traduction de Livre Électronique") | |
| st.markdown( | |
| """ | |
| Traduisez vos livres électroniques facilement ! Sélectionnez la langue du livre source, | |
| la langue de destination, et téléchargez votre livre traduit en quelques clics. | |
| """ | |
| ) | |
| st.markdown(""" | |
| <style> | |
| .custom-box { | |
| background-color: #fff3cd; /* jaune clair par défaut */ | |
| color: #856404; /* texte brun foncé */ | |
| border-left: 6px solid #ffeeba; | |
| padding: 15px; | |
| border-radius: 5px; | |
| margin: 10px 0; | |
| } | |
| </style> | |
| <div class="custom-box"> | |
| <strong>NB :</strong> Attention, plus le document est volumineux, plus la traduction peut prendre du temps. | |
| <p>Aussi, assurez-vous d'avoir une connexion stable pour éviter les erreurs lors de la traduction.</p> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| # Chargement du fichier PDF | |
| doc_file = st.file_uploader("Téléchargez un fichier PDF", type="pdf") | |
| # Sélection des langues | |
| source_language = st.selectbox( | |
| "Langue du livre à traduire", | |
| options=["en", "fr", "es", "de", "it"], | |
| index=0, | |
| format_func=lambda lang: { | |
| "en": "Anglais", | |
| "fr": "Français", | |
| "es": "Espagnol", | |
| "de": "Allemand", | |
| "it": "Italien", | |
| }[lang], | |
| ) | |
| target_language = st.selectbox( | |
| "Langue de traduction", | |
| options=["fr", "en", "es", "de", "it"], | |
| index=1, | |
| format_func=lambda lang: { | |
| "fr": "Français", | |
| "en": "Anglais", | |
| "es": "Espagnol", | |
| "de": "Allemand", | |
| "it": "Italien", | |
| }[lang], | |
| ) | |
| # Bouton pour lancer la traduction | |
| if doc_file and st.button("Lancer la traduction"): | |
| try: | |
| # Ouverture du document PDF | |
| doc = fitz.open(stream=doc_file.read(), filetype="pdf") | |
| # Initialisation de la traduction | |
| translator = GoogleTranslator(source=source_language, target=target_language) | |
| blanc = fitz.pdfcolor["white"] | |
| textflags = fitz.TEXT_DEHYPHENATE | |
| # Création d'un groupe de calques pour le texte traduit | |
| ocg_xref = doc.add_ocg(f"translated-{target_language}", on=True) | |
| # Barre de progression | |
| total_pages = len(doc) | |
| progress_bar = st.progress(0) | |
| start_time = time.time() | |
| for page_num, page in enumerate(doc): | |
| blocks = page.get_text("blocks", flags=textflags) | |
| for block in blocks: | |
| bbox = block[:4] | |
| english_text = block[4] | |
| # Traduction du texte | |
| translated_text = translator.translate(english_text) | |
| # Remplacement du texte | |
| page.draw_rect(bbox, color=None, fill=blanc, oc=ocg_xref) | |
| # Correction : s'assurer que french est une chaîne de caractères | |
| if isinstance(translated_text, list): | |
| translated_text = " ".join(translated_text) # Joint les éléments de la liste en une seule chaîne | |
| elif translated_text is None: # Gère le cas où la traduction est None | |
| translated_text = "" # Remplace par une chaîne vide | |
| page.insert_htmlbox( | |
| bbox, | |
| translated_text, | |
| oc=ocg_xref, | |
| ) | |
| # Mise à jour de la barre de progression | |
| progress_bar.progress((page_num + 1) / total_pages) | |
| # Calcul du temps écoulé | |
| elapsed_time = time.time() - start_time | |
| # Sauvegarde du fichier traduit | |
| output_pdf = f"translated_{doc_file.name}" | |
| doc.save(output_pdf) | |
| st.success( | |
| f"Traduction terminée en {elapsed_time:.2f} secondes. Téléchargez votre livre ci-dessous !" | |
| ) | |
| st.download_button( | |
| label="Télécharger le livre traduit", | |
| data=open(output_pdf, "rb").read(), | |
| file_name=output_pdf, | |
| mime="application/pdf", | |
| ) | |
| except Exception as e: | |
| st.error(f"Une erreur s'est produite : {str(e)}") | |
| # Style personnalisé | |
| st.markdown( | |
| """ | |
| <style> | |
| .stApp { | |
| background-color: #f0f8ff; | |
| color: #333333; | |
| font-family: 'Arial', sans-serif; | |
| } | |
| .stButton button { | |
| background-color: #4CAF50; | |
| color: white; | |
| border: none; | |
| padding: 10px 20px; | |
| text-align: center; | |
| text-decoration: none; | |
| display: inline-block; | |
| font-size: 16px; | |
| margin: 4px 2px; | |
| cursor: pointer; | |
| border-radius: 8px; | |
| } | |
| .stButton button:hover { | |
| background-color: #45a049; | |
| } | |
| </style> | |
| """, | |
| unsafe_allow_html=True, | |
| ) | |
| # Pied de page | |
| st.markdown(""" | |
| <hr> | |
| <footer style="text-align: center; font-size: 0.9em;"> | |
| © 2024 - La traduction électronique et intelligente | Propulsé par M. ADJOUMANI | |
| </footer> | |
| """, unsafe_allow_html=True) | |