Skip to main content

🌐 Worksheet Translator

Upload any worksheet — a quiz, reading, problem set — and Kuliso instantly translates and adapts it for every multilingual student in your class. Three WIDA-differentiated versions, ready to print or assign.

⏱️ Save 5-10 hours/week
⚙️ Generating differentiated translations…

Starting…

`); printWin.document.close(); printWin.print(); } function printCurrentVersion() { if (!state.activeLang) return; printVersion(state.activeLang, state.activeWida); } function copyVersion(lang, level) { const content = document.getElementById('wscontent-' + lang + '-' + level); if (!content) return; navigator.clipboard.writeText(content.textContent).then(() => toast('Copied to clipboard!', 'success')).catch(() => toast('Copy failed', 'error')); } // ── Library ── async function loadLibrary() { const container = document.getElementById('libraryContent'); container.innerHTML = '
Loading…
'; try { const res = await API('/api/worksheet-translator?limit=50'); if (!res.worksheets || res.worksheets.length === 0) { container.innerHTML = '
📚

No saved worksheets yet

Translate your first worksheet using the panel on the left.

'; return; } container.innerHTML = '
' + res.worksheets.map(ws => `
${escapeHtml(ws.title)}
${ws.subject ? ws.subject + ' · ' : ''}${ws.grade_level ? 'Grade ' + ws.grade_level + ' · ' : ''}${new Date(ws.created_at).toLocaleDateString()}
${(ws.languages||[]).map(l => `${LANG_NAMES[l]||l}`).join('')}
${escapeHtml(ws.original_preview || '')}
`).join('') + '
'; } catch(e) { container.innerHTML = '
⚠️

Failed to load

' + e.message + '

'; } } async function loadWorksheet(id) { try { const res = await API('/api/worksheet-translator/' + id); if (!res.worksheet) throw new Error('Not found'); state.currentWorksheet = res.worksheet; switchView('editor'); document.getElementById('welcomeBanner').style.display = 'none'; renderResult(); } catch(e) { toast('Failed to load worksheet: ' + e.message, 'error'); } } // ── Assign modal ── async function openAssignModal() { if (!state.currentWorksheet) return; const classroomId = document.getElementById('wsClassroom').value; if (!classroomId) { toast('Select a classroom first to assign worksheets', ''); return; } openModal('assignModal'); const body = document.getElementById('assignModalBody'); body.innerHTML = '
Loading students…
'; try { const res = await API('/api/classrooms/' + classroomId + '/students'); const students = res.students || res || []; if (students.length === 0) { body.innerHTML = '

No students found in this classroom yet.

'; return; } // Get classroom language data for matching const langRes = await API('/api/worksheet-translator/classroom/' + classroomId + '/languages').catch(() => ({languages:[]})); const classLangs = langRes.languages || []; body.innerHTML = `
${students.map((s, i) => { const lang = s.language || 'English'; const langCode = Object.keys(LANG_NAMES).find(k => LANG_NAMES[k].toLowerCase() === lang.toLowerCase()) || null; const wida = s.wida_level || guessWida(s); const hasTranslation = langCode && state.currentWorksheet.languages && state.currentWorksheet.languages.includes(langCode); return `
${escapeHtml(s.name||s.student_name||'Student '+(i+1))}
${lang}${!hasTranslation && langCode ? ' — ⚠️ No translation for this language' : ''}
${wida}
`; }).join('')}
`; } catch(e) { body.innerHTML = '

Failed to load students: ' + e.message + '

'; } } function guessWida(student) { const level = student.wida_level || student.proficiency_level || ''; if (!level) return 'developing'; const n = parseInt(level); if (!isNaN(n)) return n <= 2 ? 'newcomer' : n <= 4 ? 'developing' : 'bridging'; const l = level.toLowerCase(); if (l.includes('newcomer') || l.includes('level 1') || l.includes('level 2')) return 'newcomer'; if (l.includes('bridging') || l.includes('level 5') || l.includes('level 6')) return 'bridging'; return 'developing'; } function toggleStudentRow(row) { row.classList.toggle('selected'); const cb = row.querySelector('input[type="checkbox"]'); cb.checked = !cb.checked; } async function confirmAssign() { const classroomId = document.getElementById('wsClassroom').value; const rows = document.querySelectorAll('#studentAssignList .student-row'); const assignments = []; rows.forEach(row => { const cb = row.querySelector('input[type="checkbox"]'); if (cb.checked) { assignments.push({ student_name: row.getAttribute('data-name'), language: row.getAttribute('data-lang') || 'en', wida_level: row.getAttribute('data-wida') || 'developing' }); } }); if (assignments.length === 0) { toast('Select at least one student', ''); return; } try { const res = await API('/api/worksheet-translator/' + state.currentWorksheet.id + '/assign', { method: 'POST', body: JSON.stringify({ classroom_id: classroomId, assignments }) }); if (!res.success) throw new Error(res.error); closeModal('assignModal'); toast('✅ Assigned to ' + res.assigned + ' student(s)', 'success'); } catch(e) { toast('Assignment failed: ' + e.message, 'error'); } } // ── Init ── document.addEventListener('keydown', e => { if (e.key === 'Escape') { document.querySelectorAll('.modal-overlay.open').forEach(m => m.classList.remove('open')); } });