Files
breakpilot-lehrer/studio-v2/lib/i18n.ts
T
Benjamin Admin bde0d57b5a
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-school (push) Successful in 27s
CI / test-go-edu-search (push) Successful in 28s
CI / test-python-klausur (push) Failing after 2m21s
CI / test-python-agent-core (push) Successful in 18s
CI / test-nodejs-website (push) Successful in 22s
Add Schulsprache (school language) as second language setting
- LanguageContext: new schoolLanguage + setSchoolLanguage
- LanguageDropdown: two tabs (Muttersprache / Schulsprache) with flag selection
- UnitBuilder: defaults target language to schoolLanguage
- Stored in bp_school_language localStorage (default: de)
- Shows school flag badge next to main language when different

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 17:49:58 +02:00

439 lines
16 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* BreakPilot Studio v2 - i18n Module
*
* 7 Sprachen: de, en, tr, ar, ru, uk, pl
* localStorage-Persistenz mit Key 'bp_language'
* RTL-Support fuer Arabisch
*/
export type Language = string
export const availableLanguages: Record<string, { name: string; flag: string; rtl?: boolean }> = {
de: { name: 'Deutsch', flag: '🇩🇪' },
en: { name: 'English', flag: '🇬🇧' },
tr: { name: 'Türkçe', flag: '🇹🇷' },
ar: { name: 'العربية', flag: '🇸🇦', rtl: true },
ru: { name: 'Русский', flag: '🇷🇺' },
uk: { name: 'Українська', flag: '🇺🇦' },
pl: { name: 'Polski', flag: '🇵🇱' },
fr: { name: 'Français', flag: '🇫🇷' },
es: { name: 'Español', flag: '🇪🇸' },
it: { name: 'Italiano', flag: '🇮🇹' },
pt: { name: 'Português', flag: '🇵🇹' },
nl: { name: 'Nederlands', flag: '🇳🇱' },
ro: { name: 'Română', flag: '🇷🇴' },
el: { name: 'Ελληνικά', flag: '🇬🇷' },
bg: { name: 'Български', flag: '🇧🇬' },
hr: { name: 'Hrvatski', flag: '🇭🇷' },
cs: { name: 'Čeština', flag: '🇨🇿' },
hu: { name: 'Magyar', flag: '🇭🇺' },
sv: { name: 'Svenska', flag: '🇸🇪' },
da: { name: 'Dansk', flag: '🇩🇰' },
fi: { name: 'Suomi', flag: '🇫🇮' },
sk: { name: 'Slovenčina', flag: '🇸🇰' },
sl: { name: 'Slovenščina', flag: '🇸🇮' },
lt: { name: 'Lietuvių', flag: '🇱🇹' },
lv: { name: 'Latviešu', flag: '🇱🇻' },
et: { name: 'Eesti', flag: '🇪🇪' },
}
export const defaultLanguage: Language = 'de'
// Uebersetzungen fuer Studio v2 UI (7 Sprachen voll, Rest faellt auf EN/DE zurueck)
export const translations: Record<string, Record<string, string>> = {
de: {
// Kopfleiste
dashboard: 'Dashboard',
dashboard_subtitle: 'Willkommen zurück! Hier ist Ihr Überblick.',
search_placeholder: 'Suchen...',
// Sidebar Navigation
nav_dashboard: 'Dashboard',
nav_dokumente: 'Dokumente',
nav_klausuren: 'Klausuren',
nav_analytics: 'Analysen',
nav_vokabeln: 'Vokabeln',
nav_worksheet_editor: 'Arbeitsblätter',
nav_worksheet_cleanup: 'Bereinigung',
nav_korrektur: 'Korrekturen',
nav_companion: 'Companion', nav_compliance_pipeline: 'Compliance Pipeline',
nav_meet: 'Meet',
nav_alerts: 'Alerts',
nav_alerts_b2b: 'B2B Alerts',
nav_messages: 'Nachrichten',
nav_settings: 'Einstellungen',
// Stats Kacheln
stat_open_corrections: 'Offene Korrekturen',
stat_completed_week: 'Erledigt (Woche)',
stat_average: 'Durchschnitt',
stat_time_saved: 'Zeitersparnis',
// Klausuren
recent_klausuren: 'Aktuelle Klausuren',
show_all: 'Alle anzeigen',
students: 'Schüler',
status_in_progress: 'In Bearbeitung',
status_completed: 'Abgeschlossen',
// Quick Actions
quick_actions: 'Schnellaktionen',
create_klausur: 'Neue Klausur erstellen',
upload_work: 'Arbeiten hochladen',
magic_help: 'Magic Help',
fairness_check: 'Fairness-Check',
// AI Tipp
ai_tip: 'KI-Tipp',
ai_tip_text: '3 Klausuren warten auf Fairness-Check. Möchten Sie diese jetzt prüfen?',
// Footer / Common
imprint: 'Impressum',
privacy: 'Datenschutz',
contact: 'Kontakt',
legal: 'AGB',
cookie_settings: 'Cookie-Einstellungen',
copyright: '© 2025 BreakPilot. Alle Rechte vorbehalten.',
back_to_selection: 'Zurück zur Design-Auswahl',
language: 'Sprache',
// Theme
theme_light: 'Hell',
theme_dark: 'Dunkel',
// User Menu
logout: 'Abmelden',
},
en: {
dashboard: 'Dashboard',
dashboard_subtitle: 'Welcome back! Here is your overview.',
search_placeholder: 'Search...',
nav_dashboard: 'Dashboard',
nav_dokumente: 'Documents',
nav_klausuren: 'Exams',
nav_analytics: 'Analytics',
nav_vokabeln: 'Vocabulary',
nav_worksheet_editor: 'Worksheets',
nav_worksheet_cleanup: 'Cleanup',
nav_korrektur: 'Corrections',
nav_companion: 'Companion', nav_compliance_pipeline: 'Compliance Pipeline',
nav_meet: 'Meet',
nav_alerts: 'Alerts',
nav_alerts_b2b: 'B2B Alerts',
nav_messages: 'Messages',
nav_settings: 'Settings',
stat_open_corrections: 'Open Corrections',
stat_completed_week: 'Completed (Week)',
stat_average: 'Average',
stat_time_saved: 'Time Saved',
recent_klausuren: 'Recent Exams',
show_all: 'Show all',
students: 'Students',
status_in_progress: 'In Progress',
status_completed: 'Completed',
quick_actions: 'Quick Actions',
create_klausur: 'Create New Exam',
upload_work: 'Upload Papers',
magic_help: 'Magic Help',
fairness_check: 'Fairness Check',
ai_tip: 'AI Tip',
ai_tip_text: '3 exams are waiting for fairness check. Would you like to review them now?',
imprint: 'Imprint',
privacy: 'Privacy',
contact: 'Contact',
legal: 'Terms',
cookie_settings: 'Cookie Settings',
copyright: '© 2025 BreakPilot. All rights reserved.',
back_to_selection: 'Back to Design Selection',
language: 'Language',
theme_light: 'Light',
theme_dark: 'Dark',
logout: 'Log out',
},
tr: {
dashboard: 'Kontrol Paneli',
dashboard_subtitle: 'Tekrar hoş geldiniz! İşte genel bakışınız.',
search_placeholder: 'Ara...',
nav_dashboard: 'Kontrol Paneli',
nav_dokumente: 'Belgeler',
nav_klausuren: 'Sınavlar',
nav_analytics: 'Analizler',
nav_vokabeln: 'Kelimeler',
nav_worksheet_editor: 'Çalışma Sayfaları',
nav_worksheet_cleanup: 'Temizleme',
nav_korrektur: 'Düzeltmeler',
nav_companion: 'Companion', nav_compliance_pipeline: 'Uyum Boru Hattı',
nav_meet: 'Meet',
nav_alerts: 'Uyarılar',
nav_alerts_b2b: 'B2B Uyarılar',
nav_messages: 'Mesajlar',
nav_settings: 'Ayarlar',
stat_open_corrections: 'Açık Düzeltmeler',
stat_completed_week: 'Tamamlanan (Hafta)',
stat_average: 'Ortalama',
stat_time_saved: 'Kazanılan Zaman',
recent_klausuren: 'Son Sınavlar',
show_all: 'Tümünü göster',
students: 'Öğrenciler',
status_in_progress: 'Devam Ediyor',
status_completed: 'Tamamlandı',
quick_actions: 'Hızlı İşlemler',
create_klausur: 'Yeni Sınav Oluştur',
upload_work: 'Kağıt Yükle',
magic_help: 'Magic Help',
fairness_check: 'Adillik Kontrolü',
ai_tip: 'Yapay Zeka İpucu',
ai_tip_text: '3 sınav adillik kontrolü bekliyor. Şimdi incelemek ister misiniz?',
imprint: 'Künye',
privacy: 'Gizlilik',
contact: 'İletişim',
legal: 'Kullanım Koşulları',
cookie_settings: 'Çerez Ayarları',
copyright: '© 2025 BreakPilot. Tüm hakları saklıdır.',
back_to_selection: 'Tasarım Seçimine Dön',
language: 'Dil',
theme_light: 'Açık',
theme_dark: 'Koyu',
logout: 'Çıkış yap',
},
ar: {
dashboard: 'لوحة التحكم',
dashboard_subtitle: 'مرحباً بعودتك! إليك نظرة عامة.',
search_placeholder: 'بحث...',
nav_dashboard: 'لوحة التحكم',
nav_dokumente: 'المستندات',
nav_klausuren: 'الامتحانات',
nav_analytics: 'التحليلات',
nav_vokabeln: 'المفردات',
nav_worksheet_editor: 'أوراق العمل',
nav_worksheet_cleanup: 'تنظيف',
nav_korrektur: 'التصحيحات',
nav_companion: 'المرافق', nav_compliance_pipeline: 'خط أنابيب الامتثال',
nav_meet: 'اجتماع',
nav_alerts: 'تنبيهات',
nav_alerts_b2b: 'تنبيهات الشركات',
nav_messages: 'الرسائل',
nav_settings: 'الإعدادات',
stat_open_corrections: 'التصحيحات المفتوحة',
stat_completed_week: 'المكتمل (أسبوع)',
stat_average: 'المتوسط',
stat_time_saved: 'الوقت الموفر',
recent_klausuren: 'الامتحانات الأخيرة',
show_all: 'عرض الكل',
students: 'الطلاب',
status_in_progress: 'قيد التنفيذ',
status_completed: 'مكتمل',
quick_actions: 'إجراءات سريعة',
create_klausur: 'إنشاء امتحان جديد',
upload_work: 'تحميل الأوراق',
magic_help: 'المساعدة السحرية',
fairness_check: 'فحص العدالة',
ai_tip: 'نصيحة الذكاء الاصطناعي',
ai_tip_text: '3 امتحانات تنتظر فحص العدالة. هل تريد مراجعتها الآن؟',
imprint: 'البصمة',
privacy: 'الخصوصية',
contact: 'اتصل بنا',
legal: 'الشروط والأحكام',
cookie_settings: 'إعدادات ملفات تعريف الارتباط',
copyright: '© 2025 BreakPilot. جميع الحقوق محفوظة.',
back_to_selection: 'العودة لاختيار التصميم',
language: 'اللغة',
theme_light: 'فاتح',
theme_dark: 'داكن',
logout: 'تسجيل الخروج',
},
ru: {
dashboard: 'Панель управления',
dashboard_subtitle: 'С возвращением! Вот ваш обзор.',
search_placeholder: 'Поиск...',
nav_dashboard: 'Панель управления',
nav_dokumente: 'Документы',
nav_klausuren: 'Экзамены',
nav_analytics: 'Аналитика',
nav_vokabeln: 'Словарь',
nav_worksheet_editor: 'Рабочие листы',
nav_worksheet_cleanup: 'Очистка',
nav_korrektur: 'Проверки',
nav_companion: 'Компаньон', nav_compliance_pipeline: 'Пайплайн соответствия',
nav_meet: 'Встреча',
nav_alerts: 'Оповещения',
nav_alerts_b2b: 'B2B оповещения',
nav_messages: 'Сообщения',
nav_settings: 'Настройки',
stat_open_corrections: 'Открытые проверки',
stat_completed_week: 'Завершено (неделя)',
stat_average: 'Средний балл',
stat_time_saved: 'Сэкономлено времени',
recent_klausuren: 'Последние экзамены',
show_all: 'Показать все',
students: 'Студенты',
status_in_progress: 'В работе',
status_completed: 'Завершено',
quick_actions: 'Быстрые действия',
create_klausur: 'Создать экзамен',
upload_work: 'Загрузить работы',
magic_help: 'Magic Help',
fairness_check: 'Проверка справедливости',
ai_tip: 'Совет ИИ',
ai_tip_text: '3 экзамена ждут проверки справедливости. Хотите проверить сейчас?',
imprint: 'Импрессум',
privacy: 'Конфиденциальность',
contact: 'Контакт',
legal: 'Условия использования',
cookie_settings: 'Настройки cookie',
copyright: '© 2025 BreakPilot. Все права защищены.',
back_to_selection: 'Вернуться к выбору дизайна',
language: 'Язык',
theme_light: 'Светлая',
theme_dark: 'Тёмная',
logout: 'Выйти',
},
uk: {
dashboard: 'Панель керування',
dashboard_subtitle: 'З поверненням! Ось ваш огляд.',
search_placeholder: 'Пошук...',
nav_dashboard: 'Панель керування',
nav_dokumente: 'Документи',
nav_klausuren: 'Іспити',
nav_analytics: 'Аналітика',
nav_vokabeln: 'Словник',
nav_worksheet_editor: 'Робочі аркуші',
nav_worksheet_cleanup: 'Очищення',
nav_korrektur: 'Перевірки',
nav_companion: 'Компаньйон', nav_compliance_pipeline: 'Пайплайн відповідності',
nav_meet: 'Зустріч',
nav_alerts: 'Сповіщення',
nav_alerts_b2b: 'B2B сповіщення',
nav_messages: 'Повідомлення',
nav_settings: 'Налаштування',
stat_open_corrections: 'Відкриті перевірки',
stat_completed_week: 'Завершено (тиждень)',
stat_average: 'Середній бал',
stat_time_saved: 'Збережено часу',
recent_klausuren: 'Останні іспити',
show_all: 'Показати все',
students: 'Студенти',
status_in_progress: 'В роботі',
status_completed: 'Завершено',
quick_actions: 'Швидкі дії',
create_klausur: 'Створити іспит',
upload_work: 'Завантажити роботи',
magic_help: 'Magic Help',
fairness_check: 'Перевірка справедливості',
ai_tip: 'Порада ШІ',
ai_tip_text: '3 іспити чекають перевірки справедливості. Бажаєте перевірити зараз?',
imprint: 'Імпресум',
privacy: 'Конфіденційність',
contact: 'Контакт',
legal: 'Умови використання',
cookie_settings: 'Налаштування cookie',
copyright: '© 2025 BreakPilot. Всі права захищені.',
back_to_selection: 'Повернутися до вибору дизайну',
language: 'Мова',
theme_light: 'Світла',
theme_dark: 'Темна',
logout: 'Вийти',
},
pl: {
dashboard: 'Panel główny',
dashboard_subtitle: 'Witaj ponownie! Oto twój przegląd.',
search_placeholder: 'Szukaj...',
nav_dashboard: 'Panel główny',
nav_dokumente: 'Dokumenty',
nav_klausuren: 'Egzaminy',
nav_analytics: 'Analizy',
nav_vokabeln: 'Słownictwo',
nav_worksheet_editor: 'Arkusze robocze',
nav_worksheet_cleanup: 'Czyszczenie',
nav_korrektur: 'Korekty',
nav_companion: 'Companion', nav_compliance_pipeline: 'Pipeline zgodności',
nav_meet: 'Spotkanie',
nav_alerts: 'Powiadomienia',
nav_alerts_b2b: 'Powiadomienia B2B',
nav_messages: 'Wiadomości',
nav_settings: 'Ustawienia',
stat_open_corrections: 'Otwarte korekty',
stat_completed_week: 'Ukończone (tydzień)',
stat_average: 'Średnia',
stat_time_saved: 'Zaoszczędzony czas',
recent_klausuren: 'Ostatnie egzaminy',
show_all: 'Pokaż wszystkie',
students: 'Uczniowie',
status_in_progress: 'W trakcie',
status_completed: 'Ukończone',
quick_actions: 'Szybkie akcje',
create_klausur: 'Utwórz egzamin',
upload_work: 'Prześlij prace',
magic_help: 'Magic Help',
fairness_check: 'Kontrola sprawiedliwości',
ai_tip: 'Wskazówka AI',
ai_tip_text: '3 egzaminy czekają na kontrolę sprawiedliwości. Chcesz je teraz sprawdzić?',
imprint: 'Impressum',
privacy: 'Prywatność',
contact: 'Kontakt',
legal: 'Regulamin',
cookie_settings: 'Ustawienia plików cookie',
copyright: '© 2025 BreakPilot. Wszelkie prawa zastrzeżone.',
back_to_selection: 'Powrót do wyboru projektu',
language: 'Język',
theme_light: 'Jasny',
theme_dark: 'Ciemny',
logout: 'Wyloguj się',
},
}
// LocalStorage Keys
const STORAGE_KEY = 'bp_language'
const SCHOOL_LANG_KEY = 'bp_school_language'
// Aktuelle Sprache aus localStorage oder default
export function getStoredLanguage(): Language {
if (typeof window === 'undefined') return defaultLanguage
const stored = localStorage.getItem(STORAGE_KEY)
if (stored && stored in availableLanguages) {
return stored
}
// Migration: bp_native_language → bp_language
const native = localStorage.getItem('bp_native_language')
if (native && native in availableLanguages) {
localStorage.setItem(STORAGE_KEY, native)
return native
}
return defaultLanguage
}
// Sprache speichern
export function setStoredLanguage(lang: Language): void {
if (typeof window === 'undefined') return
localStorage.setItem(STORAGE_KEY, lang)
}
// Schulsprache aus localStorage (default: 'de')
export function getStoredSchoolLanguage(): Language {
if (typeof window === 'undefined') return defaultLanguage
const stored = localStorage.getItem(SCHOOL_LANG_KEY)
if (stored && stored in availableLanguages) return stored
return defaultLanguage
}
export function setStoredSchoolLanguage(lang: Language): void {
if (typeof window === 'undefined') return
localStorage.setItem(SCHOOL_LANG_KEY, lang)
}
// Uebersetzung abrufen (Fallback: en → de → key)
export function t(key: string, lang: Language): string {
return translations[lang]?.[key] || translations['en']?.[key] || translations['de']?.[key] || key
}
// Ist die Sprache RTL?
export function isRTL(lang: Language): boolean {
return availableLanguages[lang]?.rtl === true
}