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);
max-width: 100%;
margin: 0 auto;
}
.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;
}
.feminin-input {
width: 150px;
padding: 5px;
border: 1px solid #ddd;
border-radius: 4px;
margin: 0 5px;
font-size: 16px;
}
.feminin-input.correct {
background-color: #d4edda;
border-color: #c3e6cb;
}
.feminin-input.incorrect {
background-color: #f8d7da;
border-color: #f5c6cb;
}
.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: 100%;
background-color: #fff;
border: 10px solid transparent;
border-image: linear-gradient(45deg, #3498db, #2980b9, #1abc9c, #16a085, #27ae60) 1;
box-sizing: border-box;
overflow: hidden;
margin-bottom: 20px;
}
.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;
background-color: #3498db;
border-radius: 5px;
}
.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;
background-color: #f9f9f9;
border: 1px solid #ddd;
}
.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;
}
.info-tooltip {
display: inline-block;
position: relative;
margin-left: 5px;
cursor: help;
}
.info-tooltip:after {
content: “?”;
display: inline-block;
width: 18px;
height: 18px;
line-height: 18px;
text-align: center;
border-radius: 50%;
background-color: #3498db;
color: white;
font-weight: bold;
font-size: 14px;
}
.info-tooltip .tooltip-text {
visibility: hidden;
width: 250px;
background-color: #2c3e50;
color: #fff;
text-align: center;
border-radius: 6px;
padding: 5px;
position: absolute;
z-index: 1;
bottom: 125%;
left: 50%;
margin-left: -125px;
opacity: 0;
transition: opacity 0.3s;
}
.info-tooltip:hover .tooltip-text {
visibility: visible;
opacity: 1;
}
.loading {
display: none;
margin-top: 15px;
font-style: italic;
color: #666;
}
.exercise-level {
margin-bottom: 20px;
}
Exercice de Grammaire: La Féminisation des Noms de Métiers et Fonctions en Français
Inscrivez-vous pour commencer l’exercice
Veuillez vous abonner et remplir vos informations pour accéder à l’exercice.
Convertissez les noms de métiers du masculin au féminin
Choisissez le niveau de difficulté:
Facile
Moyen
Difficile
Pour chaque nom de métier ou fonction au masculin, écrivez sa forme au féminin.
Du Masculin au Féminin (Niveau Facile)
1. un instituteur → une
2. un boulanger → une
3. un vendeur → une
4. un chanteur → une
5. un infirmier → une
6. un coiffeur → une
7. un acteur → une
8. un facteur → une
9. un directeur → une
10. un boucher → une
11. un pharmacien → une
12. un jardinier → une
13. un pâtissier → une
14. un cuisinier → une
15. un caissier → une
16. un musicien → une
17. un serveur → une
18. un danseur → une
19. un éducateur → une
20. un animateur → une
21. un employé → une
22. un fermier → une
23. un opticien → une
24. un secrétaire → une
25. un assistant → une
Du Masculin au Féminin (Niveau Moyen)
1. un auteur → une
2. un médecin → une
3. un gouverneur → une
4. un conseiller → une
5. un chercheur → une
6. un ambassadeur → une
7. un sculpteur → une
8. un inspecteur → une
9. un traducteur → une
10. un sénateur → une
11. un chroniqueur → une
12. un ingénieur → une
13. un professeur → une
14. un maire → une
15. un astronaute → une
16. un écrivain → une
17. un magistrat → une
18. un entraîneur → une
19. un conférencier → une
20. un analyste → une
21. un recteur → une
22. un avocat → une
23. un artisan → une
24. un psychiatre → une
25. un chef → une
Du Masculin au Féminin (Niveau Difficile)
1. un procureur → une
2. un successeur → une
3. un imposteur → une
4. un sapeur-pompier → une
5. un maître de conférences → une
6. un censeur → une
7. un mannequin → une
8. un marin → une
9. un clerc → une
10. un praticien → une
11. un chancelier → une
12. un doyen → une
13. un défenseur → une
14. un préfet → une
15. un gardien de la paix → une
16. un proviseur → une
17. un banquier → une
18. un officier → une
19. un greffier → une
20. un huissier → une
21. un témoin → une
22. un prédécesseur → une
23. un maître d’hôtel → une
24. un pasteur → une
25. un chef d’orchestre → une
Résultats
Certificat de réussite
Certificat d’Excellence
Maîtrise de la Féminisation des Métiers en Français
Ce certificat est décerné à
pour avoir complété avec succès l’exercice sur
la féminisation des noms de métiers en français au niveau
avec un score de
Date:
document.addEventListener(‘DOMContentLoaded’, function() {
// S’assurer que jsPDF est disponible
if (typeof window.jspdf === ‘undefined’) {
window.jspdf = window.jsPDF;
}
// Références aux éléments DOM
const subscriptionForm = document.getElementById(‘subscriptionForm’);
const exerciseContainer = document.getElementById(‘exerciseContainer’);
const startButton = document.getElementById(‘startButton’);
const verifyButton = document.getElementById(‘verifyButton’);
const difficultySelect = document.getElementById(‘difficultySelect’);
const changeDifficultyButton = document.getElementById(‘changeDifficultyButton’);
const resultContainer = document.getElementById(‘resultContainer’);
const resultText = document.getElementById(‘resultText’);
const mistakesContainer = document.getElementById(‘mistakesContainer’);
const showCertificateButton = document.getElementById(‘showCertificateButton’);
const certificateContainer = document.getElementById(‘certificateContainer’);
const downloadCertificateButton = document.getElementById(‘downloadCertificateButton’);
const pdfLoading = document.getElementById(‘pdfLoading’);
// Informations de l’utilisateur
let userData = {
prenom: ”,
nom: ”,
email: ”,
difficulty: ‘facile’,
score: 0
};
// Fonction pour afficher l’exercice selon le niveau de difficulté
function showExerciseByDifficulty(difficulty) {
// Masquer tous les exercices
document.querySelectorAll(‘.exercise-level’).forEach(el => {
el.style.display = ‘none’;
});
// Afficher l’exercice correspondant à la difficulté
const exerciseId = ‘exercise’ + difficulty.charAt(0).toUpperCase() + difficulty.slice(1);
document.getElementById(exerciseId).style.display = ‘block’;
userData.difficulty = difficulty;
}
// Démarrer l’exercice
startButton.addEventListener(‘click’, function() {
// Valider le formulaire
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 = ”;
// Valider les champs
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 (!validateEmail(email)) {
document.getElementById(‘emailError’).textContent = ‘Veuillez entrer un email valide’;
isValid = false;
}
if (!subscribe) {
document.getElementById(‘subscribeError’).textContent = ‘Veuillez cocher cette case pour continuer’;
isValid = false;
}
if (isValid) {
// Enregistrer les données utilisateur
userData.prenom = prenom;
userData.nom = nom;
userData.email = email;
// Masquer le formulaire et afficher l’exercice
subscriptionForm.style.display = ‘none’;
exerciseContainer.style.display = ‘block’;
// Afficher l’exercice selon la difficulté par défaut
showExerciseByDifficulty(userData.difficulty);
}
});
// Fonction pour valider l’email
function validateEmail(email) {
const re = /^[^s@]+@[^s@]+.[^s@]+$/;
return re.test(email);
}
// Changer le niveau de difficulté
changeDifficultyButton.addEventListener(‘click’, function() {
const difficulty = difficultySelect.value;
showExerciseByDifficulty(difficulty);
// Réinitialiser les résultats et les champs d’entrée
resultContainer.style.display = ‘none’;
certificateContainer.style.display = ‘none’;
document.querySelectorAll(‘.feminin-input’).forEach(input => {
input.value = ”;
input.classList.remove(‘correct’, ‘incorrect’);
});
});
// Vérifier les réponses
verifyButton.addEventListener(‘click’, function() {
let correctAnswers = 0;
const totalQuestions = 25;
const mistakes = [];
const exerciseId = ‘exercise’ + userData.difficulty.charAt(0).toUpperCase() + userData.difficulty.slice(1);
const inputs = document.querySelectorAll(`#${exerciseId} .feminin-input`);
inputs.forEach(input => {
const userAnswer = input.value.trim().toLowerCase();
const correctAnswer = input.dataset.answer.toLowerCase();
const questionNumber = input.dataset.number;
if (userAnswer === correctAnswer) {
input.classList.add(‘correct’);
input.classList.remove(‘incorrect’);
correctAnswers++;
} else {
input.classList.add(‘incorrect’);
input.classList.remove(‘correct’);
mistakes.push({
number: questionNumber,
userAnswer: userAnswer,
correctAnswer: correctAnswer
});
}
});
// Calculer le score
userData.score = Math.round((correctAnswers / totalQuestions) * 100);
// Afficher les résultats
resultContainer.style.display = ‘block’;
if (userData.score === 100) {
resultText.innerHTML = `
Félicitations! Vous avez obtenu un score parfait de ${userData.score}% (${correctAnswers}/${totalQuestions}).
Vous maîtrisez parfaitement la féminisation des noms de métiers en français au niveau ${userData.difficulty}!
`;
showCertificateButton.style.display = ‘block’;
} else if (userData.score >= 80) {
resultText.innerHTML = `
Excellent travail! Vous avez obtenu un score de ${userData.score}% (${correctAnswers}/${totalQuestions}).
Vous avez une très bonne maîtrise de la féminisation des noms de métiers en français au niveau ${userData.difficulty}.
`;
showCertificateButton.style.display = ‘block’;
} else if (userData.score >= 60) {
resultText.innerHTML = `
Bon travail! Vous avez obtenu un score de ${userData.score}% (${correctAnswers}/${totalQuestions}).
Vous avez une assez bonne compréhension de la féminisation des noms de métiers en français au niveau ${userData.difficulty}.
`;
showCertificateButton.style.display = ‘none’;
} else {
resultText.innerHTML = `
Vous avez obtenu un score de ${userData.score}% (${correctAnswers}/${totalQuestions}).
Continuez à pratiquer pour améliorer votre compréhension de la féminisation des noms de métiers en français.
`;
showCertificateButton.style.display = ‘none’;
}
// Afficher les erreurs
mistakesContainer.innerHTML = ”;
if (mistakes.length > 0) {
mistakesContainer.innerHTML += ‘
Erreurs à corriger:
- ‘;
- Question ${mistake.number}: ${masculine} → “${mistake.userAnswer}” (Réponse correcte: “${mistake.correctAnswer}”)
mistakes.forEach(mistake => {
const questionEl = document.querySelector(`#${exerciseId} .feminin-input[data-number=”${mistake.number}”]`);
const masculine = questionEl.previousElementSibling.previousElementSibling.textContent;
mistakesContainer.innerHTML += `
`;
});
mistakesContainer.innerHTML += ‘
‘;
}
});
// Afficher le certificat
showCertificateButton.addEventListener(‘click’, function() {
certificateContainer.style.display = ‘block’;
// Remplir les informations du certificat
document.getElementById(‘certificateName’).textContent = userData.prenom + ‘ ‘ + userData.nom;
document.getElementById(‘certificateLevel’).textContent = userData.difficulty;
document.getElementById(‘certificateScore’).textContent = userData.score + ‘%’;
const today = new Date();
const dateOptions = { year: ‘numeric’, month: ‘long’, day: ‘numeric’ };
document.getElementById(‘certificateDate’).textContent = today.toLocaleDateString(‘fr-FR’, dateOptions);
// Générer le QR Code
generateQRCode();
// Générer un motif unique pour l’arrière-plan du certificat
generateCertificateBackground();
});
// Télécharger le certificat
downloadCertificateButton.addEventListener(‘click’, function() {
pdfLoading.style.display = ‘block’;
setTimeout(function() {
const certificateElement = document.getElementById(‘certificatePreview’);
html2canvas(certificateElement, {
scale: 2,
logging: false,
useCORS: true
}).then(canvas => {
const imgData = canvas.toDataURL(‘image/png’);
const pdf = new jspdf.jsPDF({
orientation: ‘landscape’,
unit: ‘mm’
});
const imgProps = pdf.getImageProperties(imgData);
const pdfWidth = pdf.internal.pageSize.getWidth();
const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width;
pdf.addImage(imgData, ‘PNG’, 0, 0, pdfWidth, pdfHeight);
pdf.save(`certificat_francais_${userData.prenom}_${userData.nom}.pdf`);
pdfLoading.style.display = ‘none’;
});
}, 500);
});
// Générer un QR Code pour le certificat
function generateQRCode() {
const qrContainer = document.querySelector(‘.certificate-qr’);
qrContainer.innerHTML = ”;
// Utiliser qrcode-generator
const qr = qrcode(0, ‘M’);
const data = `Certificat de réussite en Féminisation des MétiersnNom: ${userData.prenom} ${userData.nom}nDate: ${new Date().toLocaleDateString(‘fr-FR’)}nScore: ${userData.score}%nNiveau: ${userData.difficulty}`;
qr.addData(data);
qr.make();
const qrImg = qr.createImgTag(4);
qrContainer.innerHTML = qrImg;
}
// Générer un motif d’arrière-plan pour le certificat
function generateCertificateBackground() {
const background = document.querySelector(‘.certificate-background’);
background.style.backgroundImage = “url(‘/api/placeholder/800/600’)”;
// Générer des triangles décoratifs
const triangleTopRight = document.querySelector(‘.triangle-pattern.top-right’);
triangleTopRight.style.background = “linear-gradient(45deg, #3498db, #2980b9)”;
triangleTopRight.style.clipPath = “polygon(100% 0, 0 0, 100% 100%)”;
const triangleBottomLeft = document.querySelector(‘.triangle-pattern.bottom-left’);
triangleBottomLeft.style.background = “linear-gradient(45deg, #1abc9c, #16a085)”;
triangleBottomLeft.style.clipPath = “polygon(0 0, 0 100%, 100% 100%)”;
}
});