Spaces:
Sleeping
Sleeping
| # translator.py | |
| # --------------------------------------------------------- | |
| # THIS FILE HAS ONE JOB: | |
| # Take a text + target language → return translated text | |
| # | |
| # We use deep-translator library which is: | |
| # - 100% free, no API key needed | |
| # - Supports 100+ languages | |
| # - Uses Google Translate engine under the hood | |
| # - Simple and reliable | |
| # --------------------------------------------------------- | |
| from deep_translator import GoogleTranslator | |
| # All supported languages with their display names and codes | |
| # Code is what Google Translate uses internally | |
| SUPPORTED_LANGUAGES = { | |
| "af": "Afrikaans", | |
| "sq": "Albanian", | |
| "ar": "Arabic", | |
| "bn": "Bengali", | |
| "bs": "Bosnian", | |
| "bg": "Bulgarian", | |
| "zh-CN": "Chinese (Simplified)", | |
| "zh-TW": "Chinese (Traditional)", | |
| "hr": "Croatian", | |
| "cs": "Czech", | |
| "da": "Danish", | |
| "nl": "Dutch", | |
| "en": "English", | |
| "et": "Estonian", | |
| "fi": "Finnish", | |
| "fr": "French", | |
| "de": "German", | |
| "el": "Greek", | |
| "gu": "Gujarati", | |
| "hi": "Hindi", | |
| "hu": "Hungarian", | |
| "id": "Indonesian", | |
| "it": "Italian", | |
| "ja": "Japanese", | |
| "kn": "Kannada", | |
| "ko": "Korean", | |
| "lv": "Latvian", | |
| "lt": "Lithuanian", | |
| "ms": "Malay", | |
| "ml": "Malayalam", | |
| "mr": "Marathi", | |
| "ne": "Nepali", | |
| "no": "Norwegian", | |
| "fa": "Persian", | |
| "pl": "Polish", | |
| "pt": "Portuguese", | |
| "pa": "Punjabi", | |
| "ro": "Romanian", | |
| "ru": "Russian", | |
| "sr": "Serbian", | |
| "si": "Sinhala", | |
| "sk": "Slovak", | |
| "sl": "Slovenian", | |
| "es": "Spanish", | |
| "sw": "Swahili", | |
| "sv": "Swedish", | |
| "tl": "Filipino", | |
| "ta": "Tamil", | |
| "te": "Telugu", | |
| "th": "Thai", | |
| "tr": "Turkish", | |
| "uk": "Ukrainian", | |
| "ur": "Urdu", | |
| "vi": "Vietnamese", | |
| "cy": "Welsh", | |
| } | |
| def translate_text(text, target_language_code): | |
| """ | |
| Translates text to the target language. | |
| text — the transcript string to translate | |
| target_language_code — e.g. "hi" for Hindi, "fr" for French | |
| Returns a dict with success status and translated text. | |
| """ | |
| # Validate the language code | |
| if target_language_code not in SUPPORTED_LANGUAGES: | |
| return { | |
| "success": False, | |
| "error": f"Unsupported language code: {target_language_code}" | |
| } | |
| try: | |
| print(f"[INFO] Translating to {SUPPORTED_LANGUAGES[target_language_code]}...") | |
| # GoogleTranslator takes source and target language | |
| # source="auto" means it detects the input language automatically | |
| translator = GoogleTranslator( | |
| source="auto", | |
| target=target_language_code | |
| ) | |
| # Google Translate has a ~5000 character limit per request | |
| # For long transcripts we split into chunks and translate each | |
| if len(text) <= 4500: | |
| translated = translator.translate(text) | |
| else: | |
| translated = translate_long_text(text, target_language_code) | |
| print(f"[INFO] Translation complete!") | |
| return { | |
| "success": True, | |
| "translated": translated, | |
| "language": SUPPORTED_LANGUAGES[target_language_code], | |
| "language_code": target_language_code | |
| } | |
| except Exception as e: | |
| return { | |
| "success": False, | |
| "error": f"Translation failed: {str(e)}" | |
| } | |
| def translate_long_text(text, target_language_code): | |
| """ | |
| Splits long text into chunks of ~4500 chars, | |
| translates each chunk, then joins them back together. | |
| """ | |
| # Split by sentences (periods) to avoid cutting mid-sentence | |
| sentences = text.replace(". ", ".|").split("|") | |
| chunks = [] | |
| current_chunk = "" | |
| for sentence in sentences: | |
| if len(current_chunk) + len(sentence) < 4500: | |
| current_chunk += sentence + " " | |
| else: | |
| chunks.append(current_chunk.strip()) | |
| current_chunk = sentence + " " | |
| if current_chunk: | |
| chunks.append(current_chunk.strip()) | |
| # Translate each chunk | |
| translator = GoogleTranslator(source="auto", target=target_language_code) | |
| translated_chunks = [] | |
| for i, chunk in enumerate(chunks): | |
| print(f"[INFO] Translating chunk {i+1}/{len(chunks)}...") | |
| translated_chunks.append(translator.translate(chunk)) | |
| return " ".join(translated_chunks) | |
| def get_supported_languages(): | |
| """Returns the full list of supported languages for the frontend.""" | |
| return SUPPORTED_LANGUAGES | |