File size: 1,598 Bytes
293ab16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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'."