"""
Yandex translator API
"""
from typing import List , Optional
import requests
from deep_translator . base import BaseTranslator
from deep_translator . constants import BASE_URLS
from deep_translator . exceptions import (
RequestError ,
ServerException ,
TooManyRequests ,
TranslationNotFound ,
)
from deep_translator . validate import is_input_valid
class YandexTranslator ( BaseTranslator ) :
"""
class that wraps functions , which use the yandex translator under the hood to translate word ( s )
"""
def __init__ (
self ,
api_key : Optional [ str ] = None ,
source : str = " en " ,
target : str = " de " ,
* * kwargs
) :
"""
@param api_key : your yandex api key
"""
if not api_key :
raise ServerException ( 401 )
self . api_key = api_key
self . api_version = " v1.5 "
self . api_endpoints = {
" langs " : " getLangs " ,
" detect " : " detect " ,
" translate " : " translate " ,
}
super ( ) . __init__ (
base_url = BASE_URLS . get ( " YANDEX " ) , source = source , target = target , * * kwargs
)
def _get_supported_languages ( self ) :
return set ( x . split ( " - " ) [ 0 ] for x in self . dirs )
@property
def languages ( self ) :
return self . get_supported_languages ( )
@property
def dirs ( self , proxies : Optional [ dict ] = None ) :
try :
url = self . _base_url . format ( version = self . api_version , endpoint = " getLangs " )
print ( " url: " , url )
response = requests . get ( url , params = { " key " : self . api_key } , proxies = proxies )
except requests . exceptions . ConnectionError :
raise ServerException ( 503 )
else :
data = response . json ( )
if response . status_code != 200 :
raise ServerException ( response . status_code )
return data . get ( " dirs " )
def detect ( self , text : str , proxies : Optional [ dict ] = None ) :
response = None
params = {
" text " : text ,
" format " : " plain " ,
" key " : self . api_key ,
}
try :
url = self . _base_url . format ( version = self . api_version , endpoint = " detect " )
response = requests . post ( url , data = params , proxies = proxies )
except RequestError :
raise
except ConnectionError :
raise ServerException ( 503 )
except ValueError :
raise ServerException ( response . status_code )
else :
response = response . json ( )
language = response [ " lang " ]
status_code = response [ " code " ]
if status_code != 200 :
raise RequestError ( )
elif not language :
raise ServerException ( 501 )
return language
def translate ( self , text : str , proxies : Optional [ dict ] = None , * * kwargs ) - > str :
if is_input_valid ( text ) :
params = {
" text " : text ,
" format " : " plain " ,
" lang " : self . _target
if self . _source == " auto "
else " {} - {} " . format ( self . _source , self . _target ) ,
" key " : self . api_key ,
}
try :
url = self . _base_url . format (
version = self . api_version , endpoint = " translate "
)
response = requests . post ( url , data = params , proxies = proxies )
except ConnectionError :
raise ServerException ( 503 )
else :
response = response . json ( )
if response [ " code " ] == 429 :
raise TooManyRequests ( )
if response [ " code " ] != 200 :
raise ServerException ( response [ " code " ] )
if not response [ " text " ] :
raise TranslationNotFound ( )
return response [ " text " ]
def translate_file ( self , path : str , * * kwargs ) - > str :
"""
translate from a file
@param path : path to file
@return : translated text
"""
return self . _translate_file ( path , * * kwargs )
def translate_batch ( self , batch : List [ str ] , * * kwargs ) - > List [ str ] :
"""
translate a batch of texts
@param batch : list of texts to translate
@return : list of translations
"""
return self . _translate_batch ( batch , * * kwargs )