/** * Was fast jede Ansicht braucht: Knöpfe, Fehlermeldungen, Freigabestufen. * * Nach Bereichen getrennt, weil eine **Client-Komponente die ganze Datei ins * Bündel zieht**, in der ihr Text steht. Lägen alle Texte in einer, trüge jede * Ansicht die der ganzen Anwendung mit sich herum — das Budget aus * docs/09-performance-und-ux.md wäre nach wenigen Phasen aufgebraucht. * * Serverkomponenten nehmen weiter `de` aus `lib/i18n/de.ts`: was dorthin * gezogen wird, verlässt den Server nicht. */ export const commonText = { save: 'Speichern', cancel: 'Abbrechen', undo: 'Rückgängig', retry: 'Erneut versuchen', loading: 'Wird geladen', offline: 'Keine Verbindung, wird nachgesendet', unknown: 'Unbekannt', } as const /** * Meldungen zu abgelehnten Aktionen. Der Schlüssel ist der `code` eines * `AccessError`, siehe lib/errors.ts. Gilt für Fallakten, Personalakten und * Dokumente gleichermaßen — die Regeln sind dieselben. */ export const actionErrorsText = { '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': 'Der Datensatz ist schreibgeschützt.', closed: 'Der Vorgang 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': 'Dafür gibt es keine Vorlage.', 'field-unknown': 'Dieses Feld gehört nicht zur Vorlage.', 'name-required': 'Ein Name mit mindestens zwei Zeichen ist nötig.', 'participant-target': 'Entweder ein Discord-Konto oder eine Personalakte, nicht beides.', 'link-self': 'Eine Akte lässt sich nicht mit sich selbst verknüpfen.', 'message-empty': 'Die Nachricht ist leer.', 'message-too-long': 'Die Nachricht ist länger als 4000 Zeichen.', 'message-withdrawn': 'Die Nachricht wurde zurückgezogen.', 'adopt-needs-case': 'Nur eine Nachricht aus einem Aktenchat wird zum Vermerk.', 'channel-key-taken': 'Dieses Kürzel gibt es schon.', 'channel-key-invalid': 'Kürzel: Kleinbuchstaben, Ziffern und Bindestrich, mindestens zwei Zeichen.', default: 'Nicht gespeichert. Erneut versuchen.', } as Record export const errorsText = { 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.', } as const export const clearanceText = { 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`, } as const