Rizzhi commited on
Commit
76840ea
·
verified ·
1 Parent(s): 54de1a2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +401 -84
app.py CHANGED
@@ -13,31 +13,12 @@ import requests
13
  import random
14
  import enum
15
 
16
- # No AI imports for this test
17
  # from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
18
- # import torch
19
 
20
- # --- Language Options (MOVED TO TOP) ---
21
- APP_LANGUAGES = ["English", "Hindi", "Telugu"]
22
-
23
- # --- MULTILINGUAL IDIOM DATA (MOVED TO TOP) ---
24
- # Minimal data for test to reduce loading time/complexity
25
- IDIOMS_DATA = {
26
- "Telugu": [{"idiom": "కళ్లు కాయలు కాసేలా చూడటం", "clue": "చాలా కాలం వేచి ఉండటం.", "meaning_for_ai": "చాలా కాలం వేచి ఉండటం, కళ్ళు కాయలు కాసేంత వరకు చూడటం, అనగా ఒక విషయం కోసం చాలా ఆసక్తిగా ఎదురుచూడటం."}],
27
- "Hindi": [{"idiom": "हाथी के दांत खाने के और, दिखाने के और", "clue": "जो दिखता है, वह होता नहीं.", "meaning_for_ai": "जो चीज़ दिखती है, वह असलियत में नहीं होती; कथनी और करनी में अंतर होना, पाखंड करना।"}],
28
- "English": [{"idiom": "Break a leg", "clue": "To wish someone good luck.", "meaning_for_ai": "An idiomatic expression used in theater and other performing arts to wish a performer good luck."}],
29
- }
30
-
31
- # NEW: MULTILINGUAL STORY STARTERS DATA (MOVED TO TOP)
32
- # Minimal data for test
33
- STORY_STARTERS_DATA = {
34
- "Telugu": [{"starter": "పురాతన పల్లెటూరిలో, ఒక వృద్ధురాలు అరణ్యంలో ఒక వింత కాంతిని చూసింది...", "meaning_for_ai": "In an ancient village, an old woman saw a strange light in the forest..."}],
35
- "Hindi": [{"starter": "पुराने गाँव में, एक बूढ़ी औरत ने जंगल में एक अजीब रोशनी देखी...", "meaning_for_ai": "In an ancient village, an old woman saw a strange light in the forest..."}],
36
- "English": [{"starter": "The old woman found a peculiar, glowing stone at the bottom of the ancient well...", "meaning_for_ai": "A fantasy/mystery starter."}],
37
- }
38
-
39
- # No AI model setup for this test
40
- # tokenizer_ai, model_ai = load_summarizer_components()
41
 
42
 
43
  class GameType(enum.Enum):
@@ -58,7 +39,7 @@ def get_engine(_db_url):
58
  try:
59
  engine = create_engine(_db_url)
60
  with engine.connect() as connection:
61
- pass # Just test connection, no complex DDL
62
  return engine
63
  except Exception as e:
64
  st.error(f"FATAL ERROR: Could not connect to database on startup: {e}")
@@ -73,7 +54,9 @@ def get_session_local(_engine):
73
  Engine = get_engine(DATABASE_URL)
74
  SessionLocal = get_session_local(Engine)
75
 
76
- # --- Database Models (Needed for Base.metadata.create_all) ---
 
 
77
  class User(Base):
78
  __tablename__ = "users"
79
  id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
@@ -81,6 +64,12 @@ class User(Base):
81
  hashed_password = Column(String, nullable=False)
82
  created_at = Column(DateTime, default=datetime.now)
83
 
 
 
 
 
 
 
84
  class LoreEntry(Base):
85
  __tablename__ = "lore_entries"
86
  id = Column(Integer, primary_key=True, index=True)
@@ -100,32 +89,223 @@ class GameResponse(Base):
100
  id = Column(Integer, primary_key=True, index=True)
101
  user_id = Column(String, nullable=False)
102
  game_type = Column(Enum(GameType), nullable=False)
103
- question_text = Column(Text, nullable=False)
104
- user_response = Column(Text, nullable=False)
105
- is_correct = Column(Boolean, nullable=True)
106
- score = Column(Integer, default=0)
107
- user_explanation = Column(Text, nullable=True)
108
  language = Column(String, nullable=False)
109
  timestamp = Column(DateTime, default=datetime.now)
110
 
111
  # Create tables if they don't exist
112
  Base.metadata.create_all(bind=Engine)
113
 
114
-
115
  # --- Session State Initialization ---
116
  if 'user_id' not in st.session_state: st.session_state.user_id = None
117
  if 'username' not in st.session_state: st.session_state.username = None
 
 
 
 
 
 
 
 
 
 
118
  if 'user_app_language' not in st.session_state: st.session_state.user_app_language = "English"
119
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
 
121
- # --- UI Strings Dictionary (MINIMAL for this test, but includes `choose_language_label`) ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
  UI_STRINGS = {
123
  "English": {
124
- "choose_language_label": "Choose your language for the app experience:",
125
- "intro_text": "Hey gang! Welcome to FillMyBlank.ai - Core UI Test!",
126
- "built_with_love": "💖 Built with ❤️ for FillMyBlank.ai",
127
- # Add other essential strings as they are encountered in next steps
128
- "user_account_title": "User Account", # Included for future-proofing sidebar tests
129
  "logged_in_as": "Logged in as",
130
  "logout_button": "Logout",
131
  "login_register_subheader": "Login / Register",
@@ -143,13 +323,70 @@ UI_STRINGS = {
143
  "please_login_msg": " registered successfully! Please login.",
144
  "username_exists_error": "Username already exists. Please choose a different one.",
145
  "registration_error": "An error occurred during registration",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  "logged_out_success": "Logged out successfully!",
 
 
 
 
 
 
 
 
 
 
 
 
 
147
  },
148
  "Telugu": {
149
- "choose_language_label": "యాప్ అనుభవం కోసం మీ భాషను ఎంచుకోండి:",
150
- "intro_text": "హలో గ్యాంగ్! ఇది FillMyBlank.ai - కోర్ UI టెస్ట్!",
151
- "built_with_love": "💖 FillMyBlank.ai కోసం ప్రేమతో రూపొందించబడింది",
152
- # Add other essential strings
153
  "user_account_title": "వినియోగదారు ఖాతా",
154
  "logged_in_as": "లాగిన్ అయ్యారు",
155
  "logout_button": "లాగ్ అవుట్",
@@ -168,13 +405,70 @@ UI_STRINGS = {
168
  "please_login_msg": " విజయవంతంగా నమోదు చేయబడింది! దయచేసి లాగిన్ చేయండి.",
169
  "username_exists_error": "వినియోగదారు పేరు ఇప్పటికే ఉంది. దయచేసి మరొకటి ఎంచుకోండి.",
170
  "registration_error": "నమోదు సమయంలో లోపం సంభవించింది",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
171
  "logged_out_success": "విజయవంతంగా లాగ్ అవుట్ అయ్యారు!",
 
 
 
 
 
 
 
 
 
 
 
 
 
172
  },
173
  "Hindi": {
174
- "choose_language_label": "ऐप अनुभव के लिए अपनी भाषा चुनें:",
175
- "intro_text": "नमस्ते गैंग! यह FillMyBlank.ai - कोर UI टेस्ट है!",
176
- "built_with_love": "💖 FillMyBlank.ai के लिए प्यार से बनाया गया",
177
- # Add other essential strings
178
  "user_account_title": "उपयोगकर्ता खाता",
179
  "logged_in_as": "के रूप में लॉग इन किया गया",
180
  "logout_button": "लॉग आउट",
@@ -193,44 +487,67 @@ UI_STRINGS = {
193
  "please_login_msg": " सफलतापूर्वक पंजीकृत! कृपया लॉगिन करें।",
194
  "username_exists_error": "उपयोगकर्ता नाम पहले से मौजूद है। कृपया कोई दूसरा चुनें।",
195
  "registration_error": "पंजीकरण के दौरान एक त्रुटि हुई",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
196
  "logged_out_success": "सफलतापूर्वक लॉग आउट हो गए!",
 
 
 
 
 
 
 
 
 
 
 
 
 
197
  }
198
- }
199
-
200
- # Helper to get strings for current language
201
- def get_string(key):
202
- return UI_STRINGS.get(st.session_state.user_app_language, UI_STRINGS["English"]).get(key, UI_STRINGS["English"][key])
203
-
204
-
205
- # --- Streamlit App ---
206
-
207
- st.set_page_config(
208
- page_title="FillMyBlank.ai: Core UI Test",
209
- page_icon="📜",
210
- layout="centered"
211
- )
212
-
213
- st.title("📜 FillMyBlank.ai: Local Lore Collector")
214
- st.markdown("---")
215
-
216
- # Global Language Selector
217
- st.session_state.user_app_language = st.selectbox(
218
- get_string("choose_language_label"),
219
- options=APP_LANGUAGES,
220
- index=APP_LANGUAGES.index(st.session_state.user_app_language),
221
- key="global_language_selector"
222
- )
223
- st.markdown("---")
224
-
225
- st.markdown(get_string("intro_text"))
226
-
227
- st.markdown("---")
228
- st.markdown(get_string("built_with_love"))
229
-
230
- # --- PLACEHOLDER FOR NEXT STEPS ---
231
- # Here's where we will add back:
232
- # 1. Sidebar Login/Register UI
233
- # 2. Main Content Tabs (Contribute Lore, Games, Leaderboard)
234
- # 3. Lore Contribution Form and Logic
235
- # 4. Game Logic (Idiom Guesser, Story Completion)
236
- # 5. Leaderboard Display
 
13
  import random
14
  import enum
15
 
16
+ # Removed: AI-specific imports to temporarily disable AI features for full app functionality
17
  # from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
18
+ # Removed: import torch
19
 
20
+ # Removed: AI Model Setup and caching
21
+ # Removed: tokenizer_ai, model_ai = load_summarizer_components()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
 
24
  class GameType(enum.Enum):
 
39
  try:
40
  engine = create_engine(_db_url)
41
  with engine.connect() as connection:
42
+ pass
43
  return engine
44
  except Exception as e:
45
  st.error(f"FATAL ERROR: Could not connect to database on startup: {e}")
 
54
  Engine = get_engine(DATABASE_URL)
55
  SessionLocal = get_session_local(Engine)
56
 
57
+
58
+ # --- Database Models ---
59
+
60
  class User(Base):
61
  __tablename__ = "users"
62
  id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
 
64
  hashed_password = Column(String, nullable=False)
65
  created_at = Column(DateTime, default=datetime.now)
66
 
67
+ def set_password(self, password):
68
+ self.hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
69
+
70
+ def check_password(self, password):
71
+ return bcrypt.checkpw(password.encode('utf-8'), self.hashed_password.encode('utf-8'))
72
+
73
  class LoreEntry(Base):
74
  __tablename__ = "lore_entries"
75
  id = Column(Integer, primary_key=True, index=True)
 
89
  id = Column(Integer, primary_key=True, index=True)
90
  user_id = Column(String, nullable=False)
91
  game_type = Column(Enum(GameType), nullable=False)
92
+ question_text = Column(Text, nullable=False) # E.g., idiom / story starter
93
+ user_response = Column(Text, nullable=False) # E.g., user's situation / story continuation
94
+ is_correct = Column(Boolean, nullable=True) # For guess-based games (will be None for story/situation games)
95
+ score = Column(Integer, default=0) # Points awarded
96
+ user_explanation = Column(Text, nullable=True) # Used for idiom definition or situations now
97
  language = Column(String, nullable=False)
98
  timestamp = Column(DateTime, default=datetime.now)
99
 
100
  # Create tables if they don't exist
101
  Base.metadata.create_all(bind=Engine)
102
 
 
103
  # --- Session State Initialization ---
104
  if 'user_id' not in st.session_state: st.session_state.user_id = None
105
  if 'username' not in st.session_state: st.session_state.username = None
106
+
107
+ if 'register_username_input_value' not in st.session_state: st.session_state.register_username_input_value = ""
108
+ if 'register_password_input_value' not in st.session_state: st.session_state.register_password_input_value = ""
109
+
110
+ # Game specific session state
111
+ if 'current_idiom' not in st.session_state: st.session_state.current_idiom = None
112
+ if 'game_score' not in st.session_state: st.session_state.game_score = 0
113
+ if 'idiom_game_state' not in st.session_state: st.session_state.idiom_game_state = "initial"
114
+ if 'current_story_starter' not in st.session_state: st.session_state.current_story_starter = None
115
+ if 'story_game_state' not in st.session_state: st.session_state.story_game_state = "initial"
116
  if 'user_app_language' not in st.session_state: st.session_state.user_app_language = "English"
117
 
118
+ # Lore Contribution Form Session State
119
+ if "lore_text_input_value" not in st.session_state: st.session_state.lore_text_input_value = ""
120
+ if "language_select_value" not in st.session_state: st.session_state.language_select_value = "Select Language"
121
+ if "region_select_value" not in st.session_state: st.session_state.region_select_value = "Select State"
122
+ if "lore_type_select_value" not in st.session_state: st.session_state.lore_type_select_value = "Select Type"
123
+ if "nickname_input_value" not in st.session_state: st.session_state.nickname_input_value = ""
124
+ if "agree_to_location_checkbox_value" not in st.session_state: st.session_state.agree_to_location_checkbox_value = False
125
+
126
+ # Idiom Game Specific Widget Keys
127
+ if 'idiom_guess_input' not in st.session_state: st.session_state.idiom_guess_input = ""
128
+ if 'idiom_situations_input' not in st.session_state: st.session_state.idiom_situations_input = ""
129
+ if 'idiom_hint_shown' not in st.session_state: st.session_state.idiom_hint_shown = False
130
+ if 'idiom_explanation_input' not in st.session_state: st.session_state.idiom_explanation_input = ""
131
+ if 'explanation_language_select' not in st.session_state: st.session_state.explanation_language_select = "English"
132
+
133
+ # Story Game Specific Widget Keys
134
+ if 'story_continuation_input' not in st.session_state: st.session_state.story_continuation_input = ""
135
+
136
+
137
+ # --- Helper Functions ---
138
+
139
+ def get_db():
140
+ db = SessionLocal()
141
+ try:
142
+ yield db
143
+ finally:
144
+ db.close()
145
+
146
+ def create_user(username, password):
147
+ db = next(get_db())
148
+ existing_user = db.query(User).filter(User.username == username).first()
149
+ if existing_user:
150
+ return None
151
+ new_user = User(username=username)
152
+ new_user.set_password(password)
153
+ db.add(new_user)
154
+ try:
155
+ db.commit()
156
+ db.refresh(new_user)
157
+ return new_user
158
+ except IntegrityError:
159
+ db.rollback()
160
+ return None
161
+ except Exception as e:
162
+ db.rollback()
163
+ st.error(f"An error occurred during registration: {e}")
164
+ return None
165
+
166
+
167
+ def authenticate_user(username, password):
168
+ db = next(get_db())
169
+ user = db.query(User).filter(User.username == username).first()
170
+
171
+ if not user:
172
+ return None
173
+
174
+ if user.check_password(password):
175
+ return user
176
+ else:
177
+ return None
178
+
179
+ def save_lore_data_to_db(entry_data):
180
+ db = next(get_db())
181
+ new_lore = LoreEntry(**entry_data)
182
+ db.add(new_lore)
183
+ db.commit()
184
+ db.refresh(new_lore)
185
+ return new_lore
186
+
187
+ def load_lore_data_from_db(limit=10):
188
+ db = next(get_db())
189
+ return db.query(LoreEntry).order_by(LoreEntry.timestamp.desc()).limit(limit).all()
190
+
191
+ def load_user_lore_from_db(user_id, limit=10):
192
+ db = next(get_db())
193
+ return db.query(LoreEntry).filter(LoreEntry.user_id == user_id).order_by(LoreEntry.timestamp.desc()).limit(limit).all()
194
+
195
+ def save_game_response_to_db(response_data):
196
+ db = next(get_db())
197
+ new_response = GameResponse(**response_data)
198
+ db.add(new_response)
199
+ db.commit()
200
+ db.refresh(new_response)
201
+ return new_response
202
+
203
+ def load_leaderboard_data(limit=10):
204
+ db = next(get_db())
205
+ leaderboard = db.query(
206
+ User.username,
207
+ func.sum(GameResponse.score).label('total_score')
208
+ ).join(GameResponse, User.id == GameResponse.user_id) \
209
+ .group_by(User.username).order_by(func.sum(GameResponse.score).desc()).limit(limit).all()
210
+
211
+ return leaderboard
212
+
213
+
214
+ # --- Language Options ---
215
+ APP_LANGUAGES = ["English", "Hindi", "Telugu", "Marathi", "Tamil", "Kannada", "Malayalam", "Bengali", "Gujarati", "Punjabi", "Odia", "Assamese", "Urdu"]
216
 
217
+ # --- MULTILINGUAL IDIOM DATA (AI HINT GENERATION DISABLED) ---
218
+ IDIOMS_DATA = {
219
+ "Telugu": [
220
+ {"idiom": "కళ్లు కాయలు కాసేలా చూడటం", "clue": "చాలా కాలం వేచి ఉండటం, కళ్ళు కాయలు కాసేంత వరకు.", "meaning_for_ai": "చాలా కాలం వేచి ఉండటం, కళ్ళు కాయలు కాసేంత వరకు చ���డటం, అనగా ఒక విషయం కోసం చాలా ఆసక్తిగా ఎదురుచూడటం."},
221
+ {"idiom": "గోరు చుట్టుపై రోకలి పోటు", "clue": "ఇప్పటికే ఉన్న సమస్యను మరింత దిగజార్చడం, పరిస్థితిని మరింత దారుణంగా మార్చడం.", "meaning_for_ai": "ఇప్పటికే ఉన్న సమస్యను మరింత దిగజార్చడం, పరిస్థితిని మరింత దారుణంగా మార్చడం, ఒక చిన్న కష్టానికి పెద్ద ఆపదను జోడించడం."},
222
+ {"idiom": "మానవుడు తానొకటి తలిస్తే దైవం వేరొకటి తలచును", "clue": "మనిషి ఒకటి అనుకుంటే దేవుడు ఇంకొకటి తలస్తాడు.", "meaning_for_ai": "మనిషి ఒకటి అనుకుంటే దేవుడు ఇంకొకటి తలస్తాడు. మనం ప్రణాళిక వేసుకున్నవి ఎల్లప్పుడూ జరగవు, దైవ సంకల్పం వేరుగా ఉండవచ్చు."},
223
+ {"idiom": "నక్కకు నాగలోకం చూపించడం", "clue": "ఎవరికైనా అసాధ్యమైనదాన్ని లేదా వారి స్థాయికి మించినదాన్ని చూపించడం; అవాస్తవంగా గొప్పలు చెప్పుకోవడం.", "meaning_for_ai": "ఎవరికైనా అసాధ్యమైనదాన్ని లేదా వారి స్థాయికి మించినదాన్ని చూపించడం; అవాస్తవంగా గొప్పలు చెప్పుకోవడం. ఒక చిన్న జంతువుకు పెద్ద లోకాన్ని చూపించడం వంటిది."},
224
+ {"idiom": "అంట్లు కడిగినా సుఖం లేదు", "clue": "కష్టపడి పని చేసినా ఫలితం లేకపోవడం, కృతజ్ఞత లేని పని.", "meaning_for_ai": "కష్టపడి పని చేసినా ఫలితం లేకపోవడం, కృతజ్ఞత లేని పని. ఎంత కష్టపడినా సంతోషం లేదా గుర్తింపు లేకపోవడం."},
225
+ ],
226
+ "Hindi": [
227
+ {"idiom": "हाथी के दांत खाने के और, दिखाने के और", "clue": "जो दिखता है, वह होता नहीं.", "meaning_for_ai": "जो चीज़ दिखती है, वह असलियत में नहीं होती; कथनी और करनी में अंतर होना, पाखंड करना."},
228
+ {"idiom": "ऊंट के मुंह में जीरा", "clue": "ज़रूरत से बहुत कम वस्तु का मिलना.", "meaning_for_ai": "बहुत बड़ी ज़रूरत के लिए बहुत कम वस्तु का मिलना, जिसका कोई खास असर न पड़े."},
229
+ {"idiom": "आसमान से गिरा खजूर पर अटका", "clue": "एक मुश्किल से निकलकर दूसरी मुश्किल में फंस जाना.", "meaning_for_ai": "एक समस्या से बचने के बाद तुरंत दूसरी नई समस्या में फंस जाना."},
230
+ {"idiom": "नाच न जाने आंगन टेढ़ा", "clue": "अपनी अयोग्यता को छिपाने के लिए दूसरों में दोष निकालना.", "meaning_for_ai": "अपनी कमी या अक्षमता को स्वीकार न करके, दूसरों या परिस्थितियों को दोष देना."},
231
+ {"idiom": "जल में रहकर मगर से बैर", "clue": "जिसके अधीन रहना हो, उसी से दुश्मनी करना.", "meaning_for_ai": "जिसके आश्रय में या जिसके साथ रहना हो, उसी से दुश्मनी मोल लेना, जो घातक हो सकता है।"},
232
+ ],
233
+ "English": [
234
+ {"idiom": "Break a leg", "clue": "To wish someone good luck.", "meaning_for_ai": "An idiomatic expression used in theater and other performing arts to wish a performer good luck."},
235
+ {"idiom": "Bite the bullet", "clue": "To endure a difficult situation.", "meaning_for_ai": "To face a difficult and unpleasant situation with courage and fortitude, rather than avoiding it."},
236
+ {"idiom": "Cost an arm and a leg", "clue": "To be very expensive.", "meaning_for_ai": "To be extremely expensive, costing a large amount of money."},
237
+ {"idiom": "Hit the road", "clue": "To leave a place.", "meaning_for_ai": "To begin a journey or to depart from a particular location."},
238
+ {"idiom": "The ball is in your court", "clue": "It's up to you to make the next decision or step.", "meaning_for_ai": "It's your turn to act."},
239
+ ]
240
+ }
241
+
242
+ # NEW: MULTILINGUAL STORY STARTERS DATA
243
+ STORY_STARTERS_DATA = {
244
+ "Telugu": [
245
+ {"starter": "పురాతన పల్లెటూరిలో, ఒక వృద్ధురాలు అరణ్యంలో ఒక వింత కాంతిని చూసింది...", "meaning_for_ai": "In an ancient village, an old woman saw a strange light in the forest..."},
246
+ {"starter": "ఆ పర్వతాల మధ్య, ఒకప్పుడు అదృశ్యమైన గుడి ఉంది, దానికి దాని స్వంత రహస్యం ఉంది.", "meaning_for_ai": "Amidst those mountains, there was once a forgotten temple, holding its own secret."},
247
+ {"starter": "రాత్రిపూట, నగర వీధులు నిశ్శబ్దంగా ఉన్నప్పుడు, ఒక పాత రేడియో అకస్మాత్తుగా ప్లే అవ్వడం ప్రారంభించింది...", "meaning_for_ai": "In the dead of night, when city streets were silent, an old radio suddenly began to play..."},
248
+ {"starter": "నేను మొదటిసారి రైలు ఎక్కినప్పుడు, నా పక్కన కూర్చున్న వ్యక్తి ఒక విచిత్రమైన సూట్కేస్ కలిగి ఉన్నాడు.", "meaning_for_ai": "When I first boarded the train, the person sitting next to me had a strange suitcase."},
249
+ {"starter": "పాత మామిడి చెట్టు క్రింద, తరాల నాటి కథలు నిద్రిస్తున్నాయి. ఈ రోజు, వాటిలో ఒకటి మేల్కొంది.", "meaning_for_ai": "Under the old mango tree, stories of generations lie dormant. Today, one of them awoke."},
250
+ ],
251
+ "Hindi": [
252
+ {"starter": "पुराने गाँव में, एक बूढ़ी औरत ने जंगल में एक अजीब रोशनी देखी...", "meaning_for_ai": "In an ancient village, an old woman saw a strange light in the forest..."},
253
+ {"starter": "उन पहाड़ों के बीच, एक समय एक भूला हुआ मंदिर था, जिसका अपना रहस्य था।", "meaning_for_ai": "Amidst those mountains, there was once a forgotten temple, holding its own secret."},
254
+ {"starter": "रात के सन्नाटे में, जब शहर की सड़कें खामोश थीं, एक पुराना रेडियो अचानक बजने लगा...", "meaning_for_ai": "In the dead of night, when city streets were silent, an old radio suddenly began to play..."},
255
+ {"starter": "जब मैं पहली बार ट्रेन में चढ़ा, तो मेरे बगल में बैठे व्यक्ति के पास एक अजीब सूटकेस था।", "meaning_for_ai": "When I first boarded the train, the person sitting next to me had a strange suitcase."},
256
+ {"starter": "पुराने आम के पेड़ के नीचे, पीढ़ियों की कहानियाँ सोई हुई हैं। आज, उनमें से एक जाग उठी।", "meaning_for_ai": "Under the old mango tree, stories of generations lie dormant. Today, one of them awoke."},
257
+ ],
258
+ "English": [
259
+ {"starter": "The old woman found a peculiar, glowing stone at the bottom of the ancient well...", "meaning_for_ai": "A fantasy/mystery starter."},
260
+ {"starter": "It was the day the monsoons arrived early, bringing with them a secret that had been buried for years.", "meaning_for_ai": "A mystery/drama starter."},
261
+ {"starter": "I never believed in magic until the stray dog I rescued started whispering forgotten lullabies.", "meaning_for_ai": "A whimsical/fantasy starter."},
262
+ {"starter": "The aroma of spices filled the narrow alleyway, leading me to a door that wasn't there yesterday.", "meaning_for_ai": "A mystery/adventure starter."},
263
+ {"starter": "The last letter from my grandmother contained not words, but a single, dried marigold petal.", "meaning_for_ai": "A poignant/mystery starter."},
264
+ ]
265
+ }
266
+
267
+ def get_random_story_starter(lang):
268
+ if lang in STORY_STARTERS_DATA and STORY_STARTERS_DATA[lang]:
269
+ return random.choice(STORY_STARTERS_DATA[lang])
270
+ return None
271
+
272
+ # Removed AI clue generation function, as AI is temporarily disabled
273
+ # Replaced with a simple function that returns the hardcoded clue
274
+ def get_idiom_clue_simple(idiom_data):
275
+ return idiom_data["clue"] # Use the hardcoded 'clue' field
276
+
277
+
278
+ def get_random_idiom_for_guesser(lang):
279
+ if lang in IDIOMS_DATA and IDIOMS_DATA[lang]:
280
+ chosen_idiom_data = random.choice(IDIOMS_DATA[lang])
281
+ chosen_idiom_data["generated_hint"] = get_idiom_clue_simple(chosen_idiom_data) # Use simple clue
282
+ return chosen_idiom_data
283
+ return None
284
+
285
+ def get_location_from_ip():
286
+ """Fetches approximate location based on IP address."""
287
+ try:
288
+ response = requests.get("http://ip-api.com/json")
289
+ response.raise_for_status()
290
+ data = response.json()
291
+ if data.get("status") == "success":
292
+ return {
293
+ "city": data.get("city"),
294
+ "state": data.get("regionName"),
295
+ "country": data.get("country"),
296
+ "ip_address": data.get("query")
297
+ }
298
+ else:
299
+ st.warning(f"IP lookup failed: {data.get('message', 'Unknown error')}")
300
+ return None
301
+ except requests.exceptions.RequestException as e:
302
+ st.warning(f"Could not retrieve location from IP: {e}. Please try again later.")
303
+ return None
304
+
305
+ # --- UI Strings Dictionary ---
306
  UI_STRINGS = {
307
  "English": {
308
+ "user_account_title": "User Account",
 
 
 
 
309
  "logged_in_as": "Logged in as",
310
  "logout_button": "Logout",
311
  "login_register_subheader": "Login / Register",
 
323
  "please_login_msg": " registered successfully! Please login.",
324
  "username_exists_error": "Username already exists. Please choose a different one.",
325
  "registration_error": "An error occurred during registration",
326
+ "choose_language_label": "Choose your language for the app experience:",
327
+ "intro_text": "Hey gang! Help us build an AI that understands India's incredible linguistic and cultural vibes. Your contributions will help us train AI models to get the nuances of Indian languages!",
328
+ "contribute_lore_tab": "Contribute Lore",
329
+ "play_game_tab": "Play a Game",
330
+ "leaderboard_tab": "Leaderboard",
331
+ "lore_contribute_subheader": "Contribute Your Lore:",
332
+ "lore_text_label": "Your Lore/Proverb:",
333
+ "lore_text_placeholder": "E.g., 'The quick brown fox jumps over the lazy dog.' or 'Good morning, how are you?'",
334
+ "language_label": "Language:",
335
+ "state_ut_label": "State/Union Territory:",
336
+ "type_of_lore_label": "Type of Lore:",
337
+ "nickname_label": "Your Nickname (Optional, defaults to your username if logged in):",
338
+ "location_optional_text": "**Optional: Add Location Data**",
339
+ "agree_to_location_text": "Allow app to automatically detect my approximate location (via IP address)?",
340
+ "location_info_text": "Your location will be approximated from the server's IP address where the app is running. This is usually city/state level, not precise GPS. **This feature relies on an external API (ip-api.com) and may have usage limits or occasional failures.**",
341
+ "submit_lore_button": "Submit Lore!",
342
+ "empty_lore_error": "🚨 Lore/Proverb field cannot be empty. Spill the tea!",
343
+ "select_language_error": "🚨 Please select a Language.",
344
+ "select_state_error": "🚨 Please select a State/Union Territory.",
345
+ "select_type_error": "🚨 Please select a Type of Lore.",
346
+ "lore_submitted_success": "✅ Lore submitted successfully to the database! Thanks for contributing, legend!",
347
+ "recent_contributions_subheader": "Your Recent Contributions:",
348
+ "no_user_contributions": "You haven't contributed any lore yet! Drop some knowledge above. 🚀",
349
+ "recent_all_lore_subheader": "Recently Collected Lore (from Database):",
350
+ "no_lore_collected": "No lore collected yet! Be the first to drop some knowledge. 🚀",
351
+ "built_with_love": "💖 Built with ❤️ for FillMyBlank.ai",
352
+ "game_play_subheader": "Choose a Game!",
353
+ "idiom_guesser_game_tab": "Idiom Guesser",
354
+ "story_completion_game_tab": "Story Completion",
355
+ "idiom_game_current_score": "Your Idiom Score:",
356
+ "start_new_idiom_game_button": "Start New Idiom Game",
357
+ "idiom_text_label": "**Idiom:**",
358
+ "get_hint_button": "Get a Hint",
359
+ "ai_hint_text": "**Hint:**", # Changed from AI Hint
360
+ "your_situations_label": "Write a few situations where this idiom would fit:",
361
+ "submit_situations_button": "Submit Situations",
362
+ "situations_empty_error": "🚨 Please write some situations for the idiom. Get creative!",
363
+ "idiom_submitted_success": "✅ Situations submitted! Thanks for your valuable contribution!",
364
+ "no_idioms_for_lang": "No idioms available for the selected language. Please select another language or contribute more idioms!",
365
+ "lore_msg_text": "**💬 Lore:**",
366
+ "lang_msg_text": "**🌐 Lang:**",
367
+ "location_msg_text": "**📍 Location:**",
368
+ "type_msg_text": "**🏷️ Type:**",
369
+ "on_msg_text": "**⏰ On:**",
370
+ "by_msg_text": "**👤 By:**",
371
+ "contributor_you": "(You)",
372
+ "contributor_logged_in": "(Logged-in User)",
373
+ "dialog_placeholder": "Dialogue, quote, or local saying",
374
  "logged_out_success": "Logged out successfully!",
375
+ "welcome_back": "Welcome back",
376
+ "could_not_detect_location_warning": "Could not automatically detect location. Proceeding without location data.",
377
+ "leaderboard_subheader": "Top Idiom Guessers!",
378
+ "leaderboard_username_col": "Username",
379
+ "leaderboard_score_col": "Total Score",
380
+ "no_scores_yet": "No scores recorded yet! Be the first to play and get on the leaderboard. 🚀",
381
+ "story_play_subheader": "Play: Story Completion!",
382
+ "story_starter_text": "**Story Starter:**",
383
+ "your_story_continuation_label": "Your Story Continuation:",
384
+ "submit_story_button": "Submit Story",
385
+ "story_submitted_success": "✅ Story submitted! Thanks for your creative contribution!",
386
+ "no_starters_for_lang": "No story starters available for the selected language. Please select another language or contribute more stories!",
387
+ "story_empty_error": "🚨 Your story continuation cannot be empty. Get creative!"
388
  },
389
  "Telugu": {
 
 
 
 
390
  "user_account_title": "వినియోగదారు ఖాతా",
391
  "logged_in_as": "లాగిన్ అయ్యారు",
392
  "logout_button": "లాగ్ అవుట్",
 
405
  "please_login_msg": " విజయవంతంగా నమోదు చేయబడింది! దయచేసి లాగిన్ చేయండి.",
406
  "username_exists_error": "వినియోగదారు పేరు ఇప్పటికే ఉంది. దయచేసి మరొకటి ఎంచుకోండి.",
407
  "registration_error": "నమోదు సమయంలో లోపం సంభవించింది",
408
+ "choose_language_label": "యాప్ అనుభవం కోసం మీ భాషను ఎంచుకోండి:",
409
+ "intro_text": "భారతదేశం యొక్క అద్భుతమైన భాషా మరియు సాంస్కృతిక వైవిధ్యాన్ని అర్థం చేసుకునే AIని రూపొందించడంలో మాకు సహాయం చేయండి. మీ సహకారం భారతీయ భాషల సూక్ష్మ నైపుణ్యాలను అర్థం చేసుకోవడానికి AI నమూనాలకు సహాయపడుతుంది!",
410
+ "contribute_lore_tab": "మీ కథనాన్ని అందించండి",
411
+ "play_game_tab": "ఆట ఆడండి",
412
+ "leaderboard_tab": "లీడర్‌బోర్డ్",
413
+ "lore_contribute_subheader": "మీ కథనాన్ని అందించండి:",
414
+ "lore_text_label": "మీ కథనం/సామెత:",
415
+ "lore_text_placeholder": "ఉదా: 'అతి సర్వత్ర వర్జయేత్.' (ఎక్కువగా ఏదైనా చెడ్డది.)",
416
+ "language_label": "భాష:",
417
+ "state_ut_label": "రాష్ట్రం/కేంద్ర పాలిత ప్రాంతం:",
418
+ "type_of_lore_label": "కథనం రకం:",
419
+ "nickname_label": "మీ మారుపేరు (ఐచ్ఛికం, లాగిన్ అయితే మీ వినియోగదారు పేరుకి డిఫాల్ట్ అవుతుంది):",
420
+ "location_optional_text": "**ఐచ్ఛికం: స్థాన డేటాను జోడించండి**",
421
+ "agree_to_location_text": "అప్లికేషన్ నా సుమారు స్థానాన్ని స్వయంచాలకంగా గుర్తించడానికి అనుమ��ించాలా (IP చిరునామా ద్వారా)?",
422
+ "location_info_text": "మీ స్థానం అప్లికేషన్ నడుస్తున్న సర్వర్ IP చిరునామా నుండి అంచనా వేయబడుతుంది. ఇది సాధారణంగా నగరం/రాష్ట్ర స్థాయి, ఖచ్చితమైన GPS కాదు. **ఈ ఫీచర్ బాహ్య API (ip-api.com)పై ఆధారపడి ఉంటుంది మరియు వినియోగ పరిమితులు లేదా అప్పుడప్పుడు వైఫల్యాలు ఉండవచ్చు.**",
423
+ "submit_lore_button": "కథనాన్ని సమర్పించండి!",
424
+ "empty_lore_error": "🚨 కథనం/సామెత ఖాళీగా ఉండకూడదు.",
425
+ "select_language_error": "🚨 దయచేసి ఒక భాషను ఎంచుకోండి.",
426
+ "select_state_error": "🚨 దయచేసి ఒక రాష్ట్రాన్ని/కేంద్ర పాలిత ప్రాంతాన్ని ఎంచుకోండి.",
427
+ "select_type_error": "🚨 దయచేసి ఒక రకాన్ని ఎంచుకోండి.",
428
+ "lore_submitted_success": "✅ కథనం డేటాబేస్‌లో విజయవంతంగా సమర్పించబడింది! సహకరించినందుకు ధన్యవాదాలు, లెజెండ్!",
429
+ "recent_contributions_subheader": "మీ ఇటీవలి సహకారాలు:",
430
+ "no_user_contributions": "మీరు ఇంకా ఎటువంటి కథనాన్ని అందించలేదు!",
431
+ "recent_all_lore_subheader": "ఇటీవలి సేకరించిన కథనం (డేటాబేస్ నుండి):",
432
+ "no_lore_collected": "ఇంకా కథనం సేకరించబడలేదు!",
433
+ "built_with_love": "💖 FillMyBlank.ai కోసం ప్రేమతో రూపొందించబడింది",
434
+ "game_play_subheader": "ఆటను ఎంచుకోండి!",
435
+ "idiom_guesser_game_tab": "ఇడియమ్ గెసర్",
436
+ "story_completion_game_tab": "కథనం పూర్తి",
437
+ "idiom_game_current_score": "మీ ఇడియమ్ స్కోర్:",
438
+ "start_new_idiom_game_button": "కొత్త ఇడియమ్ ఆట ప్రారంభించండి",
439
+ "idiom_text_label": "**జాతీయం:**",
440
+ "get_hint_button": "సూచన పొందండి",
441
+ "ai_hint_text": "**సూచన:**",
442
+ "your_situations_label": "ఈ జాతీయం సరిపోయే కొన్ని సందర్భాలను వ్రాయండి:",
443
+ "submit_situations_button": "సందర్భాలను సమర్పించండి",
444
+ "situations_empty_error": "🚨 దయచేసి జాతీయం కోసం కొన్ని సందర్భాలను వ్రాయండి. సృజనాత్మకంగా ఉండండి!",
445
+ "idiom_submitted_success": "✅ సందర్భాలు సమర్పించబడ్డాయి! మీ విలువైన సహకారానికి ధన్యవాదాలు!",
446
+ "no_idioms_for_lang": "ఎంచుకున్న భాషకు జాతీయాలు అందుబాటులో లేవు. దయచేసి మరొక భాషను ఎంచుకోండి లేదా మరిన్ని జాతీయాలను అందించండి!",
447
+ "lore_msg_text": "**💬 కథనం:**",
448
+ "lang_msg_text": "**🌐 భాష:**",
449
+ "location_msg_text": "**📍 స్థానం:**",
450
+ "type_msg_text": "**🏷️ రకం:**",
451
+ "on_msg_text": "**⏰ సమయం:**",
452
+ "by_msg_text": "**👤 ద్వారా:**",
453
+ "contributor_you": "(మీరు)",
454
+ "contributor_logged_in": "(లాగిన్ అయిన వినియోగదారు)",
455
+ "dialog_placeholder": "సంభాషణ, కోట్ లేదా స్థానిక సామెత",
456
  "logged_out_success": "విజయవంతంగా లాగ్ అవుట్ అయ్యారు!",
457
+ "welcome_back": "తిరిగి స్వాగతం",
458
+ "could_not_detect_location_warning": "స్థానాన్ని స్వయంచాలకంగా గుర్తించలేకపోయింది. స్థాన డేటా లేకుండా కొనసాగుతోంది.",
459
+ "leaderboard_subheader": "టాప్ ఇడియమ్ గెసర్లు!",
460
+ "leaderboard_username_col": "వినియోగదారు పేరు",
461
+ "leaderboard_score_col": "మొత్తం స్కోర్",
462
+ "no_scores_yet": "ఇంకా స్కోర్‌లు నమోదు కాలేదు! లీడర్‌బోర్డ్‌లో చేరడానికి మొదట ఆట ఆడండి. 🚀",
463
+ "story_play_subheader": "ఆడండి: కథనం పూర్తి!",
464
+ "story_starter_text": "**కథనం ప్రారంభం:**",
465
+ "your_story_continuation_label": "మీ కథనం కొనసాగింపు:",
466
+ "submit_story_button": "కథనాన్ని సమర్పించండి",
467
+ "story_submitted_success": "✅ కథనం సమర్పించబడింది! మీ సృజనాత్మక సహకారానికి ధన్యవాదాలు!",
468
+ "no_starters_for_lang": "ఎంచుకున్న భాషకు కథనం ప్రారంభాలు అందుబాటులో లేవు. దయచేసి మరొక భాషను ఎంచుకోండి లేదా మరిన్ని కథనాలను అందించండి!",
469
+ "story_empty_error": "🚨 మీ కథనం కొనసాగింపు ఖాళీగా ఉండకూడదు. సృజనాత్మకంగా ఉండండి!"
470
  },
471
  "Hindi": {
 
 
 
 
472
  "user_account_title": "उपयोगकर्ता खाता",
473
  "logged_in_as": "के रूप में लॉग इन किया गया",
474
  "logout_button": "लॉग आउट",
 
487
  "please_login_msg": " सफलतापूर्वक पंजीकृत! कृपया लॉगिन करें।",
488
  "username_exists_error": "उपयोगकर्ता नाम पहले से मौजूद है। कृपया कोई दूसरा चुनें।",
489
  "registration_error": "पंजीकरण के दौरान एक त्रुटि हुई",
490
+ "choose_language_label": "ऐप अनुभव के लिए अपनी भाषा चुनें:",
491
+ "intro_text": "नमस्ते गैंग! भारत की अविश्वसनीय भाषाई और सांस्कृतिक विविधता को समझने वाले एक AI के निर्माण में हमारी मदद करें। आपका योगदान AI मॉडल को भारतीय भाषाओं की बारीकियों को समझने में मदद करेगा!",
492
+ "contribute_lore_tab": "ज्ञान योगदान करें",
493
+ "play_game_tab": "खेल खेलें",
494
+ "leaderboard_tab": "लीडरबोर्ड",
495
+ "lore_contribute_subheader": "अपना ज्ञान योगदान करें:",
496
+ "lore_text_label": "आपका ज्ञान/मुहावरा:",
497
+ "lore_text_placeholder": "उदाहरण: 'हाथी के दांत खाने के और, दिखाने के और'",
498
+ "language_label": "भाषा:",
499
+ "state_ut_label": "राज्य/केंद्र शासित प्रदेश:",
500
+ "type_of_lore_label": "ज्ञान का प्रकार:",
501
+ "nickname_label": "आपका उपनाम (वैकल्पिक, लॉगिन होने पर आपके उपयोगकर्ता नाम पर डिफ़ॉल्ट होगा):",
502
+ "location_optional_text": "**वैकल्पिक: स्थान डेटा जोड़ें**",
503
+ "agree_to_location_text": "क्या ऐप को मेरी अनुमानित स्थिति (IP पते के माध्यम से) स्वचालित रूप से पता लगाने की अनुमति दें?",
504
+ "location_info_text": "आपकी स्थिति का अनुमान उस सर्वर के IP पते से लगाया जाएगा जहां ऐप चल रहा है। यह आमतौर पर शहर/राज्य स्तर का होता है, सटीक GPS नहीं। **यह सुविधा बाहरी API (ip-api.com) पर निर्भर करती है और इसमें उपयोग सीमाएं या कभी-कभी विफलताएं हो सकती हैं।**",
505
+ "submit_lore_button": "ज्ञान सबमिट करें!",
506
+ "empty_lore_error": "🚨 ज्ञान/मुहावरा खाली नहीं हो सकता।",
507
+ "select_language_error": "🚨 कृपया एक भाषा चुनें।",
508
+ "select_state_error": "🚨 कृपया एक राज्य/केंद्र शासित प्रदेश चुनें।",
509
+ "select_type_error": "🚨 कृपया एक प्रकार चुनें।",
510
+ "lore_submitted_success": "✅ ज्ञान डेटाबेस में सफलतापूर्वक सबमिट किया गया! योगदान के लिए धन्यवाद, लीजेंड!",
511
+ "recent_contributions_subheader": "आपके हालिया योगदान:",
512
+ "no_user_contributions": "आपने अभी तक कोई ज्ञान योगदान नहीं किया है!",
513
+ "recent_all_lore_subheader": "हाल ही में एकत्र किया गया ज्ञान (डेटाबेस से):",
514
+ "no_lore_collected": "अभी तक कोई ज्ञान एकत्र नहीं किया गया है!",
515
+ "built_with_love": "💖 FillMyBlank.ai के लिए प्यार से बनाया गया",
516
+ "game_play_subheader": "एक खेल चुनें!",
517
+ "idiom_guesser_game_tab": "मुहावरा पहचानें",
518
+ "story_completion_game_tab": "कहानी पूरी करें",
519
+ "idiom_game_current_score": "आपका मुहावरा स्कोर:",
520
+ "start_new_idiom_game_button": "नया मुहावरा खेल शुरू करें",
521
+ "idiom_text_label": "**मुहावरा:**",
522
+ "get_hint_button": "एक संकेत प्राप्त करें",
523
+ "ai_hint_text": "**संकेत:**",
524
+ "your_situations_label": "कुछ ऐसी स्थितियाँ लिखें जहाँ यह मुहावरा उपयुक्त हो:",
525
+ "submit_situations_button": "स्थितियाँ सबमिट करें",
526
+ "situations_empty_error": "🚨 कृपया मुहावरे के लिए कुछ स्थितियाँ लिखें। रचनात्मक बनें!",
527
+ "idiom_submitted_success": "✅ स्थितियाँ सबमिट की गईं! आपके बहुमूल्य योगदान के लिए धन्यवाद!",
528
+ "no_idioms_for_lang": "चयनित भाषा के लिए कोई मुहावरे उपलब्ध नहीं हैं। कृपया कोई अन्य भाषा चुनें या और कहानियाँ योगदान करें!",
529
+ "lore_msg_text": "**💬 ज्ञान:**",
530
+ "lang_msg_text": "**🌐 भाषा:**",
531
+ "location_msg_text": "**📍 स्थान:**",
532
+ "type_msg_text": "**🏷️ प्रकार:**",
533
+ "on_msg_text": "**⏰ समय:**",
534
+ "by_msg_text": "**👤 द्वारा:**",
535
+ "contributor_you": "(आप)",
536
+ "contributor_logged_in": "(लॉगिन किया हुआ उपयोगकर्ता)",
537
+ "dialog_placeholder": "संवाद, उद्धरण या स्थानीय कहावत",
538
  "logged_out_success": "सफलतापूर्वक लॉग आउट हो गए!",
539
+ "welcome_back": "आपका स्वागत है",
540
+ "could_not_detect_location_warning": "स्थान का स्वचालित रूप से पता नहीं चल सका। स्थान डेटा के बिना आगे बढ़ रहा है।",
541
+ "leaderboard_subheader": "शीर्ष मुहावरा पहचानने वाले!",
542
+ "leaderboard_username_col": "उपयोगकर्ता नाम",
543
+ "leaderboard_score_col": "कुल स्कोर",
544
+ "no_scores_yet": "अभी तक कोई स्कोर दर्ज नहीं किया गया है! लीडरबोर्ड पर आने के लिए सबसे पहले खेलें।",
545
+ "story_play_subheader": "खेलें: कहानी पूरी करें!",
546
+ "story_starter_text": "**कहानी की शुरुआत:**",
547
+ "your_story_continuation_label": "आपकी कहानी जारी रखें:",
548
+ "submit_story_button": "कहानी सबमिट करें",
549
+ "story_submitted_success": "✅ कहानी सबमिट की गई! आपके रचनात्मक योगदान के लिए धन्यवाद!",
550
+ "no_starters_for_lang": "चयनित भाषा के लिए कोई कहानी शुरु���ती उपलब्ध नहीं हैं। कृपया कोई अन्य भाषा चुनें या और कहानियाँ योगदान करें!",
551
+ "story_empty_error": "🚨 आपकी कहानी जारी नहीं रह सकती। रचनात्मक बनें!"
552
  }
553
+ }