Spaces:
Build error
Build error
| 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') |