|
document.addEventListener('DOMContentLoaded', () => { |
|
const textForm = document.getElementById('text-translation-form'); |
|
const docForm = document.getElementById('doc-translation-form'); |
|
const textResultBox = document.getElementById('text-result'); |
|
const textOutput = document.getElementById('text-output'); |
|
const docResultBox = document.getElementById('doc-result'); |
|
const docOutput = document.getElementById('doc-output'); |
|
const docFilename = document.getElementById('doc-filename'); |
|
const docSourceLang = document.getElementById('doc-source-lang'); |
|
const errorMessageDiv = document.getElementById('error-message'); |
|
const docLoadingIndicator = document.getElementById('doc-loading'); |
|
|
|
|
|
function displayError(message) { |
|
let errorText = 'Error: '; |
|
|
|
if (message === undefined || message === null) { |
|
errorText += 'Unknown error occurred'; |
|
} else if (typeof message === 'object') { |
|
|
|
if (message.message) { |
|
errorText += message.message; |
|
} else if (message.detail) { |
|
errorText += message.detail; |
|
} else if (message.error) { |
|
errorText += message.error; |
|
} else { |
|
try { |
|
errorText += JSON.stringify(message); |
|
} catch (e) { |
|
errorText += 'Unable to display error details'; |
|
} |
|
} |
|
} else { |
|
errorText += message; |
|
} |
|
|
|
console.error("Error details:", message); |
|
errorMessageDiv.textContent = errorText; |
|
errorMessageDiv.style.display = 'block'; |
|
|
|
textResultBox.style.display = 'none'; |
|
docResultBox.style.display = 'none'; |
|
} |
|
|
|
|
|
function clearFeedback() { |
|
errorMessageDiv.style.display = 'none'; |
|
errorMessageDiv.textContent = ''; |
|
textResultBox.style.display = 'none'; |
|
textOutput.textContent = ''; |
|
docResultBox.style.display = 'none'; |
|
docOutput.textContent = ''; |
|
docFilename.textContent = ''; |
|
docSourceLang.textContent = ''; |
|
docLoadingIndicator.style.display = 'none'; |
|
} |
|
|
|
|
|
textForm.addEventListener('submit', async (event) => { |
|
event.preventDefault(); |
|
clearFeedback(); |
|
|
|
const formData = new FormData(textForm); |
|
const button = textForm.querySelector('button'); |
|
const textInput = document.getElementById('text-input'); |
|
|
|
|
|
if (!textInput.value.trim()) { |
|
displayError('Please enter text to translate'); |
|
return; |
|
} |
|
|
|
button.disabled = true; |
|
button.textContent = 'Translating...'; |
|
|
|
try { |
|
console.log('Sending translation request...'); |
|
|
|
|
|
const payload = { |
|
text: formData.get('text'), |
|
source_lang: formData.get('source_lang'), |
|
target_lang: formData.get('target_lang') |
|
}; |
|
|
|
console.log('Payload:', payload); |
|
|
|
const response = await fetch('/translate/text', { |
|
method: 'POST', |
|
headers: { |
|
'Content-Type': 'application/json', |
|
}, |
|
body: JSON.stringify(payload) |
|
}); |
|
|
|
console.log('Response status:', response.status, response.statusText); |
|
|
|
|
|
const responseText = await response.text(); |
|
console.log('Raw response:', responseText); |
|
|
|
|
|
let data; |
|
try { |
|
data = responseText ? JSON.parse(responseText) : null; |
|
} catch (parseError) { |
|
console.error('Error parsing JSON response:', parseError); |
|
throw new Error(`Failed to parse server response: ${responseText}`); |
|
} |
|
|
|
if (!data) { |
|
throw new Error('Server returned empty response'); |
|
} |
|
|
|
|
|
if (!response.ok) { |
|
const errorMsg = data.error || data.detail || 'Unknown server error'; |
|
throw new Error(errorMsg); |
|
} |
|
|
|
|
|
if (data.success === false || !data.translated_text) { |
|
throw new Error(data.error || 'No translation returned from server'); |
|
} |
|
|
|
|
|
textOutput.textContent = data.translated_text; |
|
textResultBox.style.display = 'block'; |
|
|
|
} catch (error) { |
|
console.error('Translation error:', error); |
|
displayError(error); |
|
} finally { |
|
button.disabled = false; |
|
button.textContent = 'Translate'; |
|
} |
|
}); |
|
|
|
|
|
docForm.addEventListener('submit', async (event) => { |
|
event.preventDefault(); |
|
clearFeedback(); |
|
|
|
const formData = new FormData(docForm); |
|
const fileInput = document.getElementById('doc-input'); |
|
const button = docForm.querySelector('button'); |
|
|
|
if (!fileInput.files || fileInput.files.length === 0) { |
|
displayError('Please select a document to upload.'); |
|
return; |
|
} |
|
|
|
button.disabled = true; |
|
button.textContent = 'Translating...'; |
|
|
|
docLoadingIndicator.style.display = 'block'; |
|
|
|
try { |
|
const response = await fetch('/translate/document', { |
|
method: 'POST', |
|
body: formData |
|
}); |
|
|
|
|
|
const responseText = await response.text(); |
|
console.log('Raw document response:', responseText); |
|
|
|
|
|
let result; |
|
try { |
|
result = JSON.parse(responseText); |
|
} catch (jsonError) { |
|
throw new Error(`Failed to parse server response: ${responseText}`); |
|
} |
|
|
|
if (!response.ok) { |
|
const errorMessage = result.error || result.detail || `HTTP error! status: ${response.status}`; |
|
throw new Error(errorMessage); |
|
} |
|
|
|
console.log('Document translation response:', result); |
|
|
|
|
|
if (!result.translated_text) { |
|
throw new Error('Translation response is missing translated text'); |
|
} |
|
|
|
docFilename.textContent = result.original_filename || 'N/A'; |
|
docSourceLang.textContent = result.detected_source_lang || 'N/A'; |
|
docOutput.textContent = result.translated_text; |
|
docResultBox.style.display = 'block'; |
|
|
|
|
|
docOutput.dir = 'rtl'; |
|
|
|
} catch (error) { |
|
console.error('Document translation error:', error); |
|
displayError(error.message || 'An unexpected error occurred during document translation.'); |
|
} finally { |
|
button.disabled = false; |
|
button.textContent = 'Translate Document'; |
|
|
|
docLoadingIndicator.style.display = 'none'; |
|
} |
|
}); |
|
}); |
|
|