diff --git a/lang/en/auth.php b/lang/en/auth.php
index 989bff4..126adc7 100644
--- a/lang/en/auth.php
+++ b/lang/en/auth.php
@@ -12,5 +12,53 @@
'remember' => 'Remember me',
'submit' => 'Sign in',
],
+ 'forgot_password' => [
+ 'title' => 'Forgot password',
+ 'description' => 'Enter your email to receive a password reset link',
+ 'email' => 'Email address',
+ 'email_placeholder' => 'email@example.com',
+ 'submit' => 'Email password reset link',
+ 'return_prefix' => 'Or, return to',
+ 'login_link' => 'log in',
+ ],
+ 'two_factor' => [
+ 'head' => 'Two-Factor Authentication',
+ 'auth_title' => 'Authentication Code',
+ 'auth_description' => 'Enter the authentication code provided by your authenticator application.',
+ 'auth_toggle' => 'login using a recovery code',
+ 'recovery_title' => 'Recovery Code',
+ 'recovery_description' => 'Please confirm access to your account by entering one of your emergency recovery codes.',
+ 'recovery_toggle' => 'login using an authentication code',
+ 'recovery_placeholder' => 'Enter recovery code',
+ 'continue' => 'Continue',
+ 'or_you_can' => 'or you can',
+ ],
+ 'verify_email' => [
+ 'title' => 'Verify email',
+ 'description' => 'Please verify your email address by clicking on the link we just emailed to you.',
+ 'head' => 'Email verification',
+ 'link_sent' => 'A new verification link has been sent to the email address you provided during registration.',
+ 'resend' => 'Resend verification email',
+ 'logout' => 'Log out',
+ ],
+ 'confirm_password' => [
+ 'title' => 'Confirm your password',
+ 'description' => 'This is a secure area of the application. Please confirm your password before continuing.',
+ 'head' => 'Confirm password',
+ 'password' => 'Password',
+ 'password_placeholder' => 'Password',
+ 'submit' => 'Confirm password',
+ ],
+ 'reset_password' => [
+ 'title' => 'Reset password',
+ 'description' => 'Please enter your new password below',
+ 'head' => 'Reset password',
+ 'email' => 'Email',
+ 'password' => 'Password',
+ 'password_placeholder' => 'Password',
+ 'confirm' => 'Confirm password',
+ 'confirm_placeholder' => 'Confirm password',
+ 'submit' => 'Reset password',
+ ],
'logout' => 'Log out',
];
diff --git a/lang/en/timetable.php b/lang/en/timetable.php
new file mode 100644
index 0000000..7b7a64c
--- /dev/null
+++ b/lang/en/timetable.php
@@ -0,0 +1,36 @@
+ 'Timetable',
+ 'title' => 'Timetable',
+ 'subtitle' => 'Organize class slots per class for the active year.',
+ 'teacher_view' => 'Teacher view',
+ 'choose_class' => 'Choose a class',
+ 'export_pdf' => 'Export to PDF',
+ 'select_class_prompt' => 'Select a class to display its timetable.',
+ 'add_slot' => 'Add a slot',
+ 'subject_fallback' => 'Subject',
+ 'edit_slot' => 'Edit slot',
+ 'new_slot' => 'New slot',
+ 'day' => 'Day',
+ 'start' => 'Start',
+ 'end' => 'End',
+ 'subject' => 'Subject',
+ 'choose' => 'Choose',
+ 'teacher' => 'Teacher',
+ 'room' => 'Room',
+ 'room_ph' => 'e.g. Room 12',
+ 'cancel' => 'Cancel',
+ 'update' => 'Update',
+ 'add' => 'Add',
+
+ 'head_teacher' => 'Timetable — by teacher',
+ 'subtitle_teacher' => 'A teacher\'s schedule for the active year, across all classes.',
+ 'choose_teacher' => 'Choose a teacher',
+ 'select_teacher_prompt' => 'Select a teacher to display their timetable.',
+ 'no_slots_teacher' => 'No slots for this teacher in the active year.',
+ 'slot_one' => 'slot',
+ 'slot_other' => 'slots',
+ 'class_one' => 'class',
+ 'class_other' => 'classes',
+];
diff --git a/lang/fr/auth.php b/lang/fr/auth.php
index 284f3e5..d9e1c51 100644
--- a/lang/fr/auth.php
+++ b/lang/fr/auth.php
@@ -12,5 +12,53 @@
'remember' => 'Se souvenir de moi',
'submit' => 'Se connecter',
],
+ 'forgot_password' => [
+ 'title' => 'Mot de passe oublié',
+ 'description' => 'Saisissez votre e-mail pour recevoir un lien de réinitialisation',
+ 'email' => 'Adresse e-mail',
+ 'email_placeholder' => 'email@exemple.com',
+ 'submit' => 'Envoyer le lien de réinitialisation',
+ 'return_prefix' => 'Ou revenez à la',
+ 'login_link' => 'connexion',
+ ],
+ 'two_factor' => [
+ 'head' => 'Authentification à deux facteurs',
+ 'auth_title' => 'Code d\'authentification',
+ 'auth_description' => 'Saisissez le code d\'authentification fourni par votre application d\'authentification.',
+ 'auth_toggle' => 'se connecter avec un code de récupération',
+ 'recovery_title' => 'Code de récupération',
+ 'recovery_description' => 'Confirmez l\'accès à votre compte en saisissant l\'un de vos codes de récupération d\'urgence.',
+ 'recovery_toggle' => 'se connecter avec un code d\'authentification',
+ 'recovery_placeholder' => 'Saisir le code de récupération',
+ 'continue' => 'Continuer',
+ 'or_you_can' => 'ou vous pouvez',
+ ],
+ 'verify_email' => [
+ 'title' => 'Vérifier l\'e-mail',
+ 'description' => 'Veuillez vérifier votre adresse e-mail en cliquant sur le lien que nous venons de vous envoyer.',
+ 'head' => 'Vérification de l\'e-mail',
+ 'link_sent' => 'Un nouveau lien de vérification a été envoyé à l\'adresse e-mail que vous avez fournie lors de l\'inscription.',
+ 'resend' => 'Renvoyer l\'e-mail de vérification',
+ 'logout' => 'Déconnexion',
+ ],
+ 'confirm_password' => [
+ 'title' => 'Confirmez votre mot de passe',
+ 'description' => 'Ceci est une zone sécurisée de l\'application. Veuillez confirmer votre mot de passe avant de continuer.',
+ 'head' => 'Confirmer le mot de passe',
+ 'password' => 'Mot de passe',
+ 'password_placeholder' => 'Mot de passe',
+ 'submit' => 'Confirmer le mot de passe',
+ ],
+ 'reset_password' => [
+ 'title' => 'Réinitialiser le mot de passe',
+ 'description' => 'Veuillez saisir votre nouveau mot de passe ci-dessous',
+ 'head' => 'Réinitialiser le mot de passe',
+ 'email' => 'E-mail',
+ 'password' => 'Mot de passe',
+ 'password_placeholder' => 'Mot de passe',
+ 'confirm' => 'Confirmer le mot de passe',
+ 'confirm_placeholder' => 'Confirmer le mot de passe',
+ 'submit' => 'Réinitialiser le mot de passe',
+ ],
'logout' => 'Déconnexion',
];
diff --git a/lang/fr/timetable.php b/lang/fr/timetable.php
new file mode 100644
index 0000000..55bf260
--- /dev/null
+++ b/lang/fr/timetable.php
@@ -0,0 +1,36 @@
+ 'Emploi du temps',
+ 'title' => 'Emploi du temps',
+ 'subtitle' => 'Organisez les créneaux de cours par classe pour l\'année active.',
+ 'teacher_view' => 'Vue par enseignant',
+ 'choose_class' => 'Choisir une classe',
+ 'export_pdf' => 'Exporter en PDF',
+ 'select_class_prompt' => 'Sélectionnez une classe pour afficher son emploi du temps.',
+ 'add_slot' => 'Ajouter un créneau',
+ 'subject_fallback' => 'Matière',
+ 'edit_slot' => 'Modifier le créneau',
+ 'new_slot' => 'Nouveau créneau',
+ 'day' => 'Jour',
+ 'start' => 'Début',
+ 'end' => 'Fin',
+ 'subject' => 'Matière',
+ 'choose' => 'Choisir',
+ 'teacher' => 'Enseignant',
+ 'room' => 'Salle',
+ 'room_ph' => 'Ex : Salle 12',
+ 'cancel' => 'Annuler',
+ 'update' => 'Mettre à jour',
+ 'add' => 'Ajouter',
+
+ 'head_teacher' => 'Emploi du temps — par enseignant',
+ 'subtitle_teacher' => 'Programmation d\'un enseignant pour l\'année active, toutes classes confondues.',
+ 'choose_teacher' => 'Choisir un enseignant',
+ 'select_teacher_prompt' => 'Sélectionnez un enseignant pour afficher son emploi du temps.',
+ 'no_slots_teacher' => 'Aucun créneau pour cet enseignant sur l\'année active.',
+ 'slot_one' => 'créneau',
+ 'slot_other' => 'créneaux',
+ 'class_one' => 'classe',
+ 'class_other' => 'classes',
+];
diff --git a/resources/js/pages/Eleves/Timetable/Index.tsx b/resources/js/pages/Eleves/Timetable/Index.tsx
index 3c134f1..ace6803 100644
--- a/resources/js/pages/Eleves/Timetable/Index.tsx
+++ b/resources/js/pages/Eleves/Timetable/Index.tsx
@@ -6,6 +6,7 @@ import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/u
import { Input } from '@/components/ui/input';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
import { route } from '@/helpers/route';
+import { useTranslation } from '@/helpers/i18n';
import AppLayout from '@/layouts/app-layout';
interface Option { id: string; name: string; code?: string; }
@@ -43,6 +44,7 @@ const emptyForm = {
};
export default function Index({ classrooms, subjects, teachers, slots, days, filters, canManage }: Readonly
Organisez les créneaux de cours par classe pour l'année active.
+{t('timetable.subtitle')}
{slot.subject_name ?? 'Matière'}
+{slot.subject_name ?? t('timetable.subject_fallback')}
{slot.teacher_name &&