import os import traceback import aiohttp import backoff COUNTRY_CODES = { "EN": "English", "ES": "Spanish", "FR": "French", "ZH": "Chinese (simplified)", "BG": "Bulgarian", "CS": "Czech", "DA": "Danish", "DE": "German", "EL": "Greek", "FI": "Finnish", "HU": "Hungarian", "ID": "Indonesian", "IT": "Italian", "JA": "Japanese", "LT": "Lithuanian", "LV": "Latvian", "NL": "Dutch", "PL": "Polish", "PT": "Portuguese", "RO": "Romanian", "RU": "Russian", "SK": "Slovak", "SV": "Swedish", "TR": "Turkish", "UK": "Ukrainian", } class TranslationModel: def __init__(self): self.deepl_token = os.getenv("DEEPL_TOKEN") def backoff_handler(details): print( f"Backing off {details['wait']:0.1f} seconds after {details['tries']} tries calling function {details['target']} | " f"{details['exception'].status}: {details['exception'].message}" ) @backoff.on_exception( backoff.expo, aiohttp.ClientResponseError, factor=3, base=5, max_tries=4, on_backoff=backoff_handler, ) async def send_translate_request(self, text, translate_language, formality): async with aiohttp.ClientSession(raise_for_status=True) as session: payload = { "text": text, "target_lang": translate_language, "formality": "default" if formality is None else formality, } # Instead of sending as json, we want to send as regular post params headers = { "Authorization": f"DeepL-Auth-Key {self.deepl_token}", } async with session.post( "https://api-free.deepl.com/v2/translate", params=payload, headers=headers, ) as resp: response = await resp.json() print(response) try: return ( response["translations"][0]["text"], response["translations"][0]["detected_source_language"], ) except Exception: print(response) traceback.print_exc() return response @staticmethod def get_all_country_names(lower=False): """Get a list of all the country names""" return ( list(COUNTRY_CODES.values()) if not lower else [name.lower() for name in COUNTRY_CODES.values()] ) @staticmethod def get_all_country_codes(): """Get a list of all the country codes""" return list(COUNTRY_CODES.keys()) @staticmethod def get_country_name_from_code(code): """Get the country name from the code""" try: return COUNTRY_CODES[code] except KeyError: return "Unknown Language" @staticmethod def get_country_code_from_name(name): """Get the country code from the name""" for code, country_name in COUNTRY_CODES.items(): if country_name.lower().strip() == name.lower().strip(): return code