{"id":423,"date":"2025-12-03T07:18:55","date_gmt":"2025-12-03T07:18:55","guid":{"rendered":"https:\/\/i-cte.org\/robot\/?p=423"},"modified":"2025-12-03T07:18:55","modified_gmt":"2025-12-03T07:18:55","slug":"hopes-and-intentions-vocabulary","status":"publish","type":"post","link":"https:\/\/i-cte.org\/robot\/hopes-and-intentions-vocabulary\/","title":{"rendered":"Hopes and Intentions &#8211; Vocabulary"},"content":{"rendered":"\n<p>This Robot is used for practicing English at level A2. In order to interact with this Robot smoothly, please use a laptop, desktop, or iPad. Do not use Smartphones, though they are sometimes fine. It depends on the updated browsers and Internet connection.<\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Hopes and Intentions &#8211; Vocabulary<\/title>\n    <style>\n        \/* Reset and Base Styles *\/\n        * {\n            box-sizing: border-box;\n        }\n\n        body {\n            font-family: Arial, sans-serif;\n            background-color: #f4f6f8;\n            margin: 0;\n            padding: 0;\n            display: flex;\n            flex-direction: column;\n            min-height: 100vh;\n        }\n\n        \/* Menu Styles *\/\n        .menu {\n            width: 100%;\n            background-color: #28a745;\n            padding: 10px;\n            text-align: center;\n            box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);\n            margin-bottom: 10px;\n            overflow-x: auto;\n            white-space: nowrap;\n        }\n        .menu a {\n            color: #fff;\n            text-decoration: none;\n            margin: 0 10px;\n            font-weight: bold;\n            font-size: 14px;\n            display: inline-block;\n        }\n        .menu a:hover,\n        .menu a:focus {\n            text-decoration: underline;\n            outline: 2px dashed #fff;\n            outline-offset: 4px;\n        }\n\n        \/* Container Styles *\/\n        .container {\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            padding: 10px;\n            box-sizing: border-box;\n            flex: 1 0 auto;\n            width: 100%;\n        }\n\n        \/* Image and Chat Containers *\/\n        .image-chat-wrapper {\n            display: flex;\n            flex-direction: column;\n            width: 100%;\n            max-width: 800px;\n            flex: 1;\n        }\n\n        \/* Image Container Styles *\/\n        .image-container {\n            flex: 1;\n            text-align: center;\n            margin-bottom: 15px;\n        }\n        .image-container img {\n            width: 100%;\n            height: auto;\n            max-height: 300px;\n            object-fit: cover;\n            border-radius: 15px;\n            box-shadow: 0 0 8px rgba(0, 0, 0, 0.1);\n        }\n        .sentence-text {\n            margin: 10px 0;\n            font-weight: bold;\n            color: #333;\n            font-size: 16px;\n        }\n        .word-box {\n            margin-top: 10px;\n            padding: 10px;\n            background-color: #fff;\n            border: 2px solid #28a745;\n            border-radius: 8px;\n            box-shadow: 0 0 8px rgba(0, 0, 0, 0.1);\n            font-size: 16px;\n            font-weight: bold;\n            color: #28a745;\n            text-align: left;\n            max-height: 250px;\n            overflow-y: auto;\n        }\n\n        \/* Chat Container Styles *\/\n        .chat-container {\n            background-color: #28a745;\n            border-radius: 15px;\n            box-shadow: 0 0 8px rgba(0, 0, 0, 0.1);\n            border: 3px solid #007bff;\n            overflow: hidden;\n            display: flex;\n            flex-direction: column;\n            height: auto;\n            max-height: 500px;\n            flex: 1;\n        }\n        .chat-header {\n            background-color: #1e7e34;\n            color: #fff;\n            padding: 12px;\n            text-align: center;\n            border-bottom: 1px solid #155724;\n            position: relative;\n        }\n        .chat-header h2 {\n            margin: 0;\n            font-size: 18px;\n        }\n        .chat-header .loader {\n            position: absolute;\n            right: 20px;\n            top: 50%;\n            transform: translateY(-50%);\n            display: none;\n        }\n        .chat-messages {\n            padding: 12px;\n            overflow-y: auto;\n            flex: 1;\n            background-color: #fff;\n            max-height: 300px;\n        }\n        .message {\n            margin-bottom: 10px;\n            padding: 10px;\n            border-radius: 6px;\n            font-size: 14px;\n            line-height: 1.5;\n        }\n        .user-message {\n            background-color: #ffc107;\n            color: #fff;\n            text-align: right;\n        }\n        .bot-message {\n            background-color: #17a2b8;\n            color: #fff;\n            text-align: left;\n        }\n\n        \/* Chat Input Styles *\/\n        .chat-input {\n            display: flex;\n            align-items: center;\n            background-color: #c3e6cb;\n            padding: 10px;\n            justify-content: space-between;\n            flex-wrap: wrap;\n        }\n        .send-button, .stop-button {\n            background-color: #17a2b8;\n            color: #fff;\n            font-weight: bold;\n            border: none;\n            border-radius: 5px;\n            padding: 12px 16px;\n            cursor: pointer;\n            transition: background-color 0.3s;\n            flex: 1;\n            margin: 6px;\n            max-width: 150px;\n            font-size: 16px;\n        }\n        .stop-button {\n            background-color: #dc3545;\n        }\n        .send-button:hover,\n        .stop-button:hover,\n        .send-button:focus,\n        .stop-button:focus {\n            background-color: #218838;\n            outline: none;\n        }\n\n        \/* Voice Selection Styles *\/\n        .voice-selection {\n            margin: 10px 0;\n            width: 100%;\n            max-width: 300px;\n        }\n        .voice-selection label {\n            display: block;\n            margin-bottom: 5px;\n            font-weight: bold;\n            color: #333;\n        }\n        .voice-selection select {\n            width: 100%;\n            padding: 8px;\n            border-radius: 5px;\n            border: 1px solid #ccc;\n            font-size: 14px;\n        }\n\n        \/* Loader Styles *\/\n        .loader {\n            border: 4px solid #f3f3f3;\n            border-top: 4px solid #17a2b8;\n            border-radius: 50%;\n            width: 20px;\n            height: 20px;\n            animation: spin 2s linear infinite;\n            display: inline-block;\n            margin-left: 10px;\n        }\n\n        @keyframes spin {\n            0% { transform: rotate(0deg); }\n            100% { transform: rotate(360deg); }\n        }\n\n        \/* Portrait Mode *\/\n        @media (orientation: portrait) {\n            .image-chat-wrapper {\n                flex-direction: column;\n            }\n            .image-container, .chat-container {\n                width: 100%;\n                max-width: 100%;\n            }\n        }\n\n        \/* Landscape Mode *\/\n        @media (orientation: landscape) and (min-width: 600px) {\n            .image-chat-wrapper {\n                flex-direction: row;\n                justify-content: space-between;\n            }\n            .image-container, .chat-container {\n                width: 48%;\n                max-width: 48%;\n            }\n            .word-box {\n                max-height: 200px;\n            }\n            .chat-header h2 {\n                font-size: 20px;\n            }\n            .message {\n                font-size: 15px;\n            }\n            .send-button, .stop-button {\n                font-size: 18px;\n                padding: 14px 20px;\n                max-width: 200px;\n            }\n        }\n\n        \/* General Mobile Responsiveness *\/\n        @media (max-width: 768px) {\n            .chat-header h2 {\n                font-size: 16px;\n            }\n            .message {\n                font-size: 14px;\n            }\n            .send-button, .stop-button {\n                font-size: 16px;\n                padding: 12px 16px;\n                max-width: 150px;\n            }\n            .word-box {\n                font-size: 15px;\n            }\n            .voice-selection select {\n                font-size: 14px;\n            }\n        }\n\n        \/* Samsung Android Specific Adjustments *\/\n        @media only screen and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2) {\n            .chat-header h2 {\n                font-size: 18px;\n            }\n            .send-button, .stop-button {\n                padding: 14px 18px;\n                font-size: 16px;\n            }\n            .message {\n                font-size: 14px;\n            }\n            .word-box {\n                font-size: 16px;\n            }\n            .chat-input input {\n                font-size: 16px;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"menu\">\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-conversation\/\">Conversation<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-vocabulary\/\">Vocabulary<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-real-life\/\">Real Life<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-describing-pictures\/\">Describing Pictures<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-reading-comprehension\/\">Reading<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-listening\/\">Listening<\/a>\n    <\/div>\n\n    <div class=\"container\">\n        <div class=\"image-chat-wrapper\">\n            <div class=\"image-container\">\n                <img decoding=\"async\" src=\"https:\/\/i-cte.org\/robot\/wp-content\/uploads\/2025\/05\/DALL\u00b7E-2025-05-13-18.46.33-A-single-small-academic-themed-robot-instructor-designed-to-teach-in-a-classroom.-The-robot-is-knee-high-sleek-and-professional-looking-wearing-dig-1.webp\" alt=\"Robot teacher introducing vocabulary\">\n                <div class=\"sentence-text\">\n                    Practice verb + phrase combinations. Listen, then answer in full sentences using the green phrases.\n                <\/div>\n                <div id=\"word-box\" class=\"word-box\">\n                    <!-- Learned collocations and answers will be shown here -->\n                <\/div>\n            <\/div>\n            <div class=\"chat-container\">\n                <div class=\"chat-header\">\n                    <h2>Hopes and Intentions &#8211; Vocabulary<\/h2>\n                    <div class=\"loader\" id=\"synthesis-loader\"><\/div>\n                <\/div>\n                <div class=\"chat-messages\" id=\"chat-messages\">\n                    <!-- Messages will appear here -->\n                <\/div>\n                <div class=\"chat-input\">\n                    <div class=\"voice-selection\">\n                        <label for=\"voice-select\">Choose Voice:<\/label>\n                        <select id=\"voice-select\" aria-label=\"Select Voice\">\n                            <option value=\"\">Loading voices&#8230;<\/option>\n                        <\/select>\n                    <\/div>\n                    <button id=\"start-btn\" class=\"send-button\" aria-label=\"Start Lesson\">Start<\/button>\n                    <button id=\"stop-btn\" class=\"stop-button\" aria-label=\"Stop Lesson\">Stop<\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div class=\"menu\">\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-conversation\/\">Conversation<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-vocabulary\/\">Vocabulary<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-real-life\/\">Real Life<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-describing-pictures\/\">Describing Pictures<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-reading-comprehension\/\">Reading<\/a>\n<a href=\"https:\/\/i-cte.org\/robot\/hopes-and-intentions-listening\/\">Listening<\/a>\n    <\/div>\n\n<script>\n    \/\/ Vocabulary items from the picture:\n    \/\/ learn to drive, save money, travel abroad, give up fast food,\n    \/\/ retire early, lose weight, stay in good shape,\n    \/\/ pass all your exams, find a good job\n\n    const questions = [\n        {\n            english: \"What do you want to learn in the future?\",\n            verb: \"learn\",\n            phrase: \"to drive\",\n            collocation: \"learn to drive\",\n            keywords: [\"learn to drive\", \"to drive\"],\n            answer: \"In the future I want to learn to drive.\"\n        },\n        {\n            english: \"Why do you need to save these days?\",\n            verb: \"save\",\n            phrase: \"money\",\n            collocation: \"save money\",\n            keywords: [\"save money\", \"money\"],\n            answer: \"These days I need to save money for my plans.\"\n        },\n        {\n            english: \"Where would you like to travel one day?\",\n            verb: \"travel\",\n            phrase: \"abroad\",\n            collocation: \"travel abroad\",\n            keywords: [\"travel abroad\", \"abroad\"],\n            answer: \"One day I would like to travel abroad.\"\n        },\n        {\n            english: \"Is there anything you want to give up this year?\",\n            verb: \"give up\",\n            phrase: \"fast food\",\n            collocation: \"give up fast food\",\n            keywords: [\"give up fast food\", \"fast food\"],\n            answer: \"Yes, this year I want to give up fast food.\"\n        },\n        {\n            english: \"When would you like to retire?\",\n            verb: \"retire\",\n            phrase: \"early\",\n            collocation: \"retire early\",\n            keywords: [\"retire early\", \"retire\"],\n            answer: \"I would like to retire early if I can.\"\n        },\n        {\n            english: \"Do you want to change your body this year?\",\n            verb: \"lose\",\n            phrase: \"weight\",\n            collocation: \"lose weight\",\n            keywords: [\"lose weight\", \"weight\"],\n            answer: \"Yes, this year I want to lose weight.\"\n        },\n        {\n            english: \"How can you stay healthy?\",\n            verb: \"stay\",\n            phrase: \"in good shape\",\n            collocation: \"stay in good shape\",\n            keywords: [\"stay in good shape\", \"in good shape\"],\n            answer: \"I can stay in good shape by doing exercise and eating well.\"\n        },\n        {\n            english: \"What are your goals for your studies?\",\n            verb: \"pass\",\n            phrase: \"all your exams\",\n            collocation: \"pass all your exams\",\n            keywords: [\"pass all your exams\", \"all your exams\"],\n            answer: \"My goal is to study hard and pass all my exams.\"\n        },\n        {\n            english: \"What do you hope to do after you finish your studies?\",\n            verb: \"find\",\n            phrase: \"a good job\",\n            collocation: \"find a good job\",\n            keywords: [\"find a good job\", \"a good job\"],\n            answer: \"After I finish my studies I hope to find a good job.\"\n        }\n    ];\n\n    const positiveFeedback = [\n        \"Great job! You used the vocabulary correctly.\",\n        \"Well done! That sounds natural.\",\n        \"Excellent sentence with the new phrase.\",\n        \"Very good. Your sentence is clear.\",\n        \"Fantastic! You used the collocation very well.\",\n        \"Nice! That\u2019s a good example.\",\n        \"You\u2019re using the green phrases correctly.\",\n        \"Lovely sentence. Keep going!\"\n    ];\n\n    const constructiveFeedback = [\n        \"Try to use the full phrase, for example: learn to drive or save money.\",\n        \"Can you add the green phrase, like travel abroad or retire early?\",\n        \"Please use a full sentence, for example: I want to lose weight this year.\",\n        \"Try to say the collocation together, like stay in good shape or find a good job.\",\n        \"Include the phrase all your exams in your answer.\",\n        \"Try to connect the verb and phrase: give up fast food or pass all your exams.\",\n        \"Use the pattern: I want to\u2026, I would like to\u2026, or I hope to\u2026 with the new vocabulary.\",\n        \"Make your answer more complete: say why or when you will do it.\"\n    ];\n\n    const pronunciationFeedback = [\n        \"Good job! Practice saying \u201cabroad\u201d clearly.\",\n        \"Nice answer! Try to say \u201cretire early\u201d smoothly.\",\n        \"Well spoken! Focus on the phrase \u201cin good shape\u201d.\",\n        \"Great effort! Repeat: \u201cI want to lose weight this year.\u201d\",\n        \"Very good! Try repeating: \u201cI hope to find a good job.\u201d\"\n    ];\n\n    const stopKeywords = [\"goodbye\", \"good bye\", \"bye\", \"bye-bye\", \"byebye\"];\n\n    let currentQuestionIndex = 0;\n    let recognition;\n    let isLessonActive = false;\n    let speechRecognitionActive = false;\n\n    const speechSynthesisSupported = 'speechSynthesis' in window;\n    const speechRecognitionSupported = window.SpeechRecognition || window.webkitSpeechRecognition;\n\n    let voices = [];\n    let selectedVoice = null;\n\n    const desiredVoiceNames = [\n        'Google US English',\n        'Google US English Female',\n        'Google UK English Male',\n        'Google UK English Female'\n    ];\n\n    function initialize() {\n        loadVoices();\n\n        if (speechSynthesisSupported) {\n            setTimeout(greetUser, 500);\n        } else {\n            appendMessage(\"Sorry, your browser does not support speech synthesis.\", \"bot\");\n        }\n\n        if (!speechRecognitionSupported) {\n            appendMessage(\"Sorry, your browser does not support speech recognition.\", \"bot\");\n        }\n\n        document.getElementById('start-btn').onclick = function () {\n            if (isLessonActive) return;\n\n            if (!speechSynthesisSupported) {\n                appendMessage(\"Speech synthesis is not supported in your browser.\", \"bot\");\n                return;\n            }\n            if (!speechRecognitionSupported) {\n                appendMessage(\"Speech recognition is not supported in your browser.\", \"bot\");\n                return;\n            }\n\n            isLessonActive = true;\n            currentQuestionIndex = 0;\n            clearWordBox();\n            startLesson();\n        };\n\n        document.getElementById('stop-btn').onclick = function () {\n            if (recognition && speechRecognitionActive) {\n                recognition.stop();\n                speechRecognitionActive = false;\n            }\n            endLesson(true);\n        };\n    }\n\n    function loadVoices() {\n        voices = window.speechSynthesis.getVoices();\n        if (voices.length === 0) {\n            window.speechSynthesis.onvoiceschanged = () => {\n                voices = window.speechSynthesis.getVoices();\n                populateVoiceList();\n            };\n        } else {\n            populateVoiceList();\n        }\n    }\n\n    function populateVoiceList() {\n        const voiceSelect = document.getElementById('voice-select');\n        voiceSelect.innerHTML = '';\n\n        const filteredVoices = voices.filter(voice => desiredVoiceNames.includes(voice.name));\n\n        if (filteredVoices.length === 0) {\n            const option = document.createElement('option');\n            option.value = \"\";\n            option.textContent = \"No desired voices available\";\n            voiceSelect.appendChild(option);\n            voiceSelect.disabled = true;\n            return;\n        }\n\n        filteredVoices.forEach((voice, index) => {\n            const option = document.createElement('option');\n            option.value = index;\n            option.textContent = `${voice.name} (${voice.lang})`;\n            voiceSelect.appendChild(option);\n        });\n\n        voiceSelect.selectedIndex = 0;\n        selectedVoice = filteredVoices[0];\n\n        voiceSelect.onchange = () => {\n            const selectedIndex = voiceSelect.value;\n            selectedVoice = filteredVoices[selectedIndex];\n        };\n    }\n\n    function greetUser() {\n        const greeting =\n            \"Hello! In this lesson we will practice verb plus phrase combinations like learn to drive, save money, travel abroad, give up fast food, and find a good job. Click Start and answer in full sentences using the green phrases.\";\n        appendMessage(greeting, \"bot\");\n        showSynthesisLoader(true);\n        sayText(greeting, \"en-US\").then(() => showSynthesisLoader(false));\n    }\n\n    function startLesson() {\n        if (!isLessonActive) return;\n\n        if (currentQuestionIndex < questions.length) {\n            const q = questions[currentQuestionIndex];\n            const number = currentQuestionIndex + 1;\n            const questionText = `Question ${number}: ${q.english}`;\n\n            appendMessage(questionText, \"bot\");\n\n            \/\/ Word box: show verb, phrase, collocation, model answer\n            addSentenceToBox(`Q${number}: ${q.english}`);\n            addSentenceToBox(`Verb: ${q.verb}`);\n            addSentenceToBox(`Phrase: ${q.phrase}`);\n            addSentenceToBox(`Collocation: ${q.collocation}`);\n            addSentenceToBox(`Model answer: ${q.answer}`);\n\n            showSynthesisLoader(true);\n            sayText(questionText, \"en-US\").then(() => {\n                showSynthesisLoader(false);\n                listenUserResponse(q);\n            });\n        } else {\n            endLesson(false);\n        }\n    }\n\n    function listenUserResponse(question) {\n        if (!speechRecognitionSupported) return;\n\n        recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)();\n        recognition.lang = \"en-US\";\n        recognition.interimResults = false;\n        recognition.maxAlternatives = 1;\n\n        showRecognitionLoader(true);\n        appendMessage(\"Listening...\", \"bot\");\n        speechRecognitionActive = true;\n        recognition.start();\n\n        recognition.onresult = function (event) {\n            if (!speechRecognitionActive) return;\n\n            const userInput = event.results[0][0].transcript.trim();\n            const formattedInput = normalizeAndFormatUserInput(userInput);\n\n            appendMessage(formattedInput, \"user\");\n            addSentenceToBox(`Your answer: ${formattedInput}`);\n\n            showRecognitionLoader(false);\n            speechRecognitionActive = false;\n\n            if (checkStopKeywords(formattedInput.toLowerCase())) {\n                endLesson(true);\n                return;\n            }\n\n            let feedbackMessage = \"\";\n            const grammarFeedback = checkGrammar(formattedInput);\n\n            if (grammarFeedback) {\n                feedbackMessage = grammarFeedback;\n            } else {\n                const feedbackType = analyzeResponse(formattedInput, question.keywords);\n                if (feedbackType === \"pronunciation\") {\n                    feedbackMessage =\n                        pronunciationFeedback[Math.floor(Math.random() * pronunciationFeedback.length)];\n                } else if (feedbackType === \"positive\") {\n                    feedbackMessage = positiveFeedback[Math.floor(Math.random() * positiveFeedback.length)];\n                } else {\n                    feedbackMessage =\n                        constructiveFeedback[Math.floor(Math.random() * constructiveFeedback.length)];\n                }\n            }\n\n            appendMessage(feedbackMessage, \"bot\");\n            showSynthesisLoader(true);\n            sayText(feedbackMessage, \"en-US\").then(() => {\n                showSynthesisLoader(false);\n                currentQuestionIndex++;\n                setTimeout(startLesson, 2500);\n            });\n        };\n\n        recognition.onspeechend = function () {\n            if (speechRecognitionActive) {\n                recognition.stop();\n                speechRecognitionActive = false;\n                showRecognitionLoader(false);\n            }\n        };\n\n        recognition.onerror = function (event) {\n            showRecognitionLoader(false);\n            speechRecognitionActive = false;\n            let errorMessage = \"Error: \" + event.error;\n\n            if (event.error === \"not-allowed\") {\n                errorMessage =\n                    \"Microphone access was not allowed. Please allow microphone access in your browser settings and try again.\";\n            }\n\n            appendMessage(errorMessage, \"bot\");\n\n            const retryMessage = \"Let's try that question again.\";\n            appendMessage(retryMessage, \"bot\");\n            showSynthesisLoader(true);\n            sayText(retryMessage, \"en-US\").then(() => {\n                showSynthesisLoader(false);\n                setTimeout(() => listenUserResponse(question), 2500);\n            });\n        };\n    }\n\n    function analyzeResponse(userInput, keywords) {\n        const text = userInput.toLowerCase();\n        for (let keyword of keywords) {\n            if (text.includes(keyword.toLowerCase())) {\n                if (keyword.toLowerCase().includes(\"abroad\") ||\n                    keyword.toLowerCase().includes(\"weight\")) {\n                    return \"pronunciation\";\n                }\n                return \"positive\";\n            }\n        }\n        return \"constructive\";\n    }\n\n    \/\/ Simple grammar help for these collocations\n    function checkGrammar(userInput) {\n        const lower = userInput.toLowerCase();\n\n        if (lower.includes(\"learn drive\")) {\n            return 'You can say: \"I want to learn to drive.\"';\n        }\n        if (lower.includes(\"save many money\") || lower.includes(\"save moneys\")) {\n            return 'You can say: \"I need to save money.\" (money is uncountable).';\n        }\n        if (lower.includes(\"travel to abroad\") || lower.includes(\"travel in abroad\")) {\n            return 'You can say: \"I want to travel abroad.\" (no preposition before abroad).';\n        }\n        if (lower.includes(\"give up fast foods\")) {\n            return 'You can say: \"I want to give up fast food.\" (fast food is normally uncountable).';\n        }\n        if (lower.includes(\"lose my weights\")) {\n            return 'You can say: \"I want to lose weight.\"';\n        }\n        if (lower.includes(\"pass all exam\") || lower.includes(\"pass all my exam\")) {\n            return 'You can say: \"I want to pass all my exams.\"';\n        }\n\n        return null;\n    }\n\n    function checkStopKeywords(userInput) {\n        const pattern = new RegExp(\"\\\\b(\" + stopKeywords.join(\"|\") + \")\\\\b\", \"i\");\n        return pattern.test(userInput);\n    }\n\n    function normalizeAndFormatUserInput(text) {\n        let normalized = text.replace(\/\\bi\\b\/g, \"I\");\n        return formatSentence(normalized);\n    }\n\n    function formatSentence(text) {\n        if (!text) return text;\n        text = text.charAt(0).toUpperCase() + text.slice(1);\n\n        const questionWords = [\n            \"who\",\"what\",\"where\",\"when\",\"why\",\"how\",\n            \"is\",\"are\",\"do\",\"does\",\"can\",\"should\",\"will\",\"would\"\n        ];\n        const firstWord = text.split(\" \")[0].toLowerCase();\n\n        if (questionWords.includes(firstWord) && !text.endsWith(\"?\")) {\n            text += \"?\";\n        } else if (!text.endsWith(\".\") && !text.endsWith(\"?\")) {\n            text += \".\";\n        }\n\n        return text;\n    }\n\n    function addSentenceToBox(sentence) {\n        const wordBox = document.getElementById(\"word-box\");\n        const el = document.createElement(\"div\");\n        el.innerText = sentence;\n        wordBox.appendChild(el);\n        wordBox.scrollTop = wordBox.scrollHeight;\n    }\n\n    function clearWordBox() {\n        document.getElementById(\"word-box\").innerHTML = \"\";\n    }\n\n    function endLesson(userStopped = false) {\n        if (speechSynthesisSupported) {\n            window.speechSynthesis.cancel();\n        }\n        if (recognition && speechRecognitionActive) {\n            recognition.stop();\n            speechRecognitionActive = false;\n        }\n\n        isLessonActive = false;\n\n        let message;\n        if (userStopped) {\n            message = \"Thank you for practicing vocabulary today. Goodbye!\";\n        } else {\n            message = \"Well done! You have practiced all the verb plus phrase combinations. Keep reviewing them!\";\n        }\n        appendMessage(message, \"bot\");\n        showSynthesisLoader(true);\n        sayText(message, \"en-US\").then(() => showSynthesisLoader(false));\n    }\n\n    function sayText(text, lang) {\n        return new Promise(resolve => {\n            if (!speechSynthesisSupported) {\n                resolve();\n                return;\n            }\n            const utterance = new SpeechSynthesisUtterance(text);\n            utterance.lang = lang;\n            utterance.rate = 1.0;\n            utterance.pitch = 1.0;\n\n            if (selectedVoice) {\n                utterance.voice = selectedVoice;\n            }\n\n            utterance.onend = () => resolve();\n            utterance.onerror = () => resolve();\n\n            window.speechSynthesis.speak(utterance);\n        });\n    }\n\n    function appendMessage(text, sender) {\n        const messageContainer = document.getElementById(\"chat-messages\");\n        const messageElement = document.createElement(\"div\");\n        messageElement.classList.add(\"message\");\n        messageElement.classList.add(sender === \"bot\" ? \"bot-message\" : \"user-message\");\n        messageElement.innerText = text;\n        messageContainer.appendChild(messageElement);\n        messageContainer.scrollTop = messageContainer.scrollHeight;\n    }\n\n    function showSynthesisLoader(show) {\n        const loader = document.getElementById(\"synthesis-loader\");\n        loader.style.display = show ? \"inline-block\" : \"none\";\n        if (show) {\n            loader.style.borderTop = \"4px solid #17a2b8\";\n        }\n    }\n\n    function showRecognitionLoader(show) {\n        const loader = document.getElementById(\"synthesis-loader\");\n        if (show) {\n            loader.style.display = \"inline-block\";\n            loader.style.borderTop = \"4px solid #ffc107\";\n        } else {\n            loader.style.display = \"none\";\n        }\n    }\n\n    window.onload = initialize;\n<\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>This Robot is used for practicing English at level A2. In order to interact with this Robot smoothly, please use<\/p>\n","protected":false},"author":1,"featured_media":287,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_layout":"default_layout","footnotes":""},"categories":[18,5],"tags":[],"class_list":["post-423","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-a2","category-chatbot"],"_links":{"self":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/423","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/comments?post=423"}],"version-history":[{"count":1,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/423\/revisions"}],"predecessor-version":[{"id":424,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/423\/revisions\/424"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/media\/287"}],"wp:attachment":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/media?parent=423"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/categories?post=423"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/tags?post=423"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}