You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
3.2 KiB

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