File size: 3,903 Bytes
636dc45
 
 
 
1cde8f8
 
636dc45
 
 
1cde8f8
2248ec1
1cde8f8
636dc45
 
 
1cde8f8
 
 
 
 
 
636dc45
 
1cde8f8
 
636dc45
 
 
 
 
 
 
 
2248ec1
1cde8f8
7b4545e
2248ec1
 
 
1cde8f8
636dc45
 
 
 
 
1cde8f8
aa1641b
1cde8f8
636dc45
 
 
 
 
 
1cde8f8
2248ec1
1cde8f8
636dc45
 
1cde8f8
aa1641b
1cde8f8
636dc45
 
1cde8f8
2248ec1
1cde8f8
 
636dc45
f8d4bdd
636dc45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1cde8f8
 
636dc45
 
1cde8f8
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
from flask import Flask, request, jsonify
from deep_translator import GoogleTranslator
from langdetect import detect, LangDetectException
import logging
from cachetools import TTLCache
import hashlib

app = Flask(__name__)

# Настройка кэширования
cache = TTLCache(maxsize=1024, ttl=86400)  # Максимальный размер кэша 1024, срок жизни 24 часа (86400 секунд)

# Настройка логирования
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')


def generate_cache_key(text):
    """Генерирует ключ для кэша на основе текста."""
    return hashlib.md5(text.encode('utf-8')).hexdigest()


def translate_text(text):
    """
    Определяет язык текста и переводит его на английский, если необходимо,
    используя кэширование результатов с TTLCache.

    Args:
        text (str): Текст для перевода.

    Returns:
        dict: Словарь с результатом перевода или оригинальным текстом, а также информацией об ошибке.
            Формат: {"result": "переведенный текст", "original": "исходный текст", "error": null/сообщение об ошибке}
    """
    cache_key = generate_cache_key(text)

    cached_result = cache.get(cache_key)
    if cached_result:
        app.logger.info(f"Cache hit for key: {cache_key}")
        return cached_result

    try:
        language = detect(text)
        app.logger.info(f"Detected language: {language}")
    except LangDetectException as e:
        app.logger.error(f"Error detecting language: {e}")
        result = {"result": text, "original": text, "error": f"Error detecting language: {e}"}
  #       cache[cache_key] = result # Кэшируем ошибку
        return result

    if language != 'en':
        try:
            translator = GoogleTranslator(source=language, target='en')
            translated_text = translator.translate(text)
            app.logger.info(f"Translated from {language} to en")
            result = {"result": translated_text, "original": text, "error": None}
            cache[cache_key] = result # Кэшируем результат
            return result
        except Exception as e:
            app.logger.error(f"Error translating prompt: {e}")
            result = {"result": text, "original": text, "error": f"Error translating text: {e}"}
 #            cache[cache_key] = result # Кэшируем ошибку
            return result
    else:
        app.logger.info("Text is already in English")
        result = {"result": text, "original": text, "error": None}
        cache[cache_key] = result # Кэшируем результат
        return result


@app.route('/', methods=['POST'])
def translate_endpoint():
    """
    Эндпоинт для обработки POST запросов.
    Ожидает текст в теле запроса и возвращает перевод или оригинал в формате JSON.
    """
    if request.is_json:
        try:
            data = request.get_json()
            text = data.get('text')
            if not text:
                return jsonify({"error": "No text provided in request body"}), 400
            
            translation_result = translate_text(text)
            
            return jsonify(translation_result), 200

        except Exception as e:
            app.logger.error(f"Error processing request: {e}")
            return jsonify({"error": f"Error processing request: {e}"}), 500
    else:
        return jsonify({"error": "Request must be in json format"}), 400


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=7860, debug=True)