Francuski U 100 Lekcija Pdf -
function saveProgress() localStorage.setItem("francuski100_completed", JSON.stringify(completed)); localStorage.setItem("francuski100_phrases", JSON.stringify(lessonPhrases)); updateStats(); renderLessonsList(currentSearchTerm);
function loadProgress() { const stored = localStorage.getItem("francuski100_completed"); if(stored) { try const arr = JSON.parse(stored); if(arr.length === 100) completed = arr; catch(e) {} } const storedPhrases = localStorage.getItem("francuski100_phrases"); if(storedPhrases) { try const arr = JSON.parse(storedPhrases); if(arr.length === 100) lessonPhrases = arr; catch(e) {} } } francuski u 100 lekcija pdf
// ------------------------------------------------------------ // 4. RENDER LISTE LEKCIJA (sa pretragom) // ------------------------------------------------------------ let currentSearchTerm = ""; function renderLessonsList(filter = "") const container = document.getElementById("lessonsList"); container.innerHTML = ""; const lowerFilter = filter.toLowerCase(); for (let i = 0; i < lessonTitles.length; i++) const title = lessonTitles[i]; if (lowerFilter && !title.toLowerCase().includes(lowerFilter) && !`lekcija $i+1`.includes(lowerFilter)) continue; const isCompleted = completed[i]; const div = document.createElement("div"); div.className = "lesson-item"; // checkbox const chk = document.createElement("input"); chk.type = "checkbox"; chk.className = "lesson-check"; chk.checked = isCompleted; chk.addEventListener("change", (function(idx) return function(e) completed[idx] = e.target.checked; saveProgress(); renderLessonsList(currentSearchTerm); if(completed[idx]) // opcionalno: mali zvučni efekat nije potreban ; )(i)); // broj const numSpan = document.createElement("span"); numSpan.className = "lesson-number"; numSpan.innerText = i+1; // title const titleSpan = document.createElement("span"); titleSpan.className = "lesson-title" + (isCompleted ? " completed" : ""); titleSpan.innerText = title; titleSpan.style.cursor = "pointer"; titleSpan.addEventListener("click", (function(idx) return function() selectLesson(idx); ; )(i)); // audio button const audioBtn = document.createElement("button"); audioBtn.innerHTML = "🔊"; audioBtn.className = "audio-btn"; audioBtn.title = "Izgovori naslov lekcije (francuski)"; audioBtn.addEventListener("click", (function(frenchText) return function() speakFrench(frenchText); ; )(title.replace(/Lekcija \d+: /, ''))); // izgovara samo temu div.appendChild(chk); div.appendChild(numSpan); div.appendChild(titleSpan); div.appendChild(audioBtn); container.appendChild(div); if(container.children.length === 0) container.innerHTML = "<div style='padding: 2rem; text-align:center'>🔍 Nema lekcija koje odgovaraju pretrazi</div>"; function saveProgress() localStorage
function speakSavedPhrase() phrase.trim() === "") alert("Nema sačuvane fraze za ovu lekciju. Prvo unesite frazu."); return; speakFrench(phrase); Prvo unesite frazu
// final check length while(lessonTitles.length < 100) lessonTitles.push( Lekcija $lessonTitles.length+1: Praktična vežba );
// ------------------------------------------------------------ // 2. LOCALSTORAGE za napredak i za fraze (po lekcijama) // ------------------------------------------------------------ let completed = new Array(100).fill(false); let lessonPhrases = new Array(100).fill(""); // čuva francuske fraze