Round 16: Peer Assessment, Emergency Contacts, School Events, School Branding, Email Templates, Performance, Styling Polish, Onboarding 24 Steps
This commit is contained in:
1 parent
d45ba030f5
commit
6174f127f9
30 files changed
+4835
-142
No files matched your search
+106
-2
@@ -642,6 +642,17 @@ export interface School {
|
||||
schoolType: string;
|
||||
country: string;
|
||||
timezone: string;
|
||||
logoUrl?: string | null;
|
||||
primaryColor?: string | null;
|
||||
secondaryColor?: string | null;
|
||||
accentColor?: string | null;
|
||||
fontFamily?: string | null;
|
||||
customCss?: string | null;
|
||||
motto?: string | null;
|
||||
websiteUrl?: string | null;
|
||||
emailDomain?: string | null;
|
||||
address?: string | null;
|
||||
phone?: string | null;
|
||||
_count: { users: number; classGroups: number; students: number };
|
||||
}
|
||||
|
||||
@@ -682,6 +693,17 @@ export function updateSchool(data: {
|
||||
schoolType?: string;
|
||||
country?: string;
|
||||
timezone?: string;
|
||||
logoUrl?: string | null;
|
||||
primaryColor?: string | null;
|
||||
secondaryColor?: string | null;
|
||||
accentColor?: string | null;
|
||||
fontFamily?: string | null;
|
||||
customCss?: string | null;
|
||||
motto?: string | null;
|
||||
websiteUrl?: string | null;
|
||||
emailDomain?: string | null;
|
||||
address?: string | null;
|
||||
phone?: string | null;
|
||||
}) {
|
||||
return apiPut<School>('/api/schools', data);
|
||||
}
|
||||
@@ -865,22 +887,104 @@ export function downloadCsvExport(params: {
|
||||
classGroupId?: string;
|
||||
schoolYearId?: string;
|
||||
schoolId?: string;
|
||||
format?: 'csv' | 'json';
|
||||
dateFrom?: string;
|
||||
dateTo?: string;
|
||||
}): void {
|
||||
const sp = new URLSearchParams();
|
||||
sp.set('type', params.type);
|
||||
if (params.classGroupId) sp.set('classGroupId', params.classGroupId);
|
||||
if (params.schoolYearId) sp.set('schoolYearId', params.schoolYearId);
|
||||
if (params.schoolId) sp.set('schoolId', params.schoolId);
|
||||
// Direct download — triggers browser download
|
||||
if (params.dateFrom) sp.set('dateFrom', params.dateFrom);
|
||||
if (params.dateTo) sp.set('dateTo', params.dateTo);
|
||||
const format = params.format || 'csv';
|
||||
const url = `/api/data-export/csv?${sp.toString()}`;
|
||||
const a = document.createElement('a');
|
||||
a.href = url;
|
||||
a.download = `${params.type}_export.csv`;
|
||||
a.download = `${params.type}_export.${format}`;
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
document.body.removeChild(a);
|
||||
}
|
||||
|
||||
/* ── Email Templates ──────────────────────────────────────────────── */
|
||||
|
||||
export interface EmailTemplate {
|
||||
id: string;
|
||||
schoolId: string;
|
||||
name: string;
|
||||
subject: string;
|
||||
body: string;
|
||||
isDefault: boolean;
|
||||
isDemo: boolean;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
deletedAt: string | null;
|
||||
}
|
||||
|
||||
export interface EmailLog {
|
||||
id: string;
|
||||
schoolId: string;
|
||||
templateId: string | null;
|
||||
recipientEmail: string;
|
||||
recipientName: string | null;
|
||||
subject: string;
|
||||
body: string;
|
||||
status: string;
|
||||
sentAt: string | null;
|
||||
error: string | null;
|
||||
createdAt: string;
|
||||
}
|
||||
|
||||
export function fetchEmailTemplates(schoolId: string): Promise<EmailTemplate[]> {
|
||||
return apiGet<EmailTemplate[]>(`/api/email-templates?schoolId=${schoolId}`);
|
||||
}
|
||||
|
||||
export function createEmailTemplate(data: {
|
||||
schoolId: string;
|
||||
name: string;
|
||||
subject: string;
|
||||
body: string;
|
||||
isDefault?: boolean;
|
||||
}): Promise<EmailTemplate> {
|
||||
return apiPost<EmailTemplate>('/api/email-templates', data);
|
||||
}
|
||||
|
||||
export function updateEmailTemplate(id: string, data: {
|
||||
name?: string;
|
||||
subject?: string;
|
||||
body?: string;
|
||||
isDefault?: boolean;
|
||||
}): Promise<EmailTemplate> {
|
||||
return apiPut<EmailTemplate>(`/api/email-templates/${id}`, data);
|
||||
}
|
||||
|
||||
export function deleteEmailTemplate(id: string): Promise<{ success: boolean }> {
|
||||
return apiDelete<{ success: boolean }>(`/api/email-templates/${id}`);
|
||||
}
|
||||
|
||||
export function sendTestEmail(data: {
|
||||
schoolId: string;
|
||||
templateId?: string;
|
||||
recipientEmail: string;
|
||||
recipientName?: string;
|
||||
subject: string;
|
||||
body: string;
|
||||
}): Promise<{ success: boolean; logId: string; message: string }> {
|
||||
return apiPost<{ success: boolean; logId: string; message: string }>('/api/email-templates/send', {
|
||||
...data,
|
||||
isTest: true,
|
||||
});
|
||||
}
|
||||
|
||||
export function fetchEmailLogs(schoolId: string, status?: string): Promise<{ logs: EmailLog[]; counts: { total: number; sent: number; failed: number; pending: number; bounced: number } }> {
|
||||
const sp = new URLSearchParams();
|
||||
sp.set('schoolId', schoolId);
|
||||
if (status) sp.set('status', status);
|
||||
return apiGet(`/api/email-logs?${sp.toString()}`);
|
||||
}
|
||||
|
||||
/* ── Data Erasure (GDPR) ──────────────────────────────────────────── */
|
||||
|
||||
export function requestDataErasure(data: {
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
// CompetenceTrack — In-memory API response cache utility
|
||||
// Provides TTL-based caching for API responses to reduce redundant fetches
|
||||
|
||||
interface CacheEntry<T> {
|
||||
data: T;
|
||||
timestamp: number;
|
||||
ttl: number; // time to live in ms
|
||||
}
|
||||
|
||||
const cache = new Map<string, CacheEntry<any>>();
|
||||
|
||||
/**
|
||||
* Get cached data or fetch and cache it.
|
||||
* If the cache entry exists and is not expired, returns cached data.
|
||||
* Otherwise, calls the fetcher, caches the result, and returns it.
|
||||
*/
|
||||
export function getCached<T>(key: string, fetcher: () => Promise<T>, ttlMs: number = 30000): Promise<T> {
|
||||
const entry = cache.get(key);
|
||||
if (entry && Date.now() - entry.timestamp < entry.ttl) {
|
||||
return Promise.resolve(entry.data as T);
|
||||
}
|
||||
|
||||
return fetcher().then((data) => {
|
||||
cache.set(key, { data, timestamp: Date.now(), ttl: ttlMs });
|
||||
return data;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Invalidate a specific cache entry by key.
|
||||
*/
|
||||
export function invalidateCache(key: string): void {
|
||||
cache.delete(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invalidate all cache entries whose key matches a pattern.
|
||||
* Pattern uses simple wildcard: '*' matches any characters.
|
||||
* Example: invalidateCachePattern('dashboard:*') clears all keys starting with 'dashboard:'
|
||||
*/
|
||||
export function invalidateCachePattern(pattern: string): void {
|
||||
const regexStr = pattern.replace(/\*/g, '.*');
|
||||
const regex = new RegExp(`^${regexStr}$`);
|
||||
for (const key of cache.keys()) {
|
||||
if (regex.test(key)) {
|
||||
cache.delete(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear all cache entries.
|
||||
*/
|
||||
export function clearCache(): void {
|
||||
cache.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get cache stats for debugging.
|
||||
*/
|
||||
export function getCacheStats(): { size: number; keys: string[] } {
|
||||
return {
|
||||
size: cache.size,
|
||||
keys: [...cache.keys()],
|
||||
};
|
||||
}
|
||||
|
||||
// Default TTLs for different API types
|
||||
export const CACHE_TTL = {
|
||||
DASHBOARD: 30000, // 30s
|
||||
ANALYTICS: 60000, // 60s
|
||||
NOTIFICATIONS: 15000, // 15s
|
||||
SCHOOL_YEARS: 120000, // 120s
|
||||
COMPETENCY_TEMPLATES: 120000, // 120s
|
||||
CLASSES: 60000, // 60s
|
||||
STUDENTS: 60000, // 60s
|
||||
ATTENDANCE: 30000, // 30s
|
||||
ASSESSMENTS: 45000, // 45s
|
||||
} as const;
|
||||
+484
@@ -2842,6 +2842,248 @@ const de: TranslationDict = {
|
||||
'resources.tags_field': 'Schlagwörter',
|
||||
'resources.add_tag': 'Schlagwort hinzufügen',
|
||||
'resources.delete_confirm': 'Ressource wirklich löschen?',
|
||||
|
||||
// ─── School Branding ──────────────────────────────────────────────
|
||||
'branding.title': 'Schulbranding',
|
||||
'branding.logo': 'Logo',
|
||||
'branding.logo_url': 'Logo-URL',
|
||||
'branding.logo_placeholder': 'https://schule.de/logo.png',
|
||||
'branding.primary_color': 'Primärfarbe',
|
||||
'branding.secondary_color': 'Sekundärfarbe',
|
||||
'branding.accent_color': 'Akzentfarbe',
|
||||
'branding.font': 'Schriftart',
|
||||
'branding.motto': 'Schulmotto',
|
||||
'branding.motto_placeholder': 'Gemeinsam lernen, gemeinsam wachsen',
|
||||
'branding.website': 'Webseite',
|
||||
'branding.website_placeholder': 'https://schule.de',
|
||||
'branding.preview': 'Vorschau',
|
||||
'branding.custom_css': 'Custom CSS',
|
||||
'branding.custom_css_placeholder': '/* Eigene CSS-Overrides */',
|
||||
'branding.email_domain': 'E-Mail-Domain',
|
||||
'branding.email_domain_placeholder': '@schule.de',
|
||||
'branding.address': 'Adresse',
|
||||
'branding.phone': 'Telefon',
|
||||
'branding.saved': 'Branding gespeichert',
|
||||
'branding.tab': 'Branding',
|
||||
'branding.colors': 'Farben',
|
||||
'branding.typography': 'Typografie',
|
||||
'branding.contact': 'Kontaktinformationen',
|
||||
'branding.reset': 'Zurücksetzen',
|
||||
|
||||
// ─── Email Templates ──────────────────────────────────────────────
|
||||
'email.templates': 'E-Mail-Vorlagen',
|
||||
'email.templates_title': 'E-Mail-Vorlagen',
|
||||
'email.templates_desc': 'E-Mail-Vorlagen für automatische Benachrichtigungen',
|
||||
'email.weekly_report': 'Wochenbericht',
|
||||
'email.assessment_reminder': 'Bewertungs-Erinnerung',
|
||||
'email.behavior_alert': 'Verhaltens-Alert',
|
||||
'email.attendance_notice': 'Anwesenheits-Notice',
|
||||
'email.welcome': 'Willkommen',
|
||||
'email.send_test': 'Test-E-Mail senden',
|
||||
'email.send_test_desc': 'E-Mail-Vorschau an Ihre Adresse senden',
|
||||
'email.log': 'E-Mail-Log',
|
||||
'email.log_title': 'E-Mail-Versandprotokoll',
|
||||
'email.smtp': 'SMTP-Konfiguration',
|
||||
'email.smtp_host': 'SMTP-Server',
|
||||
'email.smtp_port': 'Port',
|
||||
'email.smtp_user': 'Benutzername',
|
||||
'email.smtp_password': 'Passwort',
|
||||
'email.smtp_from': 'Absenderadresse',
|
||||
'email.frequency': 'E-Mail-Häufigkeit',
|
||||
'email.frequency_daily': 'Täglich',
|
||||
'email.frequency_weekly': 'Wöchentlich',
|
||||
'email.frequency_monthly': 'Monatlich',
|
||||
'email.auto_reports': 'Berichte automatisch senden',
|
||||
'email.auto_behavior': 'Verhaltens-Alerts senden',
|
||||
'email.auto_attendance': 'Anwesenheits-Notices senden',
|
||||
'email.template_name': 'Name',
|
||||
'email.template_subject': 'Betreff',
|
||||
'email.template_body': 'Inhalt',
|
||||
'email.template_variables': 'Verfügbare Variablen',
|
||||
'email.template_preview': 'Vorschau',
|
||||
'email.template_create': 'Vorlage erstellen',
|
||||
'email.template_edit': 'Vorlage bearbeiten',
|
||||
'email.template_delete': 'Vorlage löschen',
|
||||
'email.template_delete_confirm': 'Vorlage wirklich löschen?',
|
||||
'email.template_default': 'Standardvorlage',
|
||||
'email.status_sent': 'Gesendet',
|
||||
'email.status_failed': 'Fehlgeschlagen',
|
||||
'email.status_pending': 'Ausstehend',
|
||||
'email.status_bounced': 'Zurückgewiesen',
|
||||
'email.recipient': 'Empfänger',
|
||||
'email.sent_at': 'Gesendet am',
|
||||
'email.tab': 'E-Mail',
|
||||
'email.settings': 'E-Mail-Einstellungen',
|
||||
'email.test_sent': 'Test-E-Mail gesendet',
|
||||
'email.test_recipient': 'Empfänger-E-Mail',
|
||||
'email.counts': 'E-Mail-Statistik',
|
||||
|
||||
// ─── Data Export Enhancement ──────────────────────────────────────
|
||||
'export.pdf': 'PDF-Export',
|
||||
'export.json': 'JSON-Export',
|
||||
'export.csv': 'CSV-Export',
|
||||
'export.filter': 'Filter',
|
||||
'export.date_range': 'Datumsbereich',
|
||||
'export.date_from': 'Von',
|
||||
'export.date_to': 'Bis',
|
||||
'export.format': 'Format',
|
||||
'export.select_format': 'Format wählen',
|
||||
'export.select_class': 'Klasse wählen',
|
||||
'export.all_classes': 'Alle Klassen',
|
||||
'export.grade_report': 'Notenbericht',
|
||||
'export.attendance_report': 'Anwesenheitsbericht',
|
||||
'export.competency_report': 'Kompetenzbericht',
|
||||
'export.progress_indicator': 'Export wird vorbereitet...',
|
||||
'export.download_history': 'Download-Verlauf',
|
||||
'export.no_history': 'Noch keine Exporte',
|
||||
'export.enhanced_title': 'Erweiterter Datenexport',
|
||||
'export.enhanced_desc': 'Daten in verschiedenen Formaten mit Filteroptionen exportieren',
|
||||
|
||||
// Peer Assessment
|
||||
'peer.title': 'Peer-Beurteilung',
|
||||
'peer.assessor': 'Beurteiler',
|
||||
'peer.assessed': 'Beurteilter Schüler',
|
||||
'peer.anonymous': 'Anonym',
|
||||
'peer.competency': 'Kompetenz',
|
||||
'peer.create': 'Peer-Beurteilung erstellen',
|
||||
'peer.results': 'Peer-Beurteilungsergebnisse',
|
||||
'peer.average': 'Durchschnittliche Peer-Bewertung',
|
||||
'peer.comparison': 'Vergleich: Peer / Lehrer / Selbst',
|
||||
'peer.assessment_type': 'Beurteilungsart',
|
||||
'peer.level': 'Bewertungsstufe',
|
||||
'peer.comment': 'Kommentar',
|
||||
'peer.no_assessments': 'Keine Peer-Beurteilungen vorhanden',
|
||||
'peer.type_competency': 'Kompetenz',
|
||||
'peer.type_project': 'Projekt',
|
||||
'peer.type_presentation': 'Präsentation',
|
||||
'peer.type_teamwork': 'Teamarbeit',
|
||||
'peer.type_behavior': 'Verhalten',
|
||||
'peer.assign_task': 'Peer-Beurteilung zuweisen',
|
||||
'peer.from': 'Von',
|
||||
'peer.received': 'Erhaltene Beurteilungen',
|
||||
'peer.given': 'Gegebene Beurteilungen',
|
||||
'peer.rubric': 'Rubrik',
|
||||
'peer.teacher': 'Lehrer',
|
||||
'peer.self': 'Selbst',
|
||||
'peer.detail': 'Details anzeigen',
|
||||
|
||||
// Emergency Contacts
|
||||
'emergency.title': 'Notfallkontakte',
|
||||
'emergency.contact': 'Notfallkontakt',
|
||||
'emergency.primary': 'Hauptkontakt',
|
||||
'emergency.phone': 'Telefon',
|
||||
'emergency.phone_alt': 'Alternative Telefonnummer',
|
||||
'emergency.priority': 'Priorität',
|
||||
'emergency.quick_call': 'Schnellwahl',
|
||||
'emergency.print_list': 'Liste drucken',
|
||||
'emergency.export': 'Kontakte exportieren',
|
||||
'emergency.name': 'Name',
|
||||
'emergency.relationship': 'Beziehung',
|
||||
'emergency.email': 'E-Mail',
|
||||
'emergency.address': 'Adresse',
|
||||
'emergency.notes': 'Notizen',
|
||||
'emergency.add': 'Notfallkontakt hinzufügen',
|
||||
'emergency.edit': 'Notfallkontakt bearbeiten',
|
||||
'emergency.delete': 'Notfallkontakt löschen',
|
||||
'emergency.no_contacts': 'Keine Notfallkontakte vorhanden',
|
||||
'emergency.search': 'Kontakte suchen...',
|
||||
'emergency.mother': 'Mutter',
|
||||
'emergency.father': 'Vater',
|
||||
'emergency.guardian': 'Vormund',
|
||||
'emergency.grandparent': 'Großelternteil',
|
||||
'emergency.other': 'Sonstige',
|
||||
'emergency.class_list': 'Klassenliste',
|
||||
'emergency.all_contacts': 'Alle Notfallkontakte',
|
||||
'emergency.student': 'Schüler',
|
||||
|
||||
// School Events
|
||||
'events.title': 'Schulveranstaltungen',
|
||||
'events.type': 'Veranstaltungsart',
|
||||
'events.assembly': 'Versammlung',
|
||||
'events.field_trip': 'Ausflug',
|
||||
'events.sports_day': 'Sportfest',
|
||||
'events.concert': 'Konzert',
|
||||
'events.fair': 'Schulfest',
|
||||
'events.parent_meeting': 'Elternabend',
|
||||
'events.graduation': 'Abschlussfeier',
|
||||
'events.holiday': 'Ferien/Feiertag',
|
||||
'events.register': 'Anmelden',
|
||||
'events.cancel': 'Abmelden',
|
||||
'events.location': 'Ort',
|
||||
'events.organizer': 'Organisator',
|
||||
'events.all_school': 'Schulweite Veranstaltung',
|
||||
'events.create': 'Veranstaltung erstellen',
|
||||
'events.edit': 'Veranstaltung bearbeiten',
|
||||
'events.no_events': 'Keine anstehenden Veranstaltungen',
|
||||
'events.upcoming': 'Anstehende Veranstaltungen',
|
||||
'events.start_date': 'Startdatum',
|
||||
'events.end_date': 'Enddatum',
|
||||
'events.description': 'Beschreibung',
|
||||
'events.registration': 'Anmeldung erforderlich',
|
||||
'events.max_participants': 'Maximale Teilnehmer',
|
||||
'events.participants': 'Teilnehmer',
|
||||
'events.registered': 'Angemeldet',
|
||||
'events.cancelled': 'Abgemeldet',
|
||||
'events.attended': 'Teilgenommen',
|
||||
'events.notes': 'Notizen',
|
||||
'events.is_public': 'Öffentlich',
|
||||
'events.class_group': 'Klasse',
|
||||
'events.view_all': 'Alle Veranstaltungen',
|
||||
|
||||
// Onboarding Tour (24 steps) - DE
|
||||
'onboarding.step_1_title': 'Willkommen bei CompetenceTrack!',
|
||||
'onboarding.step_1_desc': 'Ihre freie Kompetenz- & Benotungsplattform für Schulen. Lassen Sie uns eine kurze Einführung machen.',
|
||||
'onboarding.step_2_title': 'Dashboard',
|
||||
'onboarding.step_2_desc': 'Hier sehen Sie einen Überblick über alle Klassen, Schüler und aktuelle Aktivitäten. Nutzen Sie die Schnellaktionen und Kennzahlen.',
|
||||
'onboarding.step_3_title': 'Klassen & Schüler',
|
||||
'onboarding.step_3_desc': 'Verwalten Sie Ihre Klassen und Schüler. Erstellen Sie neue Klassen, fügen Sie Schüler hinzu und weisen Sie Kompetenzraster zu.',
|
||||
'onboarding.step_4_title': 'Kompetenzraster',
|
||||
'onboarding.step_4_desc': 'Verwalten Sie Kompetenzraster und weisen Sie diese Ihren Klassen zu. Definieren Sie Kategorien und Kompetenzen.',
|
||||
'onboarding.step_5_title': 'Lernfortschritt',
|
||||
'onboarding.step_5_desc': 'Erfassen Sie Beobachtungen und Fortschritte einzelner Schüler. Wählen Sie eine Klasse und ein Fach, um Einträge zu loggen.',
|
||||
'onboarding.step_6_title': 'Kompetenzblume',
|
||||
'onboarding.step_6_desc': 'Visualisieren Sie die Kompetenzentwicklung als Radar-Chart. Vergleichen Sie Schüler und verfolgen Sie Trends über die Zeit.',
|
||||
'onboarding.step_7_title': 'Kompetenzmatrix',
|
||||
'onboarding.step_7_desc': 'Zeigen Sie alle Kompetenzniveaus auf einen Blick. Identifizieren Sie Lücken und Stärken schnell und übersichtlich.',
|
||||
'onboarding.step_8_title': 'Leistungsüberprüfungen',
|
||||
'onboarding.step_8_desc': 'Erstellen und verwalten Sie Leistungsüberprüfungen. Bewerten Sie Schüler und verfolgen Sie deren Fortschritt.',
|
||||
'onboarding.step_9_title': 'Benotung',
|
||||
'onboarding.step_9_desc': 'Konfigurieren Sie Notenschemata und berechnen Sie Noten basierend auf Kompetenzniveaus und Leistungsüberprüfungen.',
|
||||
'onboarding.step_10_title': 'Anwesenheit',
|
||||
'onboarding.step_10_desc': 'Erfassen Sie die Anwesenheit Ihrer Schüler. Behalten Sie den Überblick über Fehlzeiten und Anwesenheitsstatistiken.',
|
||||
'onboarding.step_11_title': 'Unterrichtsplanung',
|
||||
'onboarding.step_11_desc': 'Planen Sie Ihren Unterricht strukturiert. Erstellen Sie Stundenpläne mit Zielen, Materialien und Reflexionen.',
|
||||
'onboarding.step_12_title': 'Kalender',
|
||||
'onboarding.step_12_desc': 'Verwalten Sie Ihren Kalender mit wiederkehrenden Ereignissen. Behalten Sie wichtige Termine im Blick.',
|
||||
'onboarding.step_13_title': 'Verhalten',
|
||||
'onboarding.step_13_desc': 'Erfassen Sie Verhaltensbeobachtungen und verfolgen Sie Interventionsmaßnahmen für Ihre Schüler.',
|
||||
'onboarding.step_14_title': 'Elternkommunikation',
|
||||
'onboarding.step_14_desc': 'Kommunizieren Sie mit Eltern über den Lernfortschritt. Senden Sie Berichte und halten Sie den Dialog aufrecht.',
|
||||
'onboarding.step_15_title': 'Rubriken',
|
||||
'onboarding.step_15_desc': 'Erstellen Sie detaillierte Bewertungsrubriken mit Stufen und Kriterien. Nutzen Sie diese für objektive Bewertungen.',
|
||||
'onboarding.step_16_title': 'Kommentarbank',
|
||||
'onboarding.step_16_desc': 'Verwalten Sie wiederverwendbare Kommentare für Zeugnisse und Berichte. Sparen Sie Zeit bei der Berichtserstellung.',
|
||||
'onboarding.step_17_title': 'Digitale Hefte',
|
||||
'onboarding.step_17_desc': 'Erstellen Sie digitale Notizbücher für Ihre Fächer mit WYSIWYG-Editor und Versionsverwaltung. Spart Papier.',
|
||||
'onboarding.step_18_title': 'Zeichnen',
|
||||
'onboarding.step_18_desc': 'Nutzen Sie die digitale Zeichenfläche für Skizzen und Illustrationen. Stylus-optimiert mit Druckempfindlichkeit.',
|
||||
'onboarding.step_19_title': 'Portfolio',
|
||||
'onboarding.step_19_desc': 'Erstellen Sie digitale Portfolios für Schüler. Sammeln Sie Belege und Artefakte der Kompetenzentwicklung.',
|
||||
'onboarding.step_20_title': 'Hausaufgaben',
|
||||
'onboarding.step_20_desc': 'Verwalten Sie Hausaufgaben und Abgaben. Verfolgen Sie den Fortschritt und geben Sie Feedback.',
|
||||
'onboarding.step_21_title': 'Stundenplan',
|
||||
'onboarding.step_21_desc': 'Verwalten Sie Ihren Stundenplan mit Räumen und Zeiten. Übersichtliche Wochenansicht.',
|
||||
'onboarding.step_22_title': 'Ressourcen',
|
||||
'onboarding.step_22_desc': 'Durchsuchen Sie die Ressourcenbibliothek. Teilen Sie Dokumente, Links und Arbeitsblätter mit Kollegen.',
|
||||
'onboarding.step_23_title': 'Analyse',
|
||||
'onboarding.step_23_desc': 'Nutzen Sie erweiterte Analysen und Vorhersagemodelle. Identifizieren Sie Risikoschüler und Entwicklungstrends.',
|
||||
'onboarding.step_24_title': 'Einstellungen',
|
||||
'onboarding.step_24_desc': 'Passen Sie die Plattform an: Schulprofil, Branding, Backup und Datenverwaltung.',
|
||||
'onboarding.celebration': 'Sie sind bereit!',
|
||||
'onboarding.complete': 'Sie haben die Tour abgeschlossen. Viel Erfolg mit CompetenceTrack!',
|
||||
'onboarding.previous': 'Zurück',
|
||||
'onboarding.dont_show_again': 'Nicht mehr anzeigen',
|
||||
'onboarding.restart_tour': 'Tour erneut starten',
|
||||
};
|
||||
|
||||
const en: TranslationDict = {
|
||||
@@ -5683,6 +5925,248 @@ const en: TranslationDict = {
|
||||
'resources.tags_field': 'Tags',
|
||||
'resources.add_tag': 'Add Tag',
|
||||
'resources.delete_confirm': 'Are you sure you want to delete this resource?',
|
||||
|
||||
// ─── School Branding ──────────────────────────────────────────────
|
||||
'branding.title': 'School Branding',
|
||||
'branding.logo': 'Logo',
|
||||
'branding.logo_url': 'Logo URL',
|
||||
'branding.logo_placeholder': 'https://school.edu/logo.png',
|
||||
'branding.primary_color': 'Primary Color',
|
||||
'branding.secondary_color': 'Secondary Color',
|
||||
'branding.accent_color': 'Accent Color',
|
||||
'branding.font': 'Font Family',
|
||||
'branding.motto': 'School Motto',
|
||||
'branding.motto_placeholder': 'Learning together, growing together',
|
||||
'branding.website': 'Website',
|
||||
'branding.website_placeholder': 'https://school.edu',
|
||||
'branding.preview': 'Preview',
|
||||
'branding.custom_css': 'Custom CSS',
|
||||
'branding.custom_css_placeholder': '/* Custom CSS overrides */',
|
||||
'branding.email_domain': 'Email Domain',
|
||||
'branding.email_domain_placeholder': '@school.edu',
|
||||
'branding.address': 'Address',
|
||||
'branding.phone': 'Phone',
|
||||
'branding.saved': 'Branding saved',
|
||||
'branding.tab': 'Branding',
|
||||
'branding.colors': 'Colors',
|
||||
'branding.typography': 'Typography',
|
||||
'branding.contact': 'Contact Information',
|
||||
'branding.reset': 'Reset',
|
||||
|
||||
// ─── Email Templates ──────────────────────────────────────────────
|
||||
'email.templates': 'Email Templates',
|
||||
'email.templates_title': 'Email Templates',
|
||||
'email.templates_desc': 'Email templates for automated notifications',
|
||||
'email.weekly_report': 'Weekly Report',
|
||||
'email.assessment_reminder': 'Assessment Reminder',
|
||||
'email.behavior_alert': 'Behavior Alert',
|
||||
'email.attendance_notice': 'Attendance Notice',
|
||||
'email.welcome': 'Welcome',
|
||||
'email.send_test': 'Send Test Email',
|
||||
'email.send_test_desc': 'Send a preview email to your address',
|
||||
'email.log': 'Email Log',
|
||||
'email.log_title': 'Email Delivery Log',
|
||||
'email.smtp': 'SMTP Configuration',
|
||||
'email.smtp_host': 'SMTP Server',
|
||||
'email.smtp_port': 'Port',
|
||||
'email.smtp_user': 'Username',
|
||||
'email.smtp_password': 'Password',
|
||||
'email.smtp_from': 'From Address',
|
||||
'email.frequency': 'Email Frequency',
|
||||
'email.frequency_daily': 'Daily',
|
||||
'email.frequency_weekly': 'Weekly',
|
||||
'email.frequency_monthly': 'Monthly',
|
||||
'email.auto_reports': 'Send reports automatically',
|
||||
'email.auto_behavior': 'Send behavior alerts',
|
||||
'email.auto_attendance': 'Send attendance notices',
|
||||
'email.template_name': 'Name',
|
||||
'email.template_subject': 'Subject',
|
||||
'email.template_body': 'Body',
|
||||
'email.template_variables': 'Available Variables',
|
||||
'email.template_preview': 'Preview',
|
||||
'email.template_create': 'Create Template',
|
||||
'email.template_edit': 'Edit Template',
|
||||
'email.template_delete': 'Delete Template',
|
||||
'email.template_delete_confirm': 'Are you sure you want to delete this template?',
|
||||
'email.template_default': 'Default Template',
|
||||
'email.status_sent': 'Sent',
|
||||
'email.status_failed': 'Failed',
|
||||
'email.status_pending': 'Pending',
|
||||
'email.status_bounced': 'Bounced',
|
||||
'email.recipient': 'Recipient',
|
||||
'email.sent_at': 'Sent at',
|
||||
'email.tab': 'Email',
|
||||
'email.settings': 'Email Settings',
|
||||
'email.test_sent': 'Test email sent',
|
||||
'email.test_recipient': 'Recipient Email',
|
||||
'email.counts': 'Email Statistics',
|
||||
|
||||
// ─── Data Export Enhancement ──────────────────────────────────────
|
||||
'export.pdf': 'PDF Export',
|
||||
'export.json': 'JSON Export',
|
||||
'export.csv': 'CSV Export',
|
||||
'export.filter': 'Filter',
|
||||
'export.date_range': 'Date Range',
|
||||
'export.date_from': 'From',
|
||||
'export.date_to': 'To',
|
||||
'export.format': 'Format',
|
||||
'export.select_format': 'Select format',
|
||||
'export.select_class': 'Select class',
|
||||
'export.all_classes': 'All Classes',
|
||||
'export.grade_report': 'Grade Report',
|
||||
'export.attendance_report': 'Attendance Report',
|
||||
'export.competency_report': 'Competency Report',
|
||||
'export.progress_indicator': 'Preparing export...',
|
||||
'export.download_history': 'Download History',
|
||||
'export.no_history': 'No exports yet',
|
||||
'export.enhanced_title': 'Enhanced Data Export',
|
||||
'export.enhanced_desc': 'Export data in various formats with filter options',
|
||||
|
||||
// Peer Assessment
|
||||
'peer.title': 'Peer Assessment',
|
||||
'peer.assessor': 'Assessor',
|
||||
'peer.assessed': 'Assessed Student',
|
||||
'peer.anonymous': 'Anonymous',
|
||||
'peer.competency': 'Competency',
|
||||
'peer.create': 'Create Peer Assessment',
|
||||
'peer.results': 'Peer Assessment Results',
|
||||
'peer.average': 'Average Peer Rating',
|
||||
'peer.comparison': 'Comparison: Peer / Teacher / Self',
|
||||
'peer.assessment_type': 'Assessment Type',
|
||||
'peer.level': 'Rating Level',
|
||||
'peer.comment': 'Comment',
|
||||
'peer.no_assessments': 'No peer assessments available',
|
||||
'peer.type_competency': 'Competency',
|
||||
'peer.type_project': 'Project',
|
||||
'peer.type_presentation': 'Presentation',
|
||||
'peer.type_teamwork': 'Teamwork',
|
||||
'peer.type_behavior': 'Behavior',
|
||||
'peer.assign_task': 'Assign Peer Assessment',
|
||||
'peer.from': 'From',
|
||||
'peer.received': 'Received Assessments',
|
||||
'peer.given': 'Given Assessments',
|
||||
'peer.rubric': 'Rubric',
|
||||
'peer.teacher': 'Teacher',
|
||||
'peer.self': 'Self',
|
||||
'peer.detail': 'View Details',
|
||||
|
||||
// Emergency Contacts
|
||||
'emergency.title': 'Emergency Contacts',
|
||||
'emergency.contact': 'Emergency Contact',
|
||||
'emergency.primary': 'Primary Contact',
|
||||
'emergency.phone': 'Phone',
|
||||
'emergency.phone_alt': 'Alternative Phone',
|
||||
'emergency.priority': 'Priority',
|
||||
'emergency.quick_call': 'Quick Call',
|
||||
'emergency.print_list': 'Print List',
|
||||
'emergency.export': 'Export Contacts',
|
||||
'emergency.name': 'Name',
|
||||
'emergency.relationship': 'Relationship',
|
||||
'emergency.email': 'Email',
|
||||
'emergency.address': 'Address',
|
||||
'emergency.notes': 'Notes',
|
||||
'emergency.add': 'Add Emergency Contact',
|
||||
'emergency.edit': 'Edit Emergency Contact',
|
||||
'emergency.delete': 'Delete Emergency Contact',
|
||||
'emergency.no_contacts': 'No emergency contacts available',
|
||||
'emergency.search': 'Search contacts...',
|
||||
'emergency.mother': 'Mother',
|
||||
'emergency.father': 'Father',
|
||||
'emergency.guardian': 'Guardian',
|
||||
'emergency.grandparent': 'Grandparent',
|
||||
'emergency.other': 'Other',
|
||||
'emergency.class_list': 'Class List',
|
||||
'emergency.all_contacts': 'All Emergency Contacts',
|
||||
'emergency.student': 'Student',
|
||||
|
||||
// School Events
|
||||
'events.title': 'School Events',
|
||||
'events.type': 'Event Type',
|
||||
'events.assembly': 'Assembly',
|
||||
'events.field_trip': 'Field Trip',
|
||||
'events.sports_day': 'Sports Day',
|
||||
'events.concert': 'Concert',
|
||||
'events.fair': 'School Fair',
|
||||
'events.parent_meeting': 'Parent Meeting',
|
||||
'events.graduation': 'Graduation',
|
||||
'events.holiday': 'Holiday',
|
||||
'events.register': 'Register',
|
||||
'events.cancel': 'Cancel Registration',
|
||||
'events.location': 'Location',
|
||||
'events.organizer': 'Organizer',
|
||||
'events.all_school': 'All-School Event',
|
||||
'events.create': 'Create Event',
|
||||
'events.edit': 'Edit Event',
|
||||
'events.no_events': 'No upcoming events',
|
||||
'events.upcoming': 'Upcoming Events',
|
||||
'events.start_date': 'Start Date',
|
||||
'events.end_date': 'End Date',
|
||||
'events.description': 'Description',
|
||||
'events.registration': 'Registration Required',
|
||||
'events.max_participants': 'Max Participants',
|
||||
'events.participants': 'Participants',
|
||||
'events.registered': 'Registered',
|
||||
'events.cancelled': 'Cancelled',
|
||||
'events.attended': 'Attended',
|
||||
'events.notes': 'Notes',
|
||||
'events.is_public': 'Public',
|
||||
'events.class_group': 'Class',
|
||||
'events.view_all': 'View All Events',
|
||||
|
||||
// Onboarding Tour (24 steps) - EN
|
||||
'onboarding.step_1_title': 'Welcome to CompetenceTrack!',
|
||||
'onboarding.step_1_desc': 'Your free competency & grading platform for schools. Let\'s take a quick tour.',
|
||||
'onboarding.step_2_title': 'Dashboard',
|
||||
'onboarding.step_2_desc': 'Here you see an overview of all classes, students and current activities. Use quick actions and key metrics.',
|
||||
'onboarding.step_3_title': 'Classes & Students',
|
||||
'onboarding.step_3_desc': 'Manage your classes and students. Create new classes, add students, and assign competency grids.',
|
||||
'onboarding.step_4_title': 'Competency Grid',
|
||||
'onboarding.step_4_desc': 'Manage competency grids and assign them to your classes. Define categories and competencies.',
|
||||
'onboarding.step_5_title': 'Progress Entries',
|
||||
'onboarding.step_5_desc': 'Record observations and progress for individual students. Select a class and subject to log entries.',
|
||||
'onboarding.step_6_title': 'Competence Flower',
|
||||
'onboarding.step_6_desc': 'Visualize competency development as a radar chart. Compare students and track trends over time.',
|
||||
'onboarding.step_7_title': 'Mastery Matrix',
|
||||
'onboarding.step_7_desc': 'View all mastery levels at a glance. Quickly identify gaps and strengths across your class.',
|
||||
'onboarding.step_8_title': 'Assessments',
|
||||
'onboarding.step_8_desc': 'Create and manage assessments. Grade students and track their progress over time.',
|
||||
'onboarding.step_9_title': 'Grading',
|
||||
'onboarding.step_9_desc': 'Configure grading schemes and calculate grades based on competency levels and assessments.',
|
||||
'onboarding.step_10_title': 'Attendance',
|
||||
'onboarding.step_10_desc': 'Track student attendance with analytics. Monitor absences and attendance statistics.',
|
||||
'onboarding.step_11_title': 'Lesson Plans',
|
||||
'onboarding.step_11_desc': 'Plan your lessons with structure. Create lesson plans with goals, materials and reflections.',
|
||||
'onboarding.step_12_title': 'Calendar',
|
||||
'onboarding.step_12_desc': 'Manage your calendar with recurring events. Keep track of important dates and deadlines.',
|
||||
'onboarding.step_13_title': 'Behavior Tracking',
|
||||
'onboarding.step_13_desc': 'Record behavioral observations and track intervention measures for your students.',
|
||||
'onboarding.step_14_title': 'Parent Communication',
|
||||
'onboarding.step_14_desc': 'Communicate with parents about learning progress. Send reports and maintain an ongoing dialogue.',
|
||||
'onboarding.step_15_title': 'Rubrics',
|
||||
'onboarding.step_15_desc': 'Create detailed scoring rubrics with levels and criteria. Use them for objective assessments.',
|
||||
'onboarding.step_16_title': 'Comment Bank',
|
||||
'onboarding.step_16_desc': 'Manage reusable comments for report cards and reports. Save time during report creation.',
|
||||
'onboarding.step_17_title': 'Notebooks',
|
||||
'onboarding.step_17_desc': 'Create digital notebooks for your subjects with WYSIWYG editor and version history. Saves paper.',
|
||||
'onboarding.step_18_title': 'Drawing Canvas',
|
||||
'onboarding.step_18_desc': 'Use the digital drawing canvas for sketches and illustrations. Stylus-optimized with pressure sensitivity.',
|
||||
'onboarding.step_19_title': 'Portfolio',
|
||||
'onboarding.step_19_desc': 'Create digital portfolios for students. Collect evidence and artifacts of competency development.',
|
||||
'onboarding.step_20_title': 'Homework',
|
||||
'onboarding.step_20_desc': 'Manage homework assignments and submissions. Track progress and give feedback.',
|
||||
'onboarding.step_21_title': 'Timetable',
|
||||
'onboarding.step_21_desc': 'Manage your timetable with rooms and time slots. Clear weekly view overview.',
|
||||
'onboarding.step_22_title': 'Resources',
|
||||
'onboarding.step_22_desc': 'Browse the resource library. Share documents, links and worksheets with colleagues.',
|
||||
'onboarding.step_23_title': 'Analytics',
|
||||
'onboarding.step_23_desc': 'Use advanced analytics and predictive models. Identify at-risk students and development trends.',
|
||||
'onboarding.step_24_title': 'Settings',
|
||||
'onboarding.step_24_desc': 'Customize the platform: school profile, branding, backup and data management.',
|
||||
'onboarding.celebration': 'You\'re all set!',
|
||||
'onboarding.complete': 'You\'ve completed the tour. Good luck with CompetenceTrack!',
|
||||
'onboarding.previous': 'Previous',
|
||||
'onboarding.dont_show_again': 'Don\'t show again',
|
||||
'onboarding.restart_tour': 'Restart tour',
|
||||
};
|
||||
|
||||
const translations: Record<string, TranslationDict> = { de, en };
|
||||
|
||||
Reference in new issue
Block a user