Files
logbuch/messages/en.json
T
Matthias Giesselmann b90ff252d1 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.
2026-07-31 21:33:42 +02:00

727 lines
26 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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"
}
}
}