Add Logbuch: project update blog with admin, media and API

Public archive with sidebar navigation, project pages, month archive,
search and entry pages with image blocks. Admin area for brands,
projects, post types, users, api clients, media and the entry editor
with drag and drop images, preview per audience, scheduling and
publish checks. Read and write API with bearer tokens, audience
scoping, idempotent creation, OpenAPI document and editorial guide.
Magic link login with configurable allowed domains, whole app behind
the session gate. 456 tests including design rule checks.
This commit is contained in:
Matthias Giesselmann
2026-07-31 21:33:42 +02:00
commit b90ff252d1
291 changed files with 43671 additions and 0 deletions
+726
View File
@@ -0,0 +1,726 @@
{
"app": {
"name": "Logbuch",
"tagline": "Was zuletzt passiert ist, pro Projekt."
},
"header": {
"newEntry": "Eintrag schreiben",
"skipToContent": "Zum Inhalt springen"
},
"nav": {
"overview": "Übersicht",
"search": "Suchen",
"archive": "Nach Monat",
"sidebar": "Hauptnavigation",
"openMenu": "Menü öffnen",
"closeMenu": "Menü schließen",
"state": "Stand {number}",
"admin": "Verwaltung",
"toArchive": "Zum Logbuch"
},
"pagination": {
"previous": "Zurück",
"next": "Vor",
"status": "{from} - {to} von {total}"
},
"search": {
"title": "Suche",
"label": "Suchbegriff",
"placeholder": "Titel und Anreißer durchsuchen",
"submit": "Suchen",
"prompt": "Gib einen Suchbegriff ein.",
"found": "Treffer für „{query}“",
"empty": "Kein Eintrag zu „{query}“ gefunden. Versuch ein einzelnes Wort oder sieh dir die neuesten Einträge an.",
"emptyTitle": "Kein Treffer",
"promptTitle": "Wonach suchst du?",
"intro": "Durchsucht Titel und Anreißer aller veröffentlichten Einträge.",
"suggestions": "Zuletzt erschienen"
},
"post": {
"fields": {
"project": "Projekt",
"published": "Veröffentlicht",
"type": "Typ",
"author": "Autor",
"images": "Bilder",
"number": "Nummer"
},
"content": "Inhalt",
"empty": "Dieser Eintrag hat noch keinen Inhalt.",
"back": "Alle Einträge von {project}",
"details": "Angaben",
"readingTime": "{minutes} Min. Lesezeit",
"emptyTitle": "Noch kein Inhalt"
},
"block": {
"before": "Vorher",
"after": "Nachher",
"video": "Video ansehen",
"image": "Bild",
"gallery": "Galerie",
"open": "Bild vergrößern",
"close": "Schließen",
"previous": "Vorheriges Bild",
"next": "Nächstes Bild",
"position": "{index} von {total}",
"compare": "Vergleich verschieben",
"comparePosition": "{percent} Prozent vorher"
},
"notFound": {
"title": "Diese Seite steht nicht im Logbuch.",
"hint": "Diese Adresse gibt es nicht, oder der Eintrag ist nicht veröffentlicht.",
"home": "Zur Übersicht",
"next": "Von der Übersicht aus erreichst du jedes Projekt und jeden Eintrag. Wenn du einen bestimmten Eintrag suchst, hilft die Suche weiter.",
"nextTitle": "Was jetzt hilft",
"code": "404"
},
"theme": {
"label": "Farbmodus wechseln",
"light": "Hell",
"dark": "Dunkel",
"system": "System"
},
"overview": {
"title": "Was zuletzt passiert ist.",
"intro": "Alle zwei Wochen halten wir pro Projekt fest, was fertig geworden ist. Mit Bildern, in ganzen Sätzen, ohne Ticketnummern-Kauderwelsch.",
"allProjects": "Alle Projekte",
"empty": "Noch ist kein Beitrag veröffentlicht. Leg in der Verwaltung ein Projekt an und schreib den ersten Eintrag.",
"fields": {
"brands": "Flotte",
"period": "Zeitraum",
"entries": "Einträge",
"updated": "Stand"
},
"entryCount": "{total} gesamt, {recent} in den letzten {days} Tagen",
"period": "{from} - {to}",
"emptyTitle": "Noch nichts veröffentlicht",
"emptyFilteredTitle": "Nichts in diesem Zeitraum",
"emptyFiltered": "In diesem Zeitraum ist kein Eintrag erschienen. Setze die Eingrenzung zurück oder wähle einen anderen Monat.",
"emptyTypeTitle": "Nichts von dieser Art",
"emptyType": "Von dieser Art gibt es hier keinen Eintrag. Wähle eine andere Art oder zeig alle Einträge.",
"updated": "Zuletzt {date}",
"toAdmin": "Zur Verwaltung",
"emptyProject": "In diesem Projekt ist noch kein Eintrag veröffentlicht. Sieh dir die anderen Projekte an oder schreib den ersten Eintrag in der Verwaltung.",
"emptyPageTitle": "Diese Seite gibt es nicht",
"emptyPage": "So weit reicht die Liste nicht. Geh zurück auf die erste Seite.",
"firstPage": "Zur ersten Seite"
},
"entry": {
"latest": "Zuletzt",
"older": "Ältere Einträge",
"summary": "{count, plural, one {# Eintrag} other {# Einträge}} · {days} Tage",
"new": "Neu",
"read": "gelesen",
"unread": "ungelesen",
"number": "Eintrag {number}",
"images": "{count, plural, one {# Bild} other {# Bilder}}",
"next": "Weitere Einträge"
},
"archive": {
"title": "Archiv",
"all": "Alle Einträge",
"filtered": "Eingegrenzt auf {period}",
"entries": "{count, plural, one {# Eintrag} other {# Einträge}}",
"months": {
"1": "Jan",
"2": "Feb",
"3": "Mär",
"4": "Apr",
"5": "Mai",
"6": "Jun",
"7": "Jul",
"8": "Aug",
"9": "Sep",
"10": "Okt",
"11": "Nov",
"12": "Dez"
},
"firstPage": "Zur ersten Seite"
},
"inapp": {
"title": "In der Anwendung",
"hint": "Dieselben Einträge holt sich jede App über die API und zeigt sie im eigenen Design. Gelesen wird pro Nutzer der jeweiligen App gemerkt.",
"markAllRead": "Alles gelesen",
"open": "Im Logbuch öffnen",
"close": "Schließen"
},
"footer": {
"state": "Stand {date}"
},
"login": {
"eyebrow": "Verwaltung",
"title": "Anmelden",
"intro": "Melde dich an, um Projekte anzulegen und Beiträge zu schreiben.",
"email": "E-Mail-Adresse",
"password": "Passwort",
"submit": "Anmelden",
"pending": "Wird geprüft",
"back": "Zurück zum Logbuch",
"noAccount": "Konten legt die Verwaltung an. Wenn du noch keins hast, frag die Person, die das Logbuch betreut.",
"errors": {
"email": "Trag deine E-Mail-Adresse ein, so wie sie beim Konto hinterlegt ist.",
"password": "Trag dein Passwort ein.",
"credentials": "E-Mail-Adresse und Passwort passen nicht zusammen. Prüfe beides und versuch es noch einmal.",
"tooMany": "Zu viele Versuche kurz hintereinander. Warte eine Minute und versuch es dann erneut.",
"unknown": "Die Anmeldung hat gerade nicht geklappt. Versuch es in einem Moment noch einmal."
},
"magic": {
"title": "Mit Anmeldelink",
"intro": "Trag deine Adresse ein. Du bekommst einen Link per E-Mail, mit dem du dich ohne Passwort anmeldest.",
"email": "E-Mail-Adresse",
"submit": "Link schicken",
"pending": "Wird geschickt",
"sentTitle": "Der Link ist unterwegs",
"sent": "Wenn {email} sich anmelden darf, liegt gleich eine E-Mail mit dem Anmeldelink im Postfach.",
"sentHint": "Der Link gilt {minutes} Minuten und lässt sich einmal verwenden. Wenn nichts ankommt, sieh im Spam-Ordner nach.",
"again": "Andere Adresse verwenden",
"passwordTitle": "Lieber mit Passwort anmelden",
"linkFailed": "Dieser Anmeldelink gilt nicht mehr. Er läuft nach {minutes} Minuten ab und lässt sich nur einmal verwenden. Fordere einen neuen Link an.",
"errors": {
"email": "Trag eine vollständige E-Mail-Adresse ein, zum Beispiel name@nyo.de.",
"tooMany": "Für diese Adresse wurden gerade zu viele Links angefordert. Warte {minutes} Minuten und versuch es dann noch einmal."
}
}
},
"admin": {
"eyebrow": "Verwaltung",
"title": "Verwaltung",
"intro": "Hier legst du Projekte an und schreibst Beiträge.",
"signedInAs": "Angemeldet als {name}",
"signOut": "Abmelden",
"toArchive": "Zum Logbuch",
"projects": {
"eyebrow": "Verwaltung",
"title": "Projekte",
"intro": "Ein Projekt ist ein eigener Bereich im Logbuch, mit eigener Farbe, eigenem Kürzel und eigener Nummernreihe.",
"create": "Projekt anlegen",
"createTitle": "Neues Projekt",
"createIntro": "Name und Marke reichen zum Anfangen. Der Slug wird aus dem Namen vorgeschlagen und bleibt änderbar.",
"editIntro": "Änderungen gelten sofort, auch im Archiv.",
"save": "Speichern",
"saving": "Wird gespeichert",
"back": "Zurück zur Liste",
"toArchive": "Im Archiv ansehen",
"active": "Aktiv",
"inactive": "Stillgelegt",
"emptyTitle": "Noch kein Projekt",
"empty": "Es gibt noch kein Projekt. Lege das erste an, dann kannst du Beiträge und Bilder dafür anlegen.",
"noBrandsTitle": "Zuerst eine Marke",
"noBrands": "Ein Projekt gehört immer zu einer Marke. Lege zuerst eine Marke an, dann kannst du das Projekt anlegen.",
"toBrands": "Marke anlegen",
"columns": {
"name": "Name",
"code": "Kürzel",
"brand": "Marke",
"brandMissing": "Unbekannt",
"color": "Farbe",
"posts": "Beiträge",
"state": "Status",
"edit": "Bearbeiten"
},
"fields": {
"name": "Name",
"slug": "Slug",
"code": "Kürzel",
"brand": "Marke",
"brandEmpty": "Marke wählen",
"color": "Farbe",
"colorPicker": "Farbe auswählen",
"sort": "Sortierung",
"description": "Beschreibung",
"active": "Projekt ist aktiv"
},
"hints": {
"slug": "Teil der Adresse im Archiv, zum Beispiel /trakk. Kleinbuchstaben, Ziffern und Bindestriche.",
"code": "Steht auf der Kennplatte, höchstens vier Zeichen. Leer lassen, dann wird es aus dem Slug abgeleitet.",
"color": "Trägt Kennplatte und Balken. Als Hexwert, zum Beispiel #2e7d5b.",
"sort": "Kleinere Zahlen stehen weiter oben.",
"description": "Ein bis zwei Sätze, wofür das Projekt steht.",
"active": "Ein stillgelegtes Projekt erscheint weder im Archiv noch in der API."
}
},
"projectsMeta": "{count, plural, =0 {kein Projekt} one {# Projekt} other {# Projekte}}",
"emptyTitle": "Noch kein Projekt",
"empty": "Für dich ist noch kein Projekt freigeschaltet oder es ist noch keins angelegt.",
"role": {
"admin": "Verwaltung",
"moderator": "Moderator"
},
"noAccess": {
"title": "Noch nicht freigeschaltet",
"forNobody": "Dein Konto gibt es, aber es ist für kein Projekt freigeschaltet. Bitte die Person, die das Logbuch betreut, dich als Moderator für dein Projekt einzutragen.",
"forModerator": "Dieser Teil der Verwaltung ist Konten mit Verwaltungsrechten vorbehalten. Deine Projekte findest du auf der Übersicht.",
"toOverview": "Zur Übersicht",
"wrongAccount": "Falsches Konto? Melde dich ab und mit dem richtigen wieder an."
},
"yourProjects": "Deine Projekte",
"edit": "Bearbeiten",
"inactive": "Stillgelegt",
"emptyForAdmin": "Es gibt noch kein Projekt. Lege eins an, dann kannst du Beiträge und Bilder dafür anlegen.",
"emptyAction": "Projekt anlegen",
"nav": {
"label": "Bereiche der Verwaltung",
"overview": "Übersicht",
"posts": "Beiträge",
"media": "Medien",
"projects": "Projekte",
"brands": "Marken",
"users": "Benutzer",
"clients": "Zugänge",
"manage": "Verwalten",
"postTypes": "Beitragsarten",
"api": "API"
},
"messages": {
"created": "Angelegt.",
"updated": "Gespeichert.",
"forbidden": "Dafür fehlt deinem Konto das Recht. Nur die Verwaltung darf das ändern.",
"notFound": "Der Datensatz ist nicht mehr da. Lade die Seite neu.",
"invalid": "Bitte prüfe die markierten Felder.",
"slugTaken": "Diesen Slug gibt es schon. Wähle einen anderen.",
"selfAdmin": "Das eigene Verwaltungsrecht kannst du nicht ändern. Das muss ein anderes Verwaltungskonto tun.",
"typeInUse": "Diese Art wird noch benutzt. Nimm stattdessen den Haken bei Aktiv heraus."
},
"errors": {
"nameRequired": "Trag einen Namen ein.",
"slugInvalid": "Der Slug besteht aus Kleinbuchstaben, Ziffern und Bindestrichen, mindestens zwei Zeichen.",
"slugTaken": "Dieser Slug ist vergeben. Wähle einen anderen.",
"codeInvalid": "Das Kürzel hat höchstens vier Zeichen, nur Buchstaben und Ziffern.",
"colorInvalid": "Die Farbe braucht die Form #rrggbb.",
"brandUnknown": "Wähle eine Marke aus.",
"projectUnknown": "Wähle ein Projekt aus oder lass den Zugang für alle Projekte gelten.",
"sortInvalid": "Die Sortierung ist eine ganze Zahl von 0 bis 9999.",
"modeInvalid": "Wähle lesen oder schreiben.",
"scopeInvalid": "Wähle eine Zielgruppe.",
"tooLong": "Der Text ist zu lang.",
"invalid": "Dieser Wert passt nicht."
},
"entries": {
"eyebrow": "Verwaltung",
"title": "Beiträge",
"intro": "Titel eintippen, losschreiben, veröffentlichen. Projekt, Art und Zielgruppe sind vorbelegt.",
"listTitle": "Alle Beiträge",
"create": "Neuer Beitrag",
"createTitle": "Neuer Beitrag",
"editTitle": "Beitrag",
"back": "Zur Liste",
"meta": "{count, plural, =0 {kein Beitrag} one {# Beitrag} other {# Beiträge}}",
"noAuthor": "ohne Autor",
"emptyTitle": "Noch kein Beitrag",
"empty": "In deinen Projekten steht noch kein Beitrag. Schreib den ersten, das dauert keine zwei Minuten.",
"emptyFilteredTitle": "Kein Treffer",
"emptyFiltered": "Zu dieser Eingrenzung gibt es keinen Beitrag. Setz die Eingrenzung zurück oder ändere sie.",
"noProjectsTitle": "Noch kein Projekt",
"noProjects": "Für dich ist noch kein Projekt freigeschaltet. Bitte die Verwaltung, dich als Moderator einzutragen.",
"noProjectsForAdmin": "Es gibt noch kein Projekt. Lege eins an, dann kannst du Beiträge dafür schreiben.",
"toProjects": "Projekt anlegen",
"columns": {
"number": "Nummer",
"title": "Titel",
"project": "Projekt",
"type": "Art",
"audience": "Zielgruppe",
"status": "Status",
"date": "Datum",
"author": "Autor"
},
"pagination": {
"previous": "Zurück",
"next": "Vor",
"status": "Seite {page} von {pages}"
},
"filters": {
"project": "Projekt",
"allProjects": "Alle Projekte",
"status": "Status",
"allStatus": "Jeder Status",
"type": "Art",
"allTypes": "Alle Arten",
"search": "Suche",
"searchPlaceholder": "Titel und Anreißer",
"submit": "Anwenden",
"reset": "Eingrenzung zurücksetzen"
},
"status": {
"draft": "Entwurf",
"review": "Prüfung",
"scheduled": "Geplant",
"published": "Veröffentlicht",
"archived": "Zurückgezogen"
},
"audience": {
"internal": "Intern",
"customer": "Kunde",
"public": "Öffentlich"
},
"fields": {
"title": "Titel",
"titlePlaceholder": "Worum geht es?",
"teaser": "Anreißer",
"teaserPlaceholder": "Zwei Sätze, die den Beitrag zusammenfassen.",
"project": "Projekt",
"type": "Art",
"audience": "Zielgruppe",
"slug": "Slug",
"cover": "Aufmacherbild"
},
"hints": {
"audience": "Kunde sieht keine internen Beiträge, öffentlich sehen alle.",
"teaser": "Steht in der Liste und im Aufmacher. Leer lassen geht auch.",
"slug": "Teil der Adresse im Archiv. Leer lassen, dann wird er aus dem Titel gebildet.",
"cover": "Steht groß über dem Beitrag. Ohne Bild trägt die Kennplatte den Platz.",
"drop": "Bilder hierher ziehen oder mit Strg+V einfügen, auch mehrere auf einmal.",
"schedule": "Ein Termin in der Zukunft. Der Beitrag erscheint automatisch, sobald er erreicht ist.",
"projectMove": "Beim Wechsel bekommt der Beitrag die nächste freie Nummer im Zielprojekt."
},
"save": {
"idle": "Noch nichts gespeichert",
"pending": "Wird gespeichert",
"dirty": "Nicht gespeicherte Änderungen",
"saved": "Gespeichert um {time}",
"stored": "Zuletzt gespeichert {time}"
},
"schedule": {
"title": "Termin"
},
"actions": {
"save": "Speichern",
"publish": "Veröffentlichen",
"publishing": "Wird veröffentlicht",
"schedule": "Termin setzen",
"unschedule": "Termin zurücknehmen",
"archive": "Zurückziehen",
"resume": "Wieder als Entwurf",
"preview": "Vorschau",
"edit": "Bearbeiten",
"addBlock": "Block hinzufügen",
"remove": "Block entfernen",
"up": "Nach oben",
"down": "Nach unten",
"drag": "Block verschieben",
"choose": "Bild wählen",
"change": "Anderes Bild",
"clear": "Bild entfernen",
"upload": "Hochladen",
"close": "Schließen"
},
"blocks": {
"text": "Text",
"image": "Bild",
"gallery": "Galerie",
"before_after": "Vorher und nachher",
"video": "Video",
"quote": "Zitat",
"code": "Code",
"link": "Verweis",
"callout": "Hinweis"
},
"blockFields": {
"text": "Text",
"textPlaceholder": "Schreib in ganzen Sätzen. Eine Leerzeile trennt Absätze.",
"image": "Bild",
"gallery": "Bilder",
"galleryHint": "Die Reihenfolge entspricht der Auswahl.",
"before": "Vorher",
"after": "Nachher",
"video": "Videodatei",
"videoHint": "Ohne Datei genügt ein Verweis auf das Video.",
"url": "Adresse",
"label": "Beschriftung",
"description": "Beschreibung",
"quote": "Zitat",
"source": "Quelle",
"language": "Sprache",
"code": "Code",
"tone": "Ton",
"toneInfo": "Hinweis",
"toneWarning": "Warnung"
},
"media": {
"empty": "In diesem Projekt liegt noch kein Bild. Lade eins hoch oder zieh es in den Editor.",
"altMissing": "ohne Alt-Text"
},
"uploads": {
"pending": "{name} wird hochgeladen",
"done": "{name} ist hochgeladen",
"failed": "{name}: {reason}"
},
"preview": {
"scope": "Ansicht als",
"untitled": "Ohne Titel",
"empty": "Dieser Beitrag hat noch keinen Inhalt.",
"hiddenTitle": "Für diese Zielgruppe unsichtbar",
"hidden": "Als {scope} ist dieser Beitrag nicht zu sehen, er ist für {audience} bestimmt."
},
"checks": {
"blockersTitle": "Das hält das Veröffentlichen auf",
"title_missing": "Der Titel fehlt.",
"content_empty": "Der Beitrag hat noch keinen Inhalt.",
"alt_text_missing": "Ein Bild hat keinen Alt-Text. Bei öffentlichen Beiträgen ist er Pflicht.",
"tags_missing": "Noch kein Schlagwort vergeben.",
"cover_missing": "Noch kein Aufmacherbild gesetzt."
},
"errors": {
"forbidden": "Dafür fehlt deinem Konto das Recht.",
"projectUnknown": "Dieses Projekt gibt es nicht.",
"typeUnknown": "Diese Beitragsart steht nicht mehr zur Auswahl. Wähle eine andere.",
"projectLocked": "Das Projekt lässt sich nach dem Anlegen nicht mehr wechseln.",
"notFound": "Diesen Beitrag gibt es nicht mehr. Lade die Seite neu.",
"titleMissing": "Trag zuerst einen Titel ein.",
"titleTooLong": "Der Titel ist zu lang.",
"teaserTooLong": "Der Anreißer ist zu lang.",
"slugInvalid": "Der Slug besteht aus Kleinbuchstaben, Ziffern und Bindestrichen, mindestens zwei Zeichen.",
"slugTaken": "Diesen Slug gibt es in diesem Projekt schon.",
"blocksInvalid": "Ein Block ist unvollständig. Prüfe die Adressen und die Bilder.",
"blocked": "Veröffentlichen geht noch nicht.",
"statusInvalid": "Dieser Schritt ist aus dem aktuellen Status nicht möglich.",
"scheduleMissing": "Wähle einen Termin aus.",
"schedulePast": "Der Termin muss in der Zukunft liegen.",
"uploadFailed": "Das Hochladen hat gerade nicht geklappt. Versuch es in einem Moment noch einmal.",
"fileMissing": "Wähle eine Bilddatei aus.",
"fileTooLarge": "Die Datei ist größer als 15 MB. Verkleinere sie und versuch es noch einmal.",
"unsupportedType": "Dieses Format wird nicht angenommen. Nimm JPEG, PNG, WebP, AVIF, GIF oder TIFF.",
"unreadableImage": "Die Datei lässt sich nicht als Bild lesen. Prüfe, ob sie vollständig ist.",
"unknown": "Das hat gerade nicht geklappt. Versuch es noch einmal."
}
},
"brands": {
"eyebrow": "Verwaltung",
"title": "Marken",
"intro": "Marken fassen Projekte zusammen, zum Beispiel nach Firma. Jedes Projekt gehört zu genau einer Marke.",
"create": "Marke anlegen",
"createTitle": "Neue Marke",
"createIntro": "Name und Farbe genügen. Der Slug wird aus dem Namen vorgeschlagen.",
"editIntro": "Änderungen gelten sofort für alle Projekte dieser Marke.",
"save": "Speichern",
"saving": "Wird gespeichert",
"back": "Zurück zur Liste",
"emptyTitle": "Noch keine Marke",
"empty": "Es gibt noch keine Marke. Lege die erste an, danach kannst du Projekte anlegen.",
"columns": {
"name": "Name",
"slug": "Slug",
"color": "Farbe",
"projects": "Projekte",
"sort": "Sortierung",
"edit": "Bearbeiten"
},
"fields": {
"name": "Name",
"slug": "Slug",
"color": "Farbe",
"colorPicker": "Farbe auswählen",
"sort": "Sortierung"
},
"hints": {
"slug": "Kleinbuchstaben, Ziffern und Bindestriche.",
"color": "Als Hexwert, zum Beispiel #2b4a9b.",
"sort": "Kleinere Zahlen stehen weiter oben."
}
},
"postTypes": {
"eyebrow": "Verwaltung",
"title": "Beitragsarten",
"intro": "Beitragsarten kennzeichnen, worum es in einem Beitrag geht. Schlüssel, Bezeichnung, Farbe und Reihenfolge legst du hier fest.",
"create": "Beitragsart anlegen",
"createTitle": "Neue Beitragsart",
"createIntro": "Bezeichnung und Farbe genügen. Der Schlüssel wird aus der deutschen Bezeichnung vorgeschlagen.",
"editIntro": "Änderungen gelten sofort für alle Beiträge dieser Art.",
"save": "Speichern",
"saving": "Wird gespeichert",
"back": "Zurück zur Liste",
"emptyTitle": "Noch keine Beitragsart",
"empty": "Es gibt noch keine Beitragsart. Lege die erste an, danach kannst du Beiträge einordnen.",
"active": "Aktiv",
"inactive": "Stillgelegt",
"usage": "{count, plural, =0 {kein Beitrag} one {# Beitrag} other {# Beiträge}}",
"deleteTitle": "Löschen",
"delete": "Beitragsart löschen",
"deleting": "Wird gelöscht",
"deleteBlocked": "Diese Art wird von {count, plural, one {# Beitrag} other {# Beiträgen}} benutzt und lässt sich nicht löschen. Nimm den Haken bei Aktiv heraus, dann steht sie nicht mehr zur Auswahl.",
"columns": {
"label": "Bezeichnung",
"key": "Schlüssel",
"color": "Farbe",
"posts": "Beiträge",
"sort": "Sortierung",
"active": "Aktiv",
"edit": "Bearbeiten"
},
"fields": {
"labelDe": "Bezeichnung deutsch",
"labelEn": "Bezeichnung englisch",
"key": "Schlüssel",
"color": "Farbe",
"colorPicker": "Farbe auswählen",
"sort": "Sortierung",
"isActive": "Aktiv"
},
"hints": {
"key": "Kleinbuchstaben, Ziffern und Bindestriche. Steht so in der API.",
"color": "Als Hexwert, zum Beispiel #2b4a9b. Damit wird die Art am Beitrag gekennzeichnet.",
"sort": "Kleinere Zahlen stehen weiter vorn, in der Auswahl und in den Filtern.",
"isActive": "Nur aktive Arten stehen beim Schreiben zur Auswahl.",
"activeInUse": "Nur aktive Arten stehen beim Schreiben zur Auswahl. Beiträge, die diese Art schon tragen, behalten sie."
}
},
"users": {
"eyebrow": "Verwaltung",
"title": "Benutzer",
"intro": "Ein Konto braucht nur, wer schreibt. Lesen geht ohne Konto.",
"columns": {
"name": "Name",
"email": "E-Mail",
"role": "Recht",
"projects": "Projekte",
"edit": "Öffnen"
},
"roles": {
"admin": "Verwaltung",
"moderator": "Moderator"
},
"you": "du",
"all": "alle",
"back": "Zurück zur Liste",
"saving": "Wird gespeichert",
"emptyTitle": "Noch kein Konto",
"empty": "Es gibt noch kein Konto. Leg eins mit dem Befehl pnpm admin:create an.",
"newAccountTitle": "Neues Konto",
"newAccount": "Konten entstehen über den Befehl pnpm admin:create. Danach vergibst du hier die Rechte.",
"adminSection": "Verwaltungsrecht",
"isAdmin": "Dieses Konto verwaltet alles und hat Zugriff auf jedes Projekt.",
"isNotAdmin": "Dieses Konto arbeitet nur in den Projekten, für die es freigeschaltet ist.",
"grantAdmin": "Verwaltungsrecht geben",
"revokeAdmin": "Verwaltungsrecht entziehen",
"selfHint": "Am eigenen Konto lässt sich das Verwaltungsrecht nicht ändern.",
"rolesSection": "Projekte",
"assignedMeta": "{count, plural, =0 {kein Projekt} one {# Projekt} other {# Projekte}}",
"adminHasAll": "Das Konto hat Verwaltungsrecht und damit ohnehin Zugriff auf jedes Projekt. Die Freischaltungen hier greifen, sobald das Verwaltungsrecht entzogen wird.",
"grantRole": "Freischalten",
"revokeRole": "Entziehen",
"implicit": "über Verwaltungsrecht",
"rolesHint": "Ein Moderator legt Beiträge und Bilder seiner Projekte an und veröffentlicht sie.",
"noProjectsTitle": "Noch kein Projekt",
"noProjects": "Es gibt noch kein Projekt, das du freischalten könntest.",
"toProjects": "Projekt anlegen",
"accountSection": "Konto",
"accountHint": "Name, E-Mail und Passwort setzt der Befehl pnpm admin:create."
},
"clients": {
"eyebrow": "Verwaltung",
"title": "API-Zugänge",
"intro": "Anwendungen holen Beiträge über einen Zugang. Lesende Zugänge liefern veröffentlichte Beiträge ihrer Zielgruppe, schreibende legen Entwürfe an.",
"listTitle": "Zugänge",
"meta": "{count, plural, =0 {kein Zugang} one {# Zugang} other {# Zugänge}}",
"emptyTitle": "Noch kein Zugang",
"empty": "Es gibt noch keinen Zugang. Leg unten einen an, damit eine Anwendung Beiträge abrufen kann.",
"columns": {
"name": "Name",
"mode": "Modus",
"scope": "Zielgruppe",
"project": "Projekt",
"lastUsed": "Zuletzt genutzt",
"state": "Status",
"action": "Aktion"
},
"modes": {
"read": "Lesen",
"write": "Schreiben"
},
"scopes": {
"internal": "Intern",
"customer": "Kunde",
"public": "Öffentlich"
},
"allProjects": "Alle Projekte",
"unknownProject": "Unbekannt",
"never": "noch nie",
"activeState": "Aktiv",
"revoked": "Widerrufen",
"revoke": "Widerrufen",
"revoking": "Wird widerrufen",
"createTitle": "Zugang anlegen",
"createIntro": "Das Token wird einmal angezeigt und nur als Hash gespeichert. Wer es verliert, legt einen neuen Zugang an und widerruft den alten.",
"create": "Zugang anlegen",
"creating": "Wird angelegt",
"tokenTitle": "Token, nur jetzt sichtbar",
"tokenHint": "Kopier das Token jetzt und trag es in der Anwendung ein. Später lässt es sich nicht mehr anzeigen.",
"copy": "Token kopieren",
"copied": "Kopiert",
"fields": {
"name": "Name",
"mode": "Modus",
"scope": "Zielgruppe",
"project": "Projekt"
},
"hints": {
"name": "Woran du diesen Zugang später erkennst, zum Beispiel Trakk Web.",
"mode": "Lesen holt Beiträge. Schreiben legt Entwürfe an und lädt Bilder hoch.",
"scope": "Bestimmt, welche Beiträge der Zugang sieht. Kunde bekommt nie interne Beiträge.",
"project": "Ohne Bindung gilt der Zugang für alle Projekte."
},
"publishTitle": "Veröffentlichen",
"publishHint": "Kein Zugang darf veröffentlichen. Das bleibt an Konten gebunden."
}
},
"filter": {
"type": "Art",
"allTypes": "Alle Arten"
},
"media": {
"eyebrow": "Bilder",
"title": "Mediathek",
"intro": "Pro Projekt ein Bildbestand. Beim Hochladen entstehen automatisch WebP-Fassungen in mehreren Breiten.",
"back": "Alle Projekte",
"library": "Bestand",
"projectIntro": "Lade Bilder hoch und pflege Alt-Text und Bildunterschrift. Ohne Alt-Text lässt sich ein öffentlicher Beitrag nicht veröffentlichen.",
"projectMeta": "{count, plural, =0 {kein Bild} one {# Bild} other {# Bilder}}",
"emptyProjectsTitle": "Noch kein Projekt",
"emptyProjects": "Für dich ist noch kein Projekt freigeschaltet oder es ist noch keins angelegt.",
"emptyLibraryTitle": "Noch kein Bild",
"emptyLibrary": "In diesem Projekt liegt noch kein Bild. Lade das erste über das Feld oben hoch.",
"upload": {
"title": "Bild hochladen",
"hint": "JPEG, PNG, WebP, AVIF, GIF oder TIFF. Das Original bleibt erhalten, die Fassungen entstehen daraus.",
"file": "Datei",
"submit": "Hochladen",
"pending": "Wird verarbeitet",
"limit": "Höchstens 15 MB"
},
"fields": {
"alt": "Alt-Text",
"altHint": "Bei öffentlichen Beiträgen Pflicht, sonst eine Empfehlung.",
"altPlaceholder": "Was ist auf dem Bild zu sehen?",
"caption": "Bildunterschrift"
},
"meta": {
"submit": "Speichern",
"pending": "Wird gespeichert"
},
"card": {
"meta": "{width} × {height} · {size} KB · {variants, plural, =0 {keine Fassung} one {# Fassung} other {# Fassungen}}",
"altMissing": "Ohne Alt-Text. Für öffentliche Beiträge ist er Pflicht.",
"variantError": "Die Fassungen konnten nicht erzeugt werden. Das Original ist gespeichert und nutzbar."
},
"messages": {
"uploaded": "Das Bild ist hochgeladen und die Fassungen sind erzeugt.",
"saved": "Alt-Text und Bildunterschrift sind gespeichert.",
"fileMissing": "Wähle eine Bilddatei aus.",
"fileTooLarge": "Die Datei ist größer als 15 MB. Verkleinere sie und versuch es noch einmal.",
"unsupportedType": "Dieses Format wird nicht angenommen. Nimm JPEG, PNG, WebP, AVIF, GIF oder TIFF.",
"unreadableImage": "Die Datei lässt sich nicht als Bild lesen. Prüfe, ob sie vollständig ist.",
"projectUnknown": "Dieses Projekt gibt es nicht.",
"mediaUnknown": "Dieses Bild gibt es nicht mehr.",
"uploadFailed": "Das Hochladen hat gerade nicht geklappt. Versuch es in einem Moment noch einmal."
}
},
"mail": {
"magicLink": {
"subject": "Dein Anmeldelink für das Logbuch",
"greeting": "Hallo,",
"body": "hier ist dein Anmeldelink für das Logbuch. Er gilt {minutes} Minuten und lässt sich einmal verwenden.",
"ignore": "Wenn du keinen Link angefordert hast, ignoriere diese Nachricht. Ohne den Link passiert nichts.",
"signature": "Logbuch"
}
}
}
+726
View File
@@ -0,0 +1,726 @@
{
"app": {
"name": "Logbuch",
"tagline": "What happened lately, per project."
},
"header": {
"newEntry": "Write entry",
"skipToContent": "Skip to content"
},
"nav": {
"overview": "Overview",
"search": "Search",
"archive": "By month",
"sidebar": "Main navigation",
"openMenu": "Open menu",
"closeMenu": "Close menu",
"state": "State {number}",
"admin": "Admin",
"toArchive": "To the log"
},
"pagination": {
"previous": "Back",
"next": "Next",
"status": "{from} - {to} of {total}"
},
"search": {
"title": "Search",
"label": "Search term",
"placeholder": "Search titles and teasers",
"submit": "Search",
"prompt": "Enter a search term.",
"found": "Matches for “{query}”",
"empty": "No entry found for “{query}”. Try a single word or take a look at the latest entries.",
"emptyTitle": "No match",
"promptTitle": "What are you looking for?",
"intro": "Searches titles and teasers of all published entries.",
"suggestions": "Published lately"
},
"post": {
"fields": {
"project": "Project",
"published": "Published",
"type": "Type",
"author": "Author",
"images": "Images",
"number": "Number"
},
"content": "Content",
"empty": "This entry has no content yet.",
"back": "All entries of {project}",
"details": "Details",
"readingTime": "{minutes} min read",
"emptyTitle": "No content yet"
},
"block": {
"before": "Before",
"after": "After",
"video": "Watch video",
"image": "Image",
"gallery": "Gallery",
"open": "Enlarge image",
"close": "Close",
"previous": "Previous image",
"next": "Next image",
"position": "{index} of {total}",
"compare": "Move the comparison",
"comparePosition": "{percent} percent before"
},
"notFound": {
"title": "This page is not in the logbook.",
"hint": "This address does not exist, or the entry is not published.",
"home": "To the overview",
"next": "From the overview you can reach every project and every entry. If you are looking for a specific entry, the search will help.",
"nextTitle": "What helps now",
"code": "404"
},
"theme": {
"label": "Change colour mode",
"light": "Light",
"dark": "Dark",
"system": "System"
},
"overview": {
"title": "What happened lately.",
"intro": "Every two weeks we write down per project what has been finished. With images, in full sentences, without ticket number gibberish.",
"allProjects": "All projects",
"empty": "No entry published yet. Create a project in the administration and write the first entry.",
"fields": {
"brands": "Fleet",
"period": "Period",
"entries": "Entries",
"updated": "Updated"
},
"entryCount": "{total} in total, {recent} within the last {days} days",
"period": "{from} - {to}",
"emptyTitle": "Nothing published yet",
"emptyFilteredTitle": "Nothing in this period",
"emptyFiltered": "No entry appeared in this period. Reset the filter or pick another month.",
"emptyTypeTitle": "Nothing of this kind",
"emptyType": "There is no entry of this kind here. Pick another kind or show all entries.",
"updated": "Last {date}",
"toAdmin": "To the administration",
"emptyProject": "No entry published in this project yet. Take a look at the other projects or write the first entry in the administration.",
"emptyPageTitle": "This page does not exist",
"emptyPage": "The list does not reach that far. Go back to the first page.",
"firstPage": "To the first page"
},
"entry": {
"latest": "Latest",
"older": "Older entries",
"summary": "{count, plural, one {# entry} other {# entries}} · {days} days",
"new": "New",
"read": "read",
"unread": "unread",
"number": "Entry {number}",
"images": "{count, plural, one {# image} other {# images}}",
"next": "More entries"
},
"archive": {
"title": "Archive",
"all": "All entries",
"filtered": "Narrowed down to {period}",
"entries": "{count, plural, one {# entry} other {# entries}}",
"months": {
"1": "Jan",
"2": "Feb",
"3": "Mar",
"4": "Apr",
"5": "May",
"6": "Jun",
"7": "Jul",
"8": "Aug",
"9": "Sep",
"10": "Oct",
"11": "Nov",
"12": "Dec"
},
"firstPage": "To the first page"
},
"inapp": {
"title": "Inside the application",
"hint": "Every app fetches the same entries through the API and renders them in its own design. Read state is kept per user of the respective app.",
"markAllRead": "Mark all read",
"open": "Open in Logbuch",
"close": "Close"
},
"footer": {
"state": "Updated {date}"
},
"login": {
"eyebrow": "Administration",
"title": "Sign in",
"intro": "Sign in to create projects and write entries.",
"email": "Email address",
"password": "Password",
"submit": "Sign in",
"pending": "Checking",
"back": "Back to Logbuch",
"noAccount": "Accounts are created by the administration. If you do not have one yet, ask the person who looks after Logbuch.",
"errors": {
"email": "Enter your email address exactly as it is stored on the account.",
"password": "Enter your password.",
"credentials": "Email address and password do not match. Check both and try again.",
"tooMany": "Too many attempts in a row. Wait a minute and try again.",
"unknown": "Signing in did not work just now. Try again in a moment."
},
"magic": {
"title": "With a sign-in link",
"intro": "Enter your address. You will receive a link by email that signs you in without a password.",
"email": "Email address",
"submit": "Send link",
"pending": "Sending",
"sentTitle": "The link is on its way",
"sent": "If {email} is allowed to sign in, an email with the sign-in link will arrive shortly.",
"sentHint": "The link is valid for {minutes} minutes and can be used once. If nothing arrives, check the spam folder.",
"again": "Use a different address",
"passwordTitle": "Sign in with a password instead",
"linkFailed": "This sign-in link is no longer valid. It expires after {minutes} minutes and can only be used once. Request a new link.",
"errors": {
"email": "Enter a complete email address, for example name@nyo.de.",
"tooMany": "Too many links have just been requested for this address. Wait {minutes} minutes and try again."
}
}
},
"admin": {
"eyebrow": "Administration",
"title": "Administration",
"intro": "This is where you create projects and write entries.",
"signedInAs": "Signed in as {name}",
"signOut": "Sign out",
"toArchive": "To Logbuch",
"projects": {
"eyebrow": "Administration",
"title": "Projects",
"intro": "A project is its own section in Logbuch, with its own colour, code and running number.",
"create": "Create project",
"createTitle": "New project",
"createIntro": "Name and brand are enough to start. The slug is suggested from the name and stays editable.",
"editIntro": "Changes take effect right away, in the archive as well.",
"save": "Save",
"saving": "Saving",
"back": "Back to the list",
"toArchive": "View in the archive",
"active": "Active",
"inactive": "Retired",
"emptyTitle": "No project yet",
"empty": "There is no project yet. Create the first one, then you can add entries and images for it.",
"noBrandsTitle": "A brand first",
"noBrands": "A project always belongs to a brand. Create a brand first, then you can create the project.",
"toBrands": "Create brand",
"columns": {
"name": "Name",
"code": "Code",
"brand": "Brand",
"brandMissing": "Unknown",
"color": "Colour",
"posts": "Entries",
"state": "State",
"edit": "Edit"
},
"fields": {
"name": "Name",
"slug": "Slug",
"code": "Code",
"brand": "Brand",
"brandEmpty": "Pick a brand",
"color": "Colour",
"colorPicker": "Pick a colour",
"sort": "Sorting",
"description": "Description",
"active": "Project is active"
},
"hints": {
"slug": "Part of the archive address, for example /trakk. Lower case letters, digits and hyphens.",
"code": "Shown on the plate, at most four characters. Leave empty to derive it from the slug.",
"color": "Carries plate and bar. As a hex value, for example #2e7d5b.",
"sort": "Smaller numbers come first.",
"description": "One or two sentences on what the project is about.",
"active": "A retired project shows up neither in the archive nor in the API."
}
},
"projectsMeta": "{count, plural, =0 {no project} one {# project} other {# projects}}",
"emptyTitle": "No project yet",
"empty": "No project has been released for you yet, or none has been created.",
"role": {
"admin": "Administration",
"moderator": "Moderator"
},
"noAccess": {
"title": "Not released yet",
"forNobody": "Your account exists, but it is not released for any project. Ask the person who looks after Logbuch to add you as a moderator for your project.",
"forModerator": "This part of the administration is reserved for accounts with administration rights. You find your projects on the overview.",
"toOverview": "To the overview",
"wrongAccount": "Wrong account? Sign out and sign in with the right one."
},
"yourProjects": "Your projects",
"edit": "Edit",
"inactive": "Retired",
"emptyForAdmin": "There is no project yet. Create one, then you can add entries and images for it.",
"emptyAction": "Create project",
"nav": {
"label": "Administration sections",
"overview": "Overview",
"posts": "Entries",
"media": "Media",
"projects": "Projects",
"brands": "Brands",
"users": "Users",
"clients": "Access",
"manage": "Manage",
"postTypes": "Post types",
"api": "API"
},
"messages": {
"created": "Created.",
"updated": "Saved.",
"forbidden": "Your account is missing the right for this. Only administration may change it.",
"notFound": "That record is gone. Reload the page.",
"invalid": "Please check the marked fields.",
"slugTaken": "That slug already exists. Pick another one.",
"selfAdmin": "You cannot change the administration right on your own account. Another administration account has to do it.",
"typeInUse": "This type is still in use. Clear the active checkbox instead."
},
"errors": {
"nameRequired": "Enter a name.",
"slugInvalid": "A slug is made of lower case letters, digits and hyphens, at least two characters.",
"slugTaken": "That slug is taken. Pick another one.",
"codeInvalid": "The code holds at most four characters, letters and digits only.",
"colorInvalid": "The colour needs the form #rrggbb.",
"brandUnknown": "Pick a brand.",
"projectUnknown": "Pick a project or let the access cover all projects.",
"sortInvalid": "Sorting is a whole number from 0 to 9999.",
"modeInvalid": "Pick read or write.",
"scopeInvalid": "Pick an audience.",
"tooLong": "That text is too long.",
"invalid": "That value does not fit."
},
"entries": {
"eyebrow": "Administration",
"title": "Entries",
"intro": "Type a title, start writing, publish. Project, type and audience come preset.",
"listTitle": "All entries",
"create": "New entry",
"createTitle": "New entry",
"editTitle": "Entry",
"back": "To the list",
"meta": "{count, plural, =0 {no entry} one {# entry} other {# entries}}",
"noAuthor": "no author",
"emptyTitle": "No entry yet",
"empty": "There is no entry in your projects yet. Write the first one, it takes less than two minutes.",
"emptyFilteredTitle": "No match",
"emptyFiltered": "No entry matches this filter. Reset it or pick different values.",
"noProjectsTitle": "No project yet",
"noProjects": "No project has been released for you yet. Ask administration to add you as a moderator.",
"noProjectsForAdmin": "There is no project yet. Create one, then you can write entries for it.",
"toProjects": "Create project",
"columns": {
"number": "Number",
"title": "Title",
"project": "Project",
"type": "Type",
"audience": "Audience",
"status": "Status",
"date": "Date",
"author": "Author"
},
"pagination": {
"previous": "Back",
"next": "Next",
"status": "Page {page} of {pages}"
},
"filters": {
"project": "Project",
"allProjects": "All projects",
"status": "Status",
"allStatus": "Any status",
"type": "Type",
"allTypes": "All types",
"search": "Search",
"searchPlaceholder": "Title and teaser",
"submit": "Apply",
"reset": "Reset filter"
},
"status": {
"draft": "Draft",
"review": "Review",
"scheduled": "Scheduled",
"published": "Published",
"archived": "Withdrawn"
},
"audience": {
"internal": "Internal",
"customer": "Customer",
"public": "Public"
},
"fields": {
"title": "Title",
"titlePlaceholder": "What is it about?",
"teaser": "Teaser",
"teaserPlaceholder": "Two sentences that sum up the entry.",
"project": "Project",
"type": "Type",
"audience": "Audience",
"slug": "Slug",
"cover": "Cover image"
},
"hints": {
"audience": "Customers never see internal entries, public is visible to everyone.",
"teaser": "Shown in the list and in the lead. Leaving it empty is fine.",
"slug": "Part of the address in the archive. Leave it empty to derive it from the title.",
"cover": "Sits large above the entry. Without an image the plate takes that space.",
"drop": "Drag images here or paste them with Ctrl+V, several at once works.",
"schedule": "A moment in the future. The entry appears automatically once it is reached.",
"projectMove": "On a move the entry receives the next free number in the target project."
},
"save": {
"idle": "Nothing saved yet",
"pending": "Saving",
"dirty": "Unsaved changes",
"saved": "Saved at {time}",
"stored": "Last saved {time}"
},
"schedule": {
"title": "Schedule"
},
"actions": {
"save": "Save",
"publish": "Publish",
"publishing": "Publishing",
"schedule": "Set date",
"unschedule": "Drop date",
"archive": "Withdraw",
"resume": "Back to draft",
"preview": "Preview",
"edit": "Edit",
"addBlock": "Add block",
"remove": "Remove block",
"up": "Move up",
"down": "Move down",
"drag": "Move block",
"choose": "Choose image",
"change": "Other image",
"clear": "Remove image",
"upload": "Upload",
"close": "Close"
},
"blocks": {
"text": "Text",
"image": "Image",
"gallery": "Gallery",
"before_after": "Before and after",
"video": "Video",
"quote": "Quote",
"code": "Code",
"link": "Link",
"callout": "Callout"
},
"blockFields": {
"text": "Text",
"textPlaceholder": "Write in full sentences. An empty line separates paragraphs.",
"image": "Image",
"gallery": "Images",
"galleryHint": "The order follows your selection.",
"before": "Before",
"after": "After",
"video": "Video file",
"videoHint": "Without a file a link to the video is enough.",
"url": "Address",
"label": "Label",
"description": "Description",
"quote": "Quote",
"source": "Source",
"language": "Language",
"code": "Code",
"tone": "Tone",
"toneInfo": "Note",
"toneWarning": "Warning"
},
"media": {
"empty": "This project has no image yet. Upload one or drag it into the editor.",
"altMissing": "no alt text"
},
"uploads": {
"pending": "{name} is uploading",
"done": "{name} is uploaded",
"failed": "{name}: {reason}"
},
"preview": {
"scope": "View as",
"untitled": "Untitled",
"empty": "This entry has no content yet.",
"hiddenTitle": "Invisible for this audience",
"hidden": "As {scope} this entry is not visible, it is meant for {audience}."
},
"checks": {
"blockersTitle": "This holds publishing back",
"title_missing": "The title is missing.",
"content_empty": "The entry has no content yet.",
"alt_text_missing": "An image has no alt text. Public entries require one.",
"tags_missing": "No tag set yet.",
"cover_missing": "No cover image set yet."
},
"errors": {
"forbidden": "Your account lacks the right for this.",
"projectUnknown": "This project does not exist.",
"typeUnknown": "This post type is no longer available. Pick a different one.",
"projectLocked": "The project cannot be changed once the entry exists.",
"notFound": "This entry is gone. Reload the page.",
"titleMissing": "Enter a title first.",
"titleTooLong": "The title is too long.",
"teaserTooLong": "The teaser is too long.",
"slugInvalid": "The slug consists of lowercase letters, digits and hyphens, at least two characters.",
"slugTaken": "This slug already exists in this project.",
"blocksInvalid": "A block is incomplete. Check the addresses and the images.",
"blocked": "Publishing is not possible yet.",
"statusInvalid": "This step is not possible from the current status.",
"scheduleMissing": "Pick a date and time.",
"schedulePast": "The date has to be in the future.",
"uploadFailed": "The upload did not work just now. Try again in a moment.",
"fileMissing": "Choose an image file.",
"fileTooLarge": "The file is larger than 15 MB. Shrink it and try again.",
"unsupportedType": "This format is not accepted. Use JPEG, PNG, WebP, AVIF, GIF or TIFF.",
"unreadableImage": "The file cannot be read as an image. Check whether it is complete.",
"unknown": "That did not work just now. Try again."
}
},
"brands": {
"eyebrow": "Administration",
"title": "Brands",
"intro": "Brands group projects, by company for example. Every project belongs to exactly one brand.",
"create": "Create brand",
"createTitle": "New brand",
"createIntro": "Name and colour are enough. The slug is suggested from the name.",
"editIntro": "Changes take effect right away for all projects of this brand.",
"save": "Save",
"saving": "Saving",
"back": "Back to the list",
"emptyTitle": "No brand yet",
"empty": "There is no brand yet. Create the first one, then you can create projects.",
"columns": {
"name": "Name",
"slug": "Slug",
"color": "Colour",
"projects": "Projects",
"sort": "Sorting",
"edit": "Edit"
},
"fields": {
"name": "Name",
"slug": "Slug",
"color": "Colour",
"colorPicker": "Pick a colour",
"sort": "Sorting"
},
"hints": {
"slug": "Lower case letters, digits and hyphens.",
"color": "As a hex value, for example #2b4a9b.",
"sort": "Smaller numbers come first."
}
},
"postTypes": {
"eyebrow": "Admin",
"title": "Post types",
"intro": "Post types mark what a post is about. Key, label, colour and order are set here.",
"create": "Add post type",
"createTitle": "New post type",
"createIntro": "Label and colour are enough. The key is derived from the German label.",
"editIntro": "Changes apply at once to every post of this type.",
"save": "Save",
"saving": "Saving",
"back": "Back to the list",
"emptyTitle": "No post type yet",
"empty": "There is no post type yet. Add the first one, then you can classify posts.",
"active": "Active",
"inactive": "Retired",
"usage": "{count, plural, =0 {no post} one {# post} other {# posts}}",
"deleteTitle": "Delete",
"delete": "Delete post type",
"deleting": "Deleting",
"deleteBlocked": "This type is used by {count, plural, one {# post} other {# posts}} and cannot be deleted. Clear the active checkbox instead, then it is no longer offered.",
"columns": {
"label": "Label",
"key": "Key",
"color": "Colour",
"posts": "Posts",
"sort": "Order",
"active": "Active",
"edit": "Edit"
},
"fields": {
"labelDe": "Label German",
"labelEn": "Label English",
"key": "Key",
"color": "Colour",
"colorPicker": "Pick a colour",
"sort": "Order",
"isActive": "Active"
},
"hints": {
"key": "Lower case letters, digits and hyphens. This is what the API reports.",
"color": "As a hex value, for example #2b4a9b. It marks the type on a post.",
"sort": "Smaller numbers come first, in the picker and in the filters.",
"isActive": "Only active types are offered while writing.",
"activeInUse": "Only active types are offered while writing. Posts that already carry this type keep it."
}
},
"users": {
"eyebrow": "Administration",
"title": "Users",
"intro": "Only people who write need an account. Reading works without one.",
"columns": {
"name": "Name",
"email": "Email",
"role": "Right",
"projects": "Projects",
"edit": "Open"
},
"roles": {
"admin": "Administration",
"moderator": "Moderator"
},
"you": "you",
"all": "all",
"back": "Back to the list",
"saving": "Saving",
"emptyTitle": "No account yet",
"empty": "There is no account yet. Create one with the command pnpm admin:create.",
"newAccountTitle": "New account",
"newAccount": "Accounts are created with the command pnpm admin:create. After that you hand out the rights here.",
"adminSection": "Administration right",
"isAdmin": "This account administers everything and reaches every project.",
"isNotAdmin": "This account works only in the projects it has been released for.",
"grantAdmin": "Grant administration right",
"revokeAdmin": "Revoke administration right",
"selfHint": "The administration right cannot be changed on your own account.",
"rolesSection": "Projects",
"assignedMeta": "{count, plural, =0 {no project} one {# project} other {# projects}}",
"adminHasAll": "This account holds the administration right and reaches every project anyway. The releases below apply once the administration right is revoked.",
"grantRole": "Release",
"revokeRole": "Withdraw",
"implicit": "through administration right",
"rolesHint": "A moderator creates and publishes entries and images of their projects.",
"noProjectsTitle": "No project yet",
"noProjects": "There is no project you could release yet.",
"toProjects": "Create project",
"accountSection": "Account",
"accountHint": "Name, email and password are set by the command pnpm admin:create."
},
"clients": {
"eyebrow": "Administration",
"title": "API access",
"intro": "Applications fetch entries through an access. Read access delivers published entries of its audience, write access creates drafts.",
"listTitle": "Access",
"meta": "{count, plural, =0 {no access} one {# access} other {# accesses}}",
"emptyTitle": "No access yet",
"empty": "There is no access yet. Create one below so an application can fetch entries.",
"columns": {
"name": "Name",
"mode": "Mode",
"scope": "Audience",
"project": "Project",
"lastUsed": "Last used",
"state": "State",
"action": "Action"
},
"modes": {
"read": "Read",
"write": "Write"
},
"scopes": {
"internal": "Internal",
"customer": "Customer",
"public": "Public"
},
"allProjects": "All projects",
"unknownProject": "Unknown",
"never": "never",
"activeState": "Active",
"revoked": "Revoked",
"revoke": "Revoke",
"revoking": "Revoking",
"createTitle": "Create access",
"createIntro": "The token is shown once and stored as a hash only. Whoever loses it creates a new access and revokes the old one.",
"create": "Create access",
"creating": "Creating",
"tokenTitle": "Token, visible now only",
"tokenHint": "Copy the token now and put it into the application. It cannot be shown again later.",
"copy": "Copy token",
"copied": "Copied",
"fields": {
"name": "Name",
"mode": "Mode",
"scope": "Audience",
"project": "Project"
},
"hints": {
"name": "How you recognise this access later, for example Trakk Web.",
"mode": "Read fetches entries. Write creates drafts and uploads images.",
"scope": "Decides which entries the access sees. Customer never gets internal entries.",
"project": "Without a binding the access covers all projects."
},
"publishTitle": "Publishing",
"publishHint": "No access may publish. That stays bound to accounts."
}
},
"filter": {
"type": "Type",
"allTypes": "All types"
},
"media": {
"eyebrow": "Images",
"title": "Media library",
"intro": "One image stock per project. Uploading creates WebP renditions in several widths automatically.",
"back": "All projects",
"library": "Stock",
"projectIntro": "Upload images and maintain alt text and caption. Without alt text a public entry cannot be published.",
"projectMeta": "{count, plural, =0 {no image} one {# image} other {# images}}",
"emptyProjectsTitle": "No project yet",
"emptyProjects": "No project has been released for you yet, or none has been created.",
"emptyLibraryTitle": "No image yet",
"emptyLibrary": "This project holds no image yet. Upload the first one with the field above.",
"upload": {
"title": "Upload image",
"hint": "JPEG, PNG, WebP, AVIF, GIF or TIFF. The original is kept, the renditions are made from it.",
"file": "File",
"submit": "Upload",
"pending": "Processing",
"limit": "15 MB at most"
},
"fields": {
"alt": "Alt text",
"altHint": "Mandatory for public entries, a recommendation otherwise.",
"altPlaceholder": "What can be seen in the image?",
"caption": "Caption"
},
"meta": {
"submit": "Save",
"pending": "Saving"
},
"card": {
"meta": "{width} × {height} · {size} KB · {variants, plural, =0 {no rendition} one {# rendition} other {# renditions}}",
"altMissing": "No alt text. It is mandatory for public entries.",
"variantError": "The renditions could not be created. The original is stored and usable."
},
"messages": {
"uploaded": "The image is uploaded and the renditions are created.",
"saved": "Alt text and caption are saved.",
"fileMissing": "Pick an image file.",
"fileTooLarge": "The file is larger than 15 MB. Shrink it and try again.",
"unsupportedType": "This format is not accepted. Use JPEG, PNG, WebP, AVIF, GIF or TIFF.",
"unreadableImage": "The file cannot be read as an image. Check whether it is complete.",
"projectUnknown": "This project does not exist.",
"mediaUnknown": "This image no longer exists.",
"uploadFailed": "Uploading did not work just now. Try again in a moment."
}
},
"mail": {
"magicLink": {
"subject": "Your sign-in link for Logbuch",
"greeting": "Hello,",
"body": "here is your sign-in link for Logbuch. It is valid for {minutes} minutes and can be used once.",
"ignore": "If you did not request a link, ignore this message. Nothing happens without the link.",
"signature": "Logbuch"
}
}
}