feat: мини-истории, слово дня, меню практики

- Добавлены мини-истории для чтения с выбором жанра и вопросами
- Кнопка показа/скрытия перевода истории
- Количество вопросов берётся из настроек пользователя
- Слово дня генерируется глобально в 00:00 UTC
- Кнопка "Практика" открывает меню выбора режима
- Убран автоматический create_all при запуске (только миграции)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-12-09 15:05:38 +03:00
parent 69c651c031
commit f38ff2f18e
22 changed files with 3131 additions and 77 deletions

View File

@@ -1,15 +1,34 @@
{
"menu": {
"wordofday": "🌅 Word of Day",
"add": " Add word",
"vocab": "📚 Vocabulary",
"task": "🧠 Task",
"practice": "💬 Practice",
"exercises": "📖 Exercises",
"words": "🎯 Thematic words",
"import": "📖 Import",
"stats": "📊 Stats",
"settings": "⚙️ Settings",
"below": "Main menu below ⤵️"
},
"practice_menu": {
"title": "Practice",
"choose": "Choose practice mode:",
"stories": "Mini Stories",
"ai_chat": "AI Chat"
},
"wod": {
"title": "Word of the Day",
"generating": "🔄 Generating word of the day...",
"failed": "❌ Failed to generate word of the day. Try again later.",
"not_available": "🕐 Word of the day is not ready yet.\n\nWords are generated daily at 00:00 UTC.\nTry again later!",
"examples": "Examples",
"synonyms": "Synonyms",
"add_btn": " Add to vocabulary",
"added": "Added to vocabulary!",
"not_found": "Word not found"
},
"add_menu": {
"title": " <b>Add words</b>\n\nChoose method:",
"manual": "📝 Manual",
@@ -55,7 +74,7 @@
"skip_msg": "✅ Okay!\n\nYou can take the test later with /level_test\nor set level manually in /settings\n\nLet's start! Try:\n• /words travel - thematic words\n• /practice - AI dialogue\n• /add hello - add a word"
},
"add": {
"prompt": "Send the word you want to add:\nFor example: <code>/add elephant</code>\n\nOr just send the word without a command!",
"prompt": "Send the word you want to add:\n• Single word: <code>/add elephant</code>\n• Multiple: <code>/add apple, banana, orange</code>\n\nOr just send the word without a command!",
"searching": "⏳ Looking up translation and examples...",
"examples_header": "<b>Examples:</b>",
"translations_header": "<b>Translations:</b>",
@@ -69,6 +88,13 @@
"added_success": "✅ Word '<b>{word}</b>' added!\n\nTotal words in vocabulary: {count}\n\nKeep adding new words or use /task to practice!",
"cancelled": "Cancelled. You can add another word with /add"
},
"add_batch": {
"header": "📝 <b>Words to add ({n}):</b>",
"translating": "⏳ Translating {n} words...",
"choose": "Select words to add or add all at once:",
"truncated": "⚠️ Too many words. Showing first {n}.",
"failed": "❌ Failed to get translations. Try again later."
},
"vocab": {
"empty": "📚 Your vocabulary is empty!\n\nAdd your first word with /add or just send me a word.",
"header": "<b>📚 Your vocabulary:</b>",
@@ -191,7 +217,54 @@
"invalid_format": "❌ Invalid time format!\n\nUse <b>HH:MM</b> (e.g., 09:00 or 18:30)\nOr send /cancel to abort",
"time_set_title": "✅ <b>Time set!</b>",
"status_on_line": "Status: <b>Enabled</b>",
"use_settings": "Use /reminder to change settings."
"use_settings": "Use /reminder to change settings.",
"daily_title": "⏰ <b>Time to practice!</b>",
"daily_wod": "🌅 <b>Word of the Day:</b>",
"daily_tips": "Don't forget to practice today:\n• /task - complete tasks\n• /practice - practice dialogue\n• /words - add new words",
"daily_motivation": "💪 Regular practice is the key to success!"
},
"story": {
"title": "Mini Stories",
"choose_genre": "Choose a story genre:",
"genre": {
"dialogue": "Dialogues",
"news": "News",
"story": "Stories",
"letter": "Letters",
"recipe": "Recipes"
},
"generating": "🔄 Generating story...",
"failed": "❌ Failed to generate story. Try again.",
"try_again": "Try again",
"level": "Level",
"words": "words",
"questions_btn": "Questions",
"vocab_btn": "Vocabulary",
"new_btn": "New story",
"back": "Back",
"not_found": "Story not found",
"no_vocab": "No vocabulary words",
"no_questions": "No questions",
"vocabulary": "Story Vocabulary",
"add_all": "Add all",
"word_added": "✅ Word '{word}' added!",
"words_added": "✅ Added words: {n}",
"word_not_found": "Word not found",
"question": "Question",
"question_not_found": "Question not found",
"correct": "✅ Correct!",
"incorrect": "❌ Incorrect",
"next_question": "Next question",
"show_results": "Results",
"results_title": "Results",
"correct_answers": "Correct answers",
"accuracy": "Accuracy",
"result_excellent": "Excellent! You understood the text well.",
"result_good": "Good job! You understood most of the text.",
"result_practice": "Try reading the story more carefully.",
"translation": "Translation",
"show_translation": "Show translation",
"hide_translation": "Hide translation"
},
"level_test": {
"show_translation_btn": "👁️ Show question translation",
@@ -330,5 +403,29 @@
"err_not_found": "❌ Error: word not found",
"already_exists": "The word '{word}' is already in your vocabulary",
"added_single": "✅ Word '{word}' added to vocabulary"
},
"exercises": {
"title": "📖 <b>Grammar Exercises</b>",
"choose_topic": "Choose a topic for exercises:",
"your_level": "Your level: <b>{level}</b>",
"generating_rule": "🔄 Generating grammar explanation...",
"generating": "🔄 Generating exercises...",
"generate_failed": "❌ Failed to generate exercise. Please try again later.",
"start_btn": "▶️ Start exercises",
"task_header": "📝 <b>Exercise: {topic}</b>",
"instruction": "Fill in the blanks with the correct form:",
"check_btn": "✅ Check",
"next_btn": "➡️ Next",
"results_btn": "📊 Results",
"back_btn": "⬅️ Back to topics",
"close_btn": "❌ Close",
"correct": "✅ <b>Correct!</b>",
"incorrect": "❌ <b>Incorrect</b>",
"your_answer": "Your answer: {answer}",
"right_answer": "Correct answer: {answer}",
"explanation": "💡 {text}",
"score": "Score: {correct} of {total}",
"no_topics": "No topics available for your level yet.",
"write_answer": "Write your answer:"
}
}

View File

@@ -1,15 +1,34 @@
{
"menu": {
"wordofday": "🌅 今日の単語",
"add": " 単語を追加",
"vocab": "📚 単語帳",
"task": "🧠 課題",
"practice": "💬 練習",
"exercises": "📖 文法練習",
"words": "🎯 テーマ別単語",
"import": "📖 インポート",
"stats": "📊 統計",
"settings": "⚙️ 設定",
"below": "メインメニューは下にあります ⤵️"
},
"practice_menu": {
"title": "練習",
"choose": "練習モードを選択:",
"stories": "ミニストーリー",
"ai_chat": "AIとの会話"
},
"wod": {
"title": "今日の単語",
"generating": "🔄 今日の単語を生成中...",
"failed": "❌ 今日の単語の生成に失敗しました。後でもう一度お試しください。",
"not_available": "🕐 今日の単語はまだ準備中です。\n\n単語は毎日UTC 00:00に生成されます。\n後でもう一度お試しください",
"examples": "例文",
"synonyms": "類義語",
"add_btn": " 単語帳に追加",
"added": "単語帳に追加しました!",
"not_found": "単語が見つかりません"
},
"add_menu": {
"title": " <b>単語を追加</b>\n\n方法を選択:",
"manual": "📝 手動",
@@ -55,7 +74,7 @@
"skip_msg": "✅ わかりました!\n\n/level_test で後からテストを受けるか、/settings でレベルを設定できます。\n\nはじめましょうおすすめ:\n• /words travel - テーマ別単語\n• /practice - AIとの会話\n• /add hello - 単語を追加"
},
"add": {
"prompt": "追加したい単語を送ってください:\n: <code>/add elephant</code>\n\nコマンドなしで単語だけ送ってもOKです",
"prompt": "追加したい単語を送ってください:\n• 1語: <code>/add elephant</code>\n• 複数: <code>/add apple, banana, orange</code>\n\nコマンドなしで単語だけ送ってもOKです",
"searching": "⏳ 翻訳と例を検索中...",
"examples_header": "<b>例文:</b>",
"translations_header": "<b>翻訳:</b>",
@@ -69,6 +88,13 @@
"added_success": "✅ 単語 '<b>{word}</b>' を追加しました!\n\n単語帳の総数: {count}\n\nさらに追加するか、/task で練習しましょう!",
"cancelled": "キャンセルしました。/add で別の単語を追加できます"
},
"add_batch": {
"header": "📝 <b>追加する単語 ({n}):</b>",
"translating": "⏳ {n} 語を翻訳中...",
"choose": "追加する単語を選ぶか、一括で追加してください:",
"truncated": "⚠️ 単語が多すぎます。最初の {n} 語を表示。",
"failed": "❌ 翻訳の取得に失敗しました。後でもう一度お試しください。"
},
"vocab": {
"empty": "📚 単語帳はまだ空です!\n\n/add で最初の単語を追加するか、単語を直接送ってください。",
"header": "<b>📚 あなたの単語帳:</b>",
@@ -183,7 +209,54 @@
"invalid_format": "❌ 時間の形式が正しくありません!\n\n<b>HH:MM</b>(例: 09:00 / 18:30形式を使用してください\nまたは /cancel で中止",
"time_set_title": "✅ <b>時間を設定しました!</b>",
"status_on_line": "ステータス: <b>有効</b>",
"use_settings": "/reminder で設定を変更できます。"
"use_settings": "/reminder で設定を変更できます。",
"daily_title": "⏰ <b>練習の時間です!</b>",
"daily_wod": "🌅 <b>今日の単語:</b>",
"daily_tips": "今日も練習を忘れずに:\n• /task - 課題を解く\n• /practice - 会話練習\n• /words - 新しい単語を追加",
"daily_motivation": "💪 継続は力なり!"
},
"story": {
"title": "ミニストーリー",
"choose_genre": "ストーリーのジャンルを選択:",
"genre": {
"dialogue": "会話",
"news": "ニュース",
"story": "物語",
"letter": "手紙",
"recipe": "レシピ"
},
"generating": "🔄 ストーリーを生成中...",
"failed": "❌ ストーリーの生成に失敗しました。もう一度お試しください。",
"try_again": "もう一度試す",
"level": "レベル",
"words": "単語",
"questions_btn": "質問",
"vocab_btn": "単語帳",
"new_btn": "新しいストーリー",
"back": "戻る",
"not_found": "ストーリーが見つかりません",
"no_vocab": "単語がありません",
"no_questions": "質問がありません",
"vocabulary": "ストーリーの単語",
"add_all": "すべて追加",
"word_added": "✅ 「{word}」を追加しました!",
"words_added": "✅ {n}単語を追加しました",
"word_not_found": "単語が見つかりません",
"question": "質問",
"question_not_found": "質問が見つかりません",
"correct": "✅ 正解!",
"incorrect": "❌ 不正解",
"next_question": "次の質問",
"show_results": "結果",
"results_title": "結果",
"correct_answers": "正解数",
"accuracy": "正解率",
"result_excellent": "素晴らしい!テキストをよく理解できました。",
"result_good": "よくできました!大部分を理解できました。",
"result_practice": "もう一度注意深く読んでみてください。",
"translation": "翻訳",
"show_translation": "翻訳を表示",
"hide_translation": "翻訳を隠す"
},
"level_test": {
"show_translation_btn": "👁️ 質問の翻訳を表示",
@@ -322,5 +395,29 @@
"err_not_found": "❌ エラー: 単語が見つかりません",
"already_exists": "単語 '{word}' はすでに単語帳にあります",
"added_single": "✅ 単語 '{word}' を単語帳に追加しました"
},
"exercises": {
"title": "📖 <b>文法練習</b>",
"choose_topic": "練習するトピックを選択してください:",
"your_level": "あなたのレベル: <b>{level}</b>",
"generating_rule": "🔄 文法説明を生成中...",
"generating": "🔄 練習問題を生成中...",
"generate_failed": "❌ 練習問題の生成に失敗しました。後でもう一度お試しください。",
"start_btn": "▶️ 練習を開始",
"task_header": "📝 <b>練習: {topic}</b>",
"instruction": "正しい形式で空欄を埋めてください:",
"check_btn": "✅ 確認",
"next_btn": "➡️ 次へ",
"results_btn": "📊 結果",
"back_btn": "⬅️ トピックに戻る",
"close_btn": "❌ 閉じる",
"correct": "✅ <b>正解!</b>",
"incorrect": "❌ <b>不正解</b>",
"your_answer": "あなたの回答: {answer}",
"right_answer": "正解: {answer}",
"explanation": "💡 {text}",
"score": "スコア: {total}問中{correct}問正解",
"no_topics": "あなたのレベルで利用可能なトピックはまだありません。",
"write_answer": "回答を入力してください:"
}
}

View File

@@ -1,15 +1,34 @@
{
"menu": {
"wordofday": "🌅 Слово дня",
"add": " Добавить слово",
"vocab": "📚 Словарь",
"task": "🧠 Задание",
"practice": "💬 Практика",
"exercises": "📖 Упражнения",
"words": "🎯 Тематические слова",
"import": "📖 Импорт",
"stats": "📊 Статистика",
"settings": "⚙️ Настройки",
"below": "Главное меню доступно ниже ⤵️"
},
"practice_menu": {
"title": "Практика",
"choose": "Выбери режим практики:",
"stories": "Мини-истории",
"ai_chat": "Диалог с AI"
},
"wod": {
"title": "Слово дня",
"generating": "🔄 Генерирую слово дня...",
"failed": "❌ Не удалось сгенерировать слово дня. Попробуй позже.",
"not_available": "🕐 Слово дня ещё не готово.\n\nСлова генерируются ежедневно в 00:00 UTC.\nПопробуй позже!",
"examples": "Примеры",
"synonyms": "Синонимы",
"add_btn": " Добавить в словарь",
"added": "Добавлено в словарь!",
"not_found": "Слово не найдено"
},
"add_menu": {
"title": " <b>Добавление слов</b>\n\nВыберите способ:",
"manual": "📝 Вручную",
@@ -55,7 +74,7 @@
"skip_msg": "✅ Хорошо!\n\nТы можешь пройти тест позже командой /level_test\nили установить уровень вручную в /settings\n\nДавай начнём! Попробуй:\n• /words travel - тематическая подборка\n• /practice - диалог с AI\n• /add hello - добавить слово"
},
"add": {
"prompt": "Отправь слово, которое хочешь добавить:\nНапример: <code>/add elephant</code>\n\nИли просто отправь слово без команды!",
"prompt": "Отправь слово, которое хочешь добавить:\n• Одно слово: <code>/add elephant</code>\n• Несколько: <code>/add apple, banana, orange</code>\n\nИли просто отправь слово без команды!",
"searching": "⏳ Ищу перевод и примеры...",
"examples_header": "<b>Примеры:</b>",
"translations_header": "<b>Переводы:</b>",
@@ -69,6 +88,13 @@
"added_success": "✅ Слово '<b>{word}</b>' добавлено!\n\nВсего слов в словаре: {count}\n\nПродолжай добавлять новые слова или используй /task для практики!",
"cancelled": "Отменено. Можешь добавить другое слово командой /add"
},
"add_batch": {
"header": "📝 <b>Слова для добавления ({n}):</b>",
"translating": "⏳ Перевожу {n} слов...",
"choose": "Выбери слова для добавления или добавь все сразу:",
"truncated": "⚠️ Слишком много слов. Показаны первые {n}.",
"failed": "❌ Не удалось получить переводы. Попробуй позже."
},
"vocab": {
"empty": "📚 Твой словарь пока пуст!\n\nДобавь первое слово командой /add или просто отправь мне слово.",
"header": "<b>📚 Твой словарь:</b>",
@@ -180,7 +206,54 @@
"invalid_format": "❌ Неверный формат времени!\n\nИспользуй формат <b>HH:MM</b> (например, 09:00 или 18:30)\nИли отправь /cancel для отмены",
"time_set_title": "✅ <b>Время установлено!</b>",
"status_on_line": "Статус: <b>Включены</b>",
"use_settings": "Используй /reminder для изменения настроек."
"use_settings": "Используй /reminder для изменения настроек.",
"daily_title": "⏰ <b>Время для практики!</b>",
"daily_wod": "🌅 <b>Слово дня:</b>",
"daily_tips": "Не забудь потренироваться сегодня:\n• /task - выполни задания\n• /practice - попрактикуй диалог\n• /words - добавь новые слова",
"daily_motivation": "💪 Регулярная практика - ключ к успеху!"
},
"story": {
"title": "Мини-истории",
"choose_genre": "Выбери жанр истории:",
"genre": {
"dialogue": "Диалоги",
"news": "Новости",
"story": "Рассказы",
"letter": "Письма",
"recipe": "Рецепты"
},
"generating": "🔄 Генерирую историю...",
"failed": "❌ Не удалось сгенерировать историю. Попробуй ещё раз.",
"try_again": "Попробовать снова",
"level": "Уровень",
"words": "слов",
"questions_btn": "Вопросы",
"vocab_btn": "Словарь",
"new_btn": "Новая история",
"back": "Назад",
"not_found": "История не найдена",
"no_vocab": "Нет слов для изучения",
"no_questions": "Нет вопросов",
"vocabulary": "Словарь истории",
"add_all": "Добавить все",
"word_added": "✅ Слово '{word}' добавлено!",
"words_added": "✅ Добавлено слов: {n}",
"word_not_found": "Слово не найдено",
"question": "Вопрос",
"question_not_found": "Вопрос не найден",
"correct": "✅ Правильно!",
"incorrect": "❌ Неправильно",
"next_question": "Следующий вопрос",
"show_results": "Результаты",
"results_title": "Результаты",
"correct_answers": "Правильных ответов",
"accuracy": "Точность",
"result_excellent": "Отличный результат! Ты хорошо понял текст.",
"result_good": "Хорошо! Большую часть текста ты понял.",
"result_practice": "Попробуй перечитать историю внимательнее.",
"translation": "Перевод",
"show_translation": "Показать перевод",
"hide_translation": "Скрыть перевод"
},
"stats": {
"header": "📊 <b>Твоя статистика</b>",
@@ -330,5 +403,29 @@
"err_not_found": "❌ Ошибка: слово не найдено",
"already_exists": "Слово '{word}' уже в словаре",
"added_single": "✅ Слово '{word}' добавлено в словарь"
},
"exercises": {
"title": "📖 <b>Грамматические упражнения</b>",
"choose_topic": "Выбери тему для упражнения:",
"your_level": "Твой уровень: <b>{level}</b>",
"generating_rule": "🔄 Генерирую объяснение правила...",
"generating": "🔄 Генерирую упражнения...",
"generate_failed": "❌ Не удалось сгенерировать упражнение. Попробуй позже.",
"start_btn": "▶️ Начать упражнения",
"task_header": "📝 <b>Упражнение: {topic}</b>",
"instruction": "Заполни пропуски правильной формой:",
"check_btn": "✅ Проверить",
"next_btn": "➡️ Следующее",
"results_btn": "📊 Результаты",
"back_btn": "⬅️ К темам",
"close_btn": "❌ Закрыть",
"correct": "✅ <b>Правильно!</b>",
"incorrect": "❌ <b>Неправильно</b>",
"your_answer": "Твой ответ: {answer}",
"right_answer": "Правильный ответ: {answer}",
"explanation": "💡 {text}",
"score": "Результат: {correct} из {total}",
"no_topics": "Для твоего уровня пока нет доступных тем.",
"write_answer": "Напиши свой ответ:"
}
}