ScamDetector / app.py
rafaldembski's picture
Update app.py
1a2fa7a verified
raw
history blame
6.79 kB
# app.py
import streamlit as st
from streamlit_option_menu import option_menu
from utils.functions import (
get_phone_info,
simple_checks,
analyze_message,
update_stats,
add_to_history,
is_fake_number,
add_fake_number
)
import os
# 1. Konfiguracja strony - musi by膰 pierwszym poleceniem Streamlit
st.set_page_config(
page_title="馃摫 Scam Detector",
page_icon="馃摫",
layout="wide"
)
# 2. Ukrycie bocznego menu Streamlit za pomoc膮 CSS
hide_sidebar_style = """
<style>
/* Ukryj boczne menu */
[data-testid="stSidebar"] {
display: none;
}
</style>
"""
st.markdown(hide_sidebar_style, unsafe_allow_html=True)
# 3. Definiowanie t艂umacze艅
translations = {
'Polish': {
'menu_analysis_sms': 'Analiza wiadomo艣ci',
'menu_about': 'O Projekcie',
'menu_education': 'Edukacja',
'menu_statistics': 'Statystyki',
'menu_contact': 'Kontakt',
'language_select': 'Wybierz j臋zyk / Sprache ausw盲hlen / Select language',
'separator': '---',
'language_selected': 'Wybrany j臋zyk: '
},
'German': {
'menu_analysis_sms': 'SMS-Analyse',
'menu_about': '脺ber das Projekt',
'menu_education': 'Bildung',
'menu_statistics': 'Statistiken',
'menu_contact': 'Kontakt',
'language_select': 'Wybierz j臋zyk / Sprache ausw盲hlen / Select language',
'separator': '---',
'language_selected': 'Ausgew盲hlte Sprache: '
},
'English': {
'menu_analysis_sms': 'SMS Analysis',
'menu_about': 'About the Project',
'menu_education': 'Education',
'menu_statistics': 'Statistics',
'menu_contact': 'Contact',
'language_select': 'Wybierz j臋zyk / Sprache ausw盲hlen / Select language',
'separator': '---',
'language_selected': 'Selected Language: '
}
}
# 4. Wyb贸r j臋zyka z flagami w jednym wierszu
if 'language' not in st.session_state:
st.session_state.language = 'Polish' # Ustawienie j臋zyka domy艣lnego na polski
# Nowy spos贸b na wyb贸r j臋zyka bez u偶ycia przycisk贸w "POST"
selected_language = st.selectbox(
translations[st.session_state.language]['language_select'],
options=['Polish', 'German', 'English'],
index=['Polish', 'German', 'English'].index(st.session_state.language)
)
# Zapis wybranego j臋zyka w sesji
st.session_state.language = selected_language
st.markdown(f"**{translations[selected_language]['language_selected']} {selected_language}**")
# Dodanie separatora pod wyborem j臋zyka
st.markdown("---")
# 5. Pobranie przet艂umaczonych opcji menu
menu_keys = [
'menu_analysis_sms',
'menu_about',
'menu_education',
'menu_statistics',
'menu_contact'
]
menu_options = [translations[selected_language][key] for key in menu_keys]
# 6. Dodanie niestandardowego CSS do wzmocnienia styl贸w menu
custom_css = """
<style>
/* Stylizacja kontenera menu */
.streamlit-option-menu {
display: flex;
justify-content: center;
align-items: center;
padding: 10px 0;
margin-bottom: 10px;
}
/* Stylizacja przycisk贸w w jasnym motywie */
html[data-theme="light"] .streamlit-option-menu {
background-color: #f0f0f0;
}
/* Stylizacja przycisk贸w w ciemnym motywie */
html[data-theme="dark"] .streamlit-option-menu {
background-color: #333;
}
/* Stylizacja przycisk贸w */
.streamlit-option-menu .nav-link {
font-size: 16px;
padding: 10px 20px;
margin: 0 5px;
background-color: transparent;
color: inherit;
border-radius: 5px;
transition: background-color 0.3s ease, color 0.3s ease;
cursor: pointer;
}
/* Efekt hover */
.streamlit-option-menu .nav-link:hover {
background-color: #02ab21;
color: #ffffff !important;
}
/* Stylizacja wybranego elementu */
.streamlit-option-menu .nav-link-selected {
background-color: #02ab21;
color: #ffffff !important;
border-radius: 5px;
}
/* Stylizacja ikonek */
.streamlit-option-menu .icon {
font-size: 18px;
color: inherit !important;
}
/* Responsywno艣膰 */
@media (max-width: 768px) {
.streamlit-option-menu {
flex-direction: column;
}
.streamlit-option-menu .nav-link {
margin: 5px 0;
width: 100%;
}
}
</style>
"""
st.markdown(custom_css, unsafe_allow_html=True)
# 7. Tworzenie poziomego menu w kontenerze
with st.container():
selected = option_menu(
menu_title=None, # Brak tytu艂u menu
options=menu_options,
icons=["shield-check", "info-circle", "book", "bar-chart", "envelope"],
menu_icon=None, # Usuni臋cie ikony menu
default_index=0,
orientation="horizontal",
styles={
"container": {"padding": "0!important", "background-color": "transparent"},
"icon": {"color": "inherit", "font-size": "18px"},
"nav-link": {
"font-size": "16px",
"text-align": "center",
"margin": "0px",
"padding": "10px 20px",
"border-radius": "5px",
"background-color": "transparent",
"color": "inherit",
"transition": "background-color 0.3s ease, color 0.3s ease"
},
"nav-link-selected": {
"background-color": "#02ab21",
"color": "#ffffff",
"border-radius": "5px",
"padding": "10px 20px"
},
}
)
# 8. Dodanie separatora
st.markdown("---") # Dodaje poziom膮 lini臋
# 9. Importowanie i wywo艂ywanie modu艂贸w dla ka偶dej zak艂adki
try:
if selected == translations[selected_language]['menu_analysis_sms']:
from pages.Analysis import show_analysis
show_analysis(selected_language)
elif selected == translations[selected_language]['menu_about']:
from pages.About import main as show_about
show_about(selected_language)
elif selected == translations[selected_language]['menu_education']:
from pages.Education import main as show_education
show_education(selected_language)
elif selected == translations[selected_language]['menu_statistics']:
from pages.Statistics import main as show_statistics
show_statistics(selected_language)
elif selected == translations[selected_language]['menu_contact']:
from pages.Contact import main as show_contact
show_contact(selected_language)
except ImportError as e:
st.error(f"Import error: {e}")
except TypeError as e:
st.error(f"Function call error: {e}")