amine_dubs
changed model
ec41997
raw
history blame
8.41 kB
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');
// Helper function to display errors
function displayError(message) {
let errorText = 'Error: ';
if (message === undefined || message === null) {
errorText += 'Unknown error occurred';
} else if (typeof message === 'object') {
// Improved error object handling
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';
// Hide result boxes on error
textResultBox.style.display = 'none';
docResultBox.style.display = 'none';
}
// Helper function to clear errors and results
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';
}
// Fix the text form submission handler to use correct field IDs
if (textForm) {
textForm.addEventListener('submit', async (e) => {
e.preventDefault();
clearFeedback();
// Use correct field IDs matching the HTML
const sourceText = document.getElementById('text-input').value.trim();
const sourceLang = document.getElementById('source-lang-text').value;
const targetLang = document.getElementById('target-lang-text').value;
if (!sourceText) {
displayError('Please enter text to translate');
return;
}
try {
// Show loading state (create it if missing)
let textLoading = document.getElementById('text-loading');
if (!textLoading) {
textLoading = document.createElement('div');
textLoading.id = 'text-loading';
textLoading.className = 'loading-spinner';
textLoading.innerHTML = 'Translating...';
textForm.appendChild(textLoading);
}
textLoading.style.display = 'block';
// Log payload for debugging
console.log('Sending payload:', { text: sourceText, source_lang: sourceLang, target_lang: targetLang });
const response = await fetch('/translate/text', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
text: sourceText,
source_lang: sourceLang,
target_lang: targetLang
})
});
// Hide loading state
textLoading.style.display = 'none';
// Log response status
console.log('Response status:', response.status);
const data = await response.json();
if (!response.ok) {
if (data && data.error) {
displayError(data.error);
} else {
displayError(`Server error: ${response.status}`);
}
return;
}
if (!data.success && data.error) {
displayError(data.error);
return;
}
if (!data.translated_text) {
displayError('Translation returned empty text');
return;
}
textOutput.textContent = data.translated_text;
textResultBox.style.display = 'block';
} catch (error) {
console.error('Error:', error);
displayError('Network error or invalid response format');
// Hide loading if it exists
const textLoading = document.getElementById('text-loading');
if (textLoading) textLoading.style.display = 'none';
}
});
}
// Handle Document Translation Form Submission
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...';
// Show loading indicator
docLoadingIndicator.style.display = 'block';
try {
const response = await fetch('/translate/document', {
method: 'POST',
body: formData // FormData handles multipart/form-data automatically
});
// Get response as text first for debugging
const responseText = await response.text();
console.log('Raw document response:', responseText);
// Try to parse as JSON
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);
// Check if result contains the expected fields
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';
// Set text direction based on target language (document always goes to Arabic)
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';
// Hide loading indicator
docLoadingIndicator.style.display = 'none';
}
});
});