VoiceScript / backend /translator.py
Tusharz's picture
feat: add export TXT/SRT/PDF, language detection, translate, shimmer animation
f7515a6
Raw
History Blame Contribute Delete
4.47 kB
# 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