{
  "app.title": "Frisson Map",
  "app.tagline": "An interactive map for Tarja Turunen fans",
  "status.checking": "Checking backend…",
  "status.alive": "Backend is alive!",
  "status.error": "Backend not reachable",
  "maintenance.title": "We're taking a quick break",
  "maintenance.body": "The map is temporarily unavailable. We're working on it — please come back in a few minutes. Your Echoes are safe.",
  "maintenance.contactPrefix": "Still seeing this after a while? Drop us a line:",
  "maintenance.titleOffline": "You're offline",
  "maintenance.bodyOffline": "Check your internet connection — the map will be here when you're back.",
  "badge.beta": "BETA",

  "common.close": "Close",
  "common.remove": "Remove",
  "form.openGathering.aiNote": "Name suggested by AI.",
  "common.aiBadgeTooltip": "Description generated with AI. May contain errors.",
  "common.aiBadgeTooltipEdited": "Description generated with AI. May have been edited by the user.",

  "warmup.title": "Waking the map…",
  "hints.tip1": "Leave an Echo of how the new music moved you",
  "hints.tip2": "Tap the heart on concerts you love — and say you're going",
  "hints.tip3": "Propose a Landmark from Tarja's story",
  "hints.tip4": "Join an open Gathering with your Echo",
  "hints.tip5": "Give your stars — every fan gets 50 to spread across the album",
  "hints.tip6": "Turn your Echoes into a Journal — your music diary",
  "hints.dismiss": "Dismiss tip",
  "welcome.title": "Welcome to Frisson Map",
  "welcome.lead": "Echoes of how Tarja Turunen's music moved people — pinned across the world.",
  "welcome.free.tick": "No sign-up",
  "welcome.free.text": "Explore the map and leave your own **Echo**.",
  "welcome.eyebrow": "When you sign up",
  "welcome.eyebrow.signedIn": "With your account",
  "welcome.perk.stars": "Rate songs",
  "welcome.perk.journal": "Collect your song **Echoes** in a **Journal**",
  "welcome.perk.heart": "Heart the **Echoes**, concerts & online events",
  "welcome.perk.gathering": "Open your **Echo** to others & start a **Gathering**",
  "welcome.cta.signUp": "Sign up",
  "welcome.cta.help": "Continue with Google or email.",
  "welcome.cta.gotIt": "Got it",
  "welcome.menuItem": "What can I do here?",
  "common.testData.checkbox": "Mark as test data",
  "common.testData.warning": "Test entries may be periodically removed before launch.",
  "common.testData.lockedToGathering": "Locked to match this gathering — all Echoes in one gathering are either test or real, never mixed.",
  "common.testData.tooltip": "Test data — may be periodically removed before launch.",
  "common.testData.badge": "TEST",
  "common.testData.action.flag": "Mark as test data",
  "common.testData.action.unflag": "Restore as real data",
  "common.testData.toast.flagged": "Marked as test data.",
  "common.testData.toast.unflagged": "Restored as real data.",
  "common.testData.toast.failed": "Couldn't update — please retry.",
  "common.testData.convertBlocked": "Can't switch to real data — a real duplicate already exists.",
  "common.testData.flagBlocked": "Can't mark as test data — a duplicate already exists.",
  "common.testData.realEchoRequired": "Add a real Echo on the map before switching test data to real.",

  "common.testMode.label": "Test mode",
  "common.testMode.tooltipOff": "Test mode is OFF — you're seeing real data. Click to also include test data.",
  "common.testMode.tooltipOn": "Test mode is ON — test data is mixed into the map (may be removed before launch). Click to hide it again.",
  "common.testMode.unavailable": "Test mode can't be saved (private browsing or full storage). Try a regular window.",

  "common.pagination.label": "Pagination",
  "common.pagination.prev": "‹",
  "common.pagination.next": "›",
  "common.pagination.prevLabel": "Previous page",
  "common.pagination.nextLabel": "Next page",
  "common.pagination.pageLabel": "Page {n}",
  "common.pagination.range": "{start}–{end} of {total}",
  "common.pagination.empty": "No items.",
  "common.pagination.pageSizeLabel": "Per page",
  "common.pagination.pageSizeAria": "Rows per page",

  "hero.title": "Frisson Map",
  "hero.tagline": "Echoes of Tarja Turunen's music, around the world",
  "hero.onlineBadge.label": "online",
  "hero.onlineBadge.labelToday": "online today",
  "hero.onlineBadge.title": "Online events — click to open the Events list",
  "hero.concertBadge.label": "concert",
  "hero.concertBadge.title": "Concerts today — click to open the Concerts list",
  "hero.mapNews.label": "new echoes",
  "hero.mapNews.labelOne": "new echo",
  "hero.mapNews.labelNext": "next new echo →",
  "hero.mapNews.caughtUp": "That's all the new Echoes ;)",
  "hero.mapNews.title": "New echoes since your last visit — click to fly to them",
  "hero.mapNews.dismiss": "Dismiss",
  "hero.chartLeader.label": "{song} leads",
  "panel.ariaLabel": "Echoes and events panel",

  "panel.tab.pins": "Echoes",
  "panel.tab.events": "Concerts",
  "panel.tab.online": "Online",
  "panel.tab.yours": "Yours",
  "panel.tab.songs": "Songs",
  "panel.loading": "Loading…",
  "panel.toggle.ariaLabel": "Expand the list panel",
  "panel.close.ariaLabel": "Collapse the panel",
  "panel.rail.ariaLabel": "Open the Echoes / Concerts / Online / Yours / Songs panel",

  "songsPane.chart.title": "Chart",
  "songsPane.chart.sub": "How fans rank the album",
  "songsPane.journey.title": "Your Stars",
  "songsPane.journey.sub": "Give stars · echo the songs you love",
  "songsPane.meter.stars": "Stars given",
  "songsPane.meter.echoed": "Songs echoed",
  "songsPane.anon.hint": "to give your stars and echo the songs you love.",
  "songsPane.header.subtitle": "Frisson Noir",
  "songsPane.pulse.eyebrow": "Live from Frisson World",
  "songsPane.pulse.ctaFirst": "Be {song}'s first Echo",
  "songsPane.pulse.ctaFirstAny": "Leave the first Echo",
  "songsPane.pulse.ctaSeeMap": "See it on the map",
  "songsPane.pulse.coverageNone": "No song has its first Echo yet — yours could be the first.",
  "songsPane.pulse.coverage": "{echoed} of {total} songs have their first Echo — {song} still waits for its own.",
  "songsPane.pulse.divisive": "Fans can't agree on {song} — ratings run from {min} to {max} stars.",
  "songsPane.pulse.devotion": "{song} has the album's most devoted following — {avg} stars per fan on average.",
  "songsPane.pulse.completionists": "{n} fans have rated all {total} tracks — the full-album club.",
  "songsPane.pulse.countries": "Fans from {n} countries are shaping the chart.",
  "songsPane.pulse.mostLoved": "The most-loved Echo on the map belongs to {song}.",
  "songsPane.pulse.biggestBet": "One fan staked {stars} of their {budget} stars on {song}.",
  "journey.rating.leaveEcho": "Leave an Echo",
  "journey.rating.rate": "Rate",

  "country.countedFor": "Counted for",
  "country.fromProfile": "from your profile",
  "country.changeLink": "set your country in your Profile",
  "country.benefit": "Fly your own flag on the Chart — pick your country.",
  "country.toast": "Stars sent! Want them to fly your flag?",
  "country.toastAction": "Pick your country",
  "country.ghostFlag": "Pick your country to fly your flag on the Chart",

  "panel.preview.empty": "Tap to browse",
  "panel.item": "item",
  "panel.items": "items",
  "panel.sortedByRecent": "sorted by recent",
  "panel.loadMore": "Load more",
  "panel.sortMineFirst.label": "My Echoes first",
  "panel.sortMineFirst.aria": "Float your Echoes to the top of the list",
  "panel.songFilter.active": "Song: {title}",
  "panel.songFilter.all": "All songs",
  "panel.songFilter.aria": "Filter Echoes by song",
  "panel.songFilter.clear": "Clear the song filter",
  "panel.songFilter.empty": "No Echoes with this song yet.",
  "panel.songFilter.noMine": "You haven't echoed this song yet.",
  "panel.pins.deleteOwn.aria": "Delete this Echo",
  "panel.pins.deleteOwn.confirmTitle": "Delete this Echo?",
  "panel.pins.deleteOwn.confirmBody": "This will remove the Echo from the map. It cannot be undone.",
  "panel.pins.deleteOwn.confirmCta": "Delete Echo",
  "panel.pins.deleteOwn.failed": "Could not delete the Echo. Please try again.",
  "panel.pins.deleteOwn.success": "Echo deleted.",
  "panel.pins.empty": "No Echoes yet. Be the first to leave an Echo on the map.",
  "panel.pins.addMoment": "Leave an Echo",
  "panel.events.suggest": "+ Propose event",
  "panel.events.suggestConcert": "Propose concert",
  "panel.events.suggestOnline": "Propose online event",
  "panel.events.addConcert": "Add concert",
  "panel.events.addOnline": "Add online event",
  "panel.events.livePill": "LIVE",
  "panel.events.todayPill": "Today",
  "panel.events.suggestNudgePrefix": "Sign in to propose an online event →",
  "suggest.choice.title": "What kind of event?",
  "suggest.choice.online.label": "Online event",
  "suggest.choice.online.body": "Livestream, Q&A, listening party — anything Tarja fans gather around online.",
  "suggest.choice.frissonTour.label": "Frisson Tour concert",
  "suggest.choice.frissonTour.body": "Concert info goes through r/tarjaturunen — fans collect dates there.",
  "suggest.frissonTour.title": "Frisson Tour concert info",
  "suggest.frissonTour.body": "Tarja announces concerts via her official channels. If you've spotted a date or got tickets, share it on r/tarjaturunen so other fans can find it.",
  "suggest.frissonTour.openReddit": "Open r/tarjaturunen →",
  "photonSearch.placeholder": "Search city, venue or place…",
  "photonSearch.searching": "Searching…",
  "photonSearch.noResults": "No matches",
  "admin.eventVenue.placeholder": "Search venue or city…",
  "admin.sigplaceSearch.placeholder": "Search city or landmark…",
  "form.close": "Close",
  "panel.events.emptyAll.title": "No concerts scheduled yet",
  "panel.events.emptyAll.body": "When Tarja announces a tour date or a fan adds a concert, it'll show up here.",
  "panel.events.emptyAll.anonNudge": "Sign in to save & propose →",
  "panel.events.section.live": "LIVE NOW",
  "panel.events.section.today": "TODAY",
  "panel.events.section.upcoming": "UPCOMING",
  "panel.events.section.upcomingEmpty": "No upcoming events yet.",
  "panel.events.section.pastToggle": "Show past",
  "panel.events.section.pastToggleHide": "Hide past",
  "panel.events.status.live": "LIVE",
  "panel.events.status.upcoming": "UPCOMING",
  "panel.events.status.past": "PAST",
  "panel.events.status.cancelled": "CANCELLED",
  "panel.events.status.tooltip.live": "Live now",
  "panel.events.status.tooltip.upcoming": "Upcoming",
  "panel.events.status.tooltip.upcoming-next": "Next concert coming up",
  "panel.events.status.tooltip.past": "Past concert",
  "panel.events.status.tooltip.cancelled": "Cancelled",
  "panel.events.dateLive": "Live now",

  "panel.online.suggestOnline": "Propose online event",
  "panel.online.addOnline": "Add online event",
  "panel.online.emptyAll.title": "No online events yet",
  "panel.online.emptyAll.body": "Streams, listening parties, Q&As — when a fan opens one online, it shows up here.",
  "panel.online.emptyAll.anonNudge": "Sign in to save & propose →",
  "panel.online.section.live": "LIVE NOW",
  "panel.online.section.today": "TODAY",
  "panel.online.section.upcoming": "UPCOMING",
  "panel.online.section.upcomingEmpty": "No online events scheduled.",
  "panel.online.section.pastToggle": "Show past",
  "panel.online.section.pastToggleHide": "Hide past",
  "panel.back": "Back",
  "panel.back.ariaLabel": "Back to list",

  "panel.yours.section.saved": "Saved events",
  "panel.yours.section.submissions": "Your Submissions",
  "panel.yours.submissions.pending": "Pending",
  "panel.yours.submissions.rejected": "Rejected",
  "panel.yours.submissions.deleted": "Deleted Echoes",
  "panel.yours.section.rejected": "Rejected submissions",
  "panel.yours.deleted.reason.label": "Reason",
  "panel.yours.deleted.untitled": "Untitled Echo",
  "panel.yours.deleted.dismiss.label": "Remove from your list",
  "panel.yours.deleted.dismiss.confirmTitle": "Remove this deletion record?",
  "panel.yours.deleted.dismiss.confirmBody": "The Echo will be permanently removed from your history. The moderation audit record stays in the admin log.",
  "panel.yours.deleted.dismiss.confirmSubmit": "Remove",
  "panel.yours.deleted.dismiss.toast": "Removed from your list.",
  "panel.yours.deleted.dismiss.error": "Could not remove. Try again.",
  "pin.chip.label": "Echo",
  "pin.deletion_category.spam": "Spam or unrelated",
  "pin.deletion_category.inappropriate": "Inappropriate",
  "pin.deletion_category.hate_speech": "Hate speech",
  "pin.deletion_category.personal_info": "Personal info",
  "pin.deletion_category.other": "Other",
  "pin.deletion_category.inappropriate_name": "Inappropriate gathering name",
  "pin.deletion_category.spam_group": "Spam or junk gathering",
  "panel.yours.emptyAuth.title": "Nothing here yet",
  "panel.yours.emptyAuth.body": "Save an event you're going to or interested in and it'll show up here.",
  "panel.yours.emptyAnon.title": "Sign in to save events",
  "panel.yours.emptyAnon.body": "Save events you're going to or interested in, and find them all in one place.",
  "panel.yours.emptyAnon.nudge": "Sign in to save events →",
  "panel.yours.loadError": "Couldn't load your saved events. Try again in a moment.",
  "panel.yours.rejected.dismiss.label": "Remove from your list",
  "panel.yours.rejected.dismiss.confirmTitle": "Remove this rejected submission?",
  "panel.yours.rejected.dismiss.confirmBody": "The event will disappear from your view. The moderation record stays with the Crew.",
  "panel.yours.rejected.dismiss.confirmSubmit": "Remove",
  "panel.yours.rejected.dismiss.toast": "Removed from your list.",
  "panel.yours.rejected.reasonPrefix": "Rejected: ",
  "panel.yours.rejected.reason.label": "Reason",
  "poi.chip.label": "Landmark",
  "poi.chip.title": "Landmark",
  "event.chip.online": "Online",
  "event.chip.concert": "Concert",

  "event.detail.loading": "Loading…",
  "event.detail.loadError": "Failed to load event.",
  "event.detail.openFull": "Open full detail →",
  "event.detail.watchUrl": "Open stream →",
  "event.detail.ticketsUrl": "Open link →",

  "panel.events.tourChip.standalone": "STANDALONE",
  "event.detail.partOfTour": "Part of {tourName} →",
  "event.detail.tourStops.upcoming": "Other upcoming stops",
  "event.detail.tourStops.past": "Past stops",
  "event.detail.tourStops.showAll": "Show all {count} →",
  "event.detail.tourStops.empty": "This is the only stop on the tour.",
  "event.detail.tourStops.loadError": "Couldn't load the other tour stops.",
  "event.detail.tourStops.loading": "Loading other stops…",

  "event.status.past": "Past",
  "event.status.live": "LIVE",
  "event.status.today": "Today",

  "event.subcategory.livestream": "Livestream",
  "event.subcategory.qa": "Q&A",
  "event.subcategory.listening_party": "Listening party",
  "event.subcategory.watch_party": "Watch party",
  "event.subcategory.other": "Other online",

  "rsvp.frisson_tour.going": "I'm going",
  "rsvp.frisson_tour.interested": "Interested",
  "rsvp.frisson_tour.attended": "I was there",
  "rsvp.online.going": "I'll attend",
  "rsvp.online.interested": "Interested",
  "rsvp.online.attended": "I attended",
  "rsvp.nudge.signin": "Sign in to save →",
  "rsvp.like": "Like",
  "rsvp.error": "Couldn't save. Try again.",
  "rsvp.badge.going": "Going",
  "rsvp.badge.attending": "Attending",
  "rsvp.badge.attended": "Attended",
  "rsvp.popup.going": "I'm going",
  "rsvp.popup.attended": "I was there",
  "rsvp.popup.watch": "I'll attend",
  "rsvp.popup.watched": "I attended",
  "rsvp.popup.save": "Save",
  "rsvp.popup.counts.going": "going",
  "rsvp.popup.counts.watching": "attending",
  "rsvp.popup.counts.interested": "interested",
  "rsvp.popup.counts.wereThere": "were there",
  "rsvp.popup.counts.watched": "attended",

  "sheet.cancelled.banner": "This event has been cancelled",
  "sheet.attendance.aria": "See who's going",
  "sheet.attendance.going": "going",
  "sheet.attendance.interested": "interested",
  "sheet.attendance.watching": "attending",
  "sheet.attendance.watched": "attended",
  "sheet.attendance.wereThere": "were there",
  "sheet.attendance.wished": "wished",
  "sheet.discussion.heading": "Where fans are talking",
  "discussion.add.signin": "Sign in to add a link",
  "discussion.add.placeholder": "Paste a Reddit / Discord / forum link",
  "discussion.add.button": "Add",
  "discussion.add.error": "Couldn't add that link.",
  "discussion.add.duplicate": "This link is already on this event.",
  "discussion.add.notAllowed": "That site isn't supported for discussion links. Try Reddit, YouTube, Discord, Instagram, Facebook, X, Setlist.fm, Last.fm, Spotify, Bandcamp, festival sites or tarjaturunen.com.",
  "discussion.chip.aria": "discussion links",
  "sheet.back.aria": "Back",
  "sheet.handle.aria": "Resize detail",
  "sheet.profile.edit": "Edit",
  "sheet.profile.momentsBy": "Echoes by {nick}",
  "sheet.gathering.momentsLabel": "ECHOES",
  "sheet.gathering.momentSingular": "ECHO",
  "sheet.gathering.momentsLoading": "ECHOES",
  "sheet.gathering.foundingEcho": "Founding Echo",
  "sheet.gathering.deletedEcho": "Original echo was deleted",
  "echo.like": "Like",
  "echo.like.error": "Couldn't save your like. Try again.",
  "echo.translate": "Translate",
  "echo.translate.loading": "Translating…",
  "echo.translate.machine": "Machine translation",
  "echo.translate.showOriginal": "Show original",
  "echo.translate.unavailable": "Translation unavailable.",
  "echo.translate.rateLimited": "Daily translation limit reached. Try again tomorrow.",
  "sheet.moment.partOf": "Part of",
  "sheet.gathering.addMoment": "Leave an Echo",
  "sheet.gathering.addAnotherCta": "Leave another Echo",
  "sheet.gathering.joinCta": "Join with your Echo",
  "pin.anonymous": "Anonymous",

  "toast.genericError": "Something went wrong. Try again.",

  "reddit.read.label": "Read fan stories on Reddit",
  "reddit.share.label": "Share experience on Reddit",

  "form.close.ariaLabel": "Close",

  "sigplace.suggestedBy": "Proposed by",
  "sigplace.profileComingSoon": "Public profile coming soon",

  "chrome.songs.ariaLabel": "Chart",
  "chrome.songs.title": "Chart",
  "chrome.songs.intro": "Frisson Noir, ranked by the total stars fans gave each track.",
  "chrome.songs.nudge": "Sign in to give your stars →",
  "chrome.songs.loading": "Loading the chart…",
  "chrome.songs.error": "Couldn't load the chart. Please try again.",
  "chrome.songs.empty": "No tracks to rank yet.",
  "chrome.songs.myTop": "My top",
  "chrome.songs.starsTotal": "{n} stars",
  "chrome.songs.restLabel": "The rest of the chart",
  "chrome.songs.topIn": "Loved in {country}",
  "chrome.songs.playOnYoutube": "Play on YouTube",

  "journey.title": "Your Stars",
  "journey.close": "Close",
  "journey.intro": "These 50 stars are shared across the whole album — not all for one song. Give more to your favourites: tap a song, then drag to give it stars.",
  "journey.seeMyEchoes": "See your echoes for this song",
  "journey.outOfBudget": "No stars left — take some away to move them.",
  "journey.tapToRate": "Tap to rate",
  "journey.myTop": "My top",
  "journey.loading": "Loading your stars…",
  "journey.error": "Couldn't load your stars. Please try again.",
  "journey.rating.eyebrow": "Give stars",
  "journey.rating.close": "Close",
  "journey.rating.onThisTrackOne": "your star for this track",
  "journey.rating.onThisTrackMany": "your stars for this track",
  "journey.rating.dragHint": "Drag the bar — or use − / +",
  "journey.rating.sliderLabel": "Stars on this track",
  "journey.rating.minus": "Remove a star",
  "journey.rating.plus": "Add a star",
  "journey.rating.done": "Done",
  "journey.rating.stillToGive": "{n} of {total} still to give.",
  "journey.rating.saveFailed": "Couldn't save your stars. Please try again.",

  "echo.rate.label": "Rate this song",
  "echo.rate.loading": "Loading…",
  "echo.rate.albumBudget": "Shared across the whole album",
  "echo.rate.changeable": "You can change the number anytime",
  "echo.rate.outOfBudget": "No stars left — take some from another track first.",
  "echo.rate.less": "Remove a star",
  "echo.rate.more": "Add a star",
  "echo.grouping.aria": "Add this Echo to a gathering",
  "echo.grouping.head": "Add it to one of these?",
  "echo.grouping.headSingle": "Add it to this one?",
  "echo.grouping.baseEyebrow": "Your Journal here",
  "echo.grouping.openByEyebrow": "Gathering by {nick}",
  "echo.grouping.baseSongEyebrow": "Your Journal",
  "echo.grouping.songEyebrow": "Gathering echoing this song",

  "echoForm.group.story": "Your Echo",
  "echoForm.group.song": "The song",
  "echoForm.group.who": "Who you are",
  "echoForm.group.beforePost": "Before you post",

  "admin.tab.events": "Events",
  "admin.tab.sigplaces": "Landmarks",
  "admin.tab.chart": "Chart",
  "admin.chart.subtitle": "Add an optional YouTube link to a track. Fans see a small play icon on the Chart; leave a field empty to remove the link.",
  "admin.chart.loading": "Loading tracks…",
  "admin.chart.empty": "No tracks yet.",
  "admin.chart.error": "Something went wrong. Please try again.",
  "admin.chart.invalid": "Only YouTube links are allowed (youtube.com or youtu.be).",
  "admin.chart.placeholder": "https://youtu.be/…",
  "admin.chart.fieldLabel": "YouTube link for {title}",
  "admin.chart.save": "Save",
  "admin.chart.savedCount": "Saved {n} link(s).",
  "admin.chart.count": "{n} tracks",
  "admin.tab.email": "Email",
  "admin.email.subtitle": "Send an operational email to your users — service notices only, not marketing.",
  "admin.email.recipients.legend": "Send to",
  "admin.email.recipients.test": "Just me (test)",
  "admin.email.recipients.user": "A specific user",
  "admin.email.recipients.all": "Everyone with an account",
  "admin.email.userLabel": "Pick a user",
  "admin.email.selectedPrefix": "Selected:",
  "admin.email.searchEmpty": "No users found.",
  "admin.email.templateLabel": "Start from a template",
  "admin.email.templateHint": "Prefills the subject and message — you can edit both before sending. Drafts only: have the final wording reviewed (GDPR / privacy) before emailing everyone.",
  "admin.email.template.none": "— Blank message —",
  "admin.email.template.shutdown": "Service shutdown / app closure",
  "admin.email.template.legal": "Terms / Privacy update notice",
  "admin.email.template.replaceTitle": "Replace your text?",
  "admin.email.template.replaceBody": "This will overwrite the subject and message you've already written. Continue?",
  "admin.email.template.replaceConfirm": "Replace",
  "admin.email.subjectLabel": "Subject",
  "admin.email.bodyLabel": "Message",
  "admin.email.mdHint": "Markdown: **bold**, *italic*, [text](https://link). Blank line starts a new paragraph.",
  "admin.email.previewLabel": "Preview",
  "admin.email.previewEmpty": "Your message preview will appear here.",
  "admin.email.send": "Send",
  "admin.email.checking": "Checking recipients…",
  "admin.email.sending": "Sending…",
  "admin.email.confirm.title": "Send this email?",
  "admin.email.confirm.body": "This will email {count} recipient(s). Continue?",
  "admin.email.confirm.send": "Send",
  "admin.email.result.sent": "Sent to {sent} recipient(s).",
  "admin.email.result.failed": "{failed} failed.",
  "admin.email.error.subject": "Please enter a subject.",
  "admin.email.error.body": "Please enter a message.",
  "admin.email.error.noUser": "Please pick a user first.",
  "admin.email.error.noRecipients": "No recipients match this selection.",
  "admin.email.error.overCap": "Too many recipients (over {cap}). Refusing to send.",
  "admin.email.error.generic": "Something went wrong. Please try again.",
  "admin.events.new": "+ New event",
  "admin.events.empty": "No events yet.",
  "admin.events.col.title": "Title",
  "admin.events.col.category": "Category",
  "admin.events.col.date": "When",
  "admin.events.col.status": "Status",
  "admin.events.col.actions": "Actions",
  "admin.event.title.new": "New event",
  "admin.event.title.edit": "Edit event",
  "admin.sigplaces.new": "+ New landmark",
  "admin.sigplaces.empty": "No landmarks yet.",
  "admin.sigplaces.col.name": "Name",
  "admin.sigplaces.col.location": "Location",
  "admin.sigplaces.col.proposer": "Proposer",
  "admin.sigplaces.col.actions": "Actions",
  "admin.sigplace.title.new": "New landmark",
  "admin.sigplace.title.edit": "Edit landmark",
  "admin.poi.new": "+ New landmark",
  "admin.poi.empty": "No landmarks yet.",
  "admin.poi.col.name": "Name",
  "admin.poi.col.location": "Location",
  "admin.poi.col.author": "Author",
  "admin.poi.col.proposed": "Proposed",
  "admin.poi.col.actions": "Actions",
  "admin.poi.confirmDelete": "Delete this landmark? This cannot be undone.",
  "admin.poi.deleted.toast": "Landmark deleted.",
  "admin.mod.poi.approved.toast": "Landmark approved.",
  "admin.mod.poi.rejected.toast": "Landmark rejected. The author will see your reason in their Yours tab.",
  "admin.poi.suggestion.title": "Change suggestions",
  "admin.poi.suggestion.col.text": "Suggestion",
  "admin.poi.suggestion.markResolved": "Mark resolved",
  "admin.poi.suggestion.approve.toast": "Suggestion marked resolved.",
  "admin.poi.suggestion.reject.title": "Reject change suggestion",
  "admin.poi.suggestion.reject.hint": "Please tell the author why their suggestion was declined — they will see this note as a tooltip on the rejected suggestion.",
  "admin.poi.suggestion.reject.toast": "Suggestion rejected.",
  "admin.request.col.filed": "Filed",
  "admin.mod.section.poi.pending": "Pending",
  "admin.mod.section.poi.approved": "Approved",
  "admin.mod.section.poi.rejected": "Rejected",
  "admin.table.totalCount": "{n} total",
  "admin.action.edit": "Edit",
  "admin.action.delete": "Delete",
  "admin.action.showOnMap": "Show on map",
  "admin.actions.more": "Actions",
  "map.ghost.poi": "Pending landmark — it will appear here once approved.",
  "map.ghost.event": "Pending concert — it will appear here once approved.",
  "map.ghost.back": "← Back to admin",
  "admin.action.approve": "Approve",
  "admin.action.approve.short": "✓ Approve",
  "admin.action.reapprove": "Re-approve",
  "admin.action.reapprove.short": "↩ Re-approve",
  "admin.action.reject": "Reject",
  "admin.action.reject.short": "✗ Reject",
  "admin.mod.section.pending": "Pending",
  "admin.mod.section.approved": "Approved",
  "admin.mod.section.rejected": "Rejected",
  "admin.mod.section.rejected.hint": "History — author owns deletion, auto-expires after 60 days",
  "admin.mod.pending": "Pending Crew review",
  "admin.mod.pending.short": "🕐 pending",
  "admin.mod.rejected": "Rejected",
  "admin.mod.rejected.short": "🚫 rejected",
  "admin.mod.approved.toast": "Event approved.",
  "admin.mod.rejected.toast": "Event rejected. The submitter will see your reason on the rejected badge.",
  "admin.mod.reject.title": "Reject proposed event",
  "admin.mod.reject.hint": "Tell the submitter why — they’ll see this as a tooltip on the rejected badge in their list.",
  "admin.mod.reject.reasonLabel": "Reason (visible to submitter)",
  "admin.mod.reject.submit": "Reject",
  "admin.mod.reject.reasonRequired": "Please provide a reason (1–500 chars).",
  "admin.mod.reject.reasonTooLong": "Reason must be 500 characters or fewer.",
  "admin.mod.reject.promptFallback": "Reason for rejection (required, 1–500 chars):",
  "admin.events.cancel.button": "Cancel event",
  "admin.events.cancel.modalTitle": "Cancel this event?",
  "admin.events.cancel.modalHint": "Fans will see a CANCELLED badge on this event. You can restore it later.",
  "admin.events.cancel.submit": "Cancel event",
  "admin.events.cancel.toast": "Event cancelled.",
  "admin.events.uncancel.button": "Restore event",
  "admin.events.uncancel.toast": "Event restored.",
  "admin.events.uncancel.modalTitle": "Restore this event?",
  "admin.events.uncancel.modalHint": "The CANCELLED badge will be removed and fans will see the event as active again. This change is recorded in the audit log.",
  "admin.events.cancelled_badge": "CANCELLED",
  "admin.events.cancelledCheckbox.label": "Canceled",
  "events.actions.cancel": "Cancel event",
  "events.actions.cancel.pendingUndo": "Will cancel — undo",
  "events.actions.uncancel": "Restore event",
  "events.actions.uncancel.pendingUndo": "Will restore — undo",
  "events.detail.cancelled_badge": "CANCELLED",
  "events.status.cancelled": "Cancelled",
  "events.moderation.pending.short": "Pending",
  "events.moderation.pending.tooltip": "Waiting for Crew review. Approved submissions appear on the map; rejected ones get a note from the Crew here.",
  "events.moderation.rejected.short": "Rejected",
  "events.moderation.rejected.tooltip": "Rejected",
  "events.moderation.rejected.infoLabel": "View rejection reason",
  "events.moderation.rejected.dialogTitle": "Reason for rejection",
  "events.actions.edit": "Edit",
  "events.actions.delete": "Delete",
  "events.actions.approve": "Approve",
  "events.actions.reject": "Reject",
  "events.actions.approved.toast": "Event approved.",
  "events.actions.rejected.toast": "Event rejected.",
  "events.actions.requestDeletion": "Request deletion",
  "events.actions.suggestChange": "Suggest a change",
  "actions.meta.community": "Community",
  "events.actions.confirmDelete": "This cannot be undone. The audit log keeps the record.",
  "events.actions.confirmDeleteTitle": "Delete this event?",
  "events.actions.confirmDeleteSubmit": "Delete",
  "admin.event.deleted.toast": "Event deleted.",
  "events.create.tour.deleteTitle": "Delete this tour?",
  "events.create.tour.deleteSubmit": "Delete",
  "events.create.duplicate.title": "Duplicate event detected",
  "events.create.duplicate.message": "An event with the same date and venue already exists. Open the existing event instead?",
  "events.create.duplicate.openExisting": "Show existing concert",
  "events.create.duplicate.messageOnline": "An online event with the same link already exists on this date. Show the existing event instead?",
  "events.create.duplicate.openExistingOnline": "Show existing event",
  "admin.deletion.approve.confirmTitle": "Approve deletion request?",
  "admin.deletion.approve.confirmMessage": "The event will be soft-deleted and hidden from public lists and the map. The audit log keeps the record.",
  "admin.deletion.approve.confirmSubmit": "Approve & soft-delete",
  "admin.deletion.reject.title": "Reject deletion request",
  "admin.deletion.reject.hint": "Tell the author why their deletion request was declined — they will see this note in their list.",
  "admin.suggestion.reject.title": "Reject change suggestion",
  "admin.suggestion.reject.hint": "Tell the author why their suggestion was declined — they will see this note as a tooltip on the rejected suggestion.",
  "form.confirm": "Confirm",
  "events.deletion.dialog.title": "Request event deletion",
  "events.deletion.dialog.hint": "Crew will review your request. The event stays visible until they decide.",
  "events.deletion.reason.label": "Reason (optional)",
  "events.deletion.reason.duplicate": "Duplicate event",
  "events.deletion.reason.wrong_venue": "Wrong venue / location",
  "events.deletion.reason.cancelled": "Concert / event was cancelled",
  "events.deletion.reason.mistake": "I submitted by mistake",
  "events.deletion.reason.fake": "Fake submission",
  "events.deletion.reason.other": "Other",
  "events.deletion.text.label": "Details (optional, up to 500 chars)",
  "events.deletion.submit": "Submit request",
  "events.deletion.toast.submitted": "Deletion request submitted for Crew review.",
  "events.deletion.toast.alreadyPending": "A deletion request for this event is already awaiting review.",
  "events.deletion.badge.pending.short": "🕐 deletion pending",
  "events.deletion.badge.pending.tooltip": "You requested deletion of this event — waiting for Crew review.",
  "events.suggestion.dialog.title": "Suggest a change",
  "events.suggestion.dialog.hint": "Describe what should change on this event (e.g. wrong address, wrong date). Crew will read your suggestion and update the event manually.",
  "events.suggestion.text.label": "What should change? (1–1000 chars)",
  "events.suggestion.submit": "Send suggestion",
  "events.suggestion.toast.submitted": "Change suggestion submitted. Crew will review it shortly.",
  "events.suggestion.badge.pending.short": "💡 change suggested",
  "events.suggestion.badge.pending.tooltip": "You suggested a change to this event — waiting for Crew review.",
  "admin.deletion.title": "Deletion requests",
  "admin.deletion.approve.toast": "Deletion approved. The event is now soft-deleted.",
  "admin.deletion.reject.toast": "Deletion request rejected. The author will see your note.",
  "admin.deletion.reject.noteRequired": "Please tell the author why their deletion request was declined.",
  "admin.suggestion.title": "Change suggestions",
  "admin.suggestion.approve.toast": "Suggestion marked resolved.",
  "admin.suggestion.reject.toast": "Suggestion rejected. The author will see your note.",
  "admin.suggestion.reject.noteRequired": "Please tell the author why their suggestion was declined.",
  "admin.event.confirmDelete": "Delete this event? This cannot be undone.",
  "admin.sigplace.confirmDelete": "Delete this landmark? This cannot be undone.",
  "admin.event.field.category": "Category",
  "admin.event.field.subcategory": "Subcategory (Online)",
  "admin.event.field.title": "Title *",
  "admin.event.field.description": "Description",
  "admin.event.field.eventDate": "When (your local time) *",
  "admin.event.field.duration": "Duration (minutes)",
  "admin.event.field.url": "Event URL",
  "admin.event.field.urlHint": "(stream / tickets)",
  "admin.event.field.redditUrl": "Reddit thread URL",
  "admin.event.field.venueLegend": "Frisson Tour venue",
  "admin.event.field.venueHint": "Search a city, venue or landmark — picking a match fills the latitude, longitude, city and country code automatically.",
  "admin.event.field.venueSearch": "Venue search *",
  "admin.event.field.venueName": "Venue name (override)",
  "admin.event.field.venueNamePlaceholder": "Falls back to the search match name",
  "admin.event.category.frisson": "Frisson Tour",
  "admin.event.category.online": "Online",
  "admin.event.subcategory.optional": "— optional —",
  "admin.event.subcategory.livestream": "Livestream",
  "admin.event.subcategory.qa": "Q&A",
  "admin.event.subcategory.listening": "Listening party",
  "admin.event.subcategory.watch": "Watch party",
  "admin.event.subcategory.listening_party": "Listening party",
  "admin.event.subcategory.watch_party": "Watch party",
  "admin.event.subcategory.other": "Other online",
  "admin.sigplace.field.name": "Name *",
  "admin.sigplace.field.description": "Description",
  "admin.sigplace.field.photoUrl": "Photo URL",
  "admin.sigplace.field.photoUrlHint": "(free DB — Unsplash / Wikimedia / Pexels)",
  "admin.sigplace.field.locationLegend": "Location *",
  "admin.sigplace.field.locationHint": "Search the city or landmark — picking a match fills the latitude, longitude, city and country code automatically.",
  "admin.sigplace.field.placeSearch": "Landmark search",
  "admin.sigplace.field.proposedBy": "Proposed by (user UUID, optional)",
  "admin.sigplace.field.proposedByHint": "Leave blank if this landmark wasn't proposed by a fan.",
  "form.save": "Save",

  "suggest.online.title": "✨ Propose an online event",
  "suggest.online.hint": "Streams, Q&A sessions, listening parties, watch parties — anything Tarja fans gather around online. Published immediately; Crew can edit or remove.",
  "suggest.online.field.title": "Title *",
  "suggest.online.field.description": "Description",
  "suggest.online.field.start": "When (your local time) *",
  "suggest.online.field.duration": "Duration (minutes)",
  "suggest.online.field.url": "Stream URL *",
  "suggest.online.field.reddit": "Reddit thread URL",
  "suggest.online.submit": "Publish",
  "suggest.online.error.invalidDate": "Please pick a valid date and time.",
  "suggest.online.error.pastDate": "Online events must be scheduled in the future.",

  "form.title": "Leave an Echo",
  "form.title.joinGatheringPrefix": "Leave an Echo in",
  "form.title.joinGathering": "Leave an Echo in this gathering",
  "form.title.joinGatheringAction": "Leave another Echo",
  "form.gathering.addingTo": "Adding to this gathering",
  "form.nick.label": "Nickname",
  "form.avatar.label": "Choose an avatar",
  "form.avatar.choose": "Choose an avatar",
  "form.avatar.change": "Change avatar",
  "form.avatar.pickerTitle": "Choose your avatar",
  "form.avatar.pickerHint": "This is how other fans will see you on the map.",
  "form.comment.label": "Your words",
  "form.comment.hint": "Share where you were, who you were with, what felt special — anything goes.",
  "form.moreDetails": "More details",
  "form.submit": "Leave an Echo",
  "form.cancel": "Cancel",
  "form.error.nickTooShort": "At least 3 characters.",
  "form.error.nickTooLong": "At most 20 characters.",
  "form.error.nickInvalidChars": "Letters, digits, underscore or spaces only.",
  "form.error.nickAlreadyTaken": "This nickname is used by a registered user.",
  "form.error.nickCheckFailed": "Couldn't verify — try again.",
  "form.error.nickContainsOfficial": "Cannot contain 'official'.",
  "form.error.nickImpersonatesTarja": "Tarja Turunen herself isn't on Frisson Map — pick a fan name (e.g. tarja_fan).",
  "form.error.nickIsBareTarja": "Just 'tarja' is reserved to avoid impersonation. Add something distinctive (e.g. tarja_fan).",
  "form.error.avatarRequired": "Please choose an avatar.",
  "form.error.commentRequired": "Please write a few words — that's what makes it an Echo.",
  "form.error.commentTooLong": "Comment must be at most 500 characters.",
  "form.anonNationality.toggle": "🌍 Add your nationality",
  "form.anonNationality.label": "Where are you from? (optional)",
  "form.anonNationality.none": "— Skip —",
  "form.anonNationality.hint": "Shown as a small flag on your Echo, marked as \"self-declared, anonymous\".",
  "pin.anonNationalityTooltip": "Self-declared · anonymous",
  "pin.regNationalityTooltip": "Self-declared · registered user",
  "pin.error.createFailed": "Could not save the Echo. Please try again.",
  "map.error.loadFailed": "Couldn't load the map — retrying…",
  "footer.privacy": "Privacy",
  "footer.terms": "Terms",
  "footer.about": "About",
  "cookies.text": "We only use essential cookies needed to keep the app working. We don't track you or use analytics.",
  "cookies.gotIt": "Got it",
  "geo.title": "Use your location?",
  "geo.text": "Frisson Map can use your device location to suggest where to add an Echo. Your exact coordinates are never stored — we only keep the rounded neighbourhood you choose.",
  "geo.allow": "Allow",
  "geo.deny": "Not now",
  "lightbox.title": "Photo",
  "legal.backToMap": "← Back to map",
  "legal.lastUpdated": "Last updated:",
  "legal.draftBanner": "Draft notice — this document is a working draft and will be replaced with a professionally reviewed version before the public launch.",

  "about.title": "About Frisson Map",
  "about.hero.tagline": "A map of the Echoes her music left behind.",
  "about.draftBanner": "Draft notice — this page is a working skeleton. Final wording, contact details, and acknowledgements will be revised before the public launch.",
  "about.what.heading": "What this is",
  "about.what.body": "Frisson Map is a fan-made map for Tarja Turunen's community. Add an Echo where her music has touched you, browse Echoes from fans around the world, and find the concerts and meaningful places along the way.",
  "about.notOfficial.heading": "Made by fans, for fans",
  "about.notOfficial.body": "Frisson Map is an independent community project, built by people who simply love Tarja's music. It is not officially run by, endorsed by, or affiliated with Tarja Turunen, her management, or her record label. Every Echo, every event, every line of code comes from the fandom — and is shared back to it.",
  "about.how.heading": "How it works",
  "about.pillars.pin.label": "Leave an Echo",
  "about.pillars.pin.desc": "Mark a place where her music meant something — a concert hall, a view from a window, an ordinary evening that suddenly wasn't.",
  "about.pillars.browse.label": "Browse the map",
  "about.pillars.browse.desc": "See where other fans live with the same songs. A quiet world map of shared Echoes and small private celebrations.",
  "about.pillars.find.label": "Find concerts",
  "about.pillars.find.desc": "Upcoming Frisson Tour dates, online streams, and the places that matter most to the fandom — gathered in one map.",
  "about.privacy.heading": "Your privacy, briefly",
  "about.privacy.body": "Zero tracking. No analytics, no ads, no third-party cookies. Your exact location is never stored — only a fuzzed point inside the area you choose. The full story lives on the Privacy Policy page.",
  "about.privacy.linkLabel": "Privacy Policy",
  "about.builtOn.heading": "Built on open foundations",
  "about.builtOn.body": "Frisson Map runs on open-source mapping — Leaflet, CartoDB Voyager tiles, and the Photon geocoder. It is hosted on AWS and built with plain web technologies. Thank you to every maintainer behind those projects.",
  "about.contact.heading": "Get in touch",
  "about.contact.body": "Bug reports, takedown requests, ideas, or just hello — info@frissonmap.com. Replies may be slow because this is a hobby project, but every message is read.",
  "about.album.body": "Frisson Map exists because of Frisson Noir, Tarja's upcoming album. Drop date: 12 June 2026. See you on the map.",

  "auth.login": "Sign in",
  "auth.register": "Sign up",
  "auth.logout": "Sign out",
  "auth.email.label": "Email",
  "auth.username.label": "Nickname",
  "auth.username.hint": "3–20 characters. Letters (including accents), digits, underscore or spaces.",
  "auth.password.label": "Password",
  "auth.password.hint": "At least 12 characters with one uppercase, one lowercase, one digit and one symbol.",
  "auth.passwordConfirm.label": "Confirm password",
  "auth.error.passwordsDontMatch": "Passwords do not match.",
  "auth.age16.label": "I am at least 16 years old.",
  "auth.consent.label": "I agree to the Privacy Policy and Terms of Service.",
  "auth.consent.note": "You can withdraw consent anytime by deleting your account.",
  "auth.register.title": "Sign up",
  "auth.register.submit": "Sign up",
  "auth.login.title": "Sign in",
  "auth.login.submit": "Sign in",
  "auth.login.signupHint": "Don't have an account?",
  "auth.verify.title": "Verify your email",
  "auth.verify.hint": "We sent a 6-digit code to {destination}. Enter it below to finish creating your account.",
  "auth.verify.hintFallback": "We sent a 6-digit code to your email. Enter it below to finish creating your account.",
  "auth.verify.hintAutoResent": "Your email isn't verified yet. We've sent a fresh code to {destination} — enter it below to finish.",
  "auth.verify.hintBeforeReset": "Before you can reset your password, please verify your email first. We've sent a code to {destination} — enter it below.",
  "auth.verify.verifiedSignIn": "Your email is verified. Sign in below — or use \"Forgot password?\" if you still need a new password.",
  "auth.verify.resendSuccess": "A new code was sent to {destination}.",
  "auth.verify.alreadyVerified": "Your email is already verified — please sign in. Use \"Forgot password?\" if you don't remember your password.",
  "auth.verify.freshCodeHint": "After requesting a new code, wait a moment for the fresh email — codes from older emails stop working.",
  "auth.verify.codeLabel": "Verification code",
  "auth.verify.submit": "Confirm",
  "auth.verify.resend": "Resend code",
  "auth.verify.spamHint": "Didn't get the email? Check your spam folder.",
  "auth.error.consentRequired": "You must confirm the age limit and accept the Privacy Policy and Terms.",
  "auth.error.usernameInvalid": "Nickname must be 3–20 characters: letters, digits, underscore or spaces.",
  "auth.error.emailTaken": "An account with this email already exists.",
  "auth.error.passwordPolicy": "Password does not meet the policy: 12+ characters with uppercase, lowercase, digit and symbol.",
  "auth.error.codeMismatch": "The verification code is not correct.",
  "auth.error.codeExpired": "The verification code has expired. Click 'Resend code'.",
  "auth.error.notConfirmed": "This account is not verified yet — finish the email verification first.",
  "auth.error.badCredentials": "Wrong email or password.",
  "auth.error.limitExceeded": "Too many attempts. Please try again later.",
  "auth.error.registerFailed": "Could not create the account. Please try again.",
  "auth.error.verifyFailed": "Verification failed. Please try again.",
  "auth.error.resendFailed": "Could not resend the code. Please try again later.",
  "auth.error.loginFailed": "Sign-in failed. Please try again.",
  "auth.error.profileMissing": "Your profile is incomplete. Please contact support.",
  "auth.error.noPendingRegistration": "Registration data is missing. Please start over.",
  "auth.error.noPendingForgot": "We lost track of your reset request. Please start over.",

  "auth.forgot.link": "Forgot password?",
  "auth.forgot.emailTitle": "Reset your password",
  "auth.forgot.emailHint": "Enter the email you signed up with. We'll send you a 6-digit code to reset your password.",
  "auth.forgot.sendCode": "Send code",
  "auth.forgot.resetTitle": "Set a new password",
  "auth.forgot.resetHint": "We sent a 6-digit code to {destination}. Enter it below and choose a new password.",
  "auth.forgot.resetHintFallback": "Enter the 6-digit code we emailed you and choose a new password.",
  "auth.forgot.newPasswordLabel": "New password",
  "auth.forgot.newPasswordConfirmLabel": "Confirm new password",
  "auth.forgot.resetSubmit": "Reset password",
  "auth.forgot.success": "Password reset. Sign in with your new password.",
  "auth.error.forgotSendFailed": "Could not send a reset code. Please try again.",
  "auth.error.forgotResetFailed": "Could not reset your password. Please try again.",
  "auth.error.userNotConfirmed": "This account isn't verified yet. Sign in to receive a fresh verification code.",
  "auth.continueWithGoogle": "Continue with Google",
  "auth.magicLink.button": "Email me a sign-in link",
  "auth.magicLink.title": "Email me a sign-in link",
  "auth.magicLink.hint": "Enter your email and we'll send you a one-time sign-in link.",
  "auth.magicLink.send": "Send link",
  "auth.magicLink.sending": "Sending…",
  "auth.magicLink.sentBtn": "Link sent",
  "auth.magicLink.sent": "If an account exists for that email, we've sent a sign-in link. Open it in this same browser within a few minutes.",
  "auth.magicLink.error": "Couldn't send the sign-in link. Please try again.",
  "auth.error.magicLinkFailed": "That sign-in link didn't work. Please request a fresh one and open it right away.",
  "auth.error.magicLinkHandoff": "Opening from another app can break the sign-in link. Request a new one here.",
  "auth.or": "OR",
  "auth.googleConsent": "By continuing with Google you confirm you're 16 or older and agree to our",
  "auth.signupConsent": "By creating an account you confirm you're 16 or older and agree to our",
  "auth.error.federatedFailed": "Google sign-in didn't complete. Please try again — or sign in with your email and password.",
  "auth.error.federatedHandoff": "Opening from another app sometimes fails the first time. Continue with Google once more.",
  "auth.profile.title": "Profile settings",
  "auth.profile.save": "Save",
  "auth.menu.openTitle": "Open user menu",
  "auth.menu.profile": "Profile",
  "auth.menu.security": "Security (2FA)",
  "auth.menu.preferences": "Preferences",
  "auth.menu.data": "Your data",
  "auth.contacts.label": "Social links",
  "auth.contacts.hint": "Up to 5. Visible only to signed-in visitors.",
  "auth.contacts.add": "+ Add",
  "auth.contacts.remove": "Remove",
  "auth.contacts.pickPlatform": "Which platform is this?",
  "auth.contacts.detected": "Detected",
  "auth.contacts.inputPlaceholder": "Paste a social link",
  "auth.contacts.inputLabel": "Social link",
  "auth.contacts.platformLabel": "Platform",
  "auth.contacts.maxReached": "You've reached the maximum of 5 links.",
  "auth.contacts.platform.discord": "Discord",
  "auth.contacts.platform.instagram": "Instagram",
  "auth.contacts.platform.x": "X / Twitter",
  "auth.contacts.platform.reddit": "Reddit",
  "auth.contacts.platform.facebook": "Facebook",
  "auth.contacts.platform.youtube": "YouTube",
  "auth.contacts.platform.telegram": "Telegram",
  "auth.contacts.platform.tiktok": "TikTok",
  "auth.contacts.platform.web": "Website",
  "profile.loading": "Loading profile…",
  "profile.loadError": "Couldn't load this profile.",
  "profile.verifiedLabel": "Verified account",
  "profile.registered": "Joined",
  "profile.bannedChip": "BANNED",
  "profile.banDetail.heading": "This user is banned.",
  "profile.banDetail.reason": "Reason",
  "profile.banDetail.bannedAt": "Banned",
  "profile.banDetail.expires": "Expires",
  "profile.banDetail.permanent": "Permanent",
  "profile.echo.songChartHint": "See this song in the Chart",
  "profile.pins.count": "Echoes",
  "profile.pins.heading": "Recent Echoes",
  "profile.pins.empty": "No Echoes yet.",
  "profile.stats.aria": "Activity",
  "profile.stats.echoes": "Echoes",
  "profile.stats.songsRated": "Songs rated",
  "profile.songRatings.heading": "Song ratings",
  "profile.songRatings.album": "· Frisson Noir",
  "profile.songRatings.rated": "Rated {n}",
  "profile.anonUnifiedNudge": "Sign in to view this user's profile and Echo list",
  "profile.focus": "Show on map",
  "profile.focus.empty": "This user has no Echoes yet",
  "profile.focus.tooltip": "Zoom the map to show all this user's Echoes",
  "profile.pin.fallback": "Echo from {date}",
  "profile.contact.heading": "Social",
  "profile.contact.empty": "No social links shared.",
  "profile.contact.signInNudge": "Sign in to view social handles",
  "profile.contact.platform.discord": "Discord",
  "profile.contact.platform.instagram": "Instagram",
  "profile.contact.platform.x": "X / Twitter",
  "profile.contact.platform.reddit": "Reddit",
  "profile.contact.platform.facebook": "Facebook",
  "profile.contact.platform.youtube": "YouTube",
  "profile.contact.platform.telegram": "Telegram",
  "profile.contact.platform.tiktok": "TikTok",
  "profile.contact.platform.web": "Website",
  "auth.profile.emailLabel": "Email",
  "auth.profile.emailPrivacy": "Not visible in your public profile.",
  "auth.profile.sectionAccount": "Account",
  "auth.profile.sectionPublic": "Public profile",
  "auth.profile.usernameUpdated": "Nickname updated.",
  "auth.error.usernameTaken": "Nickname is already taken.",
  "auth.error.usernameReserved": "This nickname is reserved (impersonation guard).",
  "auth.error.profileUpdateFailed": "Could not update profile. Please try again.",
  "form.close": "Close",
  "auth.security.title": "Two-factor authentication",
  "auth.security.checking": "Checking…",
  "auth.security.enabled": "Two-factor authentication is enabled.",
  "auth.security.disabled": "Two-factor authentication is disabled.",
  "auth.security.federatedNotice": "You sign in with Google. Two-factor authentication is managed in your Google account.",
  "auth.security.enable": "Enable 2FA",
  "auth.security.disable": "Disable 2FA",
  "auth.security.setupTitle": "Set up two-factor authentication",
  "auth.security.setupHint": "Scan the QR code below with an authenticator app (Google Authenticator, 1Password, Authy, …), then enter the first 6-digit code the app shows.",
  "auth.security.manualEntry": "Can't scan? Show secret to enter manually",
  "auth.security.codeLabel": "Verification code from your app",
  "auth.security.verifyAndEnable": "Verify & enable",
  "auth.security.verify": "Verify",
  "auth.security.disableTitle": "Disable two-factor authentication?",
  "auth.security.disableHint": "You will sign in with just your password from now on. You can re-enable 2FA later anytime.",
  "auth.security.confirmDisable": "Disable 2FA",
  "auth.security.challengeTitle": "Enter your authentication code",
  "auth.security.challengeHint": "Enter the 6-digit code from your authenticator app to finish signing in.",
  "auth.security.enableSuccess": "Two-factor authentication enabled.",
  "auth.security.disableSuccess": "Two-factor authentication disabled.",
  "auth.error.mfaSetupFailed": "Could not set up 2FA. Please try again.",
  "auth.error.mfaCodeWrong": "That code is not correct or expired. Try the latest one from your app.",
  "auth.error.mfaToggleFailed": "Could not change 2FA setting. Please try again.",
  "auth.error.mfaChallengeFailed": "Could not verify the code. Please try again.",

  "pin.modDelete.body": "Pick the reason category — it shows as a chip on the owner's view. The optional note carries any specific message you want them to see.",
  "report.button": "Report",
  "report.button.title": "Report this Echo to Crew",
  "report.title": "Report this Echo",
  "report.hint": "Tell us what's wrong. The Crew will review it.",
  "report.reason.label": "Reason",
  "report.reason.spam": "Spam or unrelated content",
  "report.reason.inappropriate": "Inappropriate content",
  "report.reason.hate_speech": "Hate speech or harassment",
  "report.reason.personal_info": "Personal information",
  "report.reason.other": "Something else",
  "report.comment.label": "Additional details (optional)",
  "report.submit": "Send report",
  "report.success": "Thanks — we received your report. Crew will review it.",
  "report.error.reasonRequired": "Please choose a reason.",
  "report.error.commentTooLong": "Details must be at most 500 characters.",
  "report.titleGroup": "Report this gathering",
  "report.hintGroup": "A gathering only has its name — tell us what's wrong with it. The Crew will review it.",
  "report.reason.inappropriate_name": "Inappropriate gathering name",
  "report.reason.spam_group": "Spam or junk gathering",
  "report.commentGroup.label": "Why are you reporting this gathering? (required)",
  "report.error.commentRequiredGroup": "Please add a comment explaining the problem.",
  "report.error.pinNotFound": "This Echo no longer exists.",
  "report.error.submitFailed": "Could not send the report. Please try again.",

  "captcha.error.loadFailed": "Spam protection failed to load. Please refresh the page.",
  "captcha.error.notSolved": "Please complete the spam-protection check before submitting.",
  "captcha.error.rejected": "Spam-protection check failed. Please complete it again.",

  "auth.data.title": "Your data",
  "auth.data.hint": "Download a copy of everything we have on you, or delete your account permanently. Echoes and reports you've posted will stay on the map but be anonymised.",
  "auth.data.export": "Download my data",
  "auth.data.delete": "Delete my account",
  "auth.data.deleteTitle": "Delete your account?",
  "auth.data.deleteHint": "This is permanent. Your account, profile, and login will be deleted immediately. By default the Echoes you've posted stay on the map (anonymised). Tick the box below if you want them removed as well. There is no undo.",
  "auth.data.deletePinsLabel": "Also delete all my Echoes",
  "auth.data.deleteConfirmLabel": "Type",
  "auth.data.deleteConfirmLabelSuffix": "to confirm",
  "auth.data.deleteSubmit": "Delete forever",
  "auth.data.deleteWrongToken": "Type DELETE in capital letters to confirm.",
  "auth.data.deleteSuccess": "Your account has been deleted. Goodbye.",
  "auth.data.deleteSuccessTitle": "Account deleted",
  "auth.data.deleteFailed": "Could not delete your account. Please try again or contact support.",
  "auth.error.exportFailed": "Could not download your data. Please try again.",

  "auth.federatedConsent.title": "One last step",
  "auth.federatedConsent.hint": "To finish setting up your Frisson Map account, please confirm:",
  "auth.federatedConsent.submit": "Continue",

  "auth.admin": "Backstage",

  "auth.password.show": "Show password",
  "auth.password.hide": "Hide password",

  "form.authHint.label": "Want to manage your Echoes later?",
  "form.authHint.or": "or",
  "form.privacyNote": "Echoes are public — please don't pin your exact home or share personal details.",

  "pin.error.rateLimitedAnonymous": "Daily guest limit reached (20 Echoes). Open the sign-up form?",
  "pin.error.rateLimited": "Daily Echo limit reached. Try again tomorrow.",
  "pin.error.accountBanned": "Your account is banned — see the banner above.",
  "pin.error.maxActivePins": "You're at the 50-Echo limit. Delete one to add a new Echo.",
  "pin.error.userNotSynced": "Session is out of date — sign out and back in.",
  "pin.error.nickReserved": "This nickname is used by a registered user.",
  "addPin.button.ariaLabel": "Leave an Echo on the map",
  "addPin.song.label": "Song (optional)",
  "addPin.song.placeholder": "Choose a track from Frisson Noir…",
  "addPin.song.aria": "Tag this Echo with a song from Frisson Noir",
  "addPin.song.hint": "Which song is this Echo about?",
  "menu.toggle.ariaLabel": "Open menu",
  "menu.close.ariaLabel": "Close menu",
  "menu.viewProfile": "View profile",
  "menu.accountGroup": "Account",
  "menu.adminHint": "Admin",

  "pin.delete.button": "Delete",
  "pin.delete.title": "Delete this Echo",
  "pin.delete.confirm": "Permanently delete this Echo? This cannot be undone.",
  "pin.delete.foundingTitle": "Delete your echo?",
  "pin.delete.foundingConfirm": "Your echo will be removed, but the gathering and replies stay. Delete it?",
  "pin.delete.failed": "Could not delete the Echo. Please try again.",
  "pin.delete.toast": "Echo deleted.",
  "pin.rowMenu.title": "Actions",
  "pin.detach.action": "Detach",
  "pin.detach.done": "Echo detached from the gathering.",
  "pin.modDelete.button": "Delete",
  "pin.modDelete.title": "Delete (moderation)",
  "pin.modDelete.body": "Tell the audit log why this Echo is being removed. The author won't see this reason; it's recorded for Crew accountability.",
  "pin.modDelete.placeholder": "e.g. Off-topic spam reported by 3 fans.",
  "pin.modDelete.toast.success": "Echo deleted (moderation).",
  "pin.modDelete.toast.failed": "Couldn't delete the Echo — please retry.",
  "pin.modReports.tooltip": "Moderate pending reports",
  "pin.reportedChip": "Reported",
  "pin.gatheringChip": "Gathering",
  "pin.gatheringChip.tooltip": "Echoes from several fans in one place",
  "pin.journalChip": "Journal",
  "pin.journalChip.tooltip": "One fan's personal trail of Echoes",
  "pin.gathering.openChipTooltip": "Open — join it with your Echo",
  "pin.modReports.title": "Moderate reports",
  "pin.modReports.body": "Pending reports for this Echo:",
  "pin.modReports.noPending": "No pending reports.",
  "pin.modReports.loadFailed": "Couldn't load reports — try again.",
  "pin.modReports.action.approve": "Approve",
  "pin.modReports.action.delete": "Delete Echo",
  "pin.modReports.approve.title": "Approve Echo?",
  "pin.modReports.approve.body": "Optional moderation note (audit log). Reports will be dismissed; Echo stays on the map.",
  "pin.modReports.approve.placeholder": "e.g. Looked fine after checking the photo.",
  "pin.modReports.approve.cta": "Approve Echo",
  "pin.modReports.approve.toast": "Echo approved — reports dismissed.",
  "pin.modReports.delete.title": "Delete this Echo?",
  "pin.modReports.delete.kotvaTitle": "Delete gathering (with Echoes)?",
  "pin.modReports.delete.body": "Pick the reason category — it shows as a chip on the owner's view. Pending reports for this Echo will be auto-resolved.",
  "pin.modReports.delete.cta": "Delete Echo",
  "pin.modReports.delete.toast": "Echo deleted — reports resolved.",
  "pin.modReports.titleContainer": "Moderate gathering title",
  "pin.modReports.titleGroup": "Moderate gathering",
  "pin.modReports.bodyContainer": "Pending reports for this gathering's name:",
  "pin.modReports.bodyGroup": "Pending reports for this gathering:",
  "pin.modReports.bodyKotva": "Pending reports for this gathering:",
  "pin.modReports.action.keepName": "Keep name",
  "pin.modReports.action.keepGroup": "Keep gathering",
  "pin.modReports.action.clearName": "Clear name",
  "pin.modReports.action.deleteGroup": "Delete gathering ({count} Echoes)",
  "pin.modReports.action.deleteAnchor": "Delete gathering ({count} Echoes)",
  "pin.modReports.approve.toastContainer": "Reports dismissed.",
  "pin.modReports.delete.containerTitle": "Delete this gathering + {count} Echoes?",
  "pin.modReports.delete.anchorTitle": "Delete this gathering + {count} Echoes?",
  "pin.modReports.delete.containerBody": "Deleting the gathering also removes every Echo inside it — the owner sees them in their Deleted Echoes list. Pending reports will be auto-resolved.",
  "pin.modReports.delete.ctaGroup": "Delete gathering",
  "pin.modReports.delete.ctaAnchor": "Delete gathering",
  "pin.modReports.delete.toastGroup": "Gathering deleted — reports resolved.",
  "pin.modReports.clearName.title": "Clear this gathering's name?",
  "pin.modReports.clearName.body": "The gathering's name is removed and its popup falls back to the location. The Echoes inside stay untouched.",
  "pin.modReports.clearName.placeholder": "Reason (kept in the moderation log only).",
  "pin.modReports.clearName.cta": "Clear name",
  "pin.modReports.clearName.toast": "Gathering name cleared — reports resolved.",

  "pin.edit.button": "Edit",
  "pin.edit.title": "Edit this Echo",
  "pin.edit.kotvaRename": "Rename gathering",
  "pin.edit.kotvaRenameTitle": "Rename this gathering",
  "pin.edit.modalTitle": "Edit your Echo",
  "pin.edit.submit": "Save",
  "pin.edit.currentLocationLabel": "Current location",
  "pin.edit.movePin": "Move Echo",
  "pin.edit.moveBannerHint": "Click anywhere on the map to set the new location.",
  "pin.edit.moveBannerCancel": "Cancel",
  "pin.edit.nameLabel": "Gathering name (optional)",
  "pin.edit.namePlaceholder": "e.g. My Helsinki spot",
  "pin.edit.nameHelp": "Give this place a memorable name. Other Echoes you add nearby will be offered to join this gathering.",

  "auth.preferences.avatarLabel": "Your avatar",
  "auth.preferences.avatarChange": "Change avatar",
  "auth.preferences.avatarPickerTitle": "Pick an avatar",
  "auth.preferences.avatarHint": "Shown next to every Echo you create. Pick one or leave the default.",

  "pin.grouping.label": "Add to a gathering (optional)",
  "pin.grouping.hint": "Adds this Echo under an existing gathering of yours instead of as a separate map marker.",
  "pin.grouping.choose": "Choose a nearby gathering",
  "pin.grouping.remove": "Remove",
  "pin.grouping.chipGeneric": "Added to a gathering",
  "pin.grouping.noCountry": "We couldn't detect a country for this location, so we can't suggest nearby gatherings.",

  "pin.noComment": "(no comment)",

  "pin.expand.label": "Show all {count} Echoes →",
  "pin.expand.title": "See all Echoes in this gathering",
  "pin.expand.loading": "Loading…",
  "pin.expand.failed": "Couldn't load the Echoes.",
  "pin.expand.count": "{count} Echoes",
  "pin.expand.untitled": "Gathering",
  "pin.expand.loadMore": "Load more Echoes",

  "pin.addChild.button": "Leave an Echo",
  "pin.addChild.kotvaTitle": "Leave another Echo in this gathering",
  "pin.addChild.standaloneTitle": "Leave another Echo here (this becomes a gathering)",

  "pin.container.fallbackTitle": "Gathering",

  "pin.delete.kotva.title": "Delete \"{name}\"?",
  "pin.delete.kotva.subtitle": "This Echo is a gathering for {count} linked Echoes.",
  "pin.delete.kotva.cancel": "Cancel",
  "pin.delete.kotva.cascade.title": "Delete Echoes and the gathering",
  "pin.delete.kotva.cascade.desc": "Permanently remove this gathering together with all {count} Echoes inside.",
  "pin.delete.kotva.othersTitle": "Delete the gathering?",
  "pin.delete.kotva.othersBody": "Your Echoes will be removed. Echoes from other fans stay on the map as standalone markers.",
  "pin.delete.kotva.move.title": "Move Echoes under another gathering",
  "pin.delete.kotva.move.desc": "Pick another of your gatherings to host these Echoes. The current gathering will be removed afterwards.",
  "pin.delete.kotva.move.heading": "Where should the Echoes go?",
  "pin.delete.kotva.move.subtitle": "Top nearby gatherings in the same country. Dimmed ones are in a different city.",
  "pin.delete.kotva.move.loading": "Looking up nearby gatherings…",
  "pin.delete.kotva.move.failed": "Couldn't fetch nearby gatherings. Try again or pick another option.",
  "pin.delete.kotva.move.none": "You have no other gatherings in this country yet.",
  "pin.delete.kotva.move.distance": "{km} km away",
  "pin.delete.kotva.elevate.title": "Break up the gathering (keep all Echoes)",
  "pin.delete.kotva.elevate.desc": "Each Echo becomes a standalone marker on the map.",

  "pin.leave.title": "Leave \"{name}\"?",
  "pin.leave.subtitle": "Other fans have Echoes here, so this gathering stays. You can leave it.",
  "pin.leave.keepOthers.title": "Leave and keep my other Echoes",
  "pin.leave.keepOthers.desc": "Your other Echoes here become standalone markers.",
  "pin.leave.deleteOthers.title": "Leave and delete my other Echoes",
  "pin.leave.deleteOthers.desc": "Your other Echoes here are permanently removed.",
  "pin.leave.soloTitle": "Leave this gathering?",
  "pin.leave.soloBody": "Your Echo becomes a tombstone. The gathering and other fans' Echoes stay.",
  "pin.leave.soloCta": "Leave",
  "pin.leave.ceilingError": "Keeping your other Echoes would put you over your 50-pin limit. Choose \"Leave and delete my other Echoes\" instead, or remove a few pins first.",
  "pin.curate.title": "Delete \"{name}\"?",
  "pin.curate.subtitle": "This is your group of {count} Echoes.",
  "pin.curate.keepOthers.title": "Keep my other Echoes",
  "pin.curate.keepOthers.desc": "Your oldest Echo is removed; the rest stay grouped here.",
  "pin.curate.deleteOthers.title": "Delete the whole group",
  "pin.curate.deleteOthers.desc": "Permanently remove all {count} of your Echoes here.",

  "addPin.nearby.title": "Place your Echo",
  "addPin.nearby.subtitle": "Solo, or join a gathering?",
  "addPin.nearby.asNew": "Leave it on its own",
  "addPin.nearby.newDesc": "A standalone Echo, right where you clicked.",
  "addPin.nearby.sectionYours": "Your places nearby",
  "addPin.nearby.sectionOpen": "Open gatherings · other fans",
  "addPin.nearby.yourGatheringEyebrow": "Your gathering",
  "addPin.nearby.groupEchoEyebrow": "Your Echo",
  "addPin.nearby.groupEchoHint": "Pairs with this to start a gathering",
  "addPin.nearby.openGatheringEyebrow": "Open gathering",
  "addPin.nearby.metaEcho": "{count} echo",
  "addPin.nearby.metaEchoes": "{count} echoes",
  "addPin.nearby.metaKm": "{km} km away",
  "addPin.nearby.untitled": "Untitled Echo",
  "addPin.nearby.cancel": "Cancel",

  "form.openGathering.label": "Allow others to join?",
  "form.openGathering.hint": "Open a Gathering and let fans add their Echoes.",
  "form.openGathering.nameLabel": "Gathering name",
  "form.openGathering.namePlaceholder": "e.g. Helsinki fans at the arena",
  "form.openGathering.nameRequired": "An open gathering needs a name.",
  "form.openGathering.nameTaken": "Another open gathering already uses this name.",
  "form.openGathering.nameCheckFailed": "Couldn't check the name right now — please retry.",
  "form.openGathering.thinking": "Thinking of a name…",

  "pin.gathering.openBadge": "Open",
  "pin.gathering.joinedLabel": "Joined",
  "pin.gathering.hostBadge": "Host",
  "pin.gathering.fansHere": "{n} fans gathered here",
  "pin.join.button": "Leave an Echo here",
  "pin.join.title": "Leave an Echo in this open gathering",
  "pin.join.nudge": "Sign in to join →",
  "pin.join.error.blocked": "The gathering owner removed you from their gatherings.",
  "pin.join.error.full": "This gathering is full right now.",
  "pin.join.error.closed": "This gathering isn't open for new Echoes.",
  "pin.join.error.dailyLimit": "You've reached today's limit for joining gatherings. Try again tomorrow.",

  "pin.kick.menuRemove": "Remove from gathering",
  "pin.kick.menuBlock": "Remove & block this fan",
  "pin.kick.removeTitle": "Remove this Echo from your gathering?",
  "pin.kick.removeBody": "{nick}'s Echo leaves your gathering and becomes their own standalone marker. You're not deleting their content.",
  "pin.kick.removeCta": "Remove from gathering",
  "pin.kick.blockTitle": "Remove & block {nick}?",
  "pin.kick.blockBody": "Their Echoes leave your gathering and they won't be able to join any of your open gatherings again. Their content stays as their own standalone markers.",
  "pin.kick.blockCta": "Remove & block",
  "pin.kick.toastRemoved": "Removed from your gathering.",
  "pin.kick.toastBlocked": "Removed and blocked.",
  "pin.kick.failed": "Couldn't update the gathering — please retry.",

  "quota.anon.remaining": "{count} Echoes left today",
  "quota.anon.almostOut": "Only {count} Echoes left today. Sign up for unlimited.",
  "quota.anon.exhausted": "Daily limit reached. Sign up to keep posting.",
  "quota.user.almostOut": "{count} gatherings left today.",
  "quota.user.exhausted": "Daily gathering limit reached. Try again tomorrow.",
  "quota.user.ceiling": "You've reached the maximum of {ceiling} active gatherings. Remove or merge one to add a new one.",

  "admin.pinKind.kotva": "🪝 Gathering {name} ({count} Echoes inside)",
  "admin.pinKind.child": "📌 Echo inside a gathering",
  "admin.pinKind.standalone": "📍 Standalone Echo",
  "admin.detail.pinKind": "Echo type",
  "admin.action.deleteKotva.confirmTitle": "Delete this gathering + {count} Echoes inside?",
  "admin.action.deleteKotva": "Delete gathering + {count} Echoes",
  "admin.action.deleteKotva.warn": "⚠️ This deletes the gathering AND its {count} child Echoes. Cascade is irreversible.",

  "admin.limits.title": "Echo grouping limits",
  "admin.limits.subtitle": "Adjust at runtime — changes propagate within 5 minutes.",
  "admin.limits.anonDaily": "Anonymous Echoes / IP / 24h",
  "admin.limits.regDaily": "New gatherings per user / 24h",
  "admin.limits.regCeiling": "Active gatherings per user (ceiling)",
  "admin.limits.save": "Save",
  "admin.limits.saved": "Saved.",
  "admin.limits.failed": "Couldn't save — please try again.",
  "admin.unsaved.title": "Unsaved changes",
  "admin.unsaved.body": "You have unsaved changes in this tab. Save them before switching?",
  "admin.unsaved.save": "Save and switch",
  "admin.unsaved.stay": "Stay here",
  "admin.aiLimits.title": "AI & propose limits",
  "admin.aiLimits.subtitle": "Daily caps for AI lookups and landmark proposals. Raise these if testing hits the ceiling; changes propagate within 5 minutes.",
  "admin.aiLimits.aiPerUser": "AI lookups / user / 24h",
  "admin.aiLimits.aiPerUserHint": "How many concert/venue AI lookups one user may run per day.",
  "admin.aiLimits.aiGlobal": "AI lookups / day (everyone)",
  "admin.aiLimits.aiGlobalHint": "Total AI lookups across all users per day — the main guard on monthly Bedrock spend.",
  "admin.aiLimits.poiPerUser": "Landmark proposals / user / 24h",
  "admin.aiLimits.poiPerUserHint": "How many new landmarks one user may propose per day.",
  "admin.aiLimits.translationCap": "Echo translations / day (everyone)",
  "admin.aiLimits.translationCapHint": "Total Echo translations across everyone per day — a cost valve, not a per-user limit. When the day's total is reached, translation turns off for everyone until tomorrow. Set to 0 to turn it off entirely (the translate glyph disappears for everyone).",
  "admin.usage.title": "Usage & spend",
  "admin.usage.subtitle": "Live usage and cost for the metered services behind the app, read directly from each provider.",
  "admin.usage.unknown": "Usage status currently unavailable.",
  "admin.usage.aws.line": "AWS this month: ${spent} of ${limit} ({percent}%).",
  "admin.usage.ai.title": "AI descriptions",
  "admin.usage.tavily.title": "Web search",
  "admin.usage.tavily.subtitle": "Web search that feeds AI descriptions (Tavily). Free tier — $0.008 per credit over the monthly cap.",
  "admin.usage.tavily.line": "{used} of {limit} credits this month ({percent}%) · {remaining} left.",
  "admin.usage.tavily.paygo": " Over the cap: {paygo} extra credits = ${cost}.",
  "admin.usage.email.title": "Email",
  "admin.usage.email.subtitle": "Transactional emails — sign-up codes, password reset (Resend). Free tier — $0 until the cap.",
  "admin.usage.email.line": "{sent} of {limit} emails this month (~{percent}%) · {remaining} left.",
  "admin.aiPoi.subtitle": "Auto-fill of landmark & venue descriptions via Claude Haiku 4.5. Turn off if Bedrock spend approaches the monthly cap (alert mirrored from AWS Budget).",
  "admin.aiPoi.enabledLabel": "Enable AI description auto-fill",
  "admin.aiPoi.spendLine": "Spent ${spent} of ${limit} this month ({percent}%) · ${remaining} left.",
  "admin.aiPoi.spendUnknown": "Bedrock spend status currently unavailable.",
  "admin.aiPoi.alert.warning": "AWS Budget warning — Bedrock spend ${spent} of ${limit} ({percent}%). Consider disabling AI description auto-fill below.",
  "admin.aiPoi.alert.critical": "AWS Budget exceeded — Bedrock spend ${spent} of ${limit} ({percent}%). Disable AI description auto-fill now to prevent further charges.",
  "admin.aiPoi.alert.unknown": "Couldn't read AWS Budget status. Check the AWS console or disable AI descriptions as a precaution.",
  "admin.aiPoi.toggleFailed": "Couldn't update the kill switch — please retry.",
  "admin.aiGatheringName.enabledLabel": "Enable AI gathering-name suggestions",
  "pin.error.editFailed": "Could not update the Echo. Please try again.",
  "pin.error.gatheringUpdatePartial": "Your Echo was saved, but the gathering name or open setting couldn't be updated. Please try again.",
  "pin.error.editForbidden": "You can only edit Echoes you own.",
  "pin.error.bannedWords": "Your text contains language we don't allow. Please rephrase.",
  "pin.error.noLinks": "Links are not allowed in this field.",
  "pin.error.links": "Links aren't allowed in an Echo.",
  "pin.error.phoneNotAllowed": "Phone numbers aren't allowed in an Echo.",
  "pin.error.emailNotAllowed": "Email addresses aren't allowed in an Echo.",

  "pin.drag.signInNudge": "Sign in to move your Echoes across sessions.",
  "pin.drag.mergeDone": "Merged into your gathering.",
  "pin.drag.undo": "Undo",
  "pin.drag.undoneMerge": "Merge undone.",
  "pin.drag.undoFailed": "Could not undo the merge. Please try again.",
  "pin.drag.dropFailed": "Could not move the Echo. Please try again.",
  "pin.drag.mergeCrossCountryBlocked": "Echoes in different countries can't be grouped together.",
  "pin.drag.mergeIntoChildBlocked": "Can't merge under an Echo that is already inside a gathering.",
  "pin.drag.testDataMergeBlocked": "Test Echoes can't be merged with real Echoes.",
  "pin.drag.unmergeDone": "Echo detached from the gathering.",
  "pin.drag.unmergeCeilingHit": "You've reached the active gatherings limit — delete one before detaching this Echo.",
  "pin.drag.containerMergeBlocked": "A gathering can't be merged into another Echo — gatherings always stay on top. To move it, drop it on an empty spot.",
  "pin.drag.gatheringGuestsLocked": "This gathering can't be moved — other fans have already added their Echoes here.",

  "validation.noUrlInField": "Links aren't allowed here — remove the URL.",

  "pin.location.label": "Location",
  "pin.location.addingTo": "Adding to",
  "pin.location.detecting": "Detecting location…",
  "pin.location.unavailable": "Location details unavailable.",
  "pin.location.serviceUnavailable": "Location lookup is briefly down. Your Echo will still save — just without city and country details.",
  "pin.location.notAPlace": "We couldn't find a place here — pick a spot on land. The open sea can't hold an Echo.",
  "pin.location.hint": "Your exact GPS is never stored — the Echo will be placed randomly within your privacy boundary.",
  "pin.customLabel.label": "Place name (optional)",
  "pin.customLabel.hint": "Set a custom name if the detected one doesn't fit.",
  "form.error.customLabelTooLong": "Place name must be at most 80 characters.",
  "search.placeholder": "Search a place…",
  "search.ariaLabel": "Search for a place",
  "search.searching": "Searching…",
  "search.noResults": "No matches for \"{query}\"",
  "search.recent": "Recent searches",
  "search.recent.clear": "Clear",
  "search.clear": "Clear search",
  "search.toggleExpand": "Open search",
  "search.collapse": "Close search",

  "legend.toggle.label": "Legend",
  "legend.toggle.aria": "Show map legend",
  "legend.toggle.tooltip": "What each marker and pin on the map means",
  "legend.title": "Legend",
  "legend.concert.title": "Concert",
  "legend.concert.desc": "Tarja live show",
  "legend.landmark.title": "Landmark",
  "legend.landmark.desc": "A place from her story",
  "legend.fanMoment.title": "Fan Echo",
  "legend.fanMoment.desc": "Someone's memory",
  "legend.yourMoment.title": "Your Echo",
  "legend.yourMoment.desc": "Yours, highlighted",
  "legend.openGathering.title": "Open Gathering",
  "legend.openGathering.desc": "Join it with your Echo",
  "legend.cluster.title": "Cluster",
  "legend.cluster.desc": "Number = Echoes inside",

  "addPin.button": "+ Leave an Echo",
  "addPin.fabLabel": "Echo",
  "addPin.title": "Leave an Echo",
  "addPin.hint": "How do you want to place it?",
  "addPin.option.gps.title": "Use my current location",
  "addPin.option.gps.hint": "Only an approximate point is stored — never your exact spot.",
  "addPin.option.click.title": "Click on the map",
  "addPin.option.click.hint": "Pick the exact spot yourself.",
  "addPin.option.search.title": "Search for a place",
  "addPin.option.search.hint": "Find a place by name, then drop your Echo.",
  "addPin.clickBanner.hint": "Click anywhere on the map to place your Echo.",
  "addPin.clickBanner.cancel": "Cancel",
  "addPin.gps.requesting": "Asking your browser for your location…",
  "addPin.gps.unsupported": "Your browser doesn't support geolocation. Pick another option.",
  "addPin.gps.error.denied": "You denied location access. Pick another option.",
  "addPin.gps.error.unavailable": "Your location is currently unavailable. Try again or pick another option.",
  "addPin.gps.error.timeout": "Locating you took too long. Try again or pick another option.",
  "addPin.gps.error.generic": "Could not get your location. Pick another option.",

  "pinPrivacyChooser.title": "How precise should your Echo be?",
  "pinPrivacyChooser.hint": "Your exact GPS is never stored. Pick how exactly your Echo is placed on the map — we'll save a random point inside the boundary you choose.",
  "pinPrivacyChooser.submit": "Continue",
  "pinPrivacyChooser.poiUnavailable": "No public place nearby — this option only works at landmarks like Eiffel Tower.",

  "echoFlow.location.searchPlaceholder": "Search a city or place…",
  "echoFlow.location.locateAria": "Use my current location",
  "echoFlow.location.pickOnMap": "or pick on the map",
  "echoFlow.location.change": "Change",
  "echoFlow.location.precisionTitle": "Placed at random within",
  "echoFlow.location.precisionDone": "OK",
  "echoFlow.location.mapAria": "Where your Echo will be placed",
  "echoFlow.location.scatterNote": "Random spot in this area",
  "echoFlow.location.exactNote": "Saved exactly here",
  "echoFlow.location.scatterDesc": "Your Echo drops at a random point inside this area — never an exact position.",
  "echoFlow.location.exactDesc": "Your Echo lands on this precise point on the map.",
  "echoFlow.location.required": "Pick where your Echo belongs.",
  "echoFlow.location.hintCountry": "Somewhere in the country",
  "echoFlow.location.hintCity": "Somewhere in the city",
  "echoFlow.location.hintNeighborhood": "Somewhere in the neighborhood",
  "echoFlow.location.hintStreet": "Along the street",
  "echoFlow.location.hintExact": "This exact place",


  "auth.preferences.title": "Preferences",
  "auth.preferences.subtitle": "These settings personalise how Echoes from you are placed and shown.",
  "auth.preferences.nationalityLabel": "Where are you from?",
  "auth.preferences.nationalityHint": "For the global fans-by-country stat.",
  "auth.preferences.nationalityNone": "— Prefer not to say —",
  "auth.preferences.defaultLocationHint": "Where \"+ Leave an Echo\" starts by default.",
  "auth.preferences.defaultLocationLabel": "Default Echo location",
  "auth.preferences.defaultLocationPlaceholder": "Search for a city or place…",
  "auth.preferences.defaultLocationCurrent": "Currently:",
  "auth.preferences.defaultLocationClear": "Clear",
  "auth.preferences.languageLabel": "Language",
  "auth.preferences.languageHintPre": "The language Echoes are translated into when you tap",
  "auth.preferences.languageHintPost": ". Defaults to your browser's language.",
  "auth.preferences.languagePlaceholder": "Search for a language…",
  "auth.preferences.languageAuto": "Auto (browser language)",
  "auth.preferences.privacyLabel": "How precise should your Echoes be?",
  "auth.preferences.privacyHint": "Your exact GPS is never stored — only a random point in the area.",
  "auth.preferences.privacy1": "Country only",
  "auth.preferences.privacy1Hint": "e.g. France",
  "auth.preferences.privacy2": "City",
  "auth.preferences.privacy2Hint": "e.g. Paris",
  "auth.preferences.privacy3": "Neighborhood",
  "auth.preferences.privacy3Hint": "e.g. Paris — 7th arrondissement",
  "auth.preferences.privacy4": "Street",
  "auth.preferences.privacy4Hint": "e.g. Paris — Avenue de la Bourdonnais",
  "auth.preferences.privacy5": "Exact place (Landmark)",
  "auth.preferences.privacy5Hint": "e.g. Paris — Eiffel Tower",
  "auth.preferences.save": "Save",
  "auth.preferences.saved": "Preferences saved.",
  "auth.preferences.loadFailed": "Could not load your preferences.",
  "auth.preferences.saveFailed": "Could not save your preferences. Please try again.",

  "validation.required": "Please fill in this field.",
  "validation.requiredCheckbox": "Please tick this box to continue.",
  "validation.email": "Please enter a valid email address.",
  "validation.typeMismatch": "Please enter a valid value.",
  "validation.pattern": "Please match the requested format.",
  "validation.tooShort": "Please enter at least {n} characters.",
  "validation.tooLong": "Please enter at most {n} characters.",

  "auth.consent.required": "You must agree to the Privacy Policy and Terms of Service to continue.",
  "auth.age16.required": "You must be at least 16 years old to use Frisson Map.",
  "auth.password.passwordMismatch": "The two passwords don't match.",
  "auth.username.formatError": "Nickname must be 3-20 characters: letters (including accents), digits, underscore or spaces.",
  "auth.verify.codeFormat": "Enter the 6-digit code from the email.",

  "auth.ban.title": "Your account is banned.",
  "auth.ban.reasonPrefix": "Reason:",
  "auth.ban.untilPrefix": "Until:",
  "auth.ban.forever": "permanent",

  "admin.title": "Backstage",
  "admin.backToMap": "← Back to map",
  "admin.refresh": "Refresh",
  "admin.loading": "Loading…",
  "admin.empty": "No reports to show.",
  "admin.count": "{n} report(s)",
  "admin.pinDeleted": "(Echo deleted)",

  "admin.gate.loading": "Checking your permissions…",
  "admin.gate.anon": "You need to sign in as a crew member to view this page.",
  "admin.gate.forbidden": "You're signed in, but this page is for Crew only.",
  "admin.gate.goHome": "Go back to the map",

  "admin.tours.empty": "No tours yet.",
  "admin.tours.action.create": "+ Add tour",
  "admin.tours.action.edit": "Edit tour",
  "admin.tours.action.openDetail": "View tour",
  "admin.tours.detail.title": "Tour details",
  "admin.tours.detail.loading": "Loading concerts…",
  "admin.tours.detail.loadError": "Failed to load concerts.",
  "admin.tours.detail.noConcerts": "No concerts under this tour yet.",
  "admin.tours.detail.noDescription": "No description yet.",
  "admin.tours.detail.concertsList": "Concerts",
  "admin.tours.detail.upcomingShort": "upcoming",
  "admin.tours.detail.pastShort": "past",
  "admin.tours.detail.pastToggle": "Past stops",
  "admin.tours.detail.col.date": "Date",
  "admin.tours.detail.col.venue": "Venue",
  "admin.tours.detail.col.city": "City",
  "admin.tours.detail.openOfficial": "Open tour page →",
  "admin.tours.form.subtitle": "Tour name + dates + optional description. Editing a tour here updates every concert under it.",
  "admin.tours.form.name": "Tour name",
  "admin.tours.form.description": "Description",
  "admin.tours.form.descriptionPlaceholder": "Tour rationale, album context, route summary…",
  "admin.tours.form.startDate": "Start date",
  "admin.tours.form.endDate": "End date",
  "admin.tours.form.startDatePlaceholder": "Pick start date",
  "admin.tours.form.endDatePlaceholder": "Pick end date (optional)",
  "admin.tours.form.officialUrl": "Official URL",
  "admin.tours.form.officialUrlPlaceholder": "https://…",
  "admin.tours.form.submitCreate": "Create tour",
  "admin.tours.form.submitSave": "Save",
  "admin.tours.approved.toast": "Tour approved.",
  "admin.tours.rejected.toast": "Tour rejected — its concerts are standalone now.",
  "admin.events.tourPendingFlag": "(new tour — pending)",
  "admin.events.tourPendingTitle": "Approving this concert also approves the proposed tour.",
  "admin.tours.form.errorNameRequired": "Tour name is required.",
  "admin.tours.form.errorStartRequired": "Pick a start date.",
  "admin.tours.form.errorEndBeforeStart": "Tour end date cannot be before start date.",
  "admin.tours.form.errorGeneric": "Save failed. Please try again.",

  "admin.filter.label": "Status",
  "admin.filter.pending": "Pending",
  "admin.filter.resolved": "Resolved",
  "admin.filter.dismissed": "Dismissed",
  "admin.filter.all": "All",

  "admin.col.reason": "Reason",
  "admin.col.pin": "Echo",
  "admin.col.username": "Nickname",
  "admin.col.pinContent": "Echo content",
  "admin.col.pinType": "Echo type",
  "admin.col.created": "Filed",
  "admin.col.status": "Status",
  "admin.col.actions": "Actions",
  "admin.card.author": "Author",
  "admin.pinType.kotva": "Gathering ({count} Echoes)",
  "admin.pinType.container": "Gathering ({count} Echoes)",
  "admin.pinType.pin": "Echo",
  "admin.action.viewDetail.tooltip": "View details",
  "admin.action.locatePin.tooltip": "Show on map",

  "admin.status.pending": "Pending",
  "admin.status.resolved": "Resolved",
  "admin.status.dismissed": "Dismissed",

  "admin.detail.title": "Report details",
  "admin.detail.reason": "Reason",
  "admin.detail.reporterComment": "Reporter's note",
  "admin.detail.filed": "Filed",
  "admin.detail.status": "Status",
  "admin.detail.pin": "Echo",
  "admin.detail.pinNick": "Nickname",
  "admin.detail.pinComment": "Echo content",
  "admin.detail.kotvaName": "Gathering name",
  "admin.detail.containerName": "Gathering name",
  "admin.detail.pinCoords": "Coordinates",
  "admin.detail.noComment": "(none)",

  "admin.action.dismiss": "Dismiss",
  "admin.action.dismiss.confirmTitle": "Dismiss this report?",
  "admin.action.deletePin": "Delete",
  "admin.action.deletePin.confirmTitle": "Delete this Echo?",
  "admin.action.deletePin.confirm": "Permanently delete Echo from @{nick}? This cannot be undone.",
  "admin.action.banAuthor": "Ban author",
  "admin.action.approveReport.tooltip": "Approve Echo — dismiss report",
  "admin.action.deletePin.tooltip": "Delete Echo — uphold report",
  "admin.reports.approved.toast": "Report dismissed — Echo kept.",
  "admin.reports.deleted.toast": "Echo deleted — report upheld.",
  "admin.reports.deleteDialog.title": "Delete this Echo?",
  "admin.reports.deleteDialog.titleKotva": "Delete gathering + {count} Echoes?",
  "admin.reports.deleteDialog.body": "The reporter's category ({category}) will be shown to the Echo's owner. Add an optional note for them below, or leave blank.",
  "admin.reports.deleteDialog.bodyKotva": "Deleting this gathering will also remove {count} child Echo(es). The reporter's category ({category}) will be shown to the Echo's owner. Add an optional note for them below, or leave blank.",
  "admin.reports.deleteDialog.placeholder": "Optional note for the Echo's owner (leave blank to skip).",
  "admin.reports.deleteDialog.confirm": "Delete Echo",
  "admin.reports.deleteDialog.titleContainer": "Delete this gathering + {count} Echoes?",
  "admin.reports.deleteDialog.bodyContainer": "Deleting this gathering also removes the {count} Echo(es) inside it. The Echoes' owner will see them in their Deleted Echoes list. Add an optional note for them below, or leave blank.",
  "admin.action.clearContainerName.tooltip": "Clear gathering name",
  "admin.reports.clearNameDialog.title": "Clear this gathering's name?",
  "admin.reports.clearNameDialog.body": "The gathering's name is removed and its popup falls back to the location. The Echoes inside stay untouched.",
  "admin.reports.clearNameDialog.placeholder": "Reason (kept in the moderation log only).",
  "admin.reports.clearNameDialog.confirm": "Clear name",
  "admin.reports.clearName.toast": "Gathering name cleared.",
  "admin.reports.bulk.dismiss": "Dismiss selected",
  "admin.reports.bulk.delete": "Delete selected Echoes",
  "admin.reports.bulk.dismissTitle": "Dismiss selected reports",
  "admin.reports.bulk.dismissBody": "Dismiss {n} selected report(s)? The reported Echoes stay; the reports close as dismissed.",
  "admin.reports.bulk.dismissedToast": "Dismissed {n} report(s).",
  "admin.reports.bulk.deleteTitle": "Delete selected Echoes",
  "admin.reports.bulk.deleteBody": "Delete {n} reported Echo(es)? This cannot be undone. The reporter's category is shown to each owner — add one optional note for all of them below, or leave blank.",
  "admin.reports.bulk.deleteSkipped": "({s} selected report(s) have no Echo and will be left untouched.)",
  "admin.reports.bulk.deletedToast": "Deleted {n} Echo(es).",
  "admin.bulk.barLabel": "Bulk actions",
  "admin.bulk.count": "{n} selected",
  "admin.bulk.cancel": "Cancel selection",
  "admin.pinModDelete.noteLabel": "Optional note for the Echo's owner",
  "admin.pinModDelete.confirm": "Delete Echo",
  "admin.pinModDelete.categoryLegend": "Reason category (optional — defaults to the reporter's)",
  "admin.pinModDelete.errorNoCategory": "Please pick a reason category.",
  "admin.pinModDelete.errorNoReason": "Pick a reason category or add a note.",
  "admin.pinModDelete.errorNoteTooShort": "Note must be at least 3 characters when provided.",
  "pin.modDelete.notePlaceholder": "e.g. Wrong location. Please refile in the correct city.",
  "pin.modReports.delete.notePlaceholder": "e.g. Confirmed after reviewing 3 reports.",

  "admin.reason.title": "Confirm action",
  "admin.reason.hint": "Add a short note explaining this action — it goes into the audit log.",
  "admin.reason.label": "Reason",
  "admin.reason.submit": "Confirm",
  "admin.reason.tooShort": "Please add a reason (at least 3 characters).",

  "admin.ban.title": "Ban this user",
  "admin.ban.hint": "The user will see the reason on their next sign-in. They can still log in and delete their account, but cannot post new Echoes until the ban expires or is lifted.",
  "admin.ban.duration": "Duration",
  "admin.ban.duration7d": "7 days",
  "admin.ban.duration30d": "30 days",
  "admin.ban.durationForever": "Forever",
  "admin.ban.submit": "Ban user",
  "admin.ban.success": "User banned. The action has been logged.",

  "admin.tab.reports": "Reports",
  "admin.tab.audit": "Audit log",
  "admin.tab.tours": "Tours",
  "admin.tab.concerts": "Concerts",
  "admin.tab.online": "Online events",
  "admin.tab.limits": "Limits",
  "admin.tab.moderators": "Crew",
  "admin.tab.users": "Users",
  "admin.tab.testData": "Test data",
  "admin.reports.subtitle": "Review user reports. Dismiss false alarms or delete the reported Echo.",
  "admin.audit.subtitle": "Append-only history of every moderator and admin action.",
  "admin.tours.subtitle": "Create, edit, and retire Tarja's tour collections.",
  "admin.concerts.subtitle": "Approve, edit, or reject fan-submitted concert events.",
  "admin.online.subtitle": "Approve, edit, or reject fan-submitted online events.",
  "admin.sigplaces.subtitle": "Approve, edit, or reject fan-proposed landmarks.",
  "admin.moderators.title": "Crew & permissions",
  "admin.moderators.subtitle": "Grant area permissions to trusted users. Admins (override) and mods (granular) appear below.",
  "admin.moderators.action.add": "+ Add a crew member",
  "admin.moderators.count": "{n} member(s)",
  "admin.moderators.empty": "No crew members yet — click + Add a crew member to grant permissions.",
  "admin.moderators.col.username": "Nickname",
  "admin.moderators.col.role": "Role",
  "admin.moderators.col.permissions": "Permissions",
  "admin.moderators.col.actions": "Actions",
  "admin.moderators.role.admin": "Admin",
  "admin.moderators.role.adminYou": "Admin (you)",
  "admin.moderators.role.mod": "Mod",
  "admin.moderators.permsLegend": "Permissions",
  "admin.moderators.permsNone": "—",
  "admin.moderators.action.edit": "Edit permissions",
  "admin.moderators.action.promote": "Promote to admin",
  "admin.moderators.action.remove": "Remove",
  "admin.moderators.action.stepdown": "Step down",

  "admin.moderators.remove.titleFormat": "Remove {username} from crew",
  "admin.moderators.remove.hintFormat": "{username} will lose all {count} active permissions and fall off the crew list. Reason required for the audit log.",
  "admin.moderators.remove.reasonLabel": "Reason (audit log)",
  "admin.moderators.remove.reasonPlaceholder": "Why this user loses all permissions (3-500 chars)",
  "admin.moderators.remove.submit": "Remove crew member",
  "admin.moderators.tooltip.lastAdmin": "This is the last admin — cannot step down.",
  "admin.moderators.tooltip.selfEdit": "You cannot edit your own permissions here.",

  "admin.moderators.add.title": "Add a crew member",
  "admin.moderators.add.hint": "Search by nickname and pick permissions.",
  "admin.moderators.error.search": "User search failed. Try again in a moment.",
  "admin.moderators.add.userLabel": "Nickname",
  "admin.moderators.add.userPlaceholder": "Start typing a nickname…",
  "admin.moderators.add.searchEmpty": "No users match this search.",
  "admin.moderators.add.selectedPrefix": "Selected:",
  "admin.moderators.add.reasonLabel": "Reason (audit log)",
  "admin.moderators.add.reasonPlaceholder": "Why this user is being added (3-500 chars)",
  "admin.moderators.add.submit": "Grant permissions",
  "admin.moderators.add.error.noUser": "Pick a user from the suggestions first.",
  "admin.moderators.add.error.noPerms": "Select at least one permission.",

  "admin.moderators.edit.titleFormat": "Edit permissions — {username}",
  "admin.moderators.edit.hint": "Toggle checkboxes to grant or revoke permissions.",
  "admin.moderators.edit.reasonLabel": "Reason (audit log)",
  "admin.moderators.edit.reasonPlaceholder": "Why these changes are being made (3-500 chars)",
  "admin.moderators.edit.submit": "Save changes",
  "admin.moderators.edit.error.noChange": "No checkboxes changed — nothing to save.",

  "admin.moderators.promote.titleFormat": "Promote {username} to admin",
  "admin.moderators.promote.hint": "Admins bypass every permission check (founder-level override). To confirm, type PROMOTE TO ADMIN exactly.",
  "admin.moderators.promote.confirmLabel": "Type \"PROMOTE TO ADMIN\" to confirm",
  "admin.moderators.promote.confirmPlaceholder": "PROMOTE TO ADMIN",
  "admin.moderators.promote.reasonLabel": "Reason (audit log)",
  "admin.moderators.promote.reasonPlaceholder": "Why this user becomes a co-admin (3-500 chars)",
  "admin.moderators.promote.submit": "Promote to admin",

  "admin.moderators.stepdown.title": "Step down from admin",
  "admin.moderators.stepdown.hint": "You will lose the founder override. To confirm, type REMOVE ADMIN exactly. The last admin cannot step down.",
  "admin.moderators.stepdown.confirmLabel": "Type \"REMOVE ADMIN\" to confirm",
  "admin.moderators.stepdown.confirmPlaceholder": "REMOVE ADMIN",
  "admin.moderators.stepdown.reasonLabel": "Reason (optional, for audit log)",
  "admin.moderators.stepdown.reasonPlaceholder": "Optional note (max 500 chars)",
  "admin.moderators.stepdown.submit": "Step down",
  "admin.moderators.stepdown.error.lastAdmin": "This is the last admin in the system — at least one admin must remain.",

  "admin.moderators.error.load": "Couldn't load crew — try Refresh.",
  "admin.moderators.error.action": "Action failed — try again.",

  "admin.users.title": "Banned users",
  "admin.users.subtitle": "Issue, edit, or lift bans. Search by nickname — admins and currently banned users are not shown.",
  "admin.users.searchLabel": "Search nickname",
  "admin.users.searchPlaceholder": "Search nickname…",
  "admin.users.count": "{n} active ban(s)",
  "admin.users.searchEmpty": "No users match this search.",
  "admin.users.empty": "No active bans. Search for a user above to issue one.",
  "admin.users.col.username": "Nickname",
  "admin.users.col.duration": "Duration",
  "admin.users.col.expires": "Expires",
  "admin.users.col.reason": "Reason",
  "admin.users.col.bannedBy": "Banned by",
  "admin.users.col.actions": "Actions",
  "admin.users.action.edit": "Edit ban",
  "admin.users.action.unban": "Lift ban",
  "admin.users.durationLegend": "Duration",
  "admin.users.duration.1d": "1 day",
  "admin.users.duration.3d": "3 days",
  "admin.users.duration.7d": "7 days",
  "admin.users.duration.30d": "30 days",
  "admin.users.duration.permanent": "Permanent",
  "admin.users.duration.custom": "Custom",
  "admin.users.reasonLabel": "Reason",
  "admin.users.reasonPlaceholder": "Explain why this user is being banned (3–500 chars)…",
  "admin.users.unbanReasonPlaceholder": "Explain why this ban is being lifted (3–500 chars)…",
  "admin.users.add.titleFormat": "Ban — @{username}",
  "admin.users.add.hint": "Pick a ban duration and explain the reason. The user is notified on next login.",
  "admin.users.add.submit": "Ban",
  "admin.users.edit.titleFormat": "Edit ban — @{username}",
  "admin.users.edit.hint": "Update the active ban's duration or reason. The audit log records the change.",
  "admin.users.edit.submit": "Save changes",
  "admin.users.unban.titleFormat": "Lift ban — @{username}",
  "admin.users.unban.hint": "Lifting the ban restores the user's access immediately. The audit log records the reason.",
  "admin.users.unban.submit": "Lift ban",
  "admin.users.toast.banned": "Banned @{username} for {duration}.",
  "admin.users.toast.edited": "Updated ban for @{username}.",
  "admin.users.toast.unbanned": "Lifted ban for @{username}.",
  "admin.users.error.load": "Couldn't load bans — try Refresh.",
  "admin.users.error.search": "User search failed. Try again in a moment.",
  "admin.users.error.action": "Action failed — try again.",
  "admin.users.error.noUser": "No user selected — pick one from the search dropdown.",
  "admin.users.error.noDuration": "Pick a ban duration.",
  "admin.users.error.reasonTooShort": "Reason must be at least 3 characters.",

  "admin.permissions.concerts.label": "Concerts",
  "admin.permissions.concerts.desc": "Approve, reject, edit, and delete fan-submitted concerts.",
  "admin.permissions.online_events.label": "Online events",
  "admin.permissions.online_events.desc": "Approve, reject, edit, and delete fan-submitted online events.",
  "admin.permissions.significant_places.label": "Landmarks",
  "admin.permissions.significant_places.desc": "Approve, reject, edit, and delete landmark proposals.",
  "admin.permissions.pins.label": "Echoes",
  "admin.permissions.pins.desc": "Delete Echoes and manage the reports queue (resolve / dismiss).",
  "admin.permissions.tours.label": "Tours",
  "admin.permissions.tours.desc": "Create, edit, and delete tours.",
  "admin.permissions.users.label": "Users",
  "admin.permissions.users.desc": "Ban, unban, and view user admin details.",
  "admin.permissions.community_links.label": "Community links",
  "admin.permissions.community_links.desc": "Remove other fans' Community board links and edit their labels.",
  "admin.permissions.testing.label": "Testing",
  "admin.permissions.testing.desc": "Create test data and see test content after launch.",

  "admin.testData.title": "Test data",
  "admin.testData.subtitle": "Bulk Convert (= mark as real) or Delete records flagged is_test_data = TRUE. Useful for pre-launch cleanup.",
  "admin.testData.section.pins": "Echoes",
  "admin.testData.section.concerts": "Concerts",
  "admin.testData.section.online": "Online events",
  "admin.testData.section.tours": "Tours",
  "admin.testData.section.sigplaces": "Landmarks",
  "admin.testData.section.count": "{selected} selected / {total} total",
  "admin.testData.selectAll": "Select all",
  "admin.testData.deselectAll": "Deselect all",
  "admin.testData.convertSelected": "Convert to real",
  "admin.testData.deleteSelected": "Delete",
  "admin.testData.noneSelected": "No items selected.",
  "admin.testData.totalSelected": "{n} selected across all sections",
  "admin.testData.loading": "Loading…",
  "admin.testData.empty": "No test data yet.",
  "admin.testData.error.load": "Couldn't load test data — try Refresh.",
  "admin.testData.error.action": "Action failed — try again.",
  "admin.testData.titleAnonymous": "Anonymous",
  "admin.testData.authorAnonymous": "Anonymous",
  "admin.testData.col.select": "Select row",
  "admin.testData.col.type": "Type",
  "admin.testData.col.title": "Title",
  "admin.testData.col.author": "Author",
  "admin.testData.col.status": "Status",
  "admin.testData.col.details": "Details",
  "admin.testData.col.date": "Date",
  "admin.testData.col.actions": "Actions",
  "admin.testData.type.pin": "Echo",
  "admin.testData.type.concert": "Concert",
  "admin.testData.type.online": "Online",
  "admin.testData.type.tour": "Tour",
  "admin.testData.type.poi": "Landmark",
  "admin.testData.status.approved": "Approved",
  "admin.testData.status.pending": "Pending",
  "admin.testData.status.rejected": "Rejected",
  "admin.testData.status.active": "Active",
  "admin.testData.filter.entityType.label": "Type",
  "admin.testData.filter.entityType.all": "All types",
  "admin.testData.filter.entityType.pins": "Echoes",
  "admin.testData.filter.entityType.concerts": "Concerts",
  "admin.testData.filter.entityType.online": "Online",
  "admin.testData.filter.entityType.tours": "Tours",
  "admin.testData.filter.entityType.sigplaces": "Landmark",
  "admin.testData.filter.status.label": "Status",
  "admin.testData.filter.status.all": "All statuses",
  "admin.testData.filter.status.approved": "Approved",
  "admin.testData.filter.status.pending": "Pending",
  "admin.testData.filter.status.rejected": "Rejected",
  "admin.testData.filter.status.active": "Active",
  "admin.testData.filter.none": "None",
  "admin.testData.filter.someCount": "{n} selected",
  "admin.testData.totalCount": "{n} records",
  "admin.testData.confirm.deleteSingle": "Delete the test record \"{title}\"? This cannot be undone.",
  "admin.testData.toast.converted": "Marked as real data.",
  "admin.testData.toast.deleted": "Test record deleted.",
  "admin.testData.toast.bulkConverted": "Converted {n} records to real.",
  "admin.testData.toast.bulkConvertedSkipped": "Converted {n} records to real. {m} skipped — duplicates of real data.",
  "admin.testData.toast.allSkippedDuplicates": "Nothing converted — {m} record(s) duplicate real data.",
  "admin.testData.toast.bulkDeleted": "Deleted {n} test records.",
  "admin.testData.convertAdminOnly": "Admin-only action — moderators cannot promote test data to real.",
  "admin.audit.filter.usernameAny": "Any",
  "admin.testData.confirm.title": "Confirm batch action",
  "admin.testData.confirm.titleDelete": "Confirm delete",
  "admin.testData.confirm.titleConvert": "Confirm convert",
  "admin.testData.confirm.introDelete": "You are about to permanently delete the following test records. This cannot be undone.",
  "admin.testData.confirm.introConvert": "You are about to mark the following records as real (is_test_data = FALSE). They will be included in stats and visibility from now on.",
  "admin.testData.publicTestMode.label": "Public test mode",
  "admin.testData.publicTestMode.launchGate": "M17 LAUNCH GATE",
  "admin.testData.publicTestMode.tooltip": "When OFF, only admins see test data — the Test Mode toggle is hidden for everyone else.",
  "admin.testData.publicTestMode.on": "ON",
  "admin.testData.publicTestMode.off": "OFF",
  "admin.testData.publicTestMode.saving": "Saving…",
  "admin.testData.publicTestMode.error": "Couldn't update — try again.",
  "admin.testData.publicTestMode.confirmOffTitle": "Hide Test Mode toggle from regular users?",
  "admin.testData.publicTestMode.confirmOffBody": "Anonymous, registered, and moderator visitors will lose access to the Test Mode toggle on the map. Admin still sees it. This is the M17 launch gate — flip OFF only when you're ready to hide test data from beta visitors.",
  "admin.testData.publicTestMode.confirmOffConfirm": "Hide for users",
  "admin.testData.publicTestMode.confirmCancel": "Cancel",


  "admin.audit.empty": "No actions logged yet.",
  "admin.audit.count": "{n} action(s)",
  "admin.audit.col.when": "When",
  "admin.audit.col.actor": "Actor",
  "admin.audit.col.action": "Action",
  "admin.audit.col.target": "Target",
  "admin.audit.col.reason": "Details",
  "admin.audit.filter.actionLabel": "All actions",
  "admin.audit.filter.actionSelected": "{n} selected",
  "admin.audit.filter.clear": "Clear",
  "admin.audit.filter.timeAll": "All time",
  "admin.audit.filter.time24h": "Last 24 hours",
  "admin.audit.filter.time7d": "Last 7 days",
  "admin.audit.filter.time30d": "Last 30 days",
  "admin.audit.filter.timeCustom": "Custom range…",
  "admin.audit.pill.time": "Time Frame",
  "admin.audit.pill.role": "Mod",
  "admin.audit.pill.actions": "Actions",
  "admin.audit.pill.username": "Nickname",
  "admin.audit.dialog.timeTitle": "Filter by time",
  "admin.audit.dialog.roleTitle": "Filter by role",
  "admin.audit.dialog.actionsTitle": "Filter by actions",
  "admin.audit.dialog.usernameTitle": "Filter by nickname",
  "admin.audit.dialog.roleAll": "All actors",
  "admin.audit.dialog.roleMod": "Mods only",
  "admin.audit.dialog.roleUser": "Users only",
  "admin.audit.dialog.selectAll": "Select All",
  "admin.audit.dialog.searchActions": "Search actions",
  "admin.audit.dialog.usernamePlaceholder": "Enter exact nickname",
  "admin.audit.dialog.from": "From",
  "admin.audit.dialog.to": "To",
  "admin.audit.dialog.reset": "Reset",
  "admin.audit.badge.mod": "Mod",
  "admin.audit.badge.user": "User",
  "form.done": "Done",
  "admin.audit.col.actions": "Actions",
  "admin.audit.detail.openLabel": "Show full record",
  "admin.audit.detail.title": "Audit record",
  "admin.audit.detail.when": "When",
  "admin.audit.detail.actor": "Actor",
  "admin.audit.detail.action": "Action",
  "admin.audit.detail.target": "Target",
  "admin.audit.detail.details": "Details",
  "admin.audit.detail.field.name": "Name",
  "admin.audit.detail.field.title": "Title",
  "admin.audit.detail.field.category": "Category",
  "admin.audit.detail.field.status": "Status",
  "admin.audit.detail.field.fromStatus": "Status change",
  "admin.audit.detail.field.sources": "Sources",
  "admin.audit.detail.field.rejectionReason": "Rejection reason",
  "admin.audit.detail.field.fields": "Fields changed",
  "admin.audit.detail.field.code": "Code",
  "admin.audit.detail.field.deletionReason": "Reason",
  "admin.audit.detail.field.decisionNote": "Note",
  "admin.audit.detail.field.suggestion": "Suggestion",
  "admin.audit.detail.field.banReason": "Reason",
  "admin.audit.detail.field.unbanReason": "Reason",
  "admin.audit.detail.field.entity": "Entity",
  "admin.audit.detail.field.transition": "Change",
  "admin.audit.detail.field.itemCount": "Items affected",
  "admin.audit.detail.field.eventsCascaded": "Cascaded events",
  "admin.audit.detail.field.activeEvents": "Active events",
  "admin.audit.detail.field.hardDelete": "Hard delete",
  "admin.audit.detail.field.setting": "Setting",
  "admin.audit.detail.field.settingChange": "Change",
  "admin.audit.detail.field.newValue": "New value",
  "admin.audit.detail.field.newState": "New state",
  "admin.audit.detail.field.noFields": "(no fields)",
  "admin.audit.detail.field.viaEvent": "Approved alongside concert",
  "admin.audit.detail.field.detachedConcerts": "Concerts detached",
  "admin.audit.detail.field.trigger": "Removed because",
  "admin.audit.target.kind.event": "Event",
  "admin.audit.target.kind.place": "Landmark",
  "admin.audit.target.kind.tour": "Tour",
  "admin.audit.target.kind.user": "User",
  "admin.audit.target.kind.pin": "Echo",
  "admin.audit.target.kind.report": "Report",
  "admin.audit.actorDeleted": "(deleted)",
  "admin.audit.action.pin_delete": "Echo deleted",
  "admin.audit.action.report_dismiss": "Report dismissed",
  "admin.audit.action.user_ban": "User banned",
  "admin.audit.action.user_unban": "User unbanned",

  "admin.error.load": "Could not load the moderation queue. Please try again.",
  "admin.error.action": "Could not apply the action. Please try again.",

  "event.error.notFound": "Event not found.",
  "event.error.bannedWord": "This text isn't allowed here. Please rephrase.",
  "event.error.urlInDescription": "Links aren't allowed in descriptions. Use the event URL field instead.",
  "event.error.frissonTourRequiredFields": "Frisson Tour events need a venue, location and country.",
  "event.error.onlineRequiresUrl": "Online events need a URL where fans can watch.",
  "event.error.invalidCategory": "Choose an event category.",
  "event.error.invalidStatus": "Pick a status filter.",
  "event.rsvp.going.label": "I'm going",
  "event.rsvp.attended.label": "I was there",
  "event.rsvp.watch.label": "I'll watch",
  "event.rsvp.watched.label": "I watched",
  "event.rsvp.error.notSynced": "Please refresh and sign in again to save.",
  "event.rsvp.error.signInRequired": "Sign in to save events.",

  "events.create.title": "Propose an event",
  "events.create.titleConcert": "Propose a concert",
  "events.create.titleOnline": "Propose an online event",
  "events.create.titleConcertAdmin": "Add a concert",
  "events.create.titleOnlineAdmin": "Add an online event",
  "events.create.titleConcertEdit": "Edit concert",
  "events.create.titleOnlineEdit": "Edit online event",
  "events.create.subtitle": "Paste the source link and we'll fill in what we can — or type the basics yourself.",
  "events.create.submit": "Publish",
  "events.create.submitPropose": "Submit for review",
  "events.create.submitSave": "Save",
  "events.create.paste.label": "Source link",
  "events.create.paste.labelTail": " — paste and we'll fill the rest",
  "events.create.paste.hintTour": "Official page, announcement or venue site.",
  "events.create.paste.hintOnline": "Stream, Discord, Spotify, Zoom — wherever the event happens online.",
  "events.create.paste.placeholder": "https://tarjaturunen.com/class/… or https://wacken-open-air.com/…",
  "events.create.paste.button": "Auto-fill",
  "events.create.paste.fetching": "Reading the link…",
  "events.create.paste.success": "Filled what we could find. Review and adjust.",
  "events.create.paste.errorEmpty": "Paste a link first.",
  "events.create.paste.notALink": "That doesn't look like a link — paste a full web address starting with https://",
  "events.create.paste.linkNotFound": "We couldn't find that address — check the link for typos.",
  "events.create.paste.linkNotSecure": "That page doesn't answer over a secure connection (https). Unsecured pages can't be used as a source.",
  "events.create.paste.aiResolving": "🍀 AI is looking up the venue…",
  "events.create.paste.aiSuccess": "AI filled the venue + map coordinates. Review and adjust.",
  "events.create.tour.contextDelete": "🗑 Delete tour \"{name}\"",
  "events.create.tour.deleteConfirm": "Delete tour \"{name}\" AND all concerts under it? This cannot be undone.",
  "events.create.chip.online": "Online",
  "events.create.chip.tour": "Concert",
  "events.create.field.title": "Title",
  "events.create.field.when": "When",
  "events.create.field.whenDate": "Date",
  "events.create.field.whenDatePlaceholder": "Select a date",
  "events.create.field.whenTime": "Time",
  "events.create.field.whenTimeHint": "Leave time empty if it isn't announced yet.",
  "events.create.field.whenTimeClear": "Clear",
  "events.create.field.duration": "Duration",
  "events.create.field.durationHint": "Roughly how long it runs — controls the live badge during the show.",
  "events.create.field.venueName": "Venue name",
  "events.create.field.venueNameHint": "Club, hall or landmark. The map position goes in the Location field below.",
  "events.create.field.location": "Location",
  "events.create.field.locationHint": "Search a city, or click the map.",
  "events.create.field.changeLocation": "Change location",
  "events.create.field.mapToggleHide": "Hide map preview",
  "events.create.field.mapToggleShow": "Show map preview",
  "events.create.field.whereRequired": "*",
  "events.create.field.whereSearchPlaceholder": "Berlin · Wacken · Helsinki…",
  "events.create.field.tour": "Part of a tour",
  "events.create.field.tourHint": "Pick an existing tour, or leave as standalone concert.",
  "events.create.field.tourStandalone": "Standalone concert",
  "events.create.tour.addNew": "+ Add new tour",
  "events.create.tour.newTitle": "Propose a new tour",
  "events.create.tour.newTitleProposed": "Proposed new tour",
  "events.create.tour.newTitleDraftWarn": "(not confirmed!)",
  "events.create.tour.detailsTitle": "Tour details",
  "events.create.tour.nameLabel": "Tour name",
  "events.create.tour.descriptionLabel": "Description (optional)",
  "events.create.tour.errorNameRequired": "Tour name is required.",
  "events.create.tour.errorConfirmRequired": "Confirm your proposed tour with the ✓ button first — or clear its name to publish without a tour.",
  "events.create.tour.collapseHide": "Collapse tour details",
  "events.create.tour.collapseShow": "Expand tour details",
  "events.create.tour.confirm": "Confirm tour",
  "events.create.tour.refreshTooltip": "Generate description again",
  "events.create.tour.draftChip": "New: {name}",
  "events.create.tour.suggestMatch": "Looks like this concert is part of “{name}”.",
  "events.create.tour.suggestAssign": "Assign",
  "events.create.tour.suggestDismiss": "Dismiss suggestion",
  "events.create.tour.proposalPending": "Your tour proposal was sent for review. It will appear once the Crew approves it.",
  "events.create.tour.errorRegUserContact": "Only admins can add new tours yet. Email info@frissonmap.com or message us on Discord with your proposal.",
  "events.create.tour.deleteBlocked": "Can't delete \"{name}\" — the tour still contains {count} concert(s). Move or delete each concert first.",
  "events.create.tour.deleteRace": "Can't delete \"{name}\" — the tour now contains {count} concert(s). Move or delete each concert first.",
  "events.create.tour.descriptionLookup": "🔍 Find tour info",
  "events.create.tour.descriptionLookupHint": "Looked up on Wikipedia or via AI. May not be fully accurate.",
  "events.create.tour.descriptionLookupSearching": "Looking it up…",
  "events.create.tour.descriptionLookupEmpty": "Nothing found — write something yourself.",
  "events.create.tour.descriptionLookupPickName": "Type a tour name first.",
  "events.create.tour.descriptionLookupSuccess": "Filled — review and edit as needed.",
  "events.create.tour.descriptionLookupSuccessWikipedia": "Filled from Wikipedia — review and edit as needed.",
  "events.create.tour.descriptionLookupSuccessTarja": "Filled from tarjaturunen.com — review and edit as needed.",
  "events.create.tour.descriptionLookupSuccessAi": "Filled by AI search — review and edit as needed.",
  "events.create.tour.descriptionLookupReplaceConfirm": "Replace the description with what we find?",
  "events.create.field.description": "Description",
  "events.create.field.refreshTooltip": "Generate description again",
  "events.create.field.descriptionLookup": "🔍 Find venue info",
  "events.create.field.descriptionLookupHint": "Looked up on Wikipedia or via AI. May not be fully accurate.",
  "events.create.field.descriptionAutofillNote": "Auto-filled from Wikipedia or AI. May not be fully accurate — please review.",
  "events.create.field.descriptionLookupSearching": "Looking it up…",
  "events.create.field.descriptionLookupSuccess": "Filled — review and edit as needed.",
  "events.create.field.descriptionLookupSuccessWikipedia": "Filled from Wikipedia — review and edit as needed.",
  "events.create.field.descriptionLookupSuccessTarja": "Filled from tarjaturunen.com — review and edit as needed.",
  "events.create.field.descriptionLookupSuccessAi": "Filled by AI search — review and edit as needed.",
  "events.create.field.descriptionLookupEmpty": "Nothing found — write something yourself.",
  "events.create.field.descriptionLookupPickFirst": "Pick a venue first (Location field above).",
  "events.create.field.descriptionLookupReplaceConfirm": "Replace the description with what we find?",
  "events.create.field.coverImage": "Cover image",
  "events.create.field.coverImageHint": "Pick a Creative-Commons photo — attribution is added automatically.",
  "events.create.photoPicker.placeholder": "Select a preview for the venue…",
  "events.create.photoPicker.ariaLabel": "Search Openverse for a Creative-Commons cover photo",
  "events.create.photoPicker.gridAriaLabel": "Photo search results",
  "events.create.photoPicker.searching": "Searching Openverse…",
  "events.create.photoPicker.idleHint": "Try a venue, city or theme — we'll search Creative-Commons photos.",
  "events.create.photoPicker.empty": "🍀 Try your luck — no photos for that yet. Try another phrase.",
  "events.create.photoPicker.error": "Search temporarily unavailable, skip for now — you can edit later.",
  "events.create.photoPicker.byline": "\"{title}\" — Photo by {photographer} ({license}) — via Openverse",
  "events.create.photoPicker.externalByline": "Cover from link preview — {attribution}",
  "events.create.photoPicker.viewSource": "View source",
  "events.create.photoPicker.clear": "Clear",
  "events.create.photoPicker.change": "Change",
  "events.create.photoPicker.removeAriaLabel": "Remove cover image",
  "events.create.photoPicker.placeholderTitle": "No cover image yet",
  "events.create.photoPicker.placeholderCta": "🔍 Search for a venue photo",
  "events.create.photoPicker.customSearchToggle": "✏️ Search with other keywords",
  "events.create.photoPicker.untitled": "Untitled photo",
  "imageFocal.title": "Adjust framing",
  "imageFocal.hint": "Drag the point to choose what stays in view when the photo is cropped to a thumbnail on the map.",
  "imageFocal.previewLabel": "How it looks on the map",
  "imageFocal.reset": "Reset to center",
  "imageFocal.readout": "Focus {x}% · {y}%",
  "imageFocal.ariaLabel": "Drag to set the photo focal point; arrow keys nudge it",
  "events.create.field.discussion": "Discussion threads",
  "events.create.field.discussionHint": "Reddit (r/tarjaturunen), Discord, fan forums.",
  "events.create.more.summary": "Add details (optional)",
  "events.create.discussion.add": "+ Add link",
  "events.create.discussion.urlAriaLabel": "Discussion thread URL",
  "events.create.discussion.duplicate": "This link is already added.",
  "events.create.discussion.invalidUrl": "Paste a full link starting with https://.",
  "events.create.error.titleRequired": "Please name the event.",
  "events.create.error.venueNameRequired": "Please type the venue name (club, hall, landmark).",
  "events.create.error.invalidDate": "Please pick a valid date and time.",
  "events.create.error.pastDate": "Events must be scheduled in the future.",
  "events.create.error.venueRequired": "Please pick a location from search or click the map.",
  "events.create.error.sourceUrlRequired": "Paste the source link at the top of the form.",
  "events.create.error.sourceUrlInvalid": "The source link isn't a valid web address — it should start with https://",
  "events.create.error.redditLocked": "Reddit links must point to r/tarjaturunen. Other subreddits aren't allowed.",
  "events.create.error.publishFailed": "Could not publish the event. Check the form and try again.",

  "onlineEvent.create.title": "Propose an online event",
  "onlineEvent.create.titleAdmin": "Add an online event",
  "onlineEvent.create.subtitle": "Paste a link and we'll fill in the title — the rest is up to you.",
  "onlineEvent.create.linkLabel": "Online event link",
  "onlineEvent.create.linkHint": "Where it happens online.",
  "onlineEvent.create.linkPlaceholder": "https://youtube.com/live/… or https://discord.gg/…",
  "onlineEvent.create.titleLabel": "Title",
  "onlineEvent.create.subcategoryLabel": "What kind?",
  "onlineEvent.create.whenLabel": "When",
  "onlineEvent.create.descriptionLabel": "Description",
  "onlineEvent.create.descriptionHint": "A few words so others know what to expect.",
  "onlineEvent.create.moreSummary": "Add details (optional)",
  "onlineEvent.create.discussionLabel": "Discussion threads",
  "onlineEvent.create.discussionHint": "Reddit (r/tarjaturunen), Discord, fan forums.",
  "onlineEvent.create.submit": "Publish",
  "onlineEvent.create.platformBadgeAria": "Detected platform",
  "onlineEvent.create.paste.fetching": "Reading the link…",
  "onlineEvent.create.paste.success": "Filled the title we could find. Type the rest yourself.",
  "onlineEvent.create.error.linkRequired": "Paste the online event link at the top of the form.",
  "onlineEvent.create.error.linkInvalid": "The event link isn't a valid web address — it should start with https://",
  "onlineEvent.create.error.titleRequired": "Please name the event.",
  "onlineEvent.create.field.whenTimeRequired": "Time",
  "onlineEvent.create.field.whenTimeHint": "Time is required for online events so attendees know when to tune in.",
  "onlineEvent.create.field.durationHint": "Roughly how long the stream runs — controls the live badge.",
  "onlineEvent.create.error.invalidDate": "Please pick a valid date and time.",
  "onlineEvent.create.error.pastDate": "Online events must be scheduled in the future.",
  "onlineEvent.create.error.timeRequired": "Please pick the time — online events need a start time.",
  "onlineEvent.create.error.descriptionRequired": "Please write a short description so others know what this event is.",
  "onlineEvent.create.error.redditLocked": "Reddit links must point to r/tarjaturunen. Other subreddits aren't allowed.",
  "onlineEvent.create.error.publishFailed": "Could not publish the online event. Check the form and try again.",

  "onlineEvent.detail.platform.web": "External platform",
  "onlineEvent.detail.openPlatform.youtube": "Open on YouTube",
  "onlineEvent.detail.openPlatform.twitch": "Watch on Twitch",
  "onlineEvent.detail.openPlatform.spotify": "Listen on Spotify",
  "onlineEvent.detail.openPlatform.discord": "Join Discord",
  "onlineEvent.detail.openPlatform.reddit": "Open Reddit thread",
  "onlineEvent.detail.openPlatform.instagram": "Open on Instagram",
  "onlineEvent.detail.openPlatform.x": "Open on X",
  "onlineEvent.detail.openPlatform.tiktok": "Open on TikTok",
  "onlineEvent.detail.openPlatform.telegram": "Open Telegram",
  "onlineEvent.detail.openPlatform.zoom": "Join Zoom call",
  "onlineEvent.detail.openPlatform.facebook": "Open on Facebook",
  "onlineEvent.detail.openPlatform.web": "Open event link",
  "onlineEvent.detail.discussionHeading": "Discussion",
  "onlineEvent.detail.shareOnReddit": "Share experience on r/tarjaturunen",

  "events.wizard.title": "Propose an event",
  "events.wizard.titleEdit": "Edit event",
  "events.wizard.stepIndicator": "Step {current} of {total}",
  "events.wizard.back": "Back",
  "events.wizard.next": "Next",
  "events.wizard.publish": "Publish",
  "events.wizard.save": "Save changes",
  "events.wizard.cancel": "Cancel",
  "events.wizard.step1.title": "What kind of event?",
  "events.wizard.step2.title": "What & where",
  "events.wizard.step3.title": "Links & visual",
  "events.wizard.step4.title": "Review & publish",
  "events.wizard.field.eventTitle": "Title *",
  "events.wizard.field.eventTitleHint": "A short, recognisable name — e.g. \"Helsinki listening party\".",
  "events.wizard.field.eventDate": "When (your local time) *",
  "events.wizard.field.duration": "Duration (minutes)",
  "events.wizard.field.venueName": "Venue name",
  "events.wizard.field.venueNameHint": "Where this happens — concert hall, club, bar, …",
  "events.wizard.field.venueSearch": "Location *",
  "events.wizard.field.venueSearchHint": "Search a city or venue — picking a match sets the map coordinates automatically.",
  "events.wizard.field.geoOptional": "Location (optional)",
  "events.wizard.field.geoOptionalHint": "Online events can be left without a map location, or attach one if there's a regional context.",
  "events.wizard.field.tour": "Part of a tour",
  "events.wizard.field.tourHint": "Group this concert with other stops on the same tour.",
  "events.wizard.field.tourNone": "— not part of any tour —",
  "events.wizard.field.eventUrl": "Stream / event URL *",
  "events.wizard.field.eventUrlHint": "YouTube, Twitch, Discord, Spotify, etc. — must be HTTPS.",
  "events.wizard.field.sourceUrl": "Source URL *",
  "events.wizard.field.sourceUrlHint": "Official tour page or festival announcement.",
  "events.wizard.field.discussionLinks": "Discussion threads",
  "events.wizard.field.discussionLinksHint": "Add Reddit, Discord or fan-forum threads where people are talking about this event.",
  "events.wizard.field.discussionLinkUrl": "Thread URL",
  "events.wizard.field.discussionLinkLabel": "Display label (optional)",
  "events.wizard.field.discussionLinkAdd": "+ Add discussion link",
  "events.wizard.field.discussionLinkRemove": "Remove",
  "events.wizard.field.coverImage": "Cover image",
  "events.wizard.field.coverImageHint": "Pick a Creative-Commons image — search by venue or theme. Attribution is added automatically.",
  "events.wizard.field.description": "Description",
  "events.wizard.field.descriptionHint": "Story, context, what to expect. No links in the body — use the URL fields above.",
  "events.wizard.review.hint": "Last check before publishing. You can still edit the description here, or go back to fix anything.",
  "events.wizard.review.editDescription": "Edit description",
  "events.wizard.review.noCover": "No cover image",
  "events.wizard.review.noDiscussion": "No discussion threads",
  "events.wizard.review.noTour": "Not part of a tour",
  "events.wizard.error.invalidDate": "Please pick a valid date and time.",
  "events.wizard.error.pastDate": "Events must be scheduled in the future.",
  "events.wizard.error.titleRequired": "Please name the event.",
  "events.wizard.error.venueRequired": "Please pick a venue location.",
  "events.wizard.error.eventUrlRequired": "Online events need a stream / event URL.",
  "events.wizard.error.sourceUrlRequired": "Tour stops need an official source URL.",
  "events.wizard.error.discussionLinkUrl": "Discussion link needs a URL.",
  "events.wizard.publishFailed": "Could not publish the event. Please check the form and try again.",
  "events.wizard.publishSuccess": "Event published.",
  "events.wizard.saveSuccess": "Event updated.",

  "events.url.error.notWhitelisted": "This platform is not supported. Contact Crew on Discord or via info@frissonmap.com to add it.",
  "events.url.error.unsafe": "URL is not allowed — HTTPS only, no IP addresses, no link shorteners.",
  "events.url.error.redditLocked": "Reddit discussion links must point to r/tarjaturunen. Other subreddits are not allowed.",
  "events.url.error.invalid": "URL is not valid.",
  "events.url.error.duplicate": "This URL is already in the list.",

  "events.discussion.heading": "Discussion threads",
  "events.discussion.empty": "No discussions yet — registered users can add a link.",
  "events.discussion.emptyAnon": "No discussions yet. Sign in to add one.",
  "events.discussion.add": "+ Add discussion link",
  "events.discussion.addedBy": "added by {nickname}",
  "events.discussion.remove": "Remove",
  "events.discussion.removeConfirm": "Remove this discussion link?",
  "events.discussion.platform.reddit": "Reddit",
  "events.discussion.platform.discord": "Discord",
  "events.discussion.platform.tarja_forum": "Tarja Forum",
  "events.discussion.platform.other": "Link",

  "events.cover.search.placeholder": "Search a venue, city or theme…",
  "events.cover.search.hint": "Powered by Openverse — Creative-Commons photos only.",
  "events.cover.search.searching": "Searching…",
  "events.cover.search.empty": "No images found. Try a different keyword.",
  "events.cover.search.failed": "Image search is temporarily unavailable. You can publish without a cover and add one later.",
  "events.cover.search.tooShort": "Type at least 3 characters to search.",
  "events.cover.selected": "Selected image",
  "events.cover.change": "Change image",
  "events.cover.clear": "Remove image",
  "events.cover.attribution.via": "via Openverse",
  "events.cover.attribution.byPrefix": "Photo by",
  "events.cover.attribution.unknown": "Unknown photographer",

  "events.tour.partOf": "Part of {tourName}",
  "events.tour.otherStops": "Other stops:",
  "events.tour.moreStops": "+ {n} more",
  "events.tour.noOtherStops": "Only stop announced so far.",
  "events.tour.openTour": "View tour →",

  "geocode.error.unavailable": "Search is temporarily unavailable. Please try again in a moment.",
  "geocode.error.invalidParams": "We couldn't process that search query.",
  "sigplace.error.notFound": "Landmark not found.",
  "sigplace.error.bannedWord": "This text isn't allowed here. Please rephrase.",
  "sigplace.error.urlInDescription": "Links aren't allowed in descriptions.",
  "sigplace.error.invalidBbox": "Map bounds are invalid.",
  "sigplace.error.proposerNotFound": "We couldn't find the user you tagged as proposer.",
  "sigplace.attribution.suggestedBy": "Proposed by {nickname}",
  "sigplace.attribution.deletedUser": "Proposed by a deleted account",

  "poi.detail.loadError": "Failed to load landmark.",
  "poi.propose.title": "Propose a landmark",
  "poi.propose.titleAdmin": "Add a landmark",
  "poi.propose.editTitle": "Edit landmark",
  "poi.propose.intro": "A place from Tarja's world — venue, studio or festival. Crew reviews it before it appears.",
  "poi.propose.paste.label": "Landmark name",
  "poi.propose.paste.labelTail": " — type it and we'll try to fill the rest",
  "poi.propose.field.namePlaceholder": "e.g. Sibelius Hall, Tuska site",
  "poi.propose.field.location": "Location",
  "poi.propose.field.locationSearch": "Search city, venue or landmark…",
  "poi.propose.field.locationPick": "Click on the map or pick from search",
  "poi.propose.field.description": "Description",
  "poi.propose.field.descriptionPlaceholder": "Auto-filled once you pick a location — edit freely.",
  "poi.propose.field.descriptionHint": "AI-drafted — review, may contain errors.",
  "poi.propose.field.cover": "Cover image (optional)",
  "poi.propose.ai.searching": "Looking up Tarja + neutral facts…",
  "poi.propose.ai.success": "Auto-filled from Wikipedia + Tarja sources",
  "poi.propose.ai.notTarjaRelevant": "We couldn't confirm a Tarja connection for this landmark. Try a venue, studio, festival, or landmark she's performed at or referenced.",
  "poi.propose.ai.tarjaUnknownAddYourself": "Facts added — please add the Tarja connection yourself.",
  "poi.propose.ai.failed": "Lookup didn't return anything. You can still fill the description manually.",
  "poi.propose.ai.notLocated": "Couldn't auto-locate this venue. Try the location search below or click on the map.",
  "poi.propose.ai.button": "Auto-fill from web",
  "poi.propose.ai.retry": "Try AI lookup again",
  "poi.propose.ai.locationIncomplete": "Pick a city or country for the location to enable AI description lookup.",
  "poi.propose.refresh.tooltip": "Generate description again",
  "poi.propose.refresh.confirmTitle": "Replace the description?",
  "poi.propose.refresh.confirmBody": "Your current text will be replaced by a freshly generated draft.",
  "poi.propose.refresh.confirmCta": "Replace",
  "pending.title.poi": "Setting up your place…",
  "pending.title.concert": "Setting up this concert…",
  "pending.title.tour": "Looking up this tour…",
  "pending.step.tourInfo": "Finding tour info",
  "pending.step.location": "Found location",
  "pending.step.venue": "Finding the venue",
  "pending.step.venueDetails": "Finding the venue & details",
  "pending.step.description": "Writing description",
  "pending.step.photo": "Finding a photo",
  "pending.escape": "I'll fill it in myself",
  "poi.propose.submit.propose": "Propose landmark",
  "poi.propose.submit.save": "Save changes",
  "poi.propose.submit.publish": "Publish landmark",
  "poi.propose.cancel": "Cancel",
  "poi.propose.toast.proposed": "Landmark proposed — Crew will review it shortly.",
  "poi.propose.toast.published": "Landmark published.",
  "poi.propose.toast.saved": "Changes saved.",
  "poi.propose.error.publishFailed": "Couldn't publish — please try again.",
  "poi.propose.error.capExceeded": "You've already proposed a landmark today. Try again tomorrow.",
  "poi.propose.error.nameRequired": "Please enter a name.",
  "poi.propose.error.duplicateName": "This place is already on the map.",
  "poi.propose.error.locationRequired": "Please pick a location on the map or via search.",

  "poi.actions.edit": "Edit",
  "poi.actions.delete": "Delete",
  "poi.actions.approve": "Approve",
  "poi.actions.reject": "Reject",
  "poi.actions.suggestChange": "Suggest a change",
  "poi.actions.confirmDeleteTitle": "Delete this landmark?",
  "poi.actions.confirmDeleteBody": "This will remove the landmark from the map. This action can't be undone.",
  "poi.actions.confirmDeleteConfirm": "Delete",
  "poi.actions.rejectReasonTitle": "Reject landmark",
  "poi.actions.rejectReasonBody": "Tell the proposer why their landmark is being rejected. They'll see this in their Yours tab.",
  "poi.actions.rejectReasonPlaceholder": "e.g. Not Tarja-relevant, duplicate, wrong location…",
  "poi.actions.rejectReasonConfirm": "Reject with reason",

  "poi.popup.proposedBy": "Proposed by",
  "poi.popup.statusPending": "Pending",
  "poi.popup.statusRejected": "Rejected",
  "poi.popup.rejectReason": "Reject reason",

  "common.more": "More",
  "common.less": "Less",

  "spider.button.label": "Landmarks",
  "spider.action.proposePOI": "Propose landmark",
  "spider.action.addPOI": "Add landmark",
  "spider.action.proposePOIAnonHint": "Sign in to propose a landmark",
  "spider.action.highlightLandmarks": "Highlight landmarks",
  "spider.action.highlightOn": "On",
  "spider.highlight.hint": "Tap a landmark to explore it.",
  "spider.highlight.empty": "No landmarks on the map yet.",

  "propose.gate.pinRequired": "Add an Echo on the map first.",

  "mapActions.places.label": "Landmarks",
  "mapActions.legend.label": "Legend",
  "mapActions.join.label": "Join",
  "mapActions.join.ariaLabel": "Show open gatherings on the map",
  "mapActions.join.tooltip": "Find open fan gatherings you can join with your own Echo",
  "mapActions.join.empty": "No open gatherings right now — be the first to start one!",
  "mapActions.join.emptyCta": "Start one",
  "mapActions.join.hint": "Tap a gathering to join.",
  "mapActions.locate.label": "Locate",
  "mapActions.locate.ariaLabel": "Centre the map on your location",
  "mapActions.locate.tooltip": "Jump the map to where you are right now",
  "mapActions.locate.error": "Couldn’t find your location. Check your device’s location settings and try again.",
  "mapActions.locate.youAreHere": "You are here",

  "mapActions.backView.label": "Back to map",
  "mapActions.backView.title": "Zoom back out to the full map",

  "mapActions.community.label": "Hub",
  "mapActions.community.ariaLabel": "Open the community hub",
  "mapActions.community.tooltip": "Community hub — Reddit, fan links and the latest discussions in one place",
  "community.title": "Community Hub",
  "community.subtitle": "Where fans are talking — on and off the map.",
  "community.canon.badge": "UNOFFICIAL",
  "community.showOnMap": "Show on map",
  "community.openEvent": "Open event",
  "community.section.latest": "Latest links",
  "community.section.share": "Share a link",
  "community.loading": "Loading…",
  "community.error": "Couldn't load the board — try again.",
  "community.empty.title": "No links yet",
  "community.empty.body": "Be the first to share where fans are gathering — a thread, a watch party, a forum post.",
  "community.canon.desc": "The home base for Tarja fans — always here.",
  "community.signin": "Sign in to share a link",
  "community.unlock": "Sharing links unlocks after your first Echo — {n} to go!",
  "community.capReached": "You're sharing the maximum number of links — remove one to add another.",
  "community.added.you": "You",
  "community.add.trigger": "Share a link",
  "community.add.placeholder": "Paste a link — Reddit, Discord, YouTube, forum…",
  "community.add.namePlaceholder": "Link name — we'll auto-fill it from the link",
  "community.add.nameFetching": "Fetching the title…",
  "community.add.nameRequired": "Give the link a short name so fans know what it is.",
  "community.add.noTitle": "No title came back — name it yourself.",
  "community.add.auto": "Auto",
  "community.add.hint": "The name fills in automatically when we read the link — edit it anytime. Reddit links must point to r/tarjaturunen.",
  "community.add.close.ariaLabel": "Close the share form",
  "community.rename.aria": "Rename",
  "community.rename.save": "Save name",
  "community.rename.cancel": "Cancel",
  "community.rename.error": "Couldn't rename that link.",
  "community.rename.reasonTitle": "Edit this link's name?",
  "community.rename.reasonPlaceholder": "Why is it being renamed?",
  "community.remove.title": "Remove this link?",
  "community.remove.placeholder": "Why is it being removed?",
  "community.remove.error": "Couldn't remove that link."
}
