Spaces:
Sleeping
Sleeping
| document.addEventListener('DOMContentLoaded', function() { | |
| const form = document.getElementById('translationForm'); | |
| const pdfFileInput = document.getElementById('pdfFile'); | |
| const targetLanguageSelect = document.getElementById('targetLanguage'); | |
| const translatedTextOutput = document.getElementById('translatedText'); | |
| const downloadButton = document.getElementById('downloadButton'); | |
| // Populate language dropdown | |
| const languages = { | |
| 'af': 'Afrikaans', | |
| 'sq': 'Albanian', | |
| 'am': 'Amharic', | |
| 'ar': 'Arabic', | |
| 'hy': 'Armenian', | |
| 'az': 'Azerbaijani', | |
| 'eu': 'Basque', | |
| 'be': 'Belarusian', | |
| 'bn': 'Bengali', | |
| 'bs': 'Bosnian', | |
| 'bg': 'Bulgarian', | |
| 'ca': 'Catalan', | |
| 'ceb': 'Cebuano', | |
| 'ny': 'Chichewa', | |
| 'zh-cn': 'Chinese (Simplified)', | |
| 'zh-tw': 'Chinese (Traditional)', | |
| 'co': 'Corsican', | |
| 'hr': 'Croatian', | |
| 'cs': 'Czech', | |
| 'da': 'Danish', | |
| 'nl': 'Dutch', | |
| 'en': 'English', | |
| 'eo': 'Esperanto', | |
| 'et': 'Estonian', | |
| 'tl': 'Filipino', | |
| 'fi': 'Finnish', | |
| 'fr': 'French', | |
| 'fy': 'Frisian', | |
| 'gl': 'Galician', | |
| 'ka': 'Georgian', | |
| 'de': 'German', | |
| 'el': 'Greek', | |
| 'gu': 'Gujarati', | |
| 'ht': 'Haitian Creole', | |
| 'ha': 'Hausa', | |
| 'haw': 'Hawaiian', | |
| 'iw': 'Hebrew', | |
| 'hi': 'Hindi', | |
| 'hmn': 'Hmong', | |
| 'hu': 'Hungarian', | |
| 'is': 'Icelandic', | |
| 'ig': 'Igbo', | |
| 'id': 'Indonesian', | |
| 'ga': 'Irish', | |
| 'it': 'Italian', | |
| 'ja': 'Japanese', | |
| 'jw': 'Javanese', | |
| 'kn': 'Kannada', | |
| 'kk': 'Kazakh', | |
| 'km': 'Khmer', | |
| 'rw': 'Kinyarwanda', | |
| 'ko': 'Korean', | |
| 'ku': 'Kurdish (Kurmanji)', | |
| 'ky': 'Kyrgyz', | |
| 'lo': 'Lao', | |
| 'la': 'Latin', | |
| 'lv': 'Latvian', | |
| 'lt': 'Lithuanian', | |
| 'lb': 'Luxembourgish', | |
| 'mk': 'Macedonian', | |
| 'mg': 'Malagasy', | |
| 'ms': 'Malay', | |
| 'ml': 'Malayalam', | |
| 'mt': 'Maltese', | |
| 'mi': 'Maori', | |
| 'mr': 'Marathi', | |
| 'mn': 'Mongolian', | |
| 'my': 'Myanmar (Burmese)', | |
| 'ne': 'Nepali', | |
| 'no': 'Norwegian', | |
| 'or': 'Odia (Oriya)', | |
| 'ps': 'Pashto', | |
| 'fa': 'Persian', | |
| 'pl': 'Polish', | |
| 'pt': 'Portuguese', | |
| 'pa': 'Punjabi', | |
| 'ro': 'Romanian', | |
| 'ru': 'Russian', | |
| 'sm': 'Samoan', | |
| 'gd': 'Scots Gaelic', | |
| 'sr': 'Serbian', | |
| 'st': 'Sesotho', | |
| 'sn': 'Shona', | |
| 'sd': 'Sindhi', | |
| 'si': 'Sinhala', | |
| 'sk': 'Slovak', | |
| 'sl': 'Slovenian', | |
| 'so': 'Somali', | |
| 'es': 'Spanish', | |
| 'su': 'Sundanese', | |
| 'sw': 'Swahili', | |
| 'sv': 'Swedish', | |
| 'tg': 'Tajik', | |
| 'ta': 'Tamil', | |
| 'tt': 'Tatar', | |
| 'te': 'Telugu', | |
| 'th': 'Thai', | |
| 'tr': 'Turkish', | |
| 'tk': 'Turkmen', | |
| 'uk': 'Ukrainian', | |
| 'ur': 'Urdu', | |
| 'ug': 'Uyghur', | |
| 'uz': 'Uzbek', | |
| 'vi': 'Vietnamese', | |
| 'cy': 'Welsh', | |
| 'xh': 'Xhosa', | |
| 'yi': 'Yiddish', | |
| 'yo': 'Yoruba', | |
| 'zu': 'Zulu' | |
| }; | |
| for (const code in languages) { | |
| const option = document.createElement('option'); | |
| option.value = code; | |
| option.textContent = languages[code]; | |
| targetLanguageSelect.appendChild(option); | |
| } | |
| reader.onload = function(e) { | |
| const arrayBuffer = e.target.result; | |
| extractTextFromPDF(arrayBuffer) | |
| .then(text => translateText(text, targetLanguage)) | |
| .then(translatedText => { | |
| translatedTextOutput.value = translatedText; | |
| createPDF(translatedText) | |
| .then(pdfBlob => { | |
| const url = URL.createObjectURL(pdfBlob); | |
| downloadButton.href = url; | |
| downloadButton.download = 'translated_document.pdf'; | |
| downloadButton.style.display = 'block'; // Show the button | |
| downloadButton.addEventListener('click', function() { | |
| // Automatically revoke the object URL once clicked | |
| URL.revokeObjectURL(url); | |
| }); | |
| }); | |
| }); | |
| }; | |
| form.addEventListener('submit', function(event) { | |
| event.preventDefault(); | |
| const file = pdfFileInput.files[0]; | |
| const targetLanguage = targetLanguageSelect.value; | |
| if (!file || !targetLanguage) { | |
| alert('Please select a file and a target language.'); | |
| return; | |
| } | |
| const reader = new FileReader(); | |
| reader.onload = function(e) { | |
| const arrayBuffer = e.target.result; | |
| extractTextFromPDF(arrayBuffer) | |
| .then(text => translateText(text, targetLanguage)) | |
| .then(translatedText => { | |
| translatedTextOutput.value = translatedText; | |
| createPDF(translatedText) | |
| .then(pdfBlob => { | |
| const url = URL.createObjectURL(pdfBlob); | |
| downloadButton.href = url; | |
| downloadButton.download = 'translated_document.pdf'; | |
| downloadButton.style.display = 'block'; | |
| }); | |
| }); | |
| }; | |
| reader.readAsArrayBuffer(file); | |
| }); | |
| function extractTextFromPDF(arrayBuffer) { | |
| return pdfjsLib.getDocument({ data: arrayBuffer }).promise.then(pdf => { | |
| const maxPages = pdf.numPages; | |
| const pagePromises = []; | |
| for (let j = 1; j <= maxPages; j++) { | |
| pagePromises.push(pdf.getPage(j).then(page => page.getTextContent())); | |
| } | |
| return Promise.all(pagePromises).then(pages => { | |
| return pages.map(page => page.items.map(item => item.str).join(' ')).join('\n'); | |
| }); | |
| }); | |
| } | |
| function translateText(text, targetLanguage) { | |
| return fetch('https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=' + targetLanguage + '&dt=t&q=' + encodeURIComponent(text)) | |
| .then(response => response.json()) | |
| .then(data => { | |
| return data[0].map(item => item[0]).join(''); | |
| }); | |
| } | |
| function createPDF(text) { | |
| const { jsPDF } = window.jspdf; | |
| const pdf = new jsPDF(); | |
| const lines = pdf.splitTextToSize(text, 180); | |
| pdf.text(10, 10, lines); | |
| return pdf.output('blob'); | |
| } | |
| }); | |