from googletrans import Translator as GoogleTranslator import json from typing import Optional class Translator: """Handle text translation for multiple languages""" def __init__(self): self.translator = GoogleTranslator() self.supported_languages = { 'en': 'English', 'hi': 'Hindi', 'te': 'Telugu', 'ta': 'Tamil', 'kn': 'Kannada', 'bn': 'Bengali' } # Fallback translations for common terms self.fallback_translations = { 'hi': { 'Question': 'प्रश्न', 'Answer': 'उत्तर', 'Score': 'स्कोर', 'Correct': 'सही', 'Incorrect': 'गलत', 'Next': 'अगला', 'Previous': 'पिछला', 'Submit': 'जमा करें', 'Skip': 'छोड़ें', 'Easy': 'आसान', 'Medium': 'मध्यम', 'Hard': 'कठिन' }, 'te': { 'Question': 'ప్రశ్న', 'Answer': 'సమాధానం', 'Score': 'స్కోర్', 'Correct': 'సరైనది', 'Incorrect': 'తప్పు', 'Next': 'తదుపరి', 'Previous': 'మునుపటి', 'Submit': 'సమర్పించు', 'Skip': 'దాటవేయి', 'Easy': 'సులువు', 'Medium': 'మధ్యమ', 'Hard': 'కష్టం' }, 'ta': { 'Question': 'கேள்வி', 'Answer': 'பதில்', 'Score': 'மதிப்பெண்', 'Correct': 'சரி', 'Incorrect': 'தவறு', 'Next': 'அடுத்து', 'Previous': 'முந்தைய', 'Submit': 'சமர்ப்பிக்கவும்', 'Skip': 'தவிர்க்கவும்', 'Easy': 'எளிதான', 'Medium': 'நடுத்தர', 'Hard': 'கடினமான' }, 'kn': { 'Question': 'ಪ್ರಶ್ನೆ', 'Answer': 'ಉತ್ತರ', 'Score': 'ಅಂಕ', 'Correct': 'ಸರಿ', 'Incorrect': 'ತಪ್ಪು', 'Next': 'ಮುಂದಿನ', 'Previous': 'ಹಿಂದಿನ', 'Submit': 'ಸಲ್ಲಿಸಿ', 'Skip': 'ಬಿಟ್ಟುಬಿಡಿ', 'Easy': 'ಸುಲಭ', 'Medium': 'ಮಧ್ಯಮ', 'Hard': 'ಕಠಿಣ' }, 'bn': { 'Question': 'প্রশ্ন', 'Answer': 'উত্তর', 'Score': 'স্কোর', 'Correct': 'সঠিক', 'Incorrect': 'ভুল', 'Next': 'পরবর্তী', 'Previous': 'পূর্ববর্তী', 'Submit': 'জমা দিন', 'Skip': 'এড়িয়ে যান', 'Easy': 'সহজ', 'Medium': 'মাধ্যম', 'Hard': 'কঠিন' } } def translate_text(self, text: str, target_language: str) -> str: """Translate text to target language""" if not text or target_language == 'en': return text try: # Try Google Translate first result = self.translator.translate(text, dest=target_language) return result.text except Exception as e: print(f"Translation error: {e}") # Try fallback translation return self._fallback_translate(text, target_language) def _fallback_translate(self, text: str, target_language: str) -> str: """Fallback translation using predefined dictionary""" if target_language not in self.fallback_translations: return text translations = self.fallback_translations[target_language] # Check if the text is a common term if text in translations: return translations[text] # Try to translate word by word for simple phrases words = text.split() translated_words = [] for word in words: if word in translations: translated_words.append(translations[word]) else: translated_words.append(word) return ' '.join(translated_words) def translate_quiz_content(self, quiz_data: dict, target_language: str) -> dict: """Translate entire quiz content""" if target_language == 'en': return quiz_data translated_quiz = quiz_data.copy() # Translate quiz title if present if 'title' in translated_quiz: translated_quiz['title'] = self.translate_text(translated_quiz['title'], target_language) # Translate questions if 'questions' in translated_quiz: for question in translated_quiz['questions']: question['question'] = self.translate_text(question['question'], target_language) if 'options' in question: question['options'] = [ self.translate_text(option, target_language) for option in question['options'] ] if 'explanation' in question: question['explanation'] = self.translate_text(question['explanation'], target_language) return translated_quiz def get_ui_text(self, key: str, language: str) -> str: """Get UI text in specified language""" if language == 'en': return key if language in self.fallback_translations: return self.fallback_translations[language].get(key, key) return key def batch_translate(self, texts: list, target_language: str) -> list: """Translate multiple texts at once""" if target_language == 'en': return texts translated_texts = [] for text in texts: translated_text = self.translate_text(text, target_language) translated_texts.append(translated_text) return translated_texts def detect_language(self, text: str) -> Optional[str]: """Detect the language of given text""" try: result = self.translator.detect(text) return result.lang except Exception as e: print(f"Language detection error: {e}") return 'en' # Default to English def is_supported_language(self, language_code: str) -> bool: """Check if language is supported""" return language_code in self.supported_languages def get_language_name(self, language_code: str) -> str: """Get full language name from code""" return self.supported_languages.get(language_code, 'Unknown')