Update app.py
Browse files
app.py
CHANGED
|
@@ -42,25 +42,79 @@ Response Rules:
|
|
| 42 |
app = Flask(__name__, template_folder="templates", static_folder="static")
|
| 43 |
CORS(app)
|
| 44 |
|
| 45 |
-
#
|
| 46 |
-
def
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
"""
|
| 48 |
Translate text to desired language using Microsoft Translator
|
| 49 |
|
| 50 |
Args:
|
| 51 |
text (str): Text to translate
|
| 52 |
target_lang (str): Target language code (e.g., 'es', 'fr', 'de', 'hi', 'zh')
|
| 53 |
-
source_lang (str): Source language code (
|
| 54 |
|
| 55 |
Returns:
|
| 56 |
str: Translated text or original text if translation fails
|
| 57 |
"""
|
| 58 |
try:
|
| 59 |
-
# Skip translation if target language is English and
|
| 60 |
if target_lang.lower() == 'en':
|
| 61 |
return text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 62 |
|
| 63 |
-
# Create translator instance
|
| 64 |
translator = Translator(to_lang=target_lang, from_lang=source_lang)
|
| 65 |
translated = translator.translate(text)
|
| 66 |
|
|
@@ -72,7 +126,15 @@ def translate_text(text, target_lang, source_lang='auto'):
|
|
| 72 |
|
| 73 |
except Exception as e:
|
| 74 |
print(f"Translation error: {str(e)}")
|
| 75 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 76 |
|
| 77 |
# Language code mapping for common languages
|
| 78 |
LANGUAGE_CODES = {
|
|
@@ -129,11 +191,17 @@ def chat():
|
|
| 129 |
processed_message = user_message
|
| 130 |
if target_lang != "en":
|
| 131 |
try:
|
| 132 |
-
#
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 137 |
except Exception as e:
|
| 138 |
print(f"User message translation error: {str(e)}")
|
| 139 |
processed_message = user_message # Use original message
|
|
@@ -180,7 +248,7 @@ def translate_endpoint():
|
|
| 180 |
data = request.get_json()
|
| 181 |
text = data.get("text")
|
| 182 |
target_lang = data.get("target_lang", "en")
|
| 183 |
-
source_lang = data.get("source_lang"
|
| 184 |
|
| 185 |
if not text:
|
| 186 |
return jsonify({"error": "Text is required"}), 400
|
|
@@ -189,13 +257,17 @@ def translate_endpoint():
|
|
| 189 |
target_lang = target_lang.lower()
|
| 190 |
if target_lang in LANGUAGE_CODES:
|
| 191 |
target_lang = LANGUAGE_CODES[target_lang]
|
|
|
|
|
|
|
|
|
|
|
|
|
| 192 |
|
| 193 |
translated = translate_text(text, target_lang, source_lang)
|
| 194 |
|
| 195 |
return jsonify({
|
| 196 |
"original_text": text,
|
| 197 |
"translated_text": translated,
|
| 198 |
-
"
|
| 199 |
"target_lang": target_lang
|
| 200 |
})
|
| 201 |
|
|
|
|
| 42 |
app = Flask(__name__, template_folder="templates", static_folder="static")
|
| 43 |
CORS(app)
|
| 44 |
|
| 45 |
+
# Language detection function
|
| 46 |
+
def detect_language(text):
|
| 47 |
+
"""
|
| 48 |
+
Detect language of text using multiple methods
|
| 49 |
+
"""
|
| 50 |
+
try:
|
| 51 |
+
# Method 1: Try langdetect if available
|
| 52 |
+
try:
|
| 53 |
+
from langdetect import detect
|
| 54 |
+
detected = detect(text)
|
| 55 |
+
return detected
|
| 56 |
+
except ImportError:
|
| 57 |
+
pass
|
| 58 |
+
except:
|
| 59 |
+
pass
|
| 60 |
+
|
| 61 |
+
# Method 2: Simple heuristic detection
|
| 62 |
+
common_words = {
|
| 63 |
+
'en': ['the', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for', 'of', 'with', 'by', 'is', 'are', 'was', 'were'],
|
| 64 |
+
'es': ['el', 'la', 'de', 'que', 'y', 'en', 'un', 'es', 'se', 'no', 'te', 'lo', 'por', 'con', 'del', 'las'],
|
| 65 |
+
'fr': ['le', 'de', 'et', 'à', 'un', 'il', 'être', 'en', 'avoir', 'que', 'pour', 'du', 'ce', 'son', 'une'],
|
| 66 |
+
'de': ['der', 'die', 'und', 'in', 'den', 'von', 'zu', 'das', 'mit', 'sich', 'des', 'auf', 'für', 'ist'],
|
| 67 |
+
'it': ['il', 'di', 'che', 'e', 'la', 'per', 'in', 'un', 'è', 'con', 'non', 'da', 'del', 'sono'],
|
| 68 |
+
'pt': ['de', 'a', 'o', 'que', 'e', 'do', 'da', 'em', 'um', 'para', 'é', 'com', 'os', 'uma', 'ser'],
|
| 69 |
+
'ru': ['в', 'и', 'не', 'на', 'я', 'быть', 'с', 'а', 'как', 'его', 'к', 'он', 'что', 'то'],
|
| 70 |
+
'hi': ['है', 'का', 'के', 'में', 'और', 'को', 'से', 'पर', 'यह', 'वह', 'एक', 'जो'],
|
| 71 |
+
'ar': ['في', 'من', 'إلى', 'على', 'هذا', 'هذه', 'التي', 'الذي', 'أن', 'كان', 'مع'],
|
| 72 |
+
'zh': ['的', '是', '在', '了', '和', '有', '人', '我', '你', '他', '她', '它'],
|
| 73 |
+
}
|
| 74 |
+
|
| 75 |
+
text_lower = text.lower()
|
| 76 |
+
scores = {}
|
| 77 |
+
|
| 78 |
+
for lang, words in common_words.items():
|
| 79 |
+
score = sum(1 for word in words if word in text_lower)
|
| 80 |
+
if score > 0:
|
| 81 |
+
scores[lang] = score / len(words) # Normalize by word count
|
| 82 |
+
|
| 83 |
+
if scores:
|
| 84 |
+
return max(scores, key=scores.get)
|
| 85 |
+
|
| 86 |
+
return 'en' # Default to English if detection fails
|
| 87 |
+
|
| 88 |
+
except Exception:
|
| 89 |
+
return 'en' # Default to English
|
| 90 |
+
|
| 91 |
+
# Translation function with proper language detection
|
| 92 |
+
def translate_text(text, target_lang, source_lang=None):
|
| 93 |
"""
|
| 94 |
Translate text to desired language using Microsoft Translator
|
| 95 |
|
| 96 |
Args:
|
| 97 |
text (str): Text to translate
|
| 98 |
target_lang (str): Target language code (e.g., 'es', 'fr', 'de', 'hi', 'zh')
|
| 99 |
+
source_lang (str): Source language code (if None, will auto-detect)
|
| 100 |
|
| 101 |
Returns:
|
| 102 |
str: Translated text or original text if translation fails
|
| 103 |
"""
|
| 104 |
try:
|
| 105 |
+
# Skip translation if target language is English and source appears to be English
|
| 106 |
if target_lang.lower() == 'en':
|
| 107 |
return text
|
| 108 |
+
|
| 109 |
+
# Detect source language if not provided
|
| 110 |
+
if source_lang is None or source_lang == 'auto':
|
| 111 |
+
source_lang = detect_language(text)
|
| 112 |
+
|
| 113 |
+
# Skip translation if source and target are the same
|
| 114 |
+
if source_lang.lower() == target_lang.lower():
|
| 115 |
+
return text
|
| 116 |
|
| 117 |
+
# Create translator instance with detected/specified source language
|
| 118 |
translator = Translator(to_lang=target_lang, from_lang=source_lang)
|
| 119 |
translated = translator.translate(text)
|
| 120 |
|
|
|
|
| 126 |
|
| 127 |
except Exception as e:
|
| 128 |
print(f"Translation error: {str(e)}")
|
| 129 |
+
# Try fallback translation with English as source
|
| 130 |
+
try:
|
| 131 |
+
fallback_translator = Translator(to_lang=target_lang, from_lang='en')
|
| 132 |
+
fallback_result = fallback_translator.translate(text)
|
| 133 |
+
if fallback_result and fallback_result.strip():
|
| 134 |
+
return fallback_result
|
| 135 |
+
except:
|
| 136 |
+
pass
|
| 137 |
+
return text # Return original text if all translation attempts fail
|
| 138 |
|
| 139 |
# Language code mapping for common languages
|
| 140 |
LANGUAGE_CODES = {
|
|
|
|
| 191 |
processed_message = user_message
|
| 192 |
if target_lang != "en":
|
| 193 |
try:
|
| 194 |
+
# Detect source language of user message
|
| 195 |
+
detected_source = detect_language(user_message)
|
| 196 |
+
print(f"Detected user language: {detected_source}")
|
| 197 |
+
|
| 198 |
+
# Translate to English only if source is not English
|
| 199 |
+
if detected_source != 'en':
|
| 200 |
+
english_translator = Translator(to_lang='en', from_lang=detected_source)
|
| 201 |
+
processed_message = english_translator.translate(user_message)
|
| 202 |
+
if not processed_message or not processed_message.strip():
|
| 203 |
+
processed_message = user_message # Fallback to original
|
| 204 |
+
print(f"Translated user message to English: {processed_message}")
|
| 205 |
except Exception as e:
|
| 206 |
print(f"User message translation error: {str(e)}")
|
| 207 |
processed_message = user_message # Use original message
|
|
|
|
| 248 |
data = request.get_json()
|
| 249 |
text = data.get("text")
|
| 250 |
target_lang = data.get("target_lang", "en")
|
| 251 |
+
source_lang = data.get("source_lang") # Remove default 'auto'
|
| 252 |
|
| 253 |
if not text:
|
| 254 |
return jsonify({"error": "Text is required"}), 400
|
|
|
|
| 257 |
target_lang = target_lang.lower()
|
| 258 |
if target_lang in LANGUAGE_CODES:
|
| 259 |
target_lang = LANGUAGE_CODES[target_lang]
|
| 260 |
+
|
| 261 |
+
# Auto-detect source language if not provided
|
| 262 |
+
if not source_lang or source_lang.lower() == 'auto':
|
| 263 |
+
source_lang = detect_language(text)
|
| 264 |
|
| 265 |
translated = translate_text(text, target_lang, source_lang)
|
| 266 |
|
| 267 |
return jsonify({
|
| 268 |
"original_text": text,
|
| 269 |
"translated_text": translated,
|
| 270 |
+
"detected_source_lang": source_lang,
|
| 271 |
"target_lang": target_lang
|
| 272 |
})
|
| 273 |
|