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("Привет, как дела?"))  # Повторный вызов для проверки кэша