Spaces:
Running
Running
File size: 2,314 Bytes
c3b06c0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
import re
import time
import random
import os
from googletrans import Translator
from functools import lru_cache
TRANSLATOR_CACHE_SIZE = int(os.getenv("TRANSLATOR_CACHE_SIZE",100))
class TranslatorWithCache:
def __init__(self, cache_size=TRANSLATOR_CACHE_SIZE):
self.cache_size = cache_size
self._init_cache()
def _init_cache(self):
self.cached_translate = lru_cache(maxsize=self.cache_size)(self._translate)
def has_russian_word(self, text):
pattern = re.compile(r'[а-яА-ЯёЁ]+')
return bool(pattern.search(text))
def has_english_word(self, text):
pattern = re.compile(r'[a-zA-Z]+')
return bool(pattern.search(text))
def _translate(self, text: str, src: str, dest: str, retries=3) -> str:
tr = Translator()
for attempt in range(retries):
try:
return tr.translate(text, src=src, dest=dest).text
except TypeError as e:
if attempt < retries - 1:
delay = random.uniform(1, 2)
print(f"Ошибка: {e}. Повторная попытка через {delay:.2f} секунд...")
time.sleep(delay)
else:
print(f"Ошибка: {e}. Превышено количество попыток.")
return text # Возвращаем оригинальный текст, если все попытки провалились.
def translate_ru2eng(self, text: str, src='ru', dest='en') -> str:
if self.has_russian_word(text):
return self.cached_translate(text, src, dest)
else:
return text
def translate_eng2ru(self, text: str, src='en', dest='ru') -> str:
if self.has_english_word(text):
return self.cached_translate(text, src, dest)
else:
return text
if __name__ == "__main__":
translator = TranslatorWithCache(cache_size=100)
print(translator.translate_ru2eng("Привет, как дела?"))
print(translator.translate_eng2ru("Hello, how are you?"))
print(translator.translate_ru2eng("Привет, как дела?")) # Повторный вызов для проверки кэша
|