body {
font-family: ‘Segoe UI’, Tahoma, Geneva, Verdana, sans-serif;
max-width: 100%;
margin: 0 auto;
padding: 20px;
background-color: #f9f9f9;
}
h1, h2, h3 {
color: #2c3e50;
}
.container {
background-color: white;
padding: 30px;
border-radius: 10px;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}
.subscription-form {
background-color: #e8f4f8;
padding: 20px;
border-radius: 8px;
margin-bottom: 30px;
}
.exercise-container {
display: none;
}
.form-group {
margin-bottom: 15px;
}
label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
input, select {
width: 100%;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 16px;
}
button {
background-color: #3498db;
color: white;
border: none;
padding: 12px 20px;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
transition: background-color 0.3s;
}
button:hover {
background-color: #2980b9;
}
.exercise-text {
line-height: 2;
font-size: 18px;
}
.gap {
border-bottom: 1px solid #333;
padding: 0 5px;
margin: 0 3px;
min-width: 50px;
display: inline-block;
}
input.gap-input {
width: 50px;
border: none;
border-bottom: 1px solid #333;
font-size: 16px;
text-align: center;
}
.result {
margin-top: 30px;
padding: 20px;
background-color: #eafaf1;
border-radius: 8px;
display: none;
}
.certificate {
text-align: center;
margin-top: 30px;
padding: 20px;
border: 2px solid #2c3e50;
border-radius: 8px;
display: none;
}
.difficulty-selector {
margin-bottom: 20px;
}
.error {
color: red;
font-size: 14px;
}
#certificatePreview {
position: relative;
width: 100%;
height: 450px;
background-color: #fff;
border: 10px solid transparent;
border-image: linear-gradient(45deg, #3498db, #2980b9, #1abc9c, #16a085, #2c3e50) 1;
box-sizing: border-box;
overflow: hidden;
}
.certificate-background {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0.07;
z-index: 0;
background-position: center;
background-repeat: no-repeat;
background-size: 70%;
}
.certificate-content {
position: relative;
z-index: 1;
padding: 20px;
width: 100%;
height: 100%;
box-sizing: border-box;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.certificate-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
}
.certificate-title {
flex-grow: 1;
text-align: center;
}
.certificate-logo {
width: 120px;
height: 60px;
}
.certificate-footer {
display: flex;
justify-content: space-between;
align-items: flex-end;
}
.certificate-qr {
width: 120px;
height: 120px;
display: flex;
justify-content: center;
align-items: center;
}
.certificate-qr img {
max-width: 100%;
max-height: 100%;
}
.certificate-signature {
flex-grow: 1;
text-align: center;
}
.triangle-pattern {
position: absolute;
width: 150px;
height: 120px;
}
.triangle-pattern.top-right {
top: 0;
right: 0;
}
.triangle-pattern.bottom-left {
bottom: 0;
left: 0;
}
.rules-box {
background-color: #f0f5fa;
padding: 15px;
border-left: 4px solid #3498db;
margin-bottom: 20px;
border-radius: 4px;
}
Exercice de Grammaire: Le Pronom Y
Inscrivez-vous pour commencer l’exercice
Veuillez vous abonner et remplir vos informations pour accéder à l’exercice.
Complétez le texte avec le pronom Y quand nécessaire
Rappel sur le pronom Y
Le pronom Y remplace:
- Un lieu introduit par une préposition de lieu (à, dans, sur, en, etc.):
Je vais à Paris. → J’y vais. - Un complément introduit par la préposition “à” (sauf pour les personnes):
Je pense à mes vacances. → J’y pense. - Un complément dans des expressions comme il y a, ça y est, s’y prendre, s’y connaître…
Attention: Y ne remplace pas les personnes (utiliser “lui”, “leur” à la place) et se place généralement avant le verbe.
En français, le pronom “y” remplace généralement un complément de lieu introduit par “à”, “en”, “dans”, etc., ou un complément introduit par la préposition “à” qui ne désigne pas une personne.
Cependant, il existe plusieurs cas où le pronom “y” n’est pas utilisé :
Pour remplacer un complément d’objet direct (COD) : on utilise les pronoms “le”, “la”, “les” et non “y”.
Exemple : J’ai acheté ce livre → Je l’ai acheté (et non “j’y ai acheté”)
Pour remplacer un complément désignant une personne introduit par “à” : on utilise les pronoms “lui” ou “leur”.
Exemple : Je téléphone à ma sœur → Je lui téléphone (et non “j’y téléphone”)
Avec les verbes qui expriment un sentiment ou une émotion comme aimer, adorer, préférer, etc.
Exemple : J’aime ma famille → Je l’aime (et non “j’y aime”)
Après certains verbes qui n’acceptent pas le pronom “y” comme attendre, chercher, quitter, etc.
Exemple : J’attends mon ami → Je l’attends (et non “j’y attends”)
Avec les verbes pronominaux de sentiment comme se plaire, se fier, etc., qui requièrent d’autres constructions.
Exemple : Je me fie à son jugement → Je me fie à lui/elle (et non “je m’y fie”)
Dans l’exercice ci-dessus, les espaces avec la réponse “-” indiquent les cas où le pronom “y” ne doit pas être utilisé.
Choisissez le niveau de difficulté:
Facile
Moyen
Difficile
Le Pronom Y en Français (Niveau Facile)
J’aime beaucoup Paris, j’ vais souvent. Ma sœur n’ est jamais allée. Nous avons visité le musée du Louvre et nous avons vu la Joconde. J’ai rencontré mon ami Pierre au café.
Notre professeur nous a parlé de ce livre, mais je ne m’ intéresse pas beaucoup. Par contre, mon frère pense sans arrêt. Il a même des références dans son mémoire. Je connais cette histoire depuis mon enfance.
Je m’installe toujours à cette table pour travailler. Je m’ sens bien. Tu veux t’asseoir dans ce fauteuil? Moi, je ne m’ installe jamais, il est trop dur! J’aime ma famille plus que tout.
Est-ce que tu vas participer à ce concours? Oui, je vais participer. Non, je ne vais pas participer cette année. J’ai appelé mes parents hier soir.
Dans cette école, il a une excellente ambiance. Les étudiants sont heureux. Nous avons acheté des livres pour la bibliothèque.
Ta mère est à la maison? Non, elle n’ est pas, elle est sortie. Tu trouves cette chanson jolie? Oui, je l’adore!
Tu réfléchis à ton avenir? Oui, j’ réfléchis beaucoup en ce moment. J’ai vu ce film trois fois déjà.
Cette montagne est difficile à escalader, mais mon cousin est déjà monté trois fois. J’ai rencontré ton ami Paul au restaurant.
Le succès de son entreprise? Il croit fermement. J’ai écrit une lettre à ma tante.
Le Pronom Y en Français (Niveau Moyen)
avez-vous déjà pensé? Cette question est complexe, mais nous devons réfléchir sérieusement. Nous avons aidé les personnes âgées du quartier.
Si vous allez à ce concert, j’ serai également. Elle a vu son médecin hier après-midi.
Marc n’aime pas les mathématiques et pourtant il excelle. J’attends ma sœur depuis une heure.
Nous avons passé beaucoup de temps à étudier ce phénomène, et nous avons découvert des aspects fascinants. Nous avons invité tous nos amis à la fête.
Elle s’est inscrite à ce cours et elle participera dès la semaine prochaine. Je cherche mes clés depuis ce matin.
Ces nouvelles technologies, personne ne s’ attendait il y a dix ans. J’ai préparé un gâteau pour ton anniversaire.
Dans ces montagnes, on trouve des plantes rares. Il a apporté son ordinateur pour la présentation.
À cette question, je ne peux pas répondre immédiatement. Je n’ai pas vu ce film dont tout le monde parle.
Tu vas au théâtre ce soir? J’ vais aussi! Nous avons discuté ce problème pendant des heures.
Il ne s’ prend pas correctement pour résoudre ce problème. Il a visité plusieurs villes européennes l’été dernier.
Tu as pensé à mon conseil? Oui, j’ ai bien réfléchi. J’adore cette chanson, elle me rappelle mon enfance.
Je ne crois pas à ces superstitions, mais ma grand-mère croit fermement. Nous avons quitté Paris très tôt ce matin!
Le Pronom Y en Français (Niveau Difficile)
utilisation du pronom Y peut devenir complexe avec certaines structures verbales. Je ne m’ serais jamais attendu à un tel succès! J’ai finalement rencontré la personne dont tu m’as tant parlé.
Dans cette affaire, nous nous sommes investis corps et âme. J’ai toujours respecté mes professeurs, même les plus exigeants.
Contrairement à ce que l’on pourrait croire, la solution à ce problème ne s’ trouve pas facilement. Elle a préféré son ancien appartement à celui-ci.
Il ne s’ est pas encore fait, à son nouveau poste de responsabilité. Nous avons écouté attentivement tous les témoins.
Quand on veut, on peut, mais encore faut-il s’ prendre correctement. Il a trouvé sa vocation après des années de recherche.
À ces propos tendancieux, personne n’ a vraiment prêté attention. Elle a encouragé ses élèves pendant toute l’année.
Au sommet de cette montagne, les alpinistes chevronnés s’ sont risqués malgré le mauvais temps. J’ai salué mes voisins ce matin en partant.
Ils s’ étaient pourtant bien préparés, à cet examen difficile. J’ai aimé ce livre dès les premières pages.
Quand on s’ connaît en art, on peut distinguer une vraie œuvre d’un faux. Elle a survécu à cette terrible épreuve grâce à sa force morale.
Cette théorie, bien que controversée, plusieurs scientifiques réputés s’ réfèrent régulièrement. Nous avons félicité les gagnants du concours.
À cette conférence internationale, nous nous rendrons en délégation officielle. J’ai téléphoné à mon ami pour lui annoncer la nouvelle.
Il s’ prenait mal, mais à force de persévérance, il a fini par maîtriser cette technique. J’ai regardé ce documentaire avec beaucoup d’intérêt.
Résultat
Certificat de Réussite
Exercice de Grammaire: Le Pronom Y
Ce certificat atteste que
a complété avec succès l’exercice sur le pronom Y en français
Score: / 100
Niveau:
Date:
// Variables globales
let currentDifficulty = ‘facile’;
let userInfo = {
prenom: ”,
nom: ”,
email: ”
};
// Logo Aplenguas en SVG (version bleue pour le pronom Y)
const aplenguas_logo_svg = `
`;
// Attente que le DOM soit chargé
document.addEventListener(‘DOMContentLoaded’, function() {
// Éléments du DOM
const startButton = document.getElementById(‘startButton’);
const changeDifficultyButton = document.getElementById(‘changeDifficultyButton’);
const checkButton = document.getElementById(‘checkButton’);
const generatePdfButton = document.getElementById(‘generatePdfButton’);
const difficultySelect = document.getElementById(‘difficultySelect’);
// Définir l’arrière-plan du certificat
const certificateBackground = document.querySelector(‘.certificate-background’);
certificateBackground.style.backgroundImage = `url(‘data:image/svg+xml;base64,${btoa(aplenguas_logo_svg)}’)`;
// Ajouter les logos SVG
const headerLogo = document.getElementById(‘certificateHeaderLogo’);
const footerLogo = document.getElementById(‘certificateFooterLogo’);
headerLogo.innerHTML = aplenguas_logo_svg;
footerLogo.innerHTML = aplenguas_logo_svg;
// Ajouter aussi le logo au container caché pour l’exportation PDF
document.getElementById(‘logoSvgContainer’).innerHTML = aplenguas_logo_svg;
// Ajout des écouteurs d’événements
startButton.addEventListener(‘click’, startExercise);
changeDifficultyButton.addEventListener(‘click’, changeDifficulty);
checkButton.addEventListener(‘click’, checkAnswers);
generatePdfButton.addEventListener(‘click’, generatePdf);
// Générer le QR code
function generateQRCode() {
const qrCodeContainer = document.getElementById(‘qrCodeContainer’);
qrCodeContainer.innerHTML = ”;
try {
// Version du QR code (1-40) avec un niveau de correction d’erreur ‘L’
var qr = qrcode(4, ‘L’);
qr.addData(‘https://aplenguas.com’);
qr.make();
qrCodeContainer.innerHTML = qr.createImgTag(4);
} catch (error) {
console.error(“Erreur lors de la génération du QR code:”, error);
// Fallback si la génération du QR code échoue
qrCodeContainer.innerHTML = ‘
‘;
}
}
// Fonction pour démarrer l’exercice
function startExercise() {
// Validation des champs
const prenom = document.getElementById(‘prenom’).value.trim();
const nom = document.getElementById(‘nom’).value.trim();
const email = document.getElementById(‘email’).value.trim();
const subscribe = document.getElementById(‘subscribe’).checked;
// Réinitialiser les messages d’erreur
document.getElementById(‘prenomError’).textContent = ”;
document.getElementById(‘nomError’).textContent = ”;
document.getElementById(‘emailError’).textContent = ”;
document.getElementById(‘subscribeError’).textContent = ”;
// Vérifier les champs requis
let isValid = true;
if (!prenom) {
document.getElementById(‘prenomError’).textContent = ‘Veuillez entrer votre prénom’;
isValid = false;
}
if (!nom) {
document.getElementById(‘nomError’).textContent = ‘Veuillez entrer votre nom’;
isValid = false;
}
if (!email) {
document.getElementById(‘emailError’).textContent = ‘Veuillez entrer votre email’;
isValid = false;
} else if (!isValidEmail(email)) {
document.getElementById(‘emailError’).textContent = ‘Veuillez entrer un email valide’;
isValid = false;
}
if (!subscribe) {
document.getElementById(‘subscribeError’).textContent = ‘Veuillez accepter de vous abonner pour continuer’;
isValid = false;
}
if (!isValid) return;
// Enregistrer les informations de l’utilisateur
userInfo.prenom = prenom;
userInfo.nom = nom;
userInfo.email = email;
// Masquer le formulaire d’inscription et afficher l’exercice
document.getElementById(‘subscriptionForm’).style.display = ‘none’;
document.getElementById(‘exerciseContainer’).style.display = ‘block’;
// Initialiser l’exercice avec la difficulté par défaut
showExercise(‘facile’);
}
// Fonction pour valider l’email
function isValidEmail(email) {
const emailRegex = /^[^s@]+@[^s@]+.[^s@]+$/;
return emailRegex.test(email);
}
// Fonction pour changer la difficulté
function changeDifficulty() {
const selectedDifficulty = document.getElementById(‘difficultySelect’).value;
currentDifficulty = selectedDifficulty;
showExercise(selectedDifficulty);
}
// Fonction pour afficher l’exercice selon la difficulté
function showExercise(difficulty) {
// Masquer tous les exercices
document.querySelectorAll(‘.exercise-level’).forEach(el => {
el.style.display = ‘none’;
});
// Afficher l’exercice sélectionné
document.getElementById(‘exercise’ + difficulty.charAt(0).toUpperCase() + difficulty.slice(1)).style.display = ‘block’;
// Réinitialiser les champs de saisie
document.querySelectorAll(‘.gap-input’).forEach(input => {
input.value = ”;
input.style.backgroundColor = ”;
});
// Masquer les résultats et le certificat
document.getElementById(‘resultContainer’).style.display = ‘none’;
document.getElementById(‘certificatePreview’).style.display = ‘none’;
}
// Fonction pour vérifier les réponses
function checkAnswers() {
const inputs = document.querySelectorAll(‘#exercise’ + currentDifficulty.charAt(0).toUpperCase() + currentDifficulty.slice(1) + ‘ .gap-input’);
let correctAnswers = 0;
inputs.forEach(input => {
const userAnswer = input.value.trim();
const correctAnswer = input.dataset.answer;
if (userAnswer.toLowerCase() === correctAnswer.toLowerCase()) {
input.style.backgroundColor = ‘#d4edda’; // Vert clair pour les bonnes réponses
correctAnswers++;
} else {
input.style.backgroundColor = ‘#f8d7da’; // Rouge clair pour les mauvaises réponses
}
});
// Calcul du score en pourcentage
const totalQuestions = inputs.length;
const scorePercentage = Math.round((correctAnswers / totalQuestions) * 100);
// Afficher le résultat
const resultContainer = document.getElementById(‘resultContainer’);
const scoreDisplay = document.getElementById(‘scoreDisplay’);
resultContainer.style.display = ‘block’;
scoreDisplay.textContent = `Vous avez obtenu ${correctAnswers} réponses correctes sur ${totalQuestions} (${scorePercentage}%)`;
// Préparer le certificat si le score est bon
if (scorePercentage >= 60) {
// Mettre à jour les informations du certificat
document.getElementById(‘certificateNamePreview’).textContent = `${userInfo.prenom} ${userInfo.nom}`;
document.getElementById(‘certificateScorePreview’).textContent = scorePercentage;
document.getElementById(‘certificateLevelPreview’).textContent = currentDifficulty.charAt(0).toUpperCase() + currentDifficulty.slice(1);
// Date du jour
const today = new Date();
const options = { year: ‘numeric’, month: ‘long’, day: ‘numeric’ };
document.getElementById(‘certificateDatePreview’).textContent = today.toLocaleDateString(‘fr-FR’, options);
// Afficher le certificat
document.getElementById(‘certificatePreview’).style.display = ‘block’;
// Générer le QR code
generateQRCode();
}
}
// Fonction pour générer le PDF
function generatePdf() {
try {
if (typeof window.jspdf === ‘undefined’ || typeof window.jspdf.jsPDF === ‘undefined’) {
alert(“La bibliothèque jsPDF n’est pas chargée correctement. Veuillez réessayer plus tard.”);
return;
}
// Créer un nouveau document PDF
const { jsPDF } = window.jspdf;
const doc = new jsPDF({
orientation: ‘landscape’,
unit: ‘mm’,
format: ‘a4’
});
// Cloner le certificat pour éviter de modifier l’original
const certificateElement = document.getElementById(‘certificatePreview’).cloneNode(true);
// Convertir le SVG en base64 pour l’inclure dans le PDF
const logoSvg = document.getElementById(‘logoSvgContainer’).innerHTML;
const logoBase64 = btoa(logoSvg);
// Personnaliser le PDF
const title = “Certificat de Réussite – Pronom Y”;
doc.setProperties({
title: title,
subject: “Exercice de Grammaire Française”,
author: “Aplenguas”,
creator: “Générateur de Certificats”
});
// Ajouter le titre
doc.setFontSize(24);
doc.text(title, 150, 20, { align: ‘center’ });
// Ajouter un logo (image SVG convertie en base64)
doc.addImage(‘data:image/svg+xml;base64,’ + logoBase64, ‘SVG’, 20, 10, 40, 20);
// Ajouter les informations du certificat
doc.setFontSize(14);
doc.text(`Ce certificat atteste que ${userInfo.prenom} ${userInfo.nom}`, 150, 50, { align: ‘center’ });
doc.text(`a complété avec succès l’exercice sur le pronom Y en français`, 150, 60, { align: ‘center’ });
doc.text(`Score: ${document.getElementById(‘certificateScorePreview’).textContent} / 100`, 150, 70, { align: ‘center’ });
doc.text(`Niveau: ${document.getElementById(‘certificateLevelPreview’).textContent}`, 150, 80, { align: ‘center’ });
doc.text(`Date: ${document.getElementById(‘certificateDatePreview’).textContent}`, 150, 90, { align: ‘center’ });
// Ajouter une signature
doc.line(100, 120, 200, 120);
doc.text(“Signature du Professeur”, 150, 130, { align: ‘center’ });
// Ajouter un QR code (simplement un carré noir pour simuler)
doc.setFillColor(0, 0, 0);
doc.rect(240, 110, 20, 20, ‘F’);
// Sauvegarder le PDF
const filename = `certificat_pronom_y_${userInfo.nom.toLowerCase()}_${userInfo.prenom.toLowerCase()}.pdf`;
doc.save(filename);
} catch (error) {
console.error(“Erreur lors de la génération du PDF:”, error);
alert(“Une erreur s’est produite lors de la génération du PDF. Veuillez réessayer plus tard.”);
}
}
// Fonction pour générer des motifs triangulaires décoratifs pour le certificat
function generateTrianglePattern() {
const trianglePatterns = document.querySelectorAll(‘.triangle-pattern’);
trianglePatterns.forEach(pattern => {
let svgContent = ”;
// Différentes couleurs pour les triangles
const colors = [‘#3498db’, ‘#2980b9’, ‘#1abc9c’, ‘#16a085’, ‘#2c3e50’];
// Générer des triangles aléatoires
for (let i = 0; i < 15; i++) {
const x1 = Math.floor(Math.random() * 150);
const y1 = Math.floor(Math.random() * 120);
const x2 = x1 + Math.floor(Math.random() * 30) – 15;
const x3 = x1 + Math.floor(Math.random() * 30) – 15;
const y2 = y1 + Math.floor(Math.random() * 30) – 15;
const y3 = y1 + Math.floor(Math.random() * 30) – 15;
const color = colors[Math.floor(Math.random() * colors.length)];
const opacity = Math.random() * 0.5 + 0.2; // Entre 0.2 et 0.7
svgContent += “;
}
svgContent += ”;
pattern.innerHTML = svgContent;
});
}
// Appeler la fonction de génération des motifs triangulaires
generateTrianglePattern();
});