Wörterbücher unter lib/i18n statt next-intl (Next.js 16 ist neu genug,
dass eine externe Routing-Middleware zusätzliches Risiko bedeutet
hätte); Sprache liegt in einem Cookie, kein URL-Präfix nötig, dadurch
bleibt proxy.ts unverändert. LocaleProvider stellt Wörterbuch + Sprache
per Context für Client-Komponenten bereit (lib/i18n/shared.ts ist
bewusst getrennt von lib/i18n/index.ts, damit next/headers nicht in
den Client-Bundle gelangt).
hint:"Mit einem Passkey (Fingerabdruck, Gesichtserkennung oder Sicherheitsschlüssel) kannst du dich künftig ohne Passwort anmelden. Passkeys gelten pro Domain – für den Live-Betrieb muss die Domain in der Supabase-Konfiguration hinterlegt sein.",
register:"Neuen Passkey registrieren",
empty:"Noch keine Passkeys registriert.",
createdOn:"– angelegt am {date}",
registered:"Passkey wurde erfolgreich registriert.",
passwordMismatch:"Die Passwörter stimmen nicht überein.",
passwordTooShort:"Das neue Passwort muss mindestens 8 Zeichen lang sein.",
passwordAuthTitle:"Anmeldung mit Passwort",
passwordAuthHint:
"Du kannst die Anmeldung mit E-Mail und Passwort für dein Konto deaktivieren und dich künftig ausschließlich per Passkey anmelden. Dafür muss mindestens ein Passkey registriert sein.",
passwordAuthCheckbox:"Anmeldung mit E-Mail und Passwort erlaubt",
"Ohne registrierten Passkey kannst du die Passwort-Anmeldung nicht deaktivieren – sonst wärst du ausgesperrt. Registriere zuerst einen Passkey weiter unten.",
confirmDisablePasswordAuth:
"Anmeldung mit E-Mail und Passwort wirklich deaktivieren? Du kannst dich danach nur noch per Passkey anmelden.",
wrongCurrentPassword:"Das aktuelle Passwort ist falsch.",
emailAlreadyUsed:"Diese E-Mail-Adresse wird bereits verwendet.",
saveError:"Speichern fehlgeschlagen: {message}",
changeError:"Ändern fehlgeschlagen: {message}",
},
suggestions:{
formTitle:"Rezept vorschlagen",
formHint:
"Fehlt dir ein Gericht auf der Speisekarte? Schlage es hier vor – das Kantinen-Team sichtet deinen Vorschlag.",
"Really delete user “{email}”? Access will be permanently removed.",
loadError:"Loading failed: {message}",
},
designEditor:{
title:"Design",
logoTitle:"Logo",
logoHint:"The logo is displayed centered above the menu.",
logoNone:"No logo set.",
logoUpload:"Upload logo",
logoRemove:"Remove logo",
logoUpdated:"Logo updated.",
logoRemoved:"Logo removed.",
faviconTitle:"Favicon",
faviconHint:
"Shown as the icon in the browser tab. Without a custom favicon, the application's default icon is used.",
faviconNone:"No custom favicon set.",
faviconUpload:"Upload favicon",
faviconRemove:"Remove favicon",
faviconUpdated:"Favicon updated.",
faviconRemoved:"Favicon removed.",
invalidImage:"Please choose an image file (PNG, JPG, SVG, WebP, ICO).",
colorsTitle:"Colors",
colorsSave:"Save colors",
colorsReset:"Reset to default",
colorsSaved:"Colors saved.",
colorPrimary:"Primary color (table header)",
colorPrimaryDark:"Primary color, dark (internal top bar)",
colorAccent:"Accent color",
colorHeaderText:"Table header text color",
colorRowBg:"Cell background",
colorRowBgAlt:"Cell background (alternating)",
colorAddBtn:"“Add” button",
colorDeleteBtn:"“Delete” button",
loadError:"Loading failed: {message}",
saveError:"Saving failed: {message}",
uploadError:"Upload failed: {message}",
confirmRemoveLogo:"Really remove the logo?",
confirmRemoveFavicon:"Really remove the favicon?",
},
passkeys:{
title:"Passkeys",
hint:"With a passkey (fingerprint, face recognition, or a security key) you can sign in without a password in the future. Passkeys are bound to a domain – for production use, the domain must be configured in Supabase.",
register:"Register new passkey",
empty:"No passkeys registered yet.",
createdOn:"– created on {date}",
registered:"Passkey registered successfully.",
registerError:"Registration failed: {message}",
registerCancelled:"Passkey registration was cancelled.",
loadError:"Could not load passkeys: {message}",
deleteError:"Deleting failed: {message}",
confirmDelete:"Really delete this passkey?",
},
account:{
title:"My account",
personalTitle:"Personal details",
saveName:"Save name",
nameSaved:"Name saved.",
nameRequired:"Please enter a name.",
emailTitle:"Email address",
changeEmail:"Change email address",
emailSent:
"Confirmation emails have been sent. The new address becomes active only after confirming the link.",
passwordTooShort:"The new password must be at least 8 characters long.",
passwordAuthTitle:"Password sign-in",
passwordAuthHint:
"You can disable email and password sign-in for your account and sign in exclusively with a passkey in the future. At least one passkey must be registered for this.",
passwordAuthCheckbox:"Email and password sign-in allowed",
loadError:"Wczytywanie nie powiodło się: {message}",
saveError:"Zapisywanie nie powiodło się: {message}",
uploadError:"Przesyłanie nie powiodło się: {message}",
confirmRemoveLogo:"Czy na pewno usunąć logo?",
confirmRemoveFavicon:"Czy na pewno usunąć favicon?",
},
passkeys:{
title:"Klucze dostępu",
hint:"Dzięki kluczowi dostępu (odcisk palca, rozpoznawanie twarzy lub klucz bezpieczeństwa) możesz w przyszłości logować się bez hasła. Klucze dostępu są przypisane do domeny – w środowisku produkcyjnym domena musi być skonfigurowana w Supabase.",
register:"Zarejestruj nowy klucz dostępu",
empty:"Nie zarejestrowano jeszcze żadnych kluczy dostępu.",
createdOn:"– utworzono {date}",
registered:"Klucz dostępu został pomyślnie zarejestrowany.",
registerError:"Rejestracja nie powiodła się: {message}",
registerCancelled:"Rejestracja klucza dostępu została anulowana.",
loadError:"Nie udało się wczytać kluczy dostępu: {message}",
deleteError:"Usuwanie nie powiodło się: {message}",
confirmDelete:"Czy na pewno usunąć ten klucz dostępu?",
},
account:{
title:"Moje konto",
personalTitle:"Dane osobowe",
saveName:"Zapisz nazwę",
nameSaved:"Nazwa zapisana.",
nameRequired:"Podaj nazwę.",
emailTitle:"Adres e-mail",
changeEmail:"Zmień adres e-mail",
emailSent:
"Wysłano e-maile potwierdzające. Nowy adres zacznie obowiązywać dopiero po potwierdzeniu linku.",
passwordTitle:"Zmień hasło",
currentPassword:"Obecne hasło (do weryfikacji)",
newPassword:"Nowe hasło",
newPasswordRepeat:"Powtórz nowe hasło",
changePassword:"Zmień hasło",
passwordChanged:"Hasło zmienione.",
passwordMismatch:"Hasła nie są zgodne.",
passwordTooShort:"Nowe hasło musi mieć co najmniej 8 znaków.",
passwordAuthTitle:"Logowanie hasłem",
passwordAuthHint:
"Możesz wyłączyć logowanie e-mailem i hasłem dla swojego konta i logować się w przyszłości wyłącznie kluczem dostępu. Wymaga to zarejestrowania co najmniej jednego klucza dostępu.",
passwordAuthCheckbox:"Logowanie e-mailem i hasłem dozwolone",
/** Platzhalter der Form "{name}" durch vars.name ersetzen. */
exportfunctionformatMessage(
template: string,
vars?: Record<string,string|number>
):string{
if(!vars)returntemplate;
returntemplate.replace(/\{(\w+)\}/g,(match,key)=>
keyinvars?String(vars[key]):match
);
}
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.