181 lines
6.4 KiB
JavaScript
181 lines
6.4 KiB
JavaScript
const LESSONS = {
|
||
accounting: {
|
||
name: "📊 Бухгалтерия",
|
||
words: [
|
||
{ en: "Advance report", kk: "Аванстық есеп" },
|
||
{ en: "Business trip", kk: "Іссапар" },
|
||
{ en: "Invoice", kk: "Шот-фактура" },
|
||
{ en: "Receipt", kk: "Түбіртек/чек" },
|
||
{ en: "Expense", kk: "Шығын" },
|
||
{ en: "Budget", kk: "Бюджет" },
|
||
{ en: "Tax", kk: "Салық" },
|
||
{ en: "Audit", kk: "Аудит/тексеру" },
|
||
{ en: "Payroll", kk: "Жалақы ведомості" },
|
||
{ en: "Reimbursement", kk: "Шығындарды өтеу" }
|
||
]
|
||
},
|
||
travel: {
|
||
name: "✈️ Командировка",
|
||
words: [
|
||
{ en: "Flight ticket", kk: "Ұшақ билеті" },
|
||
{ en: "Hotel booking", kk: "Қонақүй бронь" },
|
||
{ en: "Per diem", kk: "Тәуліктік" },
|
||
{ en: "Travel allowance", kk: "Көтерме ақы" },
|
||
{ en: "Boarding pass", kk: "Бортқа отырғызу талоны" },
|
||
{ en: "Departure", kk: "Ұшу/жөнелу" },
|
||
{ en: "Arrival", kk: "Қону/келу" },
|
||
{ en: "Luggage", kk: "Жүк" },
|
||
{ en: "Customs", kk: "Кеден" },
|
||
{ en: "Itinerary", kk: "Маршруттық парақ" }
|
||
]
|
||
},
|
||
business: {
|
||
name: "💼 Іс қағаздары",
|
||
words: [
|
||
{ en: "Dear colleague", kk: "Құрметті әріптес" },
|
||
{ en: "Best regards", kk: "Құрметпен" },
|
||
{ en: "Please find attached", kk: "Қоса берілген" },
|
||
{ en: "In response to your request", kk: "Сұранысыңызға жауап ретінде" },
|
||
{ en: "We confirm", kk: "Растаймыз" },
|
||
{ en: "Please note", kk: "Назар аударыңыз" },
|
||
{ en: "For your information", kk: "Ақпарат үшін" },
|
||
{ en: "Kindly request", kk: "Сыпайы түрде сұраймыз" },
|
||
{ en: "As discussed", kk: "Талқыланғандай" },
|
||
{ en: "Looking forward", kk: "Күтеміз" }
|
||
]
|
||
},
|
||
phrases: {
|
||
name: "💬 Пайдалы фразалар",
|
||
words: [
|
||
{ en: "Could you please clarify?", kk: "Нақтылай аласыз ба?" },
|
||
{ en: "I'll get back to you shortly", kk: "Жақын арада қайта хабарласамын" },
|
||
{ en: "Please let me know", kk: "Маған хабарлаңызшы" },
|
||
{ en: "I'm afraid I can't", kk: "Қорқамын, мен істей алмаймын" },
|
||
{ en: "Thank you for your cooperation", kk: "Ынтымақтастық үшін рахмет" },
|
||
{ en: "Is everything clear?", kk: "Бәрі түсінікті ме?" },
|
||
{ en: "Keep me updated", kk: "Мені хабардар етіңіз" },
|
||
{ en: "I'll check and confirm", kk: "Тексеріп, растаймын" }
|
||
]
|
||
}
|
||
};
|
||
|
||
let currentTopic = "accounting";
|
||
let currentTestWord = null;
|
||
let progress = { total: 0, correct: 0 };
|
||
|
||
function loadProgress() {
|
||
const saved = localStorage.getItem("englishProgress");
|
||
if (saved) {
|
||
progress = JSON.parse(saved);
|
||
}
|
||
updateProgressDisplay();
|
||
}
|
||
|
||
function saveProgress() {
|
||
localStorage.setItem("englishProgress", JSON.stringify(progress));
|
||
updateProgressDisplay();
|
||
}
|
||
|
||
function updateProgressDisplay() {
|
||
document.getElementById("total-answered").textContent = progress.total;
|
||
document.getElementById("correct-answered").textContent = progress.correct;
|
||
const accuracy = progress.total > 0 ? Math.round((progress.correct / progress.total) * 100) : 0;
|
||
document.getElementById("accuracy").textContent = accuracy + "%";
|
||
}
|
||
|
||
function renderWords() {
|
||
const wordList = document.getElementById("word-list");
|
||
const words = LESSONS[currentTopic].words;
|
||
|
||
wordList.innerHTML = words.map(w => `
|
||
<div class="word-card">
|
||
<div class="en">${w.en}</div>
|
||
<div class="kk">${w.kk}</div>
|
||
</div>
|
||
`).join("");
|
||
|
||
document.getElementById("topic-title").textContent = LESSONS[currentTopic].name;
|
||
}
|
||
|
||
function generateTest() {
|
||
const allWords = Object.values(LESSONS).flatMap(l => l.words);
|
||
const randomWord = allWords[Math.floor(Math.random() * allWords.length)];
|
||
currentTestWord = randomWord;
|
||
|
||
const wrongOptions = allWords
|
||
.filter(w => w.en !== randomWord.en)
|
||
.sort(() => Math.random() - 0.5)
|
||
.slice(0, 3)
|
||
.map(w => w.kk);
|
||
|
||
const options = [...wrongOptions, randomWord.kk].sort(() => Math.random() - 0.5);
|
||
|
||
document.getElementById("test-question").textContent = `"${randomWord.en}" сөзінің аудармасын таңда:`;
|
||
|
||
const optionsContainer = document.getElementById("test-options");
|
||
optionsContainer.innerHTML = options.map((opt, i) => `
|
||
<button class="test-option" data-index="${i}" data-correct="${opt === randomWord.kk}">
|
||
${opt}
|
||
</button>
|
||
`).join("");
|
||
|
||
document.getElementById("test-result").textContent = "";
|
||
|
||
document.querySelectorAll(".test-option").forEach(btn => {
|
||
btn.addEventListener("click", handleTestAnswer);
|
||
});
|
||
}
|
||
|
||
function handleTestAnswer(e) {
|
||
const buttons = document.querySelectorAll(".test-option");
|
||
buttons.forEach(btn => btn.disabled = true);
|
||
|
||
const isCorrect = e.target.dataset.correct === "true";
|
||
|
||
if (isCorrect) {
|
||
e.target.classList.add("correct");
|
||
document.getElementById("test-result").textContent = "✅ Дұрыс!";
|
||
document.getElementById("test-result").style.color = "#48bb78";
|
||
progress.correct++;
|
||
} else {
|
||
e.target.classList.add("wrong");
|
||
buttons.forEach(btn => {
|
||
if (btn.dataset.correct === "true") {
|
||
btn.classList.add("correct");
|
||
}
|
||
});
|
||
document.getElementById("test-result").textContent = `❌ Қате. Дұрыс жауап: "${currentTestWord.kk}"`;
|
||
document.getElementById("test-result").style.color = "#f56565";
|
||
}
|
||
|
||
progress.total++;
|
||
saveProgress();
|
||
|
||
setTimeout(() => {
|
||
generateTest();
|
||
}, 2000);
|
||
}
|
||
|
||
document.querySelectorAll(".topic-btn").forEach(btn => {
|
||
btn.addEventListener("click", () => {
|
||
document.querySelectorAll(".topic-btn").forEach(b => b.classList.remove("active"));
|
||
btn.classList.add("active");
|
||
currentTopic = btn.dataset.topic;
|
||
renderWords();
|
||
});
|
||
});
|
||
|
||
document.getElementById("start-test-btn").addEventListener("click", () => {
|
||
generateTest();
|
||
});
|
||
|
||
document.getElementById("reset-btn").addEventListener("click", () => {
|
||
if (confirm("Прогрессті тазалағыңыз келе ме?")) {
|
||
progress = { total: 0, correct: 0 };
|
||
saveProgress();
|
||
}
|
||
});
|
||
|
||
loadProgress();
|
||
renderWords();
|