import type { MessageDict } from "./types";

export const en: MessageDict = {
  "app.name": "Lapras",
  "app.nameEn": "Lapras",
  "app.nameZh": "巡樓",
  "app.tagline": "Patrol Threads with ease",
  "app.taglineEn": "Patrol Threads with ease",
  "nav.today": "Today",
  "nav.crew": "Accounts",
  "nav.studio": "Studio",
  "nav.radar": "Patrol",
  "nav.crm": "CRM",
  "nav.scout": "Topics",
  "nav.outbox": "Outbox",
  "nav.jobs": "Jobs",
  "nav.brands": "Brands",
  "nav.policy": "Opportunity policy",
  "nav.playbooks": "Playbooks",
  "nav.insights": "Insights",
  "nav.benchmark": "Benchmark",
  "nav.utm": "UTM",
  "nav.more": "More",
  "nav.moreTitle": "More",
  "nav.users": "Islanders",
  "nav.usage": "Usage & plans",
  "nav.profile": "Profile",
  "nav.invite": "Invites",
  "nav.settings": "Settings",
  "nav.logout": "Log out",
  "nav.navigate": "Navigate",
  "navGroup.workflow": "Today",
  "navGroup.publish": "Post",
  "navGroup.advanced": "Advanced",

  "workspace.label": "Workspace",
  "workspace.default": "Default",
  "workspace.new": "＋ New workspace",
  "workspace.newPrompt": "New workspace name",

  "common.save": "Save",
  "common.saving": "Saving…",
  "common.cancel": "Cancel",
  "common.close": "Close",
  "common.loading": "Loading…",
  "common.retry": "Retry",
  "common.back": "Back",
  "common.delete": "Delete",
  "common.edit": "Edit",
  "common.search": "Search",
  "common.confirm": "Confirm",
  "common.optional": "Optional",
  "common.success": "Saved",
  "common.error": "Something went wrong",
  "common.yes": "Yes",
  "common.no": "No",

  "help.open": "Help",
  "help.kicker": "This page",
  "help.section.what": "What this page is for",
  "help.section.how": "How to use it",
  "help.section.tips": "Tips",
  "help.section.related": "Related",
  "help.shortcutHint": "Open via the “?” next to the page title. Shortcut: ? toggles; Esc closes.",

  "help.page.generic.title": "Lapras console",
  "help.page.generic.what": "Your work desk. Use the sidebar (or mobile dock) to switch features; the top bar has usage, notifications, and this help.",
  "help.page.generic.step1": "Pick a task from the nav (patrol, radar, outbox, …).",
  "help.page.generic.step2": "Open Help from the top bar or press ? when you need context.",
  "help.page.generic.step3": "Settings, profile, and plans live in the account menu.",
  "help.page.generic.tips": "Help never changes your data; open and close anytime.",

  "help.page.today.title": "Today",
  "help.page.today.what": "Everyone worth replying to today. We find them daily; you only decide who to answer.",
  "help.page.today.step1": "Read the cards top to bottom — one line tells you what they are asking.",
  "help.page.today.step2": "Press Reply to open the original post and save them to your list.",
  "help.page.today.step3": "Stuck on wording? Press Write my reply for a draft you can copy. Press Skip for anyone who isn't your customer.",
  "help.page.today.tips": "No cards yet? Add the keywords customers search. Change what we look for under \"What to look for\".",

  "help.page.crew.title": "Accounts (Crew)",
  "help.page.crew.what": "Connected Threads accounts, health, and usability. Publishing and outreach start from accounts here.",
  "help.page.crew.step1": "Connect at least one usable account via OAuth.",
  "help.page.crew.step2": "Check connection and health (avoid auto-send on throttle).",
  "help.page.crew.step3": "Tune AI and dev options under Settings if needed.",
  "help.page.crew.tips": "Warn/throttle health blocks automatic public sends; copy manually instead.",

  "help.page.studio.title": "Studio",
  "help.page.studio.what": "Draft posts, personas, inspiration, and plays; finished work goes to Outbox to publish.",
  "help.page.studio.step1": "Pick a persona or brand voice, then draft.",
  "help.page.studio.step2": "Use inspiration/mimic tools, then edit by hand.",
  "help.page.studio.step3": "Send to Outbox and confirm the schedule there.",
  "help.page.studio.tips": "Studio drafts are not published until Outbox succeeds.",

  "help.page.scout.title": "Topic ideas",
  "help.page.scout.what": "Find lively Threads topics to join, draft a reply, and mark done. To find people looking for your service, use Demand (daily watch or Explore now).",
  "help.page.scout.step1": "Enter topic keywords, generate queries, then edit them.",
  "help.page.scout.step2": "Confirm search, then work the queue sorted by post time.",
  "help.page.scout.step3": "Draft, open Threads to reply, mark done.",
  "help.page.scout.tips": "Topics = content ideas. Demand = finding customers. Use the Demand page for leads.",

  "help.page.radar_today.title": "Demand patrol",
  "help.page.radar_today.what": "Run a scheduled or immediate patrol to find pains your product can solve, or new posts. Keep or discard after you read the reason.",
  "help.page.radar_today.step1": "Check the patrol desk: whether daily patrol is on, when it last ran, and run one now.",
  "help.page.radar_today.step2": "Read why it was recommended; the same drawer drafts the reply, switches the primary product, and overrides the band.",
  "help.page.radar_today.step3": "Add to contacts only if you want to follow that person. Contacts are optional.",
  "help.page.radar_today.tips": "Need more input? Use Explore now or Manual import. Immediate and daily patrol can both stay on.",

  "help.page.radar_watches.title": "Patrol setup",
  "help.page.radar_watches.what": "Add keywords customers search. Daily patrol runs on a schedule; you can also run one immediately. Results land on Today.",
  "help.page.radar_watches.step1": "Type short customer search words. Brand and service profile can wait.",
  "help.page.radar_watches.step2": "Add excludes if needed, or pick a brand to seed product terms.",
  "help.page.radar_watches.step3": "Leave daily patrol on, or go back to Today and run another sweep.",
  "help.page.radar_watches.tips": "Active slots are plan-capped; pause one to free a slot.",

  "help.page.crm_board.title": "Contact management",
  "help.page.crm_board.what": "A searchable, filterable work list of contacts accepted from Today’s demand, with notes, wins, and timelines.",
  "help.page.crm_board.step1": "On Today’s demand, hit Add to CRM; people land in New.",
  "help.page.crm_board.step2": "Open a contact to move stage, note, or flag follow-up.",
  "help.page.crm_board.step3": "Report a win when you close (amount optional).",
  "help.page.crm_board.tips": "Remove contacts you no longer need from the work list; opportunity, touch, and conversion history remains.",

  "help.page.crm_followups.title": "Follow-ups",
  "help.page.crm_followups.what": "Due revisits: done, snooze, or AI draft for a manual message.",
  "help.page.crm_followups.step1": "Check due date and status (including escalated).",
  "help.page.crm_followups.step2": "Generate an AI draft if you need copy, then send yourself.",
  "help.page.crm_followups.step3": "Mark done or snooze three days.",
  "help.page.crm_followups.tips": "Nothing is auto-messaged; drafts are for copy only.",

  "help.page.crm_stats.title": "Conversion stats",
  "help.page.crm_stats.what": "Conversion by term, reply variant, and source. No ranking when samples are thin.",
  "help.page.crm_stats.step1": "Read absolute counts first.",
  "help.page.crm_stats.step2": "Ignore ranking on “insufficient sample” rows.",
  "help.page.crm_stats.step3": "Tune watches and reply style from what you learn.",
  "help.page.crm_stats.tips": "Rates stay hidden on small samples on purpose.",

  "help.page.outbox.title": "Outbox",
  "help.page.outbox.what": "Schedule and send queue — last stop before Threads publish.",
  "help.page.outbox.step1": "Review pending and failed items.",
  "help.page.outbox.step2": "Retry failures or edit the draft.",
  "help.page.outbox.step3": "Track long jobs under Jobs as well.",
  "help.page.outbox.tips": "Health throttle blocks automatic send.",

  "help.page.jobs.title": "Jobs",
  "help.page.jobs.what": "Background work (scans, sweeps, analysis) with progress and outcomes.",
  "help.page.jobs.step1": "Scan status: queued / running / success / failed.",
  "help.page.jobs.step2": "Open a job for the progress summary.",
  "help.page.jobs.step3": "On failure, retry from the related feature.",
  "help.page.jobs.tips": "Radar “Sweep now” creates a radar_sweep job here.",

  "help.page.brands.title": "Brands",
  "help.page.brands.what": "Maintain brands and products so demand search knows what you sell and which pains you solve.",
  "help.page.brands.step1": "Maintain brand and product basics.",
  "help.page.brands.step2": "Add product contexts, pain points, match tags, and capability terms.",
  "help.page.brands.step3": "Set pricing, regions, forbidden words, cases, and tone under the standalone Opportunity policy page.",
  "help.page.brands.tips": "Richer product data improves query preprocessing and product matching.",

  "help.page.policy.title": "Opportunity policy",
  "help.page.policy.what": "Shared qualification and reply policy, kept separate from brand and case management.",
  "help.page.policy.step1": "Set services, pricing, and service areas.",
  "help.page.policy.step2": "Add forbidden words, cases, FAQs, availability, and tone.",
  "help.page.policy.step3": "Save once; qualification, watch activation, and reply generation use this policy.",
  "help.page.policy.tips": "Policy is workspace-wide. Maintain individual brands and products on Brands.",

  "help.page.playbooks.title": "Playbooks",
  "help.page.playbooks.what": "Share or adopt patrol briefs, personas, and play templates.",
  "help.page.playbooks.step1": "Browse templates.",
  "help.page.playbooks.step2": "Adopt into your workspace and edit.",
  "help.page.playbooks.step3": "Use them in Patrol or Studio.",
  "help.page.playbooks.tips": "Templates are starting points — rewrite for your brand.",

  "help.page.insights.title": "Insights",
  "help.page.insights.what": "Post and engagement performance so you can double down on what works.",
  "help.page.insights.step1": "Sync or review recent post metrics.",
  "help.page.insights.step2": "Feed winners back into Studio.",
  "help.page.insights.step3": "Compare with Benchmark when available.",
  "help.page.insights.tips": "Sync lag depends on the platform; not second-level live.",

  "help.page.benchmark.title": "Benchmark",
  "help.page.benchmark.what": "Anonymous site-wide medians when sample size is enough.",
  "help.page.benchmark.step1": "Read metrics that have samples.",
  "help.page.benchmark.step2": "Don’t over-read thin samples.",
  "help.page.benchmark.step3": "Adjust content strategy from the gap.",
  "help.page.benchmark.tips": "Meaningful medians usually need sample size ≥ 5.",

  "help.page.utm.title": "UTM",
  "help.page.utm.what": "Build UTM links so you can attribute traffic later.",
  "help.page.utm.step1": "Fill campaign and source params.",
  "help.page.utm.step2": "Use the link in posts or DMs.",
  "help.page.utm.step3": "Match results in your analytics tool.",
  "help.page.utm.tips": "Keep naming consistent for clean reports.",

  "help.page.settings.title": "Settings",
  "help.page.settings.what": "AI providers, search keys, and interface preferences.",
  "help.page.settings.step1": "Confirm AI keys (platform or BYOK).",
  "help.page.settings.step2": "Search keys are optional — use your own or the platform default.",
  "help.page.settings.step3": "Return to a feature page and verify.",
  "help.page.settings.tips": "Bad keys show up as generation/scan failures in usage or jobs.",

  "help.page.profile.title": "Profile",
  "help.page.profile.what": "Your member account, password, and basic prefs.",
  "help.page.profile.step1": "Update display name and basics.",
  "help.page.profile.step2": "Change password if needed.",
  "help.page.profile.step3": "Language/theme live in UI prefs.",
  "help.page.profile.tips": "Member profile is separate from Threads connections (Crew).",

  "help.page.invite.title": "Invites",
  "help.page.invite.what": "Invite links, downline relations, and rewards info.",
  "help.page.invite.step1": "Copy and share your invite link.",
  "help.page.invite.step2": "Review established relations.",
  "help.page.invite.step3": "Rewards follow in-product rules.",
  "help.page.invite.tips": "Don’t spam invites; abuse can suspend accounts.",

  "help.page.usage.title": "Usage & plan",
  "help.page.usage.what": "Credits, meter usage, and plan caps.",
  "help.page.usage.step1": "Check each meter.",
  "help.page.usage.step2": "Near limits, upgrade or use BYOK.",
  "help.page.usage.step3": "Plan details are on the Plans page.",
  "help.page.usage.tips": "BYOK usually counts calls only (see on-page labels).",

  "help.page.usage_plans.title": "Plans",
  "help.page.usage_plans.what": "Compare and choose a paid plan.",
  "help.page.usage_plans.step1": "Compare caps and features.",
  "help.page.usage_plans.step2": "Start checkout for a plan.",
  "help.page.usage_plans.step3": "Confirm entitlements under Usage.",
  "help.page.usage_plans.tips": "Price and caps are those shown at checkout.",

  "help.page.usage_checkout.title": "Checkout",
  "help.page.usage_checkout.what": "Pay for the selected plan.",
  "help.page.usage_checkout.step1": "Confirm plan and amount.",
  "help.page.usage_checkout.step2": "Complete payment.",
  "help.page.usage_checkout.step3": "Return to Usage to verify.",
  "help.page.usage_checkout.tips": "Keep the receipt if payment fails and contact support.",

  "help.page.admin_users.title": "Members admin",
  "help.page.admin_users.what": "Admin tools for members, suspend, and roles.",
  "help.page.admin_users.step1": "Search or browse members.",
  "help.page.admin_users.step2": "Change status or role carefully.",
  "help.page.admin_users.step3": "Record reasons for sensitive actions.",
  "help.page.admin_users.tips": "Admins only; mistakes can lock others out.",

  "api.err.unknown": "Something went wrong. Please try again.",
  "api.err.studioValidation": "Invalid data. Please check and try again.",
  "api.err.crawlerSession": "Sync the Chrome session in Settings, then try again.",
  "api.err.network": "Cannot reach the server. Check your network or if the API is running.",
  "api.err.400001": "Invalid request",
  // Same sentence as backend 400003 / ValidatePasswordPolicy
  "api.err.400003": "Password must be at least 12 characters with upper, lower, digit, and symbol",
  "password.policy.hint": "Password must be at least 12 characters with upper, lower, digit, and symbol",
  "password.policy.minLen": "Password must be at least 12 characters with upper, lower, digit, and symbol",
  "password.policy.needUpper": "Password must be at least 12 characters with upper, lower, digit, and symbol",
  "password.policy.needLower": "Password must be at least 12 characters with upper, lower, digit, and symbol",
  "password.policy.needDigit": "Password must be at least 12 characters with upper, lower, digit, and symbol",
  "password.policy.needSymbol": "Password must be at least 12 characters with upper, lower, digit, and symbol",

  "api.err.400004": "Invalid or expired verification code",
  "api.err.400020": "You cannot suspend your own account",
  "api.err.400021": "Cannot demote or suspend the last active admin",
  "auth.unreachable": "Can't reach the server, so your sign-in state is unknown. Check your connection and retry.",
  "api.err.401001": "Please sign in",
  "api.err.401002": "Session expired. Please sign in again.",
  "api.err.401003": "Account not found. Please sign in again.",
  "api.err.401010": "Invalid email or password",
  "api.err.403001": "Account suspended",
  "api.err.403002": "Admin access required",
  "api.err.404001": "Not found",
  "api.err.404002": "This email is not registered",
  "api.err.409001": "This email is already registered",
  "api.err.402001": "Monthly platform credits exhausted. Upgrade or wait for next month.",
  "usage.err.meterCap": "This feature hit its monthly credit cap. Try another feature or upgrade.",
  "usage.err.platformCapacity": "Platform AI/search is busy or rate-limited. Try again later, or add your own API key (BYOK) in Settings.",
  "api.err.500000": "Server error. Please try again later.",
  "api.err.timeoutAI": "AI timed out. Shorten structure notes, or pick a faster model in Settings",
  "api.err.501000": "This feature is not implemented yet",
  "api.err.501010": "This capability is not available yet; a later release will ship it",
  "api.err.400100": "Some fields do not meet the rules. Please review and resubmit",

  "api.ok.verifySent": "Verification code sent. Please check your email.",
  "api.ok.verifyIssued": "Verification code issued",
  "api.ok.resetSent": "Reset email sent. Please check your inbox.",
  "api.ok.passwordUpdated": "Password updated",
  "api.ok.loggedOut": "Signed out",
  "api.ok.unbound": "Unbound",

  "topbar.notifications": "Notifications",
  "topbar.unread": "{n} unread",
  "topbar.markAllRead": "Mark all read",
  "topbar.noNotifications": "No notifications",
  "topbar.jobsCenter": "Job center",
  "topbar.moreOlder": "{n} older",
  "topbar.account": "Account menu",

  "role.admin": "Admin",
  "role.member": "Member",
  "role.verified": "Verified",
  "role.unverified": "Unverified",

  "login.title": "Sign in to Lapras",
  "login.email": "Email",
  "login.password": "Password",
  "login.showPassword": "Show password",
  "login.hidePassword": "Hide password",
  "login.submit": "Sign in",
  "login.submitting": "Signing in…",
  "login.forgot": "Forgot password?",
  "login.mockHint": "Admin demo@harbor.local / demo · member alice@harbor.local / alice",
  "login.liveHint": "Live backend: admin@haixun.local / admin123 (gateway :8888)",

  "forgot.title": "Forgot password",
  "forgot.submit": "Send reset link",
  "forgot.submitting": "Sending…",
  "forgot.back": "Back to sign in",
  "forgot.hint": "Enter your registered email. We'll send a reset link and code.",
  "forgot.mockMail": "Reset email",
  "forgot.openReset": "Enter code / reset password",
  "forgot.retry": "Try again",
  "forgot.nextStep": "Check your email for the code or link, then open the reset page to set a new password.",

  "reset.title": "Set new password",
  "reset.hint": "Enter email, verification code (from the email), and a new password.",
  "reset.code": "Verification code",
  "reset.codePh": "6-digit code from email",
  "reset.needEmail": "Email is required",
  "reset.needCode": "Verification code is required",
  "reset.newPassword": "New password",
  "reset.confirm": "Confirm password",
  "reset.submit": "Update password",
  "reset.submitting": "Updating…",
  "reset.missingToken": "Missing token. Please request a new reset link.",

  "verify.title": "Verify email",
  "verify.pending": "Not verified",
  "verify.body": "You're signed in, but features stay locked until you verify your email with the 6-digit code.",
  "verify.code": "Verification code",
  "verify.submit": "Verify",
  "verify.submitting": "Verifying…",
  "verify.resend": "Resend code",
  "verify.sending": "Sending…",
  "verify.logout": "Log out",
  "verify.mockMail": "Verification email",
  "verify.mockHint": "Enter the code:",
  "verify.after": "After verification you can use Today, Studio, Patrol, and more.",

  "settings.title": "Settings",
  "settings.loadFail": "Could not load settings. Refresh to try again.",
  "settings.localeCurrency": "Language & currency",
  "settings.locale": "Interface language",
  "settings.currency": "Display currency",
  "settings.currencyHint": "Display only; plan billing stays in TWD.",
  "settings.localeSaved": "Language and currency updated",
  "settings.appearance": "Appearance",
  "settings.theme": "Theme",
  "settings.themeLight": "Light",
  "settings.themeDark": "Dark",
  "settings.themeSystem": "System",
  "settings.themeHint": "Light, dark, or follow system appearance.",
  "settings.themeSaved": "Theme updated",
  "settings.themeToLight": "Switch to light",
  "settings.themeToDark": "Switch to dark",
  "settings.dataSource": "Data source",
  "settings.dataSourceHint":
    "Business data always uses live API. Mock keeps only a few local modules (e.g. invite). Prefer Live + gateway.",
  "settings.dataSourceMock": "Mock (reduced)",
  "settings.dataSourceLive": "Live (backend API)",
  "settings.dataSourceCurrent": "Current",
  "settings.dataSourceSwitchedLive":
    "Switched to Live — re-login with backend account (admin@haixun.local / admin123)",
  "settings.dataSourceSwitchedMock": "Switched back to Mock (non-invite still hits live)",
  "settings.dataSourceLiveNeedGateway": "Requires gateway on :8888 (or Vite proxy /api)",
  "settings.ai": "AI",
  "settings.search": "Search",
  "settings.threads": "Threads OAuth (platform)",
  "settings.threadsHint":
    "App ID/Secret live in gateway platform config (yaml/env); Secret is never shown. Paste Callback into Meta app settings and connect via the public https site.",
  "settings.threadsProvider": "Mode",
  "settings.threadsProviderFake": "Fake (dev OAuth flow)",
  "settings.threadsProviderMeta": "Meta production",
  "settings.threadsConfigured": "App credentials",
  "settings.threadsConfiguredYes": "Configured",
  "settings.threadsConfiguredNo": "Not set",
  "settings.threadsCallback": "OAuth Callback URL (redirect_uri)",
  "settings.threadsCallbackHint": "Paste this exact URL into Meta App → Valid OAuth Redirect URIs (https required)",
  "settings.threadsCopy": "Copy",
  "settings.threadsCopied": "Callback URL copied",
  "settings.threadsCopyFail": "Copy failed — select manually",
  "settings.threadsPublicWeb": "Public site origin",
  "settings.threadsGoCrew": "Open Crew to connect",
  "settings.member": "Account & sign-in",
  "settings.usageCard": "AI / search quota",
  "settings.usageCardHint": "Platform credits and plan caps; BYOK does not use platform credits.",
  "settings.viewUsage": "View usage",
  "settings.editProfile": "Edit profile",
  "settings.mockLogin": "demo@harbor.local / demo",
  "settings.memberHint": "Sign-in account, display name, and notification prefs.",

  "usage.title": "Usage & plans",
  "usage.desc": "See platform credits this month, per-feature usage, and change plans.",
  "usage.creditsUsed": "Credits used this month",
  "usage.remaining": "{n} left",
  "usage.percentUsed": "{n}% used",
  "usage.breakdown": "Breakdown",
  "usage.plans": "Plans",
  "usage.current": "Current",
  "usage.inUse": "Active",
  "usage.switchMock": "Switch plan",
  "usage.perMonth": "credits / mo",
  "usage.ledger": "Recent usage",
  "usage.emptyTitle": "No usage this month",
  "usage.emptyDesc": "After you create, patrol, or generate images, usage events show up here.",
  "usage.planNote": "Resets each calendar month; unused credits do not roll over.",
  "usage.switched": "Switched to {name}",
  "usage.meter.times": "{count} runs · {credits} credits",
  "usage.meter.timesShort": "{n} runs",
  "usage.meter.pt": "pt",
  "usage.meter.over": "over",
  "usage.meter.locked": "locked",
  "usage.meter.cap": "Cap {credits}/{cap} credits",
  "usage.side.aiCredits": "AI credits used (copy + research + image)",
  "usage.side.searchCredits": "Search credits used",
  "usage.byok.title": "BYOK usage",
  "usage.byok.hint": "Calls only; does not affect platform credits or progress bars.",
  "usage.plan.free.blurb": "Enough to try the full creation flow",
  "usage.plan.starter.blurb": "Small teams posting and patrolling daily",
  "usage.plan.pro.blurb": "Multi-account, heavy AI and research",

  "profile.title": "Profile",
  "profile.desc": "Manage display name, avatar, and password.",
  "profile.accountStatus": "Account status",
  "profile.basic": "Basics",
  "profile.avatar": "Avatar",
  "profile.avatarUpload": "Upload avatar",
  "profile.avatarRemove": "Remove avatar",
  "profile.avatarHint": "JPG / PNG / WebP, up to 5MB. Pick a file then Save basic info; Remove clears immediately.",
  "profile.avatarSaved": "Avatar updated",
  "profile.avatarCleared": "Avatar removed",
  "profile.avatarFail": "Could not read image",
  "profile.displayName": "Display name",
  "profile.bio": "Bio (optional)",
  "profile.timezone": "Timezone",
  "profile.notifyEmail": "Email notifications",
  "profile.password": "Change password (optional)",
  "profile.currentPassword": "Current password",
  "profile.newPassword": "New password",
  "profile.confirmPassword": "Confirm new password",
  "profile.emailVerified": "Email verified",
  "profile.emailUnverified": "Email not verified",
  "profile.roleAdmin": "Admin",
  "profile.roleMember": "Member",
  "profile.loginEmail": "Sign-in email: {email}",
  "profile.verifiedAt": " · verified {time}",
  "profile.goVerify": "Verify email",
  "profile.roleTags": "Role tags: {labels}",
  "profile.roleNote": "Roles are assigned by the system; re-verify after changing email.",
  "profile.saveBasic": "Save profile",
  "profile.updatePassword": "Update password",
  "profile.saved": "Profile saved",
  "profile.savedUnverified": "Saved. Verify your email before using features.",
  "profile.saveFail": "Could not save",
  "profile.needNewPassword": "Enter a new password",
  "profile.passwordMismatch": "New passwords do not match",
  "profile.needCurrentPassword": "Enter your current password",
  "profile.wrongCurrentPassword": "Current password is incorrect",
  "profile.passwordUpdated": "Password updated",
  "profile.passwordFail": "Could not change password",
  "profile.listJoin": ", ",
  "profile.tenantUid": " · tenant {tenant} · uid {uid}",
  "profile.inviteBadge": "Invite code",
  "profile.inviteHint": "Share with friends to join; later events can use invite relations.",
  "profile.gotoInvite": "View invites",

  "invite.title": "Invites",
  "invite.desc": "Invite codes and relations; admin view is a tree.",
  "invite.tabs": "Invite views",
  "invite.tab.mine": "My invites",
  "invite.tab.tree": "Tree",
  "invite.myCode": "My invite code",
  "invite.codeLabel": "Invite code",
  "invite.copyCode": "Copy",
  "invite.copied": "Copied",
  "invite.copyFail": "Copy failed",
  "invite.stats": "{direct} direct · {total} in chain",
  "invite.rewards.summary": "Reward points total {total} · this month {month} / cap {cap}",
  "invite.rewards.title": "Reward history",
  "invite.upline": "Invited by",
  "invite.downlines": "Direct invites · {n}",
  "invite.noUpline": "No inviter",
  "invite.noDownline": "None yet",
  "invite.directN": "{n} direct",
  "invite.claimHint": "If you didn’t enter a code at signup, add your inviter’s code here (cannot change later).",
  "invite.claimLabel": "Invite code",
  "invite.claimPh": "e.g. HX-DEMO01",
  "invite.claimSubmit": "Bind",
  "invite.claimOk": "Bound to {name}",
  "invite.claimOkGeneric": "Inviter bound",
  "invite.claimFail": "Could not bind",
  "invite.claimLocked": "Already bound. Contact an admin to change.",
  "invite.loadFail": "Failed to load",
  "invite.treeEmpty": "No data",
  "invite.treeSearch": "Search",
  "invite.treeSearchPh": "Name / email / code",
  "invite.treeCount": "{n} people",
  "invite.treeMatchCount": "{n} matches · {total} total",
  "invite.treeNoMatch": "No matches",
  "invite.treeNoMatchHint": "Try another keyword",
  "invite.clearSearch": "Clear",
  "invite.moveTitle": "Reassign",
  "invite.newParent": "Inviter",
  "invite.root": "(None · standalone)",
  "invite.confirmMove": "Confirm",
  "invite.moved": "Reassigned “{name}” → “{parent}”",
  "invite.moveFail": "Failed",
  "invite.openFromAdmin": "Invites",
  "invite.parentField": "Invited by",
  "invite.orgPickRoot": "Pick a starting root (includes self-joined)",
  "invite.orgRoots": "Roots",
  "invite.orgPath": "Path",
  "invite.orgChainN": "{n} in chain",
  "invite.orgFocusStats": "{direct} direct · {total} in chain",
  "invite.orgDirects": "Direct invites · {n}",
  "invite.orgNoDirects": "No direct invites",
  "invite.err.notFound": "Member not found",
  "invite.err.notLoggedIn": "Not signed in",
  "invite.err.needAdmin": "Admin access required",
  "invite.err.memberNotFound": "Islander not found",
  "invite.err.selfParent": "Cannot set yourself as inviter",
  "invite.err.parentNotFound": "Inviter not found",
  "invite.err.cycle": "Cannot place under your own invite chain (would create a cycle)",
  "invite.err.repoMissing": "Invite data layer not loaded — please refresh the page",
  "invite.err.alreadyBound": "You already have an inviter",
  "invite.err.codeRequired": "Enter an invite code",
  "invite.err.codeNotFound": "Invite code not found",
  "invite.err.codeSelf": "You can’t use your own code",

  "admin.users.title": "Islanders",
  "admin.users.desc": "Manage islander accounts, roles, plans, and unlimited flags.",
  "admin.users.needAdmin": "Admin access required",
  "admin.users.list": "Islanders · {n}",
  "admin.users.detail": "Islander detail",
  "admin.users.pick": "Select an islander",
  "admin.users.search": "Search name / uid",
  "admin.users.searchPh": "Name, email, or uid",
  "admin.users.create": "Add islander",
  "admin.users.suspend": "Suspend",
  "admin.users.unsuspend": "Restore",
  "admin.users.suspended": "Suspended",
  "admin.users.active": "Active",
  "admin.users.onboarding": "First-run",

  "crew.title": "Accounts",
  "crew.tab.accounts": "Accounts",
  "crew.tab.personas": "Personas",
  "crew.connect": "Connect account",
  "crew.connecting": "Connecting…",
  "crew.tokenRenewHint": "Tokens auto-renew via background jobs (~day 30). Check Jobs; no manual refresh.",
  "crew.empty": "No accounts yet",
  "crew.loadFail": "Could not load accounts",
  "crew.unusable": "Unavailable",
  "crew.expires": "Expires {time}",
  "crew.lastRefresh": "Last extended {time}",
  "crew.refreshSession": "Extend token",
  "crew.refreshSessionHint": "Uses stored auth to refresh the token — no OAuth page. On failure, reconnect.",
  "crew.session.ok": "Token valid",
  "crew.session.soon": "Expiring soon",
  "crew.session.expired": "Token expired",
  "crew.session.unknown": "Expiry unknown",
  "crew.connection.connected": "Connected",
  "crew.connection.error": "Error",
  "crew.connection.disconnected": "Disconnected",
  "crew.connection.unknown": "Unknown",
  "crew.health.needsReconnect": "Reconnect required",
  "crew.health.needsReconnectHint": "Token unusable — use Connect account (not Extend token)",
  "crew.health.disconnectedHint": "Unlinked",
  "crew.health.expiredHint": "Extend token or reconnect",
  "crew.opHealthScore": "Health {n}",
  "crew.msg.refreshed": "@{user} token extended with stored auth (~60 days)",
  "crew.msg.refreshedAll": "Extended {n} account tokens with stored auth",
  "crew.msg.refreshFail": "Extend failed (reconnect if token is invalid)",
  "crew.msg.oauthOk": "Threads connected; token renew scheduled ~day 30 (see Jobs)",
  "crew.msg.oauthFail": "OAuth connection failed",
  "crew.msg.oauthUrlFail": "Could not get authorize URL. Try again or check platform Threads settings.",
  "crew.msg.deleted": "Removed @{user}",
  "crew.confirmDelete": "Delete account @{user}?\nIt can no longer be used as lead / cast.",

  "today.findTopic": "Find topics",
  "today.refreshTopics": "Refresh topics",
  "today.reload": "Reload",
  "today.loadFail": "Could not load Today",
  "today.trendsFail": "Could not refresh topics (quota or search not set)",
  "today.trendsUpdated": "Updated {n} topics",
  "today.syncPosts": "Sync own posts",
  "today.syncPostsFail": "Could not sync posts",
  "today.needAccount": "Connect a Threads account first",
  "today.outcome.title": "This week's outcomes",
  "today.outcome.reach": "Reach",
  "today.outcome.conversations": "Conversations",
  "today.outcome.follows": "Follows",
  "today.outcome.followsHint": "Possibly related, no strong signal yet",
  "today.outcome.followsConfirmedHint": " / confirmed {n}",
  "today.outcome.conversions": "Conversions",
  "today.outcome.emptyHint": "No patrol outreach outcomes this week yet — go give patrol a try?",
  "today.checkup.empty": "This week's checkup hasn't been generated yet. It runs automatically next Monday in your timezone.",
  "today.checkup.prefix": "Checkup: ",
  "today.pendingReplies": "Pending replies",
  "today.pendingRepliesN": "Pending · {n}",
  "today.newThread": "Compose",
  "today.metricsAria": "Today metrics",
  "today.metric.pending": "Pending",
  "today.metric.pendingHint": "Patrol queue",
  "today.metric.doneGoal": "Done / goal",
  "today.metric.doneGoalHint": "Patrol completions today / goal (mark published counts)",
  "today.metric.sentToday": "Sent today",
  "today.metric.running": "{n} in progress",
  "today.metric.sentDone": "Completed sends",
  "today.metric.failed": "Send issues",
  "today.metric.needAction": "Needs action",
  "today.metric.ok": "All good",
  "today.metric.mentions": "Mentions",
  "today.metric.mentionsHint": "Pending mentions",
  "today.pending.title": "Patrol pending · {n}",
  "today.pending.empty": "Nothing pending — run a patrol",
  "today.goScout": "Go patrol",
  "today.pending.more": "{n} more →",
  "today.pending.handle": "Handle in patrol",
  "today.pending.start": "Start handling",
  "today.topics.title": "Find topics",
  "today.topics.empty": "No topics yet — tap Refresh topics",
  "today.goStudio": "Open inspire",
  "today.heat": "Heat {n}",
  "today.topicAngle": "Good opening angle",
  "today.moreInspire": "More inspiration",
  "today.useTopic": "Brainstorm topic",
  "today.outbox.title": "Today's outbox",
  "today.outbox.empty": "No sends today. Try",
  "today.outbox.emptyMid": ", then check",
  "today.outbox.emptyEnd": ".",
  "today.outbox.summary": "Done {sent} · In progress {running} · Issues {failed}",
  "today.badge.failed": "Failed",
  "today.badge.scheduling": "Scheduled",
  "today.badge.sending": "Sending",
  "today.badge.drafted": "Drafted",
  "today.openOutbox": "Open outbox",
  "today.accounts.title": "Account performance",
  "today.accounts.empty": "No stats yet — sync own posts",
  "today.postsCount": "{n} posts",
  "today.views": "Views",
  "today.likes": "Likes",
  "today.repliesShort": "Replies",
  "today.fullInsights": "Full insights · MoM charts",
  "today.viewPosts": "View posts",
  "today.manageAccounts": "Manage accounts",


  "outbox.title": "Outbox",
  "outbox.tabsAria": "Outbox tabs",
  "outbox.tab.active": "Active",
  "outbox.tab.history": "History",
  "outbox.empty": "No outbox items",
  "outbox.activeEmpty": "Nothing in progress",
  "outbox.historyEmpty": "No history yet",
  "outbox.historyN": "History ({n})",
  "outbox.backActive": "Back to active ({n})",
  "outbox.progress": "Progress {progress}",
  "outbox.detail": "Details",
  "outbox.deleting": "Deleting…",
  "outbox.confirmDelete": "Delete outbox item “{title}”?\nThis cannot be undone.",
  "outbox.deleted": "Deleted “{title}”",
  "outbox.deleteFail": "Delete failed",
  "outbox.loadFail": "Failed to load outbox",
  "outbox.status.scheduling": "Scheduling",
  "outbox.status.active": "Sending",
  "outbox.status.completed": "Completed",
  "outbox.status.partial_failed": "Partial failure",
  "outbox.status.cancelled": "Cancelled",
  "outbox.detail.missingId": "Missing id",
  "outbox.detail.notFound": "Outbox item not found",
  "outbox.detail.loadFail": "Could not load this outbox item",
  "outbox.detail.loading": "Loading…",
  "outbox.detail.sendingHint": "Publishing to Threads (often 10–30s). This page updates automatically…",
  "outbox.detail.doneHint": "Published to Threads successfully.",
  "outbox.detail.markAllOk": "Mark all success",
  "outbox.detail.markRootFail": "Mark root failed",
  "outbox.detail.processing": "Working…",
  "outbox.detail.delete": "Delete this",
  "outbox.detail.back": "Back to list",
  "outbox.detail.root": "Root post",
  "outbox.detail.replyN": "Reply {n}",
  "outbox.detail.retry": "Retry",
  "outbox.detail.opFail": "Action failed",
  "outbox.step.published": "Published",
  "outbox.step.failed": "Failed",
  "outbox.step.publishing": "Publishing…",
  "outbox.step.scheduled": "Scheduled",
  "outbox.step.blocked": "Blocked",

  "studio.title": "Studio",
  "studio.account": "Account",
  "studio.persona": "Persona",
  "studio.personaReady": "Persona ready",
  "studio.personaNotReady": "Persona not ready",
  "studio.tab.posts": "My posts",
  "studio.tab.mentions": "Mentions @",
  "studio.tab.compose": "Compose",
  "studio.tab.plays": "Plays",
  "studio.tab.inspire": "Inspire",
  "studio.tab.insights": "Insights",

  "mentions.hint": "Who @ you. {n} pending. You can change account/persona per item (defaults from top bar).",
  "mentions.scoutLink": "Patrol outreach",
  "mentions.empty": "No mentions",
  "mentions.emptyHint": "Click “Sync from Threads” to pull posts/replies/quotes that @ you. Re-connect if missing threads_manage_mentions.",
  "mentions.needAccount": "Select a Threads account in the top bar first",
  "mentions.sync": "Sync from Threads",
  "mentions.syncing": "Syncing…",
  "mentions.syncDone": "Synced {n} mentions",
  "mentions.syncFail": "Sync failed — reconnect Threads with threads_manage_mentions scope",
  "mentions.openThread": "Open post",
  "mentions.status.pending": "Pending",
  "mentions.status.replied": "Replied",
  "mentions.status.skipped": "Skipped",
  "mentions.reply": "Reply",
  "mentions.skip": "Skip",
  "mentions.draftLabel": "Reply draft",
  "mentions.repliedPrefix": "Replied: {text}",
  "mentions.needPersona": "Pick a ready persona before AI draft",
  "mentions.fail": "Failed",
  "mentions.marked": "Mention marked as replied",
  "mentions.markReplied": "Mark as replied",
  "mentions.markingReplied": "Marking…",
  "mentions.withImages": " · {n} images",

  "compose.hint": "Publish only: write body and send to Outbox (not a play). For multi-account threads use",
  "compose.hintEnd": ".",
  "compose.playsLink": "Plays",
  "compose.personaOff": "Persona not ready: AI tools (mimic / analyze) disabled.",
  "compose.title": "Title (optional)",
  "compose.titlePh": "Helps identify in Outbox",
  "compose.body": "Body",
  "compose.bodyPh": "Write your post…",
  "compose.bodyCount": "{n} characters",
  "compose.bodyLongWarning": "The full draft is preserved, but it may exceed the Threads single-post limit",
  "compose.topicTag": "Topic tag (Threads)",
  "compose.topicTagPh": "e.g. petshow (optional #)",
  "compose.topicTagHint": "One topic tag per post, 1–50 chars, no . or &. You can also put #tag in the body.",
  "compose.whoCanReplyHint": "Applied when the post is published. Threads cannot change this on an existing post via API.",
  "compose.tool.mimic": "Mimic",
  "compose.tool.viral": "Viral analysis",
  "compose.tool.research": "Research",
  "compose.tool.image": "Image",
  "compose.mimic.title": "Mimic another post",
  "compose.mimic.source": "Source text",
  "compose.mimic.sourcePh": "Paste the post to mimic…",
  "compose.mimic.direction": "New topic or angle (optional)",
  "compose.mimic.directionPh": "e.g. Fewer features can make a product easier to use…",
  "compose.mimic.directionHint": "This drives the new post. Leave it blank and AI will choose a related but distinctly different angle.",
  "compose.mimic.structureNotes": "Structure notes (used in mimic)",
  "compose.mimic.structureNotesPh": "From Own posts → Analyze, or paste hooks/structure…",
  "compose.mimic.structureNotesHint": "Only the narrative skeleton, turns, and emotional arc are reused; content follows the new direction and selected persona.",
  "compose.mimic.broughtAnalysis": "Loaded source + structure analysis — mimic or edit notes",
  "compose.mimic.broughtSource": "Loaded source (no structure yet — analyze on Own posts first)",
  "compose.mimic.running": "Mimicking in background (you can leave)…",
  "compose.mimic.run": "Mimic into body",
  "compose.mimic.queued": "Mimic job queued — will fill the body when done",
  "compose.mimic.done": "Mimic done — edit as needed",
  "compose.mimic.doneWithStructure": "Mimic done (structure applied) — edit as needed",
  "compose.mimic.jobFail": "Mimic job failed: {err}",
  "compose.viral.title": "Viral analysis",
  "compose.viral.hint": "Hooks, structure, and copyable patterns from source or body.",
  "compose.viral.source": "Target (empty = use body)",
  "compose.viral.running": "Analyzing…",
  "compose.viral.run": "Analyze",
  "compose.viral.result": "Analysis",
  "compose.viral.done": "Viral analysis done",
  "compose.viral.needText": "Paste a reference or write the body first",
  "compose.research.title": "Research notes",
  "compose.research.q": "Keywords",
  "compose.research.qPh": "e.g. fragrance-free detergent sensitive skin",
  "compose.research.running": "Searching…",
  "compose.research.insert": "Insert selected into body",
  "compose.research.inserted": "Inserted {n} notes",
  "compose.image.title": "Generate image",
  "compose.image.prompt": "Scene description",
  "compose.image.promptPh": "Empty = summarize from body",
  "compose.image.running": "Generating…",
  "compose.image.run": "Generate image",
  "compose.image.done": "Image added",
  "compose.scheduleAt": "Publish at",
  "compose.scheduleHint": "Outbox sends at this time; must not be in the past.",
  "compose.scheduleHintNow": "Send immediately (timestamp taken at submit).",
  "compose.schedulePast": "Scheduled time is in the past. Set to now or a future time.",
  "compose.scheduleNow": "Now",
  "compose.publish": "Send to Outbox",
  "compose.publishing": "Sending…",
  "compose.uploadingImages": "Uploading image {n}/{total}…",
  "compose.uploadImageFail": "Image upload failed — retry or use a smaller file (≤5MB)",
  "compose.waitImageUpload": "Images still uploading — wait a moment.",
  "compose.waitImageUploadBtn": "Uploading images…",
  "compose.imageUploadNeedRetry": "Some images failed — tap retry on the thumbnail.",
  "compose.publishFail": "Send failed",
  "compose.fail": "Failed",
  "compose.attachN": "{n} images",
  "compose.personaStatus": "Persona: {status}",
  "compose.ready": "ready",
  "compose.notReady": "not ready",

  "posts.sync": "Resync Threads",
  "posts.syncing": "Syncing…",
  "posts.syncedAt": "Synced {time}",
  "posts.notSynced": "Not synced",
  "posts.syncDone": "Synced {n} posts from Threads (metrics + replies)",
  "posts.syncFail": "Sync failed — reconnect Threads if permissions are missing",
  "posts.loadingReplies": "Loading replies…",
  "posts.loadRepliesFail": "Could not load replies",
  "posts.empty": "No posts yet",
  "posts.openThreads": "Open Threads",
  "posts.whoCanReply": "Who can reply",
  "posts.replyControl.everyone": "Everyone",
  "posts.replyControl.accounts_you_follow": "Profiles you follow",
  "posts.replyControl.mentioned_only": "Mentioned only",
  "posts.replyControl.parent_post_author_only": "Parent post author only",
  "posts.replyControl.followers_only": "Followers only",
  "posts.replyControlUpdated": "Updated to “{label}”. Open Threads to verify.",
  "posts.replyControlFail": "Could not update who can reply",
  "posts.replyControlPublishOnly": "Threads can only set who can reply when publishing. Published posts cannot be changed via API — create a new post in Compose.",
  "posts.hideReply": "Hide reply",
  "posts.unhideReply": "Unhide reply",
  "posts.hidingReply": "Working…",
  "posts.replyHidden": "Reply hidden on Threads. Open Threads to verify.",
  "posts.replyUnhidden": "Reply unhidden on Threads. Open Threads to verify.",
  "posts.hideFail": "Hide / unhide failed",
  "posts.hiddenBadge": "Hidden",
  "posts.insight": "Insight: {text}",
  "posts.review": "Review: {text}",
  "posts.formulaResult": "Structure analysis",
  "posts.analyzedBadge": "Analyzed",
  "posts.noText": "(No text / media-only)",
  "posts.collapseReplies": "Collapse replies",
  "posts.repliesBtn": "Replies ({total}) · pending {pending}",
  "posts.replyRoot": "Reply to post",
  "posts.analyzing": "Analyzing…",
  "posts.reanalyze": "Re-analyze structure",
  "posts.analyze": "Analyze structure",
  "posts.mimicThis": "Mimic this",
  "posts.rootDraft": "Root reply draft",
  "posts.filter.pending": "Pending ({n})",
  "posts.filter.replied": "Replied ({n})",
  "posts.filter.all": "All ({n})",
  "posts.noPending": "No pending replies",
  "posts.noReplied": "No replied items yet",
  "posts.noReplies": "No replies yet",
  "posts.status.pending": "Pending",
  "posts.status.replied": "Replied",
  "posts.likesN": "{n} likes",
  "posts.childCount": "{n} child replies",
  "posts.mine": "Ours",
  "posts.replyThis": "Reply",
  "posts.replyAgain": "Reply again",
  "posts.replyTo": "Reply to @{user}",
  "posts.replyAgainTo": "Reply again to @{user}",
  "posts.needPersona": "Pick a ready persona before AI draft",
  "posts.genFail": "Generate failed",
  "posts.needText": "Generate or type a reply first",
  "posts.needAccount": "Pick a Threads account to send",
  "posts.sending": "Publishing to Threads…",
  "posts.sent": "Sent to Threads as @{user}",
  "posts.sentImages": " ({n} images)",
  "posts.accountFallback": "account",
  "posts.sendFail": "Send failed",
  "posts.analyzeDone": "Structure analysis done (manual)",
  "posts.analyzeFail": "Analyze failed",

  "wizard.newTitle": "New play",
  "wizard.editTitle": "Edit play",
  "wizard.prev": "Back",
  "wizard.next": "Next",
  "wizard.err.topic": "Enter a topic",
  "wizard.err.lead": "Select a lead account",
  "wizard.err.leadUnusable": "Lead account unavailable",
  "wizard.submitFail": "Submit failed",
  "wizard.unnamedPlay": "Untitled play",
  "wizard.step.topic": "Topic",
  "wizard.step.crew": "Cast",
  "wizard.step.script": "Script",
  "wizard.step.preview": "Preview",
  "wizard.step.schedule": "Schedule",
  "wizard.step.submit": "Submit",
  "wizard.stepperAria": "Wizard steps",
  "wizard.topic.title": "1. What is this thread about?",
  "wizard.topic.name": "Title (optional)",
  "wizard.topic.namePh": "e.g. Weekend coffee",
  "wizard.topic.topic": "One-line topic",
  "wizard.topic.topicPh": "What should this thread discuss?",
  "wizard.topic.aiView": "AI persona view",
  "wizard.topic.personaNotReady": "Persona not ready",
  "wizard.topic.quickFill": "Quick fill",
  "wizard.topic.sampleTitle": "Weekend coffee chat",
  "wizard.topic.sampleTopic": "Looking for a reliable café this weekend — lots of outlets, stay-all-day friendly.",
  "wizard.crew.title": "2. Cast",
  "wizard.crew.lead": "Lead",
  "wizard.crew.noUsable": "No usable accounts",
  "wizard.crew.unusable": "Unavailable",
  "wizard.crew.cast": "Supporting",
  "wizard.script.title": "3. Lines",
  "wizard.script.persona": "Persona",
  "wizard.script.personaNotReady": "Persona not ready",
  "wizard.script.root": "Root post",
  "wizard.script.replyN": "Reply {n}",
  "wizard.script.generating": "Generating…",
  "wizard.script.ai": "AI draft",
  "wizard.script.account": "Account: {name}",
  "wizard.script.noLead": "(no lead)",
  "wizard.script.speaker": "Speaker",
  "wizard.script.leadTag": "(lead)",
  "wizard.script.text": "Copy",
  "wizard.script.rootPh": "Root post text…",
  "wizard.script.replyPh": "Reply text…",
  "wizard.script.addReply": "Add reply step",
  "wizard.preview.title": "4. Preview the thread",
  "wizard.preview.unknown": "Unknown",
  "wizard.preview.unknownAccount": "Unknown account",
  "wizard.preview.root": "Root",
  "wizard.preview.leadTalk": "lead reply",
  "wizard.preview.empty": "(empty)",
  "wizard.schedule.title": "5. When to send",
  "wizard.schedule.start": "First post (root) time",
  "wizard.schedule.interval": "Reply interval (minutes)",
  "wizard.schedule.intervalHint": "Relative to previous step; backend adds random jitter so timing is less robotic",
  "wizard.submit.title": "6. Submit schedule",
  "wizard.submit.body": "Confirm to send “{title}” ({n} steps) to Outbox and publish in order.",
  "wizard.submit.unnamed": "Untitled",
  "wizard.submit.root": "Root",
  "wizard.submit.replyN": "Reply {n}",
  "wizard.submit.submitting": "Submitting…",
  "wizard.submit.run": "Submit to Outbox",

  "reply.account": "Reply as",
  "reply.persona": "Persona",
  "reply.notReady": "This persona is not ready for AI draft (you can still type and send).",
  "reply.draft": "Reply draft",
  "reply.attach": "Attach",
  "reply.generating": "Generating…",
  "reply.ai": "AI draft",
  "reply.sending": "Sending…",
  "reply.send": "Send",

  "image.attach": "Attach",
  "image.attachFail": "Attach failed",
  "image.attachedAria": "Attached images",
  "image.alt": "Attachment",
  "image.named": "Image {n}",
  "image.remove": "Remove image",
  "image.full": "Full ({max})",
  "image.more": "Add more ({n}/{max})",
  "image.uploading": "Uploading",
  "image.uploadingN": "Uploading {n} image(s)…",
  "image.uploadFail": "Upload failed",
  "image.uploadBadUrl": "Invalid upload response",
  "image.retry": "Retry",

  "metrics.aria": "Post metrics",
  "metrics.like": "Likes",
  "metrics.reply": "Replies",
  "metrics.repost": "Reposts",
  "metrics.quote": "Quotes",
  "metrics.view": "Views",
  "metrics.share": "Shares",
  "metrics.type.quote": "Quote",
  "metrics.type.reply": "Reply",
  "metrics.type.image": "Image",
  "metrics.type.video": "Video",
  "metrics.type.carousel": "Carousel",
  "metrics.type.repost": "Repost",
  "metrics.type.text": "Text",
  "metrics.type.post": "Post",

  "jobs.title": "Jobs",
  "jobs.desc": "Jobs in three tabs: active, scheduled, and history. Paginated so we never load everything at once.",
  "jobs.startDemo": "Create test job",
  "jobs.demoHint": "Requires worker; list auto-refreshes while jobs are active.",
  "jobs.demoLabel": "Demo test job",
  "jobs.demoCreated": "Test job {id}… created — waiting for worker",
  "jobs.demoFail": "Could not create test job",
  "jobs.template.tokenRenew": "Threads token renew (~every 30 days)",
  "jobs.template.tokenRenewCadence": "Runs about every 30 days · no manual action needed",
  "jobs.template.tokenRenewBadge": "Recurring · every 30 days",
  "jobs.template.personaAnalyzeAccount": "Persona analyze · public posts",
  "jobs.template.personaAnalyzeText": "Persona analyze · from text",
  "jobs.template.composeMimic": "Mimic post",
  "jobs.template.playGenerateScript": "Play full-script AI",
  "jobs.template.radarSweep": "Demand patrol",
  "jobs.template.unknown": "Other job",
  "jobs.stripMore": "+{n} more running…",
  "jobs.nextRun": "Next run: {time}",
  "jobs.status.pending": "Pending",
  "jobs.status.queued": "Scheduled",
  "jobs.status.running": "Running",
  "jobs.status.succeeded": "Succeeded",
  "jobs.status.failed": "Failed",
  "jobs.status.cancelled": "Cancelled",
  "jobs.status.cancel_requested": "Cancel requested",
  "jobs.loadFail": "Could not load jobs",
  "jobs.empty": "No jobs yet",
  "jobs.empty.active": "No running or ready-to-claim jobs",
  "jobs.empty.recurring": "No scheduled / recurring jobs yet",
  "jobs.empty.history": "No history yet (succeeded / failed / cancelled)",
  "jobs.tabsAria": "Job categories",
  "jobs.tab.active": "Active",
  "jobs.tab.recurring": "Scheduled",
  "jobs.tab.history": "History",
  "jobs.recurringHint": "Future schedules (e.g. token renew in ~30 days). When due, they appear under Active.",
  "jobs.total": "{n} total",
  "jobs.showing": " · showing first {n}",
  "jobs.detail": "Details",
  "jobs.loadMore": "Load more ({n} more)",
  "jobs.notFound": "Job not found",
  "jobs.detailLoadFail": "Could not load this job",
  "jobs.progress": "Progress {n}%",
  "jobs.updated": "Updated {time}",
  "jobs.backList": "Back to list",
  "jobs.backCompose": "Back to compose",
  "jobs.mimicApplyCompose": "Apply to compose",
  "jobs.mimicApplyHint": "Mimic finished. Use the button below to return to single-post compose with the draft filled in.",
  "jobs.mimicNoResult": "No mimic result found — run mimic again",
  "jobs.mimicApplyFail": "Could not apply result",
  "jobs.delete": "Delete",
  "jobs.deleteConfirm": "Delete “{name}”? This cannot be undone.",
  "jobs.deleted": "Job deleted",
  "jobs.deleteFail": "Could not delete job",
  "jobs.deleteRunningHint": "Running jobs cannot be deleted. Wait until they finish.",
  "jobs.retentionHint": "Terminal jobs are auto-removed after about 2 days",

  "plans.title": "Change plan",
  "plans.current": "Current plan",
  "plans.perMonth": "/mo",
  "plans.monthlyCredits": "{n} credits / month",
  "plans.usageLink": "Usage",
  "plans.inUse": "Active",
  "plans.recommended": "Recommended",
  "plans.creditsPerMonth": "{n} credits / month",
  "plans.manage": "Manage subscription",
  "plans.loadFail": "Could not load your subscription",

  "plan.cta.current": "Current plan",
  "plan.cta.upgrade": "Upgrade",
  "plan.cta.downgrade": "Downgrade",
  "plan.cta.switch": "Switch",

  "plan.free.headline": "Enough to try the full product",
  "plan.free.bullet1": "{n} credits / month (~2–3 weeks light use)",
  "plan.free.bullet2": "Full product: Studio, Patrol, Outbox, images",
  "plan.free.bullet3": "Feel the value, then upgrade to Starter",
  "plan.free.bullet4": "When platform is busy, add your own key",
  "plan.free.right1": "Full access to accounts, Studio, Patrol, Outbox, jobs, and inspiration.",
  "plan.free.right2": "Enough credits for real copy, search, and a few images—not a hollow demo.",
  "plan.free.right3": "After the cap, upgrade to Starter—or set BYOK so you don't use platform credits.",
  "plan.free.quota1": "{n} credits allocated each month.",
  "plan.free.note1": "Free requires no payment; paid subscribers manage cancellation in the billing portal.",
  "plan.free.note2": "After cancellation, the plan changes on the date shown in the billing portal.",

  "plan.starter.headline": "Small teams posting and patrolling daily",
  "plan.starter.bullet1": "{n} credits / month (about 5× Free)",
  "plan.starter.bullet2": "Steady posting, replies, and patrol",
  "plan.starter.bullet3": "Fits a 1–3 person cadence · main paid tier",
  "plan.starter.bullet4": "Takes effect right after payment",
  "plan.starter.right1": "After payment this account becomes Starter; the month uses the new quota.",
  "plan.starter.right2": "Credits support regular posts, reply drafts, and scheduled patrol.",
  "plan.starter.right3": "Same features as Free; you buy more headroom. Best starting paid plan.",
  "plan.starter.quota1": "{n} credits / month · {price}.",
  "plan.starter.note1": "Plan changes only after successful payment.",
  "plan.starter.note2": "Resets on calendar month; unused credits do not roll over.",

  "plan.pro.headline": "Multi-account, heavy AI and research",
  "plan.pro.bullet1": "{n} credits / month (about 3× Starter)",
  "plan.pro.bullet2": "High-volume copy, research, and images · heavy ceiling",
  "plan.pro.bullet3": "Built for agencies and multi-brand work",
  "plan.pro.bullet4": "Takes effect right after payment",
  "plan.pro.right1": "After payment this account becomes Pro; the month uses Pro quota.",
  "plan.pro.right2": "Fits multi-account replies and deep research with less risk of running out mid-month.",
  "plan.pro.right3": "Same features; you buy capacity. Beyond this, use BYOK—still works when platform is limited.",
  "plan.pro.quota1": "{n} credits / month · {price}.",
  "plan.pro.note1": "Failed payment does not change your plan.",
  "plan.pro.note2": "After payment you can find receipts in billing history.",

  "plan.quota2": "Per-feature credits: copy {copy} (~{copyCalls} uses), research {research} (~{researchCalls}), search {search} (~{searchCalls}), image {image} (~{imageCalls} images).",
  "plan.softCapsLine": "Credits: copy {copy} · research {research} · search {search} · image {image}",
  "plan.approxCallsLine": "About {copyCalls} copy · {researchCalls} research · {searchCalls} search · {imageCalls} images",

  "checkout.title": "Confirm plan",
  "checkout.pickFirst": "Please choose a plan first.",
  "checkout.viewPlans": "View plans",
  "checkout.fail": "Could not complete",
  "checkout.confirmFree": "Confirm switch to Free",
  "checkout.payAndAction": "{action} and pay {price}",
  "checkout.subscribe": "Subscription",
  "checkout.perMonth": "/mo",
  "checkout.monthlyCredits": "{n} credits per month",
  "checkout.youGet": "What you get",
  "checkout.quota": "Quota",
  "checkout.notes": "Notes",
  "checkout.amountDue": "Amount due",
  "checkout.billedMonthly": "{name} · billed monthly",
  "checkout.already": "Already on this plan",
  "checkout.processing": "Processing…",
  "checkout.currentPlan": "Current plan",
  "checkout.pickOther": "Choose another plan",
  "checkout.cancel": "Cancel",
  "checkout.invalidUrl": "The billing service returned an unsafe URL. No redirect was made.",
  "checkout.redirecting": "Taking you to Stripe's secure checkout…",
  "checkout.redirectingPortal": "Taking you to the Stripe subscription portal…",
  "checkout.redirectFailed": "Stripe could not be opened. Check your browser or network settings and try again.",
  "checkout.networkError": "Could not connect to the billing service. Check your network and try again.",
  "checkout.unavailable": "Billing is not enabled or is temporarily unavailable. Please try again later.",
  "checkout.sessionExpired": "Your session has expired. Sign in again and retry.",
  "checkout.portalUnavailable": "There is no Stripe subscription to manage yet. Choose a paid plan first.",
  "checkout.verifying": "Confirming payment and plan activation…",
  "checkout.pollFail": "Could not check the payment status. Please retry.",
  "checkout.missingId": "The checkout ID is missing, so the payment result cannot be verified.",
  "checkout.terminalFail": "Checkout did not complete ({status}). Choose a plan and try again.",
  "checkout.timeout": "Payment may still be processing, but the plan was not activated within 30 seconds. Retry the status check; do not pay again.",
  "checkout.retry": "Retry status check",
  "checkout.canceledTitle": "Checkout canceled",
  "checkout.canceledBody": "Your plan was not changed and no payment action was performed.",
  "checkout.manageInstead": "Manage this change in the billing portal to avoid a duplicate subscription.",

  "usage.widget.titleUsed": "{name} · used {used}/{cap} credits",
  "usage.widget.titleUnlimited": "{name} · unlimited",
  "usage.widget.ariaUsed": "Used {used} of {cap} credits",
  "usage.widget.dialog": "Plan and usage",
  "usage.widget.currentPlan": "Current plan",
  "usage.widget.unlimited": "Unlimited",
  "usage.widget.perMonth": "/mo",
  "usage.widget.monthUsage": "This month",
  "usage.widget.remaining": "{n} credits left",
  "usage.widget.leftShort": "{n} left",
  "usage.widget.usedOfCap": "{used}/{cap}",
  "usage.widget.overShort": "Over",
  "usage.widget.upgradeShort": "Upgrade",
  "usage.widget.upgrade": "Upgrade",
  "usage.widget.includes": "This plan includes",
  "usage.widget.nudge": "You're running low this month. Upgrade for more credits right away.",
  "usage.widget.changePlan": "Change plan",
  "usage.widget.usageDetail": "Usage details",

  "usage.meter.ai_copy": "AI copy",
  "usage.meter.ai_research": "AI research",
  "usage.meter.web_search": "Search",
  "usage.meter.ai_image": "AI image",
  "usage.meter.barAria": "{label} {credits}/{cap} credits ({count} runs)",
  "usage.ledger.costAria": "Used {n} credits",
  "usage.event.keyMode.platform": "Platform credits",
  "usage.event.keyMode.byok": "Your own key",
  "usage.event.cost.credits": "−{n}",
  "usage.event.cost.byok": "BYOK",
  "usage.event.cost.byokAria": "Own key — no platform credits charged",
  "usage.event.label.unknown": "Usage",
  "usage.event.label.genericAi": "AI call",
  "usage.event.label.personaAnalyzeText": "Persona analyze · text",
  "usage.event.label.personaAnalyzeAccount": "Persona analyze · account",
  "usage.event.label.composeMimic": "Mimic post",
  "usage.event.label.composeViral": "Viral analysis",
  "usage.event.label.personaPreview": "Persona preview",
  "usage.event.label.ownPostReply": "Own post · reply draft",
  "usage.event.label.mentionReply": "Mention · reply draft",
  "usage.event.label.inspireChat": "Inspire chat",
  "usage.event.label.researchSearch": "Research search",
  "usage.event.label.generateImage": "Generate image",
  "usage.event.label.search": "Web search",
  "usage.event.label.aiComplete": "AI complete",
  "usage.event.source.personaAnalyzeText": "Persona analyze · text",
  "usage.event.source.personaAnalyzeAccount": "Persona analyze · account",
  "usage.event.source.composeMimic": "Mimic post",
  "usage.event.source.composeViral": "Viral analysis",
  "usage.event.source.personaPreview": "Persona preview",
  "usage.event.source.ownPostAnalyze": "Own post · structure analysis",
  "usage.event.source.ownPostReply": "Own post · reply draft",
  "usage.event.source.mentionReply": "Mention · reply draft",
  "usage.event.source.inspireChat": "Inspire chat",
  "usage.event.source.researchSearch": "Research search",
  "usage.event.source.generateImage": "Generate image",
  "usage.event.source.proxySearch": "Web search",
  "usage.event.source.proxyAi": "AI complete",

  "usage.chart.period": "Period",
  "usage.chart.allocated": "Allocated",
  "usage.chart.consumed": "Used",
  "usage.chart.pctTitle": "Usage as share of allocation",
  "usage.chart.aria": "Allocation and usage",
  "usage.chart.colAria": "{label}: allocated {purchased}, used {consumed}",

  "settings.provider": "Provider",
  "settings.model": "Model",
  "settings.aiUnifiedHint": "Copy, research, and expand all share one provider and model.",
  "settings.fetchModels": "Fetch models",
  "settings.fetchingModels": "Loading…",
  "settings.apiKey": "API key",
  "settings.configured": "Configured",
  "settings.notConfigured": "Not set",
  "settings.platformKeyOk": "Platform key available (optional override)",
  "settings.modelsHint": "Models",
  "settings.modelsCached": "Models from cache (~5 min)",
  "settings.modelsLoaded": "Loaded models for {provider}",
  "settings.aiSaved": "AI settings saved",
  "settings.searchSaved": "Search settings saved",
  "settings.clearAiKey": "Clear personal AI key",
  "settings.aiKeyCleared": "Personal AI key cleared",
  "settings.clearExaKey": "Clear Exa key",
  "settings.exaKeyCleared": "Exa key cleared",
  "settings.searchProvider": "Search provider",
  "settings.expand": "Expand strategy",
  "settings.exaKey": "Exa API key",
  "settings.devMode": "Test patrol (local session)",
  "settings.devModeHint": "When on, test patrol can use a synced Chrome sign-in. Live publish/replies still use the official API.",
  "settings.ext.title": "Chrome extension",
  "settings.ext.desc": "Install this extension (v1.2.0+) to sync a Threads sign-in from Chrome for test patrol.",
  "settings.ext.step1": "Download and unzip to get the haixun-threads-sync folder",
  "settings.ext.step2": "Open chrome://extensions and enable Developer mode",
  "settings.ext.step3": "Load unpacked (or click Reload if already installed)",
  "settings.ext.step4": "Set this site’s URL in extension options (must match address bar), then refresh Lapras",
  "settings.ext.download": "Download extension (ZIP)",
  "settings.ext.sessionTitle": "Chrome session (test patrol)",
  "settings.ext.sessionHint": "Sync sign-in from a logged-in Threads tab for test patrol. Live publish still uses the official API.",
  "settings.ext.pageOrigin": "This tab: {origin}",
  "settings.ext.detected": "Extension detected",
  "settings.ext.notReady": "Extension not detected",
  "settings.ext.synced": "Session synced",
  "settings.ext.notSynced": "Session not synced",
  "settings.ext.syncBtn": "Sync session from Chrome",
  "settings.ext.recheck": "Recheck",
  "settings.ext.syncOk": "Chrome session synced for test patrol",
  "settings.ext.syncFail": "Chrome session sync failed",
  "settings.ext.needLogin": "Please sign in to Lapras before syncing.",
  "settings.ext.notDetected": "Chrome extension not found on {origin}. Use v1.2.1+: reload in chrome://extensions → set Options Server URL to the same origin and Save → F5 this tab.",
  "settings.ext.reloadHint": "After install/update, reload the extension and press F5 on this page.",
  "settings.ext.detectSteps": "Installed but not detected? ① chrome://extensions → enable and Reload (v1.2.1+) ② Extension Options → set Server URL to {origin} and Save (Allow) ③ Hard-refresh this tab (F5). Do not mix localhost and 127.0.0.1.",

  "forgot.fail": "Request failed",
  "forgot.mockHint": "In production this goes to email; here is a direct link:",
  "forgot.checkInbox": "Please check your inbox (and spam).",

  "reset.mismatch": "Passwords do not match",
  "reset.fail": "Reset failed",
  "reset.cardTitle": "Reset password",
  "reset.redirecting": "Redirecting to sign in…",
  "reset.loginNow": "Sign in now",
  "reset.passwordPh": "Password must be at least 12 characters with upper, lower, digit, and symbol",
  "reset.forgotLink": "Request a new reset",

  "verify.sendFail": "Could not send",
  "verify.fail": "Verification failed",
  "verify.success": "Email verified. You can use Lapras now.",
  "verify.codePh": "6-digit code",
  "verify.currentAccount": "Account: {email}",

  "login.brandTitle": "巡樓 · Lapras",

  "home.navLabel": "Public navigation",
  "public.localeLabel": "Language",
  "home.heroTitle": "Find clients on Threads. Follow through to a win.",
  "home.heroLead": "Daily demand lists, replies, and follow-ups on one desk.",
  "home.outcomesTitle": "What you get",
  "home.outcome.find.title": "People looking for you",
  "home.outcome.find.body": "Keyword watches refresh daily; run a manual patrol when you need it.",
  "home.outcome.reply.title": "Replies that fit",
  "home.outcome.reply.body": "Drafts follow your services and tone; forbidden words stay out.",
  "home.outcome.close.title": "Follow-ups that close",
  "home.outcome.close.body": "One contact per person, with stages and reminders.",
  "home.productTitle": "What you’ll use",
  "home.productLead": "Demand, patrol, replies, CRM, and send — one desk.",
  "home.preview.radar.title": "Today’s demand",
  "home.preview.radar.caption": "Keyword watches refresh a daily list of needs",
  "home.preview.scout.title": "Patrol",
  "home.preview.scout.caption": "Run a manual sweep when you want hits now",
  "home.preview.studio.title": "Replies & Studio",
  "home.preview.studio.caption": "Drafts match your services and tone",
  "home.preview.crm.title": "Pipeline",
  "home.preview.crm.caption": "One contact card per person — stages and follow-ups",
  "home.preview.outbox.title": "Outbox",
  "home.preview.outbox.caption": "Scheduled, ready, and sent in one queue",
  "home.preview.mock.radar.badge": "Today · high match",
  "home.preview.mock.radar.meta": "3 new needs",
  "home.preview.mock.radar.row1": "Taipei · moving quote",
  "home.preview.mock.radar.row2": "Looking for home cleaning",
  "home.preview.mock.radar.row3": "Freelance design · budget ready",
  "home.preview.mock.scout.badge": "Keyword scan",
  "home.preview.mock.scout.hit": "Anyone recommend an accountant?",
  "home.preview.mock.scout.snippet": "Need someone for small-company tax…",
  "home.preview.mock.scout.hit2": "Has anyone tried that SaaS?",
  "home.preview.mock.studio.tab1": "Inspire",
  "home.preview.mock.studio.tab2": "Reply",
  "home.preview.mock.studio.tab3": "Schedule",
  "home.preview.mock.studio.draft1": "Hi — saw you’re looking for movers.",
  "home.preview.mock.studio.draft2": "We cover metro Taipei; happy to estimate first.",
  "home.preview.mock.studio.draft3": "(From your service profile & forbidden words)",
  "home.preview.mock.crm.col1": "New",
  "home.preview.mock.crm.col2": "Talking",
  "home.preview.mock.crm.col3": "Won",
  "home.preview.mock.crm.foot": "Due follow-ups & reminders",
  "home.preview.mock.outbox.r1": "Reply · tonight 20:00",
  "home.preview.mock.outbox.r2": "Post · needs review",
  "home.preview.mock.outbox.r3": "Sent · syncing metrics",
  "home.pricingTitle": "Plans",
  "home.pricingLead": "Same features; monthly credits differ.",
  "home.pricingHoverHint": "Hover the credit line to see what each plan covers.",
  "home.ctaLogin": "Sign in",
  "home.privacyLink": "Privacy",
  "home.termsLink": "Terms",
  "home.dataDeletionLink": "Data deletion",
  "legal.footerNav": "Legal links",

  "privacy.navLabel": "Privacy policy navigation",
  "privacy.title": "Privacy Policy",
  "privacy.updated": "Last updated: 2026-07-31",
  "privacy.intro":
    "This Privacy Policy explains how Lapras (巡樓, “the Service”, “we”) collects, uses, stores, shares, and deletes your personal data and Meta/Threads platform data. It covers the Lapras web console, public tools, and processing related to Threads accounts you connect via OAuth. Using the Service means you acknowledge this policy.",
  "privacy.section.overview.title": "1. Controller and scope",
  "privacy.section.overview.body":
    "The Lapras operator is the controller of personal data described here.\nThis policy covers: member accounts, workspace content, usage and payment identifiers, and platform data we obtain from Meta/Threads APIs after you authorize us.\nIf you join someone else’s workspace, that owner may have extra rules; they do not replace this notice for platform- and member-level data.\nThis is our own policy, not Meta’s, Threads’, or Instagram’s. See Meta’s Privacy Center for how Meta processes data in its products.",
  "privacy.section.collect.title": "2. What information we collect",
  "privacy.section.collect.body":
    "(A) Data you provide\n• Account: email, display name, password hash (never plaintext passwords), role, email verification status.\n• Content you enter: personas, brands, patrol intents/keywords, drafts, reply copy, Outbox items, workspace settings, and uploaded media if any.\n• Support/privacy requests: emails and request details you send us.\n\n(B) Data collected automatically\n• Login sessions, IP, basic browser/device metadata (security, debugging, abuse prevention).\n• UI preferences (language, theme).\n• Feature usage and job logs (quotas, diagnostics).\n\n(C) Meta/Threads platform data (only after you connect)\n• Threads user identifiers (e.g. user id, username) and profile summary within granted scopes.\n• Posts, replies, media metadata, and API responses needed to read/send/insights within granted permissions.\n• Access tokens (and related refresh credentials) used only to call Threads APIs on your behalf; stored separately from member JWTs.\n\n(D) Billing (if enabled)\n• Plan tier, quota usage, payment transaction identifiers (we do not store full card numbers).\n\nWe do not require unrelated government ID for ordinary use.",
  "privacy.section.use.title": "3. How we use data and why",
  "privacy.section.use.body":
    "We process data to:\n• Provide accounts, workspaces, permissions, and sign-in security.\n• Run core features: patrol/outreach, create and AI assist, Outbox schedule/send, account and post sync, insights and metering.\n• Call Meta/Threads APIs with your tokens (read authorized content, publish content you confirm, etc., subject to granted scopes).\n• Send verification codes, password resets, and service notices.\n• Prevent abuse, keep the Service reliable, debug and improve (de-identified where practical).\n• Comply with law or valid legal requests.\n\nWe do not sell Meta/Threads platform data to data brokers, and we do not use that data to build independent marketing profiles unrelated to providing the Service.",
  "privacy.section.threads.title": "4. Threads / Meta platform data",
  "privacy.section.threads.body":
    "Connection: you authorize Lapras via Meta OAuth for Threads. We request and use only permissions needed for product features (e.g. basic profile, content publish, and other scopes shown in the authorization UI).\n\nUse limits: Platform Data from Meta is used only to provide, maintain, and improve Lapras features you use (connect accounts, sync posts, schedule/send replies or posts, show status, debug). We do not sell Platform Data or use it for advertising targeting unrelated to your authorization.\n\nStorage: Threads credentials are kept separate from member sign-in credentials; access is permission-controlled by workspace/account.\n\nYou may at any time:\n• Disconnect Threads inside Lapras; and/or\n• Revoke the app in Meta/Threads/Instagram settings.\nAfter disconnect we stop new API access and handle deletion/anonymization under Section 8.\n\nMeta’s own processing is governed by Meta’s policies; we do not control Meta’s systems.",
  "privacy.section.share.title": "5. Sharing and processors",
  "privacy.section.share.body":
    "We may share data with or have it processed by:\n• Infrastructure: hosting, databases, object storage, email delivery, monitoring/logs (to run the Service).\n• AI/search providers: when you use inspire, analysis, or suggestion features (see Section 6).\n• Payment processors: when billing is enabled.\n• Legal: when required by law or valid authority.\n• Business transfers: merger/acquisition under applicable law and notice.\n\nProcessors may only process under our instructions with reasonable security. We do not sell personal data.",
  "privacy.section.ai.title": "6. AI and automated processing",
  "privacy.section.ai.body":
    "Some features send prompts, post samples, structured notes, or summaries of authorized public content to AI/search providers for suggestions, style analysis, or retrieval.\nYou may use platform defaults or BYOK keys; with BYOK, requests go to your provider—read their terms too.\nWe do not use your content as public marketing or advertised training material without separate consent.",
  "privacy.section.retention.title": "7. Retention",
  "privacy.section.retention.body":
    "• Account and workspace data: while the account is active.\n• Threads tokens: while connected; invalidated/removed after disconnect or deletion requests.\n• Job logs, usage, security records: for a reasonable period for operations, disputes, and law, then delete or anonymize.\n• Backups: may retain residual copies until rotation completes.\nSee Section 8 and the Data deletion page for how to request deletion.",
  "privacy.section.deletion.title": "8. How to request deletion of your data",
  "privacy.section.deletion.body":
    "You can request deletion of personal data and platform data we hold about you as follows:\n\nOption 1 (recommended): Sign in to Lapras → disconnect Threads in account/settings, then use any in-product account/data deletion flow if available.\n\nOption 2: Email the Service operator from your registered email address. Subject: “Data Deletion Request”. Include:\n• Registered email\n• Threads username or in-app account id if known\n• Scope (entire account / Threads connection data only / specific workspace)\n\nOption 3: If you remove our app in Meta and request deletion, follow Meta’s flow. We also process platform deletion callbacks when provided; otherwise still use Option 2.\n\nFull steps are on the Data deletion page (/data-deletion).\nAfter identity verification we delete or anonymize within a reasonable period (typically 30 days, or sooner/later if law requires), except records we must retain by law.",
  "privacy.section.rights.title": "9. Your rights",
  "privacy.section.rights.body":
    "Where applicable law allows, you may request access, correction, portability, deletion, restriction, or objection to certain processing. You may sign out, edit profile data, disconnect Threads, or stop using the Service. Contact us per Section 12; we may need to verify identity.",
  "privacy.section.security.title": "10. Security",
  "privacy.section.security.body":
    "We use reasonable technical and organizational measures, including HTTPS, password hashing, permission isolation, and separating member credentials from Threads tokens. No system is perfectly secure; we notify of incidents as required by law or policy.",
  "privacy.section.children.title": "11. Children",
  "privacy.section.children.body":
    "The Service is intended for creators and business operators, not children. We do not knowingly collect personal data from children under the applicable age (e.g. 13, or a higher age where required). Contact us under Section 12 if you believe we collected a child’s data; we will delete it promptly.",
  "privacy.section.contact.title": "12. Contact us",
  "privacy.section.contact.body":
    "For privacy questions or access/correction/deletion requests, contact the Service operator using your registered email. Subject: “Privacy / Data Request”. Include your account email and details so we can verify identity.\nYou may also use in-product profile/settings after sign-in.",
  "privacy.section.updates.title": "13. Updates",
  "privacy.section.updates.body":
    "We may update this policy for features, Meta platform rules, or law. We change the “Last updated” date; for material changes we may also notify in-product or by email. Continued use after an update means you acknowledge the revised policy to the extent permitted by law.",
  "privacy.backHome": "Back to intro",

  "terms.navLabel": "Terms of service navigation",
  "terms.title": "Terms of Service",
  "terms.updated": "Last updated: 2026-07-31",
  "terms.intro":
    "Welcome to Lapras (巡樓). These Terms of Service govern your use of the web console, public tools, and related features. By using the Service you agree to these Terms. If you do not agree, do not use the Service.",
  "terms.section.acceptance.title": "1. Acceptance",
  "terms.section.acceptance.body":
    "You must have legal capacity to contract and comply with applicable law. If you use the Service for an organization, you represent you have authority to bind that organization.",
  "terms.section.service.title": "2. The Service",
  "terms.section.service.body":
    "Lapras provides Threads operations tooling, including account linking, patrol/outreach, create and send, personas/brands, usage and plans. Features may change. We may suspend or modify features for maintenance, security, or legal reasons.",
  "terms.section.accounts.title": "3. Accounts and security",
  "terms.section.accounts.body":
    "Provide accurate information, protect credentials, and you are responsible for activity under your account. Notify us of unauthorized use. We may limit or suspend accounts for security, abuse, or violations.",
  "terms.section.threads.title": "4. Threads / Meta connection",
  "terms.section.threads.body":
    "Some features require Meta OAuth to connect Threads. You must have the right to connect that account and must comply with Meta, Threads, and Instagram terms and community standards.\nYou are responsible for lawful, non-infringing content and for following platform rules. Platform enforcement, API denials, or third-party claims arising from your content or account use are your responsibility. Lapras is a tool and does not guarantee platform approval or performance outcomes.\nYou may disconnect or revoke Meta authorization at any time; some features will stop working after disconnect.",
  "terms.section.content.title": "5. Your content",
  "terms.section.content.body":
    "You retain rights in content you upload or create. You grant us a non-exclusive, worldwide, royalty-free license to store, process, transmit, and display content as needed to provide the Service to you and authorized workspace members, including calling necessary third-party APIs. You warrant content is lawful and non-infringing.",
  "terms.section.acceptable.title": "6. Acceptable use",
  "terms.section.acceptable.body":
    "You may not: abuse APIs or automate harm to others; spam, fraud, hate, or illegal content; bypass quotas or security; reverse engineer or access systems without authorization; use the Service in ways that violate Meta platform policies; or infringe others’ privacy or IP.",
  "terms.section.billing.title": "7. Plans and usage",
  "terms.section.billing.body":
    "Paid plans, credits, and limits are as shown in product. Non-payment, overuse, or abuse may reduce or suspend features. Refunds follow the purchase terms and applicable law.",
  "terms.section.disclaimer.title": "8. Disclaimers and liability",
  "terms.section.disclaimer.body":
    "The Service is provided “as is”. To the fullest extent permitted by law, we do not warrant uninterrupted or error-free operation, or continued availability of third platforms (including Threads/Meta/AI providers). We are not liable for indirect, incidental, or lost-profit damages except where liability cannot be limited. Our aggregate liability is capped at fees you paid for the Service in the twelve months before the claim (or zero if free), except where law forbids the cap.",
  "terms.section.termination.title": "9. Termination",
  "terms.section.termination.body":
    "You may stop using the Service and request deletion under the Privacy Policy. We may suspend or terminate for breach, abuse, legal requirements, or if we discontinue the Service. Data handling after termination follows the Privacy Policy.",
  "terms.section.contact.title": "10. Contact and governing law",
  "terms.section.contact.body":
    "Contact the operator via your registered email for terms questions. Governing law and venue are those of our primary place of operation unless mandatory law says otherwise. Privacy: /privacy. Data deletion: /data-deletion.",

  "deletion.navLabel": "Data deletion navigation",
  "deletion.title": "User Data Deletion Instructions",
  "deletion.updated": "Last updated: 2026-07-31",
  "deletion.intro":
    "This page explains how to ask Lapras (巡樓) to delete personal data and Threads platform data associated with you.",
  "deletion.section.summary.title": "1. Summary",
  "deletion.section.summary.body":
    "If you stop using the Service, or remove our app in Meta and want us to delete data we hold, follow the steps below. After identity verification we delete or anonymize deletable data, except where law or legitimate retention requires keeping records.",
  "deletion.section.steps.title": "2. How to request deletion",
  "deletion.section.steps.body":
    "Step 1: If you can still sign in, disconnect all Threads accounts in Lapras (settings/accounts).\nStep 2: Email the Service operator from your registered email address.\nStep 3: Subject line: “Data Deletion Request”.\nStep 4: Include:\n• Registered email (required)\n• Display name or member id if known\n• Threads username or in-app account id if you connected Threads\n• Scope: entire account / Threads connection + synced data only / a specific workspace\nStep 5: We confirm receipt, process the request, and email completion when possible.",
  "deletion.section.threads.title": "3. Threads / Meta authorization",
  "deletion.section.threads.body":
    "Deleting Lapras data does not delete your posts or account on Threads/Instagram/Meta.\nAlso revoke our app in Meta/Threads settings to clear authorization on Meta’s side.\nIf the platform sends us a deletion callback, we process matching data; otherwise use the email process on this page.",
  "deletion.section.scope.title": "4. What we delete",
  "deletion.section.scope.body":
    "Where reasonably possible we delete or anonymize:\n• Member personal data and credentials\n• Workspace content you created (personas, drafts, patrol, Outbox, etc., per request scope)\n• Threads connection identifiers, tokens, and sync caches\n• Non-essential job and analytics records\n\nWe may retain for a limited time or by law:\n• Transaction/billing records required by law\n• Security and anti-abuse logs (limited period)\n• Backup copies until rotation completes",
  "deletion.section.timeline.title": "5. Timeline",
  "deletion.section.timeline.body":
    "We typically complete deletion or anonymization within 30 days after a verifiable request. If more time is needed (complex workspaces or legal review), we will communicate an estimate. Backup purge may finish afterward.",
  "deletion.section.contact.title": "6. Contact",
  "deletion.section.contact.body":
    "Email the Service operator from your registered address with subject “Data Deletion Request”. Full privacy policy: /privacy. Terms: /terms.",

  "common.listSep": ", ",
  "common.dash": "—",

  "scout.title": "Topic ideas",
  "scout.topic.intro": "Enter a title, person, event, or work direction. Scout infers whether you want trending discussion, recommendations, or public work signals. Use Demand to manage customer opportunities.",
  "scout.topic.termHint": "Up to 3 intent-aware queries are preselected. You can uncheck, edit, or add your own wording.",
  "scout.topic.termsNeedShort": "{n} term(s) break Threads short-query rules — shorten them before searching.",
  "scout.topic.noTerms": "No usable terms — try a clearer topic (e.g. Taipei market, nanny recs).",
  "scout.topic.termsReadyPrimary": "Intent understood. Up to 3 high-confidence queries are selected, with {n} more available to adjust.",
  "scout.topic.workshopHintSelect": "Queries run separately and are deduplicated. Up to 3 high-confidence queries are preselected for review.",
  "scout.topic.primaryTerm": "Primary (recommended)",
  "scout.topic.variantTerm": "Variant {n}",
  "scout.topic.useTerm": "Include this term in search",
  "scout.today": "Today's sortie",
  "scout.purposeValue": "Pain-point replies",
  "scout.purposeDemand": "Find demand pains",
  "scout.purposeProvider": "Find solution providers",
  "scout.purposeActivity": "Activity short replies",
  "scout.goal": "Daily goal (posts)",
  "scout.progress": "Progress {done}/{goal}",
  "scout.intent": "What to find / reply to",
  "scout.keyword": "Keywords",
  "scout.intentPh": "e.g. seasonal scalp itch, truly fragrance-free, outlets on weekends",
  "scout.keywordPh": "e.g. backend freelance engineer, Demon Slayer",
  "scout.productOptional": "Product (optional)",
  "scout.productRequired": "Product to solve (required)",
  "scout.selectProduct": "Select a product",
  "scout.noProduct": "No product",
  "scout.brandFallback": "Brand",
  "scout.placement": "Placement: {label}",
  "scout.providerProduct": "Product: {label}",
  "scout.painPart": " · pain “{pain}”",
  "scout.noProductsBefore": "No products yet. Add some under",
  "scout.noProductsAfter": ".",
  "scout.start": "Start",
  "scout.startMore": "Fetch more",
  "scout.fetching": "Fetching…",
  "scout.planKeywords": "Generate keywords",
  "scout.planning": "Planning keywords…",
  "scout.workshop": "Search keywords (editable)",
  "scout.workshopHint": "Search runs only after you confirm. Each line is its own query — remove weak ones and add phrases that work.",
  "scout.workshopEmpty": "Keep at least one keyword to search",
  "scout.addTerm": "Add",
  "scout.addTermPh": "Add another search phrase",
  "scout.removeTerm": "Remove",
  "scout.confirmScan": "Search with these",
  "scout.startImmediate": "Start patrol now",
  "scout.immediateHint": "Start now first prepares suggested phrases, then searches with up to 3 focused queries.",
  "scout.openDailySchedule": "View daily schedule",
  "scout.scheduleHint": "Daily automatic patrols are configured under Demand watches.",
  "scout.replan": "Regenerate",
  "scout.clearWorkshop": "Cancel",
  "scout.termsReady": "{n} keywords ready — review before searching.",
  "scout.runs": "Patrol batches",
  "scout.runCount": "Batch ({n})",
  "scout.runCreatedAt": "Created {time}",
  "scout.runSelectAria": "Switch patrol batch",
  "scout.runPending": "{n} pending · ",
  "scout.runDone": "Cleared · ",
  "scout.runTotal": " ({n} posts)",
  "scout.runStatus.queued": "Queued",
  "scout.runStatus.running": "Scanning",
  "scout.runStatus.succeeded": "Complete",
  "scout.runStatus.failed": "Failed",
  "scout.runStatus.cancelled": "Cancelled",
  "scout.shortfall": "{n} posts short",
  "scout.shortfallReason.source_exhausted": "Sources exhausted",
  "scout.shortfallReason.duplicate_exhausted": "Too many duplicates",
  "scout.shortfallReason.relevance_exhausted": "Not enough relevance",
  "scout.shortfallReason.source_unavailable": "Source unavailable",
  "scout.shortfallReason.limit_reached": "Limit reached",
  "scout.shortfallReason.unknown": "Insufficient source results",
  "scout.refreshRuns": "Refresh batches",
  "scout.refreshingRuns": "Refreshing…",
  "scout.runsRefreshed": "Batches refreshed",
  "scout.newRunReady": "A new patrol batch is ready. Your current reading position is unchanged; refresh batches to view it.",
  "scout.deleteRun": "Delete this batch",
  "scout.deleting": "Deleting…",
  "scout.now": "Now this post",
  "scout.emptyBatch": "Nothing pending in this batch. Want a daily auto demand list? Open Demand and add keyword watches.",
  "scout.draft": "Reply draft",
  "scout.draftPhActivity": "Short reply…",
  "scout.draftPhValue": "Empathize → suggest…",
  "scout.sendAccount": "Send from account",
  "scout.noAccount": "No usable accounts",
  "scout.personaForRegen": "Persona (for regen)",
  "scout.notReady": " (not ready)",
  "scout.skip": "Skip",
  "scout.regen": "Regen",
  "scout.send": "Send",
  "scout.openThreadsReply": "Open Threads to reply",
  "scout.markManualDone": "Replied, mark complete",
  "scout.manualReplyHint": "Review the draft, open the original Threads post, and reply there. The draft will be copied when possible. Return here to mark it complete.",
  "scout.openedAndCopied": "Threads opened and the draft was copied. Paste the reply, then return to mark it complete.",
  "scout.openedManual": "Threads opened. Return here after replying to mark it complete.",
  "scout.noPermalink": "This result has no Threads permalink to open.",
  "scout.manualDone": "Manual reply marked complete · today {done}/{goal}",
  "scout.manualDoneFail": "Failed to mark the manual reply complete",
  "scout.resend": "Resend",
  "scout.sending": "Sending…",
  "scout.needAccountBefore": "Connect a usable account under",
  "scout.needAccountAfter": "first.",
  "scout.loadingKnowledge": "Preparing related knowledge…",
  "scout.product": "Product",
  "scout.queue": "Matches · {n}",
  "scout.valueQueue": "Value replies · {n}",
  "scout.providerQueue": "Solution providers · {n}",
  "scout.demandQueue": "Demand pains · {n}",
  "scout.activityQueue": "Activity short replies · {n}",
  "scout.noMatchesInQueue": "No matches in this queue",
  "scout.collapseQueue": "Collapse queue",
  "scout.expandQueue": "Expand queue",
  "scout.noOtherPending": "No other pending",
  "scout.unnamedRun": "Unnamed batch",
  "scout.thisRun": "this batch",
  "scout.confirmDeleteRun": "Delete patrol batch “{label}”?\\nHits and related knowledge will be removed. This cannot be undone.",
  "scout.deletedRun": "Deleted batch “{label}”",
  "scout.deleteRunFail": "Failed to delete batch",
  "scout.err.runBusy": "This batch is still scanning or already finished and cannot be deleted yet.",
  "scout.err.notFound": "This batch or post no longer exists. Refresh the batches.",
  "scout.err.sourceUnavailable": "The patrol source is unavailable right now. Try again later.",
  "scout.needKeyword": "Enter keywords first",
  "scout.needIntent": "Write what you're looking for",
  "scout.productMissing": "Selected product is not in the list. Please reselect.",
  "scout.providerSetupRequired": "Solution matching needs pain points and at least one tag or provider capability term. Complete them on the Brands page first.",
  "scout.defaultLabel": "Patrol",
  "scout.newRunActivity": "New batch “{label}” · {n} pending",
  "scout.newRunValue": "New batch “{label}” · {n} posts · handle “Now this post”",
  "scout.knowledgeReady": "“{label}” knowledge ready · {n} notes",
  "scout.patrolFail": "This patrol failed",
  "scout.loadFail": "Scout data could not be loaded. Refresh and try again.",
  "scout.scanQueued": "Patrol job “{label}” queued. You’ll be notified when a new batch is ready.",
  "scout.workerWaiting": "The patrol job is still waiting for a worker. Check that apps/backend worker is running.",
  "scout.scanReady": "Patrol complete. Found {n} pending replies.",
  "scout.queued": "Queued in @{who}'s Outbox for delivery · today {done}/{goal}",
  "scout.scanJob": "Patrol job",
  "scout.scanInProgress": "Scanning",
  "scout.crawlerSessionRequired": "Test patrol needs a valid Chrome session. Sync it from a signed-in Threads tab in Settings.",
  "scout.openSettings": "Open Settings",
  "scout.source": "Source: Threads Keyword Search",
  "scout.resultKeyword": "Keyword: {tag}",
  "scout.classification": "Class: {classification}",
  "scout.postedAt": "Posted: {time}",
  "scout.postedUnknown": "Post time unknown",
  "scout.scannedAt": "Scanned {time}",
  "scout.createdAt": "Created {time}",
  "scout.openPermalink": "Open original on Threads",
  "scout.draftFail": "Draft failed",
  "scout.skipped": "Skipped",
  "scout.status.new": "To handle",
  "scout.status.drafted": "Drafted",
  "scout.status.queued": "Queued",
  "scout.status.published": "Sent",
  "scout.status.skipped": "Skipped",
  "scout.noDraft": "No draft to send",
  "scout.accountFallback": "account",
  "scout.sent": "Sent (@{who}) · today {done}/{goal}",
  "scout.sendFail": "Send failed",
  "scout.confirmDeletePost": "Delete this hit?",
  "scout.deletedPost": "Deleted this hit",
  "scout.stanceActivity": "Short reply · activity",
  "scout.stanceDemand": "Demand pain · replyable",
  "scout.stanceProvider": "Solution matching · no product promotion",
  "scout.demandHint": "These posts show people seeking help or comparing solutions. Read the original post before responding helpfully.",
  "scout.providerHint": "These are solution-provider candidates. Review the original post and proof of capability before contacting them.",
  "scout.stanceProduct": "Empathy · soft product",
  "scout.stanceRelation": "Engage · build rapport",

  "brands.title": "Brands",
  "brands.railAria": "Brand list",
  "brands.railLabel": "Your brands",
  "brands.add": "Add",
  "brands.brandName": "Brand name",
  "brands.brandNamePh": "e.g. your brand",
  "brands.creating": "Creating…",
  "brands.createBrand": "Create brand",
  "brands.searchAria": "Search brands",
  "brands.searchPh": "Search brands…",
  "brands.empty": "No brands yet",
  "brands.noMatch": "No matches",
  "brands.selectAria": "Select brand",
  "brands.pickOne": "Pick a brand",
  "brands.inUseHint": "Active · used for patrol and studio",
  "brands.inUse": "Active",
  "brands.tabBrands": "Brands",
  "brands.tabInfo": "Brand info",
  "brands.tabProducts": "Products",
  "brands.tabProductsN": "Products ({n})",
  "brands.displayName": "Name",
  "brands.brief": "Summary",
  "brands.briefPh": "One line about this brand",
  "brands.audience": "Audience",
  "brands.audiencePh": "Who cares and why",
  "brands.goals": "Goals",
  "brands.goalsPh": "What you want on Threads",
  "brands.saving": "Saving…",
  "brands.deleteBrand": "Delete brand",
  "brands.searchProductAria": "Search products",
  "brands.searchProductPh": "Search products…",
  "brands.addProduct": "Add product",
  "brands.noProducts": "No products yet",
  "brands.hasLink": "Has link",
  "brands.painLabel": "Pains ",
  "brands.editProduct": "Edit product",
  "brands.newProduct": "New product",
  "brands.importFromUrl": "Import from product URL",
  "brands.fetching": "Fetching…",
  "brands.fetch": "Fetch",
  "brands.pains": "Pain points",
  "brands.painsPh": "One per line",
  "brands.tags": "Tags",
  "brands.tagsPh": "Comma-separated",
  "brands.intro": "Description",
  "brands.providerCapabilities": "Capabilities / services that solve the pain",
  "brands.providerCapabilitiesPh": "e.g. dermatology, allergen testing, sensitive-skin consultation",
  "brands.providerExcludes": "Same-category exclusions",
  "brands.providerExcludesPh": "e.g. shampoo, hair-care products",
  "brands.link": "Link",
  "brands.update": "Update",
  "brands.createItem": "Add",
  "brands.needName": "Enter a name",
  "brands.created": "Created “{name}”",
  "brands.createFail": "Create failed",
  "brands.saved": "Saved",
  "brands.saveFail": "Save failed",
  "brands.confirmDelete": "Delete “{name}”?",
  "brands.deleted": "Deleted",
  "brands.deleteFail": "Delete failed",
  "brands.fetchFail": "Fetch failed",
  "brands.needLabelContext": "Name and description are required",
  "brands.productUpdated": "Updated",
  "brands.productAdded": "Added",
  "brands.confirmDeleteProduct": "Delete this product?",

  "insights.title": "Account performance",
  "insights.account": "Account",
  "insights.noAccount": "No accounts",
  "insights.syncing": "Syncing…",
  "insights.syncPosts": "Sync posts",
  "insights.myPosts": "My posts",
  "insights.pickAccount": "Select an account",
  "insights.goAccounts": "Accounts",
  "insights.kpiMonth": "This month",
  "insights.monthViews": "Views this month",
  "insights.monthLikes": "Likes this month",
  "insights.monthReplies": "Replies this month",
  "insights.engRate": "Engagement",
  "insights.vsPrev": "vs last month",
  "insights.avgNear": "Recent avg {rate}",
  "insights.trendTitle": "Trends & analysis · @{user}",
  "insights.metricViews": "Views",
  "insights.metricLikes": "Likes",
  "insights.metricReplies": "Replies",
  "insights.metricPosts": "Posts",
  "insights.metricPostsFull": "Posts",
  "insights.chartMetrics": "Chart metric",
  "insights.barsAria": "Recent months {metric}; click a bar for analysis",
  "insights.barsLabel": "{metric} · last {n} months",
  "insights.clickBar": " · click bar for analysis",
  "insights.pickMonthAria": "Select month",
  "insights.barTitle": "{label}: {value}{est} · click for analysis",
  "insights.est": " (est.)",
  "insights.monthSuffix": "{m}",
  "insights.sparkAria": "Trend line; click a node to select month",
  "insights.analysisOf": "{label} analysis",
  "insights.producedAt": "Generated {time}",
  "insights.hasEstimate": " · includes estimates",
  "insights.viewsVsPrev": " · views vs prev {delta}",
  "insights.statPosts": "Posts",
  "insights.statViews": "Views",
  "insights.statLikes": "Likes",
  "insights.statReplies": "Replies",
  "insights.conclusions": "Takeaways",
  "insights.recommendations": "Recommendations",
  "insights.highlights": "Month highlights",
  "insights.findTopics": "Find topics",
  "insights.goScout": "Go patrol",
  "insights.selectMonth": "Select a month",
  "insights.topPosts": "Top posts",
  "insights.noPosts": "No posts yet",
  "insights.postStats": "Views {views} · likes {likes} · replies {replies}",
  "insights.openThreads": "Open Threads",
  "insights.zeroPct": "0%",
  "insights.panelHint": "Aggregates metrics from synced “My posts”",
  "insights.lastSynced": "Last sync {time}",
  "insights.neverSynced": "Not synced yet",
  "insights.emptyTitle": "No post data yet",
  "insights.emptyDesc": "Tap “Sync posts” to pull your Threads posts and insights, then review charts and analysis.",
  "insights.syncDone": "Synced {n} posts · insights updated",
  "insights.syncFail": "Sync failed",
  "insights.loadFail": "Failed to load posts",
  "insights.zeroViewsHint": "Posts found but views are mostly 0 — Insights scope may be missing, or stats not ready. Try sync again.",
  "insights.postsInMonth": "{n} posts",
  "insights.kpiForMonth": "{label} metrics",
  "insights.topPostsOfMonth": "{label} · top posts",
  "insights.noPostsInMonth": "No posts in {label}",
  "insights.pastMonthEmptyHint": "No synced posts for this month (past months are fetched once). Sync manually or pick another month.",
  "insights.pastBackfillDone": "Backfilled {n} posts (past months fetch once)",
  "insights.autoRefreshDone": "Current month refreshed ({n} posts)",
  "insights.noDataNoAnalysis": "No posts in {label} — no analysis.",
  "insights.noAnalysisYet": "No analysis for {label} yet (need synced posts).",
  "insights.thisMonth": "This month",
  "insights.narrative.summary": "{when} summary: {posts} posts, {views} views, {likes} likes, {replies} replies (from synced posts).",
  "insights.narrative.viewsDelta": "Views {delta} vs last month ({prev} → {curr}).",
  "insights.narrative.viewsFlat": "Views roughly flat vs last month ({delta}).",
  "insights.narrative.repliesUp": "Replies {delta}; conversation is heating up.",
  "insights.narrative.repliesDelta": "Replies {delta}.",
  "insights.narrative.engRate": "Engagement about {pct}% (likes+replies+reposts+quotes+shares / views).",
  "insights.narrative.engLow": "Engagement is low: try ending with a specific question.",
  "insights.narrative.engGood": "Engagement looks solid: reuse a high-performing structure for 1–2 more posts.",
  "insights.narrative.zeroViews": "This month has likes/replies but 0 views (Insights may still be pending or missing permission).",
  "insights.narrative.highlight": "One stronger post: {snippet}",
  "insights.narrative.smallSample": "Few posts this month — treat month-over-month as a hint only.",

  "plays.tabOwn": "My posts",
  "plays.tabLink": "Threads link",
  "plays.noPosts": "No posts yet",
  "plays.targetPost": "Target post",
  "plays.likesSuffix": " ({n} likes)",
  "plays.linkCard": "Paste Threads link",
  "plays.postLink": "Post URL",
  "plays.resolving": "Resolving…",
  "plays.resolve": "Resolve link",
  "plays.resolveHint": "After resolve, schedule your accounts to reply under that post.",
  "plays.targetOwn": "Target post (yours)",
  "plays.openThreads": "Open Threads",
  "plays.external": "External post",
  "plays.addScheme": "New scheme",
  "plays.schemeCount": "{n} schemes for this target",
  "plays.noSchemes": "No schemes yet",
  "plays.replyCount": "{n} replies",
  "plays.editTitle": "Edit: {title}",
  "plays.schemeName": "Scheme name",
  "plays.schemeNamePh": "e.g. Scheme A · soft engage",
  "plays.speakersOwn": "Accounts (post owner always included)",
  "plays.speakers": "Accounts",
  "plays.postOwner": " (post owner)",
  "plays.noAccounts": "No usable accounts. Connect Threads first.",
  "plays.interval": "Interval (min)",
  "plays.applyInterval": "Apply interval",
  "plays.aiEmpty": "AI fill empty",
  "plays.aiBusy": "Generating…",
  "plays.aiFail": "AI generate failed",
  "plays.aiStepDone": "Step filled — edit as needed",
  "plays.aiNoneFilled": "No empty steps to fill (or persona not ready)",
  "plays.needPersonaForStep": "Pick a ready persona on this step first",
  "plays.aiEmptyResult": "AI returned empty — retry or pick a faster model",
  "plays.saveBeforeAi": "Save the play first, then generate the full script (needs play id)",
  "plays.scriptJobQueued": "Full-script job queued — you can leave; steps fill when done",
  "plays.scriptJobDone": "Script generated — steps filled (edit as needed)",
  "plays.scriptJobDoneReload": "Script done — reopen the play to see steps",
  "plays.replies": "Replies ({n})",
  "plays.stepN": "Reply {n}",
  "plays.who": "Who",
  "plays.personaOpt": "Persona (optional)",
  "plays.brandOpt": "Brand (optional)",
  "plays.reply": "Reply",
  "plays.attach": "Images",
  "plays.addOne": "Add one",
  "plays.saving": "Saving…",
  "plays.saveScheme": "Save scheme",
  "plays.submitting": "Submitting…",
  "plays.submitOutbox": "Submit to Outbox",
  "plays.closeEdit": "Close editor",
  "plays.noTarget": "No target post yet",
  "plays.resolved": "Link resolved",
  "plays.resolveFail": "Resolve failed",
  "plays.filled": "Generated {n}",
  "plays.needTarget": "Select a target post first",
  "plays.saved": "Scheme saved",
  "plays.saveFail": "Save failed",
  "plays.submitted": "Sent to Outbox",
  "plays.submitFail": "Submit failed",
  "plays.confirmDelete": "Delete this scheme?",
  "plays.accountFallback": "account",

  "inspire.loading": "Loading…",
  "inspire.trendsAria": "Topic ideas",
  "inspire.trendsLabel": "Topic ideas",
  "inspire.trendsHint": "Web-sourced ideas · costs a search credit",
  "inspire.trendsSeed": "sample",
  "inspire.topicSeed": "I want a Threads post about “{topic}”. Help me with openings and angles.",
  "inspire.trendsEmpty": "Tap “Find ideas” to search (uses credits)",
  "inspire.refreshConfirm": "Finding ideas costs 1 search credit. Continue?",
  "inspire.refreshOk": "Updated {n} topic ideas",
  "inspire.refreshFail": "Could not find ideas (quota or search failed)",
  "inspire.refresh": "Find ideas",
  "inspire.clearChat": "New chat",
  "inspire.clearedNewSession": "New chat started",
  "inspire.sessionsAria": "Inspiration chats",
  "inspire.session": "Chat",
  "inspire.sessionNew": "New chat",
  "inspire.newSession": "+ New",
  "inspire.newSessionOk": "New chat started (previous kept in list)",
  "inspire.deleteSession": "Delete current chat",
  "inspire.deleteSessionShort": "Delete",
  "inspire.confirmDeleteSession": "Delete this chat permanently?",
  "inspire.deletedSession": "Deleted — switched to another chat",
  "inspire.pinAsElement": "Apply as element",
  "inspire.you": "You",
  "inspire.ai": "AI",
  "inspire.system": "System",
  "inspire.useDraft": "Use this draft",
  "inspire.openPlay": "Open play",
  "inspire.thinking": "Thinking…",
  "inspire.stop": "Stop generating",
  "inspire.stopped": "Generation stopped",
  "inspire.pinnedAria": "This-round references (for the AI)",
  "inspire.pinned": "References",
  "inspire.pinnedCount": "· {n}",
  "inspire.pinsLocalShort": "this session",
  "inspire.pinsSessionLocal": "References apply to this session only and will be included with your next message.",
  "inspire.pickRight": "Pick on the right = pin for AI; click name to insert",
  "inspire.unpinTitle": "Remove reference",
  "inspire.insertPinTitle": "Insert into input",
  "inspire.insertBrand": "Talk about “{name}”",
  "inspire.insertedPin": "Inserted “{name}” into the input",
  "inspire.flowStep1": "Prep",
  "inspire.flowStep2": "Ideate",
  "inspire.flowStep3": "Persona draft",
  "inspire.emptyTitle": "Ideate first, then draft in persona",
  "inspire.emptyDesc": "Pick a path. You don’t need every control.",
  "inspire.entryTopic": "Start from a topic",
  "inspire.entryPaste": "I have a draft — rewrite in persona",
  "inspire.startTopicHint": "Type a topic below and press Enter",
  "inspire.pasteDraftHint": "Paste your draft into the box, then rewrite",
  "inspire.needMaterialOrPaste": "No chat material yet — paste text to rewrite",
  "inspire.flowOneLiner": "Talk it through, search when needed, then turn the conversation into a post.",
  "inspire.showTopics": "Topics",
  "inspire.hideTopics": "Hide topics",
  "inspire.showLibrary": "Library",
  "inspire.hideLibrary": "Hide library",
  "inspire.showAdvanced": "Advanced",
  "inspire.hideAdvanced": "Hide advanced",
  "inspire.readyToWrite": "{n} turns in — ready to draft",
  "inspire.inputAria": "Talk to AI",
  "inspire.inputPh": "What to explore? Enter to send · Shift+Enter newline",
  "inspire.previewTitle": "Full payload that will be sent",
  "inspire.previewPrompt": "Full prompt (persona / brands / pins / chat — same as AI)",
  "inspire.previewSections": "Included sections",
  "inspire.previewPinnedCount": "{n} pinned elements",
  "inspire.previewNoPins": "No pinned elements yet",
  "inspire.runes": "chars",
  "inspire.copyAll": "Copy all",
  "inspire.copied": "Full prompt copied",
  "inspire.copyFail": "Copy failed",
  "inspire.rawPrompt": "Raw text sent to AI",
  "inspire.verifyHow": "To verify: open ? for fingerprint → send without changes → status says match.",
  "inspire.verifyHowShort": "Type → ? (previews Send path) → send unchanged → should match. Generate uses different mode (fingerprint will differ).",
  "inspire.previewModeNote": "Assembled for mode={mode} (same as sending with that mode).",
  "inspire.lastSentFp": "Last sent fingerprint",
  "inspire.matchOk": "Matches last send ✓",
  "inspire.matchBad": "Differs from preview (input/pins/persona/mode)",
  "inspire.matchBadShort": "≠ last sent {sent}",
  "inspire.fpMatch": "Sent fingerprint {fp} matches preview",
  "inspire.fpMismatch": "Different: preview {preview} ≠ sent {sent} (text/mode changed?)",
  "inspire.fpSent": "Sent fingerprint {fp}",
  "inspire.viewSent": "View sent prompt",
  "inspire.viewSentShort": "Sent",
  "inspire.sentPrompt": "Prompt actually sent",
  "inspire.sentPromptNote": "Exact prompt the backend sent to the AI (from stream done).",
  "inspire.send": "Send",
  "inspire.generate": "Turn into post",
  "inspire.generateHint": "Turn the whole conversation into a publish-ready post using the selected persona and strong engagement principles",
  "inspire.webSearch": "Search web",
  "inspire.webSearchOn": "Web search: on",
  "inspire.webSearchHint": "The next message will search Exa before AI responds",
  "inspire.needConversation": "Share one thought first, then turn it into a post.",
  "inspire.needReadyPersona": "Select a persona that has finished analysis first.",
  "inspire.generating": "Rewriting…",
  "inspire.generateOk": "Draft rewritten in persona",
  "inspire.materialTitle": "Lock content to write",
  "inspire.materialHint": "Generate only rewrites this block (editable). Chat is for ideation; this is for the final voice.",
  "inspire.materialLabel": "Content to rewrite",
  "inspire.materialPh": "Key points, angle, what you want to say…",
  "inspire.rewriteNotes": "Rewrite notes (optional)",
  "inspire.rewriteNotesPh": "e.g. shorter, more casual, end with a question",
  "inspire.rewriteDefault": "Rewrite as a Threads post in persona voice",
  "inspire.confirmRewrite": "Rewrite in persona",
  "inspire.needMaterial": "Chat a bit first, or paste text to rewrite",
  "inspire.library": "Element library",
  "inspire.addNew": "+ Add",
  "inspire.kind": "Type",
  "inspire.kindRole": "Role prompt",
  "inspire.kindSnippet": "Snippet",
  "inspire.kindTrendNote": "Trend note",
  "inspire.kindBrand": "Brand",
  "inspire.kindTrend": "Trend",
  "inspire.name": "Name",
  "inspire.namePh": "e.g. pro Threads writer",
  "inspire.body": "Content (goes into prompt)",
  "inspire.bodyPh": "You are a…",
  "inspire.saveElement": "Save to library",
  "inspire.citeBrand": "Cite brand",
  "inspire.applied": "Applied",
  "inspire.clickApply": "Click to apply",
  "inspire.noBrands": "No brands yet",
  "inspire.appliedToggle": "Applied · click again to remove",
  "inspire.deleteAria": "Delete",
  "inspire.needInput": "Type what you want to explore",
  "inspire.fail": "Failed",
  "inspire.wantWrite": "Want to write about {label}: {summary}",
  "inspire.trendBody": "Topic: {label}. {summary}",
  "inspire.pinnedTrend": "Applied trend {label}",
  "inspire.needTitleBody": "Name and content required",
  "inspire.added": "Added to library",
  "inspire.addFail": "Add failed",
  "inspire.confirmRemove": "Remove this from the library?",
  "inspire.confirmClear": "Start a new chat? (previous chats stay in the list)",
  "inspire.genMessage": "Rewrite as a Threads post in persona voice",

  "persona.add": "New persona",
  "persona.empty": "No personas yet",
  "persona.emptyDesc": "Add one and analyze it for drafting.",
  "persona.statusReady": "ready",
  "persona.statusAnalyzing": "analyzing",
  "persona.statusPending": "pending",
  "persona.default": "Default",
  "persona.backList": "← Personas",
  "persona.tabOverview": "Overview",
  "persona.tabAnalyze": "Analyze",
  "persona.tabFingerprint": "Fingerprint",
  "persona.tabPreview": "Preview",
  "persona.name": "Name",
  "persona.brief": "Brief",
  "persona.briefPh": "Who, for whom, core message…",
  "persona.avoid": "Guardrails · banned words (comma-separated)",
  "persona.guardChars": "{n} chars",
  "persona.banAi": " · ban AI tone",
  "persona.notReadySuffix": " · not ready",
  "persona.setDefault": "Set as default",
  "persona.modeAccount": "Public account",
  "persona.modeText": "Paste text",
  "persona.username": "Threads username",
  "persona.fromBound": "From linked account",
  "persona.select": "Select…",
  "persona.crawlAnalyze": "Analyze public posts",
  "persona.crawlBusy": "Analyzing…",
  "persona.refText": "Reference text (--- separates posts)",
  "persona.refTextPh": "First post…\n\n---\n\nSecond post…",
  "persona.sourceLabel": "Source note (optional)",
  "persona.sourcePh": "My old posts",
  "persona.analyzeText": "Analyze from text",
  "persona.analyzeBusy": "Analyzing…",
  "persona.sampleMeta": "Samples {n}",
  "persona.sourceManual": "Pasted",
  "persona.analyzeHint": "After analysis, 8D summaries appear here.",
  "persona.fingerprintHint": "Main voice for drafting. Edit catchphrases, rhythm, bans; Studio/replies use this.",
  "persona.fingerprint": "Language fingerprint",
  "persona.fingerprintPh": "Filled after analysis…",
  "persona.saveFingerprint": "Save fingerprint",
  "persona.tryGen": "Preview root + reply",
  "persona.previewHint": "Write a sample root post and reply in this fingerprint style. Uses a live news headline as inspiration (rewritten in-character, not a news dump).",
  "persona.previewRunning": "Generating…",
  "persona.previewDone": "Preview done · topic: {topic} ({source})",
  "persona.previewFail": "Preview failed — try again",
  "persona.previewTopicLabel": "Topic seed: {topic} · {source}",
  "persona.topicNews": "live news",
  "persona.topicManual": "manual",
  "persona.topicFallback": "everyday seed",
  "persona.notReadyMsg": "Persona not ready",
  "persona.rootPost": "Root post",
  "persona.reply": "Reply",
  "persona.hidePrompt": "Hide prompt block",
  "persona.showPrompt": "Show injected prompt",
  "persona.promptBlock": "prompt block (post)",
  "persona.pickOne": "Pick a persona",
  "persona.pickDesc": "Or add one to start analyzing.",
  "persona.created": "Created — finish account analysis or paste text under Analyze",
  "persona.saved": "Saved",
  "persona.textDone": "Text analysis done · {n} segments → ready",
  "persona.analyzeFail": "Analysis failed",
  "persona.reading": "Reading public posts…",
  "persona.accountDone": "@{user} · {n} posts → ready",
  "persona.jobQueued": "Queued as a background job · you can leave; results save automatically",
  "persona.jobQueuedCrawl": "Analyze job queued · you can leave; persona updates when done",
  "persona.jobRunning": "Analyzing in background… will refresh when ready (see Jobs for progress)",
  "persona.jobDone": "Background analysis finished · fingerprint saved",
  "persona.jobFailed": "Background analysis failed — check Jobs for the error or retry",
  "persona.loadFail": "Could not load personas",
  "persona.openJob": "Open job details",
  "persona.setDefaultMsg": "“{name}” set as default",
  "persona.confirmDelete": "Delete persona “{name}”?",
  "persona.deleted": "Persona deleted",
  "persona.needReady": "Finish analysis first (ready)",
  "persona.dim.d1Tone": "D1 Tone",
  "persona.dim.d2Structure": "D2 Structure",
  "persona.dim.d3Interaction": "D3 Interaction",
  "persona.dim.d4Topics": "D4 Topics",
  "persona.dim.d5Rhythm": "D5 Rhythm",
  "persona.dim.d6Visual": "D6 Visual",
  "persona.dim.d7Conversion": "D7 Conversion",
  "persona.dim.d8Risk": "D8 Risk",

  "admin.users.loadFail": "Load failed",
  "admin.users.created": "Added islander “{name}” · copy the password below",
  "admin.users.createFail": "Create failed",
  "admin.users.unlimitedOn": "“{name}” set to unlimited (usage still counted)",
  "admin.users.unlimitedOff": "“{name}” back to plan limits",
  "admin.users.updateFail": "Update failed",
  "admin.users.planSet": "“{name}” plan → {plan}",
  "admin.users.confirmSuspend": "Suspend “{name}”?\\nThey will not be able to sign in.",
  "admin.users.confirmUnsuspend": "Restore “{name}”?\\nThey can sign in again.",
  "admin.users.didSuspend": "Suspended “{name}”",
  "admin.users.didUnsuspend": "Restored “{name}”",
  "admin.users.suspendFail": "Suspend failed",
  "admin.users.unsuspendFail": "Restore failed",
  "admin.users.markedVerified": "Marked {name} as email verified",
  "admin.users.markedUnverified": "Marked {name} as unverified",
  "admin.users.rolesUpdated": "Updated roles for {name}: {roles}",
  "admin.users.rolesFail": "Role update failed",
  "admin.users.confirmReset": "Reset password for “{name}”?\\nTemp password stays visible until you close it (survives refresh).",
  "admin.users.resetDone": "Reset password for {name} (shown below — copy then close)",
  "admin.users.resetFail": "Reset failed",
  "admin.users.copied": "Copied to clipboard",
  "admin.users.copyFail": "Copy failed — select the password manually",
  "admin.users.confirmDismissTemp": "After close, this temp password won't show again (copy first if needed). Close?",
  "admin.users.tempPwNew": "New islander temp password",
  "admin.users.tempPw": "Temp password",
  "admin.users.tempPwPersist": "(stays visible · survives refresh)",
  "admin.users.copyPw": "Copy password",
  "admin.users.close": "Close",
  "admin.users.createTitle": "Add islander",
  "admin.users.memberName": "Display name",
  "admin.users.displayNamePh": "Display name",
  "admin.users.email": "Email",
  "admin.users.initPassword": "Initial password (optional)",
  "admin.users.initPasswordPh": "Leave blank to auto-generate; if set, must meet policy",
  "admin.users.markVerifiedCheck": "Mark email verified (usable immediately)",
  "admin.users.alsoAdmin": "Also make admin",
  "admin.users.creating": "Creating…",
  "admin.users.createSubmit": "Create islander",
  "admin.users.clear": "Clear",
  "admin.users.searchActive": "Search “{query}” · matches name, email, uid",
  "admin.users.noMatch": "No matches",
  "admin.users.none": "No islanders yet",
  "admin.users.you": "You",
  "admin.users.status": "Status",
  "admin.users.role": "Roles",
  "admin.users.emailVerify": "Email verification",
  "admin.users.bio": "Bio",
  "admin.users.timezone": "Timezone",
  "admin.users.notifyEmail": "Email notifications",
  "admin.users.on": "On",
  "admin.users.off": "Off",
  "admin.users.createdAt": "Created",
  "admin.users.updatedAt": "Updated",
  "admin.users.accountStatus": "Account status",
  "admin.users.updating": "Updating…",
  "admin.users.usageTitle": "Usage & plan",
  "admin.users.usageLiveSkip": "Plan/quota are Usage domain — not on live backend yet (M3). Editable in mock only.",
  "admin.users.plan": "Plan",
  "admin.users.planOption": "{name} ({credits} credits / mo)",
  "admin.users.unlimited": "Unlimited",
  "admin.users.byPlan": "By plan",
  "admin.users.setUnlimited": "Set unlimited",
  "admin.users.setLimited": "Enforce plan limits",
  "admin.users.unlimitedHint": "Unlimited: can keep using past plan cap; AI/Search counts and credits still track.",
  "admin.users.loadingUsage": "Loading usage prefs…",
  "admin.users.assignRoles": "Assign roles",
  "admin.users.memberBase": "{role} (base, always on)",
  "admin.users.adminDesc": "{role} — manage islanders and system",
  "admin.users.saving": "Saving…",
  "admin.users.saveRoles": "Save roles",
  "admin.users.markUnverifiedBtn": "Mark unverified",
  "admin.users.markVerifiedBtn": "Mark verified",
  "admin.users.resetting": "Resetting…",
  "admin.users.resetTemp": "Reset password (temp)",
  "admin.users.customPw": "Or set a password (optional)",
  "admin.users.customPwPh": "Password must be at least 12 characters with upper, lower, digit, and symbol",
  "admin.users.resetWithCustom": "Reset with this password",

  "usage.tabMine": "My usage",
  "usage.tabTenant": "All usage",
  "usage.currentPlan": "Current plan",
  "usage.planMeta": "/ mo · {n} credits monthly",
  "usage.changePlan": "Change plan",
  "usage.upgradePlan": "Upgrade plan",
  "usage.outcome.title": "This month's outcomes",
  "usage.outcome.summary": "Reach {reach} · Conversations {conversations} · Conversions {conversions}",
  "usage.outcome.amount": " (~${amount})",
  "usage.outcome.emptyHint": "No attributable outcomes this month yet — try patrol or posting.",
  "usage.warn.unlimitedOver": "Used {used} credits this month (plan {cap}; limits off — you can continue).",
  "usage.warn.exhausted": "Monthly credits are used up. Upgrade or wait for next month.",
  "usage.warn.high": "You've used {pct}% of monthly credits.",
  "usage.warn.meterNear": "{label} is near its cap ({credits}/{cap} credits).",
  "usage.usedThisMonth": "Used this month",
  "usage.remainLabel": "Remaining",
  "usage.ledgerToggle": "Usage log",
  "usage.collapse": "Collapse",
  "usage.eventsCount": "{n} events",
  "usage.granularity": "Granularity",
  "usage.day": "Day",
  "usage.monthUnit": "Month",
  "usage.year": "Year",
  "usage.from": "From",
  "usage.to": "To",
  "usage.callCounts": "Call counts",
  "usage.noMembers": "No members yet",
  "usage.planAria": "{name} plan",
  "usage.unlimitedTitle": "Unlimited",
  "usage.setLimited": "Enforce limits",
  "usage.setUnlimited": "Set unlimited",
  "usage.limitShort": "Cap",
  "usage.subscribed": "Subscribed to {name}",
  "usage.unlimitedSet": "Set unlimited",
  "usage.limitedSet": "Limits enforced",
  "usage.planUpdated": "Plan updated to {name}",
  "usage.fail": "Failed",

  "currency.TWD": "New Taiwan Dollar (TWD)",
  "currency.USD": "US Dollar (USD)",
  "currency.JPY": "Japanese Yen (JPY)",
  "currency.EUR": "Euro (EUR)",
  "currency.HKD": "Hong Kong Dollar (HKD)",

  "locale.zh-TW": "繁體中文",
  "locale.en": "English",

  "pager.nav": "Pagination",
  "pager.pageSize": "Items per page",
  "pager.perPage": "{n}/page",
  "pager.prev": "Previous",
  "pager.next": "Next",

  "plays.defaultTitle": "New play",
  "plays.topicOnPost": "On: {snippet}",
  "plays.topicOnExternal": "On: {label} · {snippet}",
  "plays.externalFallback": "External post",

  "persona.newName": "New persona",
  "persona.previewTopic": "Looking for a café I can sit in for hours",
  "persona.previewReplySample": "The one in Da’an is fine but crowded",

  "inspire.playTitle": "Inspired thread",

  "play.err.needLead": "Pick a lead account",
  "play.err.needRoot": "Add at least one root post",
  "play.err.firstMustRoot": "The first step must be the root post",
  "play.err.rootMustLead": "Root post must use the lead account",
  "play.err.rootEmpty": "Root post text cannot be empty",
  "play.err.replyAccount": "Replies can only use lead or selected cast accounts",
  "play.err.replyEmpty": "Reply text cannot be empty",
  "play.err.needTarget": "Pick one of your posts, or paste a Threads link",
  "play.err.needReplies": "Add at least one reply",
  "play.err.needReplyAccounts": "Pick at least one reply account",
  "play.err.stepAccount": "Every reply needs a usable account",
  "play.err.stepEmpty": "Reply text cannot be empty",
  "play.err.notFound": "Play not found",

  "time.justNow": "Just now",
  "time.minAgo": "{n}m ago",
  "time.hourAgo": "{n}h ago",
  "time.dayAgo": "{n}d ago",
  "time.min": "{n} min",
  "time.hour": "{n} hr",
  "time.day": "{n} day",
  "time.expired": "Expired {span}",
  "time.remaining": "{span} left",
  "time.sessionUnknown": "Session not recorded",
  "time.sessionExpired": "Session expired · {absolute}",
  "time.sessionSoon": "Session expiring · {relative} ({absolute})",
  "time.sessionOk": "Session OK · {relative} ({absolute})",

  "policy.title": "Opportunity and reply policy",
  "policy.subtitle": "Set service scope, forbidden words, cases, FAQs, and tone. Qualification and generated replies share this policy.",
  "radar.profile.title": "Service profile",
  "radar.profile.subtitle":
    "The radar uses this to judge whether an opportunity is worth answering, and replies quote these prices and tone.",
  "radar.profile.firstTimeHint":
    "The service profile can wait. Add it later and scoring and replies get closer to you.",
  "radar.profile.updatedAt": "Last updated: {at}",
  "radar.profile.saved": "Service profile saved",
  "radar.profile.services": "Services and pricing",
  "radar.profile.servicesHint":
    "At least one. Leave prices empty to mean negotiable; if filled they show up in replies.",
  "radar.profile.serviceName": "Service name",
  "radar.profile.serviceNamePh": "e.g. Interior measuring and layout",
  "radar.profile.priceMin": "Price from",
  "radar.profile.priceMax": "Price to",
  "radar.profile.addService": "+ Add service",
  "radar.profile.areas": "Service areas",
  "radar.profile.areasHint":
    "Pick the cities you can actually serve; mismatched leads score lower. Tick remote below if location does not matter.",
  "radar.profile.remoteOk": "Remote work is fine (any location)",
  "radar.profile.forbidden": "Forbidden words",
  "radar.profile.forbiddenHint": "One per line. These never appear in any generated reply.",
  "radar.profile.forbiddenPh": "guaranteed\ncheapest\nnumber one",
  "radar.profile.cases": "Case studies",
  "radar.profile.casesHint": "Optional. Replies cite these when proof helps; if empty they cite nothing.",
  "radar.profile.caseTitle": "Case title",
  "radar.profile.caseSummary": "One-line summary",
  "radar.profile.addCase": "+ Add case",
  "radar.profile.faq": "FAQ",
  "radar.profile.faqHint": "Optional. Replies follow these answers when a similar question comes up.",
  "radar.profile.faqQuestion": "Question",
  "radar.profile.faqAnswer": "Answer",
  "radar.profile.addFaq": "+ Add FAQ",
  "radar.profile.availability": "Availability",
  "radar.profile.availabilityHint": "e.g. Can start within two weeks, weekends only",
  "radar.profile.toneNote": "Tone note",
  "radar.profile.toneNoteHint": "e.g. Be direct, skip pleasantries, no exclamation marks",

  "radar.watches.title": "Demand watches",
  "radar.watches.subtitle":
    "Subscribe to keywords for a daily auto list. Unlike Patrol, you don’t re-run a manual scan each time.",
  "radar.watches.needProfile": "Fill in the service profile before enabling demand watches",
  "radar.watches.needProfileHint":
    "Scoring needs your service profile; without it every judgment is a guess.",
  "radar.watches.goProfile": "Go to service profile",
  "radar.watches.profileOptional": "Service profile can wait — replies get closer to you once you add it.",
  "radar.watches.optionalBrandHint": "Brand/product is optional. Pick one to auto-fill keywords, or type what customers search.",
  "radar.watches.showAdvanced": "Advanced (exclude terms, brand/product, keyword ideas)",
  "radar.watches.hideAdvanced": "Hide advanced",
  "radar.watches.skipBrand": "Skip brand for now",
  "radar.watches.skipProduct": "Skip product for now",
  "radar.start.title": "Start with words customers search",
  "radar.start.hint": "No brand setup needed. Then we look for people asking.",
  "radar.start.terms": "Keywords",
  "radar.start.termsPh": "e.g. Taipei manicure recs\nanyone build websites?",
  "radar.start.regions": "Service areas (optional)",
  "radar.start.submit": "Start finding people",
  "radar.start.saving": "Starting…",
  "radar.start.msg.searching": "Looking for people now — a few minutes",
  "radar.start.msg.searchingHint": "The first run is already going. No button to press; results show up on this page.",
  "radar.start.msg.scheduled": "Saved. The next scheduled patrol will start looking.",
  "radar.watches.quota": "Active {used} / {max}",
  "radar.watches.quotaFull": "Plan limit reached — pause or archive one to add another",
  "radar.watches.add": "+ New watch",
  "radar.watches.newTitle": "New demand watch",
  "radar.watches.editTitle": "Edit demand watch",
  "radar.watches.requiredHint": "Required field",
  "radar.watches.terms": "Terms",
  "radar.watches.termsHint": "One short query per line. Max 2 tokens, CJK 2–4 chars each — long sentences are shortened on save so Threads can search them.",
  "radar.watches.threadsWarn": "Some terms break Threads short-query rules: max 2 words, CJK 2–4 chars each, ≤12 chars total, no punctuation/#/emoji. Save shortens them into searchable queries.",
  "radar.watches.threadsRequired": "These terms cannot be shortened into Threads-searchable queries. Use at most 2 tokens, CJK 2–4 chars each.",
  "radar.watches.termsPh": "interior design\nfind designer",
  "radar.watches.excludeTerms": "Exclude terms",
  "radar.watches.excludeHint": "A hit here skips the post entirely, e.g. job ads or giveaways.",
  "radar.watches.excludePh": "hiring\ngiveaway",
  "radar.watches.regionsHint":
    "Leave regions empty to reuse the service profile areas; only narrow it down for this watch.",
  "radar.watches.regionsFromProfile": "Regions from service profile",
  "radar.watches.enableNow": "Activate right away (uses an active slot)",
  "radar.watches.filterStatus": "Status",
  "radar.watches.statusAll": "All",
  "radar.watches.status.active": "Active",
  "radar.watches.status.paused": "Paused",
  "radar.watches.status.archived": "Archived",
  "radar.watches.pause": "Pause",
  "radar.watches.resume": "Resume",
  "radar.watches.archive": "Archive",
  "radar.watches.confirmArchive": "Archived watches stop sweeping and cannot be restored. Continue?",
  "radar.watches.deleteArchived": "Delete archived watch",
  "radar.watches.deletingArchived": "Deleting…",
  "radar.watches.confirmDeleteArchived": "Permanently delete this archived watch setting? Existing opportunities, sweeps, and statistics stay, but this setting will no longer appear in the list.",
  "radar.watches.deletedArchived": "Archived watch setting deleted",
  "radar.watches.created": "Watch created",
  "radar.watches.createdFirstSweep": "Watch created — first sweep queued. Check today's demand in a few minutes (it runs automatically every day after this).",
  "radar.watches.updated": "Watch updated",
  "radar.watches.paused": "Watch paused",
  "radar.watches.resumed": "Watch resumed",
  "radar.watches.archived": "Watch archived",
  "radar.watches.lastSwept": "Last sweep: {at}",
  "radar.watches.neverSwept": "Never swept",
  "radar.watches.empty": "No demand watches yet",
  "radar.watches.emptyHint":
    "Add short buyer phrases (e.g. “find designer”); the system sweeps daily. Whoever we find shows up under Today.",
  "radar.watches.emptyFiltered": "No watches in this status",
  "radar.watches.scheduleTitle": "Daily patrol: 06:00 Taipei (22:00 UTC)",
  "radar.watches.scheduleHint": "Active watches run once a day. Use Run now for an extra pass. Turning off Run now does not stop the daily patrol.",
  "radar.watches.openToday": "Back to findings",
  "radar.watches.sweepNow": "Run now",
  "radar.watches.sweepQueued": "Demand sweep queued",
  "radar.watches.sweepStarted": "Demand sweep started (job {job}…)",

  "today.radar.open": "Open today's demand",
  "today.simple.reply": "Reply",
  "today.simple.skip": "Skip",
  "today.simple.left": "{n} left",
  "today.simple.findAgain": "Find more",
  "today.simple.setup": "What to look for",
  "today.simple.emptyDone": "You're done with this batch",
  "today.simple.replied": "Original opened — reply there.",
  "today.simple.repliedSaved": "Original opened and saved to your list. Update the status there after you reply.",
  "today.simple.viewAll": "See all results",
  "today.simple.skipped": "Skipped.",
  "firstRun.title": "Connect a Threads account first",
  "firstRun.subtitle": "After you connect, the rest of the app unlocks. Tap the button to open Accounts.",
  "firstRun.skip": "Skip — I'll look around",
  "firstRun.go": "Connect",
  "firstRun.progress": "Step {current} of {total}",
  "firstRun.done": "Done",
  "firstRun.aria": "First-run setup",
  "firstRun.step.crew": "Connect a Threads account",
  "firstRun.step.crewHint": "Needed later if you want to send a reply.",
  "firstRun.step.brands": "Set brand and product",
  "firstRun.step.brandsHint": "Fill audience, pains, and product capabilities.",
  "firstRun.step.watch": "Create a daily patrol",
  "firstRun.step.watchHint": "Pick the product, adopt suggested keywords, and save.",
  "firstRun.step.radar": "Review the first demand",
  "firstRun.step.radarHint": "No need to wait until tomorrow — use Explore now.",
  "firstRun.status.pending": "Onboarding",
  "firstRun.status.skipped": "Onboarding skipped",
  "firstRun.status.completed": "Onboarding done",

  "radar.suggest.title": "Term suggestions",
  "radar.suggest.hint":
    "Suggested from your service notes or common help-seeking phrases. Adopt them one by one or all at once; you still need to save to create the watch.",
  "radar.suggest.ask": "Get suggestions",
  "radar.suggest.again": "Suggest more",
  "radar.suggest.asking": "Thinking…",
  "radar.suggest.adopt": "Adopt",
  "radar.suggest.adopted": "Adopted",
  "radar.suggest.adoptAll": "Adopt all",
  "radar.suggest.include": "Term",
  "radar.suggest.exclude": "Exclude",
  "radar.suggest.none": "Nothing usable came back. Type a few short customer search words, or try again later.",

  "radar.today.link.watches": "Demand watches",
  "radar.today.link.crm": "CRM board",
  "radar.today.band.high": "High",
  "radar.today.band.mid": "Mid",
  "radar.today.band.low": "Low",
  "radar.today.action.open": "Original",
  "radar.today.action.override": "Override band",
  "radar.today.reply.hint": "Pick a variant. DM is copy-only — never auto-sent.",
  "radar.today.reply.copy": "Copy draft",
  "radar.today.reply.variant.public_comment": "Public comment",
  "radar.today.reply.variant.dm": "DM",
  "radar.today.reply.variant.no_sales": "No-sales",
  "radar.today.reply.variant.professional": "Professional",
  "radar.today.reply.variant.humorous": "Light",
  "radar.today.msg.replyReady": "Reply draft ready",
  "radar.today.msg.replyWorking": "Thinking…",
  "radar.reply.writeForMe": "Write my reply",
  "radar.reply.sendAs": "Send as",
  "radar.today.msg.overridden": "Band updated",
  "radar.today.msg.copied": "Copied to clipboard",
  "radar.today.msg.copyFail": "Could not copy — select the text manually",
  "radar.today.msg.marked": "Marked as sent/copied",
  "radar.today.msg.sent": "Sent — check progress in the outbox queue",
  "radar.today.msg.needReply": "Generate a reply draft first",
  "radar.today.reply.markCopy": "Mark as copied & sent",
  "radar.today.reply.markOutbox": "Send now (Outbox)",
  "radar.today.reply.needAccount": "Connect a Threads account first to send",
  "radar.today.reply.used": "Already marked used",
  "radar.today.reply.usedOutbox": "Sent (check the outbox queue)",

  "radar.reconnectSearch": "Reconnect search source",
  "radar.patrol.searchFallback": "If search is temporarily unavailable, a fallback source is used. Credits are charged only on a successful result.",
  "radar.empty.sweepFailedHint": "Patrol failed. Run it again, or switch to last 7 days / all.",
  "radar.inbox.title": "Demand",
  "radar.inbox.patrolAria": "Patrol status",
  "radar.inbox.scheduledOn": "Daily patrol: on",
  "radar.inbox.scheduledOff": "Daily patrol: off",
  "radar.inbox.scheduleHint": "Runs every day at 06:00 Taipei time. Turning off Run now does not stop the daily patrol.",
  "radar.inbox.lastSweep": "Last patrol: {time}",
  "radar.inbox.neverSwept": "Not patrolled yet",
  "radar.inbox.activeWatches": "{n} watches on",
  "radar.inbox.allPaused": "All watches are paused. Run now also needs at least one on.",
  "radar.inbox.noWatches": "No keywords to patrol yet",
  "radar.inbox.sweepNow": "Run now",
  "radar.inbox.sweeping": "Patrolling…",
  "radar.inbox.sweepAgain": "Run again",
  "radar.inbox.setupWatches": "Set up patrol",
  "radar.inbox.introTitle": "Pain points land here",
  "radar.inbox.introBody": "Read why it was recommended, then keep or discard. Adding to CRM is optional.",
  "radar.inbox.resultsAria": "Demand results",
  "radar.inbox.tabsAria": "Result state",
  "radar.inbox.tab.pending": "New",
  "radar.inbox.tab.completed": "Reviewed",
  "radar.inbox.tab.removed": "Discarded",
  "radar.inbox.total": "{n} total",
  "radar.inbox.clearFilters": "Clear filters",
  "radar.inbox.defaultToday": "Showing what was found today by default",
  "radar.inbox.timeScope": "Time range",
  "radar.inbox.time.today": "Today",
  "radar.inbox.time.7d": "Last 7 days",
  "radar.inbox.time.all": "All",
  "radar.inbox.sort": "Sort by",
  "radar.inbox.sort.recommended": "Best product fit",
  "radar.inbox.sort.newest": "Newest posts",
  "radar.inbox.sort.oldest": "Oldest posts",
  "radar.inbox.sort.productFit": "Closest product match",
  "radar.inbox.sort.demandIntent": "Clearest demand",
  "radar.inbox.moreFilters": "More filters",
  "radar.inbox.moreFiltersN": "More filters ({n})",
  "radar.inbox.hideFilters": "Hide extra filters",
  "radar.inbox.moreFiltersAria": "More filters",
  "radar.inbox.brand": "Brand",
  "radar.inbox.allBrands": "All brands",
  "radar.inbox.product": "Product",
  "radar.inbox.allProducts": "All products",
  "radar.inbox.band": "Intent",
  "radar.inbox.allBands": "All intent",
  "radar.inbox.band.high": "High",
  "radar.inbox.band.mid": "Medium",
  "radar.inbox.band.low": "Low",
  "radar.inbox.match": "Product match",
  "radar.inbox.allStates": "All states",
  "radar.inbox.state.eligible": "Follow up",
  "radar.inbox.state.weak": "Weak fit",
  "radar.inbox.state.excluded": "Excluded",
  "radar.inbox.state.generic": "No product",
  "radar.inbox.state.stale": "Older than 14 days",
  "radar.inbox.loading": "Preparing patrol results…",
  "radar.inbox.prevPage": "Previous",
  "radar.inbox.nextPage": "Next",
  "radar.inbox.pageOf": "Page {page} of {pages}",
  "radar.inbox.goCrm": "Open CRM",
  "radar.inbox.see7d": "See last 7 days",
  "radar.inbox.empty.filteredPending": "No results for this filter",
  "radar.inbox.empty.filteredCompleted": "No reviewed results yet",
  "radar.inbox.empty.filteredRemoved": "No discarded results yet",
  "radar.inbox.empty.filteredHint": "Clear filters or change the time range. Fresh patrol results may also be under Last 7 days or All.",
  "radar.inbox.empty.noCompleted": "Nothing reviewed yet",
  "radar.inbox.empty.noCompletedHint": "Switch back to New to keep going through pain points.",
  "radar.inbox.empty.noRemoved": "Nothing discarded yet",
  "radar.inbox.empty.noRemovedHint": "Switch back to New to keep going through pain points.",
  "radar.inbox.empty.noWatchesTitle": "No patrol set up",
  "radar.inbox.empty.noWatchesHint": "Type what customers search and start. Brand can wait.",
  "radar.inbox.empty.pausedTitle": "Daily patrol is off",
  "radar.inbox.empty.pausedHint": "Run now and daily patrol both stay on this page. Turn at least one watch back on to use either.",
  "radar.inbox.empty.openSchedule": "Turn on daily patrol",
  "radar.inbox.empty.neverTitle": "Not patrolled yet",
  "radar.inbox.empty.neverHint": "Daily patrol is on. You can also press Run now. This is not an empty inbox — the first round has not finished.",
  "radar.inbox.empty.failedTitle": "The last patrol did not finish",
  "radar.inbox.empty.noHitsTitle": "Search found no posts",
  "radar.inbox.empty.noHitsHint": "It was empty before scoring: keywords too long, too product-named, or Threads returned nothing. Use 2–4 character pain words customers type.",
  "radar.inbox.empty.editTerms": "Edit keywords",
  "radar.inbox.empty.noFitTitle": "Patrol ran, but no matching pain points",
  "radar.inbox.empty.noFitStats": "Search hits {hits}, judged {judged}, created {created}. Older posts may show under Last 7 days or All.",
  "radar.inbox.empty.noFitHint": "New posts or product-fit demand will appear here. You can also check Last 7 days or All, or change keywords.",
  "radar.inbox.msg.kept": "Kept. No CRM contact was created.",
  "radar.inbox.msg.removed": "Discarded. You can restore it from Discarded.",
  "radar.inbox.msg.restored": "Restored.",
  "radar.inbox.msg.accepted": "Added to CRM. This step is optional — go there later if you want to follow up.",
  "radar.inbox.msg.widened7d": "Not every patrol result was posted today. Switched to last 7 days ({n}). Job judge/create counts include rematches, so they may not all be new cards.",
  "radar.inbox.msg.widenedAll": "No pending results in the last 7 days. Switched to all ({n}).",
  "radar.inbox.msg.alreadyReviewed": "The {n} judged this round are already in Reviewed, so New is empty. Job numbers include rematched older posts.",
  "radar.inbox.msg.waitingWorker": "Run now queued · waiting for a worker",
  "radar.inbox.err.noActive": "No daily patrol is on. Set product keywords first, or resume a watch.",
  "radar.inbox.err.noJob": "No patrol job was queued.",
  "radar.inbox.msg.running": "Patrol is running… pain points appear here when it finishes.",
  "radar.inbox.err.failed": "Patrol failed.",
  "radar.inbox.err.cancelled": "Patrol was cancelled, so it is not marked complete. You can run it again.",
  "radar.inbox.msg.queuedN": "Queued {n} patrols still running in the background. You can leave this page; results will stay here.",
  "radar.inbox.msg.doneWithSummary": "{summary} Posts not from today also stay in the list.",
  "radar.inbox.msg.done": "This patrol finished. Matching pain points are listed below.",
  "radar.card.priority.high": "Follow first",
  "radar.card.priority.review": "Worth a look",
  "radar.card.priority.low": "Low priority",
  "radar.card.fitProduct": "Fit · {label}",
  "radar.card.noProduct": "No product match",
  "radar.card.intent": "Intent {n}",
  "radar.card.why": "Why recommended: ",
  "radar.card.unknownAuthor": "Unknown author",
  "radar.card.openOriginal": "View original on Threads",
  "radar.card.actionsAria": "Opportunity actions",
  "radar.card.keep": "Keep",
  "radar.card.discard": "Discard",
  "radar.card.whyBtn": "Why recommended",
  "radar.card.accept": "Add to CRM (optional)",
  "radar.card.busy": "Working…",
  "radar.card.restore": "Restore",
  "radar.card.accepted": "In CRM",
  "radar.card.done": "Handled",
  "radar.card.removeAria": "Mark as not a fit",
  "radar.card.removeTitle": "Why discard?",
  "radar.card.removeHint": "After you pick a reason it leaves New, and later patrols will not surface the same post. This does not use credits.",
  "radar.card.reason": "Reason",
  "radar.card.reason.pain_mismatch": "Does not match product pain",
  "radar.card.reason.provider_or_ad": "Vendor / ad post",
  "radar.card.reason.stale": "Demand is stale",
  "radar.card.reason.already_solved": "Already solved",
  "radar.card.reason.duplicate": "Duplicate",
  "radar.card.reason.other": "Other",
  "radar.card.note": "Notes",
  "radar.card.duplicateHint": "In the detail drawer you can pick which original to keep.",
  "radar.card.confirmRemove": "Discard",
  "radar.drawer.aria": "Opportunity detail",
  "radar.drawer.title": "Opportunity detail",
  "radar.drawer.noProduct": "No product",
  "radar.drawer.close": "Close",
  "radar.drawer.closeAria": "Close opportunity detail",
  "radar.drawer.intent": "Intent {n}",
  "radar.drawer.priority": "Priority {n}",
  "radar.drawer.evidence": "Demand evidence",
  "radar.drawer.matches": "Product match and risks",
  "radar.drawer.reply": "How to reply",
  "radar.drawer.generic": "No product assigned. This stays as generic demand.",
  "radar.drawer.judge": "Original judgment",
  "radar.drawer.openOriginal": "Open original on Threads",
  "radar.drawer.hint": "Read the pain and product reasons first. Keep or discard. Add to CRM only if you want to follow this person.",
  "radar.sweep.aria": "Patrol funnel",
  "radar.sweep.title": "Where this patrol stopped",
  "radar.sweep.hint": "Merged matches are not counted as new opportunities.",
  "radar.sweep.status.complete": "Done",
  "radar.sweep.status.partial_budget": "Paused on budget",
  "radar.sweep.status.blocked_budget": "Out of credits",
  "radar.sweep.status.failed": "Failed",
  "radar.sweep.hits": "Hits",
  "radar.sweep.deduped": "Deduped",
  "radar.sweep.prefilterPass": "Prefilter pass",
  "radar.sweep.prefilterReject": "Prefilter out",
  "radar.sweep.cached": "Cached judge",
  "radar.sweep.aiJudge": "AI judge",
  "radar.sweep.created": "New opportunities",
  "radar.sweep.deferred": "Budget deferred",
  "radar.sweep.credits": "Credits: search {search} · demand map {map} · judge {judge}",
  "radar.sweep.total": "Total {n}",
  "radar.sweep.budgetHint": "Unused candidates stay for the next run. Already-judged items are not charged again.",
  "radar.cost.aria": "Credit preview",
  "radar.cost.title": "Confirm credits before running",
  "radar.cost.hint": "The preview itself is free. Credits are used only when the provider returns a result.",
  "radar.cost.byok": "BYOK · 0 platform credits",
  "radar.cost.platform": "Platform credits",
  "radar.cost.fixed": "Fixed",
  "radar.cost.range": "Estimated range",
  "radar.cost.calls": "Search calls",
  "radar.cost.remaining": "Remaining",
  "radar.cost.until": "Preview until {time}",
  "radar.cost.ceiling": "Max credits for this run",
  "radar.cost.ceilingHint": "At least {min}, at most {max}",
  "radar.cost.invalid": "The ceiling must be between the fixed cost and the estimated max.",
  "radar.cost.confirm": "Confirm and run",
  "radar.cost.starting": "Starting…",
  "radar.readiness.title": "Product context completeness",
  "radar.readiness.audience": "Audience",
  "radar.readiness.context": "Context",
  "radar.readiness.pain": "Pain",
  "radar.readiness.capability": "Capability terms",
  "radar.readiness.ok": "Filled",
  "radar.readiness.todo": "Missing",
  "radar.readiness.hint": "Thin context lowers fit confidence, but you can still create a product radar.",
  "radar.match.why": "Why it fits",
  "radar.match.hide": "Hide evidence",
  "radar.match.basis": "Product basis: {text}",
  "radar.match.risks": "Risks: {text}",
  "radar.today.needMore": "Not seeing a post you want?",
  "radar.today.msg.primarySet": "Primary product saved. Later high-score matches will not overwrite this.",

  "radar.primary.empty": "No product matches yet",
  "radar.primary.label": "Primary product",
  "radar.primary.placeholder": "Choose a product",
  "radar.primary.needsReason": " · reason required",
  "radar.primary.reasonAria": "Primary-product reason",
  "radar.primary.reasonPh": "Optional: why this product this time",
  "radar.primary.submit": "Set primary",
  "radar.primary.defaultReason": "Chosen from product evidence",

  "radar.watches.needBrandProduct": "Pick a brand and product before enabling a product radar.",
  "radar.watches.needDemandMap": "Finish the product demand map before starting a product patrol.",
  "radar.watches.needBrandProductShort": "Pick a brand and product first.",
  "radar.watches.assigned": "Product attached. You cannot swap the product on this watch later.",
  "radar.watches.assigning": "Attaching…",
  "radar.watches.assign": "Attach this product",
  "radar.watches.productGone": "Product unavailable — create a new watch",
  "radar.watches.pickBrand": "Pick a brand first",
  "radar.watches.pickProduct": "Pick a product under this brand",

  "radar.explore.needProduct": "Pick a brand and product before exploring, so generic hits are not treated as product demand.",
  "radar.explore.pickBrand": "Pick a brand",
  "radar.explore.pickProduct": "Pick a product",
  "radar.explore.productStats": "New demand {created} · merged matches {merged} · scored {matched}",

  "radar.import.needProduct": "Pick a brand and product before importing.",

  "radar.suggest.basis": "Based on: {text}",

  "radar.demand.title": "Product demand map",
  "radar.demand.hint": "Confirm real product pains first, then use them to narrow patrol results. Source stays next to each term.",
  "radar.demand.aria": "{label} demand map",
  "radar.demand.ready": "Ready",
  "radar.demand.incomplete": "Needs more",
  "radar.demand.version": "Version {n}",
  "radar.demand.loading": "Building the demand map…",
  "radar.demand.pain": "User pains",
  "radar.demand.painHint": "Problems the product solves, e.g. leaks or messy collaboration",
  "radar.demand.scenario": "Use scenarios",
  "radar.demand.scenarioHint": "How people describe the situation",
  "radar.demand.outcome": "Desired outcomes",
  "radar.demand.outcomeHint": "The result or improvement they want",
  "radar.demand.solution": "Solution signals",
  "radar.demand.solutionHint": "Words that show you can help",
  "radar.demand.exclusion": "Exclusion signals",
  "radar.demand.exclusionHint": "Hiring, ads, and other posts that should not become demand",
  "radar.demand.custom": "Custom notes",
  "radar.demand.customHint": "Custom notes do not overwrite product data; later product updates still keep the source.",
  "radar.demand.save": "Save demand map",
  "radar.demand.saving": "Saving…",
  "radar.demand.origin.product": "Product",
  "radar.demand.origin.ai": "AI suggestion",
  "radar.demand.origin.user": "Manual",
  "radar.demand.customBasis": "Manual note",

  "radar.query.aria": "Query plan preview",
  "radar.query.title": "These short terms will be searched",
  "radar.query.hint": "At most two words per group, CJK 2–4 characters each, so Threads can find them. Product names are only supporting context.",
  "radar.query.meta": "Input {input} · map v{map}",
  "radar.query.group": "Query group {n}",
  "radar.query.basis": "Based on: {text}",
  "radar.query.exclude": "Exclude: {text}",
  "radar.query.adopt": "Use these queries",
  "radar.query.empty": "The demand map does not have enough searchable pains or scenarios to build query groups yet.",
  "radar.query.defaultBasis": "Product pain",

  "brands.loadFail": "Could not load brands. Try again later.",
  "brands.deleteImpact": "This will pause {n} related demand watches. Historical demand and touch records stay.",

  "crm.board.touchProduct": " · Product: {label}",
  "crm.board.primaryProduct": "Primary product: {label}",
  "crm.board.primaryProductWithBrand": "Primary product: {label} ({brand})",
  "crm.board.noProduct": "No product set",

  "utm.title": "UTM tracking links",
  "utm.new": "New",
  "utm.dest": "Destination URL",
  "utm.label": "Label",
  "utm.create": "Create",
  "utm.empty": "No links yet",
  "utm.track": "Track: {url}",
  "utm.destLine": "Destination: {url}",
  "utm.clicks": "Clicks: {n}",
  "utm.copy": "Copy link",
  "utm.created": "Tracking link created",
  "utm.copied": "Tracking link copied",
  "utm.copyFail": "Could not copy — select the URL manually",

  "tools.pain.title": "Pain-keyword generator",
  "tools.pain.subtitle": "No login: describe the product to generate patrol terms and pains.",
  "tools.pain.brief": "Product brief",
  "tools.pain.audience": "Audience (optional)",
  "tools.pain.run": "Generate keywords",
  "tools.pain.running": "Generating…",
  "tools.pain.result": "Result",
  "tools.pain.keywords": "Keywords",
  "tools.pain.pains": "Pains",
  "tools.pain.scan": "Scan terms",
  "tools.pain.login": "Sign in to patrol",

  "tools.style.title": "Style fingerprint quiz",
  "tools.style.subtitle": "No login: paste a few Threads posts to see tone and rhythm.",
  "tools.style.samples": "Post samples",
  "tools.style.run": "Analyze",
  "tools.style.running": "Analyzing…",
  "tools.style.result": "Result",
  "tools.style.tone": "Tone: {v}",
  "tools.style.rhythm": "Rhythm: {v}",
  "tools.style.hooks": "Hooks: {v}",
  "tools.style.avoid": "Watch-outs: {v}",
  "tools.style.login": "Sign in to Lapras",

  "inspire.source": "Source: {label}",

  "bench.title": "Benchmark",
  "bench.reload": "Refresh",
  "bench.sample": "Sample {n}",
  "bench.median": "Median engagement {eng}% · median views {views}",
  "bench.yours": "Your engagement {eng}% · avg views {views}",
  "bench.insufficient": "Not enough sample",

  "insights.summaryTitle": "Last 3 months",
  "insights.summaryStats": "Posts {posts} · views {views} · likes {likes} · replies {replies} · avg engagement {eng}%",
  "insights.summaryTop": "Stronger posts",
  "insights.topPostLine": "{eng}% · {views} views · {text}",

  "playbooks.title": "Playbook market",
  "playbooks.allKinds": "All types",
  "playbooks.kind.brief": "Patrol brief",
  "playbooks.kind.persona": "Persona",
  "playbooks.kind.play": "Reply play",
  "playbooks.nichePh": "Niche (skincare / parenting…)",
  "playbooks.mineOnly": "Mine only",
  "playbooks.publish": "Publish template",
  "playbooks.cancel": "Cancel",
  "playbooks.publishCard": "Publish",
  "playbooks.fieldTitle": "Title",
  "playbooks.fieldNiche": "Niche",
  "playbooks.fieldBody": "Content",
  "playbooks.anonymous": "Anonymous",
  "playbooks.submit": "Submit",
  "playbooks.empty": "No templates yet",
  "playbooks.imports": "Imported {n}",
  "playbooks.import": "Import",
  "playbooks.published": "Published",
  "playbooks.imported": "Imported into your playbooks",

  "radar.import.open": "Manual import",
  "radar.import.close": "Hide manual import",
  "radar.import.title": "Manually import demand",
  "radar.import.hint": "Paste a Threads/Facebook post URL and its text; it runs the same five-question judge. Arbitrary URLs are not fetched automatically, so paste the text yourself. Use this to top up today's list when volume is low.",
  "radar.import.url": "Post URL",
  "radar.import.text": "Post text",
  "radar.import.author": "Author (optional)",
  "radar.import.addRow": "+ Add row",
  "radar.import.removeRow": "Remove",
  "radar.import.submit": "Import",
  "radar.import.submitting": "Importing…",
  "radar.import.needRow": "Fill in at least one row with a URL and text",
  "radar.import.csvOpen": "Paste CSV instead",
  "radar.import.csvClose": "Hide CSV",
  "radar.import.csvLabel": "Paste CSV",
  "radar.import.csvHint": "Format: url,text,author (author optional). A header row with url/text is auto-detected; otherwise columns are read as url,text,author.",
  "radar.import.csvApply": "Apply to rows below",
  "radar.import.csvEmpty": "Couldn't parse any rows — check the format",
  "radar.import.status.qualified": "Added to today's demand",
  "radar.import.status.rejected": "Judged as not a fit (kept for reference)",
  "radar.import.status.skipped": "Already imported — skipped",
  "radar.import.status.failed": "Import failed",

  "radar.explore.open": "Explore now",
  "radar.explore.close": "Hide explore",
  "radar.explore.title": "Explore now",
  "radar.explore.hint": "Search Threads right away for people looking for your service. Results go through the same five-question judge into today’s list. Max 2 words per query, 2–4 CJK chars each.",
  "radar.explore.loadingSuggest": "Loading suggested terms…",
  "radar.explore.suggestions": "Suggested short terms (click to add)",
  "radar.explore.selected": "Selected terms",
  "radar.explore.emptyTerms": "No terms yet — pick a suggestion or add your own.",
  "radar.explore.removeChip": "Click to remove",
  "radar.explore.addLabel": "Add a short term",
  "radar.explore.addPh": "e.g. nanny recommend",
  "radar.explore.add": "Add",
  "radar.explore.run": "Start explore",
  "radar.explore.running": "Exploring…",
  "radar.explore.needTerms": "Pick at least one term",
  "radar.explore.result": "Found {hits}, judged {judged}, added {created}",
  "radar.explore.resultZeroHint": "Nothing new this run. Try more conversational short terms, or adjust daily watches.",
  "radar.explore.resultTruncated": "{n} skipped by daily cap — try again tomorrow or upgrade.",
  "radar.explore.termError.empty": "Enter a term",
  "radar.explore.termError.tooLong": "At most 12 characters without spaces (long Threads queries often return nothing)",
  "radar.explore.termError.tooManyTokens": "At most 2 words (space-separated)",
  "radar.explore.termError.invalidToken": "No punctuation, emoji, AND/OR, or tokens that are too short/long",
  "radar.explore.termError.duplicate": "Already added",
  "radar.explore.termError.max": "At most 6 terms per run",

  "scout.promote": "Save to Demand",
  "scout.promoted": "Copied into Today’s demand ({band} · {score}) — follow up under Demand",
  "scout.promoteFail": "Could not save to Demand",

  "crm.board.title": "CRM board",
  "crm.board.subtitle": "Seven stages plus follow-up. Contacts land here after you accept an opportunity.",
  "crm.board.link.today": "Today's opportunities",
  "crm.board.link.followups": "Follow-ups",
  "crm.board.link.stats": "Conversion stats",
  "crm.board.filters": "Contact filters",
  "crm.board.search": "Search contacts",
  "crm.board.searchPlaceholder": "Search name or Threads handle",
  "crm.board.stageFilter": "Stage",
  "crm.board.allStages": "All stages",
  "crm.board.sort": "Sort",
  "crm.board.sortRecent": "Recent touch first",
  "crm.board.sortIntent": "Intent score first",
  "crm.board.clearFilters": "Clear filters",
  "crm.board.results": "{n} contacts",
  "crm.board.noResults": "No matching contacts",
  "crm.board.noResultsHint": "Try another name or handle, or clear the stage filter.",
  "crm.board.empty": "No contacts yet",
  "crm.board.emptyHint": "Accept an opportunity on the radar to add someone here.",
  "crm.board.oppCount": "opportunities",
  "crm.board.lastTouch": "Last touch {time}",
  "crm.board.noTouch": "No touch time yet",
  "crm.board.stage": "Current stage",
  "crm.board.conversion": "Conversion",
  "crm.board.amount": "Amount (optional)",
  "crm.board.reportWon": "Report won",
  "crm.board.notes": "Notes",
  "crm.board.noteLabel": "Add a note",
  "crm.board.addNote": "Save note",
  "crm.board.timeline": "Timeline",
  "crm.board.timelineEmpty": "No touches yet",
  "crm.board.opps": "Related opportunities",
  "crm.board.markFollowUp": "Mark follow-up",
  "crm.board.clearFollowUp": "Clear follow-up",
  "crm.board.msg.stage": "Stage updated",
  "crm.board.msg.followUp": "Follow-up updated",
  "crm.board.msg.won": "Conversion reported",
  "crm.board.msg.note": "Note added",
  "crm.board.deleteTitle": "Remove from working list",
  "crm.board.deleteHint": "It disappears and reminders stop; opportunity, touch, and conversion history stays.",
  "crm.board.delete": "Remove this contact",
  "crm.board.deleting": "Removing…",
  "crm.board.confirmDelete": "Remove “{name}” from the list? Existing opportunities, touches, and conversion history stay.",
  "crm.board.msg.deleted": "Removed from the list",

  "crm.stage.new_found": "New",
  "crm.stage.engaged": "Engaged",
  "crm.stage.dm_sent": "DM sent",
  "crm.stage.replied": "Replied",
  "crm.stage.quoted": "Quoted",
  "crm.stage.won": "Won",
  "crm.stage.lost": "Lost",
  "crm.stage.needs_follow_up": "Follow-up",

  "crm.followups.title": "Follow-ups",
  "crm.followups.subtitle": "Due visits, snooze, and AI drafts.",
  "crm.followups.link.board": "CRM board",
  "crm.followups.link.stats": "Conversion stats",
  "crm.followups.empty": "Nothing due",
  "crm.followups.emptyHint": "Mark a contact for follow-up or send a reply to create one.",
  "crm.followups.due": "Due",
  "crm.followups.openContact": "Open contact",
  "crm.followups.aiMessage": "AI follow-up draft",
  "crm.followups.done": "Done",
  "crm.followups.snooze": "Snooze 3 days",
  "crm.followups.escalatedHint": "Notified twice with no action — consider marking lost.",
  "crm.followups.status.scheduled": "Scheduled",
  "crm.followups.status.notified": "Notified",
  "crm.followups.status.done": "Done",
  "crm.followups.status.snoozed": "Snoozed",
  "crm.followups.status.escalated": "Escalated",
  "crm.followups.msg.done": "Done",
  "crm.followups.msg.snoozed": "Snoozed 3 days",
  "crm.followups.msg.drafted": "Follow-up draft ready",

  "crm.stats.title": "Conversion stats",
  "crm.stats.subtitle": "Terms, reply variants, and sources. No ranking when samples are thin.",
  "crm.stats.terms": "Term conversion",
  "crm.stats.variants": "Variant success",
  "crm.stats.sources": "Win sources",
  "crm.stats.emptyDim": "Not enough data yet",
  "crm.stats.unavailableDim": "This dimension is not available yet (still being built, not missing data)",
  "crm.stats.insufficient": "Insufficient sample",
  "crm.stats.col.term": "Term",
  "crm.stats.col.variant": "Variant",
  "crm.stats.col.source": "Source",
  "crm.stats.col.accepted": "Accepted",
  "crm.stats.col.replied": "Replied",
  "crm.stats.col.won": "Won",
  "crm.stats.col.used": "Used",
  "crm.stats.col.rate": "Rate",
};
