document.addEventListener('DOMContentLoaded', function() { let srtData = []; let translationData = []; // File upload handling document.addEventListener('file-uploaded', function(e) { const file = e.detail.file; const reader = new FileReader(); reader.onload = function(e) { const content = e.target.result; srtData = parseSRT(content); displayOriginalText(srtData); document.getElementById('translation-section').classList.remove('hidden'); }; reader.readAsText(file); }); // Parse SRT file content function parseSRT(content) { const lines = content.split(/\r?\n/); const result = []; let currentBlock = {}; lines.forEach(line => { line = line.trim(); if (!line) { if (currentBlock.text) { result.push(currentBlock); } currentBlock = {}; } else if (!currentBlock.number) { currentBlock.number = line; } else if (!currentBlock.timestamps) { currentBlock.timestamps = line; } else { currentBlock.text = (currentBlock.text ? currentBlock.text + '\n' : '') + line; } }); // Push the last block if exists if (currentBlock.text) { result.push(currentBlock); } return result; } // Display original text function displayOriginalText(data) { const container = document.getElementById('original-text-container'); container.innerHTML = ''; data.forEach(item => { const div = document.createElement('div'); div.className = 'srt-line'; div.innerHTML = ` ${item.number} ${item.text} `; container.appendChild(div); }); } // Copy all original text document.getElementById('copy-all-original').addEventListener('click', function() { const textToCopy = srtData.map(item => item.text).join('\n\n'); navigator.clipboard.writeText(textToCopy).then(() => { alert('All original text copied to clipboard!'); }); }); // Paste translation document.getElementById('paste-translation').addEventListener('click', function() { navigator.clipboard.readText().then(text => { document.getElementById('translation-text').value = text; }); }); // Validate translation document.getElementById('validate-btn').addEventListener('click', function() { const translationText = document.getElementById('translation-text').value; translationData = translationText.split(/\n\n/); if (translationData.length !== srtData.length) { showMismatchResults(); } else { alert('All lines match perfectly! Ready to generate SRT file.'); } }); // Show mismatch results function showMismatchResults() { const container = document.getElementById('mismatch-container'); container.innerHTML = ''; srtData.forEach((item, index) => { if (!translationData[index]) { const div = document.createElement('div'); div.className = 'mismatch-line'; div.innerHTML = `
Line ${item.number} - Missing in translation
${item.text}
`; container.appendChild(div); } }); document.getElementById('validation-results').classList.remove('hidden'); } // Fix mismatched lines document.getElementById('fix-mismatch-btn').addEventListener('click', function() { const missingLines = srtData.filter((item, index) => !translationData[index]); let textToCopy = ''; missingLines.forEach(item => { textToCopy += `${item.text}\n\n`; }); navigator.clipboard.writeText(textToCopy.trim()).then(() => { alert('Missing lines copied to clipboard. Translate them and paste back in the translation box.'); }); }); // Generate final SRT document.getElementById('generate-btn').addEventListener('click', function() { if (srtData.length === 0) { alert('No SRT data loaded!'); return; } const translationText = document.getElementById('translation-text').value; const translatedLines = translationText.split(/\n\n/); if (translatedLines.length !== srtData.length) { alert('Number of lines in translation doesn\'t match original! Please validate first.'); return; } let output = ''; srtData.forEach((item, index) => { output += `${item.number}\n${item.timestamps}\n${translatedLines[index]}\n\n`; }); // Create download link const blob = new Blob([output.trim()], { type: 'text/plain' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'translated_subtitles.srt'; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }); });