{
  "tor": {
    "status": {
      "disabled": "Off",
      "connecting": "Connecting…",
      "connected": "Connected",
      "failed": "Connection failed"
    },
    "banner": {
      "connecting": "Connecting to Tor — content won't load until it's ready.",
      "failed": "Couldn't connect to Tor — content is blocked until it connects.",
      "retry": "Try again"
    }
  },
  "common": {
    "loading": "Loading…",
    "error": "Error",
    "success": "Success",
    "cancel": "Cancel",
    "save": "Save",
    "delete": "Delete",
    "edit": "Edit",
    "close": "Close",
    "back": "Back",
    "next": "Next",
    "continue": "Continue",
    "refresh": "Refresh",
    "search": "Search",
    "filter": "Filter",
    "clear": "Clear",
    "submit": "Submit",
    "confirm": "Confirm",
    "copied": "Copied",
    "goBack": "Go back",
    "tryAgain": "Please try again.",
    "showLess": "Show less",
    "readMore": "Read more",
    "byAuthor": "by <0>{{name}}</0>",
    "clearSearch": "Clear search",
    "searching": "Searching…",
    "searchResultsCount_one": "{{count}} result",
    "searchResultsCount_other": "{{count}} results",
    "sortAriaLabel": "Sort order",
    "sortDefault": "Default",
    "sortTop": "Top",
    "sortNew": "New",
    "showHidden": "Show hidden",
    "filtersAriaLabel": "Search filters",
    "countryFilterAriaLabel": "Filter by country",
    "countrySearchPlaceholder": "Search countries…",
    "countryNoResults": "No countries found.",
    "countryGlobal": "Global"
  },
  "imageCrop": {
    "title": "Crop Image",
    "reset": "Reset",
    "hint": "Drag to reposition · Pinch or scroll to zoom",
    "cancel": "Cancel",
    "processing": "Processing…",
    "apply": "Apply Crop"
  },
  "translate": {
    "translate": "Translate",
    "translating": "Translating…",
    "showOriginal": "Show original",
    "error": "Translation failed"
  },
  "nav": {
    "openMenu": "Open menu",
    "closeMenu": "Close menu",
    "brandHome": "{{appName}} home",
    "activity": "Activity",
    "campaigns": "Campaigns",
    "groups": "Groups",
    "pledge": "Pledge",
    "search": "Search",
    "language": "Language",
    "dashboard": "Dashboard",
    "myDashboard": "My Dashboard",
    "notifications": "Notifications",
    "messages": "Messages",
    "profile": "Profile",
    "settings": "Settings",
    "about": "About",
    "sponsors": "Sponsors",
    "verify": "Verify",
    "privacy": "Privacy",
    "safety": "Safety",
    "changelog": "Changelog",
    "sourceCode": "Source code",
    "getApp": "Get the app"
  },
  "messages": {
    "title": "Messages",
    "subtitle": "Your private encrypted direct messages.",
    "conversations": "Conversations",
    "empty": "No messages yet. Conversations you have will appear here.",
    "selectPrompt": "Select a conversation to read your messages.",
    "composePlaceholder": "Write a message…",
    "send": "Send",
    "sendFailed": "Failed to send message",
    "youPrefix": "You:",
    "encryptedSent": "Encrypted message",
    "encryptedReceived": "Encrypted message",
    "decryptFailed": "Unable to decrypt this message.",
    "unsupported": "Your current login method does not support encrypted direct messages.",
    "searchConversation": "Search conversation",
    "searchPlaceholder": "Search messages",
    "noSearchResults": "No matching messages.",
    "visitProfile": "Visit {{name}}'s profile",
    "muteUser": "Mute {{name}}",
    "muteDialogTitle": "Mute {{name}}?",
    "muteDialogDescription": "This will add {{name}} to your mute list and remove this conversation from Messages. You can unmute them later from your mute list.",
    "confirmMute": "Mute user",
    "mutedToastTitle": "User muted",
    "mutedToastDescription": "{{name}} was muted and the conversation was removed.",
    "muteFailed": "Failed to mute user",
    "showFriendsOnly": "Show messages from people you follow",
    "showAllConversations": "Show all conversations",
    "friendsEmpty": "No messages from people you follow.",
    "translateDialogTitle": "Translate private messages?",
    "translateDialogDescription": "Received messages will be sent to your configured translation service. Sent messages will not be translated. Eranos will remember this choice on this device.",
    "confirmTranslate": "Translate messages",
    "newMessage": "New message",
    "newMessageTitle": "New message",
    "recipientLabel": "To",
    "recipientPlaceholder": "Search by name, NIP-05, or npub…",
    "recipientHint": "Search for someone to start a new conversation.",
    "recipientSearching": "Searching…",
    "noRecipientResults": "No people found. Try a different name, NIP-05, or npub.",
    "recipientFollowed": "You follow this person"
  },
  "auth": {
    "join": "Join",
    "login": "Log in",
    "signup": "Sign up",
    "logout": "Log out",
    "addAccount": "Add another account",
    "createNewAccount": "Create new account",
    "loginExisting": "Log in with existing",
    "loginTitle": "Log in",
    "connectSignerTitle": "Connect signer",
    "back": "Back",
    "secretKeyLabel": "Use secret key",
    "nsecPlaceholder": "nsec1…",
    "uploadKeyFile": "Upload key file",
    "loggingIn": "Logging in…",
    "loginWithExtension": "Log in with extension",
    "useRemoteSigner": "Use a remote signer",
    "tryAgain": "Try again",
    "cancel": "Cancel",
    "openSignerApp": "Open signer app",
    "enterBunkerManually": "Enter bunker URI manually",
    "bunkerPlaceholder": "bunker://…",
    "invalidBunkerFormat": "Invalid bunker URI format.",
    "connecting": "Connecting…",
    "connect": "Connect",
    "waitingForSigner": "Waiting for signer connection…",
    "gettingPublicKey": "Getting public key…",
    "errorEnterSecretKey": "Enter your secret key.",
    "errorInvalidSecretKey": "Invalid secret key. Must start with nsec1.",
    "errorLoginFailed": "Couldn't log in with this key.",
    "errorFileNoKey": "File does not contain a valid secret key.",
    "errorFileRead": "Failed to read file.",
    "errorExtensionFailed": "Extension login failed.",
    "errorBunkerConnect": "Failed to connect. Check the bunker URI.",
    "extensionErrorTitle": "Extension login failed"
  },
  "onboarding": {
    "ariaLabel": "Account setup",
    "close": "Close",
    "back": "Back",
    "role": {
      "title": "What brings you here?",
      "subtitle": "You can do both later. This just helps us tailor the next steps.",
      "creator": {
        "title": "Start a campaign",
        "description": "Raise Grin for a cause you care about.",
        "finderNote": "Donors send GRIN directly to your wallet."
      },
      "donor": {
        "title": "Give to campaigns",
        "description": "Support causes with Grin.",
        "finderNote": "100% of your donation goes to the campaign."
      },
      "verifier": {
        "title": "Verify campaigns",
        "description": "Vouch for campaigns as an organization.",
        "finderNote": "Donors see badge on campaigns you trust."
      }
    },
    "keygen": {
      "title": "Your key is your identity",
      "description": "We'll generate a secret key just for you. It's the only way to log in — no email, no password.",
      "generatingTitle": "Creating your key…",
      "generatingDescription": "This only takes a moment.",
      "button": "Generate my key"
    },
    "secure": {
      "title": "Save your key",
      "subtitle": "Download the file and store it somewhere safe. A password manager works well.",
      "couplingNote": "This key is your identity on Eranos. It signs your Nostr posts, your campaigns, and the donation receipts that count toward campaign totals.",
      "permanenceHeadline": "There's no way to recover this key if you lose it.",
      "permanenceBody": "No reset, no support line, no email recovery. Save it before continuing.",
      "button": "Download & continue",
      "downloadFailedTitle": "Download failed",
      "downloadFailedDescription": "Could not download the key file. Please copy it manually.",
      "secretKeyAriaLabel": "Secret key"
    },
    "profile": {
      "title": "Make it yours",
      "subtitle": "Tell others a bit about yourself. All optional, change it any time.",
      "campaignTitle": "Put a face to your campaign",
      "campaignSubtitle": "A name and photo help people connect with your campaign.",
      "nameLabel": "Display name",
      "namePlaceholder": "Your name",
      "campaignNamePlaceholder": "Campaign title",
      "aboutLabel": "Bio",
      "aboutPlaceholder": "A little about you…",
      "avatarLabel": "Avatar",
      "uploadAvatar": "Upload avatar",
      "advanced": "More",
      "finish": "Finish",
      "saving": "Saving…",
      "skip": "Skip for now",
      "imageOnly": "Please select an image.",
      "imageTooLarge": "Image too large (max 5MB).",
      "uploadFailed": "Upload failed.",
      "publishFailedTitle": "Profile setup failed",
      "publishFailedDescription": "Your account was created but the profile could not be saved. You can update it later."
    },
    "verifier": {
      "identity": {
        "title": "Set up your organization",
        "subtitle": "Name and logo are required. Website and banner are optional.",
        "websiteInvalid": "Enter a valid website starting with https://",
        "cropAvatar": "Crop logo",
        "cropBanner": "Crop banner",
        "uploading": "Uploading image…",
        "clipboardFailed": "Couldn't read from clipboard.",
        "pasteUrlInvalid": "Clipboard doesn't contain a valid https URL.",
        "pasteUrlFetchFailed": "Couldn't load that image. Check the URL and try again."
      },
      "bio": {
        "title": "Tell us about your organization",
        "subtitle": "A short description for your profile.",
        "label": "About your organization",
        "placeholder": "We're a nonprofit that…",
        "publishing": "Saving your profile…"
      },
      "publishFailedTitle": "Profile not saved",
      "publishFailedDescription": "Your account is ready, but the organization profile couldn't be published. You can finish it later from settings.",
      "statement": {
        "title": "Publish your verifier statement",
        "subtitle": "Describe how you vet campaigns before vouching. Published publicly so donors can trust your badge."
      },
      "howto": {
        "title": "How to verify a campaign",
        "subtitle": "You're all set. Here's how to vouch for a campaign once you've checked it out.",
        "finish": "View campaigns"
      }
    }
  },
  "feed": {
    "indexTagline": "Your content. Your vibe. Your rules.",
    "getApp": {
      "eyebrow": "Get the app",
      "title": "{{appName}} for Android",
      "subtitle": "The full {{appName}} experience",
      "download": "Download"
    },
    "compose": {
      "placeholder": "What's happening?"
    },
    "tabs": {
      "follows": "Follows",
      "following": "Following",
      "global": "Global"
    },
    "empty": {
      "homeAgora": "Quiet moment on Eranos. New campaigns, pledges, donations, and posts will appear here as they happen.",
      "homeFollowingLoggedIn": "Your follow feed is empty. Follow some people to see what they're up to, or switch to Eranos or Global.",
      "homeFollowingLoggedOut": "Log in to see posts from people you follow.",
      "homeOther": "Nothing to show. Check your relay connections or try again in a moment.",
      "follows": "Your feed is empty. Follow some people to see their posts here.",
      "global": "No posts found. Check your relay connections or come back soon.",
      "browseAgora": "Browse the Eranos feed",
      "browseGlobal": "Browse the Global feed",
      "discoverPeople": "Discover people to follow",
      "logIn": "Log in"
    },
    "modeSwitcher": {
      "agora": "Eranos",
      "allNostr": "Global",
      "following": "Following",
      "ariaLabel": "Feed mode: {{label}}. Click to change.",
      "loginRequired": "Log in to see posts from people you follow"
    },
    "replyContext": {
      "replyingTo": "Replying to",
      "and": "and",
      "andOthers_one": "and {{count}} other",
      "andOthers_other": "and {{count}} others"
    },
    "actions": {
      "reply": "Reply",
      "repost": "Repost",
      "undoRepost": "Undo repost",
      "react": "React",
      "share": "Share",
      "more": "More",
      "linkCopied": "Link copied to clipboard"
    }
  },
  "compose": {
    "placeholderDefault": "What's happening?",
    "placeholderPoll": "Ask a question…",
    "placeholderCountry": "What's happening in {{country}}?",
    "placeholderCwReason": "Content warning reason (optional)",
    "submitDefault": "Post!",
    "preview": {
      "edit": "Edit",
      "previewMode": "Preview"
    },
    "poll": {
      "addOption": "Add option",
      "optionLabel": "Option {{number}}",
      "singleChoice": "Single choice",
      "multipleChoice": "Multiple choice",
      "backToPost": "Back to post",
      "publishing": "Publishing...",
      "publish": "Publish poll",
      "published": "Poll published!",
      "publishFailed": "Failed to publish poll."
    },
    "voice": {
      "cancel": "Cancel",
      "send": "Send",
      "sending": "Sending...",
      "sentTitle": "Voice message sent!",
      "sentBody": "Your voice message has been published.",
      "sendFailed": "Failed to send voice message.",
      "micDeniedTitle": "Microphone access denied",
      "micDeniedBody": "Please allow microphone access to record voice messages.",
      "voiceMessage": "Voice message"
    },
    "toolbar": {
      "attachFile": "Attach file",
      "emojiGif": "Emoji / GIF",
      "more": "More",
      "poll": "Poll",
      "spoiler": "Spoiler",
      "emoji": "Emoji",
      "stickers": "Stickers"
    },
    "submit": {
      "posting": "Posting...",
      "uploadFailed": "Upload failed",
      "uploadFailedBody": "Could not upload file.",
      "publishFailed": "Failed to publish note.",
      "posted": "Posted!",
      "replyPublished": "Your reply has been published.",
      "quotePublished": "Your quote has been published.",
      "notePublished": "Your note has been published."
    },
    "destination": {
      "label": "Post to",
      "ariaHelp": "What's the difference between global and community posts?",
      "ariaTrigger": "Post destination",
      "global": "Global",
      "globalExplainer": "A regular post visible to everyone on Nostr. Anyone, anywhere can see it.",
      "community": "Your country community",
      "communityExplainer": "Shown in that country's local feed alongside posts from neighbors. Best for community-relevant updates.",
      "chooseAnother": "Choose another country…",
      "searchPlaceholder": "Search countries...",
      "noResults": "No countries found.",
      "isDefault": "{{name}} is your default",
      "globalIsDefault": "Global is your default",
      "thisIsDefault": "This is your default",
      "setAsDefault": "Set as default",
      "defaultUpdated": "Default updated",
      "defaultUpdatedCountry": "New posts will go to {{name}} by default.",
      "defaultUpdatedGlobal": "New posts will be global by default."
    }
  },
  "replyModal": {
    "title": {
      "newPoll": "New poll",
      "newComment": "New comment",
      "commentOnProfile": "Comment on profile",
      "replyToPost": "Reply to post",
      "quotePost": "Quote post",
      "newPost": "New post"
    },
    "placeholder": {
      "writeComment": "Write a comment...",
      "writeReply": "Write a reply...",
      "addComment": "Add a comment...",
      "whatsHappening": "What's happening?"
    },
    "blueskyDisclaimer": "People on Bluesky can't see you because they're not actually decentralized."
  },
  "postDetail": {
    "repliesHeading": "Replies",
    "commentsHeading": "Comments",
    "replyCount_one": "reply",
    "replyCount_other": "replies",
    "commentCount_one": "comment",
    "commentCount_other": "comments"
  },
  "noteCard": {
    "botAccount": "Bot account",
    "showLess": "Show less",
    "readMore": "Read more",
    "reacted": "reacted",
    "reposted": "reposted",
    "voted": "voted",
    "stream": {
      "untitled": "Untitled Stream",
      "live": "LIVE",
      "ended": "ENDED",
      "planned": "PLANNED",
      "unknown": "UNKNOWN"
    },
    "kindHeader": {
      "photo": {
        "action": "shared a",
        "noun": "photo"
      },
      "encryptedMessage": {
        "action": "sent an",
        "noun": "encrypted message"
      },
      "letter": {
        "action": "sent a",
        "noun": "letter"
      },
      "treasureHidCreated": "hid a",
      "treasureHidUpdated": "updated a",
      "treasureNoun": "treasure",
      "treasureFound": "found a",
      "deckCreated": "created a",
      "deckUpdated": "updated a",
      "deckFallback": "shared a",
      "deckNoun": "deck",
      "emojiPackCreated": "created an",
      "emojiPackUpdated": "updated an",
      "emojiPackFallback": "shared an",
      "emojiPackNoun": "emoji pack",
      "groupCreated": "created a",
      "groupUpdated": "updated a",
      "groupFallback": "shared a",
      "groupNoun": "group",
      "campaignLaunched": "launched a",
      "campaignUpdated": "updated a",
      "campaignFallback": "shared a",
      "campaignNoun": "campaign",
      "badgeAwarded": "awarded a",
      "badgeNoun": "badge",
      "badgeCreated": "created a",
      "badgeDefUpdated": "updated a",
      "badgesNoun": "badges",
      "badgesCreatedTheir": "created their",
      "badgesUpdatedTheir": "updated their",
      "streamingLive": "is streaming",
      "streamed": "streamed",
      "zapstoreAppPublished": "published a Zapstore app",
      "zapstoreAppUpdated": "updated a Zapstore app",
      "zapstoreReleasePublished": "published a Zapstore release",
      "zapstoreReleaseUpdated": "updated a Zapstore release",
      "zapstoreAssetPublished": "published a Zapstore asset",
      "appPublished": "published an app",
      "appUpdated": "updated an app",
      "repoCreated": "created a",
      "repoUpdated": "updated a",
      "repoFallback": "shared a",
      "repoNoun": "repository",
      "patchSubmitted": "submitted a",
      "patchNoun": "patch",
      "prOpened": "opened a",
      "prNoun": "pull request",
      "nipProposed": "proposed a",
      "nipUpdated": "updated a",
      "nipNoun": "NIP",
      "nsiteDeployed": "deployed an",
      "nsiteRedeployed": "redeployed an",
      "nsiteNoun": "nsite",
      "pledgeCreated": "created a",
      "pledgeUpdated": "updated a",
      "pledgeNoun": "pledge",
      "followPackCreated": "created a",
      "followPackUpdated": "updated a",
      "followPackFallback": "shared a",
      "followPackNoun": "follow pack",
      "followSetCreated": "created a",
      "followSetUpdated": "updated a",
      "followSetFallback": "shared a",
      "followSetNoun": "follow set"
    }
  },
  "noteMoreMenu": {
    "title": "Post options",
    "viewPost": "View post details",
    "viewEventJson": "View Event JSON",
    "bookmark": "Bookmark",
    "removeBookmark": "Remove Bookmark",
    "addToList": "Add to list",
    "addToSidebar": "Add to sidebar",
    "removeFromSidebar": "Remove from sidebar",
    "pinProfile": "Pin on profile",
    "unpinProfile": "Unpin from profile",
    "pinCountry": "Pin to country feed",
    "unpinCountry": "Unpin from country feed",
    "muteConversation": "Mute Conversation",
    "muteCampaign": "Mute Campaign",
    "mute": "Mute @{{name}}",
    "unmute": "Unmute @{{name}}",
    "report": "Report @{{name}}",
    "reportToGroup": "Report post to group",
    "removeFromGroup": "Remove from group",
    "delete": "Delete post",
    "close": "Close",
    "encryptedContent": "Encrypted content",
    "toast": {
      "removedFromSidebar": "Removed from sidebar",
      "addedToSidebar": "Added to sidebar",
      "pinned": "Pinned to profile",
      "unpinned": "Unpinned from profile",
      "pinFailed": "Failed to update pinned posts",
      "countryPinned": "Pinned to country feed",
      "countryUnpinned": "Unpinned from country feed",
      "countryPinFailed": "Failed to pin to country feed",
      "countryUnpinFailed": "Failed to unpin from country feed",
      "convoMuted": "Conversation muted",
      "convoMuteFailed": "Failed to mute conversation",
      "muted": "Muted @{{name}}",
      "unmuted": "Unmuted @{{name}}",
      "muteFailed": "Failed to mute user",
      "unmuteFailed": "Failed to unmute user",
      "postDeleted": "Post deleted",
      "deleteFailed": "Failed to delete post",
      "eventBroadcast": "Event broadcast to relays",
      "broadcastFailed": "Failed to broadcast event",
      "copied": "{{label}} copied to clipboard"
    },
    "deleteDialog": {
      "title": "Delete post?",
      "description": "This will request deletion from relays. Some relays may still keep a copy of the original event. This action cannot be undone.",
      "cancel": "Cancel",
      "delete": "Delete",
      "deleting": "Deleting..."
    },
    "jsonDialog": {
      "title": "Event Details",
      "eventId": "Event ID",
      "eventIdLabel": "Event ID",
      "rawJson": "Raw JSON",
      "eventJsonLabel": "Event JSON",
      "broadcast": "Broadcast Event",
      "broadcasting": "Broadcasting..."
    }
  },
  "policyPages": {
    "privacy": {
      "seoTitle": "Privacy Policy",
      "seoDescription": "Privacy policy for {{appName}} — how your data is handled on the Nostr network",
      "title": "Privacy Policy"
    },
    "csae": {
      "seoTitle": "Child Safety Policy",
      "seoDescription": "{{appName}}'s policy on child sexual abuse and exploitation (CSAE) — our commitment to child safety on the Nostr network",
      "title": "Child Safety Policy"
    },
    "donorGuide": {
      "seoTitle": "Donor Guide",
      "seoDescription": "How donating works on {{appName}} and how to protect your privacy.",
      "title": "Donor Guide",
      "subtitle": "Real Grin, sent directly. The whole flow in one short page."
    },
    "recipientGuide": {
      "seoTitle": "Recipient Guide",
      "seoDescription": "How to receive donations on {{appName}} and cash out privately.",
      "title": "Recipient Guide",
      "subtitle": "Pick what to accept, receive donations, cash out."
    },
    "changelog": {
      "seoTitle": "Changelog",
      "seoDescription": "What's new in {{appName}}",
      "title": "Changelog",
      "loadError": "Failed to load changelog.",
      "empty": "No releases yet.",
      "pastReleases": "Past releases",
      "showLess": "Show less",
      "readMore": "Read more",
      "preReleaseLabel": "Pre-release build",
      "preReleaseBody": "This build contains changes not yet included in a release.",
      "viewUnreleased": "View unreleased changes",
      "categories": {
        "Added": "Added",
        "Changed": "Changed",
        "Deprecated": "Deprecated",
        "Removed": "Removed",
        "Fixed": "Fixed",
        "Security": "Security"
      }
    }
  },
  "about": {
    "seoTitle": "About",
    "seoDescription": "How {{appName}} works: connecting recipients to unstoppable funding through Grin and Nostr.",
    "hero": {
      "eyebrow": "About {{appName}}",
      "headlinePart1": "How",
      "headlineAppName": "{{appName}}",
      "headlinePart2": "works.",
      "body": "{{appName}} is a censorship-resistant donation platform built on Nostr and Grin. No frozen bank accounts. No corporate shut-downs. Just direct support from people who believe in your cause.",
      "trustChips": {
        "decentralized": "Decentralized",
        "openSource": "Open source",
        "censorshipResistant": "Censorship resistant"
      },
      "ctaDonor": "Read the Donor Guide",
      "ctaRecipient": "Read the Recipient Guide",
      "sampleCard": {
        "countryName": "Venezuela",
        "public": "Public",
        "imageAlt": "Venezuelans at a candlelight vigil holding a sign reading 'Liberen a todos los presos políticos · ¡Cese la represión!'",
        "orgName": "Venezolanos Libres",
        "title": "Free Venezuela's Political Prisoners",
        "description": "Legal defense and family support for 800+ political prisoners detained by the Maduro regime.",
        "raised": "raised",
        "ofGoal": "of $10,000",
        "donorsLine": "247 donors · 12 countries",
        "donate": "Donate Grin"
      }
    },
    "howItWorks": {
      "eyebrow": "How it works",
      "title": "Three steps. No middleman.",
      "lede": "No banks, no borders, no permission.",
      "step1": {
        "imageAlt": "A glowing orange cryptographic key floating in dark space, symbolizing self-sovereign identity",
        "title": "Recipients sign up in seconds.",
        "body": "No bank. No paperwork. No approval. A recipient creates an account on {{appName}}, adds the receiving address from their own Grin wallet to their campaign, and can accept support from anywhere in the world."
      },
      "step2": {
        "imageAlt": "A glowing Grin coin flying through the air across a dark world map, symbolizing instant cross-border payment",
        "title": "Donors send Grin directly.",
        "body": "Donors pay from any Grin wallet, either through the campaign's GoblinPay checkout or straight to its grin1 Slatepack address. {{appName}} never touches the money. The transaction goes from the donor's wallet to the recipient's wallet."
      },
      "step3": {
        "imageAlt": "An open hand with warm orange light radiating from the palm, symbolizing receiving and agency",
        "title": "Support lands where it matters.",
        "body": "Funds arrive at the recipient directly. They keep custody, they keep control. Move it, swap it, or spend it; the guides below explain how to do it privately and safely."
      }
    },
    "faq": {
      "eyebrow": "Questions",
      "title": "Frequently asked.",
      "chapter1": {
        "label": "Getting started",
        "description": "What Eranos is, who built it, and what it costs."
      },
      "chapter2": {
        "label": "Grin donations",
        "description": "How payments work, why Grin, what stays private, and the trade-offs."
      },
      "chapter3": {
        "label": "About Nostr",
        "description": "The open protocol Eranos is built on, and how your account works."
      }
    },
    "guides": {
      "eyebrow": "Guides",
      "title": "Pick the side you're on.",
      "lede": "Whether you're sending or receiving, learn how to do it safely and privately.",
      "donor": {
        "imageAlt": "Hooded protesters marching through a European city street at dusk, holding burning red flares and 'FREEDOM' and 'LIBERTAD' banners",
        "role": "For Donors",
        "title": "Support causes the banks won't.",
        "description": "Send Grin directly to recipients and movements anywhere in the world, without asking a payment processor for permission.",
        "bullet1": "Pay from any Grin wallet, like Goblin or grin-wallet.",
        "bullet2": "Donations land directly with the recipient. No custodian, no middleman.",
        "cta": "Read the Donor Guide"
      },
      "recipient": {
        "imageAlt": "Aerial view of thousands of protesters gathered at night in a city square with burning red flares, beneath a 'UNITY IN DARKNESS' banner projected on the surrounding buildings",
        "role": "For Recipients",
        "title": "Get funded without permission.",
        "description": "Receive support directly from people who believe in your cause. No bank account, no application form, no company in the middle.",
        "bullet1": "Start receiving donations as soon as you sign up.",
        "cta": "Read the Recipient Guide"
      },
      "stillStuck": "Still stuck?",
      "followTeam": "Follow Team Soapbox on Nostr",
      "stillStuckSuffix": ". We triage questions there."
    }
  },
  "corporateSponsorship": {
    "seoTitle": "Corporate Sponsorship",
    "seoDescription": "Partner with {{appName}} to fund causes that matter. Donate to the Seed Fund, match donations to campaigns you care about, or promote {{appName}} to your customers as part of your philanthropic initiatives.",
    "hero": {
      "eyebrow": "Partner with {{appName}}",
      "headlinePart1": "Fund what",
      "headlineHighlight": "matters.",
      "body": "{{appName}} connects donors directly to causes through Grin: no frozen accounts, no middlemen, no platform taking a cut. Bring the same uncensorable giving to your company's philanthropy.",
      "trustChips": {
        "nonCustodial": "Non-custodial",
        "transparent": "Transparent on-chain",
        "noFees": "No platform fees"
      },
      "ctaPrimary": "Get in touch",
      "ctaSecondary": "See the ways to partner"
    },
    "intro": {
      "eyebrow": "Why partner",
      "title": "Corporate giving without the gatekeepers",
      "lede": "Every dollar your company commits goes straight to the cause, verifiably: each donation can carry a Grin payment proof anchored to the chain. There is no custodian to freeze funds, no payment processor to deplatform a campaign, and no opaque overhead eating into your impact.",
      "stats": {
        "feesLabel": "Platform fees on donations",
        "feesValue": "0%",
        "custodyLabel": "Funds we ever custody",
        "custodyValue": "None",
        "reachLabel": "Borders that can stop a donation",
        "reachValue": "Zero"
      }
    },
    "ways": {
      "eyebrow": "Ways to get involved",
      "title": "Three ways to partner",
      "lede": "Pick the level of involvement that fits your company — or combine all three.",
      "seedFund": {
        "kicker": "01 · Direct support",
        "title": "Donate to the Eranos Seed Fund",
        "description": "Make an unrestricted gift to the {{appName}} Seed Fund. The Seed Fund seeds new and high-need campaigns across the platform, getting verified causes off the ground when they need it most.",
        "bullet1": "Give in Grin (GRIN) or US dollars (USD)",
        "bullet2": "Unrestricted — directed where the need is greatest",
        "bullet3": "Recurring or one-time commitments welcome",
        "cta": "Fund the Seed Fund"
      },
      "matching": {
        "kicker": "02 · Multiply impact",
        "title": "Match donations to campaigns",
        "description": "Commit a matching pool and we will double every donor's gift up to your cap. Choose exactly what your company stands behind:",
        "bullet1": "Match an individual campaign you care about",
        "bullet2": "Match a featured or staff-picked campaign",
        "bullet3": "Match every campaign on a curated list — e.g. campaigns supporting political prisoners, or women's sovereignty across Africa",
        "cta": "Set up a match"
      },
      "promote": {
        "kicker": "03 · Amplify",
        "title": "Promote {{appName}} to your customers",
        "description": "Make {{appName}} giving a centerpiece of your philanthropic initiatives. Invite your customers and community to give alongside you, and turn your reach into real, uncensorable funding for causes.",
        "bullet1": "Co-branded campaigns and donation drives",
        "bullet2": "Checkout round-ups and customer match prompts",
        "bullet3": "Shared transparency reports your customers can verify on-chain",
        "cta": "Plan a campaign"
      }
    },
    "matchingExamples": {
      "eyebrow": "Matching in action",
      "title": "Match the causes that move you",
      "lede": "Curated lists let you back an entire movement with a single commitment. A few examples of what a matching pool can target:",
      "example1": {
        "title": "Political prisoners",
        "body": "Match every donation to campaigns providing legal defense and family support for political prisoners worldwide."
      },
      "example2": {
        "title": "Women's sovereignty in Africa",
        "body": "Double gifts to campaigns advancing women's economic independence and self-determination across the African continent."
      },
      "example3": {
        "title": "Your own list",
        "body": "Tell us the cause and we'll build a curated list of verified campaigns for your matching pool to back."
      }
    },
    "cta": {
      "eyebrow": "Let's talk",
      "title": "Ready to put your company behind a cause?",
      "body": "Tell us how you'd like to get involved and we'll help you set up the right partnership — Seed Fund gift, matching pool, or a customer campaign.",
      "button": "Contact the {{appName}} team",
      "followLine": "Prefer Nostr?",
      "followLink": "Follow Team Soapbox",
      "followSuffix": " and send us a message."
    }
  },
  "forms": {
    "required": "Required",
    "recommended": "Recommended",
    "optional": "Optional",
    "title": "Title",
    "country": "Country",
    "tags": "Tags",
    "coverImage": "Cover image",
    "description": "Description",
    "timezone": "Timezone",
    "publishing": "Publishing…",
    "uploadingCover": "Uploading cover…",
    "countrySearchPlaceholder": "Search countries",
    "countryClearAria": "Clear country",
    "flagOfAria": "Flag of {{name}}",
    "countryHint": "Publishes <0>i: iso3166:{{code}}</0> for country sorting.",
    "imageDropzone": "Click or drag an image here"
  },
  "organizationContext": {
    "attachedToGroup": "Attached to group",
    "groupFallback": "Group",
    "editSubtext": "Updates will stay connected to this group's official activity.",
    "malformedParam": "Couldn't read the group in the link. Publishing under your account.",
    "checkingPermissions": "Checking group permissions…",
    "unauthorized": "You aren't a founder or moderator of that group. Publishing under your account.",
    "publishingAsGroup": "Publishing as group"
  },
  "notFound": {
    "title": "404 - Page Not Found",
    "description": "The page you are looking for could not be found.",
    "heading": "This page doesn't exist.",
    "goHome": "Go home"
  },
  "pledges": {
    "list": {
      "seoTitle": "Pledges",
      "seoTitleWithCountry": "Pledges — {{country}}",
      "seoDescription": "Pledge funding for concrete actions, evidence, or outcomes you want to inspire.",
      "heroKicker": "Pledge",
      "heroHeading": "Inspire the change",
      "heroHeadingLine2": "you want to see.",
      "heroBody": "Fund concrete actions, evidence, and outcomes. People reply with submissions, and the community rewards the work that moves the goal forward.",
      "openCount_one": "pledge open right now",
      "openCount_other": "pledges open right now",
      "createPledge": "Create pledge",
      "loginToCreate": "Log in to create a pledge",
      "myPledges": "My pledges",
      "myPledgesTagline": "Pledges you've created.",
      "featuredPledges": "Featured pledges",
      "featuredPledgesTagline": "Pledges highlighted by the {{appName}} team.",
      "allPledges": "Pledges",
      "allPledgesTagline": "Highlighted by moderators. Search or sort to browse every pledge.",
      "sectionActive": "Active pledges",
      "sectionUpcoming": "Upcoming pledges",
      "sectionPast": "Past pledges",
      "sectionDefault": "Pledges",
      "sectionTagline": "Help fund the actions worth making.",
      "searchPlaceholder": "Search pledges…",
      "searchAriaLabel": "Search pledges",
      "noMatch": "No pledges match “{{query}}”",
      "noMatchHint": "Try a different search term, or clear the search.",
      "sortAriaLabel": "Sort",
      "sortBy": "Sort by",
      "sortRecent": "Most recent",
      "sortBounty": "Highest pledge",
      "sortDeadline": "Deadline soon",
      "sortDeadlinePast": "Recently ended",
      "filterAriaLabel": "Filter by country",
      "countrySearchPlaceholder": "Search…",
      "noResults": "No results found.",
      "global": "Global",
      "dividerUpcoming": "Upcoming",
      "dividerPast": "Past",
      "showLess": "Show less",
      "showMore": "Show more ({{count}} more)",
      "emptyTitle": "No pledges yet",
      "emptyHint": "Be the first to create a pledge.",
      "emptyHintCountry": "Be the first to create a pledge for {{country}}.",
      "needsReview": "Needs review",
      "needsReviewDesc": "{{appName}} pledges that haven't been featured or hidden yet. Lift one into the Featured shelf or suppress it with Hide.",
      "needsReviewEmpty": "Nothing awaiting review.",
      "hidden": "Hidden",
      "hiddenDesc": "Pledges suppressed from public discovery. Use the kebab menu on a card to unhide.",
      "hiddenEmpty": "No pledges are currently hidden."
    },
    "card": {
      "ended": "Ended",
      "pledged": "Pledged",
      "byAuthor": "by <0>{{name}}</0>",
      "actionsAriaLabel": "Pledge actions",
      "deletePledge": "Delete pledge",
      "copyLink": "Copy link",
      "linkCopied": "Link copied",
      "linkCopyFailed": "Failed to copy link",
      "confirmDelete": "Delete this pledge? This cannot be undone.",
      "deleted": "Pledge deleted",
      "deletedContent": "Deleted pledge",
      "deleteFailed": "Failed to delete pledge"
    },
    "create": {
      "seoTitle": "Create pledge",
      "seoDescription": "Create a donor pledge to inspire concrete action on {{appName}}.",
      "loginGateTitle": "Log in to create a pledge",
      "loginGateBody": "Pledges are signed Nostr events. You need a Nostr login to publish one.",
      "heading": "Create pledge",
      "title": "Title",
      "titlePlaceholder": "Document a beach cleanup",
      "country": "Country",
      "countryPlaceholder": "Search countries",
      "tags": "Tags",
      "coverImage": "Cover image",
      "description": "Description",
      "descriptionPlaceholder": "Explain the action, evidence, or outcome you want to inspire, what submissions should include, and how you plan to evaluate them...",
      "pledge": "Pledge",
      "pledgeAmountPlaceholder": "100",
      "deadline": "Deadline",
      "timezone": "Timezone",
      "timezoneNote": "Start and deadline times will be interpreted in this timezone.",
      "submit": "Create pledge",
      "altText": "{{appName}} pledge: {{title}}",
      "successToast": "Pledge created",
      "errorToast": "Could not create pledge",
      "errorLoginRequired": "You must be logged in to create a pledge.",
      "errorTitleRequired": "Title is required.",
      "errorDescriptionRequired": "Description is required.",
      "errorPledgeRequired": "Pledge amount is required.",
      "errorPledgeInvalid": "Pledge amount must be a positive USD amount.",
      "errorPriceUnavailable": "Waiting for the exchange rate to calculate the pledge amount.",
      "errorCoverInvalid": "Cover image must be a valid https:// URL.",
      "errorDeadlinePast": "Deadline cannot be in the past.",
      "wizard": {
        "titleStepTitle": "Name your pledge",
        "titleStepSubtitle": "A clear ask and a short explanation of what you'll fund.",
        "pledgeStepTitle": "Set your pledge",
        "pledgeStepSubtitle": "How much you'll pay, in USD, and an optional deadline.",
        "coverStepTitle": "Add a cover image",
        "coverStepSubtitle": "One image carries the pledge on every card.",
        "tagsStepTitle": "Country and categories",
        "tagsStepSubtitle": "Help the right people find your pledge.",
        "launchNow": "Skip Next & Launch"
      }
    },
    "detail": {
      "seoTitle": "{{title}} | {{appName}} Pledge",
      "seoFallbackTitle": "Pledge | {{appName}}",
      "deadlineEndedOn": "Ended {{date}}",
      "deadlineEndsToday": "Ends today",
      "deadlineDaysLeft_one": "{{count}} day left",
      "deadlineDaysLeft_other": "{{count}} days left",
      "deadlineEndsOn": "Ends {{date}}",
      "openEnded": "Open-ended",
      "back": "Back",
      "backToPledges": "Back to pledges",
      "loadingPledge": "Loading pledge…",
      "pledge": "Pledge",
      "byAuthor": "by <0>{{name}}</0>",
      "submitLabel": "Submit",
      "linkCopied": "Link copied to clipboard",
      "pinnedToast": "Pinned to pledge",
      "unpinnedToast": "Unpinned from pledge",
      "pinFailed": "Failed to update pledge pins",
      "submissions": "Submissions",
      "submissionCount_one": "{{count}} submission",
      "submissionCount_other": "{{count}} submissions",
      "submissionPlaceholder": "Share proof, evidence, or completed work...",
      "noSubmissionsTitle": "No submissions yet",
      "noSubmissionsHint": "Be the first to reply with proof, evidence, or completed work.",
      "funded": "funded",
      "ofPledged": "of {{amount}} pledged",
      "share": "Share",
      "storyHeading": "The pledge",
      "storyEmpty": "The pledger hasn't written details for this pledge yet."
    }
  },
  "groups": {
    "list": {
      "seoTitle": "Groups",
      "seoDescription": "Discover and join groups on Nostr",
      "heroKicker": "Groups",
      "heroHeading": "Strength",
      "heroHeadingLine2": "in numbers.",
      "heroBody": "Create groups, gather members, and keep up with what your spaces are doing.",
      "createGroup": "Create a group",
      "createGroupLoginTitle": "Log in to create a group",
      "createGroupLoginBody": "Creating a group publishes a Nostr event from your account.",
      "myGroups": "My groups",
      "myGroupsTagline": "Groups you've founded, moderate, or follow.",
      "featuredGroups": "Featured groups",
      "featuredGroupsTagline": "Standout groups worth your attention.",
      "allGroups": "Groups",
      "allGroupsTagline": "Highlighted by moderators. Search or sort to browse every group.",
      "searchPlaceholder": "Search groups…",
      "searchAriaLabel": "Search groups",
      "noMatch": "No groups match “{{query}}”",
      "noMatchHint": "Try a different search term, or clear the search.",
      "loginToSeeTitle": "Log in to see your groups",
      "loginToSeeBody": "Groups you've founded or moderate will appear here.",
      "noGroupsTitle": "No groups yet",
      "noGroupsBody": "Create your own group to start coordinating campaigns, pledges, and events with your people.",
      "noFeaturedTitle": "No featured groups yet",
      "noFeaturedBody": "{{appName}} moderators feature standout groups here. Check back soon.",
      "connectingRelays": "Connecting to relays…",
      "showLess": "Show less",
      "showMore": "Show {{count}} more",
      "needsReview": "Needs review",
      "needsReviewDesc": "{{appName}} groups that haven't been featured or hidden yet. Lift one into the Featured shelf or suppress it with Hide.",
      "needsReviewEmpty": "Nothing awaiting review.",
      "hidden": "Hidden",
      "hiddenDesc": "Groups suppressed from public discovery. Use the kebab menu on a card to unhide.",
      "hiddenEmpty": "No groups are currently hidden.",
      "tickerCampaignsRaised_one": "raised on-chain across {{count}} campaign",
      "tickerCampaignsRaised_other": "raised on-chain across {{count}} campaigns",
      "tickerFeaturedGroups_one": "featured group on Nostr",
      "tickerFeaturedGroups_other": "featured groups on Nostr",
      "tickerCountries_one": "country posting today",
      "tickerCountries_other": "countries posting today"
    },
    "create": {
      "seoTitleCreate": "Create group",
      "seoTitleEdit": "Edit group",
      "seoDescriptionCreate": "Start a new group on {{appName}}.",
      "seoDescriptionEdit": "Update your group on {{appName}}.",
      "loginGateTitle": "Log in to start a group",
      "loginGateBody": "Groups are signed Nostr events. You need a Nostr login to publish one.",
      "invalidEditTitle": "Invalid edit link",
      "invalidEditBody": "This group edit link is missing a valid group address.",
      "startNewGroup": "Start a new group",
      "loadingGroup": "Loading group…",
      "cannotEditTitle": "Group cannot be edited",
      "cannotEditBody": "Only the founder of this group can update it.",
      "headingCreate": "Create group",
      "headingEdit": "Edit group",
      "name": "Name",
      "namePlaceholder": "e.g. The Arbiter's Guard",
      "urlPreview": "URL preview:",
      "urlPlaceholder": "your-group-name",
      "urlKeptOriginal": "(kept from original)",
      "description": "Description",
      "descriptionPlaceholder": "What is this group about?",
      "country": "Country",
      "countryPlaceholder": "Search countries",
      "tags": "Tags",
      "tagsPlaceholder": "mutual-aid, local-news, digital-rights",
      "coverImage": "Cover image",
      "moderators": "Moderators",
      "moderatorsCount": "Moderators ({{count}})",
      "removeModeratorAria": "Remove {{name}}",
      "submitCreate": "Create group",
      "submitEdit": "Update group",
      "creating": "Creating…",
      "updating": "Updating…",
      "uploadingCover": "Uploading cover…",
      "altText": "Group: {{name}}",
      "successCreate": "Group created!",
      "successEdit": "Group updated!",
      "errorTitleCreate": "Could not create group",
      "errorTitleEdit": "Could not update group",
      "errorLoginRequired": "You must be logged in to create a group.",
      "errorEditLoadFailed": "Group could not be loaded for editing.",
      "errorEditNotOwner": "Only the group founder can edit this group.",
      "errorNameRequired": "Name is required.",
      "errorNameInvalid": "Name must include letters or numbers so a group URL can be created.",
      "errorEditLatestMissing": "Could not find the latest version of this group to update.",
      "errorCoverInvalid": "Cover image must be a valid https:// URL.",
      "errorSlugCollision": "You already have a group with the identifier \"{{slug}}\". Choose another name.",
      "wizard": {
        "nameStepTitle": "Name your group",
        "nameStepSubtitle": "A short, clear name members will recognize.",
        "coverStepTitle": "Add a cover image",
        "coverStepSubtitle": "One image carries the group on every card.",
        "moderatorsStepTitle": "Invite moderators",
        "moderatorsStepSubtitle": "Optional — they can approve content and remove members alongside you.",
        "tagsStepTitle": "Country and categories",
        "tagsStepSubtitle": "Help the right people find your group.",
        "launchNow": "Skip Next & Launch"
      }
    },
    "detail": {
      "by": "by",
      "byAuthor": "by {{name}}",
      "members": "Members",
      "viewMembers": "View members",
      "moreMembers": "+{{count}} more",
      "about": "About",
      "comments": "Comments",
      "comment": "Comment",
      "commentNoun_one": "comment",
      "commentNoun_other": "comments",
      "noCommentsTitle": "No comments yet",
      "noCommentsHint": "Be the first to start a discussion.",
      "noMembersFound": "No members found.",
      "founder": "Founder",
      "moderator": "Moderator",
      "moreActions": "More actions",
      "editGroup": "Edit group",
      "deleteGroup": "Delete group",
      "officialActivity": "Official activity",
      "officialTools": "Official tools",
      "startSomething": "Start something",
      "officialToolsDescription": "Give {{name}} a concrete next step.",
      "launchCampaign": "Launch a campaign",
      "launchCampaignDescription": "Raise funds with an official group page.",
      "campaign": "Campaign",
      "pledge": "Pledge",
      "pledgeDescription": "Offer help people can act on.",
      "event": "Event",
      "eventDescription": "Bring supporters together.",
      "untitledEvent": "Untitled event",
      "interestedCount_one": "{{count}} person interested",
      "interestedCount_other": "{{count}} people interested",
      "allDay": "All-day"
    }
  },
  "campaignsCreate": {
    "seoTitleCreate": "Start a campaign",
    "seoTitleEdit": "Edit campaign",
    "seoDescriptionCreate": "Launch a fundraising campaign on {{appName}}.",
    "seoDescriptionEdit": "Update your fundraising campaign on {{appName}}.",
    "loginGateTitle": "Log in to start a campaign",
    "loginGateBody": "Campaigns are signed Nostr events. You need a Nostr login to publish one.",
    "invalidEditTitle": "Invalid edit link",
    "invalidEditBody": "This campaign edit link is missing a valid campaign address.",
    "startNewCampaign": "Start a new campaign",
    "loadingCampaign": "Loading campaign…",
    "cannotEditTitle": "Campaign cannot be edited",
    "cannotEditBody": "Only the author of this campaign can update it.",
    "headingCreate": "Start a campaign",
    "headingEdit": "Edit campaign",
    "title": "Title",
    "titlePlaceholder": "Save the Last Bookstore",
    "country": "Country",
    "countryPlaceholder": "Search countries",
    "tags": "Tags",
    "tagsPlaceholder": "legal-defense, mutual-aid, local-news",
    "categories": {
      "humanRights": "Human Rights",
      "democracy": "Democracy",
      "pressFreedom": "Press Freedom",
      "politicalPrisoners": "Political Prisoners",
      "humanitarianAid": "Humanitarian Aid",
      "civilResistance": "Civil Resistance",
      "digitalRights": "Digital Rights",
      "antiCorruption": "Anti-Corruption",
      "womenGirls": "Women & Girls",
      "refugees": "Refugees & Exiles",
      "legalAid": "Legal Aid",
      "emergencyRelief": "Emergency Relief",
      "animalRights": "Animal Rights",
      "education": "Education",
      "medical": "Medical",
      "community": "Community"
    },
    "banner": "Banner image",
    "story": "Story",
    "storyPlaceholder": "Share the background, who benefits, and how funds will be used.",
    "goal": "Goal",
    "goalPlaceholder": "25,000",
    "goalNote": "Whole US Dollars. Donors pay in Grin; clients estimate the USD-equivalent at view time.",
    "submitCreate": "Launch campaign",
    "submitEdit": "Update campaign",
    "publishing": "Publishing…",
    "updating": "Updating…",
    "uploadingBanner": "Uploading banner…",
    "altText": "Fundraising campaign: {{title}}",
    "successCreate": "Campaign launched",
    "successCreateDesc": "Your fundraiser is live.",
    "successEdit": "Campaign updated",
    "successEditDesc": "Your fundraiser changes are live.",
    "errorTitleCreate": "Could not publish campaign",
    "errorTitleEdit": "Could not update campaign",
    "errorLoginRequired": "You must be logged in to create a campaign.",
    "errorEditLoadFailed": "Campaign could not be loaded for editing.",
    "errorEditNotOwner": "Only the campaign author can edit this campaign.",
    "errorTitleRequired": "Title is required.",
    "errorTitleInvalid": "Title must include letters or numbers so a campaign URL can be created.",
    "errorSlugInvalid": "Identifier must be lowercase letters, numbers, and hyphens.",
    "errorGoalInvalid": "Goal must be a positive whole-dollar amount.",
    "errorEditLatestMissing": "Could not find the latest version of this campaign to update.",
    "errorSlugCollision": "You already have a campaign with the identifier \"{{slug}}\". Choose another.",
    "errorBannerInvalid": "Banner must be a valid https:// URL.",
    "errorPublishedInvalid": "Published event failed validation. Please refresh and try again.",
    "wizard": {
      "titleStepTitle": "Name your campaign",
      "titleStepSubtitle": "A short, clear name and a striking banner donors will recognize.",
      "bannerStepTitle": "Add a banner",
      "bannerStepSubtitle": "One striking image carries the campaign on every card.",
      "storyStepTitle": "Tell your story",
      "storyStepSubtitle": "Who benefits and how the funds will be used.",
      "goalStepTitle": "Goal",
      "goalStepSubtitle": "Optional — leave blank for an open-ended campaign.",
      "tagsStepTitle": "Country and categories",
      "tagsStepSubtitle": "Help the right people find your campaign.",
      "next": "Next",
      "back": "Back",
      "skip": "Skip",
      "launchNow": "Skip Next & Launch"
    },
    "grinHeading": "Receiving Grin",
    "grinNote": "How donations reach you. Add a Grin address so anyone can pay you directly from their own wallet, and/or the GoblinPay receiving identity this instance assigned to your campaign. Both are optional, but without one the campaign page cannot show a donate button.",
    "grinAddressLabel": "Grin address (grin1…)",
    "goblinPayLabel": "GoblinPay receiving identity (npub or nprofile)",
    "goblinPaySignerLabel": "GoblinPay receipt key (npub, optional)",
    "goblinPaySignerNote": "The GoblinPay server key whose signed receipts count toward your raised total when donors record them. Ask the instance operator for it.",
    "errorGrinAddressInvalid": "The Grin address is not a valid grin1… Slatepack address.",
    "errorGoblinPayInvalid": "The GoblinPay receiving identity must be an npub1… or nprofile1… string.",
    "errorGoblinPaySignerInvalid": "The GoblinPay receipt key must be an npub1… or 64-character hex key."
  },
  "campaignsDetail": {
    "seoTitle": "{{title}} | {{appName}} Fundraisers",
    "seoDescriptionFallback": "Support {{title}} on {{appName}}.",
    "back": "Back",
    "edit": "Edit",
    "delete": "Delete",
    "deleting": "Deleting…",
    "openCover": "Open cover image",
    "byAuthor": "by <0>{{name}}</0>",
    "commentLabel": "Comment",
    "linkCopied": "Link copied to clipboard",
    "pinnedToast": "Pinned to campaign",
    "unpinnedToast": "Unpinned from campaign",
    "pinFailed": "Failed to update campaign pins",
    "deletedToast": "Campaign deleted",
    "deletedToastDesc": "A deletion request was published. Well-behaved relays will drop the campaign from feeds.",
    "deleteErrorTitle": "Could not delete campaign",
    "campaigner": "Campaigner",
    "repost_one": "<0>{{formattedCount}}</0> Repost",
    "repost_other": "<0>{{formattedCount}}</0> Reposts",
    "quote_one": "<0>{{formattedCount}}</0> Quote",
    "quote_other": "<0>{{formattedCount}}</0> Quotes",
    "like_one": "<0>{{formattedCount}}</0> Like",
    "like_other": "<0>{{formattedCount}}</0> Likes",
    "tabComments": "Comments & donations",
    "noCommentsTitle": "No comments yet",
    "noCommentsHint": "Be the first to leave a message of support.",
    "deleteDialogTitle": "Delete this campaign?",
    "deleteDialogBody": "This publishes a NIP-09 deletion request. Well-behaved relays will drop the campaign from feeds and direct links. Past donation receipts stay on-chain regardless. This action cannot be undone — to keep accepting donations, edit the campaign instead.",
    "storyHeading": "The story",
    "share": "Share",
    "target": "Target: {{amount}}",
    "raised": "raised",
    "ofGoal": "of {{amount}} goal",
    "donate": "Donate with Grin",
    "raisedGrin": "{{amount}} GRIN raised",
    "raisedCount_one": "{{count}} verified donation",
    "raisedCount_other": "{{count}} verified donations"
  },
  "campaignVerification": {
    "verifiedBy": "Verified by",
    "verifiedLabel": "Verified",
    "verifiedByCount_zero": "Verified by {{count}} moderators",
    "verifiedByCount_one": "Verified by {{count}} moderator",
    "verifiedByCount_two": "Verified by {{count}} moderators",
    "verifiedByCount_few": "Verified by {{count}} moderators",
    "verifiedByCount_many": "Verified by {{count}} moderators",
    "verifiedByCount_other": "Verified by {{count}} moderators",
    "verifyCampaign": "Verify this campaign",
    "removeVerification": "Remove my verification",
    "dialogTitle": "Verify this campaign",
    "attestation": "By verifying this campaign you attest that the campaign is authentic and true. You know the campaign organizer personally or have verified meaningfully that their claims are true. Beware of impersonators and scammers.",
    "verified": "Campaign verified",
    "unverified": "Verification removed",
    "actionFailed": "Action failed"
  },
  "calendarEvents": {
    "create": {
      "seoTitle": "Create event",
      "seoDescription": "Create a calendar event on {{appName}}.",
      "loginTitle": "Log in to create an event",
      "loginBody": "Events are signed Nostr events. You need a Nostr login to publish one.",
      "heading": "Create event",
      "titlePlaceholder": "Neighborhood cleanup",
      "descriptionPlaceholder": "Tell people what to expect, what to bring, and who should attend...",
      "schedule": "Schedule",
      "allDay": "All-day event",
      "allDayHint": "Turn off to add start and end times.",
      "startDate": "Start date",
      "endDate": "End date",
      "startTime": "Start time",
      "endTime": "End time",
      "locationDetails": "Location details",
      "locationPlaceholder": "Address, venue, or video call link",
      "tagsPlaceholder": "mutual-aid, workshop, local-news",
      "submit": "Create event",
      "successToast": "Event created",
      "errorToast": "Could not create event",
      "altCalendar": "Calendar event: {{title}}",
      "altGroup": "Group event: {{title}}",
      "errorLoginRequired": "You must be logged in to create an event.",
      "errorTitleRequired": "Title is required.",
      "errorStartDateRequired": "Start date is required.",
      "errorStartDatePast": "Start date cannot be in the past.",
      "errorStartTimeRequired": "Start time is required for timed events.",
      "errorCoverInvalid": "Cover image must be a valid https:// URL.",
      "errorEndDateBeforeStart": "End date must be on or after the start date.",
      "errorStartDateTimeInvalid": "Start date or time is invalid.",
      "errorEndTimeAfterStart": "End time must be after the start time."
    },
    "detail": {
      "untitledEvent": "Untitled event",
      "dateNotSpecified": "Date not specified",
      "organizer": "Organizer",
      "rsvpUpdated": "RSVP updated",
      "rsvpFailed": "Failed to update RSVP",
      "rsvp": "RSVP",
      "youAreGoing": "You are going",
      "youAreInterested": "You are interested",
      "youCantGo": "You can't go",
      "chooseRsvp": "Choose your RSVP",
      "going": "Going",
      "interested": "Interested",
      "cantGo": "Can't Go",
      "attendees": "Attendees",
      "links": "Links",
      "participants": "Participants",
      "hostedBy": "hosted by",
      "attendingCount_one": "{{count}} attending",
      "attendingCount_other": "{{count}} attending",
      "interestedCount_one": "{{count}} interested",
      "interestedCount_other": "{{count}} interested",
      "comment": "Comment",
      "description": "Description",
      "emptyDescription": "The organizer hasn't added a description for this event yet.",
      "comments": "Comments",
      "commentNoun_one": "comment",
      "commentNoun_other": "comments",
      "noCommentsTitle": "No comments yet",
      "noCommentsHint": "Be the first to comment.",
      "pinnedToast": "Pinned to event",
      "unpinnedToast": "Unpinned from event",
      "pinFailed": "Failed to update event pins"
    }
  },
  "follow": {
    "follow": "Follow",
    "following": "Following",
    "unfollow": "Unfollow",
    "followed": "Followed",
    "unfollowed": "Unfollowed",
    "updateFailed": "Failed to update follow list"
  },
  "campaigns": {
    "home": {
      "seoTitle": "Fundraisers",
      "seoDescription": "Connecting the world to unstoppable funding.",
      "heroTagline": "Connecting the world to<1></1><0>unstoppable</0> funding.",
      "heroBody": "Raise Grin directly from supporters around the world. Every donation settles straight to your wallet, with no middlemen, no chargebacks, and no platform holding your funds.",
      "startCampaign": "Start a campaign",
      "verifyCampaigns": "Verify campaigns",
      "howItWorks": "How it works",
      "featuredTitle": "Featured Campaigns",
      "featuredDesc": "Campaigns hand-picked by the {{appName}} team.",
      "allCampaigns": "All campaigns",
      "allCampaignsDesc": "Every campaign on the network, in chronological order.",
      "browseAll": "Browse all campaigns",
      "searchPlaceholder": "Search campaigns…",
      "searchAriaLabel": "Search campaigns",
      "noMatch": "No campaigns match “{{query}}”",
      "noMatchHint": "Try a different search term, or clear the search.",
      "hidden": "Hidden",
      "hiddenDesc": "Campaigns suppressed from public discovery. Use the kebab menu on a card to unhide.",
      "hiddenEmpty": "No campaigns are currently hidden.",
      "yourCampaigns": "Your campaigns",
      "yourCampaignsDesc": "Your campaigns are live on Nostr and donations work via the campaign link. Browse all campaigns at /campaigns; the {{appName}} team features a curated selection on the homepage.",
      "empty": "No campaigns yet",
      "emptyHint": "Be the first to start a fundraiser on {{appName}}. Tell your story, choose your beneficiaries, and share the link.",
      "whyDifferent": {
        "eyebrow": "Why {{appName}}",
        "title": "Built different.",
        "lede": "Direct Grin from donor to recipient. No platform in the way, no custodian holding the bag, no permission required.",
        "block1": {
          "heading": "Unlike GoFundMe",
          "body": "No platform can freeze your donations, demand refunds, or terminate your campaign over policy disagreements. No Stripe, no Visa, no bank sits in the middle and can cut you off mid-campaign.",
          "bullet1": "Freeze-proof — no platform veto",
          "bullet2": "No payment processor can pull the plug",
          "bullet3": "Zero platform fees"
        },
        "block2": {
          "heading": "Unlike other crypto platforms",
          "body": "No custodial wallet, hosted node, or payment processor to fail or go offline. Funds settle on the Grin chain to a wallet you control. If {{appName}} disappeared tomorrow, every campaign would keep working.",
          "bullet1": "No custodial wallet to drain or freeze",
          "bullet2": "Settles on-chain to a wallet you own",
          "bullet3": "Works even if {{appName}} vanishes"
        },
        "readMore": "Read the full breakdown"
      }
    },
    "all": {
      "title": "Campaigns",
      "seoTitle": "All campaigns",
      "description": "Browse every campaign published on Eranos.",
      "sectionTagline": "Featured campaigns first, then the rest of the network. Search or sort to refine.",
      "heroKicker": "Campaigns",
      "heroHeading": "Every cause,",
      "heroHeadingLine2": "in one place.",
      "heroBody": "Every fundraiser published on Nostr, gathered into one place. Browse the full network, find a cause that matters to you, and back it directly with Grin.",
      "campaignsCount_one": "campaign on the network",
      "campaignsCount_other": "campaigns on the network",
      "searchAriaLabel": "Search campaigns",
      "searchPlaceholder": "Search campaigns…",
      "clearSearch": "Clear search",
      "sortAriaLabel": "Sort order",
      "sortTop": "Top",
      "sortNew": "New",
      "showHidden": "Show hidden",
      "startCampaign": "Start a campaign",
      "verifyCampaigns": "Verify campaigns",
      "noMatch": "No campaigns match “{{query}}”",
      "noMatchHint": "Try a different search term, or clear the search to see every campaign.",
      "allHidden": "No campaigns to show",
      "allHiddenHint": "Every campaign on the network has been hidden by moderators. Toggle “Show hidden” to view them.",
      "empty": "No campaigns yet",
      "emptyHint": "No campaigns have been published yet. Be the first."
    },
    "lists": {
      "stripAria": "Curated campaign topic lists",
      "create": "New list",
      "showMore": "Show {{count}} more",
      "showLess": "Show less",
      "createDesc": "Create a new topic list. Curate campaigns into it from any campaign page.",
      "createSubmit": "Create list",
      "createFailed": "Failed to create list",
      "edit": "Edit list",
      "editDesc": "Update the list's title, description, or icon.",
      "editSubmit": "Save changes",
      "updateFailed": "Failed to update list",
      "delete": "Delete list",
      "deleteFailed": "Failed to delete list",
      "deleteConfirmTitle": "Delete this list?",
      "deleteConfirmDesc": "\"{{title}}\" will be removed from the topic strip. The campaigns themselves are not affected.",
      "titleField": "Title",
      "titlePlaceholder": "e.g. Press Freedom",
      "descriptionField": "Description",
      "descriptionPlaceholder": "A short blurb explaining what belongs in this list.",
      "iconField": "Icon",
      "menuAria": "{{title}} list options",
      "listActions": "List actions",
      "memberMenuAria": "Campaign list options",
      "backToCampaigns": "Back to campaigns",
      "detailTitle": "Campaign list",
      "campaignsCount_one": "{{count}} campaign",
      "campaignsCount_other": "{{count}} campaigns",
      "addCampaign": "Add campaign",
      "addCampaignDesc": "Search the network and pick a campaign to add to this list.",
      "addFailed": "Failed to add to list",
      "addToList": "Add",
      "added": "Added",
      "alreadyAdded": "Added",
      "membershipTitle": "Add to lists",
      "membershipDesc": "Choose which lists \"{{title}}\" should appear in.",
      "membershipEmpty": "No lists yet. Create one to start curating.",
      "searchPlaceholder": "Search campaigns…",
      "searchEmpty": "No campaigns match this search.",
      "removeFromList": "Remove from list",
      "removeFailed": "Failed to remove from list",
      "empty": "This list is empty.",
      "emptyMod": "This list is empty. Add campaigns to start curating it.",
      "iconPicker": {
        "title": "Choose an icon",
        "description": "Pick any icon from the Lucide library.",
        "search": "Search icons…",
        "empty": "No icons match this search."
      }
    }
  },
  "moderation": {
    "hiddenBadge": "Hidden",
    "menu": {
      "label": "Moderator actions",
      "ariaCampaign": "Moderate campaign",
      "ariaPledge": "Moderate pledge",
      "ariaGroup": "Moderate group",
      "failedAction": "Failed to {{action}}",
      "failedReorder": "Failed to reorder",
      "hide": "Hide",
      "unhide": "Unhide",
      "hiddenState": "Hidden",
      "feature": "Feature",
      "unfeature": "Unfeature",
      "featuredState": "Featured",
      "moveToTop": "Move to top",
      "moveUp": "Move up",
      "moveDown": "Move down",
      "addToList": "Add to list…",
      "dragHandle": "Drag to reorder (position {{index}})",
      "toastHidden": "Hidden",
      "toastUnhidden": "Unhidden",
      "toastFeatured": "Featured",
      "toastUnfeatured": "Removed from featured",
      "toast": {
        "movedToTop": "Moved to top",
        "movedUp": "Moved up",
        "movedDown": "Moved down"
      }
    }
  },
  "settings": {
    "title": "Settings",
    "description": "Manage your {{appName}} settings",
    "deleteAccount": "Delete account",
    "groups": {
      "account": "Account",
      "app": "App",
      "system": "System"
    },
    "sections": {
      "profile": "Profile",
      "profileDesc": "Display name, bio, avatar, and verification.",
      "appearance": "Appearance",
      "appearanceDesc": "System, light, or dark mode.",
      "language": "Language",
      "languageDesc": "Choose the language used throughout the app.",
      "network": "Network",
      "networkDesc": "Data usage, relays, and file upload servers.",
      "notifications": "Notifications",
      "notificationsDesc": "Push notification preferences.",
      "advanced": "Advanced",
      "advancedDesc": "System and power-user options.",
      "organizers": "Organizers",
      "organizersDesc": "Appoint country organizers who can pin posts to country feeds."
    },
    "organizers": "Organizers",
    "signInToManage": "Sign in to manage",
    "loginRequired": "You need to be signed in to manage organizers.",
    "appearance": {
      "title": "Appearance",
      "subtitle": "Choose how the app looks.",
      "colorMode": "Color Mode",
      "system": "System",
      "systemDesc": "Follows your device setting",
      "light": "Light",
      "lightDesc": "Always use light mode",
      "dark": "Dark",
      "darkDesc": "Always use dark mode"
    },
    "network": {
      "title": "Network",
      "subtitle": "Manage data usage, relays, and file upload servers.",
      "lowBandwidthHeading": "Low-Bandwidth Mode",
      "reduceDataUsage": "Reduce data usage",
      "reduceDataUsageDesc": "For metered or slow connections. Videos won't autoplay, background video previews are skipped, and images wait for a tap before loading.",
      "useImageProxy": "Use image proxy",
      "useImageProxyDesc": "Fetches smaller WebP versions of images instead of full-resolution originals.",
      "proxyUrl": "Proxy URL",
      "proxyApiDesc": "Must speak the <0>wsrv.nl / weserv</0> API. Self-hosters can point this at their own instance.",
      "reset": "Reset",
      "relays": "Relays",
      "blossomServers": "Blossom Servers",
      "imageUploads": "Image Uploads",
      "uploadQuality": "Upload quality",
      "uploadQualityDesc": "Compressed resizes large images and picks the smallest format. Original uploads images exactly as-is.",
      "compressed": "Compressed",
      "original": "Original"
    },
    "advanced": {
      "title": "Advanced",
      "subtitle": "System configuration and other advanced options for power users.",
      "intro": "System configuration and other advanced options.",
      "torHeading": "Tor",
      "torToggle": "Route traffic through Tor",
      "torToggleDesc": "Connects to relays and loads media over the Tor network for stronger privacy. Expect slower performance and a short delay while Tor connects.",
      "torApplyNote": "Turning this on routes all traffic through Tor. While it connects, other content won't load (a banner shows the status) — nothing is sent outside Tor. Turning it off switches back to a direct connection.",
      "torStatusLabel": "Status:",
      "torExitIp": "Tor exit IP:",
      "torCheckAgain": "Check again"
    }
  },
  "language": {
    "title": "Language",
    "subtitle": "Choose the language used throughout the app.",
    "translationNote": "Translations are a work in progress. Untranslated text falls back to English."
  },
  "verifier": {
    "title": "Verifier",
    "subtitle": "Become a verifier by describing how you vet campaigns.",
    "promptLabel": "Your verification process",
    "prompt": "Tell us what steps you take to verify campaigns. Include as much detail as possible so donors know they can trust your judgement.",
    "placeholder": "Describe how you verify campaigns — the checks you run, the evidence you require, how you confirm an organizer's identity, and anything else that helps donors trust your judgement.",
    "previewLabel": "Preview",
    "publish": "Become a verifier",
    "update": "Update statement",
    "withdraw": "Withdraw",
    "withdrawConfirmTitle": "Withdraw your verifier statement?",
    "withdrawConfirmBody": "Your \"How We Verify\" statement will be removed from your profile. You can publish a new one anytime.",
    "loading": "Loading your statement…",
    "publishedToast": "Your verifier statement is live.",
    "withdrawnToast": "Your verifier statement has been withdrawn.",
    "errorToast": "Couldn't save your verifier statement.",
    "disclaimer": "Anyone can become a verifier. Your statement is published publicly to Nostr and shown prominently on your profile. It does not grant any special permissions — it simply tells donors how you vet campaigns.",
    "loginGateTitle": "Sign in to become a verifier",
    "loginGateBody": "You need to be signed in to publish a verifier statement.",
    "howWeVerifyTitle": "How We Verify",
    "requestVerification": "Request Verification"
  },
  "mdEditor": {
    "toolbar": {
      "bold": "Bold",
      "italic": "Italic",
      "strikethrough": "Strikethrough",
      "inlineCode": "Inline code",
      "heading1": "Heading 1",
      "heading2": "Heading 2",
      "heading3": "Heading 3",
      "bulletList": "Bullet list",
      "numberedList": "Numbered list",
      "blockquote": "Blockquote",
      "insertLink": "Insert link",
      "insertImage": "Insert image",
      "horizontalRule": "Horizontal rule"
    },
    "help": {
      "title": "Markdown quick reference",
      "bold": "bold",
      "italic": "italic",
      "bulletList": "bullet",
      "numberedList": "numbered",
      "link": "link",
      "quote": "quote",
      "code": "code"
    },
    "link": {
      "title": "Insert link",
      "textLabel": "Link text",
      "textPlaceholder": "Enter link text…",
      "urlLabel": "URL",
      "cancel": "Cancel",
      "insert": "Insert link"
    }
  },
  "organizations": {
    "seoTitle": "For organizations",
    "seoDescription": "Onboard your organization onto {{appName}}, publish a public verification statement, and earn donor trust.",
    "hero": {
      "eyebrow": "For organizations & verifiers",
      "headlinePart1": "Help donors",
      "headlineHighlight": "trust",
      "body": "Bring your organization onto {{appName}} and publish a public statement describing how you vet the campaigns you stand behind. No application, no gatekeepers — your reputation does the work.",
      "trustChips": {
        "noPermission": "No permission needed",
        "ownIdentity": "Your own identity",
        "public": "Public & verifiable"
      },
      "cta": "Get started"
    },
    "steps": {
      "eyebrow": "How it works",
      "title": "Onboard in three steps",
      "lede": "{{appName}} is built on Nostr, so your organization brings its own identity. Getting set up takes minutes.",
      "step1": {
        "title": "Bring your profile",
        "body": "Sign in with your organization's Nostr profile — or create one in seconds. Your identity is yours, portable across every Nostr app, and not controlled by {{appName}}."
      },
      "step2": {
        "title": "Describe your process",
        "body": "Write a public statement explaining how you verify campaigns: the checks you run, the evidence you require, and how you confirm an organizer's identity."
      },
      "step3": {
        "title": "Publish & earn trust",
        "body": "Your statement appears on your profile and signals to donors that you stand behind the campaigns you verify. Update or withdraw it any time."
      }
    },
    "getStarted": {
      "eyebrow": "Get started",
      "title": "Become a verifier",
      "lede": "Set up your organization and publish your verification statement in a few quick steps."
    },
    "getStartedCard": {
      "title": "Set up your organization",
      "body": "We'll walk you through creating your organization's profile, publishing your verification statement, and verifying your first campaign.",
      "cta": "Start verifying"
    },
    "loginGateTitle": "Sign in with your organization's profile",
    "loginGateBody": "Log in with your organization's Nostr profile, or create one, to get started. Once you're signed in, you can publish your verification statement here.",
    "tutorial": {
      "eyebrow": "You're a verifier now",
      "title": "How to verify a campaign",
      "lede": "Your statement is live. Here's how to vouch for a campaign you trust — it takes two taps from any campaign card.",
      "steps": {
        "open": {
          "title": "Open the menu",
          "body": "Tap the three-dots button on any campaign card."
        },
        "verify": {
          "title": "Choose \"Verify this campaign\"",
          "body": "Pick the verify action — shown only to verifiers."
        },
        "confirm": {
          "title": "Confirm & you're done",
          "body": "Attest it's authentic. Your badge joins the card."
        }
      },
      "demo": {
        "menuVerify": "Verify this campaign"
      }
    }
  },
  "organizers": {
    "appoint": "Appoint Organizer",
    "appointDesc": "Grant a user permission to pin posts on a specific country feed.",
    "appointing": "Appointing…",
    "appointed": "Organizer appointed",
    "appointedSuccess": "Organizer appointed for {{country}}",
    "userNpub": "User npub",
    "country": "Country",
    "selectCountry": "Select a country",
    "invalidNpub": "Invalid npub format",
    "alreadyOrganizer": "This user is already an organizer for that country",
    "current": "Current Organizers",
    "noOrganizers": "No organizers appointed yet.",
    "removed": "Organizer removed",
    "removedSuccess": "Removed {{name}} from {{country}}",
    "refreshed": "Refreshed",
    "refreshedDesc": "Organizer list refreshed from relays.",
    "adminRequired": "Admin access required",
    "adminRequiredDesc": "Only platform admins can appoint or remove organizers."
  },
  "qrScanner": {
    "title": "Scan QR code",
    "close": "Close",
    "starting": "Starting camera…",
    "aim": "Point your camera at a QR code.",
    "flashOn": "Turn flash on",
    "flashOff": "Turn flash off",
    "errors": {
      "generic": "Could not access the camera.",
      "insecure": "Camera access requires a secure (HTTPS) connection.",
      "unsupported": "This browser doesn't support camera access.",
      "notFound": "No camera was found on this device.",
      "denied": "Camera permission was denied. Enable it in your settings to scan QR codes.",
      "busy": "Another app is using the camera. Close it and try again.",
      "overconstrained": "This device's camera doesn't support the requested settings.",
      "didntStart": "Camera didn't start. Another app may be using it, or your browser may have blocked the scanner."
    }
  },
  "notifications": {
    "seoTitle": "Notifications",
    "seoDescription": "Your Nostr notifications",
    "title": "Notifications",
    "tabs": {
      "all": "All",
      "mentions": "Mentions"
    },
    "loginPrompt": "Log in to see your notifications.",
    "empty": "No notifications yet.",
    "subject": {
      "twoActors": "<0></0> and <1></1>",
      "andOthers_one": " and {{count}} other",
      "andOthers_other": " and {{count}} others"
    },
    "actorAvatars": {
      "moreCount": "+{{count}} more"
    },
    "actions": {
      "reactedToYour": "reacted to your {{noun}}",
      "repostedYour": "reposted your {{noun}}",
      "repliedToYourNote": "replied to your note",
      "mentionedYou": "mentioned you",
      "repliedToYourComment": "replied to your comment",
      "commentedOnYour": "commented on your {{noun}}",
      "sentYouLetter": "sent you a letter",
      "highlightedYour": "highlighted your {{noun}}",
      "awardedBadge": "awarded you a badge",
      "awardedBadges": "awarded you badges"
    },
    "letter": {
      "viewAll": "View all letters",
      "reply": "Reply"
    },
    "kinds": {
      "profile": "profile",
      "post": "post",
      "encryptedMessage": "encrypted message",
      "repost": "repost",
      "reaction": "reaction",
      "badgeAward": "badge award",
      "photo": "photo",
      "video": "video",
      "requestToVanish": "request to vanish",
      "file": "file",
      "poll": "poll",
      "comment": "comment",
      "voiceMessage": "voice message",
      "patch": "patch",
      "pullRequest": "pull request",
      "highlight": "highlight",
      "birdDetection": "bird detection",
      "birdex": "Birdex",
      "colorMoment": "color moment",
      "foundLog": "found log",
      "nsite": "nsite",
      "profileBadges": "profile badges",
      "badge": "badge",
      "article": "article",
      "emojiPack": "emoji pack",
      "podcastEpisode": "podcast episode",
      "podcastTrailer": "podcast trailer",
      "stream": "stream",
      "status": "status",
      "repository": "repository",
      "customNip": "custom NIP",
      "calendarEvent": "calendar event",
      "playlist": "playlist",
      "divine": "divine",
      "community": "community",
      "goal": "goal",
      "track": "track",
      "magicDeck": "Magic deck",
      "treasure": "treasure",
      "constellation": "constellation",
      "followPack": "follow pack"
    }
  },
  "notifSettings": {
    "seoTitle": "Notifications",
    "seoDescription": "Configure your notification preferences",
    "title": "Notifications",
    "pushHeading": "Push Notifications",
    "enablePush": {
      "label": "Enable Push Notifications",
      "description": "Receive notifications for activity on your posts"
    },
    "unsupported": "Your browser does not support push notifications.",
    "denied": "Notifications are blocked. Update your browser settings to allow notifications from this site.",
    "deliveryMethod": {
      "heading": "Delivery Method",
      "intro": "Choose how notifications are delivered to your device.",
      "push": {
        "label": "Push",
        "description": "Standard notifications. No persistent status bar icon."
      },
      "persistent": {
        "label": "Persistent",
        "description": "Polls relays directly in the background for new notifications. Use this for reliable delivery on devices without push notification support."
      }
    },
    "notifyAbout": {
      "heading": "Notify Me About",
      "filterHeading": "Filter",
      "typesHeading": "Types",
      "onlyFollowing": {
        "label": "Only from people I follow",
        "description": "Hide notifications from accounts you don't follow"
      }
    },
    "types": {
      "reactions": {
        "label": "Reactions",
        "description": "When someone reacts to your posts"
      },
      "reposts": {
        "label": "Reposts",
        "description": "When someone reposts your notes"
      },
      "mentions": {
        "label": "Mentions",
        "description": "When someone mentions you in a note"
      },
      "comments": {
        "label": "Comments & Replies",
        "description": "When someone comments on or replies to your posts"
      },
      "badges": {
        "label": "Badge Awards",
        "description": "When someone awards you a badge"
      },
      "letters": {
        "label": "Letters",
        "description": "When someone sends you a letter"
      },
      "highlights": {
        "label": "Highlights",
        "description": "When someone highlights your content"
      }
    },
    "toast": {
      "enableFailedTitle": "Failed to enable notifications",
      "enableFailedDesc": "Please try again."
    }
  },
  "search": {
    "seoTitle": "Search",
    "seoDescription": "Search Nostr",
    "title": "Search",
    "inputPlaceholder": "Search",
    "filtersAria": "Search filters",
    "tabs": {
      "agora": "Eranos",
      "nostr": "Nostr",
      "accounts": "Users"
    },
    "filters": {
      "title": "Filters",
      "reset": "Reset",
      "from": "From",
      "sort": "Sort",
      "media": "Media",
      "protocol": "Protocol",
      "language": "Language",
      "kind": "Kind",
      "kindCustomPlaceholder": "e.g. 1, 30023",
      "includeReplies": "Include replies",
      "authorScope": {
        "anyone": "Anyone",
        "follows": "Follows",
        "people": "People"
      },
      "sortOptions": {
        "recent": "Recent",
        "hot": "Hot",
        "trending": "Trending"
      },
      "mediaOptions": {
        "all": "All",
        "images": "Images",
        "videos": "Videos",
        "shorts": "Shorts",
        "none": "No media"
      },
      "protocolOptions": {
        "nostr": "Nostr",
        "mastodon": "Mastodon",
        "bluesky": "Bluesky"
      },
      "langOptions": {
        "global": "Global",
        "en": "English",
        "es": "Spanish",
        "fr": "French",
        "de": "German",
        "ja": "Japanese",
        "zh": "Chinese"
      }
    },
    "chips": {
      "noReplies": "No replies",
      "images": "Images",
      "videos": "Videos",
      "shortsAndDivines": "Shorts & Divines",
      "noMedia": "No media",
      "mastodon": "Mastodon",
      "bluesky": "Bluesky",
      "hot": "Hot",
      "trending": "Trending",
      "allKinds": "All kinds",
      "customKind": "Kind: {{kind}}",
      "kindNumber": "Kind {{kind}}",
      "kindsCount_one": "{{count}} kind",
      "kindsCount_other": "{{count}} kinds",
      "myFollows": "My follows",
      "authorsCount_one": "{{count}} author",
      "authorsCount_other": "{{count}} authors"
    },
    "clear": "Clear",
    "searchLabel": "search:",
    "newPosts_one": "{{count}} new post",
    "newPosts_other": "{{count}} new posts",
    "following": "Following",
    "botAccount": "Bot account",
    "empty": {
      "posts": "No results found matching your search.",
      "postsPrompt": "Enter a search query to find Nostr content.",
      "accounts": "No users found matching your search.",
      "followsPrompt": "Search for people by name or NIP-05 address.",
      "agora": "No Eranos campaigns, pledges, or groups found matching your search.",
      "agoraPrompt": "Search Eranos campaigns, pledges, and groups, or browse the latest.",
      "activeFilters": "Active filters:",
      "clearAll": "Clear all filters"
    }
  },
  "profile": {
    "seoDescriptionFallback": "Nostr profile",
    "anonymous": "Anonymous",
    "namePlaceholder": "Your name",
    "userNotFound": "User not found.",
    "userNotFoundNip05": "User not found: {{handle}}",
    "couldNotResolveNip05": "Could not resolve this NIP-05 identifier.",
    "tabs": {
      "overview": "Overview",
      "verified": "Verified",
      "activity": "Activity",
      "campaigns": "Campaigns",
      "groups": "Groups",
      "pledges": "Pledges"
    },
    "header": {
      "editProfile": "Edit",
      "shareFollowLink": "Share follow link",
      "moreOptions": "More options",
      "campaignGoal": "Goal ${{amount}}"
    },
    "stats": {
      "followers": "Followers",
      "following": "Following",
      "raised": "Raised",
      "followersTitle_one": "{{count}} follower",
      "followersTitle_other": "{{count}} followers",
      "followingTitle": "{{count}} following"
    },
    "sections": {
      "profile": "Profile",
      "campaigns": "Campaigns",
      "latestPledge": "Latest pledge",
      "groups": "Groups",
      "seeAllCampaigns_one": "See all {{count}} campaign →",
      "seeAllCampaigns_other": "See all {{count}} campaigns →",
      "viewCampaignsTab": "View campaigns tab →",
      "seeAllPledges_one": "See all {{count}} pledge →",
      "seeAllPledges_other": "See all {{count}} pledges →",
      "seeAllGroups": "See all {{count}} →"
    },
    "badges": {
      "founder": "Founder",
      "moderator": "Moderator",
      "mod": "Mod",
      "ended": "Ended",
      "pledged": "Pledged"
    },
    "imageMenu": {
      "upload": "Upload file",
      "pasteUrl": "Paste URL",
      "remove": "Remove"
    },
    "websitePlaceholder": "https://your-website.com",
    "moreMenu": {
      "title": "Profile options",
      "copyPubkey": "Copy public key",
      "copyLink": "Copy profile link",
      "addToList": "Add to list",
      "shareFollowLink": "Share follow link",
      "profileRecovery": "Profile recovery",
      "awardBadge": "Award badge",
      "writeLetter": "Write a letter",
      "mute": "Mute @{{name}}",
      "unmute": "Unmute @{{name}}",
      "report": "Report @{{name}}",
      "close": "Close"
    },
    "toast": {
      "pubkeyCopied": "Public key copied to clipboard",
      "linkCopied": "Profile link copied to clipboard",
      "muted": "Muted @{{name}}",
      "unmuted": "Unmuted @{{name}}",
      "muteFailed": "Failed to mute user",
      "unmuteFailed": "Failed to unmute user",
      "followed": "Followed @{{name}}",
      "unfollowed": "Unfollowed @{{name}}",
      "followFailed": "Failed to update follow list",
      "btcAddressCopied": "Bitcoin address copied to clipboard"
    },
    "followingModal": {
      "title": "{{name}} follows",
      "empty": "Not following anyone yet."
    },
    "followersModal": {
      "title": "{{name}}'s followers",
      "empty": "No followers found."
    },
    "bitcoinModal": {
      "title": "Bitcoin",
      "qrAlt": "Bitcoin QR",
      "copyAddress": "Copy address",
      "showQr": "Show QR code",
      "viewOnMempool": "View on mempool.space"
    },
    "lightbox": {
      "openOriginal": "Open original",
      "close": "Close (Esc)",
      "imageAlt": "Profile image"
    },
    "activity": {
      "empty": "No activity from {{name}} yet. Posts, campaigns, pledges, and donations all show up here."
    },
    "campaigns": {
      "count_one": "{{count}} campaign",
      "count_other": "{{count}} campaigns",
      "sortNew": "New",
      "sortTop": "Top",
      "showHidden": "Show hidden",
      "hideHidden": "Hide hidden",
      "emptySelf": "You haven't launched a campaign yet.",
      "emptyOther": "{{name}} hasn't launched a campaign yet.",
      "startLink": "Start a campaign →"
    },
    "verified": {
      "count_one": "{{count}} verified campaign",
      "count_other": "{{count}} verified campaigns",
      "empty": "{{name}} hasn't verified any campaigns yet."
    },
    "pledgesTab": {
      "active": "Active",
      "ended": "Ended",
      "emptySelf": "You haven't created a pledge yet.",
      "emptyOther": "{{name}} hasn't created a pledge yet.",
      "createLink": "Create a pledge →"
    },
    "groupsDialog": {
      "title": "All groups"
    }
  },
  "profileSettings": {
    "seoTitle": "Profile | Settings",
    "seoDescription": "Edit your {{appName}} profile",
    "header": {
      "title": "Profile",
      "save": "Save"
    },
    "uploading": "Uploading…",
    "fields": {
      "heading": "Profile Fields",
      "website": "Website",
      "websitePlaceholder": "https://yourwebsite.com",
      "labelPlaceholder": "Label",
      "tickerPlaceholder": "Ticker",
      "addressPlaceholder": "Address",
      "valuePlaceholder": "Value or URL",
      "mediaPlaceholder": "Upload file or paste direct file link",
      "chooseFile": "Choose file to upload",
      "chooseMediaFile": "Choose a media file to upload"
    },
    "presets": {
      "music": {
        "label": "Music",
        "description": "Upload a song or audio clip",
        "valuePlaceholder": "Upload audio or paste direct file link"
      },
      "photo": {
        "label": "Photo",
        "description": "Upload an image",
        "valuePlaceholder": "Upload image or paste direct file link"
      },
      "video": {
        "label": "Video",
        "description": "Upload a video clip",
        "valuePlaceholder": "Upload video or paste direct file link"
      },
      "email": {
        "label": "Email",
        "defaultLabel": "Email",
        "description": "Contact email address",
        "valuePlaceholder": "you@example.com"
      },
      "link": {
        "label": "Link",
        "description": "Link to any website or profile",
        "valuePlaceholder": "https://..."
      },
      "weather": {
        "label": "Weather",
        "defaultLabel": "Weather",
        "description": "Connect a Nostr weather station",
        "valuePlaceholder": "npub1... or naddr1... (#station-id optional)"
      },
      "custom": {
        "label": "Custom",
        "description": "Create any custom field",
        "valuePlaceholder": "Value or URL"
      }
    },
    "warnings": {
      "audioWrongType": "This URL doesn’t point to an audio file. Upload an audio file or use a direct link ending in .mp3, .ogg, .wav, etc.",
      "audioUnknown": "This URL may not work as an audio player. For best results, upload a file using the button or paste a direct link to an audio file.",
      "imageWrongType": "This URL doesn’t point to an image. Upload an image or use a direct link ending in .jpg, .png, .webp, etc.",
      "imageUnknown": "This URL may not display as an image. For best results, upload a file using the button or paste a direct link to an image file.",
      "videoWrongType": "This URL doesn’t point to a video. Upload a video or use a direct link ending in .mp4, .webm, .mov, etc.",
      "videoUnknown": "This URL may not display as a video. For best results, upload a file using the button or paste a direct link to a video file."
    },
    "crop": {
      "profile": "Crop Profile Picture",
      "banner": "Crop Banner"
    },
    "mobilePreview": "Profile Fields Preview",
    "advanced": {
      "heading": "Advanced",
      "botLabel": "Bot Account",
      "botDescription": "Mark this account as automated"
    },
    "toast": {
      "uploaded": "Uploaded",
      "mediaUploaded": "Media file uploaded",
      "uploadFailed": "Upload failed",
      "tryAgain": "Please try again.",
      "profilePictureUpdated": "Profile picture updated",
      "bannerUpdated": "Banner updated",
      "profileSaved": "Profile saved",
      "saveFailed": "Failed to save profile."
    },
    "key": {
      "heading": "Your Key",
      "extensionBody": "You're signed in with a browser extension (NIP-07). Your secret key is stored there — manage or export it from the extension itself.",
      "bunkerBody": "You're signed in with a remote signer (NIP-46). Your secret key is held by that signer and cannot be exported from {{appName}}.",
      "explainer": "This secret key controls your account on {{appName}}. Anyone with it can post as you, edit your campaigns, and publish in your name. Store it in a password manager or somewhere else only you can access. Your Grin funds are separate: they live in your own Grin wallet and its seed phrase, not in this key.",
      "warning": "NEVER share your secret key with anyone. Avoid screenshotting it or pasting it anywhere except a password manager. If shared, others will be able to access your account.",
      "aria": "Your secret key",
      "copyAria": "Copy secret key",
      "revealAria": "Reveal secret key",
      "hideAria": "Hide secret key",
      "backupButton": "Back Up Key",
      "saving": "Saving…",
      "saved": "Secret key saved",
      "savedToFile": "Your secret key was saved to the Documents folder on your device.",
      "saveFailed": "Save failed",
      "saveFailedDescription": "Could not save the key. Please copy it manually.",
      "copyFailed": "Copy failed",
      "copyFailedDescription": "Could not access the clipboard. Reveal the key and copy it manually."
    }
  },
  "faq": {
    "categories": {
      "getting-started": {
        "label": "About Eranos"
      },
      "payments": {
        "label": "Grin Donations on Eranos"
      },
      "about-nostr": {
        "label": "About Nostr"
      },
      "legacy": {
        "label": "Legacy"
      }
    },
    "items": {
      "what-is-ditto": {
        "question": "What is {{appName}}?",
        "answer": [
          "{{appName}} is a platform for sending Grin donations directly to recipients. There's no middleman, no payment processor, and no account that can be frozen.",
          "{{appName}} is built on Nostr, so your identity isn't locked to this site — you own it."
        ]
      },
      "cost-to-use": {
        "question": "Does {{appName}} cost anything?",
        "answer": [
          "**No.** {{appName}} takes no platform fee. When you donate, you pay only the tiny Grin network fee that goes to miners, not to us."
        ]
      },
      "censorship-resistance": {
        "question": "What does \"censorship-resistant\" mean here?",
        "answer": [
          "No company sits between a donor and a recipient. {{appName}} doesn't hold the funds and can't freeze the address.",
          "As long as the Grin network is running, donations can be sent and received. {{appName}} itself going offline wouldn't stop them."
        ]
      },
      "why-onchain": {
        "question": "Why Grin?",
        "answer": [
          "Grin is digital cash with privacy built in. Its Mimblewimble design puts no addresses on the chain and hides every amount, so donations don't leave the public trail that most cryptocurrencies do.",
          "On {{appName}}, campaigns receive Grin in two ways: through GoblinPay (scan a QR and the payment travels to the campaign as an encrypted slatepack over Nostr) or straight to the campaign's grin1 Slatepack address from any Grin wallet. Either way, the funds land in a wallet the campaign controls.",
          "Campaign totals stay honest without giving up that privacy: a donor can publish a payment proof, and {{appName}} verifies it against a Grin node to confirm the transaction is really on-chain. The proof reveals the amount and the transaction kernel, not who paid. The Donor and Recipient guides walk through the details."
        ]
      },
      "why-not-rotating-addresses": {
        "question": "Why doesn't {{appName}} process donations on its own server?",
        "answer": [
          "Doing this would require {{appName}} to act as a money-exchanging middleman, taking custody of the Grin first and then forwarding it on to the recipient.",
          "That would make us a money transmitter, subject to the regulations that come with that, and a single point of failure: shut down {{appName}}'s server and you've shut down every donation flowing through it.",
          "Instead, donations travel from the donor's Grin wallet to the campaign's Grin wallet. Each campaign publishes its own grin1 Slatepack address or GoblinPay checkout, {{appName}} never touches the funds, and the platform itself can't be turned off to censor anyone. And because Grin puts no addresses on the chain, donations are unlinkable by default without anyone holding the money in the middle."
        ]
      },
      "why-not-other-crypto": {
        "question": "Why not Bitcoin, Monero, or another cryptocurrency?",
        "answer": [
          "Bitcoin is the most widely adopted cryptocurrency, but its ledger is public: a donation to a known address exposes the amount, the time, and the sending side, forever. Bolting privacy on top means extra tools, extra steps, and extra ways to get it wrong. For donations to sensitive causes, that's the wrong default.",
          "Grin makes the private path the only path. Mimblewimble leaves no addresses on the chain and hides every amount, so donors don't need special tooling to be safe. At the same time, Grin's payment proofs let a campaign show a verified, on-chain-checked total without exposing its donors. Monero offers strong privacy too, but Grin's payment proofs fit {{appName}}'s verified-donation model, and its lightweight chain keeps verification simple."
        ]
      },
      "what-is-nostr": {
        "question": "What is Nostr?",
        "answer": [
          "Nostr is an open network where **you** own your account, not a company. Your identity is a cryptographic key you control, not a username on someone else's server.",
          "On {{appName}}, that same key signs your campaigns and the donation receipts that build your verified total, which is why your identity and your campaigns work anywhere on Nostr without signing up with anyone."
        ]
      },
      "why-login-different": {
        "question": "Why is my sign-in so different and long?",
        "answer": [
          "Instead of a username and password controlled by a company, Nostr uses a pair of cryptographic keys.",
          "Your \"public key\" (starts with **npub**) is your username. Your \"secret key\" (starts with **nsec**) is your password. The long string is what makes it virtually impossible to guess."
        ]
      },
      "lose-secret-key": {
        "question": "What happens if I lose my secret key?",
        "answer": [
          "**There is no \"forgot password\" button.** Nobody can reset it for you. If you lose it, your account and your campaigns are gone forever. (Your Grin funds live in your own Grin wallet and its seed phrase, which is separate from this key.)",
          "**Save your secret key somewhere safe right now.** For tips, read [Managing Your Nostr Keys](https://soapbox.pub/blog/managing-nostr-keys)."
        ]
      },
      "manage-secret-key": {
        "question": "Can I save my secret key in my phone's password manager?",
        "answer": [
          "Yes. You can save it in your device's password manager (iCloud Keychain, 1Password, Bitwarden, etc.). On iPhone, saving it in Passwords lets you use Face ID or Touch ID to log in.",
          "For a full guide, see [Managing Your Nostr Keys](https://soapbox.pub/blog/managing-nostr-keys)."
        ]
      },
      "fyp": {
        "question": "How does the feed work?",
        "answer": [
          "Your feed shows campaigns and posts from people you follow. There's no algorithm deciding what you see."
        ]
      },
      "what-are-relays": {
        "question": "What are relays?",
        "answer": [
          "Relays are the servers that store and deliver Nostr events — posts, donation receipts, profile info. The defaults work out of the box; you can add or remove relays in Settings > Network."
        ]
      },
      "what-are-blossom": {
        "question": "What are Blossom servers?",
        "answer": [
          "Blossom servers store media files (campaign images, profile pictures) when you upload them. You can manage which servers you use in Settings > Network."
        ]
      },
      "report-content": {
        "question": "How do I report harmful content?",
        "answer": [
          "Tap the three-dot menu (**...**) on any post and select \"Report.\" You can mute or block users from the same menu."
        ]
      },
      "vs-mastodon-bluesky": {
        "question": "How is Nostr different from Mastodon or Bluesky?",
        "answer": [
          "On Mastodon, your account lives on a specific server. On Bluesky, most accounts depend on one company. On Nostr, your identity is a key you control, and your profile and campaigns go with you to any Nostr app."
        ]
      },
      "profile-fields": {
        "question": "What are profile fields?",
        "answer": [
          "Profile fields let you add extra info to your profile — links, wallet addresses, music, photos, videos."
        ]
      }
    }
  },
  "guides": {
    "shared": {
      "tldrEyebrow": "The short version"
    },
    "donor": {
      "tldr": {
        "lede": "Donate from any Grin wallet: scan the campaign's GoblinPay QR, or pay its grin1 Slatepack address. Grin is private by default, so your donation doesn't leave a public trail.",
        "nextActions": [
          "Pay from any Grin wallet",
          "No middleman, no holding period",
          "Private by default"
        ]
      },
      "flow": {
        "heading": "How a donation flows",
        "steps": {
          "openCampaign": {
            "title": "Open the campaign",
            "body": "Tap Donate and pick a path. GoblinPay: enter an amount, scan the QR with a Goblin wallet, and the payment travels to the campaign as an encrypted slatepack over Nostr, with automatic confirmation. Grin address: pay the campaign's grin1 Slatepack address from any Grin wallet; your wallet handles the transport, over Tor or by exchanging slatepacks."
          },
          "arrivesDirectly": {
            "title": "It arrives directly",
            "body": "Funds settle straight to the campaign's wallet. {{appName}} doesn't hold or route them. If you want your gift to count toward the public campaign total, publish the payment proof or receipt afterwards; it reveals the amount, not your identity."
          }
        }
      },
      "publicVisible": {
        "title": "What's public, and what isn't",
        "body": "The Grin chain has no addresses and hides all amounts, so outside observers can't see who donated to a campaign or how much. The campaign total on {{appName}} is built only from proofs and receipts that donors choose to publish, and each one reveals just the amount and the transaction kernel."
      },
      "privacy": {
        "heading": "Donating privately",
        "intro": "On-chain, Grin already protects you: no addresses, hidden amounts, no public donor list. What can still identify you is how you acquired the Grin and what you choose to publish. If your risk is high, these steps are worth taking. Pick one, or stack them.",
        "options": {
          "nonKyc": {
            "name": "Acquire Grin without KYC",
            "purpose": "Mine it, or buy it peer-to-peer through Bisq or a similar platform, so the coins aren't linked to your government ID in the first place."
          },
          "noKycExchange": {
            "name": "Buy through a no-KYC exchange",
            "purpose": "NonLogs lists GRIN and doesn't ask for an ID, an account, or logs to trade — a lower-friction alternative to peer-to-peer if you'd rather use an exchange."
          },
          "coinjoin": {
            "name": "Skip the public receipt",
            "purpose": "Publishing a payment proof links the donation to your Nostr identity. Don't publish it, and the donation stays between you and the campaign."
          }
        }
      },
      "consumerApps": {
        "title": "Some exchanges know who you are",
        "body": "Some exchanges that list GRIN verify your ID and keep records of every withdrawal — check before you use one. The public chain won't show your donation, but if the exchange tracks you, it knows where its withdrawal went. If that matters for your situation, withdraw to a wallet you control first and donate from there, or use a no-KYC exchange like nonlogs.io."
      }
    },
    "recipient": {
      "tldr": {
        "lede": "Publish a grin1 Slatepack address from a Grin wallet you control, or set up a GoblinPay checkout. Donations arrive wallet to wallet. {{appName}} never holds your funds.",
        "nextActions": [
          "Get a Grin wallet and an address",
          "Add it to your campaign",
          "Back up your wallet's seed phrase"
        ]
      },
      "howReceiving": {
        "heading": "How receiving works",
        "paragraphs": [
          "Donations on {{appName}} travel straight from the donor's Grin wallet to yours. When you create a campaign, you choose how to receive:",
          "**A grin1 Slatepack address.** Any Grin wallet (Goblin, grin-wallet) gives you one. Donors pay it from any Grin wallet, interactively over Tor or by exchanging slatepacks; the wallets handle the transport.",
          "**GoblinPay.** A checkout that lets donors pay in-app: they scan a QR and the payment travels to you as an encrypted, gift-wrapped slatepack over Nostr, with automatic confirmation and a signed receipt at the end.",
          "**Both.** Donors with a Goblin wallet get the one-scan flow, and everyone else pays your Slatepack address from whatever Grin wallet they use. Offering both keeps you open to every donor.",
          "Privacy is the default either way. Grin's Mimblewimble design puts no addresses on the chain and hides every amount, so your donations never appear in any public ledger anyone can browse.",
          "Your campaign's verified total counts a donation once its payment proof or GoblinPay receipt is published and checked: the receiver signature must verify, and the transaction kernel must be confirmed on-chain against a Grin node. Each published proof reveals the amount and the kernel, nothing about the donor."
        ]
      },
      "whatEveryoneSees": {
        "heading": "What everyone can see",
        "paragraphs": [
          "Visitors see your campaign page, its goal, and the verified total built from the proofs and receipts donors chose to publish. Each of those reveals an amount and a transaction kernel, not a donor identity.",
          "Nobody can look up your balance or donation history on the chain. There is no address to inspect and no amounts to read; beyond published receipts, people see only what you share about the campaign's progress."
        ]
      },
      "movePromptly": {
        "heading": "Your wallet, your responsibility",
        "steps": {
          "sweep": {
            "title": "Donations land in a wallet you control",
            "body": "{{appName}} never runs a wallet for you. Funds arrive in the Grin wallet whose address or GoblinPay checkout you published, so custody is yours from the very first donation. That also means the responsibility is yours: anyone who has your wallet's seed phrase has the funds, and without it the funds are unrecoverable."
          },
          "dontSit": {
            "title": "Back up the seed phrase offline",
            "body": "Especially for high-value campaigns, store your Grin wallet's seed phrase offline (paper, a metal backup, or a password manager on a dedicated device). The seed is the wallet: secure the words and you've got cold storage."
          }
        }
      },
      "cashout": {
        "heading": "Cashing out",
        "intro": "Grin's chain won't expose your donations, so the main privacy decision is how you convert to local currency. Any service that verifies your ID will know what you cash out through it. The options below have different trade-offs.",
        "options": {
          "coinjoin": {
            "name": "Exchanges",
            "purpose": "A no-KYC exchange like nonlogs.io lets you cash out without an identity check."
          },
          "peerToPeer": {
            "name": "Peer-to-peer",
            "purpose": "Trade Grin for fiat directly with another person or through an over-the-counter broker. No platform in the middle."
          }
        }
      },
      "tumblers": {
        "title": "No mixers needed",
        "body": "There are no tumblers or mixing services to trust on Grin, and you don't need any. Mimblewimble hides amounts and leaves no addresses on the chain, so donations are private by default."
      }
    }
  },
  "grinPay": {
    "title": "Donate to {{title}}",
    "subtitle": "Grin only. Direct, private, verifiable.",
    "goblinPayTab": "GoblinPay",
    "grinAddressTab": "Grin address",
    "goblinPayHelp": "Pay in-app with a Goblin wallet: enter an amount, scan the QR, and the payment travels as an encrypted slatepack over Nostr. Confirmation is automatic.",
    "amountLabel": "Amount in GRIN",
    "amountPlaceholder": "2.5",
    "createInvoice": "Continue",
    "invoiceMemo": "Eranos donation: {{title}}",
    "scanToPay": "Scan with a Goblin wallet to pay {{amount}}.",
    "copyNprofile": "Copy receiving identity",
    "copyAddress": "Copy Grin address",
    "copySlatepack": "Copy slatepack",
    "openCheckout": "Open hosted checkout",
    "statusWaiting": "Waiting for payment…",
    "statusReceived": "Payment received — waiting for on-chain confirmation…",
    "statusConfirmed": "Confirmed: {{amount}} GRIN received.",
    "statusExpired": "This invoice expired. Close and start again.",
    "manualToggle": "Trouble paying? Use the manual slatepack fallback",
    "manualHelp": "Create the payment in your Grin wallet, paste the slatepack it gives you (S1) below, and you will get a response slatepack (S2) to finalize and post from your wallet.",
    "manualSubmit": "Submit slatepack",
    "manualResponseHelp": "Copy this response back into your wallet, then finalize and post the transaction.",
    "endpubHelp": "Scan with a Goblin wallet to pay this campaign directly over Nostr. Any amount.",
    "grinAddressHelp": "Pay from any Grin wallet (Goblin, grin-wallet) to this Slatepack address, interactively over Tor or by exchanging slatepacks. Your wallet handles the transport.",
    "proofTitle": "Already donated? Record it",
    "proofHelp": "Export the payment proof from your wallet and paste it here. It is verified locally (receiver signature and on-chain kernel) and published so the campaign total counts your donation. The proof reveals the amount and the kernel, not your identity.",
    "proofPlaceholder": "{ \"amount\": …, \"excess\": …, \"recipient_sig\": … }",
    "proofSubmit": "Verify & record donation",
    "proofLoginRequired": "Log in to record a donation toward the campaign total.",
    "proofInvalid": "Proof could not be verified",
    "proofNotJson": "That does not look like a payment proof (expected JSON).",
    "proofBadSignature": "The receiver signature does not verify.",
    "proofNotForCampaign": "This proof was not paid to this campaign's Grin address.",
    "proofKernelMissing": "The transaction kernel is not on-chain (yet). Wait for confirmation and try again.",
    "proofPublished": "Donation recorded",
    "publishReceipt": "Record my donation publicly",
    "receiptPublished": "Donation recorded",
    "receiptPublishedDesc": "The signed receipt was published; the campaign total will include it.",
    "donationRecorded": "Your donation now counts toward the verified campaign total.",
    "errorCreateInvoice": "Could not create the invoice",
    "errorManual": "Manual receive failed",
    "errorPublish": "Could not publish",
    "notConfigured": "This campaign has not published a Grin receiving address yet."
  }
}
