from transformers import pipeline, MarianMTModel, MarianTokenizer from typing import Optional # Load English->French pipeline once (using HuggingFace translation pipeline) _en_fr_translator = pipeline("translation_en_to_fr", model="Helsinki-NLP/opus-mt-en-fr") # Load English->Spanish MarianMT model and tokenizer once _es_model_name = "Helsinki-NLP/opus-mt-en-es" _es_tokenizer = MarianTokenizer.from_pretrained(_es_model_name) _es_model = MarianMTModel.from_pretrained(_es_model_name) def translate_to_french(text: str) -> str: """Translate English text to French using HuggingFace pipeline.""" try: result = _en_fr_translator(text) return result[0]['translation_text'] except Exception as e: return f"Translation error (EN->FR): {str(e)}" def translate_to_spanish(text: str) -> str: """Translate English text to Spanish using MarianMT.""" try: inputs = _es_tokenizer(text, return_tensors="pt", padding=True) translated_tokens = _es_model.generate(**inputs) return _es_tokenizer.decode(translated_tokens[0], skip_special_tokens=True) except Exception as e: return f"Translation error (EN->ES): {str(e)}" def translate(text: str, to_lang: Optional[str] = "fr") -> str: """ General translate function. Supported: 'fr' (French), 'es' (Spanish). Defaults to French. """ if to_lang == "fr": return translate_to_french(text) elif to_lang == "es": return translate_to_spanish(text) else: return f"Unsupported target language '{to_lang}'. Supported: 'fr', 'es'."