/** * Alle Oberflaechentexte. Nie deutsche Strings hart ins JSX, siehe CLAUDE.md. * Die Begriffe folgen dem Glossar in docs/01-produkt.md. * * Schreibweise nach docs/10-design-system.md: * - Aktive Verben, die sagen, was passiert: "Vermerk speichern", nicht "Absenden" * - Dieselbe Bezeichnung durch den ganzen Ablauf * - Fehler nennen Ursache und naechsten Schritt, ohne Entschuldigung * - Leere Zustaende sind eine Aufforderung * - Keine Ausrufezeichen, kein "bitte", kein "erfolgreich" */ export const de = { app: { name: 'AfiS-Aktensystem', shortName: 'AfiS', description: 'Fallakten, Personalakten und Ermittlungen der Abteilung für innere Sicherheit', }, nav: { dashboard: 'Übersicht', cases: 'Fallakten', personnel: 'Personalakten', search: 'Suche', admin: 'Verwaltung', skipToContent: 'Zum Inhalt springen', }, auth: { signIn: 'Mit Discord anmelden', signOut: 'Abmelden', signedInAs: 'Angemeldet als', intro: 'Die Anmeldung läuft über Discord. Zugriff haben Mitglieder der Abteilung für innere Sicherheit.', reasons: { 'keine-mitgliedschaft': { title: 'Du bist nicht auf dem AfiS-Discord', body: 'Die Anmeldung setzt eine Mitgliedschaft auf dem Discord-Server voraus. Wende dich an die Abteilungsleitung.', }, 'keine-afis-rolle': { title: 'Keine Berechtigung für das Aktensystem', body: 'Du bist auf dem Server, trägst aber keine Rolle der Abteilung. Wende dich an die Abteilungsleitung.', }, 'discord-nicht-erreichbar': { title: 'Discord antwortet nicht', body: 'Die Mitgliedschaft war nicht prüfbar. In einigen Minuten erneut versuchen.', }, } as Record, sessionEnded: { title: 'Sitzung beendet', body: 'Deine Rollen haben sich geändert. Melde dich neu an.', }, error: { title: 'Anmeldung nicht möglich', body: 'Der Anmeldevorgang wurde abgebrochen. Erneut versuchen.', }, backToSignIn: 'Zurück zur Anmeldung', }, overview: { heading: 'Dein Zugang', intro: 'Was das System über dich weiss und was daraus folgt.', person: 'Person', discordId: 'Discord-Kennung', roles: 'Rollen auf dem Discord', clearance: 'Errechnete Freigabestufe', permissions: 'Rechte', noPermissions: 'Keine Rechte. Die Abteilungsleitung vergibt sie in der Rollenverwaltung.', noRoles: 'Keine Rollen.', bootstrapAdmin: 'Notfallzugang aus der Konfiguration, unabhängig vom Rollen-Mapping', unmapped: 'nicht zugeordnet', }, roleAdmin: { heading: 'Rollenverwaltung', intro: 'Jede Rolle des Discord-Servers steht hier. Zugangsrollen bestimmen die Freigabestufe, Rangrollen die Rechte, und eine Zugehörigkeitsrolle entscheidet, wer sich überhaupt anmelden darf.', empty: 'Noch keine Rollen eingelesen. Der Worker spiegelt sie, sobald er am Discord-Gateway hängt.', role: 'Rolle', category: 'Sorte', clearance: 'Freigabestufe', grantsMembership: 'Darf sich anmelden', permissions: 'Rechte', missingFromGuild: 'Auf dem Server nicht mehr vorhanden', save: 'Zuordnung speichern', invalidInput: 'Eingabe nicht gültig', roleGone: 'Rolle nicht gefunden, sie wurde zwischenzeitlich gelöscht', saving: 'Wird gespeichert', saved: 'Zuordnung gespeichert', confirm: 'Rollen-Mapping ändern? Das wirkt sofort für alle angemeldeten Personen.', categories: { MEMBERSHIP: 'Zugehörigkeit', RANK: 'Rang', CLEARANCE: 'Zugang', UNSORTED: 'Nicht eingeordnet', } as Record, optIn: 'Dieses Recht ist im Auslieferungszustand keiner Rolle zugeordnet. Vergib es bewusst.', preview: { heading: 'Vorschau', intro: 'Was jemand mit dieser Stufe sieht, wenn er keine weiteren Rollen hat.', level: 'Stufe', sees: 'Sieht Akten bis einschliesslich', hidden: 'Höhere Akten sind unsichtbar', lockedOnly: 'Höhere Akten sind sichtbar, aber gesperrt', nobody: 'Keine Rolle führt zu dieser Stufe', viaRoles: 'Erreichbar über', }, }, clearance: { label: 'Freigabestufe', classification: 'Klassifizierung', level: (n: number) => `Stufe ${n}`, // Die Bezeichnungen der Stufen stehen nicht hier, sondern in // ClearanceLevelConfig: sie sind im Adminbereich änderbar und folgen den // Zugangsrollen des Discord-Servers. Siehe docs/13-entscheidungen.md. locked: 'Inhalt gesperrt', lockedHint: (n: number) => `Sichtbar ab Stufe ${n}`, redacted: 'Geschwärzt', redactedHint: (n: number) => `Geschwärzt, ab Stufe ${n} sichtbar`, }, case: { one: 'Fallakte', many: 'Fallakten', number: 'Aktenzeichen', title: 'Titel', type: 'Fallart', status: 'Status', dueAt: 'Wiedervorlage', outcome: 'Ergebnis', createdBy: 'Angelegt von', timeline: 'Verlauf', sections: 'Abschnitte', chat: 'Aktenchat', changes: 'Änderungen', participants: 'Beteiligte', links: 'Verknüpfungen', attachments: 'Anhänge', empty: 'Noch keine Fallakte. Erste Fallakte anlegen.', create: 'Fallakte anlegen', createTitle: 'Neue Fallakte', open: 'Öffnen', updatedAt: 'Zuletzt geändert', more: 'Weitere laden', listHeading: 'Fallakten', countLabel: (n: number) => (n === 1 ? '1 Akte' : `${n} Akten`), filterStatus: 'Status', filterAll: 'Alle', reclassify: 'Klassifizierung ändern', reclassifyReason: 'Begründung der Herabstufung', statusChange: 'Status ändern', newEntry: 'Neuer Vermerk', entryPlaceholder: 'Was ist passiert?', saving: 'Wird gespeichert', unsaved: 'Nicht gespeichert', errors: { 'not-found': 'Die Akte gibt es nicht, oder du darfst sie nicht sehen.', 'clearance-too-low': 'Deine Freigabestufe reicht dafür nicht.', 'no-permission': 'Dir fehlt das nötige Recht.', 'read-only': 'Die Akte ist schreibgeschützt.', closed: 'Die Akte ist abgeschlossen. Änderungen brauchen ein eigenes Recht.', 'reason-required': 'Begründung nötig, mindestens 10 Zeichen.', 'transition-invalid': 'Dieser Statuswechsel ist nicht vorgesehen.', 'sections-incomplete': 'Es fehlen Pflichtangaben für den Abschluss.', 'template-missing': 'Für diese Fallart gibt es keine Vorlage.', default: 'Nicht gespeichert. Erneut versuchen.', } as Record, statusNames: { DRAFT: 'Entwurf', OPEN: 'Offen', DORMANT: 'Ruhend', REVIEW: 'In Prüfung', CLOSED: 'Abgeschlossen', ARCHIVED: 'Archiviert', SEALED: 'Versiegelt', } as Record, }, entry: { one: 'Vermerk', many: 'Vermerke', create: 'Vermerk speichern', empty: 'Noch kein Vermerk. Ersten Vermerk anlegen.', edited: (v: number) => `bearbeitet · v${v}`, history: 'Änderungsverlauf', changeReason: 'Begründung', retracted: (date: string, person: string, reason: string) => `Eintrag zurückgezogen am ${date} durch ${person} · Begründung: ${reason}`, types: { NOTE: 'Vermerk', INTERROGATION: 'Befragung', EVIDENCE: 'Beweismittel', STATUS_CHANGE: 'Statuswechsel', CORRECTION: 'Korrektur', SYSTEM: 'System', } as Record, }, personnel: { one: 'Personalakte', many: 'Personalakten', serviceNumber: 'Dienstnummer', rank: 'Dienstgrad', department: 'Abteilung', empty: 'Noch keine Personalakte. Erste Personalakte anlegen.', }, common: { save: 'Speichern', cancel: 'Abbrechen', undo: 'Rückgängig', retry: 'Erneut versuchen', loading: 'Wird geladen', offline: 'Keine Verbindung, wird nachgesendet', unknown: 'Unbekannt', }, errors: { notFound: { title: 'Nicht gefunden', body: 'Die Seite gibt es nicht, oder du darfst sie nicht sehen.', }, unexpected: { title: 'Nicht geladen', body: 'Der Abruf ist fehlgeschlagen. Erneut versuchen.', }, conflict: 'Nicht gespeichert, die Akte wurde zwischenzeitlich geändert. Fassungen vergleichen.', }, health: { heading: 'Systemzustand', service: 'Dienst', state: 'Zustand', checkedAt: (when: string) => `Zustand der Dienste, abgefragt ${when}`, ok: 'Betriebsbereit', degraded: 'Eingeschränkt', down: 'Gestört', components: { database: 'Datenbank', discordGateway: 'Discord-Gateway', clamav: 'Virenprüfung', } as Record, }, } as const export type Messages = typeof de