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/LanguageContext.tsx
BreakPilot Dev 19855efacc
Some checks failed
Tests / Go Tests (push) Has been cancelled
Tests / Python Tests (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / Go Lint (push) Has been cancelled
Tests / Python Lint (push) Has been cancelled
Tests / Security Scan (push) Has been cancelled
Tests / All Checks Passed (push) Has been cancelled
Security Scanning / Secret Scanning (push) Has been cancelled
Security Scanning / Dependency Vulnerability Scan (push) Has been cancelled
Security Scanning / Go Security Scan (push) Has been cancelled
Security Scanning / Python Security Scan (push) Has been cancelled
Security Scanning / Node.js Security Scan (push) Has been cancelled
Security Scanning / Docker Image Security (push) Has been cancelled
Security Scanning / Security Summary (push) Has been cancelled
CI/CD Pipeline / Go Tests (push) Has been cancelled
CI/CD Pipeline / Python Tests (push) Has been cancelled
CI/CD Pipeline / Website Tests (push) Has been cancelled
CI/CD Pipeline / Linting (push) Has been cancelled
CI/CD Pipeline / Security Scan (push) Has been cancelled
CI/CD Pipeline / Docker Build & Push (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / CI Summary (push) Has been cancelled
ci/woodpecker/manual/build-ci-image Pipeline was successful
ci/woodpecker/manual/main Pipeline failed
feat: BreakPilot PWA - Full codebase (clean push without large binaries)
All services: admin-v2, studio-v2, website, ai-compliance-sdk,
consent-service, klausur-service, voice-service, and infrastructure.
Large PDFs and compiled binaries excluded via .gitignore.
2026-02-11 13:25:58 +01:00

91 lines
2.2 KiB
TypeScript

'use client'
import { createContext, useContext, useState, useEffect, ReactNode } from 'react'
import {
Language,
defaultLanguage,
getStoredLanguage,
setStoredLanguage,
translations,
availableLanguages,
isRTL,
} from './i18n'
interface LanguageContextType {
language: Language
setLanguage: (lang: Language) => void
t: (key: string) => string
isRTL: boolean
availableLanguages: typeof availableLanguages
}
const LanguageContext = createContext<LanguageContextType | null>(null)
export function LanguageProvider({ children }: { children: ReactNode }) {
const [language, setLanguageState] = useState<Language>(defaultLanguage)
const [mounted, setMounted] = useState(false)
// Nach dem ersten Render: Sprache aus localStorage laden
useEffect(() => {
const stored = getStoredLanguage()
setLanguageState(stored)
setMounted(true)
}, [])
// Sprache setzen und speichern
const setLanguage = (lang: Language) => {
setLanguageState(lang)
setStoredLanguage(lang)
// Optional: document.dir fuer RTL setzen
if (typeof document !== 'undefined') {
document.documentElement.dir = isRTL(lang) ? 'rtl' : 'ltr'
document.documentElement.lang = lang
}
}
// Uebersetzungsfunktion
const t = (key: string): string => {
return translations[language][key] || translations[defaultLanguage][key] || key
}
// Waehrend SSR: Default anzeigen
if (!mounted) {
return (
<LanguageContext.Provider
value={{
language: defaultLanguage,
setLanguage: () => {},
t: (key) => translations[defaultLanguage][key] || key,
isRTL: false,
availableLanguages,
}}
>
{children}
</LanguageContext.Provider>
)
}
return (
<LanguageContext.Provider
value={{
language,
setLanguage,
t,
isRTL: isRTL(language),
availableLanguages,
}}
>
{children}
</LanguageContext.Provider>
)
}
// Hook fuer einfache Verwendung
export function useLanguage() {
const context = useContext(LanguageContext)
if (!context) {
throw new Error('useLanguage must be used within a LanguageProvider')
}
return context
}