import React, { useState } from 'react';
const VideoVoiceTranslateTool = () => {
const [videoUrl, setVideoUrl] = useState('');
const [languages, setLanguages] = useState
([]);
const [translatedUrls, setTranslatedUrls] = useState<{ lang: string; url: string }[]>([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const [progress, setProgress] = useState(0);
const availableLanguages = [
{ code: 'en', name: 'English' },
{ code: 'es', name: 'Spanish' },
{ code: 'fr', name: 'French' },
{ code: 'de', name: 'German' },
{ code: 'zh', name: 'Chinese' },
{ code: 'ar', name: 'Arabic' },
{ code: 'hi', name: 'Hindi' },
{ code: 'ru', name: 'Russian' },
{ code: 'ja', name: 'Japanese' },
{ code: 'pt', name: 'Portuguese' }
];
const handleTranslate = async () => {
if (!videoUrl) {
setError('Please enter a video URL');
return;
}
if (languages.length === 0) {
setError('Please select at least one language');
return;
}
setError(null);
setTranslatedUrls([]);
setLoading(true);
setProgress(0);
try {
const results = [];
const total = languages.length;
// Simulate API calls with progress
for (const [index, lang] of languages.entries()) {
await new Promise(resolve => setTimeout(resolve, 800));
// Simulate success or failure randomly
const success = Math.random() > 0.2;
if (success) {
results.push({
lang,
url: `https://translated-videos.example.com/${lang}/${Date.now()}.mp4`
});
} else {
results.push({
lang,
url: 'error',
error: `Translation failed for ${lang.toUpperCase()}`
});
}
setProgress(Math.round(((index + 1) / total) * 100));
}
setTranslatedUrls(results);
} catch (error) {
console.error('Translation process failed', error);
setError('Failed to process translations. Please try again.');
} finally {
setLoading(false);
}
};
const toggleLanguage = (lang: string) => {
setLanguages((prev) =>
prev.includes(lang) ? prev.filter((l) => l !== lang) : [...prev, lang]
);
};
const selectAllLanguages = () => {
if (languages.length === availableLanguages.length) {
setLanguages([]);
} else {
setLanguages(availableLanguages.map(lang => lang.code));
}
};
// Mock translation function for demo
const mockTranslate = (lang: string) => {
return {
lang,
url: `https://translated-videos.example.com/${lang}/${Date.now()}.mp4`
};
};
return (
{error && (
)}
Video Source
Supported platforms: YouTube, Vimeo, MP4, MOV, WEBM (Max 500MB)
Target Languages
{languages.length === availableLanguages.length ? 'Deselect All' : 'Select All'}
{availableLanguages.map(({ code, name }) => (
toggleLanguage(code)}
disabled={loading}
>
{code.toUpperCase()}
{name}
))}
{loading ? (
Translating ({progress}%)
) : (
'Translate Video Voices'
)}
{loading && (
)}
{translatedUrls.length > 0 && (
Translated Videos
{translatedUrls.filter(item => item.url !== 'error').length}/{translatedUrls.length} completed
{translatedUrls.map(({ lang, url, error }) => {
const language = availableLanguages.find(l => l.code === lang);
return (
{language?.name} ({lang.toUpperCase()})
{url === 'error' ? (
{error}
) : (
Translation successful
)}
{url !== 'error' ? (
Download
) : (
{
const mock = mockTranslate(lang);
setTranslatedUrls(prev =>
prev.map(item =>
item.lang === lang ? mock : item
)
);
}}
className="bg-gradient-to-r from-blue-500 to-blue-600 hover:from-blue-600 hover:to-blue-700 text-white font-medium py-2 px-4 rounded-lg text-sm transition-all"
>
Retry
)}
);
})}
)}
Need help? Contact support@videotranslate.com
Terms
Privacy
Documentation
);
};
export default VideoVoiceTranslateTool;