import logging from deep_translator import GoogleTranslator class TranslatorModule: def __init__(self, offline_model=None, offline_tokenizer=None): self.offline_model = offline_model self.offline_tokenizer = offline_tokenizer self.google_translator = GoogleTranslator(source="auto", target="vi") def translate(self, text: str, mode: str = "Auto-Detect (Online)") -> tuple[str, bool]: if not text.strip(): return "", False if mode == "Offline (Helsinki-NLP)": return self._translate_offline(text), True # Try Online translation try: translated_text = self.google_translator.translate(text) return translated_text, False except Exception as e: logging.warning(f"Online translation failed: {e}. Falling back to offline translation.") if self.offline_model and self.offline_tokenizer: return self._translate_offline(text), True else: return f"[Lỗi mạng - Không dịch được] {text}", False def _translate_offline(self, text: str) -> str: if not self.offline_model or not self.offline_tokenizer: return f"[Chưa load model offline] {text}" inputs = self.offline_tokenizer(text, return_tensors="pt") # Move tensors to same device as the model (handles CPU/GPU HF Spaces) if hasattr(self.offline_model, "device") and hasattr(inputs, "to"): inputs = inputs.to(self.offline_model.device) generated_ids = self.offline_model.generate(**inputs) translated_text = self.offline_tokenizer.decode(generated_ids[0], skip_special_tokens=True) return translated_text