Round 23: Report Card Generator, Seating Chart, School Library, Parent Portal Enhancement

- Report Card Generator: Professional report cards with PDF export
  - Subject grades table with competency levels
  - Competency radar chart, teacher comments
  - Template management, batch generation
  - Status workflow: draft → review → published → archived

- Seating Chart View: Visual classroom layout
  - Grid-based classroom with desk positions
  - Multiple layout templates (rows, groups, U-shape, circle)
  - Click-to-assign student placement
  - Randomize and smart arrange features
  - Student info popover

- School Library View: Book lending system
  - Book catalog with search and filter
  - Checkout system with due dates and renewals
  - Overdue tracking with notifications
  - Reservation queue system
  - Statistics dashboard with charts

- Enhanced Parent Portal: Comprehensive dashboard
  - Child overview with multiple children selector
  - Academic progress with competency radar chart
  - Attendance & illness with approval
  - Communication, schedule, and reports tabs

- Bug fixes: i18n breadcrumb keys for new views
- Styling: Gradient headers, animations, hover effects across all new views
- 200+ i18n keys added, 15+ API routes, 3+ Prisma models
This commit is contained in:
Mustafa Cetin committed 2026-07-29 23:42:26 +00:00
1 parent 490bd0650f
commit 6e5af13778
28 files changed
+10252 -494

No files matched your search

+694
View File
@@ -4614,6 +4614,72 @@ const de: TranslationDict = {
'parent_portal.days_present': 'Tage anwesend',
'parent_portal.attendance_rate': 'Anwesenheitsrate',
'parent_portal.all_children': 'Alle Kinder',
'parent_portal.academic_progress': 'Akademischer Fortschritt',
'parent_portal.attendance_illness': 'Anwesenheit & Krankheit',
'parent_portal.communication': 'Kommunikation',
'parent_portal.schedule': 'Stundenplan',
'parent_portal.reports_docs': 'Berichte & Dokumente',
'parent_portal.subject_grades': 'Faecher & Noten',
'parent_portal.class_average': 'Klassendurchschnitt',
'parent_portal.trend_up': 'Steigend',
'parent_portal.trend_down': 'Fallend',
'parent_portal.trend_stable': 'Stabil',
'parent_portal.competency_radar': 'Kompetenzradar',
'parent_portal.grade_history': 'Notenverlauf',
'parent_portal.assessment_results': 'Leistungskontrollergebnisse',
'parent_portal.attendance_rate_circular': 'Anwesenheitsrate',
'parent_portal.illness_history': 'Krankheitsverlauf',
'parent_portal.upload_certificate': 'Attest hochladen',
'parent_portal.messages_teachers': 'Nachrichten von Lehrern',
'parent_portal.conversation_rooms': 'Gespraechesraeume',
'parent_portal.school_announcements': 'Schulankuendigungen',
'parent_portal.weekly_timetable': 'Wochenstundenplan',
'parent_portal.exam_dates': 'Pruefungstermine',
'parent_portal.counseling_appointments_short': 'Beratungstermine',
'parent_portal.school_events': 'Schulveranstaltungen',
'parent_portal.homework_due': 'Hausaufgaben faellig',
'parent_portal.report_cards': 'Zeugnisse',
'parent_portal.portfolio_highlights': 'Portfolio-Highlights',
'parent_portal.request_meeting': 'Elterngespraech anfragen',
'parent_portal.reserve_book': 'Buch reservieren',
'parent_portal.view_announcements': 'Ankuendigungen anzeigen',
'parent_portal.child_dashboard': 'Dashboard',
'parent_portal.quick_stats': 'Schnellstatistiken',
'parent_portal.upcoming_deadlines': 'Anstehende Termine',
'parent_portal.recent_activity': 'Letzte Aktivitaet',
'parent_portal.no_announcements': 'Keine Ankuendigungen',
'parent_portal.no_messages': 'Keine Nachrichten',
'parent_portal.no_schedule': 'Kein Stundenplan verfuegbar',
'parent_portal.no_homework': 'Keine Hausaufgaben',
'parent_portal.no_events': 'Keine Veranstaltungen',
'parent_portal.no_portfolio': 'Keine Portfolio-Eintraege',
'parent_portal.no_assessments': 'Keine Leistungskontrollen',
'parent_portal.monday': 'Montag',
'parent_portal.tuesday': 'Dienstag',
'parent_portal.wednesday': 'Mittwoch',
'parent_portal.thursday': 'Donnerstag',
'parent_portal.friday': 'Freitag',
'parent_portal.period': 'Stunde',
'parent_portal.break': 'Pause',
'parent_portal.score': 'Punkte',
'parent_portal.feedback': 'Feedback',
'parent_portal.overall_average': 'Gesamtdurchschnitt',
'parent_portal.subjects_count': 'Faecher',
'parent_portal.latest_grade': 'Aktuellste Note',
'parent_portal.days_excused': 'Tage entschuldigt',
'parent_portal.days_late': 'Tage verspaetet',
'parent_portal.unread_messages': 'Ungelesene Nachrichten',
'parent_portal.active_conversations': 'Aktive Gespraeche',
'parent_portal.pinned': 'Angeheftet',
'parent_portal.urgent': 'Dringend',
'parent_portal.from': 'Von',
'parent_portal.due': 'Faellig',
'parent_portal.view': 'Ansehen',
'parent_portal.download': 'Herunterladen',
'parent_portal.grade_trend': 'Notentrend',
'parent_portal.comparison': 'Vergleich',
'parent_portal.student': 'Schueler/in',
'parent_portal.class': 'Klasse',
// ─── Content Crawl ──────────────────────────────────────────────────
'subjects.crawl': 'Inhalte crawlen',
@@ -5290,6 +5356,287 @@ const de: TranslationDict = {
'achievements.to_next_level': 'bis zur naechsten Stufe',
'achievements.time_remaining': 'Verbleibende Zeit',
'achievements.days': 'Tage',
// Seating Chart
'nav.seating_chart': 'Sitzplan',
'seating.title': 'Sitzplan',
'seating.subtitle': 'Sitzplaene erstellen und bearbeiten',
'seating.select_class': 'Klasse auswählen',
'seating.select_chart': 'Sitzplan auswählen',
'seating.new_chart': 'Neuer Sitzplan',
'seating.default': 'Standard',
'seating.no_chart_title': 'Kein Sitzplan vorhanden',
'seating.no_chart_subtitle': 'Erstellen Sie einen Sitzplan, um die Schülerplätze zu verwalten.',
'seating.create_chart_title': 'Neuen Sitzplan erstellen',
'seating.create_chart_desc': 'Erstellen Sie einen neuen Sitzplan für diese Klasse.',
'seating.chart_name': 'Name des Sitzplans',
'seating.chart_name_placeholder': 'z.B. Sitzplan Q1',
'seating.chart_created': 'Sitzplan erstellt',
'seating.chart_deleted': 'Sitzplan gelöscht',
'seating.delete_chart_title': 'Sitzplan löschen',
'seating.delete_chart_desc': 'Möchten Sie diesen Sitzplan wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.',
'seating.unassigned_students': 'Nicht zugewiesene Schüler',
'seating.all_students_assigned': 'Alle Schüler sind zugewiesen.',
'seating.assign_all': 'Alle zuweisen',
'seating.randomize': 'Zufällig mischen',
'seating.smart_arrange': 'Intelligent anordnen',
'seating.clear_all': 'Alle entfernen',
'seating.arrangement_saved': 'Sitzplan gespeichert',
'seating.arrangement_updated': 'Sitzplan aktualisiert',
'seating.teacher_desk': 'Lehrertisch',
'seating.door': 'Tür',
'seating.rows': 'Zeilen',
'seating.columns': 'Spalten',
'seating.layout_type': 'Layout-Typ',
'seating.layout_rows': 'Reihen',
'seating.layout_groups': 'Gruppen',
'seating.layout_ushape': 'U-Form',
'seating.layout_circle': 'Kreis',
'seating.layout_custom': 'Frei',
'seating.settings': 'Einstellungen',
'seating.show_door': 'Tür anzeigen',
'seating.show_windows': 'Fenster anzeigen',
'seating.door_position': 'Türposition',
'seating.window_position': 'Fensterposition',
'seating.pos_left': 'Links',
'seating.pos_right': 'Rechts',
'seating.pos_back': 'Hinten',
'seating.pos_both': 'Beide Seiten',
'seating.assigned_count': '{assigned} von {total} zugewiesen',
'seating.seat_position': 'Reihe {row}, Platz {col}',
'seating.view_profile': 'Profil anzeigen',
'seating.behavior_note': 'Verhaltenshinweis',
'seating.legend_assigned': 'Zugewiesen',
'seating.legend_empty': 'Leer',
'seating.legend_behavior': 'Verhaltenshinweis',
// School Library (DE)
'library.title': 'Schulbibliothek',
'library.subtitle': 'Buecherkatalog, Ausleihe und Reservierung',
'library.loading': 'Wird geladen...',
'library.add_book': 'Buch hinzufuegen',
'library.add_book_desc': 'Neues Buch zur Bibliothek hinzufuegen',
'library.book_added': 'Buch erfolgreich hinzugefuegt',
'library.error_adding_book': 'Fehler beim Hinzufuegen des Buches',
'library.catalog': 'Katalog',
'library.checkouts': 'Ausleihen',
'library.overdue_tab': 'Ueberfaellig',
'library.reservations': 'Reservierungen',
'library.statistics': 'Statistiken',
'library.search_placeholder': 'Titel, Autor, ISBN oder Kategorie suchen...',
'library.category': 'Kategorie',
'library.availability': 'Verfuegbarkeit',
'library.reading_level': 'Lesestufe',
'library.all_categories': 'Alle Kategorien',
'library.all': 'Alle',
'library.available': 'Verfuegbar',
'library.checked_out': 'Ausgeliehen',
'library.unavailable': 'Nicht verfuegbar',
'library.all_levels': 'Alle Stufen',
'library.level_elementary': 'Grundschule',
'library.level_middle': 'Mittelstufe',
'library.level_high': 'Oberstufe',
'library.level_advanced': 'Fortgeschritten',
'library.copies_available': 'Exemplare verfuegbar',
'library.no_books': 'Keine Buecher gefunden',
'library.add_first_book': 'Erstes Buch hinzufuegen',
'library.checkout': 'Ausleihen',
'library.reserve': 'Reservieren',
'library.active_checkouts': 'Aktive Ausleihen',
'library.new_checkout': 'Neue Ausleihe',
'library.no_active_checkouts': 'Keine aktiven Ausleihen',
'library.return_history': 'Rueckgabeverlauf',
'library.overdue_books': 'Ueberfaellige Buecher',
'library.no_overdue': 'Keine ueberfaelligen Buecher!',
'library.days_overdue': 'Tage ueberfaellig',
'library.fine_estimate': 'Geschaetzte Gebuehr',
'library.return': 'Zurueckgeben',
'library.renew': 'Verlaengern',
'library.renewed': 'verlaengert',
'library.renewal_success': 'Ausleihe erfolgreich verlaengert',
'library.error_renewal': 'Fehler bei der Verlaengerung',
'library.checkout_success': 'Buch erfolgreich ausgeliehen',
'library.error_checkout': 'Fehler bei der Ausleihe',
'library.return_success': 'Buch erfolgreich zurueckgegeben',
'library.error_return': 'Fehler bei der Rueckgabe',
'library.reservation_success': 'Buch erfolgreich reserviert',
'library.error_reservation': 'Fehler bei der Reservierung',
'library.reservation_cancelled': 'Reservierung storniert',
'library.error_cancel_reservation': 'Fehler beim Stornieren',
'library.no_student_selected': 'Kein Schueler ausgewaehlt',
'library.no_reservations': 'Keine Reservierungen',
'library.available_now': 'Jetzt verfuegbar',
'library.queue_position': 'Warteposition',
'library.reserved_on': 'Reserviert am',
'library.cancel': 'Stornieren',
'library.total_books': 'Buecher gesamt',
'library.total_copies': 'Exemplare gesamt',
'library.available_copies': 'Verfuegbar',
'library.checked_out_count': 'Ausgeliehen',
'library.overdue': 'Ueberfaellig',
'library.overdue_rate': 'Ueberfaellig-Quote',
'library.popular_books': 'Beliebte Buecher',
'library.category_distribution': 'Kategorieverteilung',
'library.checkout_trends': 'Ausleihtrends',
'library.no_data': 'Keine Daten verfuegbar',
'library.book_title': 'Titel',
'library.author': 'Autor',
'library.isbn': 'ISBN',
'library.publisher': 'Verlag',
'library.publish_year': 'Erscheinungsjahr',
'library.total_copies_field': 'Anzahl Exemplare',
'library.location': 'Standort',
'library.description': 'Beschreibung',
'library.student': 'Schueler',
'library.due_date': 'Faelligkeitsdatum',
'library.checkout_date': 'Ausleihdatum',
'library.condition': 'Zustand',
'library.condition_excellent': 'Sehr gut',
'library.condition_good': 'Gut',
'library.condition_fair': 'Befriedigend',
'library.condition_poor': 'Schlecht',
'library.notes': 'Notizen',
'library.notes_placeholder': 'Optionale Notizen...',
'library.checkout_book': 'Buch ausleihen',
'library.checkout_desc': 'Buch fuer einen Schueler ausleihen',
'library.select_book': 'Buch auswaehlen',
'library.select_student': 'Schueler auswaehlen',
'library.default_14_days': 'Standard: 14 Tage ab heute',
'library.return_book': 'Buch zurueckgeben',
'library.return_condition': 'Rueckgabezustand',
'library.fine_amount': 'Gebuehrenbetrag',
'library.overdue_fine_note': 'Dieses Buch ist ueberfaellig. Bitte Gebuehr pruefen.',
'library.checkout_receipt': 'Ausleihbeleg',
'library.confirm_delete_book': 'Buch wirklich loeschen?',
'library.book_deleted': 'Buch geloescht',
'library.error_delete_book': 'Fehler beim Loeschen',
'library.currently_checked_out': 'Aktuell ausgeliehen',
'library.reservation_queue': 'Reservierungswarteschlange',
'nav.school_library': 'Bibliothek',
'nav.school-library': 'Bibliothek',
'nav.seating_chart': 'Sitzplan',
'nav.seating-chart': 'Sitzplan',
// Report Card
'nav.report_cards': 'Zeugnisse',
'nav.report-cards': 'Zeugnisse',
'report_card.title': 'Zeugnisgenerator',
'report_card.subtitle': 'Zeugnisse erstellen, bearbeiten und verwalten',
'report_card.total_reports': 'Zeugnisse gesamt',
'report_card.drafts': 'Entwürfe',
'report_card.in_review': 'In Prüfung',
'report_card.published': 'Veröffentlicht',
'report_card.search_placeholder': 'Zeugnisse suchen...',
'report_card.filter_class': 'Klasse',
'report_card.filter_status': 'Status',
'report_card.filter_period': 'Zeitraum',
'report_card.all_classes': 'Alle Klassen',
'report_card.all_statuses': 'Alle Status',
'report_card.all_periods': 'Alle Zeiträume',
'report_card.create': 'Zeugnis erstellen',
'report_card.batch_generate': 'Klassensatz erstellen',
'report_card.manage_templates': 'Vorlagen verwalten',
'report_card.selected': 'ausgewählt',
'report_card.publish': 'Veröffentlichen',
'report_card.archive': 'Archivieren',
'report_card.no_reports': 'Keine Zeugnisse gefunden',
'report_card.create_first': 'Erstes Zeugnis erstellen',
'report_card.more': 'mehr',
'report_card.with_grades': 'Mit Noten',
'report_card.status_draft': 'Entwurf',
'report_card.status_review': 'In Prüfung',
'report_card.status_published': 'Veröffentlicht',
'report_card.status_archived': 'Archiviert',
'report_card.status_final': 'Final',
'report_card.submit_review': 'Zur Prüfung einreichen',
'report_card.finalize': 'Finalisieren',
'report_card.export_pdf': 'PDF exportieren',
'report_card.edit_title': 'Zeugnis bearbeiten',
'report_card.student_info': 'Schülerinformationen',
'report_card.student_name': 'Name',
'report_card.class_name': 'Klasse',
'report_card.school_year': 'Schuljahr',
'report_card.period': 'Zeitraum',
'report_card.date': 'Datum',
'report_card.subject_grades': 'Fachnoten',
'report_card.subject': 'Fach',
'report_card.grade': 'Note',
'report_card.label': 'Bewertung',
'report_card.status_col': 'Status',
'report_card.evaluation': 'Bewertung',
'report_card.competency_sections': 'Kompetenzbereiche',
'report_card.section': 'Bereich',
'report_card.no_sections': 'Keine Kompetenzbereiche vorhanden',
'report_card.teacher_comments': 'Lehrerbemerkungen',
'report_card.comments_placeholder': 'Bemerkungen zum Schüler eingeben...',
'report_card.overall_assessment': 'Gesamtbewertung',
'report_card.assessment_placeholder': 'Gesamtbewertung eingeben...',
'report_card.competency_radar': 'Kompetenzradar',
'report_card.competency_level': 'Kompetenzstufe',
'report_card.attendance_summary': 'Anwesenheit',
'report_card.present': 'Anwesend',
'report_card.absent': 'Fehlend',
'report_card.excused': 'Entschuldigt',
'report_card.late': 'Verspätet',
'report_card.actions': 'Aktionen',
'report_card.preview_title': 'Zeugnisvorschau',
'report_card.report_card_title': 'Zeugnis',
'report_card.competency_overview': 'Kompetenzübersicht',
'report_card.competency_details': 'Kompetenzdetails',
'report_card.teacher_signature': 'Unterschrift Lehrkraft',
'report_card.parent_signature': 'Unterschrift Eltern',
'report_card.grading_scale': 'Notenskala (1-6)',
'report_card.create_title': 'Neues Zeugnis erstellen',
'report_card.create_desc': 'Erstellen Sie ein neues Zeugnis für einen Schüler.',
'report_card.select_class': 'Klasse auswählen',
'report_card.select_student': 'Schüler auswählen',
'report_card.select_year': 'Schuljahr auswählen',
'report_card.template': 'Vorlage',
'report_card.select_template': 'Vorlage auswählen',
'report_card.no_template': 'Keine Vorlage',
'report_card.include_grades': 'Noten einbeziehen',
'report_card.batch_generate_title': 'Klassensatz erstellen',
'report_card.batch_generate_desc': 'Erstellen Sie Zeugnisse für alle Schüler einer Klasse.',
'report_card.generate': 'Erstellen',
'report_card.template_management': 'Vorlagenverwaltung',
'report_card.template_desc': 'Verwalten und erstellen Sie Zeugnisvorlagen.',
'report_card.existing_templates': 'Bestehende Vorlagen',
'report_card.default': 'Standard',
'report_card.template_name': 'Vorlagenname',
'report_card.template_name_placeholder': 'z.B. Standard-Grundschulzeugnis',
'report_card.template_description': 'Beschreibung',
'report_card.template_desc_placeholder': 'Kurze Beschreibung der Vorlage',
'report_card.layout': 'Layout',
'report_card.layout_default': 'Standard',
'report_card.layout_detailed': 'Detailliert',
'report_card.layout_compact': 'Kompakt',
'report_card.set_as_default': 'Als Standard festlegen',
'report_card.create_template': 'Vorlage erstellen',
'report_card.delete_confirm_title': 'Zeugnis löschen',
'report_card.delete_confirm_desc': 'Möchten Sie dieses Zeugnis wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.',
'report_card.created': 'Zeugnis erfolgreich erstellt',
'report_card.create_error': 'Fehler beim Erstellen des Zeugnisses',
'report_card.batch_generated': '{count} Zeugnisse erstellt',
'report_card.batch_error': 'Fehler beim Erstellen des Klassensatzes',
'report_card.saved': 'Zeugnis gespeichert',
'report_card.save_error': 'Fehler beim Speichern',
'report_card.status_updated': 'Status aktualisiert',
'report_card.status_error': 'Fehler beim Aktualisieren des Status',
'report_card.deleted': 'Zeugnis gelöscht',
'report_card.delete_error': 'Fehler beim Löschen',
'report_card.bulk_action_success': 'Massenaktion erfolgreich',
'report_card.bulk_action_error': 'Fehler bei der Massenaktion',
'report_card.export_success': 'Export erfolgreich',
'report_card.export_error': 'Fehler beim Export',
'report_card.load_error': 'Fehler beim Laden der Zeugnisse',
'report_card.template_created': 'Vorlage erstellt',
'report_card.template_error': 'Fehler beim Erstellen der Vorlage',
'report_card.section_header': 'Kopfzeile',
'report_card.section_grades': 'Noten',
'report_card.section_competencies': 'Kompetenzen',
'report_card.section_comments': 'Bemerkungen',
'report_card.section_attendance': 'Anwesenheit',
'report_card.section_signature': 'Unterschrift',
};
const en: TranslationDict = {
@@ -9902,6 +10249,72 @@ const en: TranslationDict = {
'parent_portal.days_present': 'Days Present',
'parent_portal.attendance_rate': 'Attendance Rate',
'parent_portal.all_children': 'All Children',
'parent_portal.academic_progress': 'Academic Progress',
'parent_portal.attendance_illness': 'Attendance & Illness',
'parent_portal.communication': 'Communication',
'parent_portal.schedule': 'Schedule',
'parent_portal.reports_docs': 'Reports & Documents',
'parent_portal.subject_grades': 'Subjects & Grades',
'parent_portal.class_average': 'Class Average',
'parent_portal.trend_up': 'Improving',
'parent_portal.trend_down': 'Declining',
'parent_portal.trend_stable': 'Stable',
'parent_portal.competency_radar': 'Competency Radar',
'parent_portal.grade_history': 'Grade History',
'parent_portal.assessment_results': 'Assessment Results',
'parent_portal.attendance_rate_circular': 'Attendance Rate',
'parent_portal.illness_history': 'Illness History',
'parent_portal.upload_certificate': 'Upload Certificate',
'parent_portal.messages_teachers': 'Messages from Teachers',
'parent_portal.conversation_rooms': 'Conversation Rooms',
'parent_portal.school_announcements': 'School Announcements',
'parent_portal.weekly_timetable': 'Weekly Timetable',
'parent_portal.exam_dates': 'Exam Dates',
'parent_portal.counseling_appointments_short': 'Counseling',
'parent_portal.school_events': 'School Events',
'parent_portal.homework_due': 'Homework Due',
'parent_portal.report_cards': 'Report Cards',
'parent_portal.portfolio_highlights': 'Portfolio Highlights',
'parent_portal.request_meeting': 'Request Meeting',
'parent_portal.reserve_book': 'Reserve Book',
'parent_portal.view_announcements': 'View Announcements',
'parent_portal.child_dashboard': 'Dashboard',
'parent_portal.quick_stats': 'Quick Stats',
'parent_portal.upcoming_deadlines': 'Upcoming Deadlines',
'parent_portal.recent_activity': 'Recent Activity',
'parent_portal.no_announcements': 'No announcements',
'parent_portal.no_messages': 'No messages',
'parent_portal.no_schedule': 'No schedule available',
'parent_portal.no_homework': 'No homework',
'parent_portal.no_events': 'No events',
'parent_portal.no_portfolio': 'No portfolio entries',
'parent_portal.no_assessments': 'No assessments',
'parent_portal.monday': 'Monday',
'parent_portal.tuesday': 'Tuesday',
'parent_portal.wednesday': 'Wednesday',
'parent_portal.thursday': 'Thursday',
'parent_portal.friday': 'Friday',
'parent_portal.period': 'Period',
'parent_portal.break': 'Break',
'parent_portal.score': 'Score',
'parent_portal.feedback': 'Feedback',
'parent_portal.overall_average': 'Overall Average',
'parent_portal.subjects_count': 'Subjects',
'parent_portal.latest_grade': 'Latest Grade',
'parent_portal.days_excused': 'Days Excused',
'parent_portal.days_late': 'Days Late',
'parent_portal.unread_messages': 'Unread Messages',
'parent_portal.active_conversations': 'Active Conversations',
'parent_portal.pinned': 'Pinned',
'parent_portal.urgent': 'Urgent',
'parent_portal.from': 'From',
'parent_portal.due': 'Due',
'parent_portal.view': 'View',
'parent_portal.download': 'Download',
'parent_portal.grade_trend': 'Grade Trend',
'parent_portal.comparison': 'Comparison',
'parent_portal.student': 'Student',
'parent_portal.class': 'Class',
// ─── Content Crawl ──────────────────────────────────────────────────
'subjects.crawl': 'Crawl Content',
@@ -10578,6 +10991,287 @@ const en: TranslationDict = {
'achievements.to_next_level': 'to next level',
'achievements.time_remaining': 'Time remaining',
'achievements.days': 'days',
// Seating Chart
'nav.seating_chart': 'Seating Chart',
'seating.title': 'Seating Chart',
'seating.subtitle': 'Create and manage seating arrangements',
'seating.select_class': 'Select class',
'seating.select_chart': 'Select chart',
'seating.new_chart': 'New Chart',
'seating.default': 'Default',
'seating.no_chart_title': 'No seating chart found',
'seating.no_chart_subtitle': 'Create a seating chart to manage student seats.',
'seating.create_chart_title': 'Create New Seating Chart',
'seating.create_chart_desc': 'Create a new seating chart for this class.',
'seating.chart_name': 'Chart Name',
'seating.chart_name_placeholder': 'e.g. Seating Q1',
'seating.chart_created': 'Chart created',
'seating.chart_deleted': 'Chart deleted',
'seating.delete_chart_title': 'Delete Seating Chart',
'seating.delete_chart_desc': 'Are you sure you want to delete this seating chart? This action cannot be undone.',
'seating.unassigned_students': 'Unassigned Students',
'seating.all_students_assigned': 'All students are assigned.',
'seating.assign_all': 'Assign All',
'seating.randomize': 'Randomize',
'seating.smart_arrange': 'Smart Arrange',
'seating.clear_all': 'Clear All',
'seating.arrangement_saved': 'Seating chart saved',
'seating.arrangement_updated': 'Seating arrangement updated',
'seating.teacher_desk': "Teacher's Desk",
'seating.door': 'Door',
'seating.rows': 'Rows',
'seating.columns': 'Columns',
'seating.layout_type': 'Layout Type',
'seating.layout_rows': 'Rows',
'seating.layout_groups': 'Groups',
'seating.layout_ushape': 'U-Shape',
'seating.layout_circle': 'Circle',
'seating.layout_custom': 'Custom',
'seating.settings': 'Settings',
'seating.show_door': 'Show Door',
'seating.show_windows': 'Show Windows',
'seating.door_position': 'Door Position',
'seating.window_position': 'Window Position',
'seating.pos_left': 'Left',
'seating.pos_right': 'Right',
'seating.pos_back': 'Back',
'seating.pos_both': 'Both Sides',
'seating.assigned_count': '{assigned} of {total} assigned',
'seating.seat_position': 'Row {row}, Seat {col}',
'seating.view_profile': 'View Profile',
'seating.behavior_note': 'Behavior note',
'seating.legend_assigned': 'Assigned',
'seating.legend_empty': 'Empty',
'seating.legend_behavior': 'Behavior note',
// School Library (EN)
'library.title': 'School Library',
'library.subtitle': 'Book catalog, checkouts, and reservations',
'library.loading': 'Loading...',
'library.add_book': 'Add Book',
'library.add_book_desc': 'Add a new book to the library',
'library.book_added': 'Book added successfully',
'library.error_adding_book': 'Error adding book',
'library.catalog': 'Catalog',
'library.checkouts': 'Checkouts',
'library.overdue_tab': 'Overdue',
'library.reservations': 'Reservations',
'library.statistics': 'Statistics',
'library.search_placeholder': 'Search by title, author, ISBN, or category...',
'library.category': 'Category',
'library.availability': 'Availability',
'library.reading_level': 'Reading Level',
'library.all_categories': 'All Categories',
'library.all': 'All',
'library.available': 'Available',
'library.checked_out': 'Checked Out',
'library.unavailable': 'Unavailable',
'library.all_levels': 'All Levels',
'library.level_elementary': 'Elementary',
'library.level_middle': 'Middle',
'library.level_high': 'High',
'library.level_advanced': 'Advanced',
'library.copies_available': 'copies available',
'library.no_books': 'No books found',
'library.add_first_book': 'Add your first book',
'library.checkout': 'Checkout',
'library.reserve': 'Reserve',
'library.active_checkouts': 'Active Checkouts',
'library.new_checkout': 'New Checkout',
'library.no_active_checkouts': 'No active checkouts',
'library.return_history': 'Return History',
'library.overdue_books': 'Overdue Books',
'library.no_overdue': 'No overdue books!',
'library.days_overdue': 'days overdue',
'library.fine_estimate': 'Estimated fine',
'library.return': 'Return',
'library.renew': 'Renew',
'library.renewed': 'renewed',
'library.renewal_success': 'Checkout renewed successfully',
'library.error_renewal': 'Error renewing checkout',
'library.checkout_success': 'Book checked out successfully',
'library.error_checkout': 'Error checking out book',
'library.return_success': 'Book returned successfully',
'library.error_return': 'Error returning book',
'library.reservation_success': 'Book reserved successfully',
'library.error_reservation': 'Error reserving book',
'library.reservation_cancelled': 'Reservation cancelled',
'library.error_cancel_reservation': 'Error cancelling reservation',
'library.no_student_selected': 'No student selected',
'library.no_reservations': 'No reservations',
'library.available_now': 'Available now',
'library.queue_position': 'Queue position',
'library.reserved_on': 'Reserved on',
'library.cancel': 'Cancel',
'library.total_books': 'Total Books',
'library.total_copies': 'Total Copies',
'library.available_copies': 'Available',
'library.checked_out_count': 'Checked Out',
'library.overdue': 'Overdue',
'library.overdue_rate': 'Overdue Rate',
'library.popular_books': 'Popular Books',
'library.category_distribution': 'Category Distribution',
'library.checkout_trends': 'Checkout Trends',
'library.no_data': 'No data available',
'library.book_title': 'Title',
'library.author': 'Author',
'library.isbn': 'ISBN',
'library.publisher': 'Publisher',
'library.publish_year': 'Publish Year',
'library.total_copies_field': 'Total Copies',
'library.location': 'Location',
'library.description': 'Description',
'library.student': 'Student',
'library.due_date': 'Due Date',
'library.checkout_date': 'Checkout Date',
'library.condition': 'Condition',
'library.condition_excellent': 'Excellent',
'library.condition_good': 'Good',
'library.condition_fair': 'Fair',
'library.condition_poor': 'Poor',
'library.notes': 'Notes',
'library.notes_placeholder': 'Optional notes...',
'library.checkout_book': 'Checkout Book',
'library.checkout_desc': 'Checkout a book for a student',
'library.select_book': 'Select Book',
'library.select_student': 'Select Student',
'library.default_14_days': 'Default: 14 days from today',
'library.return_book': 'Return Book',
'library.return_condition': 'Return Condition',
'library.fine_amount': 'Fine Amount',
'library.overdue_fine_note': 'This book is overdue. Please check the fine amount.',
'library.checkout_receipt': 'Checkout Receipt',
'library.confirm_delete_book': 'Are you sure you want to delete this book?',
'library.book_deleted': 'Book deleted',
'library.error_delete_book': 'Error deleting book',
'library.currently_checked_out': 'Currently Checked Out',
'library.reservation_queue': 'Reservation Queue',
'nav.school_library': 'Library',
'nav.school-library': 'Library',
'nav.seating_chart': 'Seating Chart',
'nav.seating-chart': 'Seating Chart',
// Report Card
'nav.report_cards': 'Report Cards',
'nav.report-cards': 'Report Cards',
'report_card.title': 'Report Card Generator',
'report_card.subtitle': 'Create, edit, and manage report cards',
'report_card.total_reports': 'Total Reports',
'report_card.drafts': 'Drafts',
'report_card.in_review': 'In Review',
'report_card.published': 'Published',
'report_card.search_placeholder': 'Search report cards...',
'report_card.filter_class': 'Class',
'report_card.filter_status': 'Status',
'report_card.filter_period': 'Period',
'report_card.all_classes': 'All Classes',
'report_card.all_statuses': 'All Statuses',
'report_card.all_periods': 'All Periods',
'report_card.create': 'Create Report Card',
'report_card.batch_generate': 'Batch Generate',
'report_card.manage_templates': 'Manage Templates',
'report_card.selected': 'selected',
'report_card.publish': 'Publish',
'report_card.archive': 'Archive',
'report_card.no_reports': 'No report cards found',
'report_card.create_first': 'Create first report card',
'report_card.more': 'more',
'report_card.with_grades': 'With Grades',
'report_card.status_draft': 'Draft',
'report_card.status_review': 'In Review',
'report_card.status_published': 'Published',
'report_card.status_archived': 'Archived',
'report_card.status_final': 'Final',
'report_card.submit_review': 'Submit for Review',
'report_card.finalize': 'Finalize',
'report_card.export_pdf': 'Export PDF',
'report_card.edit_title': 'Edit Report Card',
'report_card.student_info': 'Student Information',
'report_card.student_name': 'Name',
'report_card.class_name': 'Class',
'report_card.school_year': 'School Year',
'report_card.period': 'Period',
'report_card.date': 'Date',
'report_card.subject_grades': 'Subject Grades',
'report_card.subject': 'Subject',
'report_card.grade': 'Grade',
'report_card.label': 'Label',
'report_card.status_col': 'Status',
'report_card.evaluation': 'Evaluation',
'report_card.competency_sections': 'Competency Sections',
'report_card.section': 'Section',
'report_card.no_sections': 'No competency sections available',
'report_card.teacher_comments': 'Teacher Comments',
'report_card.comments_placeholder': 'Enter comments about the student...',
'report_card.overall_assessment': 'Overall Assessment',
'report_card.assessment_placeholder': 'Enter overall assessment...',
'report_card.competency_radar': 'Competency Radar',
'report_card.competency_level': 'Competency Level',
'report_card.attendance_summary': 'Attendance',
'report_card.present': 'Present',
'report_card.absent': 'Absent',
'report_card.excused': 'Excused',
'report_card.late': 'Late',
'report_card.actions': 'Actions',
'report_card.preview_title': 'Report Card Preview',
'report_card.report_card_title': 'Report Card',
'report_card.competency_overview': 'Competency Overview',
'report_card.competency_details': 'Competency Details',
'report_card.teacher_signature': 'Teacher Signature',
'report_card.parent_signature': 'Parent Signature',
'report_card.grading_scale': 'Grading Scale (1-6)',
'report_card.create_title': 'Create New Report Card',
'report_card.create_desc': 'Create a new report card for a student.',
'report_card.select_class': 'Select class',
'report_card.select_student': 'Select student',
'report_card.select_year': 'Select school year',
'report_card.template': 'Template',
'report_card.select_template': 'Select template',
'report_card.no_template': 'No template',
'report_card.include_grades': 'Include grades',
'report_card.batch_generate_title': 'Batch Generate Report Cards',
'report_card.batch_generate_desc': 'Generate report cards for all students in a class.',
'report_card.generate': 'Generate',
'report_card.template_management': 'Template Management',
'report_card.template_desc': 'Manage and create report card templates.',
'report_card.existing_templates': 'Existing Templates',
'report_card.default': 'Default',
'report_card.template_name': 'Template Name',
'report_card.template_name_placeholder': 'e.g. Standard Elementary Report',
'report_card.template_description': 'Description',
'report_card.template_desc_placeholder': 'Brief description of the template',
'report_card.layout': 'Layout',
'report_card.layout_default': 'Default',
'report_card.layout_detailed': 'Detailed',
'report_card.layout_compact': 'Compact',
'report_card.set_as_default': 'Set as default',
'report_card.create_template': 'Create Template',
'report_card.delete_confirm_title': 'Delete Report Card',
'report_card.delete_confirm_desc': 'Are you sure you want to delete this report card? This action cannot be undone.',
'report_card.created': 'Report card created successfully',
'report_card.create_error': 'Error creating report card',
'report_card.batch_generated': '{count} report cards generated',
'report_card.batch_error': 'Error generating batch report cards',
'report_card.saved': 'Report card saved',
'report_card.save_error': 'Error saving',
'report_card.status_updated': 'Status updated',
'report_card.status_error': 'Error updating status',
'report_card.deleted': 'Report card deleted',
'report_card.delete_error': 'Error deleting',
'report_card.bulk_action_success': 'Bulk action successful',
'report_card.bulk_action_error': 'Error performing bulk action',
'report_card.export_success': 'Export successful',
'report_card.export_error': 'Error exporting',
'report_card.load_error': 'Error loading report cards',
'report_card.template_created': 'Template created',
'report_card.template_error': 'Error creating template',
'report_card.section_header': 'Header',
'report_card.section_grades': 'Grades',
'report_card.section_competencies': 'Competencies',
'report_card.section_comments': 'Comments',
'report_card.section_attendance': 'Attendance',
'report_card.section_signature': 'Signature',
};
const translations: Record<string, TranslationDict> = { de, en };