This repository has been archived on 2026-02-15. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
breakpilot-pwa/studio-v2/lib/i18n.ts
BreakPilot Dev 0f7be76e41 feat(companion): Migrate Companion from admin-v2 to studio-v2 as pure lesson tool
Remove Companion module entirely from admin-v2. Rebuild in studio-v2 as a
focused lesson timer (no dashboard mode). Direct flow: start → active → ended.
Fix timer bug where lastTickRef reset prevented countdown. Add companion link
to Sidebar and i18n translations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 23:50:20 +01:00

400 lines
15 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 = 'de' | 'en' | 'tr' | 'ar' | 'ru' | 'uk' | 'pl'
export const availableLanguages: Record<Language, { 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: '🇵🇱' },
}
export const defaultLanguage: Language = 'de'
// Uebersetzungen fuer Studio v2 UI
export const translations: Record<Language, 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 Key
const STORAGE_KEY = 'bp_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 as Language
}
return defaultLanguage
}
// Sprache speichern
export function setStoredLanguage(lang: Language): void {
if (typeof window === 'undefined') return
localStorage.setItem(STORAGE_KEY, lang)
}
// Uebersetzung abrufen
export function t(key: string, lang: Language): string {
return translations[lang][key] || translations[defaultLanguage][key] || key
}
// Ist die Sprache RTL?
export function isRTL(lang: Language): boolean {
return availableLanguages[lang]?.rtl === true
}