import json import urllib.request from pageparse.config import settings INDIAN_LANGUAGES = { "English": "en", "Assamese": "as", "Bengali": "bn", "Bodo": "brx", "Dogri": "doi", "Gujarati": "gu", "Hindi": "hi", "Kannada": "kn", "Kashmiri": "ks", "Konkani": "kok", "Maithili": "mai", "Malayalam": "ml", "Manipuri": "mni", "Marathi": "mr", "Nepali": "ne", "Odia": "or", "Punjabi": "pa", "Sanskrit": "sa", "Santali": "sat", "Sindhi": "sd", "Tamil": "ta", "Telugu": "te", "Urdu": "ur", } def translate_via_ollama(text: str, target_lang: str) -> str: prompt = ( f"Translate the following text into {target_lang}. " "Return ONLY the direct translation. Do NOT add any notes, explanations, introductory text, " "or surrounding conversational text.\n\n" f"Text:\n{text}\n\n" "Translation:" ) payload = { "model": settings.slm_model, "prompt": prompt, "stream": False, "options": {"temperature": 0.1}, } url = f"{settings.ollama_url}/api/generate" data = json.dumps(payload).encode("utf-8") req = urllib.request.Request(url, data=data, headers={"Content-Type": "application/json"}) with urllib.request.urlopen(req, timeout=30) as response: res = json.loads(response.read().decode("utf-8")) return res.get("response", "").strip() def translate_text(text: str, target_lang: str, source_lang: str = "auto") -> str: if not text or not text.strip(): return text if not all(ord(c) < 128 for c in text): return text target_lang_code = INDIAN_LANGUAGES.get(target_lang, "en") if target_lang.lower() == "english": return text try: return translate_via_ollama(text, target_lang) except Exception as e: print(f"Ollama translation failed: {e}") if target_lang_code != "en": return f"[Offline Translation to {target_lang}]: {text}" return text