import streamlit as st from utils.functions import ( get_phone_info, simple_checks, analyze_message, update_stats, add_to_history, is_fake_number, add_fake_number, get_email_info, analyze_url, extract_text_from_image, get_analysis_history, get_statistics ) import os import re import requests from phonenumbers import parse, is_valid_number, NumberParseException def extract_urls(text): url_pattern = re.compile(r'(https?://[^\s]+)|(www\.[^\s]+)') urls = url_pattern.findall(text) urls = [url[0] or url[1] for url in urls] return urls def check_urls_with_phishtank(urls): phishing_urls = [] for url in urls: params = {'format': 'json', 'url': url} try: response = requests.post('https://checkurl.phishtank.com/checkurl/', data=params) if response.status_code == 200: data = response.json() in_database = data.get('results', {}).get('in_database', False) valid = data.get('results', {}).get('valid', False) if in_database and valid: phishing_urls.append(url) else: st.warning(f"Błąd podczas sprawdzania URL w PhishTank: {response.status_code}") except Exception as e: st.error(f"Błąd podczas sprawdzania URL w PhishTank: {e}") return phishing_urls def check_urls_with_safe_browsing(urls): api_key = os.getenv('GOOGLE_SAFE_BROWSING_API_KEY') if not api_key: return None unsafe_urls = [] headers = {'Content-Type': 'application/json'} client_body = { 'client': { 'clientId': 'yourcompanyname', 'clientVersion': '1.0' }, 'threatInfo': { 'threatTypes': ["MALWARE", "SOCIAL_ENGINEERING", "UNWANTED_SOFTWARE", "POTENTIALLY_HARMFUL_APPLICATION"], 'platformTypes': ["ANY_PLATFORM"], 'threatEntryTypes': ["URL"], 'threatEntries': [{'url': url} for url in urls] } } try: response = requests.post( f'https://safebrowsing.googleapis.com/v4/threatMatches:find?key={api_key}', headers=headers, json=client_body ) if response.status_code == 200: data = response.json() matches = data.get('matches', []) unsafe_urls = [match['threat']['url'] for match in matches] else: st.error(f"Błąd podczas komunikacji z Google Safe Browsing API: {response.status_code}") except Exception as e: st.error(f"Błąd podczas sprawdzania URL w Google Safe Browsing: {e}") return unsafe_urls def analyze_sms(message, phone_number, additional_info, language): st.subheader(get_translation('sms_analysis_header', language)) # Informacje o numerze telefonu country, operator = get_phone_info(phone_number) if country and operator: st.write(get_translation('phone_info', language)) st.write(f"- **{get_translation('country_label', language)}:** {country}") st.write(f"- **{get_translation('operator_label', language)}:** {operator}") else: st.write(get_translation('unable_to_retrieve', language)) # Sprawdzenie, czy numer jest w bazie fałszywych numerów fraud_detected = is_fake_number(phone_number) if fraud_detected: st.warning(get_translation('number_reported_warning', language)) # Przeprowadź proste sprawdzenia heurystyczne warnings = simple_checks(message, language) if warnings: st.warning(get_translation('red_flags_found', language)) for warn in warnings: st.write(f"- {warn}") # Analiza URL urls = extract_urls(message) if urls: st.subheader(get_translation('url_analysis_header', language)) st.write(get_translation('extracted_urls', language)) for url in urls: st.write(f"- {url}") # Sprawdzanie URL w PhishTank phishing_urls_phishtank = check_urls_with_phishtank(urls) if phishing_urls_phishtank: st.warning(get_translation('phishtank_warning', language)) for url in phishing_urls_phishtank: st.write(f"- {url}") else: st.write(get_translation('no_phishtank_threats', language)) # Sprawdzanie URL w Google Safe Browsing phishing_urls_safe_browsing = check_urls_with_safe_browsing(urls) if phishing_urls_safe_browsing is None: st.warning(get_translation('api_key_missing', language).format('Google Safe Browsing')) elif phishing_urls_safe_browsing: st.warning(get_translation('safe_browsing_warning', language)) for url in phishing_urls_safe_browsing: st.write(f"- {url}") else: st.write(get_translation('no_safe_browsing_threats', language)) else: st.write(get_translation('no_urls_found', language)) # Analiza wiadomości z użyciem modelu AI api_key = os.getenv('SAMBANOVA_API_KEY') if not api_key: st.error(get_translation('api_key_missing', language).format('SambaNova')) else: with st.spinner(get_translation('analyzing_message', language)): try: analysis_text, risk_text, recommendations_text = analyze_message( message, phone_number, additional_info, api_key, language ) st.subheader(get_translation('message_analysis_header', language)) st.markdown(analysis_text) st.subheader(get_translation('risk_assessment_header', language)) st.markdown(risk_text) st.subheader(get_translation('user_recommendations_header', language)) st.markdown(recommendations_text) # Aktualizacja statystyk na podstawie oceny ryzyka try: match = re.search(r'(\d+)/10', risk_text) fraud_detected = int(match.group(1)) >= 7 if match else fraud_detected update_stats(fraud_detected=fraud_detected) except Exception as e: st.error(f"Błąd podczas aktualizacji statystyk: {e}") # Dodanie analizy do historii add_to_history(message, phone_number, analysis_text, risk_text, recommendations_text) except Exception as e: st.error(f"Błąd podczas analizy wiadomości: {e}") st.info(get_translation('remember_caution', language)) # Zgłoszenie numeru jako oszustwo if fraud_detected: if st.button(get_translation('report_button', language)): try: parsed_number = parse(phone_number, None) if is_valid_number(parsed_number): success = add_fake_number(phone_number) if success: st.success(get_translation('number_reported', language)) else: st.info(get_translation('number_already_reported', language)) else: st.error(get_translation('invalid_number', language)) except NumberParseException: st.error(get_translation('failed_to_parse', language)) def analyze_email(email_content, sender_email, language): st.subheader(get_translation('email_analysis_header', language)) # Informacje o adresie e-mail nadawcy domain_info = get_email_info(sender_email) if domain_info: st.write(get_translation('email_sender_info', language)) st.write(f"- **{get_translation('domain_label', language)}:** {domain_info['domain']}") st.write(f"- **{get_translation('organization_label', language)}:** {domain_info['organization']}") st.write(f"- **{get_translation('country_label', language)}:** {domain_info['country']}") else: st.write(get_translation('unable_to_retrieve_email', language)) # Przeprowadź proste sprawdzenia heurystyczne warnings = simple_checks(email_content, language) if warnings: st.warning(get_translation('red_flags_found', language)) for warn in warnings: st.write(f"- {warn}") # Analiza URL urls = extract_urls(email_content) if urls: st.subheader(get_translation('url_analysis_header', language)) st.write(get_translation('extracted_urls', language)) for url in urls: st.write(f"- {url}") # Sprawdzanie URL w PhishTank phishing_urls_phishtank = check_urls_with_phishtank(urls) if phishing_urls_phishtank: st.warning(get_translation('phishtank_warning', language)) for url in phishing_urls_phishtank: st.write(f"- {url}") else: st.write(get_translation('no_phishtank_threats', language)) # Sprawdzanie URL w Google Safe Browsing phishing_urls_safe_browsing = check_urls_with_safe_browsing(urls) if phishing_urls_safe_browsing is None: st.warning(get_translation('api_key_missing', language).format('Google Safe Browsing')) elif phishing_urls_safe_browsing: st.warning(get_translation('safe_browsing_warning', language)) for url in phishing_urls_safe_browsing: st.write(f"- {url}") else: st.write(get_translation('no_safe_browsing_threats', language)) else: st.write(get_translation('no_urls_found', language)) # Analiza wiadomości z użyciem modelu AI api_key = os.getenv('SAMBANOVA_API_KEY') if not api_key: st.error(get_translation('api_key_missing', language).format('SambaNova')) else: with st.spinner(get_translation('analyzing_message', language)): try: analysis_text, risk_text, recommendations_text = analyze_message( email_content, sender_email, "", api_key, language ) st.subheader(get_translation('message_analysis_header', language)) st.markdown(analysis_text) st.subheader(get_translation('risk_assessment_header', language)) st.markdown(risk_text) st.subheader(get_translation('user_recommendations_header', language)) st.markdown(recommendations_text) # Aktualizacja statystyk na podstawie oceny ryzyka try: match = re.search(r'(\d+)/10', risk_text) fraud_detected = int(match.group(1)) >= 7 if match else False update_stats(fraud_detected=fraud_detected) except Exception as e: st.error(f"Błąd podczas aktualizacji statystyk: {e}") # Dodanie analizy do historii add_to_history(email_content, sender_email, analysis_text, risk_text, recommendations_text) except Exception as e: st.error(f"Błąd podczas analizy wiadomości: {e}") st.info(get_translation('remember_caution', language)) def analyze_website(url, language): st.subheader(get_translation('website_analysis_header', language)) # Sprawdzanie URL w PhishTank phishing_urls_phishtank = check_urls_with_phishtank([url]) if phishing_urls_phishtank: st.warning(get_translation('phishtank_warning', language)) st.write(f"- {url}") else: st.write(get_translation('no_phishtank_threats', language)) # Sprawdzanie URL w Google Safe Browsing phishing_urls_safe_browsing = check_urls_with_safe_browsing([url]) if phishing_urls_safe_browsing is None: st.warning(get_translation('api_key_missing', language).format('Google Safe Browsing')) elif phishing_urls_safe_browsing: st.warning(get_translation('safe_browsing_warning', language)) st.write(f"- {url}") else: st.write(get_translation('no_safe_browsing_threats', language)) # Analiza treści strony try: page_content = analyze_url(url) st.subheader(get_translation('website_content_analysis', language)) st.write(page_content) except Exception as e: st.error(f"Błąd podczas pobierania zawartości strony: {e}") def analyze_phone_number(phone_number, language): st.subheader(get_translation('phone_number_analysis_header', language)) # Informacje o numerze telefonu country, operator = get_phone_info(phone_number) if country and operator: st.write(get_translation('phone_info', language)) st.write(f"- **{get_translation('country_label', language)}:** {country}") st.write(f"- **{get_translation('operator_label', language)}:** {operator}") else: st.write(get_translation('unable_to_retrieve', language)) # Sprawdzenie, czy numer jest w bazie fałszywych numerów if is_fake_number(phone_number): st.warning(get_translation('number_reported_warning', language)) else: st.info(get_translation('number_not_reported', language)) def analyze_image(image_file, language): st.subheader(get_translation('image_analysis_header', language)) # Wyświetlenie obrazu st.image(image_file) # Ekstrakcja tekstu z obrazu try: extracted_text = extract_text_from_image(image_file) st.write(get_translation('extracted_text', language)) st.write(extracted_text) # Analiza wyodrębnionego tekstu analyze_sms(extracted_text, "", "", language) except Exception as e: st.error(f"Błąd podczas analizy obrazu: {e}") def show_history(language): st.subheader(get_translation('history_header', language)) # Zakładamy, że funkcja `get_analysis_history` zwraca listę analiz history = get_analysis_history() if history: for record in history: st.write(f"**{get_translation('date_label', language)}:** {record['date']}") st.write(f"**{get_translation('analysis_type_label', language)}:** {record['type']}") st.write(f"**{get_translation('details_label', language)}:** {record['details']}") st.markdown("---") else: st.write(get_translation('no_history', language)) def show_statistics(language): st.subheader(get_translation('statistics_header', language)) # Zakładamy, że funkcja `get_statistics` zwraca słownik ze statystykami stats = get_statistics() st.write(f"{get_translation('total_analyses', language)}: **{stats['total']}**") st.write(f"{get_translation('fraud_detected', language)}: **{stats['fraud']}**") st.write(f"{get_translation('safe_detected', language)}: **{stats['safe']}**") def get_translation(key, language): translations = { 'Polish': { 'analysis_center_title': "Centrum Analizy", 'select_analysis_type': "Wybierz typ analizy:", 'sms_analysis': "Analiza SMS", 'email_analysis': "Analiza E-mail", 'website_analysis': "Analiza Strony Internetowej", 'phone_number_analysis': "Analiza Numeru Telefonu", 'image_analysis': "Analiza Obrazu", 'history': "Historia Analiz", 'statistics': "Statystyki", 'sms_analysis_header': "Analiza SMS", 'email_analysis_header': "Analiza E-mail", 'website_analysis_header': "Analiza Strony Internetowej", 'phone_number_analysis_header': "Analiza Numeru Telefonu", 'image_analysis_header': "Analiza Obrazu", 'enter_sms_content': "Wprowadź treść SMS", 'sender_phone_number': "Numer telefonu nadawcy (z kodem kierunkowym kraju, np. +48123456789)", 'analyze_button': "Analizuj", 'enter_email_content': "Wprowadź treść e-maila", 'sender_email_address': "Adres e-mail nadawcy", 'enter_website_url': "Wprowadź adres URL strony do analizy", 'upload_image': "Prześlij obraz do analizy", 'no_image_selected': "Proszę wybrać obraz do analizy.", 'enter_phone_number': "Wprowadź numer telefonu do analizy", 'email_sender_info': "Informacje o nadawcy e-mail:", 'domain_label': "Domena", 'organization_label': "Organizacja", 'unable_to_retrieve_email': "Nie można uzyskać informacji o nadawcy e-mail.", 'phone_info': "Informacje o numerze telefonu:", 'country_label': "Kraj", 'operator_label': "Operator", 'unable_to_retrieve': "Nie można uzyskać informacji o numerze telefonu.", 'number_reported_warning': "Ostrzeżenie: Ten numer został wcześniej zgłoszony jako oszustwo!", 'number_not_reported': "Ten numer nie został zgłoszony jako oszustwo.", 'red_flags_found': "Znaleziono następujące potencjalne czerwone flagi:", 'url_analysis_header': "Analiza URL", 'extracted_urls': "Wyodrębnione URL z treści:", 'phishtank_warning': "Następujące URL są oznaczone jako phishing przez PhishTank:", 'no_phishtank_threats': "Brak zagrożeń phishingowych według PhishTank.", 'api_key_missing': "Brak klucza API dla usługi: {}.", 'safe_browsing_warning': "Następujące URL są oznaczone jako niebezpieczne przez Google Safe Browsing:", 'no_safe_browsing_threats': "Brak zagrożeń według Google Safe Browsing.", 'no_urls_found': "Brak URL w treści.", 'analyzing_message': "Analizowanie treści za pomocą modelu AI...", 'message_analysis_header': "Analiza treści:", 'risk_assessment_header': "Ocena ryzyka oszustwa:", 'user_recommendations_header': "Zalecenia dla użytkownika:", 'remember_caution': "📌 Pamiętaj: Bądź ostrożny z komunikacjami od nieznanych nadawców.", 'report_button': "Zgłoś numer jako oszustwo", 'number_reported': "Numer został zgłoszony jako oszustwo.", 'number_already_reported': "Numer został już wcześniej zgłoszony jako oszustwo.", 'invalid_number': "Podany numer telefonu jest nieprawidłowy.", 'failed_to_parse': "Nie udało się przetworzyć numeru telefonu. Upewnij się, że jest w poprawnym formacie.", 'website_content_analysis': "Analiza zawartości strony:", 'extracted_text': "Wyodrębniony tekst z obrazu:", 'history_header': "Historia Analiz", 'no_history': "Brak zapisanej historii analiz.", 'statistics_header': "Statystyki", 'total_analyses': "Łączna liczba analiz", 'fraud_detected': "Wykryte oszustwa", 'safe_detected': "Bezpieczne przypadki", 'date_label': "Data", 'analysis_type_label': "Typ Analizy", 'details_label': "Szczegóły", }, 'English': { 'analysis_center_title': "Analysis Center", 'select_analysis_type': "Select analysis type:", 'sms_analysis': "SMS Analysis", 'email_analysis': "Email Analysis", 'website_analysis': "Website Analysis", 'phone_number_analysis': "Phone Number Analysis", 'image_analysis': "Image Analysis", 'history': "Analysis History", 'statistics': "Statistics", 'sms_analysis_header': "SMS Analysis", 'email_analysis_header': "Email Analysis", 'website_analysis_header': "Website Analysis", 'phone_number_analysis_header': "Phone Number Analysis", 'image_analysis_header': "Image Analysis", 'enter_sms_content': "Enter SMS content", 'sender_phone_number': "Sender's phone number (with country code, e.g., +123456789)", 'analyze_button': "Analyze", 'enter_email_content': "Enter email content", 'sender_email_address': "Sender's email address", 'enter_website_url': "Enter website URL to analyze", 'upload_image': "Upload image for analysis", 'no_image_selected': "Please select an image to analyze.", 'enter_phone_number': "Enter phone number to analyze", 'email_sender_info': "Email sender information:", 'domain_label': "Domain", 'organization_label': "Organization", 'unable_to_retrieve_email': "Unable to retrieve email sender information.", 'phone_info': "Phone number information:", 'country_label': "Country", 'operator_label': "Operator", 'unable_to_retrieve': "Unable to retrieve phone number information.", 'number_reported_warning': "Warning: This number has been previously reported as fraud!", 'number_not_reported': "This number has not been reported as fraud.", 'red_flags_found': "The following potential red flags were found:", 'url_analysis_header': "URL Analysis", 'extracted_urls': "Extracted URLs from the content:", 'phishtank_warning': "The following URLs are flagged as phishing by PhishTank:", 'no_phishtank_threats': "No phishing threats detected by PhishTank.", 'api_key_missing': "API key missing for service: {}.", 'safe_browsing_warning': "The following URLs are flagged as unsafe by Google Safe Browsing:", 'no_safe_browsing_threats': "No threats detected by Google Safe Browsing.", 'no_urls_found': "No URLs found in the content.", 'analyzing_message': "Analyzing content using AI model...", 'message_analysis_header': "Content Analysis:", 'risk_assessment_header': "Fraud Risk Assessment:", 'user_recommendations_header': "User Recommendations:", 'remember_caution': "📌 Remember: Be cautious with communications from unknown senders.", 'report_button': "Report number as fraud", 'number_reported': "Number has been reported as fraud.", 'number_already_reported': "Number has already been reported as fraud.", 'invalid_number': "The provided phone number is invalid.", 'failed_to_parse': "Failed to parse the phone number. Ensure it is in the correct format.", 'website_content_analysis': "Website content analysis:", 'extracted_text': "Extracted text from image:", 'history_header': "Analysis History", 'no_history': "No analysis history found.", 'statistics_header': "Statistics", 'total_analyses': "Total analyses", 'fraud_detected': "Frauds detected", 'safe_detected': "Safe cases", 'date_label': "Date", 'analysis_type_label': "Analysis Type", 'details_label': "Details", }, 'German': { 'analysis_center_title': "Analysezentrum", 'select_analysis_type': "Wählen Sie den Analysetyp:", 'sms_analysis': "SMS-Analyse", 'email_analysis': "E-Mail-Analyse", 'website_analysis': "Website-Analyse", 'phone_number_analysis': "Telefonnummernanalyse", 'image_analysis': "Bildanalyse", 'history': "Analyseverlauf", 'statistics': "Statistiken", 'sms_analysis_header': "SMS-Analyse", 'email_analysis_header': "E-Mail-Analyse", 'website_analysis_header': "Website-Analyse", 'phone_number_analysis_header': "Telefonnummernanalyse", 'image_analysis_header': "Bildanalyse", 'enter_sms_content': "SMS-Inhalt eingeben", 'sender_phone_number': "Telefonnummer des Absenders (mit Ländercode, z.B. +49123456789)", 'analyze_button': "Analysieren", 'enter_email_content': "E-Mail-Inhalt eingeben", 'sender_email_address': "E-Mail-Adresse des Absenders", 'enter_website_url': "Zu analysierende Website-URL eingeben", 'upload_image': "Bild für die Analyse hochladen", 'no_image_selected': "Bitte wählen Sie ein Bild zur Analyse aus.", 'enter_phone_number': "Telefonnummer zur Analyse eingeben", 'email_sender_info': "Informationen zum E-Mail-Absender:", 'domain_label': "Domain", 'organization_label': "Organisation", 'unable_to_retrieve_email': "Informationen zum E-Mail-Absender können nicht abgerufen werden.", 'phone_info': "Informationen zur Telefonnummer:", 'country_label': "Land", 'operator_label': "Anbieter", 'unable_to_retrieve': "Informationen zur Telefonnummer können nicht abgerufen werden.", 'number_reported_warning': "Warnung: Diese Nummer wurde bereits als Betrug gemeldet!", 'number_not_reported': "Diese Nummer wurde nicht als Betrug gemeldet.", 'red_flags_found': "Die folgenden potenziellen Warnsignale wurden gefunden:", 'url_analysis_header': "URL-Analyse", 'extracted_urls': "Extrahierte URLs aus dem Inhalt:", 'phishtank_warning': "Die folgenden URLs wurden von PhishTank als Phishing markiert:", 'no_phishtank_threats': "Keine Phishing-Bedrohungen von PhishTank erkannt.", 'api_key_missing': "API-Schlüssel für Dienst fehlt: {}.", 'safe_browsing_warning': "Die folgenden URLs wurden von Google Safe Browsing als unsicher markiert:", 'no_safe_browsing_threats': "Keine Bedrohungen von Google Safe Browsing erkannt.", 'no_urls_found': "Keine URLs im Inhalt gefunden.", 'analyzing_message': "Analyse des Inhalts mit KI-Modell...", 'message_analysis_header': "Inhaltsanalyse:", 'risk_assessment_header': "Betrugsrisikobewertung:", 'user_recommendations_header': "Empfehlungen für den Benutzer:", 'remember_caution': "📌 Denken Sie daran: Seien Sie vorsichtig mit Mitteilungen von unbekannten Absendern.", 'report_button': "Nummer als Betrug melden", 'number_reported': "Nummer wurde als Betrug gemeldet.", 'number_already_reported': "Nummer wurde bereits als Betrug gemeldet.", 'invalid_number': "Die angegebene Telefonnummer ist ungültig.", 'failed_to_parse': "Die Telefonnummer konnte nicht verarbeitet werden. Stellen Sie sicher, dass sie im richtigen Format vorliegt.", 'website_content_analysis': "Analyse des Website-Inhalts:", 'extracted_text': "Aus dem Bild extrahierter Text:", 'history_header': "Analyseverlauf", 'no_history': "Kein Analyseverlauf gefunden.", 'statistics_header': "Statistiken", 'total_analyses': "Gesamtzahl der Analysen", 'fraud_detected': "Erkannte Betrugsfälle", 'safe_detected': "Sichere Fälle", 'date_label': "Datum", 'analysis_type_label': "Analysetyp", 'details_label': "Details", } } return translations.get(language, translations['English']).get(key, key) def show_analysis(language): st.title(get_translation('analysis_center_title', language)) analysis_options = [ get_translation('sms_analysis', language), get_translation('email_analysis', language), get_translation('website_analysis', language), get_translation('phone_number_analysis', language), get_translation('image_analysis', language), get_translation('history', language), get_translation('statistics', language) ] selected_analysis = st.radio( get_translation('select_analysis_type', language), analysis_options ) if selected_analysis == get_translation('sms_analysis', language): with st.form("sms_form"): message = st.text_area(get_translation('enter_sms_content', language), height=150) phone_number = st.text_input(get_translation('sender_phone_number', language)) submitted = st.form_submit_button(get_translation('analyze_button', language)) if submitted: if not message.strip(): st.error(get_translation('enter_sms_content', language)) elif not phone_number.strip(): st.error(get_translation('sender_phone_number', language)) else: additional_info = "" analyze_sms(message, phone_number, additional_info, language) elif selected_analysis == get_translation('email_analysis', language): with st.form("email_form"): email_content = st.text_area(get_translation('enter_email_content', language), height=150) sender_email = st.text_input(get_translation('sender_email_address', language)) submitted = st.form_submit_button(get_translation('analyze_button', language)) if submitted: if not email_content.strip(): st.error(get_translation('enter_email_content', language)) elif not sender_email.strip(): st.error(get_translation('sender_email_address', language)) else: analyze_email(email_content, sender_email, language) elif selected_analysis == get_translation('website_analysis', language): with st.form("website_form"): url = st.text_input(get_translation('enter_website_url', language)) submitted = st.form_submit_button(get_translation('analyze_button', language)) if submitted: if not url.strip(): st.error(get_translation('enter_website_url', language)) else: analyze_website(url, language) elif selected_analysis == get_translation('phone_number_analysis', language): with st.form("phone_number_form"): phone_number = st.text_input(get_translation('enter_phone_number', language)) submitted = st.form_submit_button(get_translation('analyze_button', language)) if submitted: if not phone_number.strip(): st.error(get_translation('enter_phone_number', language)) else: analyze_phone_number(phone_number, language) elif selected_analysis == get_translation('image_analysis', language): with st.form("image_form"): image_file = st.file_uploader(get_translation('upload_image', language), type=['png', 'jpg', 'jpeg']) submitted = st.form_submit_button(get_translation('analyze_button', language)) if submitted: if image_file is None: st.error(get_translation('no_image_selected', language)) else: analyze_image(image_file, language) elif selected_analysis == get_translation('history', language): show_history(language) elif selected_analysis == get_translation('statistics', language): show_statistics(language)