FrenchWithKunal - Language Learning Hub
<div class="shape"></div>
<div class="shape"></div>
<div class="shape"></div>
</div>
<div class="landing-container">
<div class="landing-card">
<div class="landing-header">
<div class="language-switcher">
<button class="language-btn active" onclick="switchLanguage('en')" id="enBtn">🇬🇧 EN</button>
<button class="language-btn" onclick="switchLanguage('fr')" id="frBtn">🇫🇷 FR</button>
</div>
<h1>
<i class="fas fa-graduation-cap me-3"></i>
FrenchWithKunal
</h1>
<p data-en="Where mastering French meets the art of Parisian living" data-fr="Où maîtriser le français rencontre l'art de vivre parisien">Where mastering French meets the art of Parisian living</p>
<div class="flag-decoration"></div>
</div>
<div class="landing-body">
<!-- Video Section -->
<div class="video-container">
<iframe width="100%" height="450" src="https://www.youtube.com/embed/hU07FOM1klQ?start=10" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
<p style="text-align: center; font-size: 1.1rem; margin-bottom: 2rem;" data-en="Bonjour! I'm Kunal, your guide to speaking French with authentic pronunciation, real culture, and a Parisian touch." data-fr="Bonjour! Je suis Kunal, votre guide pour parler français avec une prononciation authentique, une vraie culture et une touche parisienne.">
Bonjour! I'm Kunal, your guide to speaking French with authentic pronunciation, real culture, and a Parisian touch.
</p>
<div class="practice-options">
<!-- TEF/TCF Practice -->
<a href="/tef-practice" class="practice-option tef">
<div class="practice-icon">
<i class="fas fa-clipboard-check"></i>
</div>
<div class="practice-title" data-en="TEF/TCF Practice" data-fr="Pratique TEF/TCF">TEF/TCF Practice</div>
<div class="practice-description" data-en="Prepare for official French exams with realistic practice tests and personalized feedback" data-fr="Préparez-vous aux examens officiels de français avec des tests pratiques réalistes et des commentaires personnalisés">
Prepare for official French exams with realistic practice tests and personalized feedback
</div>
<div class="practice-btn">
<i class="fas fa-arrow-right me-2"></i>
<span data-en="Start Practicing" data-fr="Commencer">Start Practicing</span>
</div>
</a>
<!-- Practice with AI -->
<a href="/ai-practice" class="practice-option ai">
<div class="practice-icon">
<i class="fas fa-robot"></i>
</div>
<div class="practice-title" data-en="Practice with AI" data-fr="Pratique avec IA">Practice with AI</div>
<div class="practice-description" data-en="Get instant feedback on your French with our AI tutor, available 24/7" data-fr="Obtenez des commentaires instantanés sur votre français avec notre tuteur IA, disponible 24h/24">
Get instant feedback on your French with our AI tutor, available 24/7
</div>
<div class="practice-btn">
<i class="fas fa-arrow-right me-2"></i>
<span data-en="Try AI Tutor" data-fr="Essayer">Try AI Tutor</span>
</div>
</a>
<!-- Parisian Culture -->
<a href="/culture" class="practice-option culture">
<div class="practice-icon">
<i class="fas fa-landmark"></i>
</div>
<div class="practice-title" data-en="Parisian Culture" data-fr="Culture Parisienne">Parisian Culture</div>
<div class="practice-description" data-en="Immerse yourself in authentic Parisian life through language, art, and traditions" data-fr="Plongez-vous dans la vie parisienne authentique à travers la langue, l'art et les traditions">
Immerse yourself in authentic Parisian life through language, art, and traditions
</div>
<div class="practice-btn">
<i class="fas fa-arrow-right me-2"></i>
<span data-en="Explore Culture" data-fr="Explorer">Explore Culture</span>
</div>
</a>
</div>
<!-- Newsletter Section -->
<div class="card" style="margin-top: 3rem; background: rgba(233, 236, 239, 0.5); border: 2px dashed var(--french-blue); padding: 2rem; text-align: center; border-radius: 15px;">
<h3 style="margin-bottom: 1rem;">
<i class="fas fa-envelope-open-text"></i>
<span data-en="Get your weekly dose of authentic French!" data-fr="Recevez votre dose hebdomadaire de français authentique!">Get your weekly dose of authentic French!</span>
</h3>
<p data-en="Every week: 1 cultural tip, 1 slang expression, and 1 mini-lesson straight to your inbox." data-fr="Chaque semaine : 1 conseil culturel, 1 expression argotique et 1 mini-leçon directement dans votre boîte de réception.">
Every week: 1 cultural tip, 1 slang expression, and 1 mini-lesson straight to your inbox.
</p>
<form id="subscribeForm" style="margin-top: 1.5rem;">
<input type="email" id="subscriberEmail" name="email" placeholder="Enter your email" required style="padding: 10px; border-radius: 5px; border: 1px solid #ccc; width: 80%; max-width: 300px;">
<br>
<button type="submit" class="practice-btn tef" style="margin-top: 1rem; display: inline-block;">
<span data-en="Yes, I want it!" data-fr="Oui, je le veux!">Yes, I want it!</span>
</button>
</form>
</div>
<div class="footer-info">
<small class="text-muted">
<i class="fas fa-heart text-danger me-1"></i>
<span data-en="Created with passion for French learning" data-fr="Créé avec passion pour l'apprentissage du français">Created with passion for French learning</span>
</small>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<script>
// Language switching functionality
let currentLanguage = 'en';
function switchLanguage(lang) {
currentLanguage = lang;
// Update active button
document.getElementById('enBtn').classList.toggle('active', lang === 'en');
document.getElementById('frBtn').classList.toggle('active', lang === 'fr');
// Update html lang attribute
document.getElementById('htmlLang').setAttribute('lang', lang);
// Update all elements with data attributes
const elements = document.querySelectorAll('[data-en][data-fr]');
elements.forEach(element => {
const text = element.getAttribute('data-' + lang);
if (text) {
if (element.tagName === 'TITLE') {
element.textContent = text;
} else {
element.textContent = text;
}
}
});
// Store preference
localStorage.setItem('preferredLanguage', lang);
}
// Load saved language preference
document.addEventListener('DOMContentLoaded', function() {
const savedLang = localStorage.getItem('preferredLanguage') || 'en';
switchLanguage(savedLang);
// Add smooth entrance animation
const card = document.querySelector('.landing-card');
card.style.transform = 'translateY(50px)';
card.style.opacity = '0';
setTimeout(() => {
card.style.transition = 'all 0.8s ease-out';
card.style.transform = 'translateY(0)';
card.style.opacity = '1';
}, 100);
// Newsletter form submission
document.getElementById('subscribeForm').addEventListener('submit', async function(e) {
e.preventDefault();
const email = document.getElementById('subscriberEmail').value;
try {
const response = await fetch('https://frenchwithkunal-cdf6ea3f88ce.herokuapp.com/api/v1/subscribers/create-subscriber', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ email: email })
});
if (response.ok) {
alert(currentLanguage === 'en' ? 'Thank you! You are now subscribed to our newsletter.' : 'Merci! Vous êtes maintenant abonné à notre newsletter.');
document.getElementById('subscriberEmail').value = '';
} else {
alert(currentLanguage === 'en' ? 'There was a problem with your subscription. Please try again later.' : 'Un problème est survenu avec votre abonnement. Veuillez réessayer plus tard.');
}
} catch (error) {
console.error('Error:', error);
alert(currentLanguage === 'en' ? 'An error occurred. Please try again later.' : 'Une erreur est survenue. Veuillez réessayer plus tard.');
}
});
});
</script>