feat(i18n): localize start/help/menu, practice, words, import, reminder, vocabulary, tasks/stats for RU/EN/JA; add JSON-based i18n helper\n\nfeat(lang): support learning/translation languages across AI flows; hide translations with buttons; store examples per lang\n\nfeat(vocab): add source_lang and translation_lang to Vocabulary, unique constraint (user_id, source_lang, word_original); filter /vocabulary by user.learning_language\n\nchore(migrations): add Alembic setup + migration to add vocab lang columns; env.py reads app settings and supports asyncpg URLs\n\nfix(words/import): pass learning_lang + translation_lang everywhere; fix menu themes generation\n\nfeat(settings): add learning language selector; update main menu on language change
This commit is contained in:
183
locales/en.json
Normal file
183
locales/en.json
Normal file
@@ -0,0 +1,183 @@
|
||||
{
|
||||
"menu": {
|
||||
"add": "➕ Add word",
|
||||
"vocab": "📚 Vocabulary",
|
||||
"task": "🧠 Task",
|
||||
"practice": "💬 Practice",
|
||||
"words": "🎯 Thematic words",
|
||||
"import": "📖 Import from text",
|
||||
"stats": "📊 Stats",
|
||||
"settings": "⚙️ Settings",
|
||||
"below": "Main menu below ⤵️"
|
||||
},
|
||||
"common": {
|
||||
"start_first": "First run /start to register",
|
||||
"translation": "Translation"
|
||||
},
|
||||
"import": {
|
||||
"title": "📖 <b>Import words from text</b>",
|
||||
"desc": "Send me text in your learning language, and I will extract useful words to study.",
|
||||
"can_send": "You may send:\n• A passage from a book or article\n• A song lyric\n• A description\n• Any interesting text",
|
||||
"cancel_hint": "Send /cancel to abort.",
|
||||
"too_short": "⚠️ Text is too short. Send at least 50 characters.\nOr use /cancel to abort.",
|
||||
"too_long": "⚠️ Text is too long (max 3000 chars).\nSend a shorter text or use /cancel to abort.",
|
||||
"processing": "🔄 Analyzing text and extracting words...",
|
||||
"failed": "❌ Failed to extract words. Try another text or later.",
|
||||
"found_header": "📚 <b>Found words: {n}</b>",
|
||||
"added_single": "✅ Word '{word}' added to vocabulary",
|
||||
"added_count": "✅ Added words: <b>{n}</b>",
|
||||
"skipped_count": "⚠️ Skipped (already in vocabulary): {n}"
|
||||
},
|
||||
"start": {
|
||||
"new_intro": "👋 Hi, {first_name}!\n\nI'm a bot to learn English. I will help you to:\n📚 Grow your vocabulary (manual/thematic/from text)\n✍️ Do interactive exercises\n💬 Practice conversation with AI\n📊 Track your progress\n\n<b>Commands:</b>\n• /add [word] - add a word\n• /words [topic] - thematic selection\n• /import - import from text\n• /vocabulary - my dictionary\n• /task - exercises\n• /practice - AI dialogue\n• /stats - statistics\n• /settings - settings\n• /reminder - reminders\n• /help - full help",
|
||||
"offer_test": "🎯 <b>Shall we determine your level?</b>\n\nA short test (7 questions) will tailor tasks to your level.\nIt takes about 2–3 minutes.\n\nOr skip and set level later in /settings",
|
||||
"return": "Welcome back, {first_name}! 👋\n\nReady to continue?\n\n<b>Quick access:</b>\n• /vocabulary - view dictionary\n• /task - get an exercise\n• /practice - dialogue practice\n• /words [topic] - thematic words\n• /stats - statistics\n• /help - all commands",
|
||||
"help": "<b>📖 Commands help:</b>\n\n<b>Vocabulary:</b>\n• /add [word] - add to dictionary\n• /vocabulary - view dictionary\n• /words [topic] - thematic words\n• /import - import from text\n\n<b>Learning:</b>\n• /task - exercise (translate, fill gaps)\n• /practice - AI dialogue (6 scenarios)\n• /level_test - level test\n\n<b>Stats:</b>\n• /stats - your progress\n\n<b>Settings:</b>\n• /settings - level and language\n• /reminder - daily reminders\n\n💡 You can also just send me a word to add it!",
|
||||
"offer_btn": "📊 Take level test",
|
||||
"skip_btn": "➡️ Skip",
|
||||
"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!",
|
||||
"searching": "⏳ Looking up translation and examples...",
|
||||
"examples_header": "<b>Examples:</b>",
|
||||
"translation_label": "Translation",
|
||||
"category_label": "Category",
|
||||
"level_label": "Level",
|
||||
"confirm_question": "Add this word to your vocabulary?",
|
||||
"btn_add": "✅ Add",
|
||||
"btn_cancel": "❌ Cancel",
|
||||
"exists": "The word '<b>{word}</b>' is already in your vocabulary!\nTranslation: {translation}",
|
||||
"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"
|
||||
},
|
||||
"vocab": {
|
||||
"empty": "📚 Your vocabulary is empty!\n\nAdd your first word with /add or just send me a word.",
|
||||
"header": "<b>📚 Your vocabulary:</b>",
|
||||
"accuracy_inline": "({n}% accuracy)",
|
||||
"shown_last": "<i>Showing last 10 of {n} words</i>",
|
||||
"total": "<i>Total words: {n}</i>"
|
||||
},
|
||||
"practice": {
|
||||
"start_text": "💬 <b>Dialogue practice with AI</b>\n\nChoose a scenario:\n\n• AI will play a role\n• You can chat in English\n• AI will correct your mistakes\n• Use /stop to finish\n\nPick a scenario:",
|
||||
"hints": "💡 <b>Hints:</b>",
|
||||
"write_or_stop": "\n📝 Write your answer in English or use /stop to finish",
|
||||
"show_translation_btn": "👁️ Show translation",
|
||||
"stop_btn": "🔚 End dialogue",
|
||||
"scenario": {
|
||||
"restaurant": "🍽️ Restaurant",
|
||||
"shopping": "🛍️ Shopping",
|
||||
"travel": "✈️ Travel",
|
||||
"work": "💼 Work",
|
||||
"doctor": "🏥 Doctor",
|
||||
"casual": "💬 Casual"
|
||||
},
|
||||
"thinking_prepare": "🤔 AI is preparing the dialogue...",
|
||||
"empty_prompt": "Write something in the learning language or use /stop to finish",
|
||||
"thinking": "🤔 AI is thinking...",
|
||||
"corrections": "<b>Corrections:</b>",
|
||||
"end_title": "✅ <b>Dialogue finished!</b>",
|
||||
"end_exchanged": "Messages exchanged: <b>{n}</b>",
|
||||
"end_keep": "Great job! Keep practicing.",
|
||||
"end_hint": "Use /practice to start a new dialogue.",
|
||||
"translation_unavailable": "Translation unavailable",
|
||||
"translation_already": "Translation already shown"
|
||||
},
|
||||
"tasks": {
|
||||
"no_words": "📚 You don't have words to practice yet!\n\nAdd some words with /add and come back.",
|
||||
"stopped": "Exercises stopped. Use /task to start again.",
|
||||
"finished": "Exercises finished. Use /task to start again.",
|
||||
"header": "📝 <b>Task {i} of {n}</b>",
|
||||
"write_answer": "\n💡 Write your answer:",
|
||||
"checking": "⏳ Checking answer...",
|
||||
"correct": "✅ <b>Correct!</b>",
|
||||
"incorrect": "❌ <b>Incorrect</b>",
|
||||
"your_answer": "Your answer",
|
||||
"right_answer": "Right answer",
|
||||
"next_btn": "➡️ Next task",
|
||||
"stop_btn": "🔚 Stop",
|
||||
"cancelled": "Cancelled. You can return to tasks with /task.",
|
||||
"finish_title": "{emoji} <b>Task finished!</b>",
|
||||
"correct_of": "Correct answers: <b>{correct}</b> of {total}",
|
||||
"accuracy": "Accuracy: <b>{accuracy}%</b>",
|
||||
"use_task": "Use /task to start a new one",
|
||||
"use_stats": "Use /stats to view statistics",
|
||||
"comment": {
|
||||
"excellent": "Excellent result!",
|
||||
"good": "Good job!",
|
||||
"average": "Not bad, keep practicing!",
|
||||
"poor": "Review these words again!"
|
||||
}
|
||||
},
|
||||
"stats": {
|
||||
"header": "📊 <b>Your stats</b>",
|
||||
"total_words": "📚 Words in vocabulary: <b>{n}</b>",
|
||||
"studied_words": "📖 Words studied: <b>{n}</b>",
|
||||
"total_tasks": "✍️ Tasks completed: <b>{n}</b>",
|
||||
"correct_tasks": "✅ Correct answers: <b>{n}</b>",
|
||||
"accuracy": "🎯 Accuracy: <b>{n}%</b>",
|
||||
"hint_add_words": "Add words with /add to start learning!",
|
||||
"hint_first_task": "Do your first task with /task!",
|
||||
"hint_keep_practice": "Keep practicing! 💪"
|
||||
},
|
||||
"reminder": {
|
||||
"title": "⏰ <b>Reminders</b>",
|
||||
"status_on": "✅ Enabled",
|
||||
"status_off": "❌ Disabled",
|
||||
"time_not_set": "Not set",
|
||||
"status_line": "Status: {status}",
|
||||
"time_line": "Time: {time} UTC",
|
||||
"desc1": "Reminders help you keep up with daily practice.",
|
||||
"desc2": "The bot will send a message at the chosen time every day.",
|
||||
"btn_enable": "✅ Enable",
|
||||
"btn_disable": "❌ Disable",
|
||||
"btn_change_time": "⏰ Change time",
|
||||
"set_time_first": "Please set the reminder time first!",
|
||||
"enabled_toast": "✅ Reminders enabled!",
|
||||
"enabled_title": "✅ <b>Reminders enabled!</b>",
|
||||
"enabled_desc": "You will receive daily practice reminders.",
|
||||
"disabled_toast": "❌ Reminders disabled",
|
||||
"disabled_title": "❌ <b>Reminders disabled</b>",
|
||||
"disabled_desc": "Use /reminder to enable them again.",
|
||||
"set_title": "⏰ <b>Set reminder time</b>",
|
||||
"set_desc": "Send time in format <b>HH:MM</b> (UTC)",
|
||||
"set_examples": "Examples:\n• <code>09:00</code> - 9 AM UTC\n• <code>18:30</code> - 6:30 PM UTC\n• <code>20:00</code> - 8 PM UTC",
|
||||
"set_utc_hint": "💡 UTC = local offset may apply",
|
||||
"cancel_hint": "Send /cancel to abort",
|
||||
"cancelled": "❌ Time setup cancelled",
|
||||
"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."
|
||||
},
|
||||
"level_test": {
|
||||
"show_translation_btn": "👁️ Show question translation",
|
||||
"intro": "📊 <b>Level placement test</b>\n\nThis short test will help determine your English level.\n\n📋 The test has 7 questions:\n• Grammar\n• Vocabulary\n• Comprehension\n\n⏱ Takes about 2–3 minutes\n\nReady to start?",
|
||||
"start_btn": "✅ Start test",
|
||||
"cancel_btn": "❌ Cancel",
|
||||
"press_button": "Press the button when you're ready:",
|
||||
"cancelled": "❌ Test cancelled",
|
||||
"q_header": "❓ <b>Question {i} of {n}</b>"
|
||||
},
|
||||
"words": {
|
||||
"generating": "🔄 Generating words for topic '{theme}'...",
|
||||
"generate_failed": "❌ Failed to generate words. Please try again later.",
|
||||
"header": "📚 <b>Word set: {theme}</b>",
|
||||
"choose": "Choose words to add to your vocabulary:",
|
||||
"add_all_btn": "✅ Add all",
|
||||
"close_btn": "❌ Close",
|
||||
"help_title": "📚 <b>Thematic word sets</b>",
|
||||
"help_usage": "Use: <code>/words [topic]</code>",
|
||||
"help_examples": "Examples:\n• <code>/words travel</code> - travel\n• <code>/words food</code> - food\n• <code>/words work</code> - work\n• <code>/words nature</code> - nature\n• <code>/words technology</code> - technology",
|
||||
"help_note": "I will generate 10 words for the topic tailored to your level!",
|
||||
"popular": "Popular topics:",
|
||||
"topic_travel": "✈️ Travel",
|
||||
"topic_food": "🍔 Food",
|
||||
"topic_work": "💼 Work",
|
||||
"topic_nature": "🌿 Nature",
|
||||
"topic_technology": "💻 Technology",
|
||||
"err_not_found": "❌ Error: word not found",
|
||||
"already_exists": "The word '{word}' is already in your vocabulary",
|
||||
"added_single": "✅ Word '{word}' added to vocabulary"
|
||||
}
|
||||
}
|
||||
175
locales/ja.json
Normal file
175
locales/ja.json
Normal file
@@ -0,0 +1,175 @@
|
||||
{
|
||||
"menu": {
|
||||
"add": "➕ 単語を追加",
|
||||
"vocab": "📚 単語帳",
|
||||
"task": "🧠 課題",
|
||||
"practice": "💬 練習",
|
||||
"words": "🎯 テーマ別単語",
|
||||
"import": "📖 テキストからインポート",
|
||||
"stats": "📊 統計",
|
||||
"settings": "⚙️ 設定",
|
||||
"below": "メインメニューは下にあります ⤵️"
|
||||
},
|
||||
"common": {
|
||||
"start_first": "まず /start を実行してください",
|
||||
"translation": "翻訳"
|
||||
},
|
||||
"import": {
|
||||
"title": "📖 <b>テキストから単語をインポート</b>",
|
||||
"desc": "学習言語のテキストを送ってください。学習に役立つ単語を抽出します。",
|
||||
"can_send": "送れるもの:\n• 本や記事の一節\n• 歌詞\n• 説明文\n• 気になるテキスト",
|
||||
"cancel_hint": "/cancel で中止できます。",
|
||||
"too_short": "⚠️ テキストが短すぎます。50文字以上で送ってください。\n/cancel で中止できます。",
|
||||
"too_long": "⚠️ テキストが長すぎます(最大3000文字)。\n短くして送るか、/cancel を使ってください。",
|
||||
"processing": "🔄 テキストを分析して単語を抽出しています...",
|
||||
"failed": "❌ 単語の抽出に失敗しました。別のテキストか、後でもう一度お試しください。",
|
||||
"found_header": "📚 <b>見つかった単語: {n}</b>",
|
||||
"added_single": "✅ 単語 '{word}' を単語帳に追加しました",
|
||||
"added_count": "✅ 追加した単語: <b>{n}</b>",
|
||||
"skipped_count": "⚠️ スキップ(既に単語帳にあり): {n}"
|
||||
},
|
||||
"start": {
|
||||
"new_intro": "👋 こんにちは、{first_name} さん!\n\n私は英語学習を手助けするボットです。以下のことができます:\n📚 語彙を増やす(手動/テーマ別/テキストから)\n✍️ インタラクティブ課題に取り組む\n💬 AIとの会話練習\n📊 進捗を記録\n\n<b>コマンド:</b>\n• /add [word] - 単語を追加\n• /words [topic] - テーマ別単語\n• /import - テキストからインポート\n• /vocabulary - 単語帳\n• /task - 課題\n• /practice - 会話練習\n• /stats - 統計\n• /settings - 設定\n• /reminder - リマインダー\n• /help - ヘルプ",
|
||||
"offer_test": "🎯 <b>レベル診断を行いますか?</b>\n\n短いテスト(7問)であなたのレベルに合った課題を用意します。\n所要時間は約2〜3分です。\n\nまたは /settings から後で設定できます。",
|
||||
"return": "おかえりなさい、{first_name} さん! 👋\n\n学習を続けましょうか?\n\n<b>クイックアクセス:</b>\n• /vocabulary - 単語帳を見る\n• /task - 課題を受ける\n• /practice - 会話練習\n• /words [topic] - テーマ別単語\n• /stats - 統計\n• /help - すべてのコマンド",
|
||||
"help": "<b>📖 コマンド一覧:</b>\n\n<b>語彙:</b>\n• /add [word] - 単語を追加\n• /vocabulary - 単語帳\n• /words [topic] - テーマ別単語\n• /import - テキストからインポート\n\n<b>学習:</b>\n• /task - 課題(翻訳/穴埋め など)\n• /practice - AIとの会話(6シナリオ)\n• /level_test - レベル診断\n\n<b>統計:</b>\n• /stats - 進捗状況\n\n<b>設定:</b>\n• /settings - レベルと言語\n• /reminder - 毎日のリマインダー\n\n💡 単語を送るだけでも、追加を提案します!",
|
||||
"offer_btn": "📊 レベル診断を受ける",
|
||||
"skip_btn": "➡️ スキップ",
|
||||
"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です!",
|
||||
"searching": "⏳ 翻訳と例を検索中...",
|
||||
"examples_header": "<b>例文:</b>",
|
||||
"translation_label": "翻訳",
|
||||
"category_label": "カテゴリー",
|
||||
"level_label": "レベル",
|
||||
"confirm_question": "この単語を単語帳に追加しますか?",
|
||||
"btn_add": "✅ 追加",
|
||||
"btn_cancel": "❌ キャンセル",
|
||||
"exists": "単語 '<b>{word}</b>' はすでに単語帳にあります!\n翻訳: {translation}",
|
||||
"added_success": "✅ 単語 '<b>{word}</b>' を追加しました!\n\n単語帳の総数: {count}\n\nさらに追加するか、/task で練習しましょう!",
|
||||
"cancelled": "キャンセルしました。/add で別の単語を追加できます"
|
||||
},
|
||||
"vocab": {
|
||||
"empty": "📚 単語帳はまだ空です!\n\n/add で最初の単語を追加するか、単語を直接送ってください。",
|
||||
"header": "<b>📚 あなたの単語帳:</b>",
|
||||
"accuracy_inline": "(正答率 {n}%)",
|
||||
"shown_last": "<i>{n} 語のうち最新の10語を表示</i>",
|
||||
"total": "<i>合計: {n} 語</i>"
|
||||
},
|
||||
"practice": {
|
||||
"start_text": "💬 <b>AIとの会話練習</b>\n\nシナリオを選んでください:\n\n• AIが相手役を務めます\n• 英語でやり取りできます\n• 間違いをAIが指摘します\n• 終了するには /stop を使用\n\nシナリオを選択:",
|
||||
"hints": "💡 <b>ヒント:</b>",
|
||||
"write_or_stop": "\n📝 英語で返信するか、/stop で終了できます",
|
||||
"show_translation_btn": "👁️ 翻訳を表示",
|
||||
"stop_btn": "🔚 会話を終了",
|
||||
"thinking_prepare": "🤔 AI が会話の準備中...",
|
||||
"empty_prompt": "学習言語で入力するか、/stop で終了できます",
|
||||
"thinking": "🤔 AI が考えています...",
|
||||
"corrections": "<b>修正:</b>",
|
||||
"end_title": "✅ <b>会話を終了しました!</b>",
|
||||
"end_exchanged": "やり取りしたメッセージ数: <b>{n}</b>",
|
||||
"end_keep": "素晴らしい!練習を続けましょう。",
|
||||
"end_hint": "/practice で新しい会話を始められます。",
|
||||
"translation_unavailable": "翻訳は利用できません",
|
||||
"translation_already": "翻訳はすでに表示されています"
|
||||
},
|
||||
"tasks": {
|
||||
"no_words": "📚 まだ練習用の単語がありません!\n\n/add で単語を追加してから戻ってきてください。",
|
||||
"stopped": "課題を停止しました。/task で再開できます。",
|
||||
"finished": "課題が完了しました。/task で新しく始めましょう。",
|
||||
"header": "📝 <b>{n}問中 {i} 問目</b>",
|
||||
"write_answer": "\n💡 回答を入力してください:",
|
||||
"checking": "⏳ 回答を確認中...",
|
||||
"correct": "✅ <b>正解!</b>",
|
||||
"incorrect": "❌ <b>不正解</b>",
|
||||
"your_answer": "あなたの回答",
|
||||
"right_answer": "正解",
|
||||
"next_btn": "➡️ 次へ",
|
||||
"stop_btn": "🔚 停止",
|
||||
"cancelled": "キャンセルしました。/task で課題に戻れます。",
|
||||
"finish_title": "{emoji} <b>課題が終了しました!</b>",
|
||||
"correct_of": "正解数: <b>{correct}</b> / {total}",
|
||||
"accuracy": "正答率: <b>{accuracy}%</b>",
|
||||
"use_task": "/task で新しい課題を開始",
|
||||
"use_stats": "/stats で統計を表示",
|
||||
"comment": {
|
||||
"excellent": "素晴らしい結果です!",
|
||||
"good": "よくできました!",
|
||||
"average": "悪くありません。練習を続けましょう!",
|
||||
"poor": "もう一度見直しましょう!"
|
||||
}
|
||||
},
|
||||
"stats": {
|
||||
"header": "📊 <b>統計</b>",
|
||||
"total_words": "📚 単語帳の単語数: <b>{n}</b>",
|
||||
"studied_words": "📖 学習済みの単語: <b>{n}</b>",
|
||||
"total_tasks": "✍️ 完了した課題: <b>{n}</b>",
|
||||
"correct_tasks": "✅ 正解数: <b>{n}</b>",
|
||||
"accuracy": "🎯 正答率: <b>{n}%</b>",
|
||||
"hint_add_words": "/add で単語を追加して学習を始めましょう!",
|
||||
"hint_first_task": "/task で最初の課題をやってみましょう!",
|
||||
"hint_keep_practice": "練習を続けましょう! 💪"
|
||||
},
|
||||
"reminder": {
|
||||
"title": "⏰ <b>リマインダー</b>",
|
||||
"status_on": "✅ 有効",
|
||||
"status_off": "❌ 無効",
|
||||
"time_not_set": "未設定",
|
||||
"status_line": "ステータス: {status}",
|
||||
"time_line": "時間: {time} UTC",
|
||||
"desc1": "リマインダーは毎日の学習を忘れないように役立ちます。",
|
||||
"desc2": "ボットは毎日、設定した時間にメッセージを送信します。",
|
||||
"btn_enable": "✅ 有効にする",
|
||||
"btn_disable": "❌ 無効にする",
|
||||
"btn_change_time": "⏰ 時間を変更",
|
||||
"set_time_first": "まずリマインダーの時間を設定してください!",
|
||||
"enabled_toast": "✅ リマインダーを有効にしました!",
|
||||
"enabled_title": "✅ <b>リマインダーが有効になりました!</b>",
|
||||
"enabled_desc": "毎日、練習のリマインダーが届きます。",
|
||||
"disabled_toast": "❌ リマインダーを無効にしました",
|
||||
"disabled_title": "❌ <b>リマインダーは無効です</b>",
|
||||
"disabled_desc": "/reminder で再度有効にできます。",
|
||||
"set_title": "⏰ <b>リマインダーの時間設定</b>",
|
||||
"set_desc": "<b>HH:MM</b>(UTC)形式で時間を送ってください",
|
||||
"set_examples": "例:\n• <code>09:00</code> - UTCの午前9時\n• <code>18:30</code> - UTCの午後6時30分\n• <code>20:00</code> - UTCの午後8時",
|
||||
"set_utc_hint": "💡 UTC = お住まいのタイムゾーンに合わせて換算してください",
|
||||
"cancel_hint": "/cancel で中止できます",
|
||||
"cancelled": "❌ 時間設定を中止しました",
|
||||
"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 で設定を変更できます。"
|
||||
},
|
||||
"level_test": {
|
||||
"show_translation_btn": "👁️ 質問の翻訳を表示",
|
||||
"intro": "📊 <b>レベル判定テスト</b>\n\n短いテストで英語レベルを判定します。\n\n📋 全7問:\n• 文法\n• 語彙\n• 読解\n\n⏱ 所要時間は約2〜3分\n\n準備はいいですか?",
|
||||
"start_btn": "✅ テストを開始",
|
||||
"cancel_btn": "❌ キャンセル",
|
||||
"press_button": "準備ができたらボタンを押してください:",
|
||||
"cancelled": "❌ テストを中止しました",
|
||||
"q_header": "❓ <b>{n}問中 {i} 問目</b>"
|
||||
},
|
||||
"words": {
|
||||
"generating": "🔄 テーマ『{theme}』の単語を生成中...",
|
||||
"generate_failed": "❌ 単語の生成に失敗しました。後でもう一度お試しください。",
|
||||
"header": "📚 <b>単語セット: {theme}</b>",
|
||||
"choose": "単語帳に追加する単語を選択してください:",
|
||||
"add_all_btn": "✅ すべて追加",
|
||||
"close_btn": "❌ 閉じる",
|
||||
"help_title": "📚 <b>テーマ別単語</b>",
|
||||
"help_usage": "使い方: <code>/words [テーマ]</code>",
|
||||
"help_examples": "例:\n• <code>/words travel</code> - 旅行\n• <code>/words food</code> - 食べ物\n• <code>/words work</code> - 仕事\n• <code>/words nature</code> - 自然\n• <code>/words technology</code> - テクノロジー",
|
||||
"help_note": "レベルに合わせて10語を生成します!",
|
||||
"popular": "人気のテーマ:",
|
||||
"topic_travel": "✈️ 旅行",
|
||||
"topic_food": "🍔 食べ物",
|
||||
"topic_work": "💼 仕事",
|
||||
"topic_nature": "🌿 自然",
|
||||
"topic_technology": "💻 テクノロジー",
|
||||
"err_not_found": "❌ エラー: 単語が見つかりません",
|
||||
"already_exists": "単語 '{word}' はすでに単語帳にあります",
|
||||
"added_single": "✅ 単語 '{word}' を単語帳に追加しました"
|
||||
}
|
||||
}
|
||||
183
locales/ru.json
Normal file
183
locales/ru.json
Normal file
@@ -0,0 +1,183 @@
|
||||
{
|
||||
"menu": {
|
||||
"add": "➕ Добавить слово",
|
||||
"vocab": "📚 Словарь",
|
||||
"task": "🧠 Задание",
|
||||
"practice": "💬 Практика",
|
||||
"words": "🎯 Тематические слова",
|
||||
"import": "📖 Импорт из текста",
|
||||
"stats": "📊 Статистика",
|
||||
"settings": "⚙️ Настройки",
|
||||
"below": "Главное меню доступно ниже ⤵️"
|
||||
},
|
||||
"common": {
|
||||
"start_first": "Сначала запусти бота командой /start",
|
||||
"translation": "Перевод"
|
||||
},
|
||||
"import": {
|
||||
"title": "📖 <b>Импорт слов из текста</b>",
|
||||
"desc": "Отправь мне текст на выбранном языке обучения, и я извлеку из него полезные слова для изучения.",
|
||||
"can_send": "Можно отправить:\n• Отрывок из книги или статьи\n• Текст песни\n• Описание чего-либо\n• Любой интересный текст",
|
||||
"cancel_hint": "Отправь /cancel для отмены.",
|
||||
"too_short": "⚠️ Текст слишком короткий. Отправь текст минимум из 50 символов.\nИли используй /cancel для отмены.",
|
||||
"too_long": "⚠️ Текст слишком длинный (максимум 3000 символов).\nОтправь текст покороче или используй /cancel для отмены.",
|
||||
"processing": "🔄 Анализирую текст и извлекаю слова...",
|
||||
"failed": "❌ Не удалось извлечь слова из текста. Попробуй другой текст или повтори позже.",
|
||||
"found_header": "📚 <b>Найдено слов: {n}</b>",
|
||||
"added_single": "✅ Слово '{word}' добавлено в словарь",
|
||||
"added_count": "✅ Добавлено слов: <b>{n}</b>",
|
||||
"skipped_count": "⚠️ Пропущено (уже в словаре): {n}"
|
||||
},
|
||||
"start": {
|
||||
"new_intro": "👋 Привет, {first_name}!\n\nЯ бот для изучения английского языка. Помогу тебе:\n📚 Пополнять словарный запас (ручное/тематическое/из текста)\n✍️ Выполнять интерактивные задания\n💬 Практиковать язык в диалоге с AI\n📊 Отслеживать свой прогресс\n\n<b>Команды:</b>\n• /add [слово] - добавить слово\n• /words [тема] - тематическая подборка\n• /import - импорт из текста\n• /vocabulary - мой словарь\n• /task - задания\n• /practice - диалог с AI\n• /stats - статистика\n• /settings - настройки\n• /reminder - напоминания\n• /help - полная справка",
|
||||
"offer_test": "🎯 <b>Определим твой уровень?</b>\n\nКороткий тест (7 вопросов) поможет подобрать задания под твой уровень.\nЭто займёт 2-3 минуты.\n\nИли можешь пропустить и установить уровень вручную позже в /settings",
|
||||
"return": "С возвращением, {first_name}! 👋\n\nГотов продолжить обучение?\n\n<b>Быстрый доступ:</b>\n• /vocabulary - посмотреть словарь\n• /task - получить задание\n• /practice - практика диалога\n• /words [тема] - тематическая подборка\n• /stats - статистика\n• /help - все команды",
|
||||
"help": "<b>📖 Справка по командам:</b>\n\n<b>Управление словарём:</b>\n• /add [слово] - добавить слово в словарь\n• /vocabulary - просмотр словаря\n• /words [тема] - тематическая подборка слов\n• /import - импортировать слова из текста\n\n<b>Обучение:</b>\n• /task - задание (перевод, заполнение пропусков)\n• /practice - диалог с ИИ (6 сценариев)\n• /level_test - тест определения уровня\n\n<b>Статистика:</b>\n• /stats - твой прогресс\n\n<b>Настройки:</b>\n• /settings - уровень и язык\n• /reminder - ежедневные напоминания\n\n💡 Ты также можешь просто отправить мне слово, и я предложу добавить его в словарь!",
|
||||
"offer_btn": "📊 Пройти тест уровня",
|
||||
"skip_btn": "➡️ Пропустить",
|
||||
"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Или просто отправь слово без команды!",
|
||||
"searching": "⏳ Ищу перевод и примеры...",
|
||||
"examples_header": "<b>Примеры:</b>",
|
||||
"translation_label": "Перевод",
|
||||
"category_label": "Категория",
|
||||
"level_label": "Уровень",
|
||||
"confirm_question": "Добавить это слово в словарь?",
|
||||
"btn_add": "✅ Добавить",
|
||||
"btn_cancel": "❌ Отмена",
|
||||
"exists": "Слово '<b>{word}</b>' уже есть в твоём словаре!\nПеревод: {translation}",
|
||||
"added_success": "✅ Слово '<b>{word}</b>' добавлено!\n\nВсего слов в словаре: {count}\n\nПродолжай добавлять новые слова или используй /task для практики!",
|
||||
"cancelled": "Отменено. Можешь добавить другое слово командой /add"
|
||||
},
|
||||
"vocab": {
|
||||
"empty": "📚 Твой словарь пока пуст!\n\nДобавь первое слово командой /add или просто отправь мне слово.",
|
||||
"header": "<b>📚 Твой словарь:</b>",
|
||||
"accuracy_inline": "({n}% точность)",
|
||||
"shown_last": "<i>Показаны последние 10 из {n} слов</i>",
|
||||
"total": "<i>Всего слов: {n}</i>"
|
||||
},
|
||||
"practice": {
|
||||
"start_text": "💬 <b>Диалоговая практика с AI</b>\n\nВыбери сценарий для разговора:\n\n• AI будет играть роль собеседника\n• Ты можешь общаться на английском\n• AI будет исправлять твои ошибки\n• Используй /stop для завершения диалога\n\nВыбери сценарий:",
|
||||
"hints": "💡 <b>Подсказки:</b>",
|
||||
"write_or_stop": "\n📝 Напиши свой ответ на английском или используй /stop для завершения",
|
||||
"show_translation_btn": "👁️ Показать перевод",
|
||||
"stop_btn": "🔚 Завершить диалог",
|
||||
"scenario": {
|
||||
"restaurant": "🍽️ Ресторан",
|
||||
"shopping": "🛍️ Магазин",
|
||||
"travel": "✈️ Путешествие",
|
||||
"work": "💼 Работа",
|
||||
"doctor": "🏥 Врач",
|
||||
"casual": "💬 Общение"
|
||||
},
|
||||
"thinking_prepare": "🤔 AI готовится к диалогу...",
|
||||
"empty_prompt": "Напиши что-нибудь на языке обучения или используй /stop для завершения",
|
||||
"thinking": "🤔 AI думает...",
|
||||
"corrections": "<b>Исправления:</b>",
|
||||
"end_title": "✅ <b>Диалог завершён!</b>",
|
||||
"end_exchanged": "Сообщений обменено: <b>{n}</b>",
|
||||
"end_keep": "Отличная работа! Продолжай практиковаться.",
|
||||
"end_hint": "Используй /practice для нового диалога.",
|
||||
"translation_unavailable": "Перевод недоступен",
|
||||
"translation_already": "Перевод уже показан"
|
||||
},
|
||||
"tasks": {
|
||||
"no_words": "📚 У тебя пока нет слов для практики!\n\nДобавь несколько слов командой /add, а затем возвращайся.",
|
||||
"stopped": "Задания остановлены. Используй /task, чтобы начать заново.",
|
||||
"finished": "Задания завершены. Используй /task, чтобы начать заново.",
|
||||
"header": "📝 <b>Задание {i} из {n}</b>",
|
||||
"write_answer": "\n💡 Напиши свой ответ:",
|
||||
"checking": "⏳ Проверяю ответ...",
|
||||
"correct": "✅ <b>Правильно!</b>",
|
||||
"incorrect": "❌ <b>Неправильно</b>",
|
||||
"your_answer": "Твой ответ",
|
||||
"right_answer": "Правильный ответ",
|
||||
"next_btn": "➡️ Следующее задание",
|
||||
"stop_btn": "🔚 Завершить",
|
||||
"cancelled": "Отменено. Можешь вернуться к заданиям командой /task.",
|
||||
"finish_title": "{emoji} <b>Задание завершено!</b>",
|
||||
"correct_of": "Правильных ответов: <b>{correct}</b> из {total}",
|
||||
"accuracy": "Точность: <b>{accuracy}%</b>",
|
||||
"use_task": "Используй /task для нового задания",
|
||||
"use_stats": "Используй /stats для просмотра статистики",
|
||||
"comment": {
|
||||
"excellent": "Отличный результат!",
|
||||
"good": "Хорошая работа!",
|
||||
"average": "Неплохо, продолжай практиковаться!",
|
||||
"poor": "Повтори эти слова еще раз!"
|
||||
}
|
||||
},
|
||||
"reminder": {
|
||||
"title": "⏰ <b>Напоминания</b>",
|
||||
"status_on": "✅ Включены",
|
||||
"status_off": "❌ Выключены",
|
||||
"time_not_set": "Не установлено",
|
||||
"status_line": "Статус: {status}",
|
||||
"time_line": "Время: {time} UTC",
|
||||
"desc1": "Напоминания помогут не забывать о ежедневной практике.",
|
||||
"desc2": "Бот будет присылать сообщение в выбранное время каждый день.",
|
||||
"btn_enable": "✅ Включить",
|
||||
"btn_disable": "❌ Выключить",
|
||||
"btn_change_time": "⏰ Изменить время",
|
||||
"set_time_first": "Сначала установи время напоминаний!",
|
||||
"enabled_toast": "✅ Напоминания включены!",
|
||||
"enabled_title": "✅ <b>Напоминания включены!</b>",
|
||||
"enabled_desc": "Ты будешь получать ежедневные напоминания о практике.",
|
||||
"disabled_toast": "❌ Напоминания выключены",
|
||||
"disabled_title": "❌ <b>Напоминания выключены</b>",
|
||||
"disabled_desc": "Используй /reminder чтобы включить их снова.",
|
||||
"set_title": "⏰ <b>Установка времени напоминаний</b>",
|
||||
"set_desc": "Отправь время в формате <b>HH:MM</b> (UTC)",
|
||||
"set_examples": "Примеры:\n• <code>09:00</code> - 9 утра по UTC\n• <code>18:30</code> - 18:30 по UTC\n• <code>20:00</code> - 8 вечера по UTC",
|
||||
"set_utc_hint": "💡 UTC = МСК - 3 часа\n(если хочешь 12:00 по МСК, введи 09:00)",
|
||||
"cancel_hint": "Отправь /cancel для отмены",
|
||||
"cancelled": "❌ Установка времени отменена",
|
||||
"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 для изменения настроек."
|
||||
},
|
||||
"stats": {
|
||||
"header": "📊 <b>Твоя статистика</b>",
|
||||
"total_words": "📚 Слов в словаре: <b>{n}</b>",
|
||||
"studied_words": "📖 Слов изучено: <b>{n}</b>",
|
||||
"total_tasks": "✍️ Заданий выполнено: <b>{n}</b>",
|
||||
"correct_tasks": "✅ Правильных ответов: <b>{n}</b>",
|
||||
"accuracy": "🎯 Точность: <b>{n}%</b>",
|
||||
"hint_add_words": "Добавь слова командой /add чтобы начать обучение!",
|
||||
"hint_first_task": "Выполни первое задание командой /task!",
|
||||
"hint_keep_practice": "Продолжай практиковаться! 💪"
|
||||
},
|
||||
"level_test": {
|
||||
"show_translation_btn": "👁️ Показать перевод вопроса",
|
||||
"intro": "📊 <b>Тест определения уровня</b>\n\nЭтот короткий тест поможет определить твой уровень английского.\n\n📋 Тест включает 7 вопросов:\n• Грамматика\n• Лексика\n• Понимание\n\n⏱ Займёт около 2-3 минут\n\nГотов начать?",
|
||||
"start_btn": "✅ Начать тест",
|
||||
"cancel_btn": "❌ Отмена",
|
||||
"press_button": "Нажми кнопку когда будешь готов:",
|
||||
"cancelled": "❌ Тест отменён",
|
||||
"q_header": "❓ <b>Вопрос {i} из {n}</b>"
|
||||
},
|
||||
"words": {
|
||||
"generating": "🔄 Генерирую подборку слов по теме '{theme}'...",
|
||||
"generate_failed": "❌ Не удалось сгенерировать подборку. Попробуй позже.",
|
||||
"header": "📚 <b>Подборка слов: {theme}</b>",
|
||||
"choose": "Выбери слова, которые хочешь добавить в словарь:",
|
||||
"add_all_btn": "✅ Добавить все",
|
||||
"close_btn": "❌ Закрыть",
|
||||
"help_title": "📚 <b>Тематические подборки слов</b>",
|
||||
"help_usage": "Используй: <code>/words [тема]</code>",
|
||||
"help_examples": "Примеры:\n• <code>/words travel</code> - путешествия\n• <code>/words food</code> - еда\n• <code>/words work</code> - работа\n• <code>/words nature</code> - природа\n• <code>/words technology</code> - технологии",
|
||||
"help_note": "Я сгенерирую 10 слов по теме, подходящих для твоего уровня!",
|
||||
"popular": "Популярные темы:",
|
||||
"topic_travel": "✈️ Путешествия",
|
||||
"topic_food": "🍔 Еда",
|
||||
"topic_work": "💼 Работа",
|
||||
"topic_nature": "🌿 Природа",
|
||||
"topic_technology": "💻 Технологии",
|
||||
"err_not_found": "❌ Ошибка: слово не найдено",
|
||||
"already_exists": "Слово '{word}' уже в словаре",
|
||||
"added_single": "✅ Слово '{word}' добавлено в словарь"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user