Spaces:
Sleeping
Sleeping
Upload app.py with huggingface_hub
Browse files
app.py
CHANGED
|
@@ -235,6 +235,48 @@ def add_word(english, wtype, article, german):
|
|
| 235 |
|
| 236 |
return "✅ Word(s) added!", get_words_table_en_de(), get_words_table_de_en()
|
| 237 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 238 |
def toggle_article_input(word_type):
|
| 239 |
return gr.update(interactive=(word_type == "noun"))
|
| 240 |
|
|
@@ -328,13 +370,20 @@ with gr.Blocks(fill_width=False) as demo:
|
|
| 328 |
de_new_btn = gr.Button("New Word (DE→EN)")
|
| 329 |
de_submit_btn = gr.Button("Check Answer (DE→EN)")
|
| 330 |
|
| 331 |
-
with gr.Tab("
|
| 332 |
-
|
| 333 |
-
|
| 334 |
-
|
| 335 |
-
|
| 336 |
-
|
| 337 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 338 |
|
| 339 |
with gr.Row(equal_height=True):
|
| 340 |
search_box = gr.Textbox(label="Search words", placeholder="Type to filter...", scale=5)
|
|
@@ -395,6 +444,12 @@ with gr.Blocks(fill_width=False) as demo:
|
|
| 395 |
outputs=[add_result, word_table_en_de, word_table_de_en]
|
| 396 |
)
|
| 397 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 398 |
type_in.change(
|
| 399 |
fn=toggle_article_input,
|
| 400 |
inputs=type_in,
|
|
|
|
| 235 |
|
| 236 |
return "✅ Word(s) added!", get_words_table_en_de(), get_words_table_de_en()
|
| 237 |
|
| 238 |
+
def delete_word(word, lang):
|
| 239 |
+
"""
|
| 240 |
+
Delete a word from dictionaries.
|
| 241 |
+
lang = "en" means the word is an English word.
|
| 242 |
+
lang = "de" means the word is a German word.
|
| 243 |
+
"""
|
| 244 |
+
eng_data = load_english()
|
| 245 |
+
ger_data = load_german()
|
| 246 |
+
|
| 247 |
+
word = (word or "").strip()
|
| 248 |
+
if not word:
|
| 249 |
+
return "❌ Please provide a word to delete.", get_words_table_en_de(), get_words_table_de_en()
|
| 250 |
+
|
| 251 |
+
if lang == "en":
|
| 252 |
+
if word not in eng_data:
|
| 253 |
+
return f"⚠ English word '{word}' not found.", get_words_table_en_de(), get_words_table_de_en()
|
| 254 |
+
# remove links from german side
|
| 255 |
+
for g in eng_data[word].get("translations", []):
|
| 256 |
+
if g in ger_data and word in ger_data[g].get("translations", []):
|
| 257 |
+
ger_data[g]["translations"].remove(word)
|
| 258 |
+
if not ger_data[g]["translations"]:
|
| 259 |
+
del ger_data[g] # remove orphan
|
| 260 |
+
del eng_data[word]
|
| 261 |
+
|
| 262 |
+
elif lang == "de":
|
| 263 |
+
if word not in ger_data:
|
| 264 |
+
return f"⚠ German word '{word}' not found.", get_words_table_en_de(), get_words_table_de_en()
|
| 265 |
+
# remove links from english side
|
| 266 |
+
for e in ger_data[word].get("translations", []):
|
| 267 |
+
if e in eng_data and word in eng_data[e].get("translations", []):
|
| 268 |
+
eng_data[e]["translations"].remove(word)
|
| 269 |
+
if not eng_data[e]["translations"]:
|
| 270 |
+
del eng_data[e] # remove orphan
|
| 271 |
+
del ger_data[word]
|
| 272 |
+
else:
|
| 273 |
+
return "❌ Invalid language parameter. Use 'en' or 'de'.", get_words_table_en_de(), get_words_table_de_en()
|
| 274 |
+
|
| 275 |
+
save_english(eng_data)
|
| 276 |
+
save_german(ger_data)
|
| 277 |
+
|
| 278 |
+
return f"✅ '{word}' deleted.", get_words_table_en_de(), get_words_table_de_en()
|
| 279 |
+
|
| 280 |
def toggle_article_input(word_type):
|
| 281 |
return gr.update(interactive=(word_type == "noun"))
|
| 282 |
|
|
|
|
| 370 |
de_new_btn = gr.Button("New Word (DE→EN)")
|
| 371 |
de_submit_btn = gr.Button("Check Answer (DE→EN)")
|
| 372 |
|
| 373 |
+
with gr.Tab("Words Dataset"):
|
| 374 |
+
with gr.Row():
|
| 375 |
+
with gr.Column():
|
| 376 |
+
english_in = gr.Textbox(label="English Word")
|
| 377 |
+
type_in = gr.Dropdown(label="Word Type", choices=["noun", "verb", "other"], value="noun")
|
| 378 |
+
article_in = gr.Textbox(label="Artikel (der/die/das) — only for nouns")
|
| 379 |
+
german_in = gr.Textbox(label="German Translation")
|
| 380 |
+
add_btn = gr.Button("Add Word")
|
| 381 |
+
add_result = gr.Markdown()
|
| 382 |
+
with gr.Column():
|
| 383 |
+
delete_word_in = gr.Textbox(label="Word to Delete")
|
| 384 |
+
delete_lang_in = gr.Dropdown(label="Language", choices=["en", "de"], value="en")
|
| 385 |
+
delete_btn = gr.Button("Delete Word")
|
| 386 |
+
delete_result = gr.Markdown()
|
| 387 |
|
| 388 |
with gr.Row(equal_height=True):
|
| 389 |
search_box = gr.Textbox(label="Search words", placeholder="Type to filter...", scale=5)
|
|
|
|
| 444 |
outputs=[add_result, word_table_en_de, word_table_de_en]
|
| 445 |
)
|
| 446 |
|
| 447 |
+
delete_btn.click(
|
| 448 |
+
fn=delete_word,
|
| 449 |
+
inputs=[delete_word_in, delete_lang_in],
|
| 450 |
+
outputs=[delete_result, word_table_en_de, word_table_de_en]
|
| 451 |
+
)
|
| 452 |
+
|
| 453 |
type_in.change(
|
| 454 |
fn=toggle_article_input,
|
| 455 |
inputs=type_in,
|