// Base catalog — the source of truth for this app's UI strings. Every key here // MUST be mirrored in `de.ts`; `defineLocale()` enforces that parity // at build time, so a missing translation fails typecheck rather than silently // falling back. Messages use ICU: `{name}` placeholders + rich `` // tags rendered by passing a matching function to ``. import { defineCatalog } from '@voltro/i18n' export default defineCatalog({ // Browser tab titles — locale-aware via each page's `meta({ locale })`. 'meta.landing.title': 'Welcome', 'meta.landing.description': 'A full Voltro SaaS starter — auth, a plan paywall, checkout, seats and invites, wired end to end.', 'meta.login.title': 'Sign in', 'meta.overview.title': 'Projects', 'meta.billing.title': 'Billing', 'meta.team.title': 'Team', // ---- Marketing chrome + landing ---- 'nav.dashboard': 'Dashboard', 'nav.signIn': 'Sign in', 'lang.label': 'Language', 'landing.heading': 'Ship your SaaS, not its plumbing.', 'landing.body': 'Sign up, land in the app, hit the plan paywall, upgrade, invite a teammate — the whole loop already works. Auth, billing entitlements and seats are wired to the api-saas-starter backend.', 'landing.cta': 'Get started →', // ---- Auth form ((marketing)/login) ---- 'auth.signIn.heading': 'Sign in', 'auth.signUp.heading': 'Create your account', 'auth.email': 'Email', 'auth.password': 'Password', 'auth.signIn.submit': 'Sign in', 'auth.signUp.submit': 'Create account', 'auth.toggle.toSignUp': 'No account? Create one', 'auth.toggle.toSignIn': 'Have an account? Sign in', 'auth.pending': 'Please wait…', 'auth.error': 'That didn’t work. Check your details and try again.', // ---- Dashboard shell ---- 'dash.nav.projects': 'Projects', 'dash.nav.billing': 'Billing', 'dash.nav.team': 'Team', 'dash.nav.backToSite': '← Back to site', // ---- Projects page ---- 'projects.heading': 'Projects', 'projects.new.placeholder': 'New project name', 'projects.new.submit': 'Create project', 'projects.empty': 'No projects yet — create your first one above.', 'projects.created': 'Created {when}', 'projects.paywall.title': 'You’ve hit your plan limit', 'projects.paywall.body': 'The free plan includes 3 projects. Upgrade to Pro for unlimited projects.', 'projects.paywall.cta': 'See plans →', // ---- Billing page ---- 'billing.heading': 'Billing', 'billing.plan.label': 'Current plan', 'billing.plan.free': 'Free', 'billing.status.label': 'Status', 'billing.seats.label': 'Seats', 'billing.upgrade.title': 'Upgrade to Pro', 'billing.upgrade.body': 'Unlimited projects and up to 10 seats.', 'billing.upgrade.cta': 'Upgrade →', 'billing.seats.add': 'Add a seat', 'billing.pending': 'Working…', // ---- Team page ---- 'team.heading': 'Team', 'team.invite.placeholder': 'teammate@example.com', 'team.invite.submit': 'Send invite', 'team.empty': 'No invites yet.', 'team.paywall': 'You’re out of seats. Add a seat on the Billing page, then invite again.', 'team.status.pending': 'pending', 'team.status.accepted': 'accepted', 'team.status.revoked': 'revoked', // ---- Scoped fallbacks ---- 'error.heading': 'Something went wrong', 'error.retry': 'Try again', 'notFound.heading': 'Not found', 'notFound.body': 'That page doesn’t exist.', 'notFound.back': '← Back to projects', } as const)