2026-08-23 23:18:14 +02:00
|
|
|
/**
|
|
|
|
|
* English dictionary — the reference locale.
|
|
|
|
|
*
|
|
|
|
|
* Every other locale implements the `Dictionary` type derived from this file,
|
|
|
|
|
* so adding a key here is a type error in `de.ts` until it is translated.
|
|
|
|
|
* Values are plain strings, or functions when a count or a name is interpolated
|
|
|
|
|
* (a locale is free to pluralise differently — German "Alben" is not "Albums").
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
const plural = (n: number, one: string, other: string) => `${n} ${n === 1 ? one : other}`;
|
|
|
|
|
|
|
|
|
|
export const en = {
|
|
|
|
|
/** Passed to `toLocaleDateString` for visitor-facing dates. */
|
|
|
|
|
dateLocale: 'en-US',
|
|
|
|
|
|
|
|
|
|
nav: {
|
|
|
|
|
home: 'Home',
|
|
|
|
|
about: 'About',
|
|
|
|
|
map: 'Map',
|
|
|
|
|
journal: 'Journal',
|
|
|
|
|
skipToContent: 'Skip to content',
|
2026-09-22 14:12:13 +02:00
|
|
|
openMenu: 'Open menu',
|
|
|
|
|
closeMenu: 'Close menu',
|
2026-08-23 23:18:14 +02:00
|
|
|
},
|
|
|
|
|
|
|
|
|
|
common: {
|
|
|
|
|
backTo: (label: string) => `Back to ${label}`,
|
|
|
|
|
backToGallery: 'Back to Gallery',
|
|
|
|
|
backToJournal: 'Back to Journal',
|
|
|
|
|
home: 'Home',
|
|
|
|
|
photos: (n: number) => plural(n, 'photo', 'photos'),
|
|
|
|
|
albums: (n: number) => plural(n, 'album', 'albums'),
|
|
|
|
|
collections: (n: number) => plural(n, 'collection', 'collections'),
|
release: v0.13.0 (#535)
Twenty-nine commits since v0.12.0. See CHANGELOG.md for the full list
and the upgrade notes.
Ten additions — the SEO package (site URL, robots.txt, sitemap.xml,
JSON-LD), slideshow mode, opt-in original downloads, copy-link,
previous/next album navigation, alt text from the Immich description,
per-album location precision, the update notice, a Help tab, and a
subpage cover grid separate from its photo grid. Two fixes: CJK album
slugs, and the lightbox control bar.
Photo of the Day (#476) was built on `dev` and reverted as not planned;
it never appears in a release.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01DmsHVRL9yQvckUB1ZpVWre
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: ralksta <ralksta@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 10:08:12 +02:00
|
|
|
prevAlbum: 'Previous album',
|
|
|
|
|
nextAlbum: 'Next album',
|
|
|
|
|
prevAlbumAria: (name: string) => `Previous album: ${name}`,
|
|
|
|
|
nextAlbumAria: (name: string) => `Next album: ${name}`,
|
|
|
|
|
albumNavAria: 'Album navigation',
|
2026-09-22 14:12:13 +02:00
|
|
|
prevEntry: 'Previous entry',
|
|
|
|
|
nextEntry: 'Next entry',
|
|
|
|
|
prevEntryAria: (title: string) => `Previous entry: ${title}`,
|
|
|
|
|
nextEntryAria: (title: string) => `Next entry: ${title}`,
|
|
|
|
|
entryNavAria: 'Journal entry navigation',
|
2026-08-23 23:18:14 +02:00
|
|
|
loadingGallery: 'Loading gallery',
|
|
|
|
|
loadingPhotos: 'Loading photos',
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
home: {
|
|
|
|
|
enter: 'Enter',
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
error: {
|
|
|
|
|
notFoundTitle: 'Not found',
|
|
|
|
|
notFoundText: 'This page does not exist, or the album is no longer published.',
|
|
|
|
|
errorTitle: 'Something went wrong',
|
|
|
|
|
errorText:
|
|
|
|
|
'This page could not be loaded right now. It is usually temporary — try again in a moment.',
|
|
|
|
|
siteErrorText:
|
|
|
|
|
'This site could not be loaded right now. It is usually temporary — try again in a moment.',
|
|
|
|
|
tryAgain: 'Try again',
|
|
|
|
|
reference: (digest: string) => `Reference: ${digest}`,
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
theme: {
|
|
|
|
|
switchToLight: 'Switch to light mode',
|
|
|
|
|
switchToDark: 'Switch to dark mode',
|
|
|
|
|
scrollToTop: 'Scroll to top',
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
password: {
|
|
|
|
|
subtitle: 'This gallery is password-protected.',
|
|
|
|
|
siteSubtitle: 'This site is password-protected.',
|
|
|
|
|
placeholder: 'Enter password',
|
|
|
|
|
submit: 'Enter',
|
|
|
|
|
verifying: 'Verifying…',
|
|
|
|
|
incorrect: 'Incorrect password. Please try again.',
|
|
|
|
|
failed: 'Unable to verify password. Please try again later.',
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
about: {
|
|
|
|
|
kicker: 'About',
|
|
|
|
|
title: 'About',
|
|
|
|
|
metaTitle: (name: string) => `About — ${name}`,
|
|
|
|
|
portraitAlt: 'Portrait',
|
|
|
|
|
gear: 'Gear',
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
map: {
|
|
|
|
|
title: 'Map',
|
|
|
|
|
kicker: 'Where',
|
|
|
|
|
subtitle: 'Where the photos were taken',
|
|
|
|
|
loading: 'Loading map…',
|
|
|
|
|
loadFailed: (status: number) => `Failed to load map data (${status})`,
|
|
|
|
|
initFailed: 'Failed to initialize map',
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
subpage: {
|
|
|
|
|
collectionKicker: (index: string) => `${index} — Collection`,
|
|
|
|
|
sectionsNav: 'Sections',
|
|
|
|
|
coverAria: (albumName: string, count: string) => `${albumName}, ${count}`,
|
2026-09-22 14:12:13 +02:00
|
|
|
nextSubpage: 'Next',
|
|
|
|
|
nextSubpageAria: (name: string) => `Next: ${name}`,
|
2026-08-23 23:18:14 +02:00
|
|
|
},
|
|
|
|
|
|
|
|
|
|
journal: {
|
|
|
|
|
title: 'Journal',
|
|
|
|
|
kicker: 'Stories & Essays',
|
|
|
|
|
subtitle: 'Photo essays, visual stories, and field notes.',
|
|
|
|
|
description: 'Photo essays, travel stories, and behind-the-scenes journals.',
|
|
|
|
|
entryDescription: 'Journal entry',
|
|
|
|
|
empty: 'No journal entries published yet.',
|
|
|
|
|
readStory: 'Read Story →',
|
|
|
|
|
minRead: (n: number) => `${n} min read`,
|
|
|
|
|
draft: 'Draft',
|
|
|
|
|
by: (author: string) => `by ${author}`,
|
|
|
|
|
notFound: 'Not Found',
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
lightbox: {
|
|
|
|
|
viewer: 'Image viewer',
|
|
|
|
|
close: 'Close',
|
|
|
|
|
closeTitle: 'Close (Esc)',
|
|
|
|
|
previous: 'Previous photo',
|
|
|
|
|
previousTitle: 'Previous photo (Left arrow)',
|
|
|
|
|
next: 'Next photo',
|
|
|
|
|
nextTitle: 'Next photo (Right arrow)',
|
|
|
|
|
toggleInfo: 'Toggle photo info',
|
|
|
|
|
toggleInfoTitle: 'Toggle photo info (i)',
|
|
|
|
|
hideInfo: 'Hide Info',
|
|
|
|
|
info: 'Info',
|
|
|
|
|
loading: 'Loading...',
|
|
|
|
|
camera: 'Camera',
|
|
|
|
|
lens: 'Lens',
|
|
|
|
|
focalLength: 'Focal Length',
|
|
|
|
|
aperture: 'Aperture',
|
|
|
|
|
shutter: 'Shutter',
|
|
|
|
|
iso: 'ISO',
|
|
|
|
|
location: 'Location',
|
|
|
|
|
noExif: 'No EXIF data available',
|
release: v0.13.0 (#535)
Twenty-nine commits since v0.12.0. See CHANGELOG.md for the full list
and the upgrade notes.
Ten additions — the SEO package (site URL, robots.txt, sitemap.xml,
JSON-LD), slideshow mode, opt-in original downloads, copy-link,
previous/next album navigation, alt text from the Immich description,
per-album location precision, the update notice, a Help tab, and a
subpage cover grid separate from its photo grid. Two fixes: CJK album
slugs, and the lightbox control bar.
Photo of the Day (#476) was built on `dev` and reverted as not planned;
it never appears in a release.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01DmsHVRL9yQvckUB1ZpVWre
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: ralksta <ralksta@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 10:08:12 +02:00
|
|
|
copyLink: 'Copy link to this photo',
|
|
|
|
|
copyLinkTitle: 'Copy link to this photo (c)',
|
|
|
|
|
copyLinkShort: 'Link',
|
|
|
|
|
copied: 'Copied',
|
|
|
|
|
copyManual: 'Copy this link',
|
2026-08-23 23:18:14 +02:00
|
|
|
shortcuts: 'Keyboard shortcuts',
|
|
|
|
|
shortcutNavigate: 'Previous / next photo',
|
|
|
|
|
shortcutInfo: 'Photo info',
|
|
|
|
|
shortcutFullscreen: 'Fullscreen',
|
|
|
|
|
shortcutExitFullscreen: 'Leave fullscreen',
|
release: v0.13.0 (#535)
Twenty-nine commits since v0.12.0. See CHANGELOG.md for the full list
and the upgrade notes.
Ten additions — the SEO package (site URL, robots.txt, sitemap.xml,
JSON-LD), slideshow mode, opt-in original downloads, copy-link,
previous/next album navigation, alt text from the Immich description,
per-album location precision, the update notice, a Help tab, and a
subpage cover grid separate from its photo grid. Two fixes: CJK album
slugs, and the lightbox control bar.
Photo of the Day (#476) was built on `dev` and reverted as not planned;
it never appears in a release.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01DmsHVRL9yQvckUB1ZpVWre
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: ralksta <ralksta@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 10:08:12 +02:00
|
|
|
download: 'Download the original file',
|
|
|
|
|
downloadTitle: 'Download the original file (d)',
|
|
|
|
|
downloadShort: 'Original',
|
|
|
|
|
shortcutDownload: 'Download the original',
|
|
|
|
|
shortcutSlideshow: 'Slideshow',
|
|
|
|
|
shortcutSlideshowRunning: (seconds: number) => `Slideshow — every ${seconds}s`,
|
|
|
|
|
slideshowStopped: 'Slideshow stopped',
|
|
|
|
|
slideshowRunning: (seconds: number) => `Slideshow running, advancing every ${seconds} seconds`,
|
|
|
|
|
shortcutCopyLink: 'Copy link to this photo',
|
2026-08-23 23:18:14 +02:00
|
|
|
shortcutList: 'This list',
|
|
|
|
|
shortcutClose: 'Close the viewer',
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
proofing: {
|
|
|
|
|
addFavorite: 'Add favorite',
|
|
|
|
|
removeFavorite: 'Remove favorite',
|
|
|
|
|
addToFavorites: 'Add to favorites',
|
|
|
|
|
removeFromFavorites: 'Remove from favorites',
|
|
|
|
|
saved: 'Saved',
|
|
|
|
|
favorite: 'Favorite',
|
|
|
|
|
showAll: 'Show All',
|
|
|
|
|
selected: (n: number) => `❤️ ${n} Selected`,
|
|
|
|
|
shareExport: 'Share & Export',
|
|
|
|
|
modalTitle: (n: number) => `❤️ Selection (${n})`,
|
|
|
|
|
closeModal: 'Close modal',
|
|
|
|
|
intro: (n: number) =>
|
|
|
|
|
`You have selected ${plural(n, 'photo', 'photos')}. Choose an export option below to share your selection:`,
|
|
|
|
|
copyLink: 'Copy Shareable Link',
|
|
|
|
|
linkCopied: 'Link Copied!',
|
|
|
|
|
copyList: 'Copy Text List (#1, #2...)',
|
|
|
|
|
listCopied: 'List Copied!',
|
|
|
|
|
sendEmail: '✉️ Send Email to Photographer',
|
|
|
|
|
clearSelection: 'Clear Selection',
|
|
|
|
|
confirmClear: 'Clear all selected favorites?',
|
|
|
|
|
listEmpty: (albumName: string) => `${albumName}: No photos selected.`,
|
|
|
|
|
listSummary: (albumName: string, count: number, indices: string) =>
|
|
|
|
|
`${albumName} — Selected Photos (${count}): ${indices}`,
|
|
|
|
|
mailSubject: (n: number) => `Photo Selection (${n} items)`,
|
|
|
|
|
mailBody: (list: string, url: string) =>
|
|
|
|
|
`Hello,\n\nHere is my photo selection:\n\n${list}\n\nShare Link: ${url}\n\nBest regards,`,
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
legal: {
|
|
|
|
|
navLabel: 'Legal Notice',
|
|
|
|
|
title: 'Legal Notice',
|
|
|
|
|
subtitle: 'Information pursuant to § 5 TMG',
|
|
|
|
|
address: 'Address',
|
|
|
|
|
contact: 'Contact',
|
|
|
|
|
email: 'Email',
|
|
|
|
|
phone: 'Phone',
|
|
|
|
|
taxSection: 'Tax Information',
|
|
|
|
|
taxId: 'Tax number',
|
|
|
|
|
vatId: 'VAT ID',
|
|
|
|
|
extraInfo: 'Additional Information',
|
|
|
|
|
source: 'Source: Created with the Impressum generator by eRecht24.',
|
|
|
|
|
},
|
|
|
|
|
};
|