import requests
from . constants import BASE_URLS , DEEPL_LANGUAGE_TO_CODE
from . exceptions import ( ServerException ,
TranslationNotFound ,
LanguageNotSupportedException ,
AuthorizationException )
class DeepL ( object ) :
"""
class that wraps functions , which use the DeepL translator under the hood to translate word ( s )
"""
_languages = DEEPL_LANGUAGE_TO_CODE
def __init__ ( self , api_key = None , source = " en " , target = " en " , use_free_api = True , * * kwargs ) :
"""
@param api_key : your DeepL api key .
Get one here : https : / / www . deepl . com / docs - api / accessing - the - api /
@param source : source language
@param target : target language
"""
if not api_key :
raise ServerException ( 401 )
self . version = ' v2 '
self . api_key = api_key
self . source = self . _map_language_to_code ( source )
self . target = self . _map_language_to_code ( target )
if use_free_api :
self . __base_url = BASE_URLS . get ( " DEEPL_FREE " ) . format ( version = self . version )
else :
self . __base_url = BASE_URLS . get ( " DEEPL " ) . format ( version = self . version )
def translate ( self , text , * * kwargs ) :
"""
@param text : text to translate
@return : translated text
"""
# Create the request parameters.
translate_endpoint = ' translate '
params = {
" auth_key " : self . api_key ,
" source_lang " : self . source ,
" target_lang " : self . target ,
" text " : text
}
# Do the request and check the connection.
try :
response = requests . get ( self . __base_url + translate_endpoint , params = params )
except ConnectionError :
raise ServerException ( 503 )
# If the answer is not success, raise server exception.
if response . status_code == 403 :
raise AuthorizationException ( self . api_key )
elif response . status_code != 200 :
raise ServerException ( response . status_code )
# Get the response and check is not empty.
res = response . json ( )
if not res :
raise TranslationNotFound ( text )
# Process and return the response.
return res [ ' translations ' ] [ 0 ] [ ' text ' ]
def translate_batch ( self , batch , * * kwargs ) :
"""
@param batch : list of texts to translate
@return : list of translations
"""
return [ self . translate ( text , * * kwargs ) for text in batch ]
@staticmethod
def get_supported_languages ( as_dict = False , * * kwargs ) :
return [ * DeepL . _languages . keys ( ) ] if not as_dict else DeepL . _languages
def _is_language_supported ( self , lang , * * kwargs ) :
# The language is supported when is in the dicionary.
return lang == ' auto ' or lang in self . _languages . keys ( ) or lang in self . _languages . values ( )
def _map_language_to_code ( self , lang , * * kwargs ) :
if lang in self . _languages . keys ( ) :
return self . _languages [ lang ]
elif lang in self . _languages . values ( ) :
return lang
raise LanguageNotSupportedException ( lang )
if __name__ == ' __main__ ' :
d = DeepL ( target = " de " )
t = d . translate ( " I have no idea " )
print ( " text: " , t )