"auth.login.setPasswordFirstBody":"use the invite link from your email. If the link went to an old address (email drift), ask a company admin to re-issue a set-password invite to {email}.",
"auth.login.yourEmail":"your email",
"auth.login.platformAdminsReissue":"Platform admins can re-issue from",
"auth.login.adminUsersLink":"Admin → Users",
"auth.login.haveToken":"Have a token? Open accept invite",
"auth.login.noAccount":"No account?",
"auth.login.createCompany":"Create company",
"auth.login.haveInvite":"Have an invite or set-password link?",
"auth.login.acceptInvite":"Accept invite",
"auth.login.forgotPassword":"Forgot password?",
"auth.login.forgotPasswordHelp":"Enter your email on the reset page. If you never set a password, use your invite / set-password link instead.",
"auth.forgot.title":"Forgot password",
"auth.forgot.description":"Enter your account email. If it matches an active account, we will send a reset link.",
"auth.forgot.submit":"Send reset link",
"auth.forgot.submitting":"Sending…",
"auth.forgot.failed":"Could not request a reset",
"auth.forgot.sentTitle":"Check your email",
"auth.forgot.sentBody":"If an account exists for that address, a reset link is on the way. The link expires in one hour.",
"auth.forgot.backToSignIn":"Back to sign in",
"auth.reset.title":"Reset password",
"auth.reset.description":"Choose a new password for your Descrybe account (at least 8 characters).",
"auth.reset.submit":"Save new password",
"auth.reset.submitting":"Saving…",
"auth.reset.failed":"Could not reset password",
"auth.reset.doneTitle":"Password updated",
"auth.reset.doneDescription":"Sign in with your email and new password.",
"auth.reset.goToSignIn":"Go to sign in",
"auth.reset.passwordConfirm":"Confirm password",
"auth.reset.passwordMismatch":"Passwords do not match",
"auth.reset.missingTitle":"Missing reset link",
"auth.reset.missingDescription":"Open the link from your email to choose a new password.",
"auth.reset.requestNewLink":"Request a new reset link",
"auth.reset.tokenMissing":"No reset link was provided. Use the link from your email, or request a new one.",
"auth.reset.tokenInvalid":"This reset link is invalid or expired. Request a new one from the forgot-password page.",
"auth.reset.linkRecognized":"Reset link recognized. Enter a new password below — the secret is not shown on this page.",
"auth.reset.tokenLabel":"Reset token",
"auth.reset.passwordHint":"At least 8 characters. No other complexity rules.",
"auth.register.title":"Create company",
"auth.register.description":"Registers a company and its admin user.",
"auth.register.companyName":"Company name",
"auth.register.submit":"Create account",
"auth.register.submitting":"Creating…",
"auth.register.failed":"Registration failed",
"auth.register.haveAccount":"Already have an account?",
"auth.register.signIn":"Sign in",
"auth.invite.title":"Accept invite",
"auth.invite.setPasswordTitle":"Set password",
"auth.invite.description":"Set your password to join the company. Your admin assigned either Member (day-to-day work) or Admin (team and billing).",
"auth.invite.setPasswordDescription":"Choose a password for your migrated Descrybe account (at least 8 characters).",
"auth.invite.checking":"Checking invite…",
"auth.invite.forEmail":"Invite for {email}.",
"auth.invite.linkRecognized":"Invite link recognized. Enter a password below to continue — the secret is not shown on this page.",
"auth.invite.resetLinkRecognized":"Reset link recognized. Enter a password below to continue — the secret is not shown on this page.",
"auth.invite.tokenLabel":"Invite token",
"auth.invite.resetTokenLabel":"Reset token",
"auth.invite.tokenHelp":"Paste the token from your invite email. It is masked in this field.",
"auth.invite.passwordHint":"At least 8 characters. No other complexity rules.",
"auth.invite.submit":"Accept invite",
"auth.invite.setPasswordSubmit":"Set password",
"auth.invite.accepting":"Accepting…",
"auth.invite.saving":"Saving…",
"auth.invite.verifyFailed":"Could not verify invite",
"auth.invite.verifySetPasswordFailed":"Could not verify set-password link",
"auth.invite.acceptFailed":"Could not accept invite",
"auth.invite.setPasswordFailed":"Could not set password",
"auth.invite.expired":"This invite is invalid or expired. Ask your company admin to send a new invite, then open the new link (or paste the new token below).",
"auth.invite.setPasswordExpired":"This set-password link is invalid or expired. Ask a company or platform admin to re-issue it, then open the new link (or paste the new token below).",
"auth.invite.emailMismatchDefault":"You're signed in as a different email than this invite.",
"auth.invite.expiredFooter":"Expired link? Ask an admin to re-issue — there is no self-serve resend API. Platform admins:",
"auth.invite.doneDescription":"Your account is ready. Next, open the dashboard to work with feeds and products, or review company settings.",
"auth.invite.doneSetPasswordDescription":"Sign in with your email and new password to open your workspace.",
"auth.invite.openDashboard":"Open dashboard",
"auth.invite.companySettings":"Company settings",
"auth.invite.goToSignIn":"Go to sign in",
"auth.invite.afterSignInNote":"After sign-in you land in your workspace — the greenfield setup tour is skipped.",
"auth.invite.mismatchTitle":"Wrong account for this invite",
"auth.invite.mismatchDescription":"This link is for a different email than the one you're signed in with. Sign out to continue as the invited user, or stay signed in and ask an admin to re-issue the invite.",
"auth.invite.mismatchDetail":"Signed in as {session}, but this invite is for {invite}.",
"auth.invite.mismatchFallback":"Signed-in email does not match this invite.",
"auth.invite.switchAccountBody":"sign out, then finish this form with the invited email{emailSuffix}.",
"auth.invite.reissueTitle":"Re-issue path:",
"auth.invite.reissueBody":"if your real login email changed (email drift), ask a company admin to revoke this invite and send a new one to the email you use to sign in. Platform admins can also re-issue set-password links from Admin → Users.",
"locale.switcher":"Interface language",
"locale.menu":"Choose interface language",
"locale.label":"Dashboard language",
"locale.help":"Changes labels in navigation and settings. Generated content language is set separately under Company.",
"settings.contentLanguage":"Content Language",
"settings.contentLanguageHelp":"Language used for product titles, descriptions, and other generated content",
"settings.tab.profile":"Profile",
"settings.tab.company":"Company",
"settings.tab.alerts":"Alerts",
"settings.tab.apiKeys":"API keys",
"settings.tab.team":"Team",
"settings.title":"Settings",
"settings.description":"Account, company, API keys, and team.",
"settings.accessDenied":"You don't have permission to open company settings. Ask a company admin for help.",
"settings.loadFailed":"Failed to load settings",
"settings.profileHeading":"Profile",
"settings.personalInfo":"Personal Information",
"settings.personalInfoHelp":"Update your personal details",
"settings.firstName":"First Name",
"settings.firstNamePlaceholder":"Your first name",
"settings.lastName":"Last Name",
"settings.lastNamePlaceholder":"Your last name",
"settings.email":"Email",
"settings.profileUpdated":"Profile updated.",
"settings.profileUpdateFailed":"Could not update profile",
"settings.setPasswordTitle":"Set password",
"settings.setPasswordHelp":"This account still needs a password. Choose one with at least 8 characters.",
"settings.changePasswordTitle":"Change password",
"settings.changePasswordHelp":"Update the password you use to sign in. Other sessions will be signed out.",
"settings.currentPassword":"Current password",
"settings.newPassword":"New password",
"settings.confirmPassword":"Confirm new password",
"settings.passwordTooShort":"Password must be at least 8 characters.",
"settings.passwordMismatch":"New password and confirmation do not match.",
"settings.currentPasswordRequired":"Enter your current password.",
"settings.passwordSet":"Password set.",
"settings.passwordChanged":"Password changed.",
"settings.passwordSetFailed":"Could not set password",
"settings.passwordChangeFailed":"Could not change password",
"settings.walletLabel":"Wallet",
"settings.walletRemainingHint":"remaining",
"settings.role.member":"Member",
"settings.role.admin":"Admin",
"settings.teamHeading":"Team Members",
"settings.inviteUser":"Invite user",
"settings.teamAdminOnly":"Only company admins can invite, promote, demote, or remove teammates.",
"settings.shareAcceptLink":"Share accept link",
"settings.shareAcceptLinkHelp":"Outbound email is not configured. Copy this one-time link and send it to the invitee. They'll set a password (at least 8 characters) and join with the role you chose.",
"settings.teamForbidden":"You don't have permission to view the team list. Ask a company admin for help.",
"settings.noTeammates":"No teammates yet",
"settings.noTeammatesHelp":"Invite colleagues as Member (products and feeds) or Admin (team and company settings). Pending invites show here until accepted.",
"settings.noTeammatesMemberHelp":"No teammates listed yet. Ask a company admin to send invites.",
"settings.memberActions":"Member actions",
"settings.makeAdmin":"Make admin",
"settings.makeMember":"Make member",
"settings.removeMember":"Remove",
"settings.revokeInvite":"Revoke invite",
"settings.needOneAdmin":"Companies need at least one admin",
"settings.expires":"Expires {date}",
"settings.invalidEmail":"Enter a valid email address.",
"settings.inviteCreatedNoMail":"Invite created for {email} as {role}. Copy the accept link below and share it — outbound email is not configured.",
"settings.inviteSent":"Invite sent to {email} as {role}. They should open the email and accept before it expires.",
"settings.inviteFailed":"Could not send invite",
"settings.revokeConfirm":"Revoke this invitation?",
"settings.revoked":"Invitation revoked.",
"settings.revokeFailed":"Could not revoke invite",
"settings.removeConfirm":"Remove {email} from this company?",
"settings.memberRemoved":"{email} removed.",
"settings.removeFailed":"Could not remove user",
"settings.roleChangeConfirm":"{action} {email} to {role}?",
"settings.roleChanged":"{email} is now {role}.",
"settings.roleChangeFailed":"Could not update role",
"settings.promote":"Promote",
"settings.demote":"Demote",
"settings.inviteTitle":"Invite teammate",
"settings.inviteDescription":"They'll get a link to set a password (at least 8 characters) and join this company.",
"settings.inviteRoleHint":"Members manage products and feeds. Admins can also invite teammates and change company settings.",
"settings.sendInvite":"Send invite",
"settings.companyHeading":"Company Settings",
"settings.activeCompany":"Active company",
"settings.creditsOverview":"Credits overview",
"settings.plan":"Plan",
"settings.used":"Used",
"settings.companyInfo":"Company Information",
"settings.companyInfoHelp":"Update your company details",
"settings.companyName":"Company Name",
"settings.companyNamePlaceholder":"Your company name",
"settings.contentSettings":"Content Settings",
"settings.mergeProducts":"Merge products with the same GTIN",
"settings.emailIntegration":"Email integration",
"settings.aiIntegrations":"AI integrations",
"settings.alertsHeading":"Operator alerts",
"settings.inAppToasts":"In-app toasts",
"settings.emailAlerts":"Email alerts",
"settings.apiKeysHeading":"API Keys",
"settings.createApiKey":"Create API Key",
"settings.createApiKeyShort":"Create API key",
"settings.createApiKeyTitle":"Create API key",
"settings.apiKeyLabel":"API key",
"settings.keyName":"Key name",
"settings.storeKeySafe":"Store it somewhere safe — you cannot view the full secret again.",
"settings.apiKeysIntro":"Create a company API key to call the public /api/v1 endpoints. The full secret is shown only once when you create it — copy it immediately.",
"settings.apiKeysUseWhere":"Send it as Authorization: Bearer <key> (preferred) or X-API-Key.",
"dashboard.emptyPaygHint":"Descrybe brings a catalog in, enriches and processes it, then exports or pushes to stores. Use Getting started below.",
"dashboard.emptyCreditsHint":"Descrybe brings a catalog in, enriches and processes it, then exports or pushes to stores. You have {credits} — start with Getting started below.",
"dashboard.workflowTitle":"Catalog workflow",
"dashboard.recentActivity":"Recent activity",
"dashboard.loadFailed":"Failed to load dashboard",
"dashboard.workspaceFallback":"This workspace",
"dashboard.jobFallback":"Job {id}",
"dashboard.workflow.feeds.connect":"Connect a source",
"dashboard.workflowHint":"Catalog in → enrich / process → export or push to stores. Jump to the next step for {name}.",
"dashboard.overviewHint":"Live totals for {name}",
"dashboard.demoEmptyMessage":"Switch to A1 (or another seeded company) in the header, or connect a feed here to populate this sandbox.",
"dashboard.emptyTitle":"Bring a catalog in",
"dashboard.emptyMessage":"Catalog in → enrich / process → export or push to stores. Start with Getting started below (or connect a feed / upload a CSV).",
"dashboard.freePlanTitle":"You're on the Free plan",
"dashboard.freePlanMessageWithLimit":"{used} of {max} products used. Feed mapping, basic cleanup, and EU energy labels (EPREL) are included; upgrade for AI titles and descriptions, and more capacity.",
"dashboard.freePlanMessage":"Feed mapping, basic cleanup, and EU energy labels (EPREL) are included; upgrade for AI titles and descriptions, and more capacity.",
"dashboard.outOfCreditsTitle":"You're out of AI credits",
"dashboard.outOfCreditsMessage":"Buy more credits or upgrade your plan to keep processing.",
"activation.description":"Descrybe brings a catalog in, enriches and processes it, then exports or pushes to stores. Finish the current step, then continue — the demo tour explains screens without changing checklist progress.",
"activation.descriptionShort":"Start with the highlighted step below — one action at a time. Store connect is optional.",
"activation.nextCta":"Do this step",
"activation.valueProp":"Descrybe brings a catalog in, enriches and processes it, then exports or pushes to your stores.",
"activation.alreadyDone":"Already done",
"activation.skipForNow":"Skip for now",
"activation.showAllSteps":"Show all {total} steps",
"activation.showFewerSteps":"Show fewer steps",
"activation.corePathLabel":"In short",
"activation.corePath":"Catalog in → Enrich / process → Export or push to stores",
"activation.storeWizardHint":"Not required for feeds or exports — skip unless you want to push products to a live shop.",
"activation.storeWizardCta":"Open guided store setup",
"activation.focus.map":"Next: open Map on a feed, match columns, then save. Add a feed first if the list is empty.",
"activation.focus.sync":"Next: Sync a sample after mappings are saved. Use Sync on a mapped feed — avoid syncing unmapped sources.",
"activation.focus.dismiss":"Dismiss hint",
"activation.dismiss":"Dismiss checklist",
"hypercare.report.title":"Cutover hypercare",
"hypercare.report.message":"See missing or wrong data after migration? Report it so we can fix your workspace.",
"hypercare.report.cta":"Report missing or wrong data",
"etl.gaps.message":"These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.",
"etl.gaps.dismiss":"Dismiss",
"etl.gaps.apiKeys.title":"API keys",
"etl.gaps.apiKeys.body":"Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.",
"etl.gaps.apiKeys.cta":"Open API keys",
"etl.gaps.blobs.title":"File contents (blobs)",
"etl.gaps.blobs.body":"Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.",
"etl.gaps.blobs.countHint":"{count} file records are metadata-only (bytes were not migrated).",
"etl.gaps.blobs.cta":"Open Files",
"etl.gaps.jobs.title":"Processing history",
"etl.gaps.jobs.body":"Legacy job and task history was not backfilled for cutover. New jobs you start here will appear normally.",
"etl.gaps.jobs.emptyHint":"Optional jobs domain was not run — empty history is expected.",
"etl.gaps.jobs.migratedHint":"{count} jobs were tagged migrated from an optional backfill.",
"etl.gaps.jobs.cta":"Open Processing",
"etl.gaps.woo.title":"Store credentials",
"etl.gaps.woo.body":"WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.",
"etl.gaps.woo.cta":"Open Stores",
"etl.gaps.settings.title":"Company settings",
"etl.gaps.settings.body":"Only language and merge-products settings were imported. Re-check other company preferences in Settings.",
"etl.gaps.settings.cta":"Open company settings",
"activation.progress":"{done} of {total} complete",
"activation.stepsLabel":"Activation steps",
"activation.pausedTitle":"Getting started is paused",
"activation.pausedBody":"Resume anytime — from product fields through export. Store connect stays optional.",
"activation.resume":"Resume checklist",
"activation.step.enable-fields.title":"Turn on product fields",
"activation.step.enable-fields.body":"Choose which standard product columns Descrybe should map and clean.",
"activation.step.connect-source.title":"Add a product feed",
"activation.step.connect-source.body":"Add a CSV or XML catalog feed so products can enter Descrybe. Connecting a live store is a later optional step.",
"activation.step.map.title":"Map feed columns",
"activation.step.map.body":"On Feeds, open Map on your feed, match supplier columns to Descrybe fields, then save.",
"activation.step.sync-sample.title":"Sync a sample",
"activation.step.sync-sample.body":"On Feeds, sync a small sample from a mapped feed to verify the mapping before a full run.",
"docs.tryIt.memberCannotCreate":"Only company admins can create API keys. Legacy keys were not migrated — paste a key below, or ask an admin to create a new one.",
"docs.tryIt.noKeysLegacyAdmin":"Legacy API keys were not migrated. Create a new key via Use my API key or Settings → API keys — the secret is shown only once.",
"docs.tryIt.noKeysLegacyMember":"No API keys listed. Legacy keys were not migrated — ask a company admin to create one, or paste a dk_ key.",
"errors.couldNotUpdateLanguage":"Could not update language",
"toast.support.replyTitle":"Support reply",
"toast.support.replyBody":"Staff replied to your support ticket.",
"toast.support.replyRe":"Re: {subject}",
"toast.support.statusTitle":"Ticket status updated",
"toast.support.statusBody":"Your support ticket status changed.",
"toast.support.updateTitle":"Support update",
"assistant.label":"Assistant",
"assistant.open":"Open system assistant",
"assistant.close":"Close system assistant",
"tutorial.demoTour":"Demo tour",
"tutorial.jumpToTopic":"Jump to a topic",
"tutorial.whereNeedHelp":"Where do you need help?",
"tutorial.skipTour":"Skip tour",
"tutorial.skipAria":"Skip tutorial",
"tutorial.pickerBody":"Pick a section to reopen that part of the demo. Your account data is not changed by browsing the tour.",
"tutorial.sectionsAria":"Tutorial sections",
"tutorial.open":"Open",
"tutorial.close":"Close",
"tutorial.resumeLastStep":"Resume last step",
"tutorial.startFromBeginning":"Start from beginning",
"tutorial.stepOf":"Step {current} of {total}",
"tutorial.jumpTo":"Jump to…",
"tutorial.jumpToSectionAria":"Jump to section",
"tutorial.back":"Back",
"tutorial.pause":"Pause",
"tutorial.continue":"Continue",
"tutorial.finishTour":"Finish tour",
"tutorial.missingTargetHint":"That control isn’t on this screen yet. You can still Continue — the tour never requires a save or sync.",
"tutorial.section.welcome":"Welcome",
"tutorial.section.catalog":"Catalog setup",
"tutorial.section.sources":"Feeds",
"tutorial.section.mapping":"Map & sync",
"tutorial.section.products":"Process",
"tutorial.section.export":"Export & stores",
"tutorial.section.grow":"Grow",
"tutorial.section.done":"Done",
"tutorial.step.welcome.title":"Welcome to Descrybe",
"tutorial.step.welcome.body":"Descrybe’s core loop is Feeds → Process → Export / Stores. This guided demo highlights those screens on your real dashboard — without requiring you to save, sync, enable fields, or create feeds. Pause anytime; resume from the header. Jump to a section when you only need help with one topic.",
"tutorial.step.welcome.tip":"Demo tour — your data stays unchanged until you choose to act outside the tour.",
"tutorial.step.welcome.nextLabel":"Start tour",
"tutorial.step.welcome.missingHint":"You’re on the dashboard — continue when ready.",
"tutorial.step.dashboard-overview.body":"The catalog workflow strip shows the path you’ll use every day: Feeds → Map → Sync → Process. Getting started tracks real workspace progress (separate from this demo). When you’re ready for live work, use Manage feeds or Start processing — then export or connect a store.",
"tutorial.step.dashboard-overview.tip":"Completing this tour does not mark checklist steps done — only real workspace progress does.",
"tutorial.step.dashboard-overview.missingHint":"The workflow strip and checklist appear after the dashboard loads.",
"tutorial.step.enable-fields.body":"Standard Fields are the product columns Descrybe maps, processes, and exports — title, description, GTIN, images, and more. Enable recommended turns on a sensible default set for most catalogs. You can refine the list later without breaking existing mappings.",
"tutorial.step.enable-fields.tip":"In the demo you don’t need to click Enable recommended — Continue when you understand the idea.",
"tutorial.step.enable-fields.warning":"Enabling or disabling fields affects mapping and processing for this company. Prefer Enable recommended once, then tweak carefully.",
"tutorial.step.enable-fields.missingHint":"Wait for the Fields page to load, or open Fields from the Catalog section in the sidebar.",
"tutorial.step.catalog-depth.body":"In the sidebar Catalog section you’ll also find Categories and Attributes. Categories organize the catalog; attributes power filters and structured descriptions. You don’t need to configure them to finish this tour.",
"tutorial.step.catalog-depth.tip":"Return to this section anytime from Jump to… if you revisit taxonomy later.",
"tutorial.step.catalog-depth.missingHint":"Expand Catalog in the sidebar to open Categories or Attributes after the tour.",
"tutorial.step.connect-source.title":"Add a product source",
"tutorial.step.connect-source.body":"Feeds are how supplier catalogs enter Descrybe — CSV, XML, or URL-based files. Add Feed creates a new source; each row shows status (ready for mapping, mapped, active). Map opens the field-matching screen for that feed.",
"tutorial.step.connect-source.tip":"You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.",
"tutorial.step.connect-source.warning":"Avoid deleting live feeds unless you intend to remove that source and its sync history.",
"tutorial.step.connect-source.missingHint":"Open Feeds from the sidebar if this screen hasn’t loaded.",
"tutorial.step.map.title":"Map source fields",
"tutorial.step.map.body":"On a feed’s Map screen you match supplier columns to Descrybe standard fields. Auto-map suggests matches from column names; confirm fuzzy matches, then fix anything wrong. Save Mappings stores the map so sync and processing know how to read each row.",
"tutorial.step.map.tip":"Demo tip: open Map on a feed when you have one — you are not required to save.",
"tutorial.step.map.warning":"Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.",
"tutorial.step.map.missingHint":"Add a feed and click Map to see the mapping UI; or Continue to keep learning.",
"tutorial.step.sync-sample.title":"Sync a sample (when ready)",
"tutorial.step.sync-sample.body":"After mappings are saved, Sync + Process sample pulls a small batch and runs processing so you can verify titles, images, and attributes before a full run. Full Sync now on the feeds list is for larger imports once the sample looks good.",
"tutorial.step.sync-sample.tip":"Skip Sync during the demo — use it only after Save Mappings on a real feed.",
"tutorial.step.sync-sample.warning":"Syncing writes products into this company. Prefer a sample first; avoid Sync now on unmapped feeds.",
"tutorial.step.sync-sample.missingHint":"Sync controls appear on feed rows and on the mapping screen footer.",
"tutorial.step.process.title":"Review products",
"tutorial.step.process.body":"Products lists synced and processed catalog items. Filter by status, open a row for details, and use EPREL badges when energy-label data exists. This is where you spot mapping mistakes before export or store sync.",
"tutorial.step.process.tip":"Browsing products is read-only for exploration — editing a row changes live catalog data.",
"tutorial.step.process.missingHint":"Wait for the products table, or Continue if the catalog is still empty.",
"tutorial.step.processing-hub.body":"Jobs under Processing show AI and pipeline progress: completed runs and failures. Start jobs from the dashboard or products when you intentionally want to spend credits on a batch.",
"tutorial.step.processing-hub.tip":"Jobs consume credits — watch Billing before large runs.",
"tutorial.step.processing-hub.missingHint":"Open Jobs from the Processing section in the sidebar if the page is empty.",
"tutorial.step.stores-hub.body":"After products are processed, Stores connects WooCommerce or Shopify so you can push cleaned catalog data to your shop. Use this when a marketplace or CMS is your destination — or skip to Export feeds if partners only need a file/URL.",
"tutorial.step.stores-hub.tip":"Reconnect banners appear if a token expires — fix those before relying on sync.",
"tutorial.step.stores-hub.missingHint":"Open Stores from the sidebar to see connection cards.",
"tutorial.step.export.body":"Export feeds publish cleaned products as XML or CSV for channels, partners, or your store. Create an export, choose format and filters, then share the feed URL or download. Exports read processed catalog data — map and process first for best results.",
"tutorial.step.export.tip":"You don’t need to create an export during the demo.",
"tutorial.step.export.warning":"Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.",
"tutorial.step.export.missingHint":"Wait for Export feeds to load, or open Exports from the Feeds section in the sidebar.",
"tutorial.step.billing-hub.body":"Billing shows your plan, wallet, and remaining credits. Processing and some AI features draw from this balance. Keep an eye on usage before large catalog runs.",
"tutorial.step.billing-hub.tip":"Demo accounts may show unlimited or large balances — treat production credits carefully.",
"tutorial.step.billing-hub.missingHint":"Open Billing from the Account section in the sidebar.",
"tutorial.step.grow-hub.title":"Campaigns, SEO & reviews",
"tutorial.step.grow-hub.body":"In the Marketing section: Campaigns generate marketing content, Content calendar plans posts, SEO checks listing readiness, and Reviews ties into WooCommerce. These build on a healthy mapped catalog — finish Feeds → Process → Export / Stores before leaning on them.",
"tutorial.step.grow-hub.tip":"Jump back here when you’re ready to market, not during first mapping.",
"tutorial.step.grow-hub.missingHint":"Open Campaigns from Marketing in the sidebar, or Continue.",
"tutorial.step.tour-done.title":"You’re set to explore",
"tutorial.step.tour-done.body":"That’s the product map: Feeds → Map → Sync → Process → Export / Stores. Use Getting started on the dashboard for real setup. Resume or Restart this tour from the header anytime, or Jump to… a section when you need a refresher. Skip tour ends the demo without changing your checklist.",
"tutorial.step.tour-done.tip":"Demo complete — no cleanup needed. Your account was not modified by Continue alone.",
"admin.users.description":"Platform user directory, staff roles, and company plan assignments.",
"admin.users.staffRoleUnavailable":"Staff role updates are not available on this deployment yet. Contact your platform administrator if you need them.",
"admin.users.cloneCatalogWarning":"Replaces categories, feeds, products, attributes, mappings, and brand on the destination. Plan, billing, members, API keys, and store connectors are not copied.",
"admin.users.syncA1Aria":"Sync A1 categories from dump and repair catalog hygiene for {name}",
"admin.users.syncA1Title":"Sync A1 catalog",
"admin.users.syncA1Desc":"Backfills mapped categories from the MySQL dump when present on the API host, then runs catalog hygiene (prompts, weak hashes, bidirectional category backfill, attribute sanitize). Does not wipe or reimport the full catalog.",
"admin.users.syncA1Company":"Company: {name}",
"admin.users.syncA1Warning":"Requires descrybe_new.sql on the API server (scripts/seed/ or SEED_A1_MYSQL_DUMP) for dump category coverage. Without a dump, only DB hygiene runs. No mass reprocess.",
"admin.users.assignRoleDesc":"Platform roles gate the admin panel (Admin & Developer) and the support desk (Support staff).",
"admin.users.staffRole":"Staff role",
"admin.users.saveRole":"Save role",
"admin.users.assignPlanTitle":"Assign plan",
"admin.users.assignPlanDesc":"Attach a public, legacy, or custom plan to this company.",
"admin.users.selectPlan":"Select plan",
"admin.users.assign":"Assign",
"admin.settings.title":"Platform settings",
"admin.settings.description":"Platform credentials, AI roles, mail, and integrations for this deployment",
"admin.settings.intro":"Configure platform AI roles, SMTP, OAuth, EPREL, Pinecone, and Stripe here. Leave secret fields blank to keep the stored value. Per-company keys stay under tenant Integrations.",
"admin.settings.aiRolesUnavailable":"Full AI roles are not available on this deployment yet. Processing still saves via platform OpenAI settings; other roles will persist once supported.",
"admin.settings.tab.integrations":"Overview",
"admin.settings.tab.ai":"AI roles",
"admin.settings.tab.mail":"Mail",
"admin.settings.tab.other":"Other",
"admin.settings.tab.admins":"Admin Users",
"admin.settings.mailCardDesc":"Set-password invites and platform outbound email",
"Creates/updates Stripe Products + one-time Prices using the configured secret key (sk_test_ = test Dashboard, sk_live_ = live). Mock must be off. Price IDs are written into the fields below — Save Integrations if you also change other Stripe values.",
"admin.settings.syncCreditPacksModeHint":"Stripe mode for this sync: {mode}. Switch the secret key (sk_test_ vs sk_live_) to sync the other environment.",
"admin.settings.syncCreditPacksFailed":"Could not sync credit packs to Stripe.",
"admin.diagnostics.description":"Ops console for app health, queue depth, recent jobs, and config presence flags. Secrets and DSNs are never shown; job errors are sanitized.",
"admin.diagnostics.filterAria":"Job status filter",
"admin.diagnostics.queue":"Queue",
"admin.diagnostics.noJobsInQueue":"No jobs in queue.",
"admin.diagnostics.sanitizedErrors":"Sanitized errors · max 25",
"admin.diagnostics.colId":"ID",
"admin.diagnostics.colCompany":"Company",
"admin.diagnostics.colStatus":"Status",
"admin.diagnostics.colProgress":"Progress",
"admin.diagnostics.colUpdated":"Updated",
"admin.diagnostics.colError":"Error",
"admin.diagnostics.colTicket":"Ticket",
"admin.diagnostics.colWhen":"When",
"admin.diagnostics.noJobsFilter":"No jobs for this filter.",
"admin.stuck.title":"Stuck products",
"admin.stuck.description":"Review recent processing jobs and reset jobs stuck running longer than 2 hours",
"admin.stuck.noJobs":"No jobs found.",
"admin.stuck.filterAria":"Filter jobs by status",
"admin.orphan.title":"Orphan processed",
"admin.orphan.description":"Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.",
"admin.orphan.cutoverHint":"Safe by default: refresh and dry-run never delete. Confirm delete sends confirm=true only after you approve the dialog.",
"admin.orphan.refreshReport":"Refresh report",
"admin.orphan.dryRunBtn":"Dry-run cleanup",
"admin.orphan.deleteBtn":"Confirm delete…",
"admin.orphan.loadFailed":"Could not load orphan report",
"admin.orphan.confirmDesc":"This permanently deletes {total} processed_products row(s) whose raw is missing or unprocessed. Job product links use ON DELETE SET NULL.",
"admin.orphan.confirmDelete":"Delete orphans",
"admin.billing.title":"Billing Admin",
"admin.billing.description":"Manage plans, credits, per-package feature permissions, and platform-wide feature switches.",
"admin.permissions.noteBody":"These toggles set what this package may include. Platform-wide on/off masters are on the {global} tab — a plan can enable a feature that still stays off when the platform switch is disabled.",
"admin.permissions.profilesHint":"One-click matrices for public ladder packages and migrated legacy navigation. Saves overrides for the selected package only.",
"admin.gates.sectionsDesc":"Turn an entire product area on or off for all packages. “Section + features” also updates every feature master in that section.",
"admin.gates.sectionAria":"{label} global section",
"admin.knowledge.publishedEligible":"Published (eligible for matching)",
"admin.knowledge.field.name":"Name",
"admin.knowledge.field.templateBody":"Body",
"admin.knowledge.active":"Active",
"admin.settings.card.aiRolesTitle":"Platform AI roles",
"admin.settings.card.aiRolesDesc":"Processing, vectorization, docs/API, and support — separate keys/models",
"admin.settings.roleOff":" (off)",
"admin.settings.roleNotSet":" · not set",
"admin.settings.someRolesUnavailable":"Some AI roles are not available on this deployment yet. Processing still uses the platform OpenAI settings until all roles are supported.",
"admin.settings.tenantDesc":"Company AI keys and marketing email stay under Integrations. Session and encryption secrets stay in the server environment and are not edited here.",
"admin.settings.eprelDesc":"Free public EU energy-label data during product processing. On by default for all plans — no activation or paid upgrade required. Use the controls below only to disable or tune the client.",
"admin.settings.optionalKeySaved":"Optional API key saved",
"admin.settings.noApiKeyNeeded":"No API key needed",
"admin.settings.optionalApiKey":"Optional API key",
"admin.settings.optionalApiKeySavedHint":"(saved — leave blank to keep)",
"admin.settings.optionalApiKeyPublicHint":"(public API works without one)",
"admin.settings.clearEprelKey":"Clear stored EPREL API key",
"admin.settings.pineconeDesc":"Optional vector category suggestions during processing. Host environment values are used when fields here are left empty.",
"admin.settings.aiRole.docs_api.desc":"Future docs/API assistant slot — /docs Ask stays rule-based and must never call this role.",
"admin.settings.aiRole.support.label":"Support",
"admin.settings.aiRole.support.desc":"Ticket auto-reply AI fallback — configure provider/key/model here; enable delivery in Support knowledge → Auto-reply.",
"admin.translations.searchPlaceholder":"Key or text…",
"admin.translations.noKeysMatch":"No keys match",
"admin.translations.badgeMissing":"Missing",
"admin.translations.badgeUnsaved":"Unsaved",
"admin.translations.english":"English",
"admin.bootstrap.title":"Bootstrap Admin Access",
"admin.bootstrap.description":"Confirm whether your account already has platform admin access. New admins must be granted by an existing administrator.",
"admin.bootstrap.statusDesc":"Platform admin access is granted by an existing administrator. There is no self-serve bootstrap for this role.",
"admin.bootstrap.alreadyAdmin":"You already have platform admin access.",
"admin.bootstrap.signedInAs":"Signed in as {email}. Open the admin panel to continue.",
"admin.bootstrap.signedInAsShort":"Signed in as {email}",
"admin.bootstrap.notAdminTitle":"Not a platform admin",
"admin.bootstrap.notAdminMsg":"Your account is signed in but is not marked as platform admin. Ask an existing platform admin to grant access, then sign out and sign in again.",
"admin.bootstrap.goToPanel":"Go to Admin Panel",
"admin.bootstrap.loadFailed":"Failed to load profile",
"admin.migrate.title":"Organization migration",
"admin.migrate.description":"This migration tool is retired and does not change any data.",
"admin.migrate.notAvailable":"Not available",
"admin.migrate.body":"Organization migration from the previous identity provider is no longer needed. Companies and local auth are managed in Users & organizations.",
"admin.migrate.hint":"If you opened this from an old bookmark, continue with Users & organizations, Platform billing, or Stuck products instead.",
"admin.migrate.adminHome":"Admin home",
"admin.migrate.users":"Users",
"admin.redirect.diagnostics":"Redirecting to Diagnostics…",
"admin.redirect.stuck":"Redirecting to Stuck products…",
"common.refresh":"Refresh",
"common.delete":"Delete",
"common.clearSearch":"Clear search",
"common.loading":"Loading…",
"common.never":"Never",
"common.back":"Back",
"common.startOver":"Start over",
"common.create":"Create",
"common.required":"Required",
"common.actions":"Actions",
"common.status":"Status",
"common.nameCol":"Name",
"common.products":"Products",
"common.more":"+{count} more",
"feeds.title":"Your Feeds",
"feeds.loadingDesc":"Loading your supplier feeds…",
"feeds.desc":"{page} on this page · {total} total feeds — supplier CSV/XML URLs and uploads. Connect from Stores for guided options.",
"feeds.storesHub":"Stores hub",
"feeds.addFeed":"Add Feed",
"feeds.searchPlaceholder":"Search feeds...",
"feeds.emptyTitle":"Connect your first product feed",
"feeds.emptyMessage":"Add a supplier CSV/XML URL or upload a file. Next you will map columns, then sync products into your catalog.",
"feeds.connectFeed":"Connect feed",
"feeds.uploadCsvCta":"Upload CSV",
"feeds.noMatchTitle":"No matching feeds",
"feeds.noMatchMessage":"Try a different search term, or clear search to see all feeds.",
"feeds.field.intervalHint":"How often Descrybe should pull this feed automatically while it is active. Use Sync on the feed list for a one-off pull — that does not change this schedule.",
"feeds.createFeed":"Create Feed",
"feeds.editTitle":"Edit Feed",
"feeds.editDesc":"Update name, type, auto-sync schedule, or source URL. Sync on the feed list runs a one-off pull.",
"feeds.csvSource":"CSV source",
"feeds.uploadedCsv":"Uploaded CSV",
"feeds.replaceFileHint":"To replace the file, create a new feed. Sync re-reads the stored upload.",
"feeds.csvTypeLocked":"Uploaded CSV feeds stay type CSV.",
"feeds.saveChanges":"Save Changes",
"feeds.historyTitle":"Sync History",
"feeds.historyDesc":"Recent sync jobs for “{name}”.",
"feeds.mapBeforeSync":"Map fields before syncing this feed.",
"feeds.activateBeforeSync":"Activate the feed before syncing.",
"feeds.syncFinished":"Sync finished",
"feeds.viewProducts":"View products",
"feeds.processing":"Processing",
"feeds.syncFailed":"Sync failed",
"feeds.statusUpdateFailed":"Could not update status",
"feeds.deleteConfirm":"Delete feed “{name}”? This cannot be undone.",
"feeds.deleted":"Feed deleted.",
"feeds.deleteFailed":"Could not delete feed",
"feeds.historyLoadFailed":"Could not load sync history",
"feeds.ftpUnsupported":"FTP/FTPS sync is not supported. Ask your supplier for a public HTTPS feed URL, upload a CSV feed here, or import a file from Uploads.",
"feeds.ftpUnsupportedShort":"FTP sync not supported",
"feeds.ftpBadge":"FTP",
"feeds.ftpMigrateBanner":"Some feeds still use FTP/FTPS. Descrybe cannot pull those links. Switch to a public HTTPS URL, add a CSV feed, or upload from Uploads.",
"feeds.status.readyForMapping":"Ready for Mapping",
"feeds.status.mapped":"Mapped",
"feeds.status.active":"Active",
"feeds.status.inactive":"Inactive",
"feeds.status.error":"Error",
"feeds.status.unknown":"Unknown",
"feeds.actions.menu":"Feed actions",
"feeds.actions.menuSyncing":"Feed actions (sync in progress)",
"feeds.actions.editFeed":"Edit Feed",
"feeds.actions.editMapping":"Edit Mapping",
"feeds.actions.syncNow":"Sync Now",
"feeds.actions.syncInProgress":"Sync in progress…",
"feeds.actions.activateToSync":"Activate feed to sync",
"feeds.actions.viewHistory":"View Sync History",
"feeds.actions.deactivate":"Deactivate Feed",
"feeds.actions.activate":"Activate Feed",
"feeds.actions.delete":"Delete Feed",
"feeds.stats.totalFeeds":"Total Feeds",
"feeds.stats.activeMapped":"{active} active · {mapped} mapped",
"feeds.stats.activeOnly":"{active} active",
"feeds.stats.totalProducts":"Imported products",
"feeds.stats.acrossFeeds":"Raw rows across feeds (not catalog + queue)",
"feeds.stats.processed":"In catalog",
"feeds.stats.readyCatalog":"Processed catalog rows — not a share of imported",
"feeds.stats.unprocessed":"Awaiting process",
"feeds.stats.waiting":"Raw queue — not a share of imported",
"feeds.format.howTo":"How to structure your feed",
"feeds.format.required":"Required:",
"feeds.preview.title":"Feed source preview",
"feeds.preview.truncated":"Truncated",
"feeds.preview.refresh":"Refresh preview",
"feeds.preview.copy":"Copy preview",
"feeds.preview.loading":"Loading preview…",
"feeds.preview.empty":"Extract schema to preview the feed source.",
"feeds.schema.search":"Search fields…",
"feeds.schema.fieldName":"Field name",
"feeds.schema.sourcePath":"Source path",
"feeds.schema.confirm":"Confirm",
"feeds.schema.apply":"Apply",
"feeds.preflight.missingItemPath":"First, choose the repeating product block in your feed (the product element path).",
"feeds.preflight.emptyMappings":"Connect at least one feed column to a product field so we know what to import.",
"feeds.preflight.missingRequired":"These required product fields still need a mapping: {fields}.",
"feeds.preflight.unknownSource":"We could not find these columns in the latest extract: {fields}{more}. Re-extract the schema or pick different sources.",
"feeds.preflight.emptySample":"These required fields are mapped, but sample values look empty: {fields}. Double-check the source columns.",
"feeds.preflight.fix":"Finish the mapping checklist below, then try again.",
"mapping.title":"Feed Mapping",
"mapping.titleNamed":"Map: {name}",
"mapping.description":"Select the repeating product element, extract source fields, then map them to Descrybe product fields.",
"mapping.autoMap":"Auto-map",
"mapping.fuzzy":"{count} fuzzy",
"mapping.extractSchema":"Extract schema",
"mapping.backToFeeds":"Back to Feeds",
"mapping.ftpStillEdit":"{message} You can still edit mappings. To refresh products, switch this feed to HTTPS or upload a file.",
"mapping.step2Help":"Match each important column from your feed to a Descrybe product field. Required fields are marked with *. Hover the help icon for a short tip.",
"mapping.requiredFields":"Required fields",
"mapping.requiredMapped":"{mapped} of {total} mapped",
"mapping.requiredProgressDone":"All required fields mapped — ready for the next step.",
"mapping.requiredProgressHint":"Fields marked * must be mapped before this feed can sync products.",
"mapping.requiredProgressAria":"Required field progress: {mapped} of {total} mapped",
"mapping.nextAfterSaveReady":"Mappings saved. Next, sync a small sample to check products look right.",
"mapping.nextAfterSaveIncomplete":"Mappings saved. Finish the remaining required fields, then sync a sample.",
"mapping.nextCtaSyncSample":"Sync + process sample",
"mapping.formatHelp.https":"Use public HTTPS URLs for remote feeds (not FTP or localhost). CSV upload works for local files.",
"mapping.formatHelp.specs":"Specs as Label: value pairs (e.g. {ram}). Dimensions: {height}, {width}, {depth}, {mass}",
"mapping.formatHelp.also":"Also supported: prices, stock, images, category, warranty, EPREL ID, HTML descriptions, extra images, video URL, and more — download the full sample.",
"mapping.preview.emptyHint":"Map source columns or XPath nodes to product fields. A sample product preview will appear here.",
"mapping.preview.rawSample":"Raw sample snippet",
"imports.title":"Uploads",
"imports.description":"CSV imports saved for this workspace — products, categories, and attributes.",
"imports.importProducts":"Import products",
"imports.emptyTitle":"No uploads yet",
"imports.emptyMessage":"Product, category, and attribute CSV imports will show up here after you upload them.",
"imports.goProducts":"Go to products",
"imports.categories":"Categories",
"imports.recent":"Recent uploads",
"imports.fileCount":"{count} file",
"imports.fileCountPlural":"{count} files",
"imports.col.fileName":"File name",
"imports.col.kind":"Kind",
"imports.col.uploaded":"Uploaded",
"imports.col.size":"Size",
"imports.actions":"Upload actions",
"imports.loadFailed":"Failed to load uploads",
"imports.metadataOnlyNotice":"{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.",
"imports.metadataOnlyBadge":"Metadata only (blob not migrated)",
"imports.deleteConfirm":"Delete “{name}”? This removes the upload record (and local blob when present).",
"reviews.syncDesc":"Inbound import — pull WooCommerce product reviews into Descrybe for campaign and reputation workflows",
"reviews.syncQueued":"Reviews sync queued",
"reviews.statusBadge":"Reviews: {status}",
"reviews.syncedCount":"{count} synced",
"reviews.lastSync":"Last sync: {date}",
"reviews.noSyncYet":"No reviews sync has completed yet.",
"reviews.needsReconnect":"Reviews import cannot run until credentials are reconnected after migration. On the Connection tab: Save, then Test Connection.",
"campaigns.unavailableMessage":"The campaigns service isn’t reachable right now. You can open the create wizard, but generate and send will wait until the service is back.",
"campaigns.openWizard":"Open create wizard",
"campaigns.backDashboard":"Back to dashboard",
"campaigns.browseProducts":"Browse products",
"campaigns.emptyTitle":"No campaigns yet",
"campaigns.noMatches":"No matches",
"campaigns.emptyMessage":"Create a Black Friday, Christmas, or custom campaign in a few steps — seasonal defaults are ready to start from.",
"campaigns.noMatchesMessage":"Try a different name, season, or status.",
"campaigns.create":"Create campaign",
"campaigns.col.season":"Season",
"campaigns.col.updated":"Updated",
"campaigns.scheduled":"Scheduled {date}",
"campaigns.newTitle":"New campaign",
"campaigns.newDesc":"Choose a season, select products and audience, write the prompt, then generate, test, and schedule.",
"campaigns.editTitle":"Edit campaign",
"campaigns.editDesc":"Update the season, products, and audience — then regenerate, send a test, or schedule.",
"campaignWizard.apiMissing":"Campaigns API is temporarily unavailable. You can explore the wizard; save / generate / send need a reachable /api/campaigns.",
"campaignWizard.upgradeTitle":"AI campaigns are a paid feature",
"campaignWizard.upgradeMessage":"Free plans can prepare seasons and audiences, but Generate AI requires Starter or higher. Upgrade to unlock AI email drafts.",
"campaignWizard.comparePlans":"Compare plans",
"campaignWizard.step.season":"Season",
"campaignWizard.step.catalog":"Products",
"campaignWizard.step.audience":"Audience",
"campaignWizard.step.prompt":"Prompt",
"campaignWizard.step.preview":"Preview",
"campaignWizard.step.send":"Send",
"campaignWizard.pickSeason":"Pick a season",
"campaignWizard.pickSeasonHelp":"Start from a template — you can edit everything later.",
"campaignWizard.advancedHelp":"AI generation uses your brand kit (if set) and selected products. Template-only preview skips AI and works as a layout stub.",
"campaignWizard.planFree":"Free",
"campaignWizard.planPaid":"Paid",
"campaignWizard.planLine":"Plan:",
"campaignWizard.aiLocked":"— Generate AI is locked.",
"marketing.footer":"Email campaigns stay at {link} — this page only prepares catalog export feeds.",
"common.done":"Done",
"common.copied":"Copied to clipboard.",
"common.copyFailed":"Could not copy. Select the text and copy manually.",
"common.submitting":"Submitting…",
"common.sending":"Sending…",
"settings.companyAdminOnlyView":"Only company admins can change company settings. You can view the current workspace details.",
"settings.activeCompanyHelp":"Workspace used for catalog, feeds, billing, and API keys. Switch anytime from here or the header.",
"settings.noCompanySelected":"No company selected",
"settings.creditsOverviewHelp":"AI credit balance for the active company. Detailed usage lives on Billing.",
"settings.billingLabel":"Billing",
"settings.remainingLabel":"Remaining",
"settings.creditsUnavailable":"Credit balance is unavailable for this workspace yet.",
"settings.openBilling":"Open usage & billing",
"settings.companyNameHelp":"This name appears in invitations and organization settings",
"settings.contentSettingsHelp":"Configure language and product matching for generated content",
"settings.mergeProductsHelp":"When enabled, CSV imports combine rows that share a GTIN into one product. Turn off to keep each row independent.",
"settings.emailIntegrationHelp":"Set up Resend or SMTP for invites, campaigns, and transactional mail.",
"settings.configureEmail":"Configure email",
"settings.aiIntegrationsHelp":"Platform credits or your own key, plus editable prompts for titles, descriptions, SEO, and campaigns. Encrypted keys at rest.",
"settings.openAiIntegrations":"Open AI integrations",
"settings.companyNameRequired":"Enter a company name.",
"settings.companyUpdateFailed":"Could not update company",
"settings.mergeOn":"Products with the same GTIN will be merged across feeds.",
"settings.mergeOff":"Products with the same GTIN stay separate.",
"settings.mergeUpdateFailed":"Could not update merge setting",
"settings.inAppToastsHelp":"Stored in this browser only. Failures are on by default; completions are muted to reduce noise. Form feedback and Undo actions are never muted.",
"settings.emailAlertsHelp":"Email alert preferences are coming soon. Failure alerts will default on (like in-app); completion emails stay off unless you opt in.",
"settings.emailAlertsBody":"For now, configure transactional mail under Company → Email integration. In-app alerts above still apply.",
"settings.apiKeysLegacyNotice":"Legacy API keys were not migrated. Create a new key to restore API access — the secret is shown only once.",
"settings.apiKeysAdminOnly":"Only company admins can create or revoke API keys. You can view existing key prefixes.",
"settings.apiKeysCopyUnavailableNotice":"Copy unavailable for existing keys — only the prefix is stored. Create a new key to copy the full secret once, then revoke the old key if needed.",
"settings.apiKeysForbidden":"You don't have permission to view API keys. Ask a company admin for help.",
"settings.noApiKeys":"No API keys yet",
"settings.noApiKeysHelpAdmin":"Legacy API keys were not migrated. Create a new key to authenticate Descrybe API requests (X-API-Key). The full secret is shown only once.",
"settings.noApiKeysHelpMember":"No API keys for this company yet. Legacy keys were not migrated — ask a company admin to create one.",
"settings.unnamedKey":"Unnamed Key",
"settings.neverUsed":"Never used",
"settings.apiKeyActions":"API key actions",
"settings.copyUnavailable":"Copy unavailable",
"settings.copyUnavailableTitle":"Full secret is shown only once when the key is created",
"settings.revoke":"Revoke",
"settings.apiKeyNameRequired":"Enter a name for this API key.",
"settings.apiKeyCreatedOnce":"API key created. Copy it now - it won't be shown again.",
"settings.apiKeyCreated":"API key created.",
"settings.apiKeyCreateFailed":"Could not create API key",
"settings.apiKeyRevokeConfirm":"Revoke this API key? Requests using it will stop working.",
"settings.apiKeyRevoked":"API key revoked.",
"settings.apiKeyRevokeFailed":"Could not revoke API key",
"settings.apiKeyCopied":"API key copied.",
"settings.createApiKeyOnceHelp":"Copy this key now — it won't be shown again. Use it as Authorization: Bearer or X-API-Key on /api/v1.",
"settings.createApiKeyNameHelp":"Name the key so you can tell it apart later. After create, send it as Authorization: Bearer (preferred) or X-API-Key.",
"settings.keyNamePlaceholder":"e.g. Production",
"settings.newApiKeyAria":"New API key shown once",
"settings.copyApiKeyAria":"Copy API key",
"settings.alert.sync_fail.title":"Sync failures",
"settings.alert.sync_fail.description":"When a feed sync times out or the API returns an error.",
"flash.admin.catalogCloned":"Copied {source} into {dest}: {products} products, {categories} taxonomy categories, {mapped_with} products with mapped category. Open Products ΓÇö uncategorized SKUs need dump backfill or categorize, not another Fix.",
"flash.admin.imageUploaded":"Image uploaded and inserted into markdown.",
"flash.admin.translationsSaved":"Saved {count} string(s) for {locale}. Commit the message pack when ready.",
"flash.admin.featuresUpdated":"Updated {key}.",
"flash.admin.featuresAllOn":"All features enabled for this plan.",
"flash.admin.featuresAllOff":"All features disabled for this plan.",
"flash.admin.profileApplied":"Applied {label} profile to {name}.",
"flash.admin.overridesCleared":"Cleared overrides — using plan-name defaults.",
"empty.plans.none":"No plans found.",
"empty.plans.noMatch":"No plans match this filter.",
"empty.plans.selectPackage":"Select a package to edit features.",
"empty.products.processingTitle":"No products being processed",
"empty.products.processingMessageCan":"Live job progress is on the Processing page. Open a running job there to watch step status; this tab will list in-flight products once job-item filtering is available.",
"empty.products.processingMessageCannot":"Products currently in a job appear here once processing has started from the catalog.",
"empty.products.reviewMessage":"After a processing job finishes, enriched products land here. Open a row to compare original vs enriched, then Accept, edit, or Reject.",
"empty.products.errorTitle":"No products with errors",
"empty.products.errorMessage":"When a processing job fails for a product, it will appear here so you can retry.",
"empty.export.loadFailedMessage":"Something went wrong loading your exports. Retry, or check the error above for details.",
"empty.export.noneTitle":"No export feeds yet",
"empty.export.noneMessage":"Create a Google Shopping, Meta, or custom CSV/XML feed to choose which products and fields go out. Generate a public URL for Merchant Center or any partner — or export a selected subset from Products.",
"empty.export.noMatchTitle":"No matching feeds",
"empty.export.noMatchMessage":"Try a different search term.",
"empty.files.noneTitle":"No uploads yet",
"empty.files.noneMessage":"CSV imports for products, categories, and attributes appear here after you upload them. After a platform migration, file contents (blobs) were not copied — re-upload if you need those files.",
"empty.files.uploadCta":"Upload CSV",
"empty.export.fromProductsCta":"Export from Products",
"empty.dashboard.noJobsTitle":"No recent jobs",
"empty.dashboard.noJobsMessage":"Jobs show up here after you start processing from Products. Enrich titles and descriptions before you export.",
"empty.stores.noneTitle":"No store connected yet",
"empty.stores.noneMessage":"Connect WooCommerce or Shopify to sync catalog and orders. Prefer a supplier file? Use Feed URL or CSV upload instead.",
"empty.stores.noneTitleMember":"No store connected yet",
"empty.stores.noneMessageMember":"Only company admins can connect WooCommerce or Shopify. Ask an admin for help, or use Feed URL / CSV if your role allows.",
"empty.campaigns.unavailableMessage":"The campaigns service isn’t reachable right now. You can open the create wizard, but generate and send will wait until the service is back.",
"empty.calendar.noneTitle":"No seasonal presets",
"empty.calendar.noneMessage":"Calendar presets will appear here when the marketing API is available.",
"empty.seo.noneTitle":"No catalog to score",
"empty.seo.noneMessage":"Process products or add categories first. SEO scores appear once there is catalog data.",
"empty.structured.unavailableMessage":"This API isn’t on this backend yet. You can’t manage Export ID fields here until /api/structured-descriptions is wired.",
"empty.support.unavailableMessage":"The support API is not reachable right now. Try again shortly, or open a new ticket once the service is up.",
"empty.support.filterMessage":"No tickets match this status. Try another filter or create a new ticket.",
"empty.support.noneMessage":"Describe your issue and our team will reply in this thread. You will also get an in-app notification when staff responds.",
"empty.support.createTicket":"Create ticket",
"empty.support.clearFilter":"Clear filter",
"empty.support.ticketNotFoundTitle":"Ticket not found",
"empty.support.ticketNotFoundMessage":"This ticket may have been removed or you do not have access.",
"empty.support.noMessagesTitle":"No messages",
"empty.support.noMessagesMessage":"This thread has no messages yet.",
"empty.settings.noApiKeysTitle":"No API keys yet",
"empty.shopify.noOrdersTitle":"No orders yet",
"empty.shopify.noOrdersMessage":"Orders appear after Shopify is connected and an orders import runs. Empty lists are normal until the first sync finishes.",
"empty.woo.noOrdersTitle":"No orders yet",
"empty.woo.noOrdersMessage":"Orders appear after WooCommerce is connected and an orders sync runs. Empty lists are normal until the first sync finishes.",
"empty.woo.noReviewsTitle":"No reviews yet",
"empty.woo.noReviewsMessage":"Reviews appear after you queue a reviews import from a connected store. This tab stays usable while the list is empty.",
"empty.admin.noProviderTitle":"No provider rows",
"empty.admin.noProviderMessage":"Tokens appear here after products record a provider type.",
"empty.admin.noCompaniesTitle":"No companies",
"empty.admin.noCompaniesMessage":"Company list is empty.",
"empty.admin.noCompaniesMatch":"No companies match this filter.",
"empty.admin.notPlatformTitle":"Not a platform admin",
"empty.admin.notPlatformMessage":"Your account is signed in but is not marked as platform admin. Ask an existing platform admin to grant access, then sign out and sign in again.",
"empty.admin.noJobsFilter":"No jobs for this filter.",
"marketing.footerAfter":"— this page only prepares catalog export feeds.",
"support.title":"Support Center",
"support.description":"Open a ticket for billing, bugs, or account help. Staff replies show here and as in-app notifications.",
"support.newTicket":"New ticket",
"support.createTicket":"Create ticket",
"support.loadingTickets":"Loading tickets…",
"support.loadFailed":"Failed to load support tickets",
"support.unavailableBanner":"Support is not fully available yet. You can still prepare a ticket; submitting may wait until the service is ready.",
"support.yourTickets":"Your tickets",
"support.ticketCount":"{count} tickets",
"support.ticketCountOne":"{count} ticket",
"support.statusFilterSuffix":"· status {status}",
"support.filterByStatus":"Filter by status",
"support.unavailableTitle":"Support unavailable",
"support.emptyTitle":"No tickets yet",
"support.unavailableEmpty":"The support API is not reachable right now. Try again shortly, or open a new ticket once the service is up.",
"support.emptyFiltered":"No tickets match this status. Try another filter or create a new ticket.",
"support.emptyHelp":"Describe your issue and our team will reply in this thread. You will also get an in-app notification when staff responds.",
"support.clearFilter":"Clear filter",
"support.table.subject":"Subject",
"support.table.category":"Category",
"support.table.status":"Status",
"support.table.priority":"Priority",
"support.table.updated":"Updated",
"support.openTicketAria":"Open ticket {subject}",
"support.status.all":"All",
"support.status.open":"Open",
"support.status.pending":"Pending",
"support.status.resolved":"Resolved",
"support.status.closed":"Closed",
"support.new.title":"New support ticket",
"support.new.description":"Tell us what you need help with. Include steps, error messages, or invoice details when relevant.",
"support.new.back":"Back to tickets",
"support.new.details":"Ticket details",
"support.new.detailsHelp":"Status starts as open. You may get an automated answer first; a human teammate can take over anytime from the same thread.",
"products.description":"Browse, review, and process your catalog.",
"products.loadFailed":"Failed to load products",
"products.unnamed":"Unnamed product",
"products.tabs.navLabel":"Product views",
"products.tab.processed":"Processed",
"products.tab.processedHint":"Finished products ready to export or sync",
"products.tab.needsReview":"Needs review",
"products.tab.needsReviewHint":"Enriched products waiting for accept, edit, or reject",
"products.tab.needsReviewShort":"Review",
"products.tab.error":"Errors",
"products.tab.errorHint":"Products that failed during a job",
"products.tab.processing":"In progress",
"products.tab.processingHint":"Products currently in a running job",
"products.tab.busy":"In progress",
"products.tab.unprocessed":"Unprocessed",
"products.tab.unprocessedHint":"Catalog products not yet processed",
"products.tab.raw":"Unprocessed",
"products.status.processed":"Processed",
"products.status.needsReview":"Needs Review",
"products.status.processing":"Processing",
"products.status.error":"Error",
"products.status.failed":"Failed",
"products.status.unprocessed":"Unprocessed",
"products.status.pending":"Pending",
"products.status.unknown":"Unknown",
"products.pagination.showing":"Showing {start}–{end} of {total}",
"products.empty.processing.title":"No jobs yet",
"products.empty.processing.messageJobs":"Nothing is running right now. Start a job from Unprocessed, or open Processing to watch progress when a job is active.",
"products.empty.processing.messageBasic":"Products appear here while a job is running.",
"products.empty.needsReview.message":"After a processing job finishes, enriched products land here. Open a row to compare original vs enriched, then Accept, edit, or Reject.",
"products.empty.error.title":"No products with errors",
"products.empty.error.message":"When a processing job fails for a product, it will appear here so you can retry.",
"categories.searchPlaceholder":"Search by name or ID...",
"categories.created":"{name} has been created.",
"categories.updated":"The category has been updated successfully.",
"categories.deleted":"The category has been deleted successfully.",
"categories.notFound":"Category not found.",
"categories.loadCategoryFailed":"Failed to load category",
"categories.noCategoriesYet":"No categories yet",
"categories.noMatch":"No categories match “{query}”. Clear search or try another term.",
"categories.emptyHint":"Add a category or import a CSV to build your tree.",
"categories.promptCountOne":"{count} category has an AI generation prompt. Open the ⋮ menu → Edit AI prompt, or edit a category and choose Edit AI Prompt.",
"categories.promptCountMany":"{count} categories have an AI generation prompt. Open the ⋮ menu → Edit AI prompt, or edit a category and choose Edit AI Prompt.",
"categories.actions":"Category actions",
"categories.chooseCsv":"Choose CSV",
"categories.createSingleOrImport":"Create a single category or import many from CSV.",
"categories.createSingle":"Create a single category.",
"fields.deleteFieldConfirm":"This action cannot be undone. This will permanently delete the field and remove it from any templates that use it.",
"fields.deleteGroupConfirm":"This action cannot be undone. This will permanently delete the group. Any fields in this group will need to be reassigned.",
"fields.type.string":"Text",
"fields.type.stringHint":"Free text — names, codes, short notes",
"fields.type.number":"Number",
"fields.type.numberHint":"Numeric value; add a unit when useful (EUR, pcs)",
"fields.type.boolean":"Yes / No",
"fields.type.booleanHint":"True or false",
"fields.type.date":"Date",
"fields.type.dateHint":"A calendar date",
"fields.type.url":"URL",
"fields.type.urlHint":"Web link (product page, video, manufacturer)",
"fields.type.image":"Image",
"fields.type.imageHint":"Image URL or gallery image",
"attributes.type.multiselect.hint":"Pick one or more options from a list",
"standardFields.title":"Standard Fields",
"standardFields.description":"Define standard product fields and organize them into groups",
"standardFields.apiUnavailable":"Standard fields API is not available. Changes cannot be saved.",
"standardFields.apiUnreachable":"Standard fields API is not reachable right now. Create/edit stay disabled until /api/standard-fields and /api/field-groups respond.",
"standardFields.loading":"Loading standard fields…",
"standardFields.tab.fields":"Fields",
"standardFields.tab.groups":"Groups",
"standardFields.heading":"Standard Fields",
"standardFields.headingHint":"Enable fields for mapping and processing — one toggle per row.",
"standardFields.deleteFieldDesc":"This action cannot be undone. This will permanently delete the field and remove it from any templates that use it.",
"standardFields.deleteGroupDesc":"This action cannot be undone. This will permanently delete the group. Any fields in this group will need to be reassigned.",
"standardFields.type.string.label":"Text",
"standardFields.type.string.hint":"Free text — names, codes, short notes",
"standardFields.type.number.label":"Number",
"standardFields.type.number.hint":"Numeric value; add a unit when useful (EUR, pcs)",
"standardFields.type.boolean.label":"Yes / No",
"standardFields.type.boolean.hint":"True or false",
"standardFields.tip.specifications":"Legacy specs field; prefer specs when both exist.",
"export.dialog.title":"Export Selected Products",
"export.dialog.description":"Export {count} selected product(s). Pick the export feed that defines format and fields — like choosing what to sync, but for a download or partner feed.",
"export.dialog.loadFailed":"Failed to load export feed options. Please try again.",
"export.dialog.selectPlaceholder":"Select an export feed…",
"export.dialog.help":"Your selection chooses the products; the feed chooses channel format and mapped fields.",
"export.dialog.emptyTitle":"No export feeds yet",
"export.dialog.emptyMessage":"Create an export feed to choose format and fields, then come back to export this selection.",
"billing.managePlanOnPlans":"Manage plan on Plans",
"billing.recovery.pastDueTitle":"Payment past due",
"billing.recovery.pastDueAdmin":"Your subscription payment failed. Update payment in the Customer Portal — access stays open during this grace period.",
"billing.recovery.pastDueMember":"Billing needs attention. Ask a company admin to update payment in the Customer Portal. Access stays open during this grace period.",
"billing.recovery.contactAdmin":"Contact a company admin",
"billing.recovery.goToBilling":"Go to Billing",
"billing.recovery.missingPlanTitle":"No plan assigned",
"billing.recovery.missingPlanMessage":"This company has no active plan (often after a skipped migration). Assign a plan via Checkout or ask support — do not assume Unlimited capacity.",
"billing.recovery.choosePlan":"Choose a plan",
"billing.upgrade":"Upgrade",
"billing.askCompanyAdmin":"Ask a company admin",
"billing.memberHint":"Only company admins can change plans or open Checkout.",
"billing.unlimitedPlanWallet":"Unlimited plan · {wallet} wallet",
"exports.loadErrorBody":"Something went wrong loading your exports. Retry, or check the error above for details.",
"exports.tryAgain":"Try again",
"exports.emptyTitle":"No export feeds yet",
"exports.emptyBody":"Create a Google Shopping, Meta, or custom CSV/XML feed to choose which products and fields go out. Generate a public URL for Merchant Center or any partner — or export a selected subset from Products.",
"exports.emptyCta":"Create Google Shopping feed",
"exports.noMatchTitle":"No matching feeds",
"exports.noMatchBody":"Try a different search term.",
"exports.col.name":"Name",
"exports.col.format":"Format",
"exports.col.feedUrl":"Feed URL",
"exports.col.lastGenerated":"Last generated",
"exports.col.status":"Status",
"exports.col.actions":"Actions",
"exports.working":"Working…",
"exports.generatingShort":"Generating…",
"exports.copyUrl":"Copy URL",
"exports.openMenu":"Open menu",
"exports.preview":"Preview",
"exports.download":"Download",
"exports.refreshFeed":"Refresh Feed",
"exports.editAction":"Edit",
"exports.delete":"Delete",
"exports.rotateToken":"Rotate URL token",
"exports.rotateFailed":"Failed to rotate feed URL token",
"exports.deleting":"Deleting…",
"exports.channelPreset":"Channel preset",
"exports.name":"Name",
"exports.format":"Format",
"exports.sourceFeed":"Source feed (optional)",
"exports.sourceFeedHelp":"Limit this feed to products from one input feed, or leave as All products — this is how you choose what the public URL includes.",
"exports.fieldHelp":"Exports read processed products (with raw mapped_data as fallback). Use eprel_* / energy_* for EPREL fields, spec.* for one specification, or specifications.* to expand all specs as XML nodes.",
"exports.saving":"Saving…",
"exports.saveChanges":"Save changes",
"exports.createFeed":"Create feed",
"exports.updated":"Export feed updated.",
"exports.created":"Export feed created.",
"exports.saveFailed":"Save failed",
"exports.urlCopied":"Public {format} feed URL copied. Paste it into any system that fetches product feeds.",
"exports.copyFailed":"Failed to copy URL to clipboard",
"exports.preset.google_shopping_csv.description":"Merchant Center product feed with the standard Google columns (id, title, price, gtin, …).",
"exports.preset.google_shopping_csv.hint":"After you refresh the feed, copy the public CSV URL into Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch.",
"exports.preset.google_shopping_xml.description":"Same Google columns as XML elements (g:id, g:title, …) for Merchant Center XML feeds.",
"exports.preset.google_shopping_xml.hint":"Paste the public XML URL into Merchant Center as a scheduled fetch. Map missing store fields (link, price) under Field mappings if needed.",
"exports.preset.custom_xml.description":"Build a custom XML shape with your own root/item names and field mappings.",
"exports.preset.custom_xml.hint":"Set root and item element names, then map each output key to a product source.",
"exports.preset.custom_xml.defaultName":"Custom XML Export",
"processing.title":"Processing",
"processing.description":"Live pipeline progress for product processing jobs. Auto-refreshes while this tab is visible. Completed jobs link to Needs Review for accept / edit / reject.",
"processing.refresh":"Refresh",
"processing.loadFailed":"Failed to load processing jobs",
"processing.tooManyRequests":"Too many requests — wait a moment and try again.",
"processing.serverError":"{fallback} (server error {status}). Try again shortly.",
"processing.actions.confirmBody":"Process {count} product(s) on this page for {credits} credits. Credits are consumed when the job starts and cannot be undone from this action.",
"processing.receipt.cancelledMany":"Processing jobs cancelled",
"processing.receipt.cancelledDesc":"The just-started job was cancelled.",
"processing.receipt.cancelFailed":"Could not cancel processing job",
"unsubscribe.title":"Unsubscribe",
"unsubscribe.me":"Unsubscribe me",
"unsubscribe.invalidLink":"Invalid link",
"unsubscribe.failedShort":"Unsubscribe failed",
"unsubscribe.already":"You are already unsubscribed.",
"unsubscribe.confirmPrompt":"Confirm below to unsubscribe from marketing emails.",
"unsubscribe.done":"You have been unsubscribed.",
"stores.title":"Stores & sources",
"stores.description":"Connect any store or supplier in one place — Woo, Shopify, feed URL, or CSV. Live stores: products Descrybe → store; orders/reviews store → Descrybe. Export when the catalog is ready.",
"stores.allInputFeeds":"All input feeds",
"stores.exportFeeds":"Export feeds",
"stores.migrationNote":"After a Descrybe platform migration, WooCommerce and Shopify credentials may need to be re-entered — that is a reconnect step, not a broken sync.",
"stores.docsPrefix":"Docs:",
"stores.docsApiOverview":"API overview",
"stores.docsSuffix":"for public product access; use WooCommerce or Shopify below for live store sync.",
"stores.connectorsHeading":"Store and catalog connectors",
"stores.statusAria":"Status: {label}",
"stores.ctaAria":"{cta}: {title}",
"stores.startTitle":"Where should I start?",
"stores.startBody":"Woo store → WooCommerce. Shopify or any other platform → Feed URL or CSV upload. Ready to ship to Merchant Center or partners → Export feeds (Google Shopping preset or custom fields). After migration, reconnect Woo/Shopify before expecting sync to work.",
"stores.startBodyMember":"Ask a company admin to connect WooCommerce or Shopify. You can still open connected stores to sync and browse, and use Feed URL, CSV, or export feeds when your plan allows.",
"stores.wizard.title":"Guided store setup",
"stores.wizard.description":"Connect a store, test the connection, queue the first product sync, then you are done.",
"stores.wizard.guidedSetup":"Guided setup",
"stores.wizard.guidedSetupAria":"Start guided store setup",
"stores.wizard.adminOnly":"Only company admins can run guided store setup (save credentials and first sync). You can still open connected stores to sync and browse.",
"stores.wizard.pickChannel":"Choose a store connector",
"stores.wizard.pickChannelBody":"Pick WooCommerce or Shopify. You will finish connect → test → first sync on the connector page, then return here.",
"stores.feedUrl.description":"Pull any supplier or store catalog from a public CSV or XML URL on a schedule. Map fields, then sync.",
"stores.feedUrl.cta":"Add feed URL",
"stores.csv.title":"CSV upload",
"stores.csv.description":"Upload a product CSV as an input feed. Best for one-off supplier files or Shopify admin exports.",
"stores.csv.cta":"Upload CSV",
"stores.export.title":"Export / REST",
"stores.export.description":"Publish Google Shopping or custom CSV/XML with a public URL. Or pull products via API key (/api/v1).",
"stores.export.cta":"Open exports",
"stores.apiKeys.title":"API keys",
"stores.apiKeys.description":"Legacy API keys were not migrated. Create a new key in Settings to restore /api/v1 access — the secret is shown only once.",
"stores.apiKeys.descriptionMember":"Company API keys for /api/v1. Legacy keys were not migrated — only admins can create or revoke; you can view prefixes in Settings.",
"stores.apiKeys.cta":"Manage API keys",
"stores.apiKeys.ctaView":"View API keys",
"stores.status.needsReconnect":"Needs reconnect",
"stores.status.connected":"Connected",
"stores.status.notConnected":"Not connected",
"stores.status.ready":"Ready",
"stores.status.outbound":"Outbound",
"stores.status.reissue":"Reissue",
"store.tab.connection":"Connection",
"store.tab.orders":"Orders",
"store.tab.settings":"Settings",
"store.tab.categories":"Categories",
"store.tab.attributes":"Attributes",
"store.tab.reviews":"Reviews",
"store.badge.credentialsOnFile":"Credentials on file",
"shopify.description":"Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.",
"shopify.adminOnly":"Only company admins can change Shopify connection settings. Sync and browse stay available.",
"shopify.noCredentialsMember":"No Shopify credentials on file yet. Ask a company admin to connect the store. Sync and order browse stay available after they save and test the connection.",
"shopify.enterToken":"Enter credentials",
"shopify.noCredentials":"No Shopify credentials on file. Enter your *.myshopify.com domain and Dev Dashboard Client ID + secret (or a legacy Admin API token), then Save and Test Connection. After a platform migration, legacy secrets are not carried over — reconnect with a fresh token.",
"shopify.allConnectors":"All store connectors",
"shopify.setupDesc":"New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.",
"shopify.setup.oauthNote":"Still manual: create/install the app in Shopify and paste Client ID + secret here. Descrybe does not host a one-click App Store install. Legacy permanent shpat_ tokens from older Admin custom apps still work.",
"shopify.setup.scopesTitle":"Required Admin API scopes",
"shopify.setup.scopesIntro":"Add these scopes on the app version in the Dev Dashboard before you release and install:",
"shopify.setup.openDevelopAppsNeedDomain":"Enter your shop domain below to unlock a direct Admin link for this store.",
"shopify.setup.openDevelopAppsHint":"Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.",
"shopify.field.shopDomainHelp":"Admin API host only — use the *.myshopify.com name, not a custom storefront domain.",
"shopify.field.clientId":"Client ID",
"shopify.field.clientSecret":"Client secret",
"shopify.field.clientSecretHelp":"From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.",
"shopify.field.accessTokenHelp":"Only for custom apps created in Shopify Admin before January 2026. New apps should use Client ID + secret instead.",
"shopify.placeholder.clientId":"Client ID from Dev Dashboard",
"shopify.placeholder.clientIdKeep":"Client ID on file — enter a new one to replace",
"shopify.setup.scope.read_productsWhy":"Find existing products by SKU before updating",
"shopify.setup.scope.read_orders":"read_orders",
"shopify.setup.scope.read_ordersWhy":"Import orders into Descrybe (inbound)",
"shopify.setup.step1":"If you connected Shopify before a platform migration: create a new Dev Dashboard app (or reconnect with a fresh legacy token) — old saved secrets are not carried over.",
"shopify.setup.step2.before":"Open the",
"shopify.setup.step2.path":"Shopify Dev Dashboard",
"shopify.setup.step2.after":"→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).",
"shopify.setup.step3.before":"Create a version: set App URL (default home is fine for API-only), add scopes",
"shopify.setup.step3.after":".",
"shopify.setup.step4.before":"From the app Home tab,",
"shopify.setup.step4.after":"on your store (merchant must approve scopes).",
"shopify.testSectionTitle":"Verify connection",
"shopify.testHint":"Save your shop domain and token first, then run Test Connection. A successful test confirms the token and scopes before you queue sync.",
"shopify.overwriteBodyCount":"This queues an outbound product push. {count} previously linked Shopify product(s) may be updated with Descrybe content.",
"shopify.overwriteBody":"This queues an outbound product push. Matched Shopify products may be updated with Descrybe content.",
"shopify.credentialsTitle":"Store credentials",
"shopify.credentialsDesc.before":"Shop domain must be your",
"shopify.credentialsDesc.code":"*.myshopify.com",
"shopify.credentialsDesc.after":"domain. Prefer Dev Dashboard Client ID + secret; legacy Admin API tokens still work.",
"shopify.field.shopDomain":"Shop domain",
"shopify.field.accessToken":"Admin API access token",
"shopify.field.apiVersion":"API version",
"shopify.placeholder.tokenKeep":"******** (leave blank to keep)",
"shopify.ordersDesc":"Shopify → Descrybe — pull orders and line items into Descrybe (does not write back to Shopify).",
"shopify.ordersNeedsReconnect":"Orders import cannot run until credentials are reconnected after migration. On the Connection tab: Save, then Test Connection.",
"shopify.notes.productsBody":"— processed Descrybe products are created or updated in Shopify (SKU match via GraphQL when no cached Shopify product id). Re-sync can overwrite matched remote fields.",
"shopify.notes.ordersBody":"— pulled for reporting and future audience workflows.",
"shopify.notes.reviewsLabel":"Reviews",
"shopify.notes.reviewsBody":"-- not supported. Shopify has no first-party product reviews Admin API (third-party review apps are out of scope here).",
"shopify.notes.encryption.before":"Tokens are encrypted at rest with",
"woo.title":"WooCommerce Integration",
"woo.description":"Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).",
"woo.allStores":"All stores",
"woo.adminOnly":"Only company admins can change WooCommerce connection and mapping settings. Sync and browse stay available.",
"woo.enterCredentials":"Enter credentials",
"woo.noCredentials":"No WooCommerce credentials on file. Enter your store URL, create a Read/Write REST API key in WordPress, paste Consumer Key and Secret below, then Save and Test Connection. After a platform migration, legacy secrets are not carried over — reconnect with a fresh key.",
"woo.noCredentialsMember":"No WooCommerce credentials are on file yet. Ask a company admin to connect the store. Sync, orders, and reviews stay available after they save and test the connection.",
"woo.setupDesc":"Follow these steps to create a WooCommerce REST API key in WordPress and connect it here. Descrybe never creates keys on your store for you.",
"woo.setup.step1":"If you connected WooCommerce before a platform migration: create a new REST API key — old saved credentials are not usable.",
"woo.setup.step2.before":"Enter your store",
"woo.setup.step2.path":"HTTPS URL",
"woo.setup.step2.after":"in the form below (example: https://yourstore.com).",
"woo.overwriteBodyCount":"This queues an outbound product push. {count} previously linked WooCommerce product(s) may be updated with Descrybe content.",
"woo.overwriteBody":"This queues an outbound product push. Matched WooCommerce products may be updated with Descrybe content.",
"woo.connectionTitle":"Store connection",
"woo.connectionDesc":"Paste your store URL and a Read/Write REST API key pair. Save, then Test Connection before queuing syncs.",
"woo.field.storeUrlHelp":"Public site URL with https. Used to reach the WooCommerce REST API and to deep-link into WordPress admin.",
"woo.field.consumerKey":"Consumer Key",
"woo.field.consumerSecret":"Consumer Secret",
"woo.field.credentialsHelp":"Create these under WooCommerce → Settings → Advanced → REST API with Read/Write permission. Descrybe stores them encrypted and never shows the secret again after save.",
"woo.placeholder.keep":"******** (unchanged)",
"woo.keepCredentialsHint":"Leave key/secret blank when saving to keep existing credentials.",
"woo.saveConfiguration":"Save configuration",
"woo.categoryMappingTitle":"Category Mapping",
"woo.categoryMappingDesc":"Map your internal categories to WooCommerce categories",
"woo.ordersDesc":"WooCommerce → Descrybe — pull orders and line items into Descrybe (does not write back to the store).",
"woo.ordersNeedsReconnect":"Orders import cannot run until credentials are reconnected after migration. On the Connection tab: Save, then Test Connection.",
"woo.syncSettingsTitle":"Sync Settings",
"woo.syncSettingsDesc":"Configure how products are pushed Descrybe → WooCommerce",
"woo.matchStrategy":"Product Matching Strategy",
"woo.matchStrategyHelp":"Product push (Descrybe → WooCommerce) matches remote products by SKU or EAN/GTIN. Queue syncs from the Connection tab (manual).",
"products.edit.resetDescription":"Reset enriched description to the original",
"products.edit.cannotClearDescription":"Original is empty — cannot clear enriched description via PATCH",
"products.edit.unknownFeed":"Unknown feed",
"products.edit.noProcessedName":"No processed name available",
"products.edit.feedNamed":"Feed · {name}",
"products.edit.noAiDescription":"No AI description",
"products.edit.sourceLabel":"Source label",
"products.edit.coverageTitle":"How many of Name, Description, Attributes, and Category are present (feed or processed).",
"products.edit.coverageReady":"{count}/4 ready",
"products.edit.eprelPresentTitle":"European Product Registry for Energy Labelling (EPREL) id is present on this product.",
"products.edit.noEprelBadge":"No EPREL",
"products.edit.specsBadge":"Specs",
"products.edit.reviewBannerTitle":"Review enriched fields before accepting",
"products.edit.reviewBannerHelp":"Use the Review tab to compare originals vs AI. Shortcuts: A accept · R reject · Alt+1/2 field · ⌘/Ctrl+Enter accept all.",
"products.edit.noAttrsYet":"No attribute or specification data on this product yet.",
"products.edit.fromFeed":"From feed",
"products.edit.feedAttrsHelp":"Values parsed from the feed (specifications HTML, warranty, dimensions, EPREL). Keys are linked to attribute_key where possible.",
"categories.aiInstructionsBody":"Write one clear job per section (what to cover, tone, length). Vague prompts produce vague copy.",
"categories.exportIdsHeading":"Export IDs",
"categories.exportIdsBody":"Optional IDs map a section into export feeds (for example short_description).",
"categories.assignDescCopyHelp":"Use Assign to copy this template to other categories that should share the same structure.",
"categories.descriptionFormulaInvalid":"This description formula page needs a valid category. Return to categories and open Edit Description Formula again.",
"products.enrichment.resetTitle":"Reset to unprocessed?",
"products.selectedOnPage":"{count} on this page selected",
"products.selectionPageOnly":"Showing {shown} of {total} — selection is this page only",
"products.edit.coverageHint":"How many of Name, Description, Attributes, and Category are present (feed or processed).",
"products.edit.noEprelShort":"No EPREL",
"products.edit.specs":"Specs",
"products.edit.reviewBannerBody":"Use the Review tab to compare originals vs AI. Shortcuts: A accept · R reject · Alt+1/2 field · ⌘/Ctrl+Enter accept all.",
"products.edit.whatsFilled":"What's filled in",
"products.edit.legend":"Gray = missing · Orange = from feed · Green = processed",
"products.edit.noMappedFields":"No mapped feed fields on this product.",
"products.edit.emptyBadge":"Empty",
"products.edit.coreBadge":"Core",
"products.edit.feedAttrsHint":"Values parsed from the feed (specifications HTML, warranty, dimensions, EPREL). Keys are linked to attribute_key where possible.",
"flash.admin.analyticsLoadFailed":"Failed to load analytics",
"flash.admin.diagnosticsLoadFailed":"Failed to load diagnostics",
"flash.admin.diagnosticsUnavailable":"Diagnostics isn’t available on this deployment. Contact your platform administrator.",
"flash.admin.diagnosticsUnreachable":"Could not reach the diagnostics API. Check that the API is running and PUBLIC_API_URL / Vite proxy point at it.",
"admin.charts.statusEmpty":"No rows in this breakdown yet.",
"admin.charts.seriesEmpty":"No data in this period yet.",
"admin.diagnostics.etlInventoryTitle":"ETL gap inventory",
"admin.diagnostics.etlInventoryHint":"Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.",
"categories.aiPromptSavedForCategory":"An AI generation prompt is saved for this category.",
"categories.titleAndDescriptionFormulasSaved":"Title and description formulas are saved for this category.",
"categories.titleFormulaSavedForCategory":"A title formula is saved for this category.",
"categories.descriptionFormulaSavedForCategory":"A description formula is saved for this category.",
"site.account":"Account",
"site.goToApp":"Go to app",
"site.logIn":"Log in",
"site.getStarted":"Get started",
"site.nav.primary":"Primary",
"site.nav.mobile":"Mobile",
"site.nav.home":"Home",
"site.nav.pricing":"Pricing",
"site.nav.apiDocs":"API Docs",
"seo.home.title":"Descrybe — Turn supplier feeds into ready product pages",
"seo.home.description":"Connect CSV or XML supplier feeds, map them to your categories and attributes, generate titles and descriptions that match your rules, then export or sync to WooCommerce.",
"seo.pricing.title":"Pricing — Free through Enterprise | Descrybe",
"seo.pricing.description":"Start free with 50 products and feed mapping. Paid plans add AI titles and descriptions, tiered SKU caps (Starter 100 → Scale 12k; Enterprise for huge catalogs), export feeds, and WooCommerce sync — from $49/month.",
"seo.privacy.title":"Privacy Policy | Descrybe",
"seo.privacy.description":"How Descrybe collects, uses, and protects account data, product catalogs, and supplier feeds when you use our product data platform.",
"seo.terms.title":"Terms of Service | Descrybe",
"seo.terms.description":"Terms for using Descrybe — feed import, catalog enrichment, AI-assisted content, exports, and WooCommerce sync for your business.",
"seo.features.title":"Features — Feeds, enrichment, and export | Descrybe",
"seo.features.description":"See how Descrybe imports supplier feeds, maps fields to your taxonomy, enriches product data, and ships catalogs via export feeds, WooCommerce, or API.",
"pricing.page.eyebrow":"Pricing",
"pricing.page.title":"Simple plans for growing catalogs",
"pricing.page.lead":"Start free with feed mapping and basic cleanup. Upgrade when you need AI titles and descriptions, more products, export feeds, or WooCommerce sync — Starter through Enterprise.",
"legal.privacy.intro.p1":"At Descrybe (\"we,\" \"our,\" or \"us\"), we respect your privacy and are committed to protecting your personal information. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you use Descrybe's product data platform and related services (collectively, the \"Services\").",
"legal.privacy.intro.p2":"By accessing or using our Services, you consent to the practices described in this Privacy Policy. If you do not agree with the policies and practices described here, please do not use our Services.",
"legal.privacy.collect.h":"Information We Collect",
"legal.privacy.collect.lead":"We collect several types of information from and about users of our Services, including:",
"legal.privacy.collect.personal.p":"When you register for an account, we collect information that could be used to identify you, such as your name, email address, phone number, company name, and billing information. We collect this information directly from you when you provide it to us.",
"legal.privacy.collect.userData.h":"User Data",
"legal.privacy.collect.userData.p":"To provide our Services, we collect and process product data, supplier feeds, product descriptions, and other content that you upload, input, or otherwise submit to our platform. This may include product attributes, taxonomy structures, templates, and other data necessary for the operation of our Services.",
"legal.privacy.collect.usage.p":"We automatically collect certain information about your device and how you interact with our Services, including IP address, device type, browser type, operating system, access times, pages viewed, features used, and other system activity. We use this information to improve our Services and user experience.",
"legal.privacy.collect.cookies.h":"Cookies and Tracking Technologies",
"legal.privacy.collect.cookies.p":"We use cookies, web beacons, and similar tracking technologies to collect information about your browsing activities on our website. You can control cookies through your browser settings and other tools. However, if you block certain cookies, you may not be able to use all the features of our Services.",
"legal.privacy.use.h":"How We Use Your Information",
"legal.privacy.use.lead":"We use the information we collect for various purposes, including to:",
"legal.privacy.use.li1":"Provide, maintain, and improve our Services",
"legal.privacy.use.li2":"Process transactions and send related information, including confirmations, invoices, and service notifications",
"legal.privacy.use.li3":"Develop new products, services, features, and functionality",
"legal.privacy.use.li4":"Personalize your experience and deliver content and features relevant to your interests",
"legal.privacy.use.li5":"Respond to your requests, comments, and questions",
"legal.privacy.use.li6":"Send you technical notices, updates, security alerts, and support and administrative messages",
"legal.privacy.use.li7":"Monitor and analyze trends, usage, and activities in connection with our Services",
"legal.privacy.use.li8":"Detect, investigate, and prevent fraudulent transactions and other illegal activities",
"legal.privacy.use.li9":"Protect our rights, property, and safety and the rights, property, and safety of our users or others",
"legal.privacy.use.li10":"Comply with legal obligations and enforce our terms of service",
"legal.privacy.ai.h":"AI and Machine Learning",
"legal.privacy.ai.p1":"Our Services use artificial intelligence and machine learning technologies to process product data, generate content, and provide other automated features. The data you provide to our Services may be used to train and improve our AI models. However, we implement appropriate safeguards to protect your data and maintain its confidentiality.",
"legal.privacy.ai.p2":"We do not use personally identifiable information to train our general AI models without your explicit consent. Product data used for AI training is anonymized and aggregated wherever possible.",
"legal.privacy.share.h":"How We Share Your Information",
"legal.privacy.share.lead":"We may share your information in the following circumstances:",
"legal.privacy.share.providers.p":"We may share your information with third-party vendors, service providers, contractors, or agents who perform services on our behalf, such as payment processing, data analysis, email delivery, hosting services, customer service, and marketing assistance.",
"legal.privacy.share.transfers.p":"If we are involved in a merger, acquisition, financing, reorganization, bankruptcy, or sale of company assets, your information may be transferred as part of that transaction. We will notify you of any such change in ownership or control of your personal information.",
"legal.privacy.share.legal.p":"We may disclose your information if required to do so by law or in response to valid requests by public authorities (e.g., a court or government agency). We may also disclose your information to enforce our terms of service, protect our rights, privacy, safety, or property, and/or that of our affiliates, users, or others.",
"legal.privacy.share.consent.h":"With Your Consent",
"legal.privacy.share.consent.p":"We may share your information with third parties when you have given us your consent to do so.",
"legal.privacy.security.h":"Data Security",
"legal.privacy.security.p1":"We have implemented appropriate technical and organizational measures designed to secure your personal information from accidental loss and from unauthorized access, use, alteration, and disclosure. All information you provide to us is stored on secure servers behind firewalls.",
"legal.privacy.security.p2":"The safety and security of your information also depends on you. Where we have given you (or where you have chosen) a password for access to certain parts of our Services, you are responsible for keeping this password confidential. We ask you not to share your password with anyone.",
"legal.privacy.security.p3":"Unfortunately, the transmission of information via the internet is not completely secure. Although we do our best to protect your personal information, we cannot guarantee the security of your personal information transmitted to our Services. Any transmission of personal information is at your own risk.",
"legal.privacy.rights.h":"Your Rights and Choices",
"legal.privacy.rights.lead":"We strive to provide you with choices regarding the personal information you provide to us. Depending on your location, you may have certain rights regarding your personal information, including:",
"legal.privacy.rights.li1":"Access and update your personal information",
"legal.privacy.rights.li2":"Request deletion of your personal information",
"legal.privacy.rights.li3":"Object to or restrict the processing of your personal information",
"legal.privacy.rights.footer":"To exercise your rights, please contact us using the contact information provided at the end of this Privacy Policy. Please note that some of these rights may be limited or not applicable depending on your location and the specific circumstances.",
"legal.privacy.retention.h":"Data Retention",
"legal.privacy.retention.p1":"We will retain your personal information for as long as necessary to fulfill the purposes outlined in this Privacy Policy, unless a longer retention period is required or permitted by law. When determining how long to keep your information, we consider the amount, nature, and sensitivity of the information, the potential risk of harm from unauthorized use or disclosure, the purposes for which we process the information, and applicable legal requirements.",
"legal.privacy.retention.p2":"We may retain certain information after you close your account, including for the purposes of complying with our legal obligations, resolving disputes, and enforcing our agreements.",
"legal.privacy.intl.h":"International Data Transfers",
"legal.privacy.intl.p1":"Your personal information may be transferred to, and processed in, countries other than the country in which you are resident. These countries may have data protection laws that are different from the laws of your country.",
"legal.privacy.intl.p2":"If we transfer your personal information to countries outside the European Economic Area or other regions with comprehensive data protection laws, we will ensure that appropriate safeguards are in place to protect your personal information and that the transfer complies with applicable data protection laws.",
"legal.privacy.children.h":"Children's Privacy",
"legal.privacy.children.p":"Our Services are not intended for children under the age of 16, and we do not knowingly collect personal information from children under 16. If we learn we have collected or received personal information from a child under 16 without verification of parental consent, we will delete that information. If you believe we might have any information from or about a child under 16, please contact us.",
"legal.privacy.changes.h":"Changes to Our Privacy Policy",
"legal.privacy.changes.p1":"We may update our Privacy Policy from time to time. If we make material changes to how we treat our users' personal information, we will notify you by email to the email address specified in your account and/or through a notice on our website.",
"legal.privacy.changes.p2":"The date the Privacy Policy was last revised is identified at the top of the page. You are responsible for ensuring we have an up-to-date active and deliverable email address for you, and for periodically visiting our website and this Privacy Policy to check for any changes.",
"legal.privacy.contact.h":"Contact Us",
"legal.privacy.contact.lead":"If you have any questions or concerns about our Privacy Policy or our data practices, please contact us at:",
"legal.terms.title":"Terms of Service",
"legal.terms.s1.h":"1. Agreement to Terms",
"legal.terms.s1.p":"By accessing or using Descrybe's product data platform and related services (collectively, the \"Services\"), you agree to be bound by these Terms of Service and all applicable laws and regulations. If you do not agree with any of these terms, you are prohibited from using or accessing the Services.",
"legal.terms.s2.h":"2. Use License",
"legal.terms.s2.p1":"Subject to your compliance with these Terms of Service, Descrybe grants you a limited, non-exclusive, non-transferable, revocable license to access and use the Services for your business purposes.",
"legal.terms.s2.lead":"This license does not include:",
"legal.terms.s2.li1":"Modifying or copying the Services or any content therein",
"legal.terms.s2.li2":"Using the Services for any commercial purpose other than your authorized business use",
"legal.terms.s2.li3":"Attempting to decompile or reverse engineer any software contained in the Services",
"legal.terms.s2.li4":"Removing any copyright or proprietary notations from the materials",
"legal.terms.s2.li5":"Transferring the materials to another person or \"mirroring\" the materials on any other server",
"legal.terms.s2.p2":"This license shall automatically terminate if you violate any of these restrictions and may be terminated by Descrybe at any time.",
"legal.terms.s3.h":"3. Subscription and Payment",
"legal.terms.s3.p1":"Access to the Services may require a paid subscription. Payment terms will be specified during the subscription process. All payments are non-refundable unless otherwise specified in writing by Descrybe.",
"legal.terms.s3.p2":"Descrybe reserves the right to change subscription fees upon reasonable notice. Continued use of the Services after a fee change constitutes your acceptance of the new fees.",
"legal.terms.s4.h":"4. User Content",
"legal.terms.s4.p1":"You retain all rights to any content you submit, post, or display on or through the Services (\"User Content\"). By providing User Content to Descrybe, you grant Descrybe a worldwide, non-exclusive, royalty-free license to use, reproduce, modify, adapt, publish, translate, and distribute such content in connection with providing the Services.",
"legal.terms.s4.lead":"You represent and warrant that:",
"legal.terms.s4.li1":"You own or control all rights to the User Content you provide",
"legal.terms.s4.li2":"The User Content does not violate these Terms of Service",
"legal.terms.s4.li3":"The User Content will not cause injury to any person or entity",
"legal.terms.s5.h":"5. Artificial Intelligence",
"legal.terms.s5.p1":"The Services utilize artificial intelligence and machine learning technologies. You acknowledge that AI-generated content may not be perfect and agree to review all AI-generated content before use in your business operations.",
"legal.terms.s5.p2":"Descrybe may use anonymized and aggregated User Content to train and improve our AI models, subject to our Privacy Policy. You may opt-out of having your data used for AI training by contacting us.",
"legal.terms.s6.h":"6. Intellectual Property",
"legal.terms.s6.p":"The Services and its original content, features, and functionality are owned by Descrybe and are protected by international copyright, trademark, patent, trade secret, and other intellectual property or proprietary rights laws.",
"legal.terms.s7.h":"7. Disclaimer",
"legal.terms.s7.p1":"The Services are provided on an \"as is\" and \"as available\" basis. Descrybe makes no warranties, expressed or implied, and hereby disclaims all warranties, including without limitation, implied warranties of merchantability, fitness for a particular purpose, non-infringement, or course of performance.",
"legal.terms.s7.p2":"Descrybe does not warrant that the Services will function uninterrupted, secure, or available at any particular time or location, or that any errors or defects will be corrected.",
"legal.terms.s8.h":"8. Limitation of Liability",
"legal.terms.s8.lead":"In no event shall Descrybe be liable for any indirect, incidental, special, consequential, or punitive damages, including without limitation, loss of profits, data, use, goodwill, or other intangible losses, resulting from:",
"legal.terms.s8.li1":"Your access to or use of or inability to access or use the Services",
"legal.terms.s8.li2":"Any conduct or content of any third party on the Services",
"legal.terms.s8.li3":"Any content obtained from the Services",
"legal.terms.s8.li4":"Unauthorized access, use, or alteration of your transmissions or content",
"legal.terms.s9.h":"9. Termination",
"legal.terms.s9.p1":"Descrybe may terminate or suspend your access to the Services immediately, without prior notice or liability, for any reason, including without limitation if you breach these Terms of Service.",
"legal.terms.s9.p2":"Upon termination, your right to use the Services will immediately cease. If you wish to terminate your account, you may simply discontinue using the Services or contact us to request account deletion.",
"legal.terms.s10.h":"10. Governing Law",
"legal.terms.s10.p":"These Terms shall be governed by and construed in accordance with the laws of Slovenia, without regard to its conflict of law principles.",
"legal.terms.s11.h":"11. Changes to Terms",
"legal.terms.s11.p":"Descrybe reserves the right to modify or replace these Terms of Service at any time. It is your responsibility to review these Terms periodically for changes. Your continued use of the Services following the posting of any changes constitutes acceptance of those changes.",
"legal.terms.s12.h":"12. Contact Us",
"legal.terms.s12.lead":"If you have any questions about these Terms of Service, please contact us at:",
"plans.loadFailed":"Failed to load plans",
"plans.loading":"Loading plans…",
"plans.apiUnavailable":"Plans API is not available on this backend yet. Showing public pricing comparison.",
"plans.title":"Choose your plan",
"plans.sub.onPrefix":"You're on",
"plans.sub.enterpriseSuffix":"— unlimited products and AI capacity. No self-serve upgrade needed.",
"plans.sub.paygSuffix":"— pay as you go. Compare public plans below, or talk to sales for Enterprise.",
"plans.sub.creditsMid":"with {remaining} AI credits remaining.",
"plans.sub.creditsSuffix":"Upgrade Starter → Growth → Business with Checkout, or talk to sales for Enterprise.",
"plans.sub.none":"No plan is assigned yet (for example after a skipped migration). Choose a plan below — capacity is not Unlimited until Checkout or an admin assigns one.",
"plans.stripeHint":"Self-serve upgrades use Stripe Checkout.",
"plans.planApplied":"{plan} plan applied. Your credits are ready.",
"plans.faq.title":"Frequently asked questions",
"plans.faq.limit.q":"What happens if I hit a limit?",
"plans.faq.limit.a":"Soft banners warn you first. When you run out of AI credits or hit your SKU cap, jobs that need that capacity are blocked until you free space, wait for the next cycle, or upgrade.",
"plans.faq.selfServe.q":"Can I self-serve upgrade?",
"plans.faq.selfServe.a":"Company admins can self-serve Starter, Growth, and Business via Checkout on a plan card. Members should ask a company admin — Checkout requires the admin role. Enterprise is always sales-led. Platform admins can still assign plans under Billing Admin.",
"plans.faq.enterprise.q":"Enterprise & millions of SKUs",
"plans.faq.enterprise.a":"Custom capacity, bring-your-own AI key, SLA, and account management are sales-led. Use Contact sales to send a request — we prepare a custom plan and Stripe Checkout link. You can also book time via Calendly. Enterprise is not self-serve at multi-million SKU scale. The app shows Unlimited for SKU and AI capacity.",
"plans.faq.pricing.q":"Where is public pricing?",
"plans.faq.pricing.aBefore":"See the marketing comparison on the",
"plans.faq.pricing.pricingPage":"Pricing page",
"plans.faq.pricing.aMid":"— CTAs are Get started (register) or Contact sales. Manage usage anytime under",
"plans.faq.pricing.aAfter":".",
"plans.custom.title":"Need a custom plan?",
"plans.custom.body":"Enterprise capacity, bring-your-own AI key, and SLAs are handled with our team.",
"plans.custom.looking":"Looking for public plan details?",
"ai.title":"AI integrations",
"ai.description":"Choose platform credits or your own key, then customize prompts with variables.",
"ai.crumb":"AI integrations",
"ai.adminOnly":"Only company admins can change AI settings. You can view the current configuration.",
"ai.providerMode.desc":"Platform uses Descrybe credits and our key. Popular or Custom uses your OpenAI-compatible key (the provider call itself does not spend platform credits; feature credit rules still apply).",
"structured.intro":"These fields are automatically created when you add Export IDs to your description formula sections. They can be used in your export feeds to include specific parts of your product descriptions.",
"structured.addField":"Add Field",
"structured.openCategories":"Open categories",
"structured.tableCaption":"These fields are used to structure parts of product descriptions for export.",
"structured.flash.loadFailed":"Failed to load structured description fields",
"assistant.ariaLabel":"System assistant",
"assistant.title":"System assistant",
"assistant.subtitle":"Navigate, guide, and run supported actions",
"assistant.resetAria":"Reset conversation",
"assistant.resetTitle":"Reset",
"assistant.closeAria":"Close assistant",
"assistant.messageLabel":"Message",
"assistant.placeholder":"e.g. add a feed URL, API keys, attributes, processing…",
"assistant.sendAria":"Send",
"site.bookDemo":"Book a Demo",
"site.demoShort":"Demo",
"site.allRightsReserved":"All rights reserved.",
"site.cookiePolicy":"Cookie Policy",
"site.cookieSettings":"Cookie settings",
"consent.title":"Cookies and analytics",
"consent.description":"We use necessary cookies to run Descrybe. Optional analytics and marketing cookies help us understand product usage and measure campaigns. You can change your choice anytime.",
"consent.necessaryDesc":"Required for sign-in, security (CSRF), theme, language, and remembering this choice.",
"consent.alwaysOn":"Always on",
"consent.analytics":"Analytics",
"consent.analyticsDesc":"Helps us understand how the product is used (Google Analytics via GTM).",
"consent.marketing":"Marketing",
"consent.marketingDesc":"Used for advertising measurement and personalization when ads tags are configured in GTM.",
"consent.policyLink":"Read our Cookie Policy",
"seo.cookies.title":"Cookie Policy | Descrybe",
"seo.cookies.description":"How Descrybe uses necessary, analytics, and marketing cookies, including Google Tag Manager and GA4, and how to change your consent.",
"legal.cookies.title":"Cookie Policy",
"legal.cookies.intro.h":"Overview",
"legal.cookies.intro.p1":"This Cookie Policy explains how Descrybe uses cookies and similar technologies on our website and application. It should be read together with our Privacy Policy.",
"legal.cookies.intro.p2":"Where required, we ask for your consent before enabling analytics or marketing cookies. Necessary cookies are used to provide the service securely and do not require consent.",
"legal.cookies.types.h":"Cookie categories",
"legal.cookies.necessary.h":"Necessary",
"legal.cookies.necessary.p":"These cookies keep you signed in, protect forms with CSRF tokens, store your theme and language preferences, and remember your cookie choice. The product cannot work correctly without them.",
"legal.cookies.analytics.h":"Analytics",
"legal.cookies.analytics.p":"If you allow analytics, we load Google Tag Manager (GTM) tags that may set Google Analytics 4 cookies to measure page views and product events. Events are gated until analytics storage is granted.",
"legal.cookies.marketing.h":"Marketing",
"legal.cookies.marketing.p":"If you allow marketing, advertising-related tags in GTM may use ad storage and related signals for campaign measurement and personalization.",
"legal.cookies.gtm.h":"Google Tag Manager and GA4",
"legal.cookies.gtm.p":"When configured, Descrybe loads a Google Tag Manager container. GA4 is configured inside that container by Descrybe operators. Consent Mode v2 defaults to denied for analytics and ads storage until you accept the relevant categories.",
"legal.cookies.third.h":"Third parties",
"legal.cookies.third.p":"Google (Tag Manager / Analytics) may process technical data such as page URLs, device/browser information, and event names when consent is granted. We do not intentionally send passwords, API keys, or personal contact details in analytics events.",
"legal.cookies.manage.h":"How to change your consent",
"legal.cookies.manage.p":"Use Cookie settings in the site footer (or the button below) to reopen the consent banner and update your preferences. You can also clear site data in your browser.",
"site.privacyPolicy":"Privacy Policy",
"site.termsOfService":"Terms of Service",
"site.legalNav":"Legal",
"site.footer.aria":"Site",
"site.footer.description":"Descrybe turns supplier feeds into clean, channel-ready product catalogs — map fields, enrich attributes and listing copy, then export or sync to WooCommerce.",
"home.hero.tagline":"Product data for ecommerce teams",
"home.hero.title":"From Supplier Feeds To Product Pages",
"home.hero.lead":"Connect supplier feeds, map them to your categories, fill required attributes, and write titles and descriptions that follow your rules — then export or sync to your store.",
"home.hero.learnMore":"Learn More",
"home.hero.apply":"Apply For Access",
"home.hero.supportedBy":"Supported by",
"home.hero.msAlt":"Microsoft for Startups",
"home.image.previewAlt":"Descrybe platform preview demonstrating feed to product page transformation",
"home.how.title":"Here's how Descrybe saves you time getting products to market",
"home.how.lead":"Bring in messy supplier data once. Descrybe helps you categorize it, fill attributes, write listing copy, and push ready products to your channels.",
"home.how.apply":"Apply For Access",
"home.how.step1.title":"Import Your Taxonomy",
"home.how.step1.desc":"Set up the categories and attributes your store already uses",
"home.how.step1.f1":"Define required attributes for each category",
"home.how.step1.f2":"Set per-category title formulas",
"home.how.step1.f3":"Set product description and search-snippet templates",
"home.how.step2.title":"Import Supplier Data",
"home.how.step2.desc":"Connect a feed URL or upload a product file",
"home.how.step2.f1":"Import from CSV, XML, or API sources",
"home.how.step2.f2":"Schedule automated imports from your suppliers",
"home.how.step2.f3":"Map source fields with a simple drag-and-drop interface",
"home.how.step3.title":"Transform & Enhance",
"home.how.step3.desc":"Pick the products to process and let Descrybe:",
"home.how.step3.f1":"Assign the right categories",
"home.benefits.chart.desc":"Titles and descriptions that highlight what shoppers care about — benefits, specs, and search terms that match your catalog.",
"home.benefits.database.desc":"Keep the same category tree and attribute shape across exports and channels so customers can find products the same way everywhere.",
"home.benefits.search.desc":"Write titles, descriptions, and meta snippets that are easier for shoppers and search engines to understand.",
"home.benefits.cost.title":"Less manual data entry",
"home.benefits.cost.desc":"Automate mapping, attribute fill, and listing copy so your team spends time on merchandising — not spreadsheet cleanup.",
"home.benefits.scale.title":"Ready for every sales channel",
"home.benefits.scale.desc":"Shape export feeds and WooCommerce sync for the formats each channel expects, without rebuilding the catalog by hand.",
"home.cta.titleLead":"Get Products To Market ",
"home.cta.titleHighlight":"Faster",
"home.cta.description":"Stop rebuilding product data from every supplier file. Map once, enrich with your rules, and publish listings that are ready to sell.",
"home.cta.f1":"Personalized demo",
"home.cta.f2":"Expert consultation",
"home.cta.f3":"Clear next steps",
"home.cta.apply":"Apply For Access",
"home.cta.imageAlt":"Descrybe product pages",
"home.product.eyebrow":"What Descrybe does",
"home.product.title":"Supplier feeds in. Ready listings out — export, WooCommerce, or API.",
"home.product.description":"Descrybe helps ecommerce teams turn supplier CSV and XML feeds into clean product catalogs. Map fields to your categories, enrich attributes and listing copy, then ship data through export feeds, WooCommerce sync, or the public API.",
"home.product.pipelineAria":"Product pipeline",
"home.product.p1.label":"Feeds in",
"home.product.p1.detail":"CSV / XML from supplier URLs",
"home.product.p2.label":"Map",
"home.product.p2.detail":"Match columns to your fields",
"pricing.section.badge":"SKU capacity + AI credits",
"pricing.section.title":"Start free. Scale when your catalog grows.",
"pricing.section.lead":"Free includes feed mapping, basic product cleanup, and EU energy labels (EPREL) for up to 50 SKUs (no AI credits). Paid plans add AI titles and descriptions, growing SKU caps, and export options — Starter through Scale, or talk to sales for Enterprise.",
"pricing.section.billingPeriod":"Billing period",
"pricing.section.monthly":"Monthly",
"pricing.section.yearly":"Yearly",
"pricing.section.savePercent":"Save 20%",
"pricing.section.publicBefore":"Public plans: Free, Starter, Plus, Growth, Business, Scale, and Enterprise. Create a Free account, then upgrade under",
"pricing.cap.limits.f1":"SKU caps by plan (Scale reaches 12k; Enterprise for huge catalogs)",
"pricing.cap.limits.f2":"Monthly AI credits + buyable top-up packs",
"pricing.cap.limits.f3":"Team roles & invites",
"pricing.cap.limits.f4":"Enterprise SLA options",
"pricing.faq.credits.q":"What are AI credits?",
"pricing.faq.credits.a":
"AI credits pay for steps like generating titles and descriptions (~2 credits per product enhance). Free includes 0 AI. Paid plans have per-tier SKU caps (Starter 100 → Scale 12k; Enterprise unlimited). Included AI uses CreditSKUBase × ~50% cover × 2 credits/product for 1 primary language: Starter 100 · Plus 400 · Growth 1,200 · Business 4,000 · Scale 12,000 credits/month (~50% of each plan’s SKU cap). Finish more AI with packs or BYOK (Growth+). Plan price is for platform + included AI — not a full-catalog AI bundle.",
"pricing.faq.packs.q":"Can I buy extra AI credits?",
"pricing.faq.packs.a":
"Yes. One-time AI packs from Billing (Checkout mode=payment — not subscription add-ons): Nano 25 credits / $29 · Starter 65 / $59 · Plus 200 / $149 · Growth 500 / $299 · Catalog 1,200 / $599 · Business 3,000 / $1,299 · Scale 8,000 / $2,999. Packs do not raise SKU limits.",
"pricing.faq.limits.q":"What happens if I hit my product or credit limit?",
"pricing.faq.limits.a":
"We warn you as you get close. Each plan has a SKU cap that grows by tier (Scale reaches 12k; 1M+ catalogs are Enterprise). AI credits are often the binding limit for enrichment. When you run out of AI credits, buy a credit pack, wait for the next monthly grant, upgrade for a larger grant, or use your own AI key (Growth+).",
"pricing.faq.change.q":"Can I upgrade or downgrade?",
"pricing.faq.change.a":"Yes. Start on Free, then upgrade to Starter, Plus, Growth, Business, or Scale from Plans or Billing (Stripe Checkout). Enterprise is always sales-led.",
"pricing.faq.free.q":"What does Free include?",
"pricing.faq.free.a":"Forever Free: 50 products, one feed, data cleanup and attribute fill, EU energy labels (EPREL — public data, no credits), plus one manual export — with 0 AI credits. No credit card. Upgrade when you need AI titles, descriptions, or more capacity.",
"pricing.faq.why.q":"Why not pay per product like content-only tools?",
"pricing.faq.why.a":"Descrybe is built for the full path from supplier feed to catalog to WooCommerce or export — not only AI copy. You pay for platform capacity (products and feeds); AI is a usage layer on top.",
"pricing.faq.annual.q":"How does annual billing work?",
"pricing.faq.annual.a":"Yearly billing is about 20% off the monthly list price. Start free, then choose yearly in Checkout when you upgrade (or contact sales).",
"pricing.calc.badge":"Plan calculator",
"pricing.calc.title":"Find the right plan",
"pricing.calc.lead":"Enter feeds, catalog size, and how many products you want to enhance with AI (count each language pass).",
"pricing.calc.feeds":"Feed sources",
"pricing.calc.feedsHint":"Supplier / import feeds you need to connect",
"pricing.calc.skus":"Catalog products (SKUs)",
"pricing.calc.skusHint":"Total products you will store and process",
"pricing.calc.aiVolume":"AI process volume",
"pricing.calc.aiHint":"Roughly products × languages you want to enhance per month",
"pricing.calc.recommendedLabel":"Recommended",
"pricing.calc.budgetLabel":"Budget option",
"pricing.calc.coversCredits":"Needs about {count} AI credits / month",
"pricing.calc.aiIncluded":"Included monthly credits cover this AI volume",
"pricing.calc.aiNeedsPacks":"Add {count}× {pack} (~{usd}) for the AI shortfall",
"pricing.calc.orYearly":"or ~{amount}/mo yearly",
"pricing.calc.budgetNote":"Lower list price with yearly discount and/or credit packs when that still fits.",
"pricing.calc.noBudget":"The recommended plan is already the leanest fit for these inputs.",
"pricing.calc.enterpriseTitle":"Sounds like Enterprise",
"pricing.calc.enterpriseBody":"Your feeds or catalog size exceed self-serve caps. Talk to sales for unlimited capacity and a managed AI grant or BYOK.",
"pricing.calc.ctaPlan":"Choose {name}",
"pricing.calc.disclaimer":"Estimates use list prices and ~2 credits per AI product enhance. Checkout prices come from Stripe. A1 and other client deals stay admin-only.",
"pricing.pack.small.desc":"Small top-up (65 credits ≈ 32 AI products)",
"pricing.pack.medium.name":"Plus pack",
"pricing.pack.medium.desc":"Burst top-up (200 credits ≈ 100 AI products)",
"pricing.pack.large.name":"Growth pack",
"pricing.pack.large.desc":"Mid buffer (500 credits ≈ 250 AI products)",
"pricing.pack.xl.name":"Catalog pack",
"pricing.pack.xl.desc":"Catalog / re-run buffer (1,200 credits ≈ 600 AI products)",
"pricing.pack.xxl.name":"Business pack",
"pricing.pack.xxl.desc":"Large multi-language buffer (3,000 credits ≈ 1,500 AI products)",
"pricing.pack.mega.name":"Scale pack",
"pricing.pack.mega.desc":"Distributor / agency burst (8,000 credits ≈ 4,000 AI products)",
"pricing.section.faqDescription":"Straight answers about plans, credits, and what Free includes.",
"billing.buyCreditPacks":"Buy AI credit packs",
"billing.buyCreditPacksHint":
"Seven one-time packs (25 → 8,000 credits). Sync Prices from Admin → Settings → Stripe, or go run ./cmd/sync-stripe-packs -write-settings. For ongoing AI volume, upgrade the plan for a larger monthly grant.",
"billing.packCredits":"{credits} credits",
"billing.packApproxProducts":"~{count} AI products",
"billing.buyPack":"Buy",
"billing.checkoutCompletePack":"Credit pack purchased — {credits} AI credits added.",
"billing.packCheckoutFailed":"Could not start credit pack checkout.",
"empty.default.noItems":"Nothing here yet.",
"settings.tabLockedHint":"Not on your plan",
"stores.connectorLocked":"Not on your plan",
"stores.connectorUpgrade":"Upgrade to unlock",
"plan.upgrade.title":"This feature is not on your plan",
"plan.upgrade.message":"Upgrade to unlock this part of Descrybe.",
"plan.upgrade.defaultMessage":
"Your current plan does not include this part of Descrybe. Upgrade to unlock it, or ask a company admin if you cannot change billing.",
"plan.upgrade.sectionOff.title":"This feature is temporarily unavailable",
"plan.upgrade.sectionOff.message":
"This part of Descrybe is turned off for the platform right now. It is not an upgrade issue — try again later or contact support.",
"plan.upgrade.sectionOff.cta":"Back to dashboard",
"plan.upgrade.stores.message":
"WooCommerce and Shopify connectors need a plan that includes Stores. Upgrade to connect those stores — or keep working with feeds and the API on your current plan.",
"plan.upgrade.stillWorks.title":"What still works on your plan",
"vector.initComingSoon":"Create Index and Initialize Vector DB are not available in v2 yet (coming soon). Search still works when Pinecone is configured.",
"storeReconnect.titlePlural":"Reconnect stores after migration",
"storeReconnect.titleChannel":"Reconnect {channel} after migration",
"storeReconnect.titleSingular":"Reconnect store after migration",
"storeReconnect.messageWithItems":"Store API credentials were not carried over (or cannot be used) after the platform migration. This is not a broken sync — reconnect each store, then Test Connection before queueing a sync.",
"storeReconnect.messageSingle":"{channel} API credentials were not carried over (or cannot be used) after the platform migration. This is not a broken sync — paste fresh credentials, Save, then Test Connection before queueing a sync.",
"storeReconnect.channelFallback":"Store",
"storeReconnect.askAdmin":"Ask a company admin to reconnect — only admins can save store credentials.",
"admin.storeReconnect.cutoverHint":"Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.",
"admin.storeReconnect.loadFailed":"Could not load store reconnect inventory.",
"admin.storeReconnect.refresh":"Refresh",
"admin.storeReconnect.description":"Companies with a connected store identity but missing or unusable API credentials (cutover credential gaps).",
"storeReconnect.wizardHint":"Prefer a step-by-step flow? Open Guided setup (/stores/wizard), or reconnect the channel below and Test Connection before syncing.",
"storeReconnect.wizardLabel":"Guided setup",
"storeReconnect.reviewsHint":"Reviews import cannot run until credentials are reconnected after migration. On the Connection tab: Save, then Test Connection.",
"storeReconnect.ordersHint":"Orders import cannot run until credentials are reconnected after migration. On the Connection tab: Save, then Test Connection.",
"productSync.outboundBody":"— pushes processed Descrybe products to the store (create or update matched remote products). Does not import the store catalog into Descrybe.",
"productSync.firstSync":"First sync",
"productSync.firstSyncBody":"— unmatched products are created in {channel}. Later syncs update products already linked by id or match strategy.",
"productSync.reSync":"Re-sync",
"productSync.reSyncBody":"— matched remote products can be overwritten with Descrybe content ({count} linked so far).",
"productSync.queued":"Product sync queued",
"productSync.live.queued":"Queued — waiting for worker",
"productSync.live.running":"Sync in progress",
"productSync.live.watching":"Watching sync status… counts appear when the run finishes.",
"productSync.live.success":"Sync finished: {total} total · {created} created · {updated} updated · {failed} failed · {skipped} skipped",
"productSync.live.partial":"Sync finished with some failures: {total} total · {created} created · {updated} updated · {failed} failed · {skipped} skipped",
"productSync.live.failed":"Sync failed{detail}.",
"productSync.live.timedOut":"Still running — refresh later for final status and counts.",
"productSync.noneYet":"No product sync has completed yet.",
"productSync.lastRun":"Last run: {total} total · {created} created · {updated} updated · {failed} failed · {skipped} skipped",
"productSync.needsReconnect":"Product sync cannot run until credentials are reconnected after migration. On the Connection tab: Save, then Test Connection.",
"productSync.scheduleHelp":"Like feed sync intervals: set how often Descrybe pushes products to the store, or pause the schedule. Manual queue still works while paused. Store webhooks are not used — updates are polled/queued only.",
"productSync.delivery.title":"Updates use polling, not store webhooks",
"productSync.delivery.body":"Descrybe does not receive Shopify or WooCommerce webhooks. Product pushes run when you queue them or on the automatic schedule. This page watches progress by polling connection status — not via live store push events.",
"productSync.delivery.inboundNote":"Orders and reviews also use queued pulls (scheduled or manual), not live webhooks.",
"productSync.delivery.hubNote":"Store connectors sync on a schedule or when you queue a job — not via live store webhooks.",