Der Discord-Server hat drei Sorten Rollen, die Dokumente kannten nur eine: Zugehörigkeit (AfiS, Personalabteilung) als Türsteher, Rangrollen für die Rechte, Zugangsrollen für die Freigabestufe. Das bestehende RoleMapping trägt das fast, es fehlt nur der Türsteher. Die beiden Felder dafür kommen mit Phase 1, die Struktur ist in docs/13-entscheidungen.md festgehalten. Die Freigabestufen heißen jetzt wie die Zugangsrollen: Unclassified, Restricted Access, Confidential Access, Sensitive Access, Critical Operations, Executive Oversight. Fachbegriffe der Domäne bleiben englisch, auch in einer deutschen Oberfläche. Die Bezeichnungen sind damit Daten in ClearanceLevelConfig, nicht mehr Oberflächentext in lib/i18n/de.ts: sie sind im Adminbereich änderbar, und was der Leiter ändern kann, gehört nicht in eine Übersetzungsdatei. StampMark bekommt den Namen hereingereicht. Vier neue Tests prüfen den Zustand, den der Seed herstellt, gegen die Datenbank statt gegen eine Konstante im Code.
156 lines
4.5 KiB
TypeScript
156 lines
4.5 KiB
TypeScript
/**
|
|
* 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',
|
|
notInGuild: {
|
|
title: 'Du bist nicht auf dem AfiS-Discord',
|
|
body: 'Die Anmeldung setzt eine Mitgliedschaft auf dem Discord-Server voraus. Wende dich an die Abteilungsleitung.',
|
|
},
|
|
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.',
|
|
},
|
|
},
|
|
|
|
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.',
|
|
statusNames: {
|
|
DRAFT: 'Entwurf',
|
|
OPEN: 'Offen',
|
|
DORMANT: 'Ruhend',
|
|
REVIEW: 'In Prüfung',
|
|
CLOSED: 'Abgeschlossen',
|
|
ARCHIVED: 'Archiviert',
|
|
SEALED: 'Versiegelt',
|
|
} as Record<string, string>,
|
|
},
|
|
|
|
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<string, string>,
|
|
},
|
|
|
|
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<string, string>,
|
|
},
|
|
} as const
|
|
|
|
export type Messages = typeof de
|