- By signing in, you agree to our{" "}
+ {LL.Auth.signInConsentPrefix()}{" "}
- Privacy & Data Policy
+ {LL.Settings.privacyAndDataPolicy()}
{" "}
- and consent to the processing of your personal data.
+ {LL.Auth.signInConsentSuffix()}
- I agree to the processing of my personal data as described in
- the{" "}
+ {LL.Auth.consentText()}{" "}
- Privacy & Data Policy
+ {LL.Settings.privacyAndDataPolicy()}
- . You can withdraw consent at any time by deleting your
- account.
+ {LL.Auth.consentSuffix()}
{fieldErrors.consent && (
diff --git a/apps/web/i18n/en/index.ts b/apps/web/i18n/en/index.ts
index 2b35927..2744099 100644
--- a/apps/web/i18n/en/index.ts
+++ b/apps/web/i18n/en/index.ts
@@ -21,6 +21,8 @@ const en = {
delete: "Delete",
loadingItems: "Loading items...",
noItemsYet: "No items yet. Add one to get started!",
+ gotIt: "Got it",
+ learnMore: "Learn more",
itemCount: "{count:number} {{Item|Items}}",
itemCountGlobal: "{count:number} {{Item|Items}} (global)",
},
@@ -56,6 +58,29 @@ const en = {
"Test authentication with Better Auth. OAuth integration with Google, session management, and protected routes.",
tryItOut: "Try it out",
footer: "Built with modern tools for rapid development",
+ heroTitle: "BE: Tech Stack",
+ heroDescription:
+ "Full-stack boilerplate with multi-tenancy, authentication, and CRUD operations. Explore the data grids and charting capabilities below.",
+ viewGrids: "View Grids",
+ viewCharts: "View Charts",
+ featureHighlights: "Feature Highlights",
+ totalRecords: "Total Records",
+ activeTenants: "Active Tenants",
+ users: "Users",
+ apiEndpoints: "API Endpoints",
+ stable: "stable",
+ powerfulDataGrids: "Powerful Data Grids",
+ powerfulDataGridsDesc:
+ "Editable, sortable, filterable tables for all your data. CRUD operations, bulk actions, nested rows, and multi-select — powered by TanStack Table.",
+ richVisualizations: "Rich Visualizations",
+ richVisualizationsDesc:
+ "10+ chart types powered by Plotly.js with WebGL support. Line, bar, scatter, 3D surfaces, heatmaps, and more — all interactive and responsive.",
+ multiTenantReady: "Multi-tenant Ready",
+ multiTenantReadyDesc:
+ "CRUD operations scoped per tenant with role-based read/write control. Manage tenants, members, and permissions from a single dashboard.",
+ tenantDashboard: "Tenant Dashboard",
+ tenantDashboardDesc: "Manage platform tenants and subscriptions",
+ manageMembersQuickDesc: "Add, remove, and manage tenant member roles",
},
Auth: {
signIn: "Sign in",
@@ -121,6 +146,14 @@ const en = {
verificationEmailSent: "Verification email sent! Check your inbox.",
passwordMinChars:
"Min 8 characters with uppercase, lowercase, number, and special character.",
+ consentText:
+ "I agree to the processing of my personal data as described in the",
+ consentSuffix:
+ ". You can withdraw consent at any time by deleting your account.",
+ consentRequired: "You must consent to data processing to create an account",
+ signInConsentPrefix: "By signing in, you agree to our",
+ signInConsentSuffix: "and consent to the processing of your personal data.",
+ userId: "User ID",
},
Dashboard: {
platformTenantsTitle: "Platform Tenants",
@@ -184,6 +217,32 @@ const en = {
noMembersYet: "No members yet. Add one above.",
removeMember: "Remove member",
selectTenantPrompt: "Select a tenant from the list to manage its members.",
+ editProfile: "Edit Profile",
+ editName: "Edit Name",
+ fullName: "Full Name",
+ fullNamePlaceholder: "Your full name",
+ nameHint:
+ "2-100 characters. Letters, spaces, hyphens, and apostrophes only.",
+ nameUpdated: "Name updated successfully",
+ failedUpdateName: "Failed to update name",
+ dataAndPrivacy: "Data & Privacy",
+ dataPrivacyDescription:
+ "You have the right to access, export, and delete your personal data at any time. Read our",
+ privacyAndDataPolicy: "Privacy & Data Policy",
+ downloadMyData: "Download My Data",
+ downloadMyDataDescription: "Export all your personal data as a JSON file",
+ preparingExport: "Preparing export...",
+ downloaded: "Downloaded",
+ download: "Download",
+ deleteAccount: "Delete Account",
+ deleteAccountDescription:
+ "Permanently delete your account and all associated data",
+ deleteConfirmPrefix: "This action is irreversible. Type your email address",
+ deleteConfirmSuffix: "to confirm.",
+ typeEmailToConfirm: "Type your email to confirm",
+ deleting: "Deleting...",
+ permanentlyDeleteAccount: "Permanently Delete Account",
+ failedDeleteAccount: "Failed to delete account",
},
Forms: {
email: "Email",
@@ -246,6 +305,325 @@ const en = {
loadingYourTenants: "Loading your tenants...",
settingUpTenant: "Setting up your tenant...",
},
+ Sidebar: {
+ navigation: "Navigation",
+ sectionMain: "Main",
+ sectionData: "Data",
+ sectionPlatform: "Platform",
+ sectionAccount: "Account",
+ home: "Home",
+ crudDemo: "CRUD Demo",
+ globalCrudDemo: "Global CRUD Demo",
+ grids: "Grids",
+ charts: "Charts",
+ tenantDashboard: "Tenant Dashboard",
+ tenantMembers: "Tenant Members",
+ profile: "Profile",
+ crudRecords: "Crud Records",
+ globalCrudRecords: "Global Crud Records",
+ editablePeople: "Editable People (Demo)",
+ batchOps: "Batch Ops (Demo)",
+ tenantsDemo: "Tenants (Demo)",
+ metricsDemo: "Metrics (Demo)",
+ tasksDemo: "Tasks (Demo)",
+ overviewCharts: "Overview Charts",
+ timeSeries: "Time Series",
+ distributionCharts: "Distribution Charts",
+ comparativeCharts: "Comparative Charts",
+ threeDAdvanced: "3D & Advanced",
+ },
+ Grids: {
+ title: "Data Grids",
+ descriptionPrefix:
+ "Grid scenarios powered by TanStack Table v8. Grids marked",
+ demo: "Demo",
+ descriptionMiddle: "use illustrative dummy data. Grids marked",
+ live: "Live",
+ descriptionSuffix: "fetch real data from the API.",
+ tabCrudRecords: "Crud Records",
+ tabGlobalCrudRecords: "Global Crud Records",
+ tabEditablePeople: "Editable People (Demo)",
+ tabBatchOps: "Batch Operations (Demo)",
+ tabTenants: "Tenants (Demo)",
+ tabMetrics: "Metrics (Demo)",
+ tabTasks: "Tasks (Demo)",
+ descCrudLive:
+ "Live read-only view of Crud records fetched from the API (Prisma). Reflects actual database state.",
+ descGlobalCrudLive:
+ "Live read-only view of Global Crud records fetched from the API (Prisma). No tenant scoping.",
+ descCrud:
+ "Demo: Editable grid with in-memory data modeled after the Crud entity shape.",
+ descGlobalCrud:
+ "Demo: Bulk operations with row selection, multi-sort, and batch actions on in-memory data.",
+ descTenants:
+ "Demo: Tenant management view grouped by plan tier with expandable sub-rows.",
+ descReadOnly:
+ "Demo: Read-only analytics metrics. Illustrative dummy data, not from a live API.",
+ descAdvanced:
+ "Demo: Rich cell renderers with tags, avatars, priority icons, and expandable details.",
+ colId: "ID",
+ colContent: "Content",
+ colCreatedAt: "Created At",
+ colUpdatedAt: "Updated At",
+ colFirstName: "First Name",
+ colLastName: "Last Name",
+ colEmail: "Email",
+ colRole: "Role",
+ colStatus: "Status",
+ colCreated: "Created",
+ colTenantName: "Tenant Name",
+ colPlan: "Plan",
+ colUsers: "Users",
+ colStorage: "Storage",
+ colRegion: "Region",
+ colMetric: "Metric",
+ colValue: "Value",
+ colChange: "Change",
+ colPeriod: "Period",
+ colCategory: "Category",
+ colTask: "Task",
+ colTags: "Tags",
+ colAssignedTo: "Assigned To",
+ colPriority: "Priority",
+ colDueDate: "Due Date",
+ colCompleted: "Completed",
+ roleAdmin: "Admin",
+ roleUser: "User",
+ roleEditor: "Editor",
+ roleViewer: "Viewer",
+ statusActive: "Active",
+ statusInactive: "Inactive",
+ statusSuspended: "Suspended",
+ statusTrial: "Trial",
+ planFree: "Free",
+ planPro: "Pro",
+ planEnterprise: "Enterprise",
+ livePrisma: "Live — Prisma",
+ recordCount: "{count:number} record{{s|}}",
+ loadingCrudRecords: "Loading Crud records…",
+ loadingGlobalCrudRecords: "Loading Global Crud records…",
+ failedToLoad: "Failed to load: {message:string}",
+ demoInMemory: "Demo — in-memory data",
+ demoDummyData: "Demo — dummy data",
+ demoDummyDataCount: "Demo — dummy data ({count:number} records)",
+ unsavedChanges: "Unsaved changes",
+ addRow: "Add Row",
+ selectedCount: "{count:number} selected",
+ deleteSelected: "Delete Selected",
+ export: "Export",
+ changeStatus: "Change Status",
+ usersIn: "Users in {name:string}",
+ userN: "User {n:number}",
+ moreUsers: "+{count:number} more",
+ done: "Done",
+ open: "Open",
+ assignedToLabel: "Assigned to {name:string}",
+ priorityLabel: "Priority: {value:string}",
+ dueLabel: "Due: {date:string}",
+ overdue: "OVERDUE",
+ },
+ Charts: {
+ title: "Charts & Visualizations",
+ description:
+ "12+ chart types powered by Plotly.js with WebGL support. All charts are interactive — zoom, pan, and hover for details.",
+ navLineArea: "Line & Area",
+ navBarColumn: "Bar & Column",
+ navPieDonut: "Pie, Donut & Sunburst",
+ navScatterBubble: "Scatter & Bubble",
+ navStatistical: "Statistical",
+ navHeatmapTimeline: "Heatmap & Timeline",
+ nav3dCharts: "3D Charts",
+ navMixedCombo: "Mixed / Combo",
+ navPlotlyTable: "Plotly Table",
+ lineAreaCharts: "Line & Area Charts",
+ barColumnCharts: "Bar & Column Charts",
+ pieDonutSunburst: "Pie, Donut & Sunburst",
+ scatterBubbleCharts: "Scatter & Bubble Charts",
+ statisticalCharts: "Statistical Charts",
+ heatmapTimeline: "Heatmap & Timeline",
+ threeDChartsWebGL: "3D Charts (WebGL)",
+ mixedComboCharts: "Mixed / Combo Charts",
+ plotlyTable: "Plotly Table",
+ userGrowthTitle: "User Growth Over Time",
+ userGrowthDesc: "24-month trend of new, active, and churned users.",
+ newUsers: "New Users",
+ activeUsers: "Active Users",
+ churnedUsers: "Churned Users",
+ revenueBreakdownTitle: "Revenue Breakdown by Category",
+ revenueBreakdownDesc:
+ "Stacked area showing subscription, add-on, service, and overage revenue.",
+ subscriptions: "Subscriptions",
+ addOns: "Add-ons",
+ services: "Services",
+ overages: "Overages",
+ mauByRegionTitle: "Monthly Active Users by Region",
+ mauByRegionDesc: "Grouped bar chart comparing four regions over 12 months.",
+ usEast: "US-East",
+ euWest: "EU-West",
+ apac: "APAC",
+ usWest: "US-West",
+ featureUsageTitle: "Feature Usage by Tenant Plan",
+ featureUsageDesc:
+ "Horizontal stacked bar showing feature adoption across plan tiers.",
+ auth: "Auth",
+ crud: "CRUD",
+ analytics: "Analytics",
+ api: "API",
+ multiTenant: "Multi-Tenant",
+ tenantPlanDistTitle: "Tenant Plan Distribution",
+ tenantPlanDistDesc:
+ "Donut chart showing the breakdown of tenants by plan tier.",
+ roleHierarchyTitle: "User Role Hierarchy",
+ roleHierarchyDesc:
+ "Sunburst chart showing organizational structure: Org > Department > Role.",
+ sessionScatterTitle: "Session Duration vs. Actions Taken",
+ sessionScatterDesc: "Color-encoded by user tier. Hover for details.",
+ free: "Free",
+ pro: "Pro",
+ enterprise: "Enterprise",
+ durationMin: "Duration (min)",
+ actions: "Actions",
+ tenantBubbleTitle: "Tenant Size vs. Storage Used",
+ tenantBubbleDesc: "Bubble size represents monthly revenue.",
+ revenueUsd: "Revenue ($)",
+ userCount: "User Count",
+ storageGb: "Storage (GB)",
+ responseTimeTitle: "Response Time Distribution by Service",
+ responseTimeDesc:
+ "Box plot showing latency spread across five API services.",
+ responseTimeMs: "Response Time (ms)",
+ sessionLengthTitle: "User Session Length Distribution",
+ sessionLengthDesc: "Histogram binned by minute intervals.",
+ sessionLengthMin: "Session Length (min)",
+ count: "Count",
+ activityHeatmapTitle: "Activity by Hour and Day of Week",
+ activityHeatmapDesc:
+ "7x24 heatmap showing event density. Viridis colorscale.",
+ ganttTitle: "Tenant Onboarding Timeline",
+ ganttDesc:
+ "Gantt-style horizontal bar showing onboarding start and end dates.",
+ engagement3dTitle: "3D User Engagement Clustering",
+ engagement3dDesc:
+ "WebGL-rendered 3D scatter: sessions x avg duration x revenue, colored by cluster tier.",
+ low: "Low",
+ medium: "Medium",
+ high: "High",
+ sessions: "Sessions",
+ avgDuration: "Avg Duration",
+ surfaceTitle: "Revenue Surface: Time x Region",
+ surfaceDesc: "Full 3D rotation — drag to explore. Portland colorscale.",
+ month: "Month",
+ region: "Region",
+ revenueK: "Revenue ($K)",
+ comboTitle: "Revenue vs. User Growth",
+ comboDesc:
+ "Bar chart (revenue) with line overlay (user count) on secondary y-axis.",
+ waterfallTitle: "MRR Movement This Quarter",
+ waterfallDesc:
+ "Waterfall chart showing new business, expansion, churn, and net MRR.",
+ mrrUsd: "MRR ($)",
+ plotlyTableTitle: "Top 10 Tenants — Plotly Table Trace",
+ plotlyTableDesc:
+ "This is a Plotly trace, not TanStack Table — compare the two on the Grids page.",
+ },
+ CookieBanner: {
+ text: "This site uses essential cookies to keep you signed in. No tracking or advertising cookies.",
+ learnMore: "Learn more",
+ gotIt: "Got it",
+ },
+ Privacy: {
+ title: "Privacy & Data Policy",
+ lastUpdated: "Last updated: February 20, 2026",
+ section1Title: "1. What data we collect",
+ section1Intro: "When you create an account we store:",
+ collectName: "Name and email",
+ collectNameDetail: "— provided by you or your Google account.",
+ collectImage: "Profile picture URL",
+ collectImageDetail: "— from Google if you sign in with Google.",
+ collectPassword: "Password",
+ collectPasswordDetail:
+ "— if you use email/password sign-in. Stored encrypted; we never see or store it in plain text.",
+ collectOAuth: "OAuth tokens",
+ collectOAuthDetail:
+ "— if you sign in with Google. Stored encrypted. Used to maintain your Google session and access Google Drive on your behalf if you granted those permissions.",
+ collectIp: "IP address and user agent",
+ collectIpDetail: "— recorded per session for security and audit purposes.",
+ collectConsent: "Consent timestamp and IP",
+ collectConsentDetail: "— recorded when you agree to this policy.",
+ section2Title: "2. How we use your data",
+ useAuth: "Authentication",
+ useAuthDetail:
+ "— to sign you in, verify your email, and manage your sessions.",
+ useAccount: "Account management",
+ useAccountDetail:
+ "— to display your profile and let you update or delete it.",
+ useEmail: "Transactional emails",
+ useEmailDetail:
+ "— to send OTPs, verification links, and password reset links. We never send marketing email.",
+ useSecurity: "Security",
+ useSecurityDetail:
+ "— to detect suspicious activity and maintain audit logs.",
+ useDrive: "Google Drive",
+ useDriveDetail:
+ "— if you granted Drive scopes, to read or create files in your Drive on your behalf. We do not access Drive without your explicit scope grant.",
+ noSellData:
+ "We do not sell, share, or rent your personal data to third parties. We do not use your data for advertising or profiling.",
+ section3Title: "3. Cookies",
+ cookiesIntro: "We use",
+ cookiesIntroStrict: "strictly necessary cookies only",
+ cookiesIntroSuffix: ". No analytics, advertising, or tracking cookies.",
+ cookieHeader: "Cookie",
+ purposeHeader: "Purpose",
+ expiryHeader: "Expiry",
+ cookieSessionToken: "Session Token",
+ cookieSessionPurpose: "Keeps you signed in across visits",
+ cookieSessionExpiry: "7 days",
+ cookieOAuthState: "OAuth State",
+ cookieOAuthPurpose: "Temporary token to secure the Google sign-in flow",
+ cookieOAuthExpiry: "3 days",
+ cookiesFootnote:
+ "These cookies are required for the application to function. They cannot be used to track you across other websites.",
+ section4Title: "4. Third-party services",
+ thirdPartyGoogle: "Google (OAuth)",
+ thirdPartyGoogleDetail: "— for sign-in and Drive access. Subject to",
+ googlePrivacyPolicy: "Google's Privacy Policy",
+ thirdPartyAws: "Amazon Web Services (SES)",
+ thirdPartyAwsDetail:
+ "— to deliver transactional emails. AWS processes recipient email addresses solely for delivery.",
+ thirdPartyRollbar: "Rollbar",
+ thirdPartyRollbarDetail:
+ "— for error monitoring. Receives error messages and stack traces only; no user PII is intentionally sent.",
+ section5Title: "5. How we protect your data",
+ protectPassword:
+ "Passwords are stored encrypted and can never be read back.",
+ protectOAuth: "OAuth tokens are encrypted at rest on our servers.",
+ protectCookies: "Session cookies are secured and signed.",
+ protectLogs: "Email addresses are not stored in application logs.",
+ protectHttps: "All communication is over HTTPS in production.",
+ section6Title: "6. Your rights",
+ rightsIntro: "From your profile page you can:",
+ rightAccess: "Access",
+ rightAccessDetail:
+ "— download all personal data we hold about you as a JSON file.",
+ rightRectify: "Rectify",
+ rightRectifyDetail: "— update your name and profile picture.",
+ rightDelete: "Delete",
+ rightDeleteDetail:
+ "— permanently delete your account and all associated data (sessions, OAuth tokens, tenant memberships, verification tokens). This action is irreversible.",
+ rightWithdraw: "Withdraw consent",
+ rightWithdrawDetail: "— by deleting your account.",
+ rightsAuditNote:
+ "All data subject actions are recorded in an internal audit log.",
+ section7Title: "7. Data retention",
+ retainAccount: "Account data is kept for as long as your account exists.",
+ retainSessions: "Sessions expire after 7 days.",
+ retainVerification:
+ "Verification tokens (email, OTP, password reset) are automatically purged after expiry.",
+ retainDeletion:
+ "When you delete your account, all personal data is permanently removed. GDPR audit log entries (which contain only your user ID and action type) are retained for legal accountability.",
+ section8Title: "8. Contact",
+ contactText: "For privacy-related questions or requests, email us at",
+ },
} satisfies BaseTranslation;
export default en;
diff --git a/apps/web/i18n/i18n-react.tsx b/apps/web/i18n/i18n-react.tsx
index 6aa459b..f113051 100644
--- a/apps/web/i18n/i18n-react.tsx
+++ b/apps/web/i18n/i18n-react.tsx
@@ -1,29 +1,16 @@
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
+/* eslint-disable */
-import { useContext } from "react";
-import { initI18nReact } from "typesafe-i18n/react";
-import type { I18nContextType } from "typesafe-i18n/react";
-import type {
- Formatters,
- Locales,
- TranslationFunctions,
- Translations,
-} from "./i18n-types";
-import { loadedFormatters, loadedLocales } from "./i18n-util";
+import { useContext } from 'react'
+import { initI18nReact } from 'typesafe-i18n/react'
+import type { I18nContextType } from 'typesafe-i18n/react'
+import type { Formatters, Locales, TranslationFunctions, Translations } from './i18n-types'
+import { loadedFormatters, loadedLocales } from './i18n-util'
-const { component: TypesafeI18n, context: I18nContext } = initI18nReact<
- Locales,
- Translations,
- TranslationFunctions,
- Formatters
->(loadedLocales, loadedFormatters);
+const { component: TypesafeI18n, context: I18nContext } = initI18nReact
(loadedLocales, loadedFormatters)
-const useI18nContext = (): I18nContextType<
- Locales,
- Translations,
- TranslationFunctions
-> => useContext(I18nContext);
+const useI18nContext = (): I18nContextType => useContext(I18nContext)
-export { I18nContext, useI18nContext };
+export { I18nContext, useI18nContext }
-export default TypesafeI18n;
+export default TypesafeI18n
diff --git a/apps/web/i18n/i18n-types.ts b/apps/web/i18n/i18n-types.ts
index 1bcc569..5e446f9 100644
--- a/apps/web/i18n/i18n-types.ts
+++ b/apps/web/i18n/i18n-types.ts
@@ -1,1699 +1,4303 @@
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
/* eslint-disable */
-import type {
- BaseTranslation as BaseTranslationType,
- LocalizedString,
- RequiredParams,
-} from "typesafe-i18n";
+import type { BaseTranslation as BaseTranslationType, LocalizedString, RequiredParams } from 'typesafe-i18n'
-export type BaseTranslation = BaseTranslationType;
-export type BaseLocale = "en";
+export type BaseTranslation = BaseTranslationType
+export type BaseLocale = 'en'
-export type Locales = "en" | "nl";
+export type Locales =
+ | 'en'
+ | 'nl'
-export type Translation = RootTranslation;
+export type Translation = RootTranslation
-export type Translations = RootTranslation;
+export type Translations = RootTranslation
type RootTranslation = {
- Common: {
- /**
- * Loading...
- */
- loading: string;
- /**
- * Back to Home
- */
- backToHome: string;
- /**
- * Back
- */
- back: string;
- /**
- * Cancel
- */
- cancel: string;
- /**
- * Save
- */
- save: string;
- /**
- * Add
- */
- add: string;
- /**
- * Refresh
- */
- refresh: string;
- /**
- * Refreshing...
- */
- refreshing: string;
- /**
- * Adding...
- */
- adding: string;
- /**
- * Saving...
- */
- saving: string;
- /**
- * Sending...
- */
- sending: string;
- /**
- * Or
- */
- or: string;
- /**
- * Admin
- */
- roleAdmin: string;
- /**
- * User
- */
- roleUser: string;
- /**
- * You
- */
- you: string;
- /**
- * Edit
- */
- edit: string;
- /**
- * Delete
- */
- delete: string;
- /**
- * Loading items...
- */
- loadingItems: string;
- /**
- * No items yet. Add one to get started!
- */
- noItemsYet: string;
- /**
- * {count} {{Item|Items}}
- * @param {number} count
- */
- itemCount: RequiredParams<"count">;
- /**
- * {count} {{Item|Items}} (global)
- * @param {number} count
- */
- itemCountGlobal: RequiredParams<"count">;
- };
- Navigation: {
- /**
- * Full Stack
- */
- fullStack: string;
- /**
- * Profile & Security
- */
- profileAndSecurity: string;
- /**
- * Platform Tenants
- */
- platformTenants: string;
- /**
- * Manage Members
- */
- manageMembers: string;
- /**
- * Sign out
- */
- signOut: string;
- /**
- * Switch tenant
- */
- switchTenant: string;
- /**
- * Switching...
- */
- switching: string;
- /**
- * Select tenant
- */
- selectTenant: string;
- };
- Home: {
- /**
- * Full Stack Boilerplate
- */
- title: string;
- /**
- * NextJs (Tailwind CSS), NestJs, Expo, tRPC, Better Auth
- */
- subtitle: string;
- /**
- * CRUD Demo
- */
- crudDemoTitle: string;
- /**
- * Test Create, Read, Update, Delete operations with tRPC and Prisma integration. Full-stack type safety demonstration.
- */
- crudDemoDescription: string;
- /**
- * Global CRUD Demo
- */
- globalCrudDemoTitle: string;
- /**
- * Same as CRUD but shared across all tenants. Everyone sees and edits the same data.
- */
- globalCrudDemoDescription: string;
- /**
- * Platform Tenants
- */
- platformTenantsTitle: string;
- /**
- * Create, edit, and remove tenants across the platform. Super-admin only.
- */
- platformTenantsDescription: string;
- /**
- * Manage tenants
- */
- manageTenants: string;
- /**
- * Manage Members
- */
- manageMembersTitle: string;
- /**
- * Add or remove members from tenants you administer.
- */
- manageMembersDescription: string;
- /**
- * Manage members
- */
- manageMembers: string;
- /**
- * Auth Demo
- */
- authDemoTitle: string;
- /**
- * Test authentication with Better Auth. OAuth integration with Google, session management, and protected routes.
- */
- authDemoDescription: string;
- /**
- * Try it out
- */
- tryItOut: string;
- /**
- * Built with modern tools for rapid development
- */
- footer: string;
- };
- Auth: {
- /**
- * Sign in
- */
- signIn: string;
- /**
- * Sign in
- */
- signInTitle: string;
- /**
- * Choose your preferred sign-in method
- */
- signInSubtitle: string;
- /**
- * Sign in with Google
- */
- signInWithGoogle: string;
- /**
- * Sign in with Email OTP
- */
- signInWithEmailOtp: string;
- /**
- * Or with Email & Password
- */
- orWithEmailPassword: string;
- /**
- * Sign in with Email & Password
- */
- signInWithEmailPassword: string;
- /**
- * Signing in...
- */
- signingIn: string;
- /**
- * Sign up
- */
- signUp: string;
- /**
- * Create an account
- */
- signUpTitle: string;
- /**
- * Sign up with your email and password
- */
- signUpSubtitle: string;
- /**
- * Sign up with Email & Password
- */
- signUpWithEmailPassword: string;
- /**
- * Creating account...
- */
- creatingAccount: string;
- /**
- * Don't have an account?
- */
- dontHaveAccount: string;
- /**
- * Already have an account?
- */
- alreadyHaveAccount: string;
- /**
- * Forgot Password?
- */
- forgotPassword: string;
- /**
- * Forgot Password
- */
- forgotPasswordTitle: string;
- /**
- * Enter your email to receive a password reset link
- */
- forgotPasswordSubtitle: string;
- /**
- * Check your inbox
- */
- checkYourInbox: string;
- /**
- * Send Reset Link
- */
- sendResetLink: string;
- /**
- * Back to Sign In
- */
- backToSignIn: string;
- /**
- * If an account exists with this email, you'll receive a link to set your password.
- */
- resetLinkSentMessage: string;
- /**
- * Set Your Password
- */
- setYourPassword: string;
- /**
- * Enter a new password for your account
- */
- setPasswordSubtitle: string;
- /**
- * Set Password
- */
- setPassword: string;
- /**
- * Setting password...
- */
- settingPassword: string;
- /**
- * Invalid or Expired Link
- */
- invalidOrExpiredLink: string;
- /**
- * This password reset link is invalid or has expired. Please request a new one.
- */
- invalidOrExpiredLinkMessage: string;
- /**
- * Request New Link
- */
- requestNewLink: string;
- /**
- * Verification Failed
- */
- verificationFailed: string;
- /**
- * This verification link has expired. Please try signing in again to receive a new verification email.
- */
- verificationFailedExpired: string;
- /**
- * This verification link is invalid. Please try signing in again to receive a new verification email.
- */
- verificationFailedInvalid: string;
- /**
- * Email Verified!
- */
- emailVerified: string;
- /**
- * Your email has been verified successfully. Redirecting to home...
- */
- emailVerifiedMessage: string;
- /**
- * Go to Home now
- */
- goToHome: string;
- /**
- * Go to Sign In
- */
- goToSignIn: string;
- /**
- * Send OTP
- */
- sendOtp: string;
- /**
- * Verify OTP
- */
- verifyOtp: string;
- /**
- * Verifying...
- */
- verifying: string;
- /**
- * Change Email
- */
- changeEmail: string;
- /**
- * We sent a verification code to {email}
- * @param {string} email
- */
- otpSentTo: RequiredParams<"email">;
- /**
- * We've sent a verification email to {email}. Please check your inbox and click the link to verify your account before signing in.
- * @param {string} email
- */
- checkInboxMessage: RequiredParams<"email">;
- /**
- * Password set successfully. You can now sign in.
- */
- passwordSetSuccess: string;
- /**
- * Sign in required
- */
- signInRequired: string;
- /**
- * You need to be authenticated to access this application.
- */
- signInRequiredMessage: string;
- /**
- * Better Auth Demo
- */
- betterAuthDemo: string;
- /**
- * Welcome back!
- */
- welcomeBack: string;
- /**
- * Sign in to continue
- */
- signInToContinue: string;
- /**
- * You are signed in
- */
- youAreSignedIn: string;
- /**
- * User Information
- */
- userInformation: string;
- /**
- * Sign Out
- */
- signOutButton: string;
- /**
- * Or Email & Password
- */
- orEmailPassword: string;
- /**
- * Resend verification email
- */
- resendVerificationEmail: string;
- /**
- * Verification email sent! Check your inbox.
- */
- verificationEmailSent: string;
- /**
- * Min 8 characters with uppercase, lowercase, number, and special character.
- */
- passwordMinChars: string;
- };
- Dashboard: {
- /**
- * Platform Tenants
- */
- platformTenantsTitle: string;
- /**
- * Create, edit, and remove tenants. Super-admin only.
- */
- platformTenantsSubtitle: string;
- /**
- * You must be logged in to access this page.
- */
- mustBeLoggedIn: string;
- /**
- * Super-admin access required. Your email must be in SUPER_ADMIN_EMAILS.
- */
- superAdminRequired: string;
- /**
- * Add tenant
- */
- addTenant: string;
- /**
- * Slug (a-z, 0-9, hyphens)
- */
- slugLabel: string;
- /**
- * e.g. acme-corp
- */
- slugPlaceholder: string;
- /**
- * e.g. Acme Corp
- */
- namePlaceholder: string;
- /**
- * {count} tenant{{s|}}
- * @param {number} count
- */
- tenantCount: RequiredParams<"count">;
- /**
- * Loading tenants...
- */
- loadingTenants: string;
- /**
- * No tenants yet. Add one above.
- */
- noTenantsYet: string;
- /**
- * Refresh list
- */
- refreshList: string;
- /**
- * Delete tenant "{slug}"? This cannot be undone.
- * @param {string} slug
- */
- deleteConfirm: RequiredParams<"slug">;
- /**
- * Dual Database CRUD Demo
- */
- dualDatabaseCrudDemo: string;
- /**
- * Side-by-side comparison of Mongoose (MongoDB) and Prisma (PostgreSQL)
- */
- crudDemoSubtitle: string;
- /**
- * NextJs (TailwindCSS) • NestJs • tRPC • Transactions
- */
- crudDemoTechStack: string;
- /**
- * → Tenant Dashboard (super-admin)
- */
- tenantDashboardLink: string;
- /**
- * Global CRUD Demo
- */
- globalCrudDemoTitle: string;
- /**
- * Same as CRUD but shared across all tenants. Everyone sees and edits the same data.
- */
- globalCrudDemoSubtitle: string;
- /**
- * Mongoose (MongoDB) & Prisma (PostgreSQL) • No tenant scope
- */
- globalCrudDemoTechStack: string;
- /**
- * Add text here
- */
- addTextPlaceholder: string;
- };
- Settings: {
- /**
- * Profile
- */
- profileTitle: string;
- /**
- * Manage your account security and linked sign-in methods.
- */
- profileSubtitle: string;
- /**
- * Your email is not verified
- */
- emailNotVerified: string;
- /**
- * Please verify your email to access all features.
- */
- verifyEmailPrompt: string;
- /**
- * Account Info
- */
- accountInfo: string;
- /**
- * Linked Accounts
- */
- linkedAccounts: string;
- /**
- * Google
- */
- google: string;
- /**
- * Connected
- */
- connected: string;
- /**
- * Connect Google
- */
- connectGoogle: string;
- /**
- * Email & Password
- */
- emailAndPassword: string;
- /**
- * Password set
- */
- passwordSet: string;
- /**
- * Not set
- */
- notSet: string;
- /**
- * Password
- */
- passwordTitle: string;
- /**
- * Change Password
- */
- changePassword: string;
- /**
- * Current Password
- */
- currentPassword: string;
- /**
- * New Password (min 8 characters)
- */
- newPasswordLabel: string;
- /**
- * Confirm New Password
- */
- confirmNewPassword: string;
- /**
- * Save Password
- */
- savePassword: string;
- /**
- * Add a password to sign in without Google or OTP.
- */
- addPasswordDescription: string;
- /**
- * Check your inbox to set your password.
- */
- checkInboxForPassword: string;
- /**
- * Manage Members
- */
- manageMembersTitle: string;
- /**
- * Add or remove members from your tenants.
- */
- manageMembersSubtitle: string;
- /**
- * No admin access
- */
- noAdminAccess: string;
- /**
- * You don't have admin access to any tenants.
- */
- noAdminAccessMessage: string;
- /**
- * Your tenants ({count})
- * @param {number} count
- */
- yourTenants: RequiredParams<"count">;
- /**
- * Members of {name}
- * @param {string} name
- */
- membersOf: RequiredParams<"name">;
- /**
- * Add member
- */
- addMember: string;
- /**
- * user@example.com
- */
- memberEmailPlaceholder: string;
- /**
- * Loading members...
- */
- loadingMembers: string;
- /**
- * No members yet. Add one above.
- */
- noMembersYet: string;
- /**
- * Remove member
- */
- removeMember: string;
- /**
- * Select a tenant from the list to manage its members.
- */
- selectTenantPrompt: string;
- };
- Forms: {
- /**
- * Email
- */
- email: string;
- /**
- * Email Address
- */
- emailAddress: string;
- /**
- * you@example.com
- */
- emailPlaceholder: string;
- /**
- * Enter your email
- */
- enterYourEmail: string;
- /**
- * Password
- */
- password: string;
- /**
- * ••••••••
- */
- passwordPlaceholder: string;
- /**
- * Password (min 8 characters)
- */
- passwordMinChars: string;
- /**
- * Confirm Password
- */
- confirmPassword: string;
- /**
- * First Name
- */
- firstName: string;
- /**
- * John
- */
- firstNamePlaceholder: string;
- /**
- * Last Name
- */
- lastName: string;
- /**
- * Doe
- */
- lastNamePlaceholder: string;
- /**
- * Name
- */
- name: string;
- /**
- * Your name
- */
- namePlaceholder: string;
- /**
- * Verification Code
- */
- verificationCode: string;
- /**
- * Enter 6-digit code
- */
- verificationCodePlaceholder: string;
- /**
- * Slug
- */
- slug: string;
- };
- Errors: {
- /**
- * Failed to sign in with Google
- */
- failedSignInGoogle: string;
- /**
- * Failed to send OTP. Please try again.
- */
- failedSendOtp: string;
- /**
- * Unable to send OTP
- */
- unableToSendOtp: string;
- /**
- * Invalid OTP. Please try again.
- */
- invalidOtp: string;
- /**
- * Unable to verify OTP
- */
- unableToVerifyOtp: string;
- /**
- * Please verify your email address before signing in.
- */
- verifyEmailBeforeSignIn: string;
- /**
- * This account was created with Google or OTP. Use 'Forgot Password' below to set a password.
- */
- accountCreatedWithSocial: string;
- /**
- * Invalid email or password.
- */
- invalidEmailOrPassword: string;
- /**
- * Passwords do not match.
- */
- passwordsDoNotMatch: string;
- /**
- * Password must be at least 8 characters.
- */
- passwordMinLength: string;
- /**
- * Password must be at most 128 characters.
- */
- passwordMaxLength: string;
- /**
- * Password must contain at least one uppercase letter.
- */
- passwordUppercase: string;
- /**
- * Password must contain at least one lowercase letter.
- */
- passwordLowercase: string;
- /**
- * Password must contain at least one number.
- */
- passwordNumber: string;
- /**
- * Password must contain at least one special character.
- */
- passwordSpecialChar: string;
- /**
- * Failed to reset password. Please try again.
- */
- failedResetPassword: string;
- /**
- * Failed to change password.
- */
- failedChangePassword: string;
- /**
- * Password changed successfully.
- */
- passwordChangedSuccess: string;
- /**
- * Sign up failed. Please try again.
- */
- signUpFailed: string;
- /**
- * Sign in failed
- */
- signInFailed: string;
- /**
- * An account with this email already exists. Try signing in instead — if you used Google or OTP, you can set a password from your profile.
- */
- accountAlreadyExists: string;
- /**
- * {label} is required.
- * @param {string} label
- */
- nameRequired: RequiredParams<"label">;
- /**
- * {label} must be at least 2 characters.
- * @param {string} label
- */
- nameMinLength: RequiredParams<"label">;
- /**
- * {label} can only contain letters, spaces, hyphens, and apostrophes.
- * @param {string} label
- */
- nameInvalidChars: RequiredParams<"label">;
- /**
- * Email is required.
- */
- emailRequired: string;
- /**
- * Please enter a valid email address.
- */
- emailInvalid: string;
- /**
- * Password is required.
- */
- passwordRequired: string;
- /**
- * Slug is required
- */
- slugRequired: string;
- /**
- * Name is required
- */
- nameFieldRequired: string;
- /**
- * Slug must be lowercase letters, numbers, and hyphens only
- */
- slugInvalid: string;
- /**
- * No tenants assigned
- */
- noTenantsAssigned: string;
- /**
- * You don't have access to any tenants yet. Please contact an administrator to get added to a tenant.
- */
- noTenantsMessage: string;
- /**
- * Loading your tenants...
- */
- loadingYourTenants: string;
- /**
- * Setting up your tenant...
- */
- settingUpTenant: string;
- };
-};
+ Common: {
+ /**
+ * Loading...
+ */
+ loading: string
+ /**
+ * Back to Home
+ */
+ backToHome: string
+ /**
+ * Back
+ */
+ back: string
+ /**
+ * Cancel
+ */
+ cancel: string
+ /**
+ * Save
+ */
+ save: string
+ /**
+ * Add
+ */
+ add: string
+ /**
+ * Refresh
+ */
+ refresh: string
+ /**
+ * Refreshing...
+ */
+ refreshing: string
+ /**
+ * Adding...
+ */
+ adding: string
+ /**
+ * Saving...
+ */
+ saving: string
+ /**
+ * Sending...
+ */
+ sending: string
+ /**
+ * Or
+ */
+ or: string
+ /**
+ * Admin
+ */
+ roleAdmin: string
+ /**
+ * User
+ */
+ roleUser: string
+ /**
+ * You
+ */
+ you: string
+ /**
+ * Edit
+ */
+ edit: string
+ /**
+ * Delete
+ */
+ 'delete': string
+ /**
+ * Loading items...
+ */
+ loadingItems: string
+ /**
+ * No items yet. Add one to get started!
+ */
+ noItemsYet: string
+ /**
+ * Got it
+ */
+ gotIt: string
+ /**
+ * Learn more
+ */
+ learnMore: string
+ /**
+ * {count} {{Item|Items}}
+ * @param {number} count
+ */
+ itemCount: RequiredParams<'count'>
+ /**
+ * {count} {{Item|Items}} (global)
+ * @param {number} count
+ */
+ itemCountGlobal: RequiredParams<'count'>
+ }
+ Navigation: {
+ /**
+ * Full Stack
+ */
+ fullStack: string
+ /**
+ * Profile & Security
+ */
+ profileAndSecurity: string
+ /**
+ * Platform Tenants
+ */
+ platformTenants: string
+ /**
+ * Manage Members
+ */
+ manageMembers: string
+ /**
+ * Sign out
+ */
+ signOut: string
+ /**
+ * Switch tenant
+ */
+ switchTenant: string
+ /**
+ * Switching...
+ */
+ switching: string
+ /**
+ * Select tenant
+ */
+ selectTenant: string
+ }
+ Home: {
+ /**
+ * Full Stack Boilerplate
+ */
+ title: string
+ /**
+ * NextJs (Tailwind CSS), NestJs, Expo, tRPC, Better Auth
+ */
+ subtitle: string
+ /**
+ * CRUD Demo
+ */
+ crudDemoTitle: string
+ /**
+ * Test Create, Read, Update, Delete operations with tRPC and Prisma integration. Full-stack type safety demonstration.
+ */
+ crudDemoDescription: string
+ /**
+ * Global CRUD Demo
+ */
+ globalCrudDemoTitle: string
+ /**
+ * Same as CRUD but shared across all tenants. Everyone sees and edits the same data.
+ */
+ globalCrudDemoDescription: string
+ /**
+ * Platform Tenants
+ */
+ platformTenantsTitle: string
+ /**
+ * Create, edit, and remove tenants across the platform. Super-admin only.
+ */
+ platformTenantsDescription: string
+ /**
+ * Manage tenants
+ */
+ manageTenants: string
+ /**
+ * Manage Members
+ */
+ manageMembersTitle: string
+ /**
+ * Add or remove members from tenants you administer.
+ */
+ manageMembersDescription: string
+ /**
+ * Manage members
+ */
+ manageMembers: string
+ /**
+ * Auth Demo
+ */
+ authDemoTitle: string
+ /**
+ * Test authentication with Better Auth. OAuth integration with Google, session management, and protected routes.
+ */
+ authDemoDescription: string
+ /**
+ * Try it out
+ */
+ tryItOut: string
+ /**
+ * Built with modern tools for rapid development
+ */
+ footer: string
+ /**
+ * BE: Tech Stack
+ */
+ heroTitle: string
+ /**
+ * Full-stack boilerplate with multi-tenancy, authentication, and CRUD operations. Explore the data grids and charting capabilities below.
+ */
+ heroDescription: string
+ /**
+ * View Grids
+ */
+ viewGrids: string
+ /**
+ * View Charts
+ */
+ viewCharts: string
+ /**
+ * Feature Highlights
+ */
+ featureHighlights: string
+ /**
+ * Total Records
+ */
+ totalRecords: string
+ /**
+ * Active Tenants
+ */
+ activeTenants: string
+ /**
+ * Users
+ */
+ users: string
+ /**
+ * API Endpoints
+ */
+ apiEndpoints: string
+ /**
+ * stable
+ */
+ stable: string
+ /**
+ * Powerful Data Grids
+ */
+ powerfulDataGrids: string
+ /**
+ * Editable, sortable, filterable tables for all your data. CRUD operations, bulk actions, nested rows, and multi-select — powered by TanStack Table.
+ */
+ powerfulDataGridsDesc: string
+ /**
+ * Rich Visualizations
+ */
+ richVisualizations: string
+ /**
+ * 10+ chart types powered by Plotly.js with WebGL support. Line, bar, scatter, 3D surfaces, heatmaps, and more — all interactive and responsive.
+ */
+ richVisualizationsDesc: string
+ /**
+ * Multi-tenant Ready
+ */
+ multiTenantReady: string
+ /**
+ * CRUD operations scoped per tenant with role-based read/write control. Manage tenants, members, and permissions from a single dashboard.
+ */
+ multiTenantReadyDesc: string
+ /**
+ * Tenant Dashboard
+ */
+ tenantDashboard: string
+ /**
+ * Manage platform tenants and subscriptions
+ */
+ tenantDashboardDesc: string
+ /**
+ * Add, remove, and manage tenant member roles
+ */
+ manageMembersQuickDesc: string
+ }
+ Auth: {
+ /**
+ * Sign in
+ */
+ signIn: string
+ /**
+ * Sign in
+ */
+ signInTitle: string
+ /**
+ * Choose your preferred sign-in method
+ */
+ signInSubtitle: string
+ /**
+ * Sign in with Google
+ */
+ signInWithGoogle: string
+ /**
+ * Sign in with Email OTP
+ */
+ signInWithEmailOtp: string
+ /**
+ * Or with Email & Password
+ */
+ orWithEmailPassword: string
+ /**
+ * Sign in with Email & Password
+ */
+ signInWithEmailPassword: string
+ /**
+ * Signing in...
+ */
+ signingIn: string
+ /**
+ * Sign up
+ */
+ signUp: string
+ /**
+ * Create an account
+ */
+ signUpTitle: string
+ /**
+ * Sign up with your email and password
+ */
+ signUpSubtitle: string
+ /**
+ * Sign up with Email & Password
+ */
+ signUpWithEmailPassword: string
+ /**
+ * Creating account...
+ */
+ creatingAccount: string
+ /**
+ * Don't have an account?
+ */
+ dontHaveAccount: string
+ /**
+ * Already have an account?
+ */
+ alreadyHaveAccount: string
+ /**
+ * Forgot Password?
+ */
+ forgotPassword: string
+ /**
+ * Forgot Password
+ */
+ forgotPasswordTitle: string
+ /**
+ * Enter your email to receive a password reset link
+ */
+ forgotPasswordSubtitle: string
+ /**
+ * Check your inbox
+ */
+ checkYourInbox: string
+ /**
+ * Send Reset Link
+ */
+ sendResetLink: string
+ /**
+ * Back to Sign In
+ */
+ backToSignIn: string
+ /**
+ * If an account exists with this email, you'll receive a link to set your password.
+ */
+ resetLinkSentMessage: string
+ /**
+ * Set Your Password
+ */
+ setYourPassword: string
+ /**
+ * Enter a new password for your account
+ */
+ setPasswordSubtitle: string
+ /**
+ * Set Password
+ */
+ setPassword: string
+ /**
+ * Setting password...
+ */
+ settingPassword: string
+ /**
+ * Invalid or Expired Link
+ */
+ invalidOrExpiredLink: string
+ /**
+ * This password reset link is invalid or has expired. Please request a new one.
+ */
+ invalidOrExpiredLinkMessage: string
+ /**
+ * Request New Link
+ */
+ requestNewLink: string
+ /**
+ * Verification Failed
+ */
+ verificationFailed: string
+ /**
+ * This verification link has expired. Please try signing in again to receive a new verification email.
+ */
+ verificationFailedExpired: string
+ /**
+ * This verification link is invalid. Please try signing in again to receive a new verification email.
+ */
+ verificationFailedInvalid: string
+ /**
+ * Email Verified!
+ */
+ emailVerified: string
+ /**
+ * Your email has been verified successfully. Redirecting to home...
+ */
+ emailVerifiedMessage: string
+ /**
+ * Go to Home now
+ */
+ goToHome: string
+ /**
+ * Go to Sign In
+ */
+ goToSignIn: string
+ /**
+ * Send OTP
+ */
+ sendOtp: string
+ /**
+ * Verify OTP
+ */
+ verifyOtp: string
+ /**
+ * Verifying...
+ */
+ verifying: string
+ /**
+ * Change Email
+ */
+ changeEmail: string
+ /**
+ * We sent a verification code to {email}
+ * @param {string} email
+ */
+ otpSentTo: RequiredParams<'email'>
+ /**
+ * We've sent a verification email to {email}. Please check your inbox and click the link to verify your account before signing in.
+ * @param {string} email
+ */
+ checkInboxMessage: RequiredParams<'email'>
+ /**
+ * Password set successfully. You can now sign in.
+ */
+ passwordSetSuccess: string
+ /**
+ * Sign in required
+ */
+ signInRequired: string
+ /**
+ * You need to be authenticated to access this application.
+ */
+ signInRequiredMessage: string
+ /**
+ * Better Auth Demo
+ */
+ betterAuthDemo: string
+ /**
+ * Welcome back!
+ */
+ welcomeBack: string
+ /**
+ * Sign in to continue
+ */
+ signInToContinue: string
+ /**
+ * You are signed in
+ */
+ youAreSignedIn: string
+ /**
+ * User Information
+ */
+ userInformation: string
+ /**
+ * Sign Out
+ */
+ signOutButton: string
+ /**
+ * Or Email & Password
+ */
+ orEmailPassword: string
+ /**
+ * Resend verification email
+ */
+ resendVerificationEmail: string
+ /**
+ * Verification email sent! Check your inbox.
+ */
+ verificationEmailSent: string
+ /**
+ * Min 8 characters with uppercase, lowercase, number, and special character.
+ */
+ passwordMinChars: string
+ /**
+ * I agree to the processing of my personal data as described in the
+ */
+ consentText: string
+ /**
+ * . You can withdraw consent at any time by deleting your account.
+ */
+ consentSuffix: string
+ /**
+ * You must consent to data processing to create an account
+ */
+ consentRequired: string
+ /**
+ * By signing in, you agree to our
+ */
+ signInConsentPrefix: string
+ /**
+ * and consent to the processing of your personal data.
+ */
+ signInConsentSuffix: string
+ /**
+ * User ID
+ */
+ userId: string
+ }
+ Dashboard: {
+ /**
+ * Platform Tenants
+ */
+ platformTenantsTitle: string
+ /**
+ * Create, edit, and remove tenants. Super-admin only.
+ */
+ platformTenantsSubtitle: string
+ /**
+ * You must be logged in to access this page.
+ */
+ mustBeLoggedIn: string
+ /**
+ * Super-admin access required. Your email must be in SUPER_ADMIN_EMAILS.
+ */
+ superAdminRequired: string
+ /**
+ * Add tenant
+ */
+ addTenant: string
+ /**
+ * Slug (a-z, 0-9, hyphens)
+ */
+ slugLabel: string
+ /**
+ * e.g. acme-corp
+ */
+ slugPlaceholder: string
+ /**
+ * e.g. Acme Corp
+ */
+ namePlaceholder: string
+ /**
+ * {count} tenant{{s|}}
+ * @param {number} count
+ */
+ tenantCount: RequiredParams<'count'>
+ /**
+ * Loading tenants...
+ */
+ loadingTenants: string
+ /**
+ * No tenants yet. Add one above.
+ */
+ noTenantsYet: string
+ /**
+ * Refresh list
+ */
+ refreshList: string
+ /**
+ * Delete tenant "{slug}"? This cannot be undone.
+ * @param {string} slug
+ */
+ deleteConfirm: RequiredParams<'slug'>
+ /**
+ * Dual Database CRUD Demo
+ */
+ dualDatabaseCrudDemo: string
+ /**
+ * Side-by-side comparison of Mongoose (MongoDB) and Prisma (PostgreSQL)
+ */
+ crudDemoSubtitle: string
+ /**
+ * NextJs (TailwindCSS) • NestJs • tRPC • Transactions
+ */
+ crudDemoTechStack: string
+ /**
+ * → Tenant Dashboard (super-admin)
+ */
+ tenantDashboardLink: string
+ /**
+ * Global CRUD Demo
+ */
+ globalCrudDemoTitle: string
+ /**
+ * Same as CRUD but shared across all tenants. Everyone sees and edits the same data.
+ */
+ globalCrudDemoSubtitle: string
+ /**
+ * Mongoose (MongoDB) & Prisma (PostgreSQL) • No tenant scope
+ */
+ globalCrudDemoTechStack: string
+ /**
+ * Add text here
+ */
+ addTextPlaceholder: string
+ }
+ Settings: {
+ /**
+ * Profile
+ */
+ profileTitle: string
+ /**
+ * Manage your account security and linked sign-in methods.
+ */
+ profileSubtitle: string
+ /**
+ * Your email is not verified
+ */
+ emailNotVerified: string
+ /**
+ * Please verify your email to access all features.
+ */
+ verifyEmailPrompt: string
+ /**
+ * Account Info
+ */
+ accountInfo: string
+ /**
+ * Linked Accounts
+ */
+ linkedAccounts: string
+ /**
+ * Google
+ */
+ google: string
+ /**
+ * Connected
+ */
+ connected: string
+ /**
+ * Connect Google
+ */
+ connectGoogle: string
+ /**
+ * Email & Password
+ */
+ emailAndPassword: string
+ /**
+ * Password set
+ */
+ passwordSet: string
+ /**
+ * Not set
+ */
+ notSet: string
+ /**
+ * Password
+ */
+ passwordTitle: string
+ /**
+ * Change Password
+ */
+ changePassword: string
+ /**
+ * Current Password
+ */
+ currentPassword: string
+ /**
+ * New Password (min 8 characters)
+ */
+ newPasswordLabel: string
+ /**
+ * Confirm New Password
+ */
+ confirmNewPassword: string
+ /**
+ * Save Password
+ */
+ savePassword: string
+ /**
+ * Add a password to sign in without Google or OTP.
+ */
+ addPasswordDescription: string
+ /**
+ * Check your inbox to set your password.
+ */
+ checkInboxForPassword: string
+ /**
+ * Manage Members
+ */
+ manageMembersTitle: string
+ /**
+ * Add or remove members from your tenants.
+ */
+ manageMembersSubtitle: string
+ /**
+ * No admin access
+ */
+ noAdminAccess: string
+ /**
+ * You don't have admin access to any tenants.
+ */
+ noAdminAccessMessage: string
+ /**
+ * Your tenants ({count})
+ * @param {number} count
+ */
+ yourTenants: RequiredParams<'count'>
+ /**
+ * Members of {name}
+ * @param {string} name
+ */
+ membersOf: RequiredParams<'name'>
+ /**
+ * Add member
+ */
+ addMember: string
+ /**
+ * user@example.com
+ */
+ memberEmailPlaceholder: string
+ /**
+ * Loading members...
+ */
+ loadingMembers: string
+ /**
+ * No members yet. Add one above.
+ */
+ noMembersYet: string
+ /**
+ * Remove member
+ */
+ removeMember: string
+ /**
+ * Select a tenant from the list to manage its members.
+ */
+ selectTenantPrompt: string
+ /**
+ * Edit Profile
+ */
+ editProfile: string
+ /**
+ * Edit Name
+ */
+ editName: string
+ /**
+ * Full Name
+ */
+ fullName: string
+ /**
+ * Your full name
+ */
+ fullNamePlaceholder: string
+ /**
+ * 2-100 characters. Letters, spaces, hyphens, and apostrophes only.
+ */
+ nameHint: string
+ /**
+ * Name updated successfully
+ */
+ nameUpdated: string
+ /**
+ * Failed to update name
+ */
+ failedUpdateName: string
+ /**
+ * Data & Privacy
+ */
+ dataAndPrivacy: string
+ /**
+ * You have the right to access, export, and delete your personal data at any time. Read our
+ */
+ dataPrivacyDescription: string
+ /**
+ * Privacy & Data Policy
+ */
+ privacyAndDataPolicy: string
+ /**
+ * Download My Data
+ */
+ downloadMyData: string
+ /**
+ * Export all your personal data as a JSON file
+ */
+ downloadMyDataDescription: string
+ /**
+ * Preparing export...
+ */
+ preparingExport: string
+ /**
+ * Downloaded
+ */
+ downloaded: string
+ /**
+ * Download
+ */
+ download: string
+ /**
+ * Delete Account
+ */
+ deleteAccount: string
+ /**
+ * Permanently delete your account and all associated data
+ */
+ deleteAccountDescription: string
+ /**
+ * This action is irreversible. Type your email address
+ */
+ deleteConfirmPrefix: string
+ /**
+ * to confirm.
+ */
+ deleteConfirmSuffix: string
+ /**
+ * Type your email to confirm
+ */
+ typeEmailToConfirm: string
+ /**
+ * Deleting...
+ */
+ deleting: string
+ /**
+ * Permanently Delete Account
+ */
+ permanentlyDeleteAccount: string
+ /**
+ * Failed to delete account
+ */
+ failedDeleteAccount: string
+ }
+ Forms: {
+ /**
+ * Email
+ */
+ email: string
+ /**
+ * Email Address
+ */
+ emailAddress: string
+ /**
+ * you@example.com
+ */
+ emailPlaceholder: string
+ /**
+ * Enter your email
+ */
+ enterYourEmail: string
+ /**
+ * Password
+ */
+ password: string
+ /**
+ * ••••••••
+ */
+ passwordPlaceholder: string
+ /**
+ * Password (min 8 characters)
+ */
+ passwordMinChars: string
+ /**
+ * Confirm Password
+ */
+ confirmPassword: string
+ /**
+ * First Name
+ */
+ firstName: string
+ /**
+ * John
+ */
+ firstNamePlaceholder: string
+ /**
+ * Last Name
+ */
+ lastName: string
+ /**
+ * Doe
+ */
+ lastNamePlaceholder: string
+ /**
+ * Name
+ */
+ name: string
+ /**
+ * Your name
+ */
+ namePlaceholder: string
+ /**
+ * Verification Code
+ */
+ verificationCode: string
+ /**
+ * Enter 6-digit code
+ */
+ verificationCodePlaceholder: string
+ /**
+ * Slug
+ */
+ slug: string
+ }
+ Errors: {
+ /**
+ * Failed to sign in with Google
+ */
+ failedSignInGoogle: string
+ /**
+ * Failed to send OTP. Please try again.
+ */
+ failedSendOtp: string
+ /**
+ * Unable to send OTP
+ */
+ unableToSendOtp: string
+ /**
+ * Invalid OTP. Please try again.
+ */
+ invalidOtp: string
+ /**
+ * Unable to verify OTP
+ */
+ unableToVerifyOtp: string
+ /**
+ * Please verify your email address before signing in.
+ */
+ verifyEmailBeforeSignIn: string
+ /**
+ * This account was created with Google or OTP. Use 'Forgot Password' below to set a password.
+ */
+ accountCreatedWithSocial: string
+ /**
+ * Invalid email or password.
+ */
+ invalidEmailOrPassword: string
+ /**
+ * Passwords do not match.
+ */
+ passwordsDoNotMatch: string
+ /**
+ * Password must be at least 8 characters.
+ */
+ passwordMinLength: string
+ /**
+ * Password must be at most 128 characters.
+ */
+ passwordMaxLength: string
+ /**
+ * Password must contain at least one uppercase letter.
+ */
+ passwordUppercase: string
+ /**
+ * Password must contain at least one lowercase letter.
+ */
+ passwordLowercase: string
+ /**
+ * Password must contain at least one number.
+ */
+ passwordNumber: string
+ /**
+ * Password must contain at least one special character.
+ */
+ passwordSpecialChar: string
+ /**
+ * Failed to reset password. Please try again.
+ */
+ failedResetPassword: string
+ /**
+ * Failed to change password.
+ */
+ failedChangePassword: string
+ /**
+ * Password changed successfully.
+ */
+ passwordChangedSuccess: string
+ /**
+ * Sign up failed. Please try again.
+ */
+ signUpFailed: string
+ /**
+ * Sign in failed
+ */
+ signInFailed: string
+ /**
+ * An account with this email already exists. Try signing in instead — if you used Google or OTP, you can set a password from your profile.
+ */
+ accountAlreadyExists: string
+ /**
+ * {label} is required.
+ * @param {string} label
+ */
+ nameRequired: RequiredParams<'label'>
+ /**
+ * {label} must be at least 2 characters.
+ * @param {string} label
+ */
+ nameMinLength: RequiredParams<'label'>
+ /**
+ * {label} can only contain letters, spaces, hyphens, and apostrophes.
+ * @param {string} label
+ */
+ nameInvalidChars: RequiredParams<'label'>
+ /**
+ * Email is required.
+ */
+ emailRequired: string
+ /**
+ * Please enter a valid email address.
+ */
+ emailInvalid: string
+ /**
+ * Password is required.
+ */
+ passwordRequired: string
+ /**
+ * Slug is required
+ */
+ slugRequired: string
+ /**
+ * Name is required
+ */
+ nameFieldRequired: string
+ /**
+ * Slug must be lowercase letters, numbers, and hyphens only
+ */
+ slugInvalid: string
+ /**
+ * No tenants assigned
+ */
+ noTenantsAssigned: string
+ /**
+ * You don't have access to any tenants yet. Please contact an administrator to get added to a tenant.
+ */
+ noTenantsMessage: string
+ /**
+ * Loading your tenants...
+ */
+ loadingYourTenants: string
+ /**
+ * Setting up your tenant...
+ */
+ settingUpTenant: string
+ }
+ Sidebar: {
+ /**
+ * Navigation
+ */
+ navigation: string
+ /**
+ * Main
+ */
+ sectionMain: string
+ /**
+ * Data
+ */
+ sectionData: string
+ /**
+ * Platform
+ */
+ sectionPlatform: string
+ /**
+ * Account
+ */
+ sectionAccount: string
+ /**
+ * Home
+ */
+ home: string
+ /**
+ * CRUD Demo
+ */
+ crudDemo: string
+ /**
+ * Global CRUD Demo
+ */
+ globalCrudDemo: string
+ /**
+ * Grids
+ */
+ grids: string
+ /**
+ * Charts
+ */
+ charts: string
+ /**
+ * Tenant Dashboard
+ */
+ tenantDashboard: string
+ /**
+ * Tenant Members
+ */
+ tenantMembers: string
+ /**
+ * Profile
+ */
+ profile: string
+ /**
+ * Crud Records
+ */
+ crudRecords: string
+ /**
+ * Global Crud Records
+ */
+ globalCrudRecords: string
+ /**
+ * Editable People (Demo)
+ */
+ editablePeople: string
+ /**
+ * Batch Ops (Demo)
+ */
+ batchOps: string
+ /**
+ * Tenants (Demo)
+ */
+ tenantsDemo: string
+ /**
+ * Metrics (Demo)
+ */
+ metricsDemo: string
+ /**
+ * Tasks (Demo)
+ */
+ tasksDemo: string
+ /**
+ * Overview Charts
+ */
+ overviewCharts: string
+ /**
+ * Time Series
+ */
+ timeSeries: string
+ /**
+ * Distribution Charts
+ */
+ distributionCharts: string
+ /**
+ * Comparative Charts
+ */
+ comparativeCharts: string
+ /**
+ * 3D & Advanced
+ */
+ threeDAdvanced: string
+ }
+ Grids: {
+ /**
+ * Data Grids
+ */
+ title: string
+ /**
+ * Grid scenarios powered by TanStack Table v8. Grids marked
+ */
+ descriptionPrefix: string
+ /**
+ * Demo
+ */
+ demo: string
+ /**
+ * use illustrative dummy data. Grids marked
+ */
+ descriptionMiddle: string
+ /**
+ * Live
+ */
+ live: string
+ /**
+ * fetch real data from the API.
+ */
+ descriptionSuffix: string
+ /**
+ * Crud Records
+ */
+ tabCrudRecords: string
+ /**
+ * Global Crud Records
+ */
+ tabGlobalCrudRecords: string
+ /**
+ * Editable People (Demo)
+ */
+ tabEditablePeople: string
+ /**
+ * Batch Operations (Demo)
+ */
+ tabBatchOps: string
+ /**
+ * Tenants (Demo)
+ */
+ tabTenants: string
+ /**
+ * Metrics (Demo)
+ */
+ tabMetrics: string
+ /**
+ * Tasks (Demo)
+ */
+ tabTasks: string
+ /**
+ * Live read-only view of Crud records fetched from the API (Prisma). Reflects actual database state.
+ */
+ descCrudLive: string
+ /**
+ * Live read-only view of Global Crud records fetched from the API (Prisma). No tenant scoping.
+ */
+ descGlobalCrudLive: string
+ /**
+ * Demo: Editable grid with in-memory data modeled after the Crud entity shape.
+ */
+ descCrud: string
+ /**
+ * Demo: Bulk operations with row selection, multi-sort, and batch actions on in-memory data.
+ */
+ descGlobalCrud: string
+ /**
+ * Demo: Tenant management view grouped by plan tier with expandable sub-rows.
+ */
+ descTenants: string
+ /**
+ * Demo: Read-only analytics metrics. Illustrative dummy data, not from a live API.
+ */
+ descReadOnly: string
+ /**
+ * Demo: Rich cell renderers with tags, avatars, priority icons, and expandable details.
+ */
+ descAdvanced: string
+ /**
+ * ID
+ */
+ colId: string
+ /**
+ * Content
+ */
+ colContent: string
+ /**
+ * Created At
+ */
+ colCreatedAt: string
+ /**
+ * Updated At
+ */
+ colUpdatedAt: string
+ /**
+ * First Name
+ */
+ colFirstName: string
+ /**
+ * Last Name
+ */
+ colLastName: string
+ /**
+ * Email
+ */
+ colEmail: string
+ /**
+ * Role
+ */
+ colRole: string
+ /**
+ * Status
+ */
+ colStatus: string
+ /**
+ * Created
+ */
+ colCreated: string
+ /**
+ * Tenant Name
+ */
+ colTenantName: string
+ /**
+ * Plan
+ */
+ colPlan: string
+ /**
+ * Users
+ */
+ colUsers: string
+ /**
+ * Storage
+ */
+ colStorage: string
+ /**
+ * Region
+ */
+ colRegion: string
+ /**
+ * Metric
+ */
+ colMetric: string
+ /**
+ * Value
+ */
+ colValue: string
+ /**
+ * Change
+ */
+ colChange: string
+ /**
+ * Period
+ */
+ colPeriod: string
+ /**
+ * Category
+ */
+ colCategory: string
+ /**
+ * Task
+ */
+ colTask: string
+ /**
+ * Tags
+ */
+ colTags: string
+ /**
+ * Assigned To
+ */
+ colAssignedTo: string
+ /**
+ * Priority
+ */
+ colPriority: string
+ /**
+ * Due Date
+ */
+ colDueDate: string
+ /**
+ * Completed
+ */
+ colCompleted: string
+ /**
+ * Admin
+ */
+ roleAdmin: string
+ /**
+ * User
+ */
+ roleUser: string
+ /**
+ * Editor
+ */
+ roleEditor: string
+ /**
+ * Viewer
+ */
+ roleViewer: string
+ /**
+ * Active
+ */
+ statusActive: string
+ /**
+ * Inactive
+ */
+ statusInactive: string
+ /**
+ * Suspended
+ */
+ statusSuspended: string
+ /**
+ * Trial
+ */
+ statusTrial: string
+ /**
+ * Free
+ */
+ planFree: string
+ /**
+ * Pro
+ */
+ planPro: string
+ /**
+ * Enterprise
+ */
+ planEnterprise: string
+ /**
+ * Live — Prisma
+ */
+ livePrisma: string
+ /**
+ * {count} record{{s|}}
+ * @param {number} count
+ */
+ recordCount: RequiredParams<'count'>
+ /**
+ * Loading Crud records…
+ */
+ loadingCrudRecords: string
+ /**
+ * Loading Global Crud records…
+ */
+ loadingGlobalCrudRecords: string
+ /**
+ * Failed to load: {message}
+ * @param {string} message
+ */
+ failedToLoad: RequiredParams<'message'>
+ /**
+ * Demo — in-memory data
+ */
+ demoInMemory: string
+ /**
+ * Demo — dummy data
+ */
+ demoDummyData: string
+ /**
+ * Demo — dummy data ({count} records)
+ * @param {number} count
+ */
+ demoDummyDataCount: RequiredParams<'count'>
+ /**
+ * Unsaved changes
+ */
+ unsavedChanges: string
+ /**
+ * Add Row
+ */
+ addRow: string
+ /**
+ * {count} selected
+ * @param {number} count
+ */
+ selectedCount: RequiredParams<'count'>
+ /**
+ * Delete Selected
+ */
+ deleteSelected: string
+ /**
+ * Export
+ */
+ 'export': string
+ /**
+ * Change Status
+ */
+ changeStatus: string
+ /**
+ * Users in {name}
+ * @param {string} name
+ */
+ usersIn: RequiredParams<'name'>
+ /**
+ * User {n}
+ * @param {number} n
+ */
+ userN: RequiredParams<'n'>
+ /**
+ * +{count} more
+ * @param {number} count
+ */
+ moreUsers: RequiredParams<'count'>
+ /**
+ * Done
+ */
+ done: string
+ /**
+ * Open
+ */
+ open: string
+ /**
+ * Assigned to {name}
+ * @param {string} name
+ */
+ assignedToLabel: RequiredParams<'name'>
+ /**
+ * Priority: {value}
+ * @param {string} value
+ */
+ priorityLabel: RequiredParams<'value'>
+ /**
+ * Due: {date}
+ * @param {string} date
+ */
+ dueLabel: RequiredParams<'date'>
+ /**
+ * OVERDUE
+ */
+ overdue: string
+ }
+ Charts: {
+ /**
+ * Charts & Visualizations
+ */
+ title: string
+ /**
+ * 12+ chart types powered by Plotly.js with WebGL support. All charts are interactive — zoom, pan, and hover for details.
+ */
+ description: string
+ /**
+ * Line & Area
+ */
+ navLineArea: string
+ /**
+ * Bar & Column
+ */
+ navBarColumn: string
+ /**
+ * Pie, Donut & Sunburst
+ */
+ navPieDonut: string
+ /**
+ * Scatter & Bubble
+ */
+ navScatterBubble: string
+ /**
+ * Statistical
+ */
+ navStatistical: string
+ /**
+ * Heatmap & Timeline
+ */
+ navHeatmapTimeline: string
+ /**
+ * 3D Charts
+ */
+ nav3dCharts: string
+ /**
+ * Mixed / Combo
+ */
+ navMixedCombo: string
+ /**
+ * Plotly Table
+ */
+ navPlotlyTable: string
+ /**
+ * Line & Area Charts
+ */
+ lineAreaCharts: string
+ /**
+ * Bar & Column Charts
+ */
+ barColumnCharts: string
+ /**
+ * Pie, Donut & Sunburst
+ */
+ pieDonutSunburst: string
+ /**
+ * Scatter & Bubble Charts
+ */
+ scatterBubbleCharts: string
+ /**
+ * Statistical Charts
+ */
+ statisticalCharts: string
+ /**
+ * Heatmap & Timeline
+ */
+ heatmapTimeline: string
+ /**
+ * 3D Charts (WebGL)
+ */
+ threeDChartsWebGL: string
+ /**
+ * Mixed / Combo Charts
+ */
+ mixedComboCharts: string
+ /**
+ * Plotly Table
+ */
+ plotlyTable: string
+ /**
+ * User Growth Over Time
+ */
+ userGrowthTitle: string
+ /**
+ * 24-month trend of new, active, and churned users.
+ */
+ userGrowthDesc: string
+ /**
+ * New Users
+ */
+ newUsers: string
+ /**
+ * Active Users
+ */
+ activeUsers: string
+ /**
+ * Churned Users
+ */
+ churnedUsers: string
+ /**
+ * Revenue Breakdown by Category
+ */
+ revenueBreakdownTitle: string
+ /**
+ * Stacked area showing subscription, add-on, service, and overage revenue.
+ */
+ revenueBreakdownDesc: string
+ /**
+ * Subscriptions
+ */
+ subscriptions: string
+ /**
+ * Add-ons
+ */
+ addOns: string
+ /**
+ * Services
+ */
+ services: string
+ /**
+ * Overages
+ */
+ overages: string
+ /**
+ * Monthly Active Users by Region
+ */
+ mauByRegionTitle: string
+ /**
+ * Grouped bar chart comparing four regions over 12 months.
+ */
+ mauByRegionDesc: string
+ /**
+ * US-East
+ */
+ usEast: string
+ /**
+ * EU-West
+ */
+ euWest: string
+ /**
+ * APAC
+ */
+ apac: string
+ /**
+ * US-West
+ */
+ usWest: string
+ /**
+ * Feature Usage by Tenant Plan
+ */
+ featureUsageTitle: string
+ /**
+ * Horizontal stacked bar showing feature adoption across plan tiers.
+ */
+ featureUsageDesc: string
+ /**
+ * Auth
+ */
+ auth: string
+ /**
+ * CRUD
+ */
+ crud: string
+ /**
+ * Analytics
+ */
+ analytics: string
+ /**
+ * API
+ */
+ api: string
+ /**
+ * Multi-Tenant
+ */
+ multiTenant: string
+ /**
+ * Tenant Plan Distribution
+ */
+ tenantPlanDistTitle: string
+ /**
+ * Donut chart showing the breakdown of tenants by plan tier.
+ */
+ tenantPlanDistDesc: string
+ /**
+ * User Role Hierarchy
+ */
+ roleHierarchyTitle: string
+ /**
+ * Sunburst chart showing organizational structure: Org > Department > Role.
+ */
+ roleHierarchyDesc: string
+ /**
+ * Session Duration vs. Actions Taken
+ */
+ sessionScatterTitle: string
+ /**
+ * Color-encoded by user tier. Hover for details.
+ */
+ sessionScatterDesc: string
+ /**
+ * Free
+ */
+ free: string
+ /**
+ * Pro
+ */
+ pro: string
+ /**
+ * Enterprise
+ */
+ enterprise: string
+ /**
+ * Duration (min)
+ */
+ durationMin: string
+ /**
+ * Actions
+ */
+ actions: string
+ /**
+ * Tenant Size vs. Storage Used
+ */
+ tenantBubbleTitle: string
+ /**
+ * Bubble size represents monthly revenue.
+ */
+ tenantBubbleDesc: string
+ /**
+ * Revenue ($)
+ */
+ revenueUsd: string
+ /**
+ * User Count
+ */
+ userCount: string
+ /**
+ * Storage (GB)
+ */
+ storageGb: string
+ /**
+ * Response Time Distribution by Service
+ */
+ responseTimeTitle: string
+ /**
+ * Box plot showing latency spread across five API services.
+ */
+ responseTimeDesc: string
+ /**
+ * Response Time (ms)
+ */
+ responseTimeMs: string
+ /**
+ * User Session Length Distribution
+ */
+ sessionLengthTitle: string
+ /**
+ * Histogram binned by minute intervals.
+ */
+ sessionLengthDesc: string
+ /**
+ * Session Length (min)
+ */
+ sessionLengthMin: string
+ /**
+ * Count
+ */
+ count: string
+ /**
+ * Activity by Hour and Day of Week
+ */
+ activityHeatmapTitle: string
+ /**
+ * 7x24 heatmap showing event density. Viridis colorscale.
+ */
+ activityHeatmapDesc: string
+ /**
+ * Tenant Onboarding Timeline
+ */
+ ganttTitle: string
+ /**
+ * Gantt-style horizontal bar showing onboarding start and end dates.
+ */
+ ganttDesc: string
+ /**
+ * 3D User Engagement Clustering
+ */
+ engagement3dTitle: string
+ /**
+ * WebGL-rendered 3D scatter: sessions x avg duration x revenue, colored by cluster tier.
+ */
+ engagement3dDesc: string
+ /**
+ * Low
+ */
+ low: string
+ /**
+ * Medium
+ */
+ medium: string
+ /**
+ * High
+ */
+ high: string
+ /**
+ * Sessions
+ */
+ sessions: string
+ /**
+ * Avg Duration
+ */
+ avgDuration: string
+ /**
+ * Revenue Surface: Time x Region
+ */
+ surfaceTitle: string
+ /**
+ * Full 3D rotation — drag to explore. Portland colorscale.
+ */
+ surfaceDesc: string
+ /**
+ * Month
+ */
+ month: string
+ /**
+ * Region
+ */
+ region: string
+ /**
+ * Revenue ($K)
+ */
+ revenueK: string
+ /**
+ * Revenue vs. User Growth
+ */
+ comboTitle: string
+ /**
+ * Bar chart (revenue) with line overlay (user count) on secondary y-axis.
+ */
+ comboDesc: string
+ /**
+ * MRR Movement This Quarter
+ */
+ waterfallTitle: string
+ /**
+ * Waterfall chart showing new business, expansion, churn, and net MRR.
+ */
+ waterfallDesc: string
+ /**
+ * MRR ($)
+ */
+ mrrUsd: string
+ /**
+ * Top 10 Tenants — Plotly Table Trace
+ */
+ plotlyTableTitle: string
+ /**
+ * This is a Plotly trace, not TanStack Table — compare the two on the Grids page.
+ */
+ plotlyTableDesc: string
+ }
+ CookieBanner: {
+ /**
+ * This site uses essential cookies to keep you signed in. No tracking or advertising cookies.
+ */
+ text: string
+ /**
+ * Learn more
+ */
+ learnMore: string
+ /**
+ * Got it
+ */
+ gotIt: string
+ }
+ Privacy: {
+ /**
+ * Privacy & Data Policy
+ */
+ title: string
+ /**
+ * Last updated: February 20, 2026
+ */
+ lastUpdated: string
+ /**
+ * 1. What data we collect
+ */
+ section1Title: string
+ /**
+ * When you create an account we store:
+ */
+ section1Intro: string
+ /**
+ * Name and email
+ */
+ collectName: string
+ /**
+ * — provided by you or your Google account.
+ */
+ collectNameDetail: string
+ /**
+ * Profile picture URL
+ */
+ collectImage: string
+ /**
+ * — from Google if you sign in with Google.
+ */
+ collectImageDetail: string
+ /**
+ * Password
+ */
+ collectPassword: string
+ /**
+ * — if you use email/password sign-in. Stored encrypted; we never see or store it in plain text.
+ */
+ collectPasswordDetail: string
+ /**
+ * OAuth tokens
+ */
+ collectOAuth: string
+ /**
+ * — if you sign in with Google. Stored encrypted. Used to maintain your Google session and access Google Drive on your behalf if you granted those permissions.
+ */
+ collectOAuthDetail: string
+ /**
+ * IP address and user agent
+ */
+ collectIp: string
+ /**
+ * — recorded per session for security and audit purposes.
+ */
+ collectIpDetail: string
+ /**
+ * Consent timestamp and IP
+ */
+ collectConsent: string
+ /**
+ * — recorded when you agree to this policy.
+ */
+ collectConsentDetail: string
+ /**
+ * 2. How we use your data
+ */
+ section2Title: string
+ /**
+ * Authentication
+ */
+ useAuth: string
+ /**
+ * — to sign you in, verify your email, and manage your sessions.
+ */
+ useAuthDetail: string
+ /**
+ * Account management
+ */
+ useAccount: string
+ /**
+ * — to display your profile and let you update or delete it.
+ */
+ useAccountDetail: string
+ /**
+ * Transactional emails
+ */
+ useEmail: string
+ /**
+ * — to send OTPs, verification links, and password reset links. We never send marketing email.
+ */
+ useEmailDetail: string
+ /**
+ * Security
+ */
+ useSecurity: string
+ /**
+ * — to detect suspicious activity and maintain audit logs.
+ */
+ useSecurityDetail: string
+ /**
+ * Google Drive
+ */
+ useDrive: string
+ /**
+ * — if you granted Drive scopes, to read or create files in your Drive on your behalf. We do not access Drive without your explicit scope grant.
+ */
+ useDriveDetail: string
+ /**
+ * We do not sell, share, or rent your personal data to third parties. We do not use your data for advertising or profiling.
+ */
+ noSellData: string
+ /**
+ * 3. Cookies
+ */
+ section3Title: string
+ /**
+ * We use
+ */
+ cookiesIntro: string
+ /**
+ * strictly necessary cookies only
+ */
+ cookiesIntroStrict: string
+ /**
+ * . No analytics, advertising, or tracking cookies.
+ */
+ cookiesIntroSuffix: string
+ /**
+ * Cookie
+ */
+ cookieHeader: string
+ /**
+ * Purpose
+ */
+ purposeHeader: string
+ /**
+ * Expiry
+ */
+ expiryHeader: string
+ /**
+ * Session Token
+ */
+ cookieSessionToken: string
+ /**
+ * Keeps you signed in across visits
+ */
+ cookieSessionPurpose: string
+ /**
+ * 7 days
+ */
+ cookieSessionExpiry: string
+ /**
+ * OAuth State
+ */
+ cookieOAuthState: string
+ /**
+ * Temporary token to secure the Google sign-in flow
+ */
+ cookieOAuthPurpose: string
+ /**
+ * 3 days
+ */
+ cookieOAuthExpiry: string
+ /**
+ * These cookies are required for the application to function. They cannot be used to track you across other websites.
+ */
+ cookiesFootnote: string
+ /**
+ * 4. Third-party services
+ */
+ section4Title: string
+ /**
+ * Google (OAuth)
+ */
+ thirdPartyGoogle: string
+ /**
+ * — for sign-in and Drive access. Subject to
+ */
+ thirdPartyGoogleDetail: string
+ /**
+ * Google's Privacy Policy
+ */
+ googlePrivacyPolicy: string
+ /**
+ * Amazon Web Services (SES)
+ */
+ thirdPartyAws: string
+ /**
+ * — to deliver transactional emails. AWS processes recipient email addresses solely for delivery.
+ */
+ thirdPartyAwsDetail: string
+ /**
+ * Rollbar
+ */
+ thirdPartyRollbar: string
+ /**
+ * — for error monitoring. Receives error messages and stack traces only; no user PII is intentionally sent.
+ */
+ thirdPartyRollbarDetail: string
+ /**
+ * 5. How we protect your data
+ */
+ section5Title: string
+ /**
+ * Passwords are stored encrypted and can never be read back.
+ */
+ protectPassword: string
+ /**
+ * OAuth tokens are encrypted at rest on our servers.
+ */
+ protectOAuth: string
+ /**
+ * Session cookies are secured and signed.
+ */
+ protectCookies: string
+ /**
+ * Email addresses are not stored in application logs.
+ */
+ protectLogs: string
+ /**
+ * All communication is over HTTPS in production.
+ */
+ protectHttps: string
+ /**
+ * 6. Your rights
+ */
+ section6Title: string
+ /**
+ * From your profile page you can:
+ */
+ rightsIntro: string
+ /**
+ * Access
+ */
+ rightAccess: string
+ /**
+ * — download all personal data we hold about you as a JSON file.
+ */
+ rightAccessDetail: string
+ /**
+ * Rectify
+ */
+ rightRectify: string
+ /**
+ * — update your name and profile picture.
+ */
+ rightRectifyDetail: string
+ /**
+ * Delete
+ */
+ rightDelete: string
+ /**
+ * — permanently delete your account and all associated data (sessions, OAuth tokens, tenant memberships, verification tokens). This action is irreversible.
+ */
+ rightDeleteDetail: string
+ /**
+ * Withdraw consent
+ */
+ rightWithdraw: string
+ /**
+ * — by deleting your account.
+ */
+ rightWithdrawDetail: string
+ /**
+ * All data subject actions are recorded in an internal audit log.
+ */
+ rightsAuditNote: string
+ /**
+ * 7. Data retention
+ */
+ section7Title: string
+ /**
+ * Account data is kept for as long as your account exists.
+ */
+ retainAccount: string
+ /**
+ * Sessions expire after 7 days.
+ */
+ retainSessions: string
+ /**
+ * Verification tokens (email, OTP, password reset) are automatically purged after expiry.
+ */
+ retainVerification: string
+ /**
+ * When you delete your account, all personal data is permanently removed. GDPR audit log entries (which contain only your user ID and action type) are retained for legal accountability.
+ */
+ retainDeletion: string
+ /**
+ * 8. Contact
+ */
+ section8Title: string
+ /**
+ * For privacy-related questions or requests, email us at
+ */
+ contactText: string
+ }
+}
export type TranslationFunctions = {
- Common: {
- /**
- * Loading...
- */
- loading: () => LocalizedString;
- /**
- * Back to Home
- */
- backToHome: () => LocalizedString;
- /**
- * Back
- */
- back: () => LocalizedString;
- /**
- * Cancel
- */
- cancel: () => LocalizedString;
- /**
- * Save
- */
- save: () => LocalizedString;
- /**
- * Add
- */
- add: () => LocalizedString;
- /**
- * Refresh
- */
- refresh: () => LocalizedString;
- /**
- * Refreshing...
- */
- refreshing: () => LocalizedString;
- /**
- * Adding...
- */
- adding: () => LocalizedString;
- /**
- * Saving...
- */
- saving: () => LocalizedString;
- /**
- * Sending...
- */
- sending: () => LocalizedString;
- /**
- * Or
- */
- or: () => LocalizedString;
- /**
- * Admin
- */
- roleAdmin: () => LocalizedString;
- /**
- * User
- */
- roleUser: () => LocalizedString;
- /**
- * You
- */
- you: () => LocalizedString;
- /**
- * Edit
- */
- edit: () => LocalizedString;
- /**
- * Delete
- */
- delete: () => LocalizedString;
- /**
- * Loading items...
- */
- loadingItems: () => LocalizedString;
- /**
- * No items yet. Add one to get started!
- */
- noItemsYet: () => LocalizedString;
- /**
- * {count} {{Item|Items}}
- */
- itemCount: (arg: { count: number }) => LocalizedString;
- /**
- * {count} {{Item|Items}} (global)
- */
- itemCountGlobal: (arg: { count: number }) => LocalizedString;
- };
- Navigation: {
- /**
- * Full Stack
- */
- fullStack: () => LocalizedString;
- /**
- * Profile & Security
- */
- profileAndSecurity: () => LocalizedString;
- /**
- * Platform Tenants
- */
- platformTenants: () => LocalizedString;
- /**
- * Manage Members
- */
- manageMembers: () => LocalizedString;
- /**
- * Sign out
- */
- signOut: () => LocalizedString;
- /**
- * Switch tenant
- */
- switchTenant: () => LocalizedString;
- /**
- * Switching...
- */
- switching: () => LocalizedString;
- /**
- * Select tenant
- */
- selectTenant: () => LocalizedString;
- };
- Home: {
- /**
- * Full Stack Boilerplate
- */
- title: () => LocalizedString;
- /**
- * NextJs (Tailwind CSS), NestJs, Expo, tRPC, Better Auth
- */
- subtitle: () => LocalizedString;
- /**
- * CRUD Demo
- */
- crudDemoTitle: () => LocalizedString;
- /**
- * Test Create, Read, Update, Delete operations with tRPC and Prisma integration. Full-stack type safety demonstration.
- */
- crudDemoDescription: () => LocalizedString;
- /**
- * Global CRUD Demo
- */
- globalCrudDemoTitle: () => LocalizedString;
- /**
- * Same as CRUD but shared across all tenants. Everyone sees and edits the same data.
- */
- globalCrudDemoDescription: () => LocalizedString;
- /**
- * Platform Tenants
- */
- platformTenantsTitle: () => LocalizedString;
- /**
- * Create, edit, and remove tenants across the platform. Super-admin only.
- */
- platformTenantsDescription: () => LocalizedString;
- /**
- * Manage tenants
- */
- manageTenants: () => LocalizedString;
- /**
- * Manage Members
- */
- manageMembersTitle: () => LocalizedString;
- /**
- * Add or remove members from tenants you administer.
- */
- manageMembersDescription: () => LocalizedString;
- /**
- * Manage members
- */
- manageMembers: () => LocalizedString;
- /**
- * Auth Demo
- */
- authDemoTitle: () => LocalizedString;
- /**
- * Test authentication with Better Auth. OAuth integration with Google, session management, and protected routes.
- */
- authDemoDescription: () => LocalizedString;
- /**
- * Try it out
- */
- tryItOut: () => LocalizedString;
- /**
- * Built with modern tools for rapid development
- */
- footer: () => LocalizedString;
- };
- Auth: {
- /**
- * Sign in
- */
- signIn: () => LocalizedString;
- /**
- * Sign in
- */
- signInTitle: () => LocalizedString;
- /**
- * Choose your preferred sign-in method
- */
- signInSubtitle: () => LocalizedString;
- /**
- * Sign in with Google
- */
- signInWithGoogle: () => LocalizedString;
- /**
- * Sign in with Email OTP
- */
- signInWithEmailOtp: () => LocalizedString;
- /**
- * Or with Email & Password
- */
- orWithEmailPassword: () => LocalizedString;
- /**
- * Sign in with Email & Password
- */
- signInWithEmailPassword: () => LocalizedString;
- /**
- * Signing in...
- */
- signingIn: () => LocalizedString;
- /**
- * Sign up
- */
- signUp: () => LocalizedString;
- /**
- * Create an account
- */
- signUpTitle: () => LocalizedString;
- /**
- * Sign up with your email and password
- */
- signUpSubtitle: () => LocalizedString;
- /**
- * Sign up with Email & Password
- */
- signUpWithEmailPassword: () => LocalizedString;
- /**
- * Creating account...
- */
- creatingAccount: () => LocalizedString;
- /**
- * Don't have an account?
- */
- dontHaveAccount: () => LocalizedString;
- /**
- * Already have an account?
- */
- alreadyHaveAccount: () => LocalizedString;
- /**
- * Forgot Password?
- */
- forgotPassword: () => LocalizedString;
- /**
- * Forgot Password
- */
- forgotPasswordTitle: () => LocalizedString;
- /**
- * Enter your email to receive a password reset link
- */
- forgotPasswordSubtitle: () => LocalizedString;
- /**
- * Check your inbox
- */
- checkYourInbox: () => LocalizedString;
- /**
- * Send Reset Link
- */
- sendResetLink: () => LocalizedString;
- /**
- * Back to Sign In
- */
- backToSignIn: () => LocalizedString;
- /**
- * If an account exists with this email, you'll receive a link to set your password.
- */
- resetLinkSentMessage: () => LocalizedString;
- /**
- * Set Your Password
- */
- setYourPassword: () => LocalizedString;
- /**
- * Enter a new password for your account
- */
- setPasswordSubtitle: () => LocalizedString;
- /**
- * Set Password
- */
- setPassword: () => LocalizedString;
- /**
- * Setting password...
- */
- settingPassword: () => LocalizedString;
- /**
- * Invalid or Expired Link
- */
- invalidOrExpiredLink: () => LocalizedString;
- /**
- * This password reset link is invalid or has expired. Please request a new one.
- */
- invalidOrExpiredLinkMessage: () => LocalizedString;
- /**
- * Request New Link
- */
- requestNewLink: () => LocalizedString;
- /**
- * Verification Failed
- */
- verificationFailed: () => LocalizedString;
- /**
- * This verification link has expired. Please try signing in again to receive a new verification email.
- */
- verificationFailedExpired: () => LocalizedString;
- /**
- * This verification link is invalid. Please try signing in again to receive a new verification email.
- */
- verificationFailedInvalid: () => LocalizedString;
- /**
- * Email Verified!
- */
- emailVerified: () => LocalizedString;
- /**
- * Your email has been verified successfully. Redirecting to home...
- */
- emailVerifiedMessage: () => LocalizedString;
- /**
- * Go to Home now
- */
- goToHome: () => LocalizedString;
- /**
- * Go to Sign In
- */
- goToSignIn: () => LocalizedString;
- /**
- * Send OTP
- */
- sendOtp: () => LocalizedString;
- /**
- * Verify OTP
- */
- verifyOtp: () => LocalizedString;
- /**
- * Verifying...
- */
- verifying: () => LocalizedString;
- /**
- * Change Email
- */
- changeEmail: () => LocalizedString;
- /**
- * We sent a verification code to {email}
- */
- otpSentTo: (arg: { email: string }) => LocalizedString;
- /**
- * We've sent a verification email to {email}. Please check your inbox and click the link to verify your account before signing in.
- */
- checkInboxMessage: (arg: { email: string }) => LocalizedString;
- /**
- * Password set successfully. You can now sign in.
- */
- passwordSetSuccess: () => LocalizedString;
- /**
- * Sign in required
- */
- signInRequired: () => LocalizedString;
- /**
- * You need to be authenticated to access this application.
- */
- signInRequiredMessage: () => LocalizedString;
- /**
- * Better Auth Demo
- */
- betterAuthDemo: () => LocalizedString;
- /**
- * Welcome back!
- */
- welcomeBack: () => LocalizedString;
- /**
- * Sign in to continue
- */
- signInToContinue: () => LocalizedString;
- /**
- * You are signed in
- */
- youAreSignedIn: () => LocalizedString;
- /**
- * User Information
- */
- userInformation: () => LocalizedString;
- /**
- * Sign Out
- */
- signOutButton: () => LocalizedString;
- /**
- * Or Email & Password
- */
- orEmailPassword: () => LocalizedString;
- /**
- * Resend verification email
- */
- resendVerificationEmail: () => LocalizedString;
- /**
- * Verification email sent! Check your inbox.
- */
- verificationEmailSent: () => LocalizedString;
- /**
- * Min 8 characters with uppercase, lowercase, number, and special character.
- */
- passwordMinChars: () => LocalizedString;
- };
- Dashboard: {
- /**
- * Platform Tenants
- */
- platformTenantsTitle: () => LocalizedString;
- /**
- * Create, edit, and remove tenants. Super-admin only.
- */
- platformTenantsSubtitle: () => LocalizedString;
- /**
- * You must be logged in to access this page.
- */
- mustBeLoggedIn: () => LocalizedString;
- /**
- * Super-admin access required. Your email must be in SUPER_ADMIN_EMAILS.
- */
- superAdminRequired: () => LocalizedString;
- /**
- * Add tenant
- */
- addTenant: () => LocalizedString;
- /**
- * Slug (a-z, 0-9, hyphens)
- */
- slugLabel: () => LocalizedString;
- /**
- * e.g. acme-corp
- */
- slugPlaceholder: () => LocalizedString;
- /**
- * e.g. Acme Corp
- */
- namePlaceholder: () => LocalizedString;
- /**
- * {count} tenant{{s|}}
- */
- tenantCount: (arg: { count: number }) => LocalizedString;
- /**
- * Loading tenants...
- */
- loadingTenants: () => LocalizedString;
- /**
- * No tenants yet. Add one above.
- */
- noTenantsYet: () => LocalizedString;
- /**
- * Refresh list
- */
- refreshList: () => LocalizedString;
- /**
- * Delete tenant "{slug}"? This cannot be undone.
- */
- deleteConfirm: (arg: { slug: string }) => LocalizedString;
- /**
- * Dual Database CRUD Demo
- */
- dualDatabaseCrudDemo: () => LocalizedString;
- /**
- * Side-by-side comparison of Mongoose (MongoDB) and Prisma (PostgreSQL)
- */
- crudDemoSubtitle: () => LocalizedString;
- /**
- * NextJs (TailwindCSS) • NestJs • tRPC • Transactions
- */
- crudDemoTechStack: () => LocalizedString;
- /**
- * → Tenant Dashboard (super-admin)
- */
- tenantDashboardLink: () => LocalizedString;
- /**
- * Global CRUD Demo
- */
- globalCrudDemoTitle: () => LocalizedString;
- /**
- * Same as CRUD but shared across all tenants. Everyone sees and edits the same data.
- */
- globalCrudDemoSubtitle: () => LocalizedString;
- /**
- * Mongoose (MongoDB) & Prisma (PostgreSQL) • No tenant scope
- */
- globalCrudDemoTechStack: () => LocalizedString;
- /**
- * Add text here
- */
- addTextPlaceholder: () => LocalizedString;
- };
- Settings: {
- /**
- * Profile
- */
- profileTitle: () => LocalizedString;
- /**
- * Manage your account security and linked sign-in methods.
- */
- profileSubtitle: () => LocalizedString;
- /**
- * Your email is not verified
- */
- emailNotVerified: () => LocalizedString;
- /**
- * Please verify your email to access all features.
- */
- verifyEmailPrompt: () => LocalizedString;
- /**
- * Account Info
- */
- accountInfo: () => LocalizedString;
- /**
- * Linked Accounts
- */
- linkedAccounts: () => LocalizedString;
- /**
- * Google
- */
- google: () => LocalizedString;
- /**
- * Connected
- */
- connected: () => LocalizedString;
- /**
- * Connect Google
- */
- connectGoogle: () => LocalizedString;
- /**
- * Email & Password
- */
- emailAndPassword: () => LocalizedString;
- /**
- * Password set
- */
- passwordSet: () => LocalizedString;
- /**
- * Not set
- */
- notSet: () => LocalizedString;
- /**
- * Password
- */
- passwordTitle: () => LocalizedString;
- /**
- * Change Password
- */
- changePassword: () => LocalizedString;
- /**
- * Current Password
- */
- currentPassword: () => LocalizedString;
- /**
- * New Password (min 8 characters)
- */
- newPasswordLabel: () => LocalizedString;
- /**
- * Confirm New Password
- */
- confirmNewPassword: () => LocalizedString;
- /**
- * Save Password
- */
- savePassword: () => LocalizedString;
- /**
- * Add a password to sign in without Google or OTP.
- */
- addPasswordDescription: () => LocalizedString;
- /**
- * Check your inbox to set your password.
- */
- checkInboxForPassword: () => LocalizedString;
- /**
- * Manage Members
- */
- manageMembersTitle: () => LocalizedString;
- /**
- * Add or remove members from your tenants.
- */
- manageMembersSubtitle: () => LocalizedString;
- /**
- * No admin access
- */
- noAdminAccess: () => LocalizedString;
- /**
- * You don't have admin access to any tenants.
- */
- noAdminAccessMessage: () => LocalizedString;
- /**
- * Your tenants ({count})
- */
- yourTenants: (arg: { count: number }) => LocalizedString;
- /**
- * Members of {name}
- */
- membersOf: (arg: { name: string }) => LocalizedString;
- /**
- * Add member
- */
- addMember: () => LocalizedString;
- /**
- * user@example.com
- */
- memberEmailPlaceholder: () => LocalizedString;
- /**
- * Loading members...
- */
- loadingMembers: () => LocalizedString;
- /**
- * No members yet. Add one above.
- */
- noMembersYet: () => LocalizedString;
- /**
- * Remove member
- */
- removeMember: () => LocalizedString;
- /**
- * Select a tenant from the list to manage its members.
- */
- selectTenantPrompt: () => LocalizedString;
- };
- Forms: {
- /**
- * Email
- */
- email: () => LocalizedString;
- /**
- * Email Address
- */
- emailAddress: () => LocalizedString;
- /**
- * you@example.com
- */
- emailPlaceholder: () => LocalizedString;
- /**
- * Enter your email
- */
- enterYourEmail: () => LocalizedString;
- /**
- * Password
- */
- password: () => LocalizedString;
- /**
- * ••••••••
- */
- passwordPlaceholder: () => LocalizedString;
- /**
- * Password (min 8 characters)
- */
- passwordMinChars: () => LocalizedString;
- /**
- * Confirm Password
- */
- confirmPassword: () => LocalizedString;
- /**
- * First Name
- */
- firstName: () => LocalizedString;
- /**
- * John
- */
- firstNamePlaceholder: () => LocalizedString;
- /**
- * Last Name
- */
- lastName: () => LocalizedString;
- /**
- * Doe
- */
- lastNamePlaceholder: () => LocalizedString;
- /**
- * Name
- */
- name: () => LocalizedString;
- /**
- * Your name
- */
- namePlaceholder: () => LocalizedString;
- /**
- * Verification Code
- */
- verificationCode: () => LocalizedString;
- /**
- * Enter 6-digit code
- */
- verificationCodePlaceholder: () => LocalizedString;
- /**
- * Slug
- */
- slug: () => LocalizedString;
- };
- Errors: {
- /**
- * Failed to sign in with Google
- */
- failedSignInGoogle: () => LocalizedString;
- /**
- * Failed to send OTP. Please try again.
- */
- failedSendOtp: () => LocalizedString;
- /**
- * Unable to send OTP
- */
- unableToSendOtp: () => LocalizedString;
- /**
- * Invalid OTP. Please try again.
- */
- invalidOtp: () => LocalizedString;
- /**
- * Unable to verify OTP
- */
- unableToVerifyOtp: () => LocalizedString;
- /**
- * Please verify your email address before signing in.
- */
- verifyEmailBeforeSignIn: () => LocalizedString;
- /**
- * This account was created with Google or OTP. Use 'Forgot Password' below to set a password.
- */
- accountCreatedWithSocial: () => LocalizedString;
- /**
- * Invalid email or password.
- */
- invalidEmailOrPassword: () => LocalizedString;
- /**
- * Passwords do not match.
- */
- passwordsDoNotMatch: () => LocalizedString;
- /**
- * Password must be at least 8 characters.
- */
- passwordMinLength: () => LocalizedString;
- /**
- * Password must be at most 128 characters.
- */
- passwordMaxLength: () => LocalizedString;
- /**
- * Password must contain at least one uppercase letter.
- */
- passwordUppercase: () => LocalizedString;
- /**
- * Password must contain at least one lowercase letter.
- */
- passwordLowercase: () => LocalizedString;
- /**
- * Password must contain at least one number.
- */
- passwordNumber: () => LocalizedString;
- /**
- * Password must contain at least one special character.
- */
- passwordSpecialChar: () => LocalizedString;
- /**
- * Failed to reset password. Please try again.
- */
- failedResetPassword: () => LocalizedString;
- /**
- * Failed to change password.
- */
- failedChangePassword: () => LocalizedString;
- /**
- * Password changed successfully.
- */
- passwordChangedSuccess: () => LocalizedString;
- /**
- * Sign up failed. Please try again.
- */
- signUpFailed: () => LocalizedString;
- /**
- * Sign in failed
- */
- signInFailed: () => LocalizedString;
- /**
- * An account with this email already exists. Try signing in instead — if you used Google or OTP, you can set a password from your profile.
- */
- accountAlreadyExists: () => LocalizedString;
- /**
- * {label} is required.
- */
- nameRequired: (arg: { label: string }) => LocalizedString;
- /**
- * {label} must be at least 2 characters.
- */
- nameMinLength: (arg: { label: string }) => LocalizedString;
- /**
- * {label} can only contain letters, spaces, hyphens, and apostrophes.
- */
- nameInvalidChars: (arg: { label: string }) => LocalizedString;
- /**
- * Email is required.
- */
- emailRequired: () => LocalizedString;
- /**
- * Please enter a valid email address.
- */
- emailInvalid: () => LocalizedString;
- /**
- * Password is required.
- */
- passwordRequired: () => LocalizedString;
- /**
- * Slug is required
- */
- slugRequired: () => LocalizedString;
- /**
- * Name is required
- */
- nameFieldRequired: () => LocalizedString;
- /**
- * Slug must be lowercase letters, numbers, and hyphens only
- */
- slugInvalid: () => LocalizedString;
- /**
- * No tenants assigned
- */
- noTenantsAssigned: () => LocalizedString;
- /**
- * You don't have access to any tenants yet. Please contact an administrator to get added to a tenant.
- */
- noTenantsMessage: () => LocalizedString;
- /**
- * Loading your tenants...
- */
- loadingYourTenants: () => LocalizedString;
- /**
- * Setting up your tenant...
- */
- settingUpTenant: () => LocalizedString;
- };
-};
+ Common: {
+ /**
+ * Loading...
+ */
+ loading: () => LocalizedString
+ /**
+ * Back to Home
+ */
+ backToHome: () => LocalizedString
+ /**
+ * Back
+ */
+ back: () => LocalizedString
+ /**
+ * Cancel
+ */
+ cancel: () => LocalizedString
+ /**
+ * Save
+ */
+ save: () => LocalizedString
+ /**
+ * Add
+ */
+ add: () => LocalizedString
+ /**
+ * Refresh
+ */
+ refresh: () => LocalizedString
+ /**
+ * Refreshing...
+ */
+ refreshing: () => LocalizedString
+ /**
+ * Adding...
+ */
+ adding: () => LocalizedString
+ /**
+ * Saving...
+ */
+ saving: () => LocalizedString
+ /**
+ * Sending...
+ */
+ sending: () => LocalizedString
+ /**
+ * Or
+ */
+ or: () => LocalizedString
+ /**
+ * Admin
+ */
+ roleAdmin: () => LocalizedString
+ /**
+ * User
+ */
+ roleUser: () => LocalizedString
+ /**
+ * You
+ */
+ you: () => LocalizedString
+ /**
+ * Edit
+ */
+ edit: () => LocalizedString
+ /**
+ * Delete
+ */
+ 'delete': () => LocalizedString
+ /**
+ * Loading items...
+ */
+ loadingItems: () => LocalizedString
+ /**
+ * No items yet. Add one to get started!
+ */
+ noItemsYet: () => LocalizedString
+ /**
+ * Got it
+ */
+ gotIt: () => LocalizedString
+ /**
+ * Learn more
+ */
+ learnMore: () => LocalizedString
+ /**
+ * {count} {{Item|Items}}
+ */
+ itemCount: (arg: { count: number }) => LocalizedString
+ /**
+ * {count} {{Item|Items}} (global)
+ */
+ itemCountGlobal: (arg: { count: number }) => LocalizedString
+ }
+ Navigation: {
+ /**
+ * Full Stack
+ */
+ fullStack: () => LocalizedString
+ /**
+ * Profile & Security
+ */
+ profileAndSecurity: () => LocalizedString
+ /**
+ * Platform Tenants
+ */
+ platformTenants: () => LocalizedString
+ /**
+ * Manage Members
+ */
+ manageMembers: () => LocalizedString
+ /**
+ * Sign out
+ */
+ signOut: () => LocalizedString
+ /**
+ * Switch tenant
+ */
+ switchTenant: () => LocalizedString
+ /**
+ * Switching...
+ */
+ switching: () => LocalizedString
+ /**
+ * Select tenant
+ */
+ selectTenant: () => LocalizedString
+ }
+ Home: {
+ /**
+ * Full Stack Boilerplate
+ */
+ title: () => LocalizedString
+ /**
+ * NextJs (Tailwind CSS), NestJs, Expo, tRPC, Better Auth
+ */
+ subtitle: () => LocalizedString
+ /**
+ * CRUD Demo
+ */
+ crudDemoTitle: () => LocalizedString
+ /**
+ * Test Create, Read, Update, Delete operations with tRPC and Prisma integration. Full-stack type safety demonstration.
+ */
+ crudDemoDescription: () => LocalizedString
+ /**
+ * Global CRUD Demo
+ */
+ globalCrudDemoTitle: () => LocalizedString
+ /**
+ * Same as CRUD but shared across all tenants. Everyone sees and edits the same data.
+ */
+ globalCrudDemoDescription: () => LocalizedString
+ /**
+ * Platform Tenants
+ */
+ platformTenantsTitle: () => LocalizedString
+ /**
+ * Create, edit, and remove tenants across the platform. Super-admin only.
+ */
+ platformTenantsDescription: () => LocalizedString
+ /**
+ * Manage tenants
+ */
+ manageTenants: () => LocalizedString
+ /**
+ * Manage Members
+ */
+ manageMembersTitle: () => LocalizedString
+ /**
+ * Add or remove members from tenants you administer.
+ */
+ manageMembersDescription: () => LocalizedString
+ /**
+ * Manage members
+ */
+ manageMembers: () => LocalizedString
+ /**
+ * Auth Demo
+ */
+ authDemoTitle: () => LocalizedString
+ /**
+ * Test authentication with Better Auth. OAuth integration with Google, session management, and protected routes.
+ */
+ authDemoDescription: () => LocalizedString
+ /**
+ * Try it out
+ */
+ tryItOut: () => LocalizedString
+ /**
+ * Built with modern tools for rapid development
+ */
+ footer: () => LocalizedString
+ /**
+ * BE: Tech Stack
+ */
+ heroTitle: () => LocalizedString
+ /**
+ * Full-stack boilerplate with multi-tenancy, authentication, and CRUD operations. Explore the data grids and charting capabilities below.
+ */
+ heroDescription: () => LocalizedString
+ /**
+ * View Grids
+ */
+ viewGrids: () => LocalizedString
+ /**
+ * View Charts
+ */
+ viewCharts: () => LocalizedString
+ /**
+ * Feature Highlights
+ */
+ featureHighlights: () => LocalizedString
+ /**
+ * Total Records
+ */
+ totalRecords: () => LocalizedString
+ /**
+ * Active Tenants
+ */
+ activeTenants: () => LocalizedString
+ /**
+ * Users
+ */
+ users: () => LocalizedString
+ /**
+ * API Endpoints
+ */
+ apiEndpoints: () => LocalizedString
+ /**
+ * stable
+ */
+ stable: () => LocalizedString
+ /**
+ * Powerful Data Grids
+ */
+ powerfulDataGrids: () => LocalizedString
+ /**
+ * Editable, sortable, filterable tables for all your data. CRUD operations, bulk actions, nested rows, and multi-select — powered by TanStack Table.
+ */
+ powerfulDataGridsDesc: () => LocalizedString
+ /**
+ * Rich Visualizations
+ */
+ richVisualizations: () => LocalizedString
+ /**
+ * 10+ chart types powered by Plotly.js with WebGL support. Line, bar, scatter, 3D surfaces, heatmaps, and more — all interactive and responsive.
+ */
+ richVisualizationsDesc: () => LocalizedString
+ /**
+ * Multi-tenant Ready
+ */
+ multiTenantReady: () => LocalizedString
+ /**
+ * CRUD operations scoped per tenant with role-based read/write control. Manage tenants, members, and permissions from a single dashboard.
+ */
+ multiTenantReadyDesc: () => LocalizedString
+ /**
+ * Tenant Dashboard
+ */
+ tenantDashboard: () => LocalizedString
+ /**
+ * Manage platform tenants and subscriptions
+ */
+ tenantDashboardDesc: () => LocalizedString
+ /**
+ * Add, remove, and manage tenant member roles
+ */
+ manageMembersQuickDesc: () => LocalizedString
+ }
+ Auth: {
+ /**
+ * Sign in
+ */
+ signIn: () => LocalizedString
+ /**
+ * Sign in
+ */
+ signInTitle: () => LocalizedString
+ /**
+ * Choose your preferred sign-in method
+ */
+ signInSubtitle: () => LocalizedString
+ /**
+ * Sign in with Google
+ */
+ signInWithGoogle: () => LocalizedString
+ /**
+ * Sign in with Email OTP
+ */
+ signInWithEmailOtp: () => LocalizedString
+ /**
+ * Or with Email & Password
+ */
+ orWithEmailPassword: () => LocalizedString
+ /**
+ * Sign in with Email & Password
+ */
+ signInWithEmailPassword: () => LocalizedString
+ /**
+ * Signing in...
+ */
+ signingIn: () => LocalizedString
+ /**
+ * Sign up
+ */
+ signUp: () => LocalizedString
+ /**
+ * Create an account
+ */
+ signUpTitle: () => LocalizedString
+ /**
+ * Sign up with your email and password
+ */
+ signUpSubtitle: () => LocalizedString
+ /**
+ * Sign up with Email & Password
+ */
+ signUpWithEmailPassword: () => LocalizedString
+ /**
+ * Creating account...
+ */
+ creatingAccount: () => LocalizedString
+ /**
+ * Don't have an account?
+ */
+ dontHaveAccount: () => LocalizedString
+ /**
+ * Already have an account?
+ */
+ alreadyHaveAccount: () => LocalizedString
+ /**
+ * Forgot Password?
+ */
+ forgotPassword: () => LocalizedString
+ /**
+ * Forgot Password
+ */
+ forgotPasswordTitle: () => LocalizedString
+ /**
+ * Enter your email to receive a password reset link
+ */
+ forgotPasswordSubtitle: () => LocalizedString
+ /**
+ * Check your inbox
+ */
+ checkYourInbox: () => LocalizedString
+ /**
+ * Send Reset Link
+ */
+ sendResetLink: () => LocalizedString
+ /**
+ * Back to Sign In
+ */
+ backToSignIn: () => LocalizedString
+ /**
+ * If an account exists with this email, you'll receive a link to set your password.
+ */
+ resetLinkSentMessage: () => LocalizedString
+ /**
+ * Set Your Password
+ */
+ setYourPassword: () => LocalizedString
+ /**
+ * Enter a new password for your account
+ */
+ setPasswordSubtitle: () => LocalizedString
+ /**
+ * Set Password
+ */
+ setPassword: () => LocalizedString
+ /**
+ * Setting password...
+ */
+ settingPassword: () => LocalizedString
+ /**
+ * Invalid or Expired Link
+ */
+ invalidOrExpiredLink: () => LocalizedString
+ /**
+ * This password reset link is invalid or has expired. Please request a new one.
+ */
+ invalidOrExpiredLinkMessage: () => LocalizedString
+ /**
+ * Request New Link
+ */
+ requestNewLink: () => LocalizedString
+ /**
+ * Verification Failed
+ */
+ verificationFailed: () => LocalizedString
+ /**
+ * This verification link has expired. Please try signing in again to receive a new verification email.
+ */
+ verificationFailedExpired: () => LocalizedString
+ /**
+ * This verification link is invalid. Please try signing in again to receive a new verification email.
+ */
+ verificationFailedInvalid: () => LocalizedString
+ /**
+ * Email Verified!
+ */
+ emailVerified: () => LocalizedString
+ /**
+ * Your email has been verified successfully. Redirecting to home...
+ */
+ emailVerifiedMessage: () => LocalizedString
+ /**
+ * Go to Home now
+ */
+ goToHome: () => LocalizedString
+ /**
+ * Go to Sign In
+ */
+ goToSignIn: () => LocalizedString
+ /**
+ * Send OTP
+ */
+ sendOtp: () => LocalizedString
+ /**
+ * Verify OTP
+ */
+ verifyOtp: () => LocalizedString
+ /**
+ * Verifying...
+ */
+ verifying: () => LocalizedString
+ /**
+ * Change Email
+ */
+ changeEmail: () => LocalizedString
+ /**
+ * We sent a verification code to {email}
+ */
+ otpSentTo: (arg: { email: string }) => LocalizedString
+ /**
+ * We've sent a verification email to {email}. Please check your inbox and click the link to verify your account before signing in.
+ */
+ checkInboxMessage: (arg: { email: string }) => LocalizedString
+ /**
+ * Password set successfully. You can now sign in.
+ */
+ passwordSetSuccess: () => LocalizedString
+ /**
+ * Sign in required
+ */
+ signInRequired: () => LocalizedString
+ /**
+ * You need to be authenticated to access this application.
+ */
+ signInRequiredMessage: () => LocalizedString
+ /**
+ * Better Auth Demo
+ */
+ betterAuthDemo: () => LocalizedString
+ /**
+ * Welcome back!
+ */
+ welcomeBack: () => LocalizedString
+ /**
+ * Sign in to continue
+ */
+ signInToContinue: () => LocalizedString
+ /**
+ * You are signed in
+ */
+ youAreSignedIn: () => LocalizedString
+ /**
+ * User Information
+ */
+ userInformation: () => LocalizedString
+ /**
+ * Sign Out
+ */
+ signOutButton: () => LocalizedString
+ /**
+ * Or Email & Password
+ */
+ orEmailPassword: () => LocalizedString
+ /**
+ * Resend verification email
+ */
+ resendVerificationEmail: () => LocalizedString
+ /**
+ * Verification email sent! Check your inbox.
+ */
+ verificationEmailSent: () => LocalizedString
+ /**
+ * Min 8 characters with uppercase, lowercase, number, and special character.
+ */
+ passwordMinChars: () => LocalizedString
+ /**
+ * I agree to the processing of my personal data as described in the
+ */
+ consentText: () => LocalizedString
+ /**
+ * . You can withdraw consent at any time by deleting your account.
+ */
+ consentSuffix: () => LocalizedString
+ /**
+ * You must consent to data processing to create an account
+ */
+ consentRequired: () => LocalizedString
+ /**
+ * By signing in, you agree to our
+ */
+ signInConsentPrefix: () => LocalizedString
+ /**
+ * and consent to the processing of your personal data.
+ */
+ signInConsentSuffix: () => LocalizedString
+ /**
+ * User ID
+ */
+ userId: () => LocalizedString
+ }
+ Dashboard: {
+ /**
+ * Platform Tenants
+ */
+ platformTenantsTitle: () => LocalizedString
+ /**
+ * Create, edit, and remove tenants. Super-admin only.
+ */
+ platformTenantsSubtitle: () => LocalizedString
+ /**
+ * You must be logged in to access this page.
+ */
+ mustBeLoggedIn: () => LocalizedString
+ /**
+ * Super-admin access required. Your email must be in SUPER_ADMIN_EMAILS.
+ */
+ superAdminRequired: () => LocalizedString
+ /**
+ * Add tenant
+ */
+ addTenant: () => LocalizedString
+ /**
+ * Slug (a-z, 0-9, hyphens)
+ */
+ slugLabel: () => LocalizedString
+ /**
+ * e.g. acme-corp
+ */
+ slugPlaceholder: () => LocalizedString
+ /**
+ * e.g. Acme Corp
+ */
+ namePlaceholder: () => LocalizedString
+ /**
+ * {count} tenant{{s|}}
+ */
+ tenantCount: (arg: { count: number }) => LocalizedString
+ /**
+ * Loading tenants...
+ */
+ loadingTenants: () => LocalizedString
+ /**
+ * No tenants yet. Add one above.
+ */
+ noTenantsYet: () => LocalizedString
+ /**
+ * Refresh list
+ */
+ refreshList: () => LocalizedString
+ /**
+ * Delete tenant "{slug}"? This cannot be undone.
+ */
+ deleteConfirm: (arg: { slug: string }) => LocalizedString
+ /**
+ * Dual Database CRUD Demo
+ */
+ dualDatabaseCrudDemo: () => LocalizedString
+ /**
+ * Side-by-side comparison of Mongoose (MongoDB) and Prisma (PostgreSQL)
+ */
+ crudDemoSubtitle: () => LocalizedString
+ /**
+ * NextJs (TailwindCSS) • NestJs • tRPC • Transactions
+ */
+ crudDemoTechStack: () => LocalizedString
+ /**
+ * → Tenant Dashboard (super-admin)
+ */
+ tenantDashboardLink: () => LocalizedString
+ /**
+ * Global CRUD Demo
+ */
+ globalCrudDemoTitle: () => LocalizedString
+ /**
+ * Same as CRUD but shared across all tenants. Everyone sees and edits the same data.
+ */
+ globalCrudDemoSubtitle: () => LocalizedString
+ /**
+ * Mongoose (MongoDB) & Prisma (PostgreSQL) • No tenant scope
+ */
+ globalCrudDemoTechStack: () => LocalizedString
+ /**
+ * Add text here
+ */
+ addTextPlaceholder: () => LocalizedString
+ }
+ Settings: {
+ /**
+ * Profile
+ */
+ profileTitle: () => LocalizedString
+ /**
+ * Manage your account security and linked sign-in methods.
+ */
+ profileSubtitle: () => LocalizedString
+ /**
+ * Your email is not verified
+ */
+ emailNotVerified: () => LocalizedString
+ /**
+ * Please verify your email to access all features.
+ */
+ verifyEmailPrompt: () => LocalizedString
+ /**
+ * Account Info
+ */
+ accountInfo: () => LocalizedString
+ /**
+ * Linked Accounts
+ */
+ linkedAccounts: () => LocalizedString
+ /**
+ * Google
+ */
+ google: () => LocalizedString
+ /**
+ * Connected
+ */
+ connected: () => LocalizedString
+ /**
+ * Connect Google
+ */
+ connectGoogle: () => LocalizedString
+ /**
+ * Email & Password
+ */
+ emailAndPassword: () => LocalizedString
+ /**
+ * Password set
+ */
+ passwordSet: () => LocalizedString
+ /**
+ * Not set
+ */
+ notSet: () => LocalizedString
+ /**
+ * Password
+ */
+ passwordTitle: () => LocalizedString
+ /**
+ * Change Password
+ */
+ changePassword: () => LocalizedString
+ /**
+ * Current Password
+ */
+ currentPassword: () => LocalizedString
+ /**
+ * New Password (min 8 characters)
+ */
+ newPasswordLabel: () => LocalizedString
+ /**
+ * Confirm New Password
+ */
+ confirmNewPassword: () => LocalizedString
+ /**
+ * Save Password
+ */
+ savePassword: () => LocalizedString
+ /**
+ * Add a password to sign in without Google or OTP.
+ */
+ addPasswordDescription: () => LocalizedString
+ /**
+ * Check your inbox to set your password.
+ */
+ checkInboxForPassword: () => LocalizedString
+ /**
+ * Manage Members
+ */
+ manageMembersTitle: () => LocalizedString
+ /**
+ * Add or remove members from your tenants.
+ */
+ manageMembersSubtitle: () => LocalizedString
+ /**
+ * No admin access
+ */
+ noAdminAccess: () => LocalizedString
+ /**
+ * You don't have admin access to any tenants.
+ */
+ noAdminAccessMessage: () => LocalizedString
+ /**
+ * Your tenants ({count})
+ */
+ yourTenants: (arg: { count: number }) => LocalizedString
+ /**
+ * Members of {name}
+ */
+ membersOf: (arg: { name: string }) => LocalizedString
+ /**
+ * Add member
+ */
+ addMember: () => LocalizedString
+ /**
+ * user@example.com
+ */
+ memberEmailPlaceholder: () => LocalizedString
+ /**
+ * Loading members...
+ */
+ loadingMembers: () => LocalizedString
+ /**
+ * No members yet. Add one above.
+ */
+ noMembersYet: () => LocalizedString
+ /**
+ * Remove member
+ */
+ removeMember: () => LocalizedString
+ /**
+ * Select a tenant from the list to manage its members.
+ */
+ selectTenantPrompt: () => LocalizedString
+ /**
+ * Edit Profile
+ */
+ editProfile: () => LocalizedString
+ /**
+ * Edit Name
+ */
+ editName: () => LocalizedString
+ /**
+ * Full Name
+ */
+ fullName: () => LocalizedString
+ /**
+ * Your full name
+ */
+ fullNamePlaceholder: () => LocalizedString
+ /**
+ * 2-100 characters. Letters, spaces, hyphens, and apostrophes only.
+ */
+ nameHint: () => LocalizedString
+ /**
+ * Name updated successfully
+ */
+ nameUpdated: () => LocalizedString
+ /**
+ * Failed to update name
+ */
+ failedUpdateName: () => LocalizedString
+ /**
+ * Data & Privacy
+ */
+ dataAndPrivacy: () => LocalizedString
+ /**
+ * You have the right to access, export, and delete your personal data at any time. Read our
+ */
+ dataPrivacyDescription: () => LocalizedString
+ /**
+ * Privacy & Data Policy
+ */
+ privacyAndDataPolicy: () => LocalizedString
+ /**
+ * Download My Data
+ */
+ downloadMyData: () => LocalizedString
+ /**
+ * Export all your personal data as a JSON file
+ */
+ downloadMyDataDescription: () => LocalizedString
+ /**
+ * Preparing export...
+ */
+ preparingExport: () => LocalizedString
+ /**
+ * Downloaded
+ */
+ downloaded: () => LocalizedString
+ /**
+ * Download
+ */
+ download: () => LocalizedString
+ /**
+ * Delete Account
+ */
+ deleteAccount: () => LocalizedString
+ /**
+ * Permanently delete your account and all associated data
+ */
+ deleteAccountDescription: () => LocalizedString
+ /**
+ * This action is irreversible. Type your email address
+ */
+ deleteConfirmPrefix: () => LocalizedString
+ /**
+ * to confirm.
+ */
+ deleteConfirmSuffix: () => LocalizedString
+ /**
+ * Type your email to confirm
+ */
+ typeEmailToConfirm: () => LocalizedString
+ /**
+ * Deleting...
+ */
+ deleting: () => LocalizedString
+ /**
+ * Permanently Delete Account
+ */
+ permanentlyDeleteAccount: () => LocalizedString
+ /**
+ * Failed to delete account
+ */
+ failedDeleteAccount: () => LocalizedString
+ }
+ Forms: {
+ /**
+ * Email
+ */
+ email: () => LocalizedString
+ /**
+ * Email Address
+ */
+ emailAddress: () => LocalizedString
+ /**
+ * you@example.com
+ */
+ emailPlaceholder: () => LocalizedString
+ /**
+ * Enter your email
+ */
+ enterYourEmail: () => LocalizedString
+ /**
+ * Password
+ */
+ password: () => LocalizedString
+ /**
+ * ••••••••
+ */
+ passwordPlaceholder: () => LocalizedString
+ /**
+ * Password (min 8 characters)
+ */
+ passwordMinChars: () => LocalizedString
+ /**
+ * Confirm Password
+ */
+ confirmPassword: () => LocalizedString
+ /**
+ * First Name
+ */
+ firstName: () => LocalizedString
+ /**
+ * John
+ */
+ firstNamePlaceholder: () => LocalizedString
+ /**
+ * Last Name
+ */
+ lastName: () => LocalizedString
+ /**
+ * Doe
+ */
+ lastNamePlaceholder: () => LocalizedString
+ /**
+ * Name
+ */
+ name: () => LocalizedString
+ /**
+ * Your name
+ */
+ namePlaceholder: () => LocalizedString
+ /**
+ * Verification Code
+ */
+ verificationCode: () => LocalizedString
+ /**
+ * Enter 6-digit code
+ */
+ verificationCodePlaceholder: () => LocalizedString
+ /**
+ * Slug
+ */
+ slug: () => LocalizedString
+ }
+ Errors: {
+ /**
+ * Failed to sign in with Google
+ */
+ failedSignInGoogle: () => LocalizedString
+ /**
+ * Failed to send OTP. Please try again.
+ */
+ failedSendOtp: () => LocalizedString
+ /**
+ * Unable to send OTP
+ */
+ unableToSendOtp: () => LocalizedString
+ /**
+ * Invalid OTP. Please try again.
+ */
+ invalidOtp: () => LocalizedString
+ /**
+ * Unable to verify OTP
+ */
+ unableToVerifyOtp: () => LocalizedString
+ /**
+ * Please verify your email address before signing in.
+ */
+ verifyEmailBeforeSignIn: () => LocalizedString
+ /**
+ * This account was created with Google or OTP. Use 'Forgot Password' below to set a password.
+ */
+ accountCreatedWithSocial: () => LocalizedString
+ /**
+ * Invalid email or password.
+ */
+ invalidEmailOrPassword: () => LocalizedString
+ /**
+ * Passwords do not match.
+ */
+ passwordsDoNotMatch: () => LocalizedString
+ /**
+ * Password must be at least 8 characters.
+ */
+ passwordMinLength: () => LocalizedString
+ /**
+ * Password must be at most 128 characters.
+ */
+ passwordMaxLength: () => LocalizedString
+ /**
+ * Password must contain at least one uppercase letter.
+ */
+ passwordUppercase: () => LocalizedString
+ /**
+ * Password must contain at least one lowercase letter.
+ */
+ passwordLowercase: () => LocalizedString
+ /**
+ * Password must contain at least one number.
+ */
+ passwordNumber: () => LocalizedString
+ /**
+ * Password must contain at least one special character.
+ */
+ passwordSpecialChar: () => LocalizedString
+ /**
+ * Failed to reset password. Please try again.
+ */
+ failedResetPassword: () => LocalizedString
+ /**
+ * Failed to change password.
+ */
+ failedChangePassword: () => LocalizedString
+ /**
+ * Password changed successfully.
+ */
+ passwordChangedSuccess: () => LocalizedString
+ /**
+ * Sign up failed. Please try again.
+ */
+ signUpFailed: () => LocalizedString
+ /**
+ * Sign in failed
+ */
+ signInFailed: () => LocalizedString
+ /**
+ * An account with this email already exists. Try signing in instead — if you used Google or OTP, you can set a password from your profile.
+ */
+ accountAlreadyExists: () => LocalizedString
+ /**
+ * {label} is required.
+ */
+ nameRequired: (arg: { label: string }) => LocalizedString
+ /**
+ * {label} must be at least 2 characters.
+ */
+ nameMinLength: (arg: { label: string }) => LocalizedString
+ /**
+ * {label} can only contain letters, spaces, hyphens, and apostrophes.
+ */
+ nameInvalidChars: (arg: { label: string }) => LocalizedString
+ /**
+ * Email is required.
+ */
+ emailRequired: () => LocalizedString
+ /**
+ * Please enter a valid email address.
+ */
+ emailInvalid: () => LocalizedString
+ /**
+ * Password is required.
+ */
+ passwordRequired: () => LocalizedString
+ /**
+ * Slug is required
+ */
+ slugRequired: () => LocalizedString
+ /**
+ * Name is required
+ */
+ nameFieldRequired: () => LocalizedString
+ /**
+ * Slug must be lowercase letters, numbers, and hyphens only
+ */
+ slugInvalid: () => LocalizedString
+ /**
+ * No tenants assigned
+ */
+ noTenantsAssigned: () => LocalizedString
+ /**
+ * You don't have access to any tenants yet. Please contact an administrator to get added to a tenant.
+ */
+ noTenantsMessage: () => LocalizedString
+ /**
+ * Loading your tenants...
+ */
+ loadingYourTenants: () => LocalizedString
+ /**
+ * Setting up your tenant...
+ */
+ settingUpTenant: () => LocalizedString
+ }
+ Sidebar: {
+ /**
+ * Navigation
+ */
+ navigation: () => LocalizedString
+ /**
+ * Main
+ */
+ sectionMain: () => LocalizedString
+ /**
+ * Data
+ */
+ sectionData: () => LocalizedString
+ /**
+ * Platform
+ */
+ sectionPlatform: () => LocalizedString
+ /**
+ * Account
+ */
+ sectionAccount: () => LocalizedString
+ /**
+ * Home
+ */
+ home: () => LocalizedString
+ /**
+ * CRUD Demo
+ */
+ crudDemo: () => LocalizedString
+ /**
+ * Global CRUD Demo
+ */
+ globalCrudDemo: () => LocalizedString
+ /**
+ * Grids
+ */
+ grids: () => LocalizedString
+ /**
+ * Charts
+ */
+ charts: () => LocalizedString
+ /**
+ * Tenant Dashboard
+ */
+ tenantDashboard: () => LocalizedString
+ /**
+ * Tenant Members
+ */
+ tenantMembers: () => LocalizedString
+ /**
+ * Profile
+ */
+ profile: () => LocalizedString
+ /**
+ * Crud Records
+ */
+ crudRecords: () => LocalizedString
+ /**
+ * Global Crud Records
+ */
+ globalCrudRecords: () => LocalizedString
+ /**
+ * Editable People (Demo)
+ */
+ editablePeople: () => LocalizedString
+ /**
+ * Batch Ops (Demo)
+ */
+ batchOps: () => LocalizedString
+ /**
+ * Tenants (Demo)
+ */
+ tenantsDemo: () => LocalizedString
+ /**
+ * Metrics (Demo)
+ */
+ metricsDemo: () => LocalizedString
+ /**
+ * Tasks (Demo)
+ */
+ tasksDemo: () => LocalizedString
+ /**
+ * Overview Charts
+ */
+ overviewCharts: () => LocalizedString
+ /**
+ * Time Series
+ */
+ timeSeries: () => LocalizedString
+ /**
+ * Distribution Charts
+ */
+ distributionCharts: () => LocalizedString
+ /**
+ * Comparative Charts
+ */
+ comparativeCharts: () => LocalizedString
+ /**
+ * 3D & Advanced
+ */
+ threeDAdvanced: () => LocalizedString
+ }
+ Grids: {
+ /**
+ * Data Grids
+ */
+ title: () => LocalizedString
+ /**
+ * Grid scenarios powered by TanStack Table v8. Grids marked
+ */
+ descriptionPrefix: () => LocalizedString
+ /**
+ * Demo
+ */
+ demo: () => LocalizedString
+ /**
+ * use illustrative dummy data. Grids marked
+ */
+ descriptionMiddle: () => LocalizedString
+ /**
+ * Live
+ */
+ live: () => LocalizedString
+ /**
+ * fetch real data from the API.
+ */
+ descriptionSuffix: () => LocalizedString
+ /**
+ * Crud Records
+ */
+ tabCrudRecords: () => LocalizedString
+ /**
+ * Global Crud Records
+ */
+ tabGlobalCrudRecords: () => LocalizedString
+ /**
+ * Editable People (Demo)
+ */
+ tabEditablePeople: () => LocalizedString
+ /**
+ * Batch Operations (Demo)
+ */
+ tabBatchOps: () => LocalizedString
+ /**
+ * Tenants (Demo)
+ */
+ tabTenants: () => LocalizedString
+ /**
+ * Metrics (Demo)
+ */
+ tabMetrics: () => LocalizedString
+ /**
+ * Tasks (Demo)
+ */
+ tabTasks: () => LocalizedString
+ /**
+ * Live read-only view of Crud records fetched from the API (Prisma). Reflects actual database state.
+ */
+ descCrudLive: () => LocalizedString
+ /**
+ * Live read-only view of Global Crud records fetched from the API (Prisma). No tenant scoping.
+ */
+ descGlobalCrudLive: () => LocalizedString
+ /**
+ * Demo: Editable grid with in-memory data modeled after the Crud entity shape.
+ */
+ descCrud: () => LocalizedString
+ /**
+ * Demo: Bulk operations with row selection, multi-sort, and batch actions on in-memory data.
+ */
+ descGlobalCrud: () => LocalizedString
+ /**
+ * Demo: Tenant management view grouped by plan tier with expandable sub-rows.
+ */
+ descTenants: () => LocalizedString
+ /**
+ * Demo: Read-only analytics metrics. Illustrative dummy data, not from a live API.
+ */
+ descReadOnly: () => LocalizedString
+ /**
+ * Demo: Rich cell renderers with tags, avatars, priority icons, and expandable details.
+ */
+ descAdvanced: () => LocalizedString
+ /**
+ * ID
+ */
+ colId: () => LocalizedString
+ /**
+ * Content
+ */
+ colContent: () => LocalizedString
+ /**
+ * Created At
+ */
+ colCreatedAt: () => LocalizedString
+ /**
+ * Updated At
+ */
+ colUpdatedAt: () => LocalizedString
+ /**
+ * First Name
+ */
+ colFirstName: () => LocalizedString
+ /**
+ * Last Name
+ */
+ colLastName: () => LocalizedString
+ /**
+ * Email
+ */
+ colEmail: () => LocalizedString
+ /**
+ * Role
+ */
+ colRole: () => LocalizedString
+ /**
+ * Status
+ */
+ colStatus: () => LocalizedString
+ /**
+ * Created
+ */
+ colCreated: () => LocalizedString
+ /**
+ * Tenant Name
+ */
+ colTenantName: () => LocalizedString
+ /**
+ * Plan
+ */
+ colPlan: () => LocalizedString
+ /**
+ * Users
+ */
+ colUsers: () => LocalizedString
+ /**
+ * Storage
+ */
+ colStorage: () => LocalizedString
+ /**
+ * Region
+ */
+ colRegion: () => LocalizedString
+ /**
+ * Metric
+ */
+ colMetric: () => LocalizedString
+ /**
+ * Value
+ */
+ colValue: () => LocalizedString
+ /**
+ * Change
+ */
+ colChange: () => LocalizedString
+ /**
+ * Period
+ */
+ colPeriod: () => LocalizedString
+ /**
+ * Category
+ */
+ colCategory: () => LocalizedString
+ /**
+ * Task
+ */
+ colTask: () => LocalizedString
+ /**
+ * Tags
+ */
+ colTags: () => LocalizedString
+ /**
+ * Assigned To
+ */
+ colAssignedTo: () => LocalizedString
+ /**
+ * Priority
+ */
+ colPriority: () => LocalizedString
+ /**
+ * Due Date
+ */
+ colDueDate: () => LocalizedString
+ /**
+ * Completed
+ */
+ colCompleted: () => LocalizedString
+ /**
+ * Admin
+ */
+ roleAdmin: () => LocalizedString
+ /**
+ * User
+ */
+ roleUser: () => LocalizedString
+ /**
+ * Editor
+ */
+ roleEditor: () => LocalizedString
+ /**
+ * Viewer
+ */
+ roleViewer: () => LocalizedString
+ /**
+ * Active
+ */
+ statusActive: () => LocalizedString
+ /**
+ * Inactive
+ */
+ statusInactive: () => LocalizedString
+ /**
+ * Suspended
+ */
+ statusSuspended: () => LocalizedString
+ /**
+ * Trial
+ */
+ statusTrial: () => LocalizedString
+ /**
+ * Free
+ */
+ planFree: () => LocalizedString
+ /**
+ * Pro
+ */
+ planPro: () => LocalizedString
+ /**
+ * Enterprise
+ */
+ planEnterprise: () => LocalizedString
+ /**
+ * Live — Prisma
+ */
+ livePrisma: () => LocalizedString
+ /**
+ * {count} record{{s|}}
+ */
+ recordCount: (arg: { count: number }) => LocalizedString
+ /**
+ * Loading Crud records…
+ */
+ loadingCrudRecords: () => LocalizedString
+ /**
+ * Loading Global Crud records…
+ */
+ loadingGlobalCrudRecords: () => LocalizedString
+ /**
+ * Failed to load: {message}
+ */
+ failedToLoad: (arg: { message: string }) => LocalizedString
+ /**
+ * Demo — in-memory data
+ */
+ demoInMemory: () => LocalizedString
+ /**
+ * Demo — dummy data
+ */
+ demoDummyData: () => LocalizedString
+ /**
+ * Demo — dummy data ({count} records)
+ */
+ demoDummyDataCount: (arg: { count: number }) => LocalizedString
+ /**
+ * Unsaved changes
+ */
+ unsavedChanges: () => LocalizedString
+ /**
+ * Add Row
+ */
+ addRow: () => LocalizedString
+ /**
+ * {count} selected
+ */
+ selectedCount: (arg: { count: number }) => LocalizedString
+ /**
+ * Delete Selected
+ */
+ deleteSelected: () => LocalizedString
+ /**
+ * Export
+ */
+ 'export': () => LocalizedString
+ /**
+ * Change Status
+ */
+ changeStatus: () => LocalizedString
+ /**
+ * Users in {name}
+ */
+ usersIn: (arg: { name: string }) => LocalizedString
+ /**
+ * User {n}
+ */
+ userN: (arg: { n: number }) => LocalizedString
+ /**
+ * +{count} more
+ */
+ moreUsers: (arg: { count: number }) => LocalizedString
+ /**
+ * Done
+ */
+ done: () => LocalizedString
+ /**
+ * Open
+ */
+ open: () => LocalizedString
+ /**
+ * Assigned to {name}
+ */
+ assignedToLabel: (arg: { name: string }) => LocalizedString
+ /**
+ * Priority: {value}
+ */
+ priorityLabel: (arg: { value: string }) => LocalizedString
+ /**
+ * Due: {date}
+ */
+ dueLabel: (arg: { date: string }) => LocalizedString
+ /**
+ * OVERDUE
+ */
+ overdue: () => LocalizedString
+ }
+ Charts: {
+ /**
+ * Charts & Visualizations
+ */
+ title: () => LocalizedString
+ /**
+ * 12+ chart types powered by Plotly.js with WebGL support. All charts are interactive — zoom, pan, and hover for details.
+ */
+ description: () => LocalizedString
+ /**
+ * Line & Area
+ */
+ navLineArea: () => LocalizedString
+ /**
+ * Bar & Column
+ */
+ navBarColumn: () => LocalizedString
+ /**
+ * Pie, Donut & Sunburst
+ */
+ navPieDonut: () => LocalizedString
+ /**
+ * Scatter & Bubble
+ */
+ navScatterBubble: () => LocalizedString
+ /**
+ * Statistical
+ */
+ navStatistical: () => LocalizedString
+ /**
+ * Heatmap & Timeline
+ */
+ navHeatmapTimeline: () => LocalizedString
+ /**
+ * 3D Charts
+ */
+ nav3dCharts: () => LocalizedString
+ /**
+ * Mixed / Combo
+ */
+ navMixedCombo: () => LocalizedString
+ /**
+ * Plotly Table
+ */
+ navPlotlyTable: () => LocalizedString
+ /**
+ * Line & Area Charts
+ */
+ lineAreaCharts: () => LocalizedString
+ /**
+ * Bar & Column Charts
+ */
+ barColumnCharts: () => LocalizedString
+ /**
+ * Pie, Donut & Sunburst
+ */
+ pieDonutSunburst: () => LocalizedString
+ /**
+ * Scatter & Bubble Charts
+ */
+ scatterBubbleCharts: () => LocalizedString
+ /**
+ * Statistical Charts
+ */
+ statisticalCharts: () => LocalizedString
+ /**
+ * Heatmap & Timeline
+ */
+ heatmapTimeline: () => LocalizedString
+ /**
+ * 3D Charts (WebGL)
+ */
+ threeDChartsWebGL: () => LocalizedString
+ /**
+ * Mixed / Combo Charts
+ */
+ mixedComboCharts: () => LocalizedString
+ /**
+ * Plotly Table
+ */
+ plotlyTable: () => LocalizedString
+ /**
+ * User Growth Over Time
+ */
+ userGrowthTitle: () => LocalizedString
+ /**
+ * 24-month trend of new, active, and churned users.
+ */
+ userGrowthDesc: () => LocalizedString
+ /**
+ * New Users
+ */
+ newUsers: () => LocalizedString
+ /**
+ * Active Users
+ */
+ activeUsers: () => LocalizedString
+ /**
+ * Churned Users
+ */
+ churnedUsers: () => LocalizedString
+ /**
+ * Revenue Breakdown by Category
+ */
+ revenueBreakdownTitle: () => LocalizedString
+ /**
+ * Stacked area showing subscription, add-on, service, and overage revenue.
+ */
+ revenueBreakdownDesc: () => LocalizedString
+ /**
+ * Subscriptions
+ */
+ subscriptions: () => LocalizedString
+ /**
+ * Add-ons
+ */
+ addOns: () => LocalizedString
+ /**
+ * Services
+ */
+ services: () => LocalizedString
+ /**
+ * Overages
+ */
+ overages: () => LocalizedString
+ /**
+ * Monthly Active Users by Region
+ */
+ mauByRegionTitle: () => LocalizedString
+ /**
+ * Grouped bar chart comparing four regions over 12 months.
+ */
+ mauByRegionDesc: () => LocalizedString
+ /**
+ * US-East
+ */
+ usEast: () => LocalizedString
+ /**
+ * EU-West
+ */
+ euWest: () => LocalizedString
+ /**
+ * APAC
+ */
+ apac: () => LocalizedString
+ /**
+ * US-West
+ */
+ usWest: () => LocalizedString
+ /**
+ * Feature Usage by Tenant Plan
+ */
+ featureUsageTitle: () => LocalizedString
+ /**
+ * Horizontal stacked bar showing feature adoption across plan tiers.
+ */
+ featureUsageDesc: () => LocalizedString
+ /**
+ * Auth
+ */
+ auth: () => LocalizedString
+ /**
+ * CRUD
+ */
+ crud: () => LocalizedString
+ /**
+ * Analytics
+ */
+ analytics: () => LocalizedString
+ /**
+ * API
+ */
+ api: () => LocalizedString
+ /**
+ * Multi-Tenant
+ */
+ multiTenant: () => LocalizedString
+ /**
+ * Tenant Plan Distribution
+ */
+ tenantPlanDistTitle: () => LocalizedString
+ /**
+ * Donut chart showing the breakdown of tenants by plan tier.
+ */
+ tenantPlanDistDesc: () => LocalizedString
+ /**
+ * User Role Hierarchy
+ */
+ roleHierarchyTitle: () => LocalizedString
+ /**
+ * Sunburst chart showing organizational structure: Org > Department > Role.
+ */
+ roleHierarchyDesc: () => LocalizedString
+ /**
+ * Session Duration vs. Actions Taken
+ */
+ sessionScatterTitle: () => LocalizedString
+ /**
+ * Color-encoded by user tier. Hover for details.
+ */
+ sessionScatterDesc: () => LocalizedString
+ /**
+ * Free
+ */
+ free: () => LocalizedString
+ /**
+ * Pro
+ */
+ pro: () => LocalizedString
+ /**
+ * Enterprise
+ */
+ enterprise: () => LocalizedString
+ /**
+ * Duration (min)
+ */
+ durationMin: () => LocalizedString
+ /**
+ * Actions
+ */
+ actions: () => LocalizedString
+ /**
+ * Tenant Size vs. Storage Used
+ */
+ tenantBubbleTitle: () => LocalizedString
+ /**
+ * Bubble size represents monthly revenue.
+ */
+ tenantBubbleDesc: () => LocalizedString
+ /**
+ * Revenue ($)
+ */
+ revenueUsd: () => LocalizedString
+ /**
+ * User Count
+ */
+ userCount: () => LocalizedString
+ /**
+ * Storage (GB)
+ */
+ storageGb: () => LocalizedString
+ /**
+ * Response Time Distribution by Service
+ */
+ responseTimeTitle: () => LocalizedString
+ /**
+ * Box plot showing latency spread across five API services.
+ */
+ responseTimeDesc: () => LocalizedString
+ /**
+ * Response Time (ms)
+ */
+ responseTimeMs: () => LocalizedString
+ /**
+ * User Session Length Distribution
+ */
+ sessionLengthTitle: () => LocalizedString
+ /**
+ * Histogram binned by minute intervals.
+ */
+ sessionLengthDesc: () => LocalizedString
+ /**
+ * Session Length (min)
+ */
+ sessionLengthMin: () => LocalizedString
+ /**
+ * Count
+ */
+ count: () => LocalizedString
+ /**
+ * Activity by Hour and Day of Week
+ */
+ activityHeatmapTitle: () => LocalizedString
+ /**
+ * 7x24 heatmap showing event density. Viridis colorscale.
+ */
+ activityHeatmapDesc: () => LocalizedString
+ /**
+ * Tenant Onboarding Timeline
+ */
+ ganttTitle: () => LocalizedString
+ /**
+ * Gantt-style horizontal bar showing onboarding start and end dates.
+ */
+ ganttDesc: () => LocalizedString
+ /**
+ * 3D User Engagement Clustering
+ */
+ engagement3dTitle: () => LocalizedString
+ /**
+ * WebGL-rendered 3D scatter: sessions x avg duration x revenue, colored by cluster tier.
+ */
+ engagement3dDesc: () => LocalizedString
+ /**
+ * Low
+ */
+ low: () => LocalizedString
+ /**
+ * Medium
+ */
+ medium: () => LocalizedString
+ /**
+ * High
+ */
+ high: () => LocalizedString
+ /**
+ * Sessions
+ */
+ sessions: () => LocalizedString
+ /**
+ * Avg Duration
+ */
+ avgDuration: () => LocalizedString
+ /**
+ * Revenue Surface: Time x Region
+ */
+ surfaceTitle: () => LocalizedString
+ /**
+ * Full 3D rotation — drag to explore. Portland colorscale.
+ */
+ surfaceDesc: () => LocalizedString
+ /**
+ * Month
+ */
+ month: () => LocalizedString
+ /**
+ * Region
+ */
+ region: () => LocalizedString
+ /**
+ * Revenue ($K)
+ */
+ revenueK: () => LocalizedString
+ /**
+ * Revenue vs. User Growth
+ */
+ comboTitle: () => LocalizedString
+ /**
+ * Bar chart (revenue) with line overlay (user count) on secondary y-axis.
+ */
+ comboDesc: () => LocalizedString
+ /**
+ * MRR Movement This Quarter
+ */
+ waterfallTitle: () => LocalizedString
+ /**
+ * Waterfall chart showing new business, expansion, churn, and net MRR.
+ */
+ waterfallDesc: () => LocalizedString
+ /**
+ * MRR ($)
+ */
+ mrrUsd: () => LocalizedString
+ /**
+ * Top 10 Tenants — Plotly Table Trace
+ */
+ plotlyTableTitle: () => LocalizedString
+ /**
+ * This is a Plotly trace, not TanStack Table — compare the two on the Grids page.
+ */
+ plotlyTableDesc: () => LocalizedString
+ }
+ CookieBanner: {
+ /**
+ * This site uses essential cookies to keep you signed in. No tracking or advertising cookies.
+ */
+ text: () => LocalizedString
+ /**
+ * Learn more
+ */
+ learnMore: () => LocalizedString
+ /**
+ * Got it
+ */
+ gotIt: () => LocalizedString
+ }
+ Privacy: {
+ /**
+ * Privacy & Data Policy
+ */
+ title: () => LocalizedString
+ /**
+ * Last updated: February 20, 2026
+ */
+ lastUpdated: () => LocalizedString
+ /**
+ * 1. What data we collect
+ */
+ section1Title: () => LocalizedString
+ /**
+ * When you create an account we store:
+ */
+ section1Intro: () => LocalizedString
+ /**
+ * Name and email
+ */
+ collectName: () => LocalizedString
+ /**
+ * — provided by you or your Google account.
+ */
+ collectNameDetail: () => LocalizedString
+ /**
+ * Profile picture URL
+ */
+ collectImage: () => LocalizedString
+ /**
+ * — from Google if you sign in with Google.
+ */
+ collectImageDetail: () => LocalizedString
+ /**
+ * Password
+ */
+ collectPassword: () => LocalizedString
+ /**
+ * — if you use email/password sign-in. Stored encrypted; we never see or store it in plain text.
+ */
+ collectPasswordDetail: () => LocalizedString
+ /**
+ * OAuth tokens
+ */
+ collectOAuth: () => LocalizedString
+ /**
+ * — if you sign in with Google. Stored encrypted. Used to maintain your Google session and access Google Drive on your behalf if you granted those permissions.
+ */
+ collectOAuthDetail: () => LocalizedString
+ /**
+ * IP address and user agent
+ */
+ collectIp: () => LocalizedString
+ /**
+ * — recorded per session for security and audit purposes.
+ */
+ collectIpDetail: () => LocalizedString
+ /**
+ * Consent timestamp and IP
+ */
+ collectConsent: () => LocalizedString
+ /**
+ * — recorded when you agree to this policy.
+ */
+ collectConsentDetail: () => LocalizedString
+ /**
+ * 2. How we use your data
+ */
+ section2Title: () => LocalizedString
+ /**
+ * Authentication
+ */
+ useAuth: () => LocalizedString
+ /**
+ * — to sign you in, verify your email, and manage your sessions.
+ */
+ useAuthDetail: () => LocalizedString
+ /**
+ * Account management
+ */
+ useAccount: () => LocalizedString
+ /**
+ * — to display your profile and let you update or delete it.
+ */
+ useAccountDetail: () => LocalizedString
+ /**
+ * Transactional emails
+ */
+ useEmail: () => LocalizedString
+ /**
+ * — to send OTPs, verification links, and password reset links. We never send marketing email.
+ */
+ useEmailDetail: () => LocalizedString
+ /**
+ * Security
+ */
+ useSecurity: () => LocalizedString
+ /**
+ * — to detect suspicious activity and maintain audit logs.
+ */
+ useSecurityDetail: () => LocalizedString
+ /**
+ * Google Drive
+ */
+ useDrive: () => LocalizedString
+ /**
+ * — if you granted Drive scopes, to read or create files in your Drive on your behalf. We do not access Drive without your explicit scope grant.
+ */
+ useDriveDetail: () => LocalizedString
+ /**
+ * We do not sell, share, or rent your personal data to third parties. We do not use your data for advertising or profiling.
+ */
+ noSellData: () => LocalizedString
+ /**
+ * 3. Cookies
+ */
+ section3Title: () => LocalizedString
+ /**
+ * We use
+ */
+ cookiesIntro: () => LocalizedString
+ /**
+ * strictly necessary cookies only
+ */
+ cookiesIntroStrict: () => LocalizedString
+ /**
+ * . No analytics, advertising, or tracking cookies.
+ */
+ cookiesIntroSuffix: () => LocalizedString
+ /**
+ * Cookie
+ */
+ cookieHeader: () => LocalizedString
+ /**
+ * Purpose
+ */
+ purposeHeader: () => LocalizedString
+ /**
+ * Expiry
+ */
+ expiryHeader: () => LocalizedString
+ /**
+ * Session Token
+ */
+ cookieSessionToken: () => LocalizedString
+ /**
+ * Keeps you signed in across visits
+ */
+ cookieSessionPurpose: () => LocalizedString
+ /**
+ * 7 days
+ */
+ cookieSessionExpiry: () => LocalizedString
+ /**
+ * OAuth State
+ */
+ cookieOAuthState: () => LocalizedString
+ /**
+ * Temporary token to secure the Google sign-in flow
+ */
+ cookieOAuthPurpose: () => LocalizedString
+ /**
+ * 3 days
+ */
+ cookieOAuthExpiry: () => LocalizedString
+ /**
+ * These cookies are required for the application to function. They cannot be used to track you across other websites.
+ */
+ cookiesFootnote: () => LocalizedString
+ /**
+ * 4. Third-party services
+ */
+ section4Title: () => LocalizedString
+ /**
+ * Google (OAuth)
+ */
+ thirdPartyGoogle: () => LocalizedString
+ /**
+ * — for sign-in and Drive access. Subject to
+ */
+ thirdPartyGoogleDetail: () => LocalizedString
+ /**
+ * Google's Privacy Policy
+ */
+ googlePrivacyPolicy: () => LocalizedString
+ /**
+ * Amazon Web Services (SES)
+ */
+ thirdPartyAws: () => LocalizedString
+ /**
+ * — to deliver transactional emails. AWS processes recipient email addresses solely for delivery.
+ */
+ thirdPartyAwsDetail: () => LocalizedString
+ /**
+ * Rollbar
+ */
+ thirdPartyRollbar: () => LocalizedString
+ /**
+ * — for error monitoring. Receives error messages and stack traces only; no user PII is intentionally sent.
+ */
+ thirdPartyRollbarDetail: () => LocalizedString
+ /**
+ * 5. How we protect your data
+ */
+ section5Title: () => LocalizedString
+ /**
+ * Passwords are stored encrypted and can never be read back.
+ */
+ protectPassword: () => LocalizedString
+ /**
+ * OAuth tokens are encrypted at rest on our servers.
+ */
+ protectOAuth: () => LocalizedString
+ /**
+ * Session cookies are secured and signed.
+ */
+ protectCookies: () => LocalizedString
+ /**
+ * Email addresses are not stored in application logs.
+ */
+ protectLogs: () => LocalizedString
+ /**
+ * All communication is over HTTPS in production.
+ */
+ protectHttps: () => LocalizedString
+ /**
+ * 6. Your rights
+ */
+ section6Title: () => LocalizedString
+ /**
+ * From your profile page you can:
+ */
+ rightsIntro: () => LocalizedString
+ /**
+ * Access
+ */
+ rightAccess: () => LocalizedString
+ /**
+ * — download all personal data we hold about you as a JSON file.
+ */
+ rightAccessDetail: () => LocalizedString
+ /**
+ * Rectify
+ */
+ rightRectify: () => LocalizedString
+ /**
+ * — update your name and profile picture.
+ */
+ rightRectifyDetail: () => LocalizedString
+ /**
+ * Delete
+ */
+ rightDelete: () => LocalizedString
+ /**
+ * — permanently delete your account and all associated data (sessions, OAuth tokens, tenant memberships, verification tokens). This action is irreversible.
+ */
+ rightDeleteDetail: () => LocalizedString
+ /**
+ * Withdraw consent
+ */
+ rightWithdraw: () => LocalizedString
+ /**
+ * — by deleting your account.
+ */
+ rightWithdrawDetail: () => LocalizedString
+ /**
+ * All data subject actions are recorded in an internal audit log.
+ */
+ rightsAuditNote: () => LocalizedString
+ /**
+ * 7. Data retention
+ */
+ section7Title: () => LocalizedString
+ /**
+ * Account data is kept for as long as your account exists.
+ */
+ retainAccount: () => LocalizedString
+ /**
+ * Sessions expire after 7 days.
+ */
+ retainSessions: () => LocalizedString
+ /**
+ * Verification tokens (email, OTP, password reset) are automatically purged after expiry.
+ */
+ retainVerification: () => LocalizedString
+ /**
+ * When you delete your account, all personal data is permanently removed. GDPR audit log entries (which contain only your user ID and action type) are retained for legal accountability.
+ */
+ retainDeletion: () => LocalizedString
+ /**
+ * 8. Contact
+ */
+ section8Title: () => LocalizedString
+ /**
+ * For privacy-related questions or requests, email us at
+ */
+ contactText: () => LocalizedString
+ }
+}
-export type Formatters = {};
+export type Formatters = {}
diff --git a/apps/web/i18n/i18n-util.async.ts b/apps/web/i18n/i18n-util.async.ts
index c32d679..435644d 100644
--- a/apps/web/i18n/i18n-util.async.ts
+++ b/apps/web/i18n/i18n-util.async.ts
@@ -1,32 +1,27 @@
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
+/* eslint-disable */
-import { initFormatters } from "./formatters";
-import type { Locales, Translations } from "./i18n-types";
-import { loadedFormatters, loadedLocales, locales } from "./i18n-util";
+import { initFormatters } from './formatters'
+import type { Locales, Translations } from './i18n-types'
+import { loadedFormatters, loadedLocales, locales } from './i18n-util'
const localeTranslationLoaders = {
- en: () => import("./en"),
- nl: () => import("./nl"),
-};
+ en: () => import('./en'),
+ nl: () => import('./nl'),
+}
-const updateDictionary = (
- locale: Locales,
- dictionary: Partial,
-): Translations =>
- (loadedLocales[locale] = { ...loadedLocales[locale], ...dictionary });
+const updateDictionary = (locale: Locales, dictionary: Partial): Translations =>
+ loadedLocales[locale] = { ...loadedLocales[locale], ...dictionary }
-export const importLocaleAsync = async (
- locale: Locales,
-): Promise =>
- (await localeTranslationLoaders[locale]()).default as unknown as Translations;
+export const importLocaleAsync = async (locale: Locales): Promise =>
+ (await localeTranslationLoaders[locale]()).default as unknown as Translations
export const loadLocaleAsync = async (locale: Locales): Promise => {
- updateDictionary(locale, await importLocaleAsync(locale));
- loadFormatters(locale);
-};
+ updateDictionary(locale, await importLocaleAsync(locale))
+ loadFormatters(locale)
+}
-export const loadAllLocalesAsync = (): Promise =>
- Promise.all(locales.map(loadLocaleAsync));
+export const loadAllLocalesAsync = (): Promise => Promise.all(locales.map(loadLocaleAsync))
export const loadFormatters = (locale: Locales): void =>
- void (loadedFormatters[locale] = initFormatters(locale));
+ void (loadedFormatters[locale] = initFormatters(locale))
diff --git a/apps/web/i18n/i18n-util.sync.ts b/apps/web/i18n/i18n-util.sync.ts
index 0048d21..a46617a 100644
--- a/apps/web/i18n/i18n-util.sync.ts
+++ b/apps/web/i18n/i18n-util.sync.ts
@@ -1,25 +1,26 @@
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
+/* eslint-disable */
-import { initFormatters } from "./formatters";
-import type { Locales, Translations } from "./i18n-types";
-import { loadedFormatters, loadedLocales, locales } from "./i18n-util";
+import { initFormatters } from './formatters'
+import type { Locales, Translations } from './i18n-types'
+import { loadedFormatters, loadedLocales, locales } from './i18n-util'
-import en from "./en";
-import nl from "./nl";
+import en from './en'
+import nl from './nl'
const localeTranslations = {
- en,
- nl,
-};
+ en,
+ nl,
+}
export const loadLocale = (locale: Locales): void => {
- if (loadedLocales[locale]) return;
+ if (loadedLocales[locale]) return
- loadedLocales[locale] = localeTranslations[locale] as unknown as Translations;
- loadFormatters(locale);
-};
+ loadedLocales[locale] = localeTranslations[locale] as unknown as Translations
+ loadFormatters(locale)
+}
-export const loadAllLocales = (): void => locales.forEach(loadLocale);
+export const loadAllLocales = (): void => locales.forEach(loadLocale)
export const loadFormatters = (locale: Locales): void =>
- void (loadedFormatters[locale] = initFormatters(locale));
+ void (loadedFormatters[locale] = initFormatters(locale))
diff --git a/apps/web/i18n/i18n-util.ts b/apps/web/i18n/i18n-util.ts
index 4b15f60..76699b5 100644
--- a/apps/web/i18n/i18n-util.ts
+++ b/apps/web/i18n/i18n-util.ts
@@ -1,62 +1,38 @@
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
+/* eslint-disable */
-import {
- i18n as initI18n,
- i18nObject as initI18nObject,
- i18nString as initI18nString,
-} from "typesafe-i18n";
-import type { LocaleDetector } from "typesafe-i18n/detectors";
-import type {
- LocaleTranslationFunctions,
- TranslateByString,
-} from "typesafe-i18n";
-import { detectLocale as detectLocaleFn } from "typesafe-i18n/detectors";
-import { initExtendDictionary } from "typesafe-i18n/utils";
-import type {
- Formatters,
- Locales,
- Translations,
- TranslationFunctions,
-} from "./i18n-types";
-
-export const baseLocale: Locales = "en";
-
-export const locales: Locales[] = ["en", "nl"];
-
-export const isLocale = (locale: string): locale is Locales =>
- locales.includes(locale as Locales);
-
-export const loadedLocales: Record = {} as Record<
- Locales,
- Translations
->;
-
-export const loadedFormatters: Record = {} as Record<
- Locales,
- Formatters
->;
-
-export const extendDictionary = initExtendDictionary();
-
-export const i18nString = (locale: Locales): TranslateByString =>
- initI18nString(locale, loadedFormatters[locale]);
+import { i18n as initI18n, i18nObject as initI18nObject, i18nString as initI18nString } from 'typesafe-i18n'
+import type { LocaleDetector } from 'typesafe-i18n/detectors'
+import type { LocaleTranslationFunctions, TranslateByString } from 'typesafe-i18n'
+import { detectLocale as detectLocaleFn } from 'typesafe-i18n/detectors'
+import { initExtendDictionary } from 'typesafe-i18n/utils'
+import type { Formatters, Locales, Translations, TranslationFunctions } from './i18n-types'
+
+export const baseLocale: Locales = 'en'
+
+export const locales: Locales[] = [
+ 'en',
+ 'nl'
+]
+
+export const isLocale = (locale: string): locale is Locales => locales.includes(locale as Locales)
+
+export const loadedLocales: Record = {} as Record
+
+export const loadedFormatters: Record = {} as Record
+
+export const extendDictionary = initExtendDictionary()
+
+export const i18nString = (locale: Locales): TranslateByString => initI18nString(locale, loadedFormatters[locale])
export const i18nObject = (locale: Locales): TranslationFunctions =>
- initI18nObject(
- locale,
- loadedLocales[locale],
- loadedFormatters[locale],
- );
-
-export const i18n = (): LocaleTranslationFunctions<
- Locales,
- Translations,
- TranslationFunctions
-> =>
- initI18n(
- loadedLocales,
- loadedFormatters,
- );
-
-export const detectLocale = (...detectors: LocaleDetector[]): Locales =>
- detectLocaleFn(baseLocale, locales, ...detectors);
+ initI18nObject(
+ locale,
+ loadedLocales[locale],
+ loadedFormatters[locale]
+ )
+
+export const i18n = (): LocaleTranslationFunctions =>
+ initI18n(loadedLocales, loadedFormatters)
+
+export const detectLocale = (...detectors: LocaleDetector[]): Locales => detectLocaleFn(baseLocale, locales, ...detectors)
diff --git a/apps/web/i18n/nl/index.ts b/apps/web/i18n/nl/index.ts
index 8c00cb6..bf21e23 100644
--- a/apps/web/i18n/nl/index.ts
+++ b/apps/web/i18n/nl/index.ts
@@ -21,6 +21,8 @@ const nl = {
delete: "Verwijderen",
loadingItems: "Items laden...",
noItemsYet: "Nog geen items. Voeg er een toe om te beginnen!",
+ gotIt: "Begrepen",
+ learnMore: "Meer informatie",
itemCount: "{count} {{Item|Items}}",
itemCountGlobal: "{count} {{Item|Items}} (globaal)",
},
@@ -56,6 +58,30 @@ const nl = {
"Test authenticatie met Better Auth. OAuth-integratie met Google, sessiebeheer en beveiligde routes.",
tryItOut: "Probeer het",
footer: "Gebouwd met moderne tools voor snelle ontwikkeling",
+ heroTitle: "BE: Tech Stack",
+ heroDescription:
+ "Full-stack boilerplate met multi-tenancy, authenticatie en CRUD-operaties. Ontdek hieronder de datagrids en grafiekmogelijkheden.",
+ viewGrids: "Grids bekijken",
+ viewCharts: "Grafieken bekijken",
+ featureHighlights: "Functie-highlights",
+ totalRecords: "Totaal records",
+ activeTenants: "Actieve tenants",
+ users: "Gebruikers",
+ apiEndpoints: "API-eindpunten",
+ stable: "stabiel",
+ powerfulDataGrids: "Krachtige datagrids",
+ powerfulDataGridsDesc:
+ "Bewerkbare, sorteerbare, filterbare tabellen voor al je gegevens. CRUD-operaties, bulkacties, geneste rijen en multi-selectie — aangedreven door TanStack Table.",
+ richVisualizations: "Rijke visualisaties",
+ richVisualizationsDesc:
+ "10+ grafiektypes aangedreven door Plotly.js met WebGL-ondersteuning. Lijn, staaf, scatter, 3D-oppervlakken, heatmaps en meer — allemaal interactief en responsief.",
+ multiTenantReady: "Multi-tenant gereed",
+ multiTenantReadyDesc:
+ "CRUD-operaties per tenant met rolgebaseerde lees-/schrijfcontrole. Beheer tenants, leden en rechten vanuit één dashboard.",
+ tenantDashboard: "Tenant Dashboard",
+ tenantDashboardDesc: "Beheer platformtenants en abonnementen",
+ manageMembersQuickDesc:
+ "Voeg leden toe, verwijder ze en beheer tenantledrol",
},
Auth: {
signIn: "Inloggen",
@@ -122,6 +148,16 @@ const nl = {
verificationEmailSent: "Verificatie-e-mail verzonden! Controleer je inbox.",
passwordMinChars:
"Minimaal 8 tekens met hoofdletter, kleine letter, cijfer en speciaal teken.",
+ consentText:
+ "Ik ga akkoord met de verwerking van mijn persoonlijke gegevens zoals beschreven in het",
+ consentSuffix:
+ ". Je kunt je toestemming op elk moment intrekken door je account te verwijderen.",
+ consentRequired:
+ "Je moet toestemming geven voor gegevensverwerking om een account aan te maken",
+ signInConsentPrefix: "Door in te loggen ga je akkoord met ons",
+ signInConsentSuffix:
+ "en stem je in met de verwerking van je persoonlijke gegevens.",
+ userId: "Gebruikers-ID",
},
Dashboard: {
platformTenantsTitle: "Platform Tenants",
@@ -190,6 +226,33 @@ const nl = {
removeMember: "Lid verwijderen",
selectTenantPrompt:
"Selecteer een tenant uit de lijst om de leden te beheren.",
+ editProfile: "Profiel bewerken",
+ editName: "Naam bewerken",
+ fullName: "Volledige naam",
+ fullNamePlaceholder: "Je volledige naam",
+ nameHint:
+ "2-100 tekens. Alleen letters, spaties, koppeltekens en apostrofs.",
+ nameUpdated: "Naam succesvol bijgewerkt",
+ failedUpdateName: "Naam bijwerken mislukt",
+ dataAndPrivacy: "Gegevens & Privacy",
+ dataPrivacyDescription:
+ "Je hebt het recht om je persoonlijke gegevens op elk moment in te zien, te exporteren en te verwijderen. Lees ons",
+ privacyAndDataPolicy: "Privacy- & Gegevensbeleid",
+ downloadMyData: "Mijn gegevens downloaden",
+ downloadMyDataDescription:
+ "Exporteer al je persoonlijke gegevens als een JSON-bestand",
+ preparingExport: "Export voorbereiden...",
+ downloaded: "Gedownload",
+ download: "Downloaden",
+ deleteAccount: "Account verwijderen",
+ deleteAccountDescription:
+ "Verwijder je account en alle bijbehorende gegevens permanent",
+ deleteConfirmPrefix: "Deze actie is onomkeerbaar. Typ je e-mailadres",
+ deleteConfirmSuffix: "ter bevestiging.",
+ typeEmailToConfirm: "Typ je e-mail ter bevestiging",
+ deleting: "Verwijderen...",
+ permanentlyDeleteAccount: "Account permanent verwijderen",
+ failedDeleteAccount: "Account verwijderen mislukt",
},
Forms: {
email: "E-mail",
@@ -252,6 +315,333 @@ const nl = {
loadingYourTenants: "Je tenants laden...",
settingUpTenant: "Je tenant instellen...",
},
+ Sidebar: {
+ navigation: "Navigatie",
+ sectionMain: "Hoofd",
+ sectionData: "Gegevens",
+ sectionPlatform: "Platform",
+ sectionAccount: "Account",
+ home: "Home",
+ crudDemo: "CRUD Demo",
+ globalCrudDemo: "Globale CRUD Demo",
+ grids: "Grids",
+ charts: "Grafieken",
+ tenantDashboard: "Tenant Dashboard",
+ tenantMembers: "Tenantleden",
+ profile: "Profiel",
+ crudRecords: "Crud Records",
+ globalCrudRecords: "Globale Crud Records",
+ editablePeople: "Bewerkbare personen (Demo)",
+ batchOps: "Bulkoperaties (Demo)",
+ tenantsDemo: "Tenants (Demo)",
+ metricsDemo: "Statistieken (Demo)",
+ tasksDemo: "Taken (Demo)",
+ overviewCharts: "Overzichtsgrafieken",
+ timeSeries: "Tijdreeksen",
+ distributionCharts: "Verdelingsgrafieken",
+ comparativeCharts: "Vergelijkende grafieken",
+ threeDAdvanced: "3D & Geavanceerd",
+ },
+ Grids: {
+ title: "Datagrids",
+ descriptionPrefix:
+ "Grid-scenario's aangedreven door TanStack Table v8. Grids gemarkeerd met",
+ demo: "Demo",
+ descriptionMiddle:
+ "gebruiken illustratieve voorbeelddata. Grids gemarkeerd met",
+ live: "Live",
+ descriptionSuffix: "halen echte data op van de API.",
+ tabCrudRecords: "Crud Records",
+ tabGlobalCrudRecords: "Globale Crud Records",
+ tabEditablePeople: "Bewerkbare personen (Demo)",
+ tabBatchOps: "Bulkoperaties (Demo)",
+ tabTenants: "Tenants (Demo)",
+ tabMetrics: "Statistieken (Demo)",
+ tabTasks: "Taken (Demo)",
+ descCrudLive:
+ "Live alleen-lezen weergave van Crud-records opgehaald via de API (Prisma). Weerspiegelt de werkelijke databasestatus.",
+ descGlobalCrudLive:
+ "Live alleen-lezen weergave van Globale Crud-records opgehaald via de API (Prisma). Geen tenant-scoping.",
+ descCrud:
+ "Demo: Bewerkbaar grid met in-memory data gemodelleerd naar de Crud-entiteitvorm.",
+ descGlobalCrud:
+ "Demo: Bulkoperaties met rijselectie, multi-sort en batchacties op in-memory data.",
+ descTenants:
+ "Demo: Tenantbeheerweergave gegroepeerd per plan met uitklapbare subrijen.",
+ descReadOnly:
+ "Demo: Alleen-lezen analysestatistieken. Illustratieve voorbeelddata, niet van een live API.",
+ descAdvanced:
+ "Demo: Rijke celweergaven met tags, avatars, prioriteitspictogrammen en uitklapbare details.",
+ colId: "ID",
+ colContent: "Inhoud",
+ colCreatedAt: "Aangemaakt op",
+ colUpdatedAt: "Bijgewerkt op",
+ colFirstName: "Voornaam",
+ colLastName: "Achternaam",
+ colEmail: "E-mail",
+ colRole: "Rol",
+ colStatus: "Status",
+ colCreated: "Aangemaakt",
+ colTenantName: "Tenantnaam",
+ colPlan: "Plan",
+ colUsers: "Gebruikers",
+ colStorage: "Opslag",
+ colRegion: "Regio",
+ colMetric: "Metriek",
+ colValue: "Waarde",
+ colChange: "Wijziging",
+ colPeriod: "Periode",
+ colCategory: "Categorie",
+ colTask: "Taak",
+ colTags: "Tags",
+ colAssignedTo: "Toegewezen aan",
+ colPriority: "Prioriteit",
+ colDueDate: "Vervaldatum",
+ colCompleted: "Voltooid",
+ roleAdmin: "Beheerder",
+ roleUser: "Gebruiker",
+ roleEditor: "Redacteur",
+ roleViewer: "Kijker",
+ statusActive: "Actief",
+ statusInactive: "Inactief",
+ statusSuspended: "Opgeschort",
+ statusTrial: "Proef",
+ planFree: "Gratis",
+ planPro: "Pro",
+ planEnterprise: "Enterprise",
+ livePrisma: "Live — Prisma",
+ recordCount: "{count} record{{s|}}",
+ loadingCrudRecords: "Crud-records laden…",
+ loadingGlobalCrudRecords: "Globale Crud-records laden…",
+ failedToLoad: "Laden mislukt: {message}",
+ demoInMemory: "Demo — in-memory data",
+ demoDummyData: "Demo — voorbeelddata",
+ demoDummyDataCount: "Demo — voorbeelddata ({count} records)",
+ unsavedChanges: "Niet-opgeslagen wijzigingen",
+ addRow: "Rij toevoegen",
+ selectedCount: "{count} geselecteerd",
+ deleteSelected: "Selectie verwijderen",
+ export: "Exporteren",
+ changeStatus: "Status wijzigen",
+ usersIn: "Gebruikers in {name}",
+ userN: "Gebruiker {n}",
+ moreUsers: "+{count} meer",
+ done: "Gereed",
+ open: "Open",
+ assignedToLabel: "Toegewezen aan {name}",
+ priorityLabel: "Prioriteit: {value}",
+ dueLabel: "Vervaldatum: {date}",
+ overdue: "VERLOPEN",
+ },
+ Charts: {
+ title: "Grafieken & Visualisaties",
+ description:
+ "12+ grafiektypes aangedreven door Plotly.js met WebGL-ondersteuning. Alle grafieken zijn interactief — zoom, pan en hover voor details.",
+ navLineArea: "Lijn & Vlak",
+ navBarColumn: "Staaf & Kolom",
+ navPieDonut: "Taart, Donut & Sunburst",
+ navScatterBubble: "Scatter & Bubbel",
+ navStatistical: "Statistisch",
+ navHeatmapTimeline: "Heatmap & Tijdlijn",
+ nav3dCharts: "3D-grafieken",
+ navMixedCombo: "Gemengd / Combo",
+ navPlotlyTable: "Plotly-tabel",
+ lineAreaCharts: "Lijn- & vlakgrafieken",
+ barColumnCharts: "Staaf- & kolomgrafieken",
+ pieDonutSunburst: "Taart, Donut & Sunburst",
+ scatterBubbleCharts: "Scatter- & bubbelgrafieken",
+ statisticalCharts: "Statistische grafieken",
+ heatmapTimeline: "Heatmap & Tijdlijn",
+ threeDChartsWebGL: "3D-grafieken (WebGL)",
+ mixedComboCharts: "Gemengde / Combografieken",
+ plotlyTable: "Plotly-tabel",
+ userGrowthTitle: "Gebruikersgroei in de tijd",
+ userGrowthDesc:
+ "24 maanden trend van nieuwe, actieve en afgehaakte gebruikers.",
+ newUsers: "Nieuwe gebruikers",
+ activeUsers: "Actieve gebruikers",
+ churnedUsers: "Afgehaakte gebruikers",
+ revenueBreakdownTitle: "Omzetverdeling per categorie",
+ revenueBreakdownDesc:
+ "Gestapeld vlak met abonnements-, add-on-, service- en overageomzet.",
+ subscriptions: "Abonnementen",
+ addOns: "Add-ons",
+ services: "Diensten",
+ overages: "Overschrijdingen",
+ mauByRegionTitle: "Maandelijks actieve gebruikers per regio",
+ mauByRegionDesc:
+ "Gegroepeerd staafdiagram met vier regio's over 12 maanden.",
+ usEast: "VS-Oost",
+ euWest: "EU-West",
+ apac: "APAC",
+ usWest: "VS-West",
+ featureUsageTitle: "Functiegebruik per tenantplan",
+ featureUsageDesc:
+ "Horizontaal gestapeld staafdiagram met functieadoptie per planlaag.",
+ auth: "Auth",
+ crud: "CRUD",
+ analytics: "Analyse",
+ api: "API",
+ multiTenant: "Multi-Tenant",
+ tenantPlanDistTitle: "Verdeling tenantplannen",
+ tenantPlanDistDesc:
+ "Donutgrafiek met de verdeling van tenants per planlaag.",
+ roleHierarchyTitle: "Gebruikersrolhiërarchie",
+ roleHierarchyDesc:
+ "Sunburstgrafiek met organisatiestructuur: Org > Afdeling > Rol.",
+ sessionScatterTitle: "Sessieduur vs. uitgevoerde acties",
+ sessionScatterDesc:
+ "Kleurgecodeerd per gebruikerslaag. Hover voor details.",
+ free: "Gratis",
+ pro: "Pro",
+ enterprise: "Enterprise",
+ durationMin: "Duur (min)",
+ actions: "Acties",
+ tenantBubbleTitle: "Tenantgrootte vs. gebruikte opslag",
+ tenantBubbleDesc: "Bubbelgrootte vertegenwoordigt maandelijkse omzet.",
+ revenueUsd: "Omzet ($)",
+ userCount: "Aantal gebruikers",
+ storageGb: "Opslag (GB)",
+ responseTimeTitle: "Responstijdverdeling per service",
+ responseTimeDesc: "Boxplot met latentiespreiding over vijf API-services.",
+ responseTimeMs: "Responstijd (ms)",
+ sessionLengthTitle: "Verdeling sessielengte",
+ sessionLengthDesc: "Histogram gegroepeerd per minuutintervallen.",
+ sessionLengthMin: "Sessielengte (min)",
+ count: "Aantal",
+ activityHeatmapTitle: "Activiteit per uur en dag van de week",
+ activityHeatmapDesc:
+ "7x24 heatmap met eventdichtheid. Viridis-kleurenschaal.",
+ ganttTitle: "Tenant-onboardingtijdlijn",
+ ganttDesc:
+ "Gantt-achtig horizontaal staafdiagram met start- en einddatums van onboarding.",
+ engagement3dTitle: "3D Gebruikersbetrokkenheidsclustering",
+ engagement3dDesc:
+ "WebGL-gerenderde 3D-scatter: sessies x gem. duur x omzet, gekleurd per clusterlaag.",
+ low: "Laag",
+ medium: "Gemiddeld",
+ high: "Hoog",
+ sessions: "Sessies",
+ avgDuration: "Gem. duur",
+ surfaceTitle: "Omzetoppervlak: Tijd x Regio",
+ surfaceDesc:
+ "Volledige 3D-rotatie — sleep om te verkennen. Portland-kleurenschaal.",
+ month: "Maand",
+ region: "Regio",
+ revenueK: "Omzet ($K)",
+ comboTitle: "Omzet vs. gebruikersgroei",
+ comboDesc:
+ "Staafdiagram (omzet) met lijnoverlay (aantal gebruikers) op secundaire y-as.",
+ waterfallTitle: "MRR-beweging dit kwartaal",
+ waterfallDesc:
+ "Watervalgrafiek met nieuwe business, uitbreiding, churn en netto MRR.",
+ mrrUsd: "MRR ($)",
+ plotlyTableTitle: "Top 10 Tenants — Plotly-tabeltrace",
+ plotlyTableDesc:
+ "Dit is een Plotly-trace, geen TanStack Table — vergelijk de twee op de Grids-pagina.",
+ },
+ CookieBanner: {
+ text: "Deze site gebruikt essentiële cookies om je ingelogd te houden. Geen tracking- of advertentiecookies.",
+ learnMore: "Meer informatie",
+ gotIt: "Begrepen",
+ },
+ Privacy: {
+ title: "Privacy- & Gegevensbeleid",
+ lastUpdated: "Laatst bijgewerkt: 20 februari 2026",
+ section1Title: "1. Welke gegevens we verzamelen",
+ section1Intro: "Wanneer je een account aanmaakt, slaan we op:",
+ collectName: "Naam en e-mail",
+ collectNameDetail: "— door jou of je Google-account verstrekt.",
+ collectImage: "Profielfoto-URL",
+ collectImageDetail: "— van Google als je inlogt met Google.",
+ collectPassword: "Wachtwoord",
+ collectPasswordDetail:
+ "— als je e-mail/wachtwoord-inlog gebruikt. Versleuteld opgeslagen; we zien of bewaren het nooit als platte tekst.",
+ collectOAuth: "OAuth-tokens",
+ collectOAuthDetail:
+ "— als je inlogt met Google. Versleuteld opgeslagen. Gebruikt om je Google-sessie te onderhouden en Google Drive namens jou te openen als je die rechten hebt verleend.",
+ collectIp: "IP-adres en user agent",
+ collectIpDetail:
+ "— vastgelegd per sessie voor beveiligings- en auditdoeleinden.",
+ collectConsent: "Toestemmingstijdstempel en IP",
+ collectConsentDetail:
+ "— vastgelegd wanneer je akkoord gaat met dit beleid.",
+ section2Title: "2. Hoe we je gegevens gebruiken",
+ useAuth: "Authenticatie",
+ useAuthDetail:
+ "— om je in te loggen, je e-mail te verifiëren en je sessies te beheren.",
+ useAccount: "Accountbeheer",
+ useAccountDetail:
+ "— om je profiel weer te geven en je deze te laten bijwerken of verwijderen.",
+ useEmail: "Transactionele e-mails",
+ useEmailDetail:
+ "— om OTP's, verificatielinks en wachtwoord-resetlinks te verzenden. We sturen nooit marketing-e-mail.",
+ useSecurity: "Beveiliging",
+ useSecurityDetail:
+ "— om verdachte activiteit te detecteren en auditlogboeken bij te houden.",
+ useDrive: "Google Drive",
+ useDriveDetail:
+ "— als je Drive-machtigingen hebt verleend, om bestanden in je Drive namens jou te lezen of aan te maken. We openen Drive niet zonder je expliciete toestemming.",
+ noSellData:
+ "We verkopen, delen of verhuren je persoonlijke gegevens niet aan derden. We gebruiken je gegevens niet voor reclame of profilering.",
+ section3Title: "3. Cookies",
+ cookiesIntro: "We gebruiken",
+ cookiesIntroStrict: "alleen strikt noodzakelijke cookies",
+ cookiesIntroSuffix: ". Geen analyse-, advertentie- of trackingcookies.",
+ cookieHeader: "Cookie",
+ purposeHeader: "Doel",
+ expiryHeader: "Vervaldatum",
+ cookieSessionToken: "Sessietoken",
+ cookieSessionPurpose: "Houdt je ingelogd bij herhaalde bezoeken",
+ cookieSessionExpiry: "7 dagen",
+ cookieOAuthState: "OAuth-status",
+ cookieOAuthPurpose:
+ "Tijdelijk token om de Google-inlogstroom te beveiligen",
+ cookieOAuthExpiry: "3 dagen",
+ cookiesFootnote:
+ "Deze cookies zijn vereist voor het functioneren van de applicatie. Ze kunnen niet worden gebruikt om je op andere websites te volgen.",
+ section4Title: "4. Diensten van derden",
+ thirdPartyGoogle: "Google (OAuth)",
+ thirdPartyGoogleDetail: "— voor inloggen en Drive-toegang. Onderworpen aan",
+ googlePrivacyPolicy: "Google's Privacybeleid",
+ thirdPartyAws: "Amazon Web Services (SES)",
+ thirdPartyAwsDetail:
+ "— voor het bezorgen van transactionele e-mails. AWS verwerkt e-mailadressen van ontvangers uitsluitend voor bezorging.",
+ thirdPartyRollbar: "Rollbar",
+ thirdPartyRollbarDetail:
+ "— voor foutmonitoring. Ontvangt alleen foutmeldingen en stacktraces; er wordt geen gebruikers-PII opzettelijk verzonden.",
+ section5Title: "5. Hoe we je gegevens beschermen",
+ protectPassword:
+ "Wachtwoorden worden versleuteld opgeslagen en kunnen nooit worden teruggelezen.",
+ protectOAuth: "OAuth-tokens worden versleuteld opgeslagen op onze servers.",
+ protectCookies: "Sessiecookies zijn beveiligd en ondertekend.",
+ protectLogs:
+ "E-mailadressen worden niet opgeslagen in applicatielogboeken.",
+ protectHttps: "Alle communicatie verloopt via HTTPS in productie.",
+ section6Title: "6. Je rechten",
+ rightsIntro: "Vanuit je profielpagina kun je:",
+ rightAccess: "Inzien",
+ rightAccessDetail:
+ "— download alle persoonlijke gegevens die we over je bewaren als een JSON-bestand.",
+ rightRectify: "Rectificeren",
+ rightRectifyDetail: "— werk je naam en profielfoto bij.",
+ rightDelete: "Verwijderen",
+ rightDeleteDetail:
+ "— verwijder permanent je account en alle bijbehorende gegevens (sessies, OAuth-tokens, tenantlidmaatschappen, verificatietokens). Deze actie is onomkeerbaar.",
+ rightWithdraw: "Toestemming intrekken",
+ rightWithdrawDetail: "— door je account te verwijderen.",
+ rightsAuditNote:
+ "Alle acties van betrokkenen worden vastgelegd in een intern auditlogboek.",
+ section7Title: "7. Gegevensbewaring",
+ retainAccount: "Accountgegevens worden bewaard zolang je account bestaat.",
+ retainSessions: "Sessies verlopen na 7 dagen.",
+ retainVerification:
+ "Verificatietokens (e-mail, OTP, wachtwoord-reset) worden automatisch verwijderd na vervaldatum.",
+ retainDeletion:
+ "Wanneer je je account verwijdert, worden alle persoonlijke gegevens permanent verwijderd. GDPR-auditlogvermeldingen (die alleen je gebruikers-ID en actietype bevatten) worden bewaard voor juridische verantwoording.",
+ section8Title: "8. Contact",
+ contactText: "Voor privacygerelateerde vragen of verzoeken, e-mail ons op",
+ },
} satisfies Translation;
export default nl;