File size: 8,806 Bytes
22be9ef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
182fb49
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
from typing import Any, Optional
from smolagents.tools import Tool
import os
import requests

class TranslatePhraseTool(Tool):
    name = "translate_phrase"
    description = "Translates common travel phrases to a local language."
    inputs = {
        'text': {'type': 'string', 'description': 'Text to translate (e.g., "Hello", "Thank you", "Where is the bathroom?")'},
        'language': {'type': 'string', 'description': 'Target language (e.g., "Spanish", "Japanese", "French")'}
    }
    output_type = "string"

    def __init__(self, api_key=None):
        super().__init__()
        # You can set an API key for a real translation API
        self.api_key = api_key or os.environ.get("TRANSLATION_API_KEY")
        
        # Common travel phrases in various languages (for demo/fallback purposes)
        self.phrase_translations = {
            "hello": {
                "spanish": {"text": "Hola", "pronunciation": "oh-lah"},
                "french": {"text": "Bonjour", "pronunciation": "bohn-zhoor"},
                "italian": {"text": "Ciao", "pronunciation": "chow"},
                "german": {"text": "Hallo", "pronunciation": "hah-loh"},
                "japanese": {"text": "こんにちは (Konnichiwa)", "pronunciation": "kohn-nee-chee-wah"},
                "mandarin": {"text": "你好 (Nǐ hǎo)", "pronunciation": "nee how"},
                "arabic": {"text": "مرحبا (Marhaba)", "pronunciation": "mar-ha-ba"},
                "russian": {"text": "Здравствуйте (Zdravstvuyte)", "pronunciation": "zdrah-stvooy-tye"},
                "portuguese": {"text": "Olá", "pronunciation": "oh-lah"},
                "thai": {"text": "สวัสดี (Sawatdee)", "pronunciation": "sa-wat-dee"}
            },
            "thank you": {
                "spanish": {"text": "Gracias", "pronunciation": "grah-see-ahs"},
                "french": {"text": "Merci", "pronunciation": "mair-see"},
                "italian": {"text": "Grazie", "pronunciation": "graht-see-eh"},
                "german": {"text": "Danke", "pronunciation": "dahn-kuh"},
                "japanese": {"text": "ありがとう (Arigatou)", "pronunciation": "ah-ree-gah-toh"},
                "mandarin": {"text": "谢谢 (Xièxiè)", "pronunciation": "shyeh-shyeh"},
                "arabic": {"text": "شكرا (Shukran)", "pronunciation": "shoo-kran"},
                "russian": {"text": "Спасибо (Spasibo)", "pronunciation": "spah-see-boh"},
                "portuguese": {"text": "Obrigado/a", "pronunciation": "oh-bree-gah-doo/dah"},
                "thai": {"text": "ขอบคุณ (Khop khun)", "pronunciation": "kop-koon"}
            },
            "excuse me": {
                "spanish": {"text": "Disculpe", "pronunciation": "dees-kool-peh"},
                "french": {"text": "Excusez-moi", "pronunciation": "ex-koo-zay mwah"},
                "italian": {"text": "Scusi", "pronunciation": "skoo-zee"},
                "german": {"text": "Entschuldigung", "pronunciation": "ent-shool-di-goong"},
                "japanese": {"text": "すみません (Sumimasen)", "pronunciation": "soo-mee-mah-sen"},
                "mandarin": {"text": "对不起 (Duìbùqǐ)", "pronunciation": "dway-boo-chee"},
                "arabic": {"text": "عفوا (Afwan)", "pronunciation": "af-wan"},
                "russian": {"text": "Извините (Izvinite)", "pronunciation": "eez-vee-nee-tye"},
                "portuguese": {"text": "Com licença", "pronunciation": "com lee-sen-sah"},
                "thai": {"text": "ขอโทษ (Kho thot)", "pronunciation": "kor-toht"}
            },
            "where is the bathroom": {
                "spanish": {"text": "¿Dónde está el baño?", "pronunciation": "don-deh es-tah el ban-yo"},
                "french": {"text": "Où sont les toilettes?", "pronunciation": "oo son lay twa-let"},
                "italian": {"text": "Dov'è il bagno?", "pronunciation": "doh-veh eel ban-yo"},
                "german": {"text": "Wo ist die Toilette?", "pronunciation": "vo ist dee twa-let-te"},
                "japanese": {"text": "トイレはどこですか (Toire wa doko desu ka)", "pronunciation": "toy-reh wah doh-koh des-kah"},
                "mandarin": {"text": "厕所在哪里 (Cèsuǒ zài nǎlǐ)", "pronunciation": "tsuh-swor dzeye nah-lee"},
                "arabic": {"text": "أين الحمام (Ayna al-hammam)", "pronunciation": "eye-nah al-ham-mam"},
                "russian": {"text": "Где туалет (Gde tualet)", "pronunciation": "g-dyeh too-ah-lyet"},
                "portuguese": {"text": "Onde fica o banheiro?", "pronunciation": "on-jee fee-ka oo ban-yay-roo"},
                "thai": {"text": "ห้องน้ำอยู่ที่ไหน (Hong nam yu tee nai)", "pronunciation": "hong nam yoo tee nai"}
            },
            "how much": {
                "spanish": {"text": "¿Cuánto cuesta?", "pronunciation": "kwan-toh kwes-tah"},
                "french": {"text": "Combien ça coûte?", "pronunciation": "kom-bee-en sa koot"},
                "italian": {"text": "Quanto costa?", "pronunciation": "kwan-toh kos-tah"},
                "german": {"text": "Wie viel kostet das?", "pronunciation": "vee feel kos-tet das"},
                "japanese": {"text": "いくらですか (Ikura desu ka)", "pronunciation": "ee-koo-rah des-kah"},
                "mandarin": {"text": "多少钱 (Duōshǎo qián)", "pronunciation": "dwor-shaow chyen"},
                "arabic": {"text": "كم الثمن (Kam althaman)", "pronunciation": "kam al-tha-man"},
                "russian": {"text": "Сколько это стоит (Skol'ko eto stoit)", "pronunciation": "skol-ka eh-ta stoh-eet"},
                "portuguese": {"text": "Quanto custa?", "pronunciation": "kwan-too koos-tah"},
                "thai": {"text": "ราคาเท่าไหร่ (Raka tao rai)", "pronunciation": "ra-ka tao-rai"}
            }
        }

    def forward(self, text: str, language: str) -> str:
        try:
            # Try to use a real translation API if the API key is available
            if self.api_key:
                try:
                    url = "https://libretranslate.de/translate"
                    payload = {
                        "q": text,
                        "source": "auto",
                        "target": language.lower()[:2],  # Use first 2 chars as language code
                        "format": "text"
                    }
                    
                    response = requests.post(url, data=payload)
                    data = response.json()
                    
                    if 'translatedText' in data:
                        return f"🗣️ '{text}' in {language.capitalize()}:\n\n{data['translatedText']}"
                    else:
                        # Fall back to stored phrases if API call fails
                        return self._translate_with_stored_phrases(text, language)
                
                except Exception:
                    # Fall back to stored phrases if any error occurs
                    return self._translate_with_stored_phrases(text, language)
            
            # If no API key is available, use the stored phrases
            return self._translate_with_stored_phrases(text, language)
        
        except Exception as e:
            return f"Error translating text: {str(e)}"
    
    def _translate_with_stored_phrases(self, text: str, language: str) -> str:
        # Normalize inputs
        text_lower = text.lower().strip()
        language = language.lower().strip()
        
        # Find the phrase key that most closely matches the input text
        matched_phrase = None
        for phrase in self.phrase_translations:
            if phrase in text_lower or text_lower in phrase:
                matched_phrase = phrase
                break
        
        if not matched_phrase:
            return f"I don't have a translation for '{text}'. Try common travel phrases like 'hello', 'thank you', 'excuse me', etc."
        
        # Find the language that most closely matches the input language
        matched_language = None
        for lang in self.phrase_translations[matched_phrase]:
            if lang in language or language in lang:
                matched_language = lang
                break
        
        if not matched_language:
            return f"I don't have translations for {language}. Try languages like Spanish, French, Italian, German, Japanese, etc."
        
        # Get the translation
        translation = self.phrase_translations[matched_phrase][matched_language]
        
        return f"🗣️ '{text}' in {matched_language.capitalize()}:\n\n{translation['text']}\n\nPronunciation: {translation['pronunciation']}"