Al Translation Tool - Video Language Translator
AI Translation Tool - Movie Language Translator with Lip Sync
:root {
--primary: #663399;
--secondary: #42a5f5;
--accent: #f50057;
--light: #f8f9fa;
--dark: #212529;
--neutral: #e0e0e0;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Poppins', sans-serif;
background-color: var(--light);
color: var(--dark);
line-height: 1.6;
}
header {
background: linear-gradient(to right, var(--primary), #4a148c);
color: white;
padding: 2rem;
text-align: center;
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}
.logo {
max-width: 150px;
height: auto;
}
main {
max-width: 1200px;
margin: 2rem auto;
padding: 0 1rem;
}
.intro-box, .tool-container {
background: white;
border-radius: 12px;
padding: 2rem;
margin-bottom: 2rem;
box-shadow: 0 2px 10px rgba(0,0,0,0.05);
}
.intro-text {
width: 100%;
min-height: 200px;
padding: 1rem;
border: 1px solid var(--neutral);
border-radius: 8px;
font-family: 'Poppins', sans-serif;
}
.form-grid {
display: grid;
gap: 1.5rem;
}
.form-group {
margin-bottom: 1rem;
}
label {
font-weight: 500;
margin-bottom: 0.5rem;
display: block;
}
.input-field {
width: 100%;
padding: 1rem;
border: 1px solid var(--neutral);
border-radius: 8px;
margin-bottom: 1rem;
}
.file-upload {
border: 2px dashed var(--secondary);
padding: 2rem;
text-align: center;
cursor: pointer;
transition: all 0.3s;
}
.file-upload:hover {
border-color: var(--primary);
background-color: #f0f4c3;
}
#videoInput {
display: none;
}
select, button {
width: 100%;
padding: 1rem;
border-radius: 8px;
border: 1px solid var(--neutral);
font-family: 'Poppins', sans-serif;
}
button {
background-color: var(--accent);
color: white;
border: none;
cursor: pointer;
transition: all 0.3s;
}
button:hover {
background-color: #d81b60;
}
#videoPreviewContainer {
display: none;
}
#videoPreview {
width: 100%;
border-radius: 8px;
}
.progress-container {
display: none;
margin-top: 1.5rem;
}
.progress-bar {
height: 10px;
background-color: var(--neutral);
border-radius: 5px;
}
.progress {
height: 100%;
background-color: var(--accent);
width: 0;
transition: width 0.3s;
}
#result {
margin-top: 1.5rem;
padding: 1rem;
border-radius: 8px;
display: none;
}
.success {
background-color: #e8f5e9;
border-left: 4px solid #4caf50;
}
.error {
background-color: #ffebee;
border-left: 4px solid #f44336;
}
@media (min-width: 768px) {
.form-grid, .language-selectors {
grid-template-columns: 1fr 1fr;
}
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
.animated {
animation: fadeIn 0.6s ease-out;
}
document.addEventListener('DOMContentLoaded', () => {
const videoInput = document.getElementById('videoInput');
const youtubeLink = document.getElementById('youtubeLink');
const videoPreview = document.getElementById('videoPreview');
const previewContainer = document.getElementById('videoPreviewContainer');
const form = document.getElementById('translationForm');
const translateBtn = document.getElementById('translateBtn');
const progressContainer = document.getElementById('progressContainer');
const progressBar = document.getElementById('progressBar');
const result = document.getElementById('result');
// Video preview
videoInput.addEventListener('change', (e) => {
const file = e.target.files[0];
if (file) {
videoPreview.src = URL.createObjectURL(file);
previewContainer.style.display = 'block';
}
});
// Form submission
form.addEventListener('submit', async (e) => {
e.preventDefault();
const formData = new FormData();
if (videoInput.files[0]) {
formData.append('video', videoInput.files[0]);
} else if (youtubeLink.value) {
formData.append('youtube_link', youtubeLink.value);
} else {
result.className = 'error';
result.textContent = 'Please provide a video file or YouTube link';
result.style.display = 'block';
return;
}
formData.append('source_language', document.getElementById('sourceLanguage').value);
formData.append('target_language', document.getElementById('targetLanguage').value);
formData.append('voice', document.getElementById('voice').value);
translateBtn.disabled = true;
progressContainer.style.display = 'block';
result.style.display = 'none';
try {
const response = await fetch('/translate', {
method: 'POST',
body: formData
});
const data = await response.json();
// Simulate progress
let progress = 0;
const interval = setInterval(() => {
progress += 10;
progressBar.style.width = ${progress}%;
if (progress >= 100) {
clearInterval(interval);
result.className = 'success';
result.innerHTML = Translation complete!
Download Video;
result.style.display = 'block';
progressContainer.style.display = 'none';
translateBtn.disabled = false;
form.reset();
previewContainer.style.display = 'none';
}
}, 300);
} catch (error) {
result.className = 'error';
result.textContent = 'An error occurred during translation';
result.style.display = 'block';
translateBtn.disabled = false;
progressContainer.style.display = 'none';
}
});
});
Comments
Post a Comment