File size: 5,630 Bytes
3aaac41 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | 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 = `
<span class="line-number">${item.number}</span>
<span>${item.text}</span>
`;
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 = `
<div class="font-semibold">Line ${item.number} - Missing in translation</div>
<div class="text-sm text-gray-600">${item.text}</div>
`;
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);
});
}); |