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);
    });
});