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
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
|