Francuski U 100 Lekcija Pdf Apr 2026
// Odabrana lekcija za fraze let selectedLessonIndex = null;
// ------------------------------------------------------------ // 3. SPEECH SYNTHESIS (francuski izgovor) // ------------------------------------------------------------ function speakFrench(text) if (!window.speechSynthesis) alert("Vaš browser ne podržava govor."); return; const utterance = new SpeechSynthesisUtterance(text); utterance.lang = "fr-FR"; utterance.rate = 0.9; window.speechSynthesis.cancel(); // izbjegni preklapanje window.speechSynthesis.speak(utterance);
function resetProgress() if(confirm("Da li ste sigurni? Resetovaćete sav napredak (završene lekcije i sve sačuvane fraze).")) completed.fill(false); lessonPhrases.fill(""); localStorage.setItem("francuski100_completed", JSON.stringify(completed)); localStorage.setItem("francuski100_phrases", JSON.stringify(lessonPhrases)); selectedLessonIndex = null; document.getElementById("currentLessonLabel").innerHTML = "nijedna"; document.getElementById("existingPhraseSpan").innerHTML = "(nema)"; document.getElementById("phraseText").value = ""; updateStats(); renderLessonsList(currentSearchTerm);
// ------------------------------------------------------------ // 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>"; francuski u 100 lekcija pdf
// ------------------------------------------------------------ // 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
function speakSavedPhrase() if(selectedLessonIndex === null) alert("Odaberite lekciju klikom na naslov."); return; const phrase = lessonPhrases[selectedLessonIndex]; if(!phrase
// Snimi frazu za trenutnu lekciju function saveCurrentPhrase() if(selectedLessonIndex === null) alert("Prvo kliknite na naziv lekcije da je odaberete."); return; const newPhrase = document.getElementById("phraseText").value.trim(); lessonPhrases[selectedLessonIndex] = newPhrase; saveProgress(); // osvježi prikaz const previewSpan = document.getElementById("existingPhraseSpan"); if(newPhrase) previewSpan.innerText = `"$newPhrase"`; else previewSpan.innerText = "(nema sačuvane fraze)"; alert("Fraza sačuvana za " + lessonTitles[selectedLessonIndex]); // Odabrana lekcija za fraze let selectedLessonIndex =
<div class="two-columns"> <div class="lessons-panel" id="lessonsList"> <!-- Dinamički generisano 100 lekcija --> </div>
<div class="phrase-panel"> <div class="phrase-header">📌 FRAZE ZA LEKCIJU</div> <div id="selectedLessonDisplay" class="selected-info"> <strong>Lekcija:</strong> <span id="currentLessonLabel">nijedna</span> </div> <div class="phrase-input-area"> <label><strong>🇫🇷 Francuska fraza / rečenica:</strong></label> <textarea id="phraseText" rows="3" placeholder="Unesite frazu iz ove lekcije..."></textarea> <button id="savePhraseBtn" class="save-phrase-btn">💾 Sačuvaj frazu za ovu lekciju</button> <button id="speakPhraseBtn" class="save-phrase-btn" style="background:#3b82f6; margin-top: 6px;">🔊 Izgovori sačuvanu frazu</button> </div> <div id="savedPhrasePreview" class="example-phrases"> <strong>📖 Sačuvana fraza:</strong> <span id="existingPhraseSpan">(nema)</span> </div> <div class="example-phrases"> 💡 <em>Primeri: "Bonjour", "Je m'appelle...", "Où est la gare?"</em><br> ⚡ Klik na naziv lekcije → automatski učitava njenu frazu. </div> </div> </div> <footer> 🎧 Dugme zvučnik = izgovor naslova lekcije na francuskom. Sačuvane fraze se čuvaju u vašem browseru. </footer> </div>
<script> // ------------------------------------------------------------ // 1. GENERIŠI 100 LEKCIJA (naslovi na francuskom + prevod) // Realistični tematski naslovi za "Francuski u 100 lekcija" // ------------------------------------------------------------ const lessonTitles = []; const themes = [ "Uvod i pozdravi", "Abeceda i izgovor", "Brojevi 1-20", "Brojevi 20-100", "Dani u nedelji", "Mjeseci i godišnja doba", "Vrijeme i sat", "Porodica i rodbina", "Opisivanje ljudi", "Boje i pridevi", "Glagol biti (être)", "Glagol imati (avoir)", "Obični glagoli -er", "Obični glagoli -ir", "Obični glagoli -re", "Negacija (ne...pas)", "Pitanja (est-ce que)", "Lične zamjenice", "Prisvojni pridevi", "Pokazne zamjenice", "Određeni i neodređeni član", "Djelomični član", "Pravljenje množine", "Rod imenica", "Opis doma", "Namještaj i sobe", "Hrana i piće", "U restoranu", "Naručivanje jela", "Voće i povrće", "Odjeća i moda", "Trgovina i cijene", "Putovanje i smjerovi", "Grad i mjesta", "Prijevoz (metro, autobus)", "U hotelu", "Na aerodromu", "Izlet i priroda", "Sport i slobodno vrijeme", "Hobiji i interesovanja", "Posao i zanimanja", "Intervju za posao", "Pisanje emaila", "Telefonski razgovor", "Medicina i kod doktora", "Dijelovi tijela", "Hitni slučajevi", "Vrijeme i prognoza", "Buduće vrijeme (futur proche)", "Futur simple", "Prošlo vrijeme (passé composé)", "Nepravilni participi", "Imperfekat (imparfait)", "Poređenje vremena", "Imperativ", "Kondicional (želje)", "Subjonctif (uvod)", "Vežbanje subjonctiva", "Prilozi vremena", "Prilozi mjesta", "Poređenje prideva", "Superlativ", "Veznici i povezivanje", "Izražavanje mišljenja", "Slaganje sa sagovornikom", "Francuski izrazi (locutions)", "Poslovice i izreke", "Kultura i običaji", "Praznici u Francuskoj", "Istorija Francuske", "Poznate ličnosti", "Književnost i citati", "Pjesme i poezija", "Gledanje filmova na francuskom", "Pisanje priče", "Opis fotografije", "Razgovor na poslu", "Poziv u administraciji", "Iznajmljivanje stana", "Prijateljski susret", "Pravljenje planova", "Izvinjenje i izgovori", "Ljutnja i emocije", "Sreća i iznenađenje", "Razlika između francuskog u Kanadi", "Sleng i kolokvijalni izrazi", "Skraćenice (SMS)", "Prezentacija sebe", "Opis dnevne rutine", "Hronologija događaja", "Komparacija kultura", "Prevodi i jezičke zamke", "Lažni prijatelji", "Ponavljanje: glagoli", "Ponavljanje: padeži (odnosi)", "Završni test znanja", "Konverzacija 1: Upoznavanje", "Konverzacija 2: Putovanje", "Konverzacija 3: Posao", "Čitanje vijesti", "Pisanje rezimea" ]; // Make exactly 100 titles for (let i = 1; i <= 100; i++) let title = themes[i-1] // final check length while(lessonTitles.length < 100) lessonTitles.push( Lekcija $lessonTitles.length+1: Praktična vežba ); "Abeceda i izgovor"
function saveProgress() localStorage.setItem("francuski100_completed", JSON.stringify(completed)); localStorage.setItem("francuski100_phrases", JSON.stringify(lessonPhrases)); updateStats(); renderLessonsList(currentSearchTerm);
This is a specific request for a related to the PDF file "Francuski u 100 lekcija" (Serbian/Croatian/Bosnian for "French in 100 Lessons").
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) {} } }
function selectLesson(idx) selectedLessonIndex = idx; document.getElementById("currentLessonLabel").innerHTML = `<strong>$lessonTitles[idx]</strong>`; // prikaži sačuvanu frazu ako postoji const saved = lessonPhrases[idx]; const previewSpan = document.getElementById("existingPhraseSpan"); if(saved && saved.trim() !== "") previewSpan.innerText = `"$saved"`; else previewSpan.innerText = "(nema sačuvane fraze)"; document.getElementById("phraseText").value = saved

Contact
Email an Agent
Get Directions