700 lines
36 KiB
JSON
700 lines
36 KiB
JSON
{
|
|
"common": {
|
|
"appName": "PieCed",
|
|
"tagline": "AI Platform",
|
|
"login": "Sign In",
|
|
"logout": "Sign Out",
|
|
"dashboard": "Dashboard",
|
|
"admin": "Admin",
|
|
"loading": "Loading…",
|
|
"language": "Language",
|
|
"cancel": "Cancel",
|
|
"save": "Save",
|
|
"error": "An error occurred",
|
|
"register": "Register",
|
|
"team": "Team",
|
|
"settings": "Settings",
|
|
"optional": "optional",
|
|
"support": "Support"
|
|
},
|
|
"login": {
|
|
"title": "PieCed Portal",
|
|
"subtitle": "Sign in to manage your AI assistant",
|
|
"button": "Continue with ZITADEL",
|
|
"footer": "Hosted on-premises in Switzerland",
|
|
"noAccount": "No account yet?",
|
|
"register": "Create an account"
|
|
},
|
|
"register": {
|
|
"title": "Create your account",
|
|
"subtitle": "Set up your Swiss-hosted AI assistant",
|
|
"companyName": "Company Name",
|
|
"companyNamePlaceholder": "Acme GmbH",
|
|
"givenName": "First Name",
|
|
"familyName": "Last Name",
|
|
"email": "Email Address",
|
|
"submit": "Register",
|
|
"hasAccount": "Already have an account?",
|
|
"footer": "Your data is hosted exclusively on-premises in Switzerland.",
|
|
"successTitle": "Registration received",
|
|
"successDescription": "You will receive an invitation email with a link to set your password and verify your email address. Once completed, you can sign in to set up your AI assistant.",
|
|
"goToLogin": "Go to Sign In",
|
|
"duplicateDomain": "An account for the email domain {domain} is already registered. Please contact your company administrator to be invited, or reach out to PieCed IT support if you believe this is in error.",
|
|
"individualToggle": "Register as an individual",
|
|
"individualHint": "Tick this if you're not registering on behalf of a company. Your account will be set up as a personal workspace.",
|
|
"accountTypeLabel": "Account type",
|
|
"personalCardTitle": "Personal",
|
|
"personalCardDescription": "For yourself.",
|
|
"companyCardTitle": "Company",
|
|
"companyCardDescription": "For your business or team."
|
|
},
|
|
"onboarding": {
|
|
"loading": "Loading status…",
|
|
"welcomeTitle": "Set up your AI assistant",
|
|
"welcomeDescription": "In a few steps, you'll have your own AI assistant — hosted exclusively in Switzerland, fully under your control.",
|
|
"welcomeFeature_swissHosted": "Hosted on-premises in Switzerland — your data never leaves the country",
|
|
"welcomeFeature_privacy": "No data shared with third parties — complete privacy",
|
|
"welcomeFeature_customizable": "Fully customizable personality, packages, and integrations",
|
|
"getStarted": "Get started",
|
|
"configureTitle": "Configure your assistant",
|
|
"configureDescription": "Give your assistant a name and personality. You can always change this later.",
|
|
"agentName": "Agent Name",
|
|
"soulMd": "Personality (SOUL.md)",
|
|
"soulMdHint": "This defines how your assistant behaves. Markdown format. You can edit this later.",
|
|
"agentsMd": "Agent Instructions (AGENTS.md)",
|
|
"agentsMdHint": "Defines what your assistant does on session start. Optional — defaults work well for most setups.",
|
|
"toolsMd": "Available Tools (TOOLS.md)",
|
|
"toolsMdHint": "Auto-generated based on your selected packages. This file is managed automatically.",
|
|
"advancedConfig": "Advanced Configuration",
|
|
"packages": "Packages",
|
|
"packagesHint": "Optional integrations. Packages requiring credentials will ask for them inline. You can also enable these later.",
|
|
"billingTitle": "Billing information",
|
|
"billingDescription": "We need your billing address to set up invoicing. A payment provider will be integrated in the future.",
|
|
"billingCompany": "Company",
|
|
"billingStreet": "Street",
|
|
"billingPostalCode": "Postal Code",
|
|
"billingCity": "City",
|
|
"billingCountry": "Country",
|
|
"billingNotes": "Notes",
|
|
"billingNotesPlaceholder": "Any notes about billing (PO number, VAT ID, preferred payment method, etc.)",
|
|
"confirmTitle": "Review & submit",
|
|
"confirmDescription": "Please review your setup. Your request will be reviewed by our team before provisioning.",
|
|
"confirmNote": "After submission, our team will review your request and billing details. You'll receive access once approved — typically within one business day.",
|
|
"credentialsProvided": "Credentials provided",
|
|
"submitRequest": "Submit request",
|
|
"back": "Back",
|
|
"next": "Next",
|
|
"pendingTitle": "Request submitted",
|
|
"pendingDescription": "Your onboarding request has been submitted and is awaiting review by our team. You'll receive access once approved — typically within one business day.",
|
|
"rejectedTitle": "Request not approved",
|
|
"rejectedDescription": "Unfortunately, your onboarding request was not approved. Please contact us for more information.",
|
|
"provisioningTitle": "Setting up your instance",
|
|
"provisioningDescription": "Your AI assistant is being provisioned. This usually takes a few minutes.",
|
|
"phase": "Phase",
|
|
"readyTitle": "Your assistant is ready!",
|
|
"readyDescription": "Your AI assistant has been provisioned and is running. You can now manage it from the dashboard.",
|
|
"goToDashboard": "Go to Dashboard",
|
|
"submittedAt": "Submitted",
|
|
"instanceName": "Instance name",
|
|
"instanceNamePlaceholder": "e.g. Production, Dev, Sales",
|
|
"instanceNameHint": "Optional human-readable name to distinguish this instance from others on your dashboard. Leave blank to use your company name.",
|
|
"validationError": "Please fix the errors before submitting.",
|
|
"validationErrorsTitle": "Some required fields are missing or invalid:",
|
|
"reviewInstanceDefault": "(default — uses company name)",
|
|
"reviewNoPackages": "None selected",
|
|
"reviewBillingTo": "Billing to",
|
|
"reviewContactEmail": "Contact email",
|
|
"editRequestTitle": "Edit your request",
|
|
"editRequestDescription": "Adjust the configuration before our team reviews it.",
|
|
"editRequest": "Edit",
|
|
"cancelRequest": "Cancel request",
|
|
"cancelRequestConfirm": "Yes, cancel request",
|
|
"cancelConfirmRequestTitle": "Cancel this request?",
|
|
"cancelConfirmRequestDescription": "Your pending request will be marked as cancelled and removed from the review queue. You can submit a new request at any time.",
|
|
"cancelFailed": "Could not cancel request.",
|
|
"cancelledTitle": "Request cancelled",
|
|
"cancelledDescription": "You cancelled this request before it was processed. No instance was created.",
|
|
"dismiss": "Dismiss",
|
|
"dismissFailed": "Could not dismiss.",
|
|
"rejectionReason": "Reason given",
|
|
"saveChanges": "Save changes",
|
|
"billingVatNumber": "VAT number",
|
|
"billingVatHelp": "Your registered VAT identifier. If your company is VAT-exempt, leave blank and explain in the notes field.",
|
|
"billingNotesPlaceholderPersonal": "Anything we should know — preferred payment method, billing reference, etc."
|
|
},
|
|
"dashboard": {
|
|
"title": "Dashboard",
|
|
"welcome": "Welcome back, {name}",
|
|
"instanceStatus": "Instance Status",
|
|
"usage": "Usage",
|
|
"packages": "Packages",
|
|
"noInstance": "No instance provisioned yet.",
|
|
"comingSoon": "Detailed view coming in Session 6.2",
|
|
"noInstanceDescription": "Set up your AI assistant instance to get started with PieCed IT.",
|
|
"manage": "Manage instance & packages",
|
|
"instances": "Your instances",
|
|
"inflightRequests": "In-flight requests",
|
|
"createInstance": "Create new instance",
|
|
"createInstanceDescription": "Provision an additional AI assistant instance for your organization. The request will be reviewed by an administrator before the instance is created.",
|
|
"noAccessNoInstances": "Your organization doesn't have any instances yet. Please ask the organization owner to set one up.",
|
|
"noAssignmentsTitle": "No instances assigned",
|
|
"noAssignmentsDescription": "Your organization has instances, but you haven't been granted access to any of them. Please ask your organization owner to assign you to an instance.",
|
|
"noInstancesYetTitle": "No instances yet",
|
|
"noInstancesYetDescription": "Your organization doesn't have any instances yet. Please ask your organization owner to set one up."
|
|
},
|
|
"tenantDetail": {
|
|
"agent": "Agent",
|
|
"packages": "Packages",
|
|
"workspaceFiles": "Workspace Files",
|
|
"notFound": "Tenant not found.",
|
|
"usage": "Usage & Spend",
|
|
"provisioned": "Provisioned",
|
|
"assignedUsers": "Assigned users",
|
|
"subscriptionTitle": "Subscription",
|
|
"subscriptionDescriptionActive": "Cancel your subscription if you no longer need this assistant. Your data will be preserved and you can resume anytime.",
|
|
"subscriptionDescriptionSuspended": "Your subscription is cancelled. Resume to bring the assistant back online.",
|
|
"cancelSubscription": "Cancel subscription",
|
|
"cancelSubscriptionConfirm": "Yes, cancel",
|
|
"resumeSubscription": "Resume subscription",
|
|
"cancelConfirmTitle": "Cancel this subscription?",
|
|
"cancelConfirmDescription": "Your assistant will become unavailable. You can resume anytime — your data is preserved.",
|
|
"cancelConfirmBullet1": "Workspace files (SOUL.md, AGENTS.md) are kept",
|
|
"cancelConfirmBullet2": "Package credentials remain stored",
|
|
"cancelConfirmBullet3": "Billing information is kept on file",
|
|
"subscriptionUpdateFailed": "Could not update subscription.",
|
|
"suspendedTitle": "Subscription cancelled",
|
|
"suspendedDescription": "Your assistant is paused. Configuration and data are preserved. Use the Resume control at the bottom of this page to bring it back online.",
|
|
"requestReactivation": "Request reactivation",
|
|
"requestReactivationConfirmTitle": "Request reactivation?",
|
|
"requestReactivationConfirmDescription": "An administrator will review your request and reactivate your tenant. You'll be notified by email once it's approved.",
|
|
"requestReactivationConfirm": "Submit request",
|
|
"cancelResumeRequest": "Cancel request",
|
|
"resumeRequestPendingTitle": "Reactivation request pending",
|
|
"resumeRequestPendingDescription": "Submitted {when}. An administrator will review it shortly.",
|
|
"resumeRequestPendingNoteAdmin": "An owner has requested reactivation; you can resume directly above or process the request from the admin queue.",
|
|
"cancelConfirmRetentionWarning": "Your data is preserved for 60 days after cancellation. After that, all tenant data — configuration, secrets, conversations, and files — will be permanently deleted.",
|
|
"suspendedSince": "Suspended on {date}",
|
|
"suspendedDeletionIn": "data deletion in {days, plural, one {# day} other {# days}} ({date})",
|
|
"suspendedDeletionImminent": "data is being deleted now",
|
|
"requestReactivationNoteLabel": "Note for our team",
|
|
"requestReactivationNotePlaceholder": "Anything our team should know — e.g. why you want to reactivate, urgency, etc."
|
|
},
|
|
"usage": {
|
|
"inputTokens": "Input Tokens",
|
|
"outputTokens": "Output Tokens",
|
|
"totalSpend": "Total Spend",
|
|
"totalCost": "Total Cost",
|
|
"budget": "Budget",
|
|
"noLimit": "No limit",
|
|
"last30Days": "Last 30 Days",
|
|
"noData": "No usage data available.",
|
|
"dailyBreakdown": "Daily Breakdown",
|
|
"requests": "requests",
|
|
"budgetEdit": "Edit",
|
|
"budgetEditTitle": "Set spending budget",
|
|
"budgetEditDescription": "Cap how much this tenant's assistants can spend before requests start being declined.",
|
|
"budgetModeUnlimited": "No limit",
|
|
"budgetModeUnlimitedDescription": "Spend as much as needed; no cap.",
|
|
"budgetModeCapped": "Set a cap",
|
|
"budgetModeCappedDescription": "Stop accepting requests once spend reaches this amount.",
|
|
"budgetAmount": "Amount",
|
|
"budgetResetCadence": "Reset",
|
|
"budgetCadence_30d": "Every 30 days",
|
|
"budgetCadence_1mo": "Monthly",
|
|
"budgetCadence_1y": "Yearly",
|
|
"budgetInvalid": "Please enter a positive amount.",
|
|
"budgetSaveFailed": "Could not save budget. Please try again."
|
|
},
|
|
"workspace": {
|
|
"save": "Save",
|
|
"placeholder": "Enter content for {file}…",
|
|
"readonlyNote": "This file is auto-generated and cannot be edited manually.",
|
|
"seedingNote": "Workspace files are seeded on first boot. Updating on an existing instance triggers a ConfigMap update and pod restart."
|
|
},
|
|
"packages": {
|
|
"categories": {
|
|
"channels": "Channels",
|
|
"skills": "Skills",
|
|
"core": "Core"
|
|
},
|
|
"enable": "Enable",
|
|
"disable": "Disable",
|
|
"enableAndSave": "Enable & Save",
|
|
"configure": "Configure",
|
|
"requiresApiKey": "Requires API key",
|
|
"missingFields": "Please fill in all required fields.",
|
|
"status": {
|
|
"pending": "Pending",
|
|
"active": "Active",
|
|
"error": "Error"
|
|
},
|
|
"telegram": {
|
|
"description": "Connect your AI assistant to a Telegram bot.",
|
|
"botTokenLabel": "Telegram Bot Token",
|
|
"botTokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
|
|
"instructions": "1. Open @BotFather on Telegram\n2. Send /newbot and follow the prompts\n3. Copy the bot token provided",
|
|
"disclaimer": "I confirm I own this Telegram bot and authorize PieCed IT to connect it to my AI assistant."
|
|
},
|
|
"discord": {
|
|
"description": "Connect your AI assistant to a Discord server via a bot.",
|
|
"botTokenLabel": "Discord Bot Token",
|
|
"botTokenPlaceholder": "MTAxNjQ0OTk2NjAz...",
|
|
"instructions": "1. Go to discord.com/developers/applications\n2. Create a new application and add a bot\n3. Copy the bot token",
|
|
"disclaimer": "I confirm I own this Discord bot and authorize PieCed IT to connect it to my AI assistant.",
|
|
"appIdLabel": "Discord Application ID",
|
|
"appIdPlaceholder": "18-19 digit numeric ID from Developer Portal"
|
|
},
|
|
"statusEnabled": "enabled",
|
|
"statusDisabled": "disabled",
|
|
"coreHeartbeat": {
|
|
"description": "Periodic agent run every 30 minutes that lets your assistant check inbox, calendar, and other configured sources and message you proactively when something needs attention. Without this, the assistant only responds when you message it first."
|
|
},
|
|
"coreCron": {
|
|
"description": "Allow the assistant to run scheduled tasks (daily briefings, recurring reminders, periodic reports). Off by default. When off, the agent's cron tool stays available but no scheduled job ever fires."
|
|
},
|
|
"coreActiveMemory": {
|
|
"description": "Lets the assistant recall stable preferences, recurring habits, and long-term context from past conversations during a chat. Uses an extra sub-agent turn per inbound message to query the memory store. Direct-message sessions only. Adds a small token cost in exchange for continuity and personalisation."
|
|
},
|
|
"coreVoice": {
|
|
"description": "Speech-to-text on incoming voice notes and text-to-speech on replies, routed through the PieCed LiteLLM gateway so audio cost is tracked per tenant alongside chat. Runtime wiring lands in the next platform release; toggling now stores the preference for that rollout."
|
|
},
|
|
"gitCli": {
|
|
"description": "Standalone git command-line operations (clone, commit, branch, diff, log, status). For private repositories, configure credentials in your workspace."
|
|
},
|
|
"github": {
|
|
"description": "Interact with GitHub repositories via the gh CLI — issues, pull requests, CI runs, releases, gists. Requires a personal access token.",
|
|
"tokenLabel": "GitHub Personal Access Token",
|
|
"tokenPlaceholder": "ghp_… or github_pat_…",
|
|
"instructions": "1. Open https://github.com/settings/tokens\n2. Generate a fine-grained personal access token with the repo scopes you want the assistant to use\n3. Copy the token (it's shown only once)"
|
|
},
|
|
"gitea": {
|
|
"description": "Interact with a Gitea instance — repositories, issues, pull requests, releases. Defaults to the PieCed-platform Gitea at git.c5ai.ch.",
|
|
"tokenLabel": "Gitea Access Token",
|
|
"tokenPlaceholder": "Generated under Settings → Applications",
|
|
"instructions": "1. Log in to your Gitea instance (default https://git.c5ai.ch)\n2. Go to Settings → Applications → Generate New Token\n3. Grant the scopes you want the assistant to use (repo, issue, user)\n4. Copy the token"
|
|
},
|
|
"whisperSelfHosted": {
|
|
"description": "Transcribe audio files via the platform's self-hosted Whisper instance. Useful for ad-hoc transcription tasks initiated from chat."
|
|
},
|
|
"searxngLocalSearch": {
|
|
"description": "Privacy-respecting web search via the platform's internal SearXNG instance. Search the web, images, and news without external API calls or trackers."
|
|
},
|
|
"gog": {
|
|
"description": "Bundled access to Gmail, Calendar, Drive, Docs, Sheets, and Contacts via Google OAuth. Setup requires a Google Cloud project — contact PieCed support to onboard.",
|
|
"clientIdLabel": "Google OAuth Client ID",
|
|
"clientIdPlaceholder": "xxxxxxxxxxx.apps.googleusercontent.com",
|
|
"clientSecretLabel": "Google OAuth Client Secret",
|
|
"clientSecretPlaceholder": "GOCSPX-…",
|
|
"refreshTokenLabel": "Google OAuth Refresh Token",
|
|
"refreshTokenPlaceholder": "1//0g…",
|
|
"instructions": "Google Workspace uses OAuth. Create an OAuth client in your Google Cloud project, authorize it with the scopes you need (Gmail, Calendar, Drive, etc.), then paste the credentials below. Submission stores them securely and queues your activation for admin review — once approved, the integration activates automatically.",
|
|
"disclaimer": "By enabling Google Workspace integration you authorize PieCed to access Gmail, Calendar, Drive, Docs, Sheets, and Contacts on your behalf. Data flows through Google's APIs subject to Google's terms."
|
|
},
|
|
"mail": {
|
|
"description": "Read, search, and manage email via IMAP; send via SMTP. Works with Gmail (with an app password), Outlook, Fastmail, and any standard IMAP/SMTP host.",
|
|
"imapHostLabel": "IMAP Host",
|
|
"imapHostPlaceholder": "imap.example.com",
|
|
"imapUserLabel": "IMAP Username",
|
|
"imapUserPlaceholder": "user@example.com",
|
|
"imapPassLabel": "IMAP Password",
|
|
"imapPassPlaceholder": "••••••••",
|
|
"smtpHostLabel": "SMTP Host",
|
|
"smtpHostPlaceholder": "smtp.example.com",
|
|
"smtpUserLabel": "SMTP Username",
|
|
"smtpUserPlaceholder": "user@example.com",
|
|
"smtpPassLabel": "SMTP Password",
|
|
"smtpPassPlaceholder": "••••••••",
|
|
"instructions": "1. For Gmail: enable 2-Step Verification, then create an App Password at https://myaccount.google.com/apppasswords and use it as both IMAP and SMTP password.\n2. For Outlook / Microsoft 365 with MFA: generate an app password in your account's security settings.\n3. For other providers: refer to their IMAP/SMTP documentation for host names and ports.\n4. Typical IMAP hosts: imap.gmail.com, outlook.office365.com.\n5. Typical SMTP hosts: smtp.gmail.com, smtp.office365.com.",
|
|
"disclaimer": "The assistant gains read/write access to the mailbox you configure. Consider using a dedicated address rather than a personal inbox if you want to limit scope."
|
|
},
|
|
"threema": {
|
|
"description": "Send and receive messages through Threema. Each inbound and outbound message uses the shared PieCed messaging service and incurs a per-message charge from Threema — a third-party cost, separate from your PieCed subscription.",
|
|
"instructions": "1. Enable this package.\n2. Open Threema on your phone, scan the QR code shown under Authorized Users → threema, and accept the contact.\n3. Add your own Threema ID under Authorized Users → threema so the assistant recognises your messages.\n4. Send a message from Threema to start chatting with the assistant.",
|
|
"disclaimer": "Messages between Threema and PieCed are end-to-end encrypted up to PieCed's messaging service, where they are decrypted to be routed to your assistant. Each message sent or received is counted toward Threema's per-message billing — see your plan for current rates."
|
|
},
|
|
"manualReviewPending": "Manual review pending",
|
|
"withdraw": "Withdraw",
|
|
"activationRejected": "Rejected",
|
|
"tryAgain": "Try again",
|
|
"credentialsSaved": "credentials saved",
|
|
"credentialsSavedTip": "The credentials you entered are securely stored and will be used as soon as admin approves the activation. You don't need to re-enter them."
|
|
},
|
|
"admin": {
|
|
"title": "Platform Admin",
|
|
"subtitle": "Manage onboarding requests and tenant lifecycle",
|
|
"allTenants": "Tenants",
|
|
"noTenants": "No tenants provisioned yet.",
|
|
"noAccess": "Insufficient permissions for this view.",
|
|
"name": "Name",
|
|
"displayName": "Display Name",
|
|
"phase": "Phase",
|
|
"packages": "Packages",
|
|
"created": "Created",
|
|
"manage": "Manage",
|
|
"requests": "Requests",
|
|
"pendingRequests": "Pending Requests",
|
|
"approve": "Approve",
|
|
"reject": "Reject",
|
|
"reApprove": "Re-approve",
|
|
"company": "Company",
|
|
"contact": "Contact",
|
|
"agentName": "Agent",
|
|
"status": "Status",
|
|
"submitted": "Submitted",
|
|
"updated": "Updated",
|
|
"actions": "Actions",
|
|
"noRequests": "No requests found.",
|
|
"loadingRequests": "Loading requests…",
|
|
"approveConfirm": "Approve this request and start provisioning?",
|
|
"rejectConfirm": "Reject this request?",
|
|
"rejectTitle": "Reject request",
|
|
"adminNotesLabel": "Notes (optional)",
|
|
"adminNotesPlaceholder": "Reason for rejection…",
|
|
"cancelAction": "Cancel",
|
|
"confirmReject": "Reject",
|
|
"viewTenant": "View",
|
|
"filter_all": "All",
|
|
"filter_pending": "Pending",
|
|
"filter_provisioning": "Provisioning",
|
|
"filter_approved": "Approved",
|
|
"filter_rejected": "Rejected",
|
|
"totalTenants": "Total",
|
|
"running": "Running",
|
|
"provisioning": "Provisioning",
|
|
"errors": "Errors",
|
|
"suspend": "Suspend",
|
|
"resume": "Resume",
|
|
"suspended": "Suspended",
|
|
"suspendedBadge": "SUSPENDED",
|
|
"deleteTenant": "Delete",
|
|
"deleteTitle": "Delete tenant",
|
|
"deleteWarning": "This will permanently delete the tenant, its namespace, secrets, and all associated data. This action cannot be undone.",
|
|
"confirmDelete": "Delete permanently",
|
|
"loadingTenants": "Loading tenants…",
|
|
"filter_deleted": "Deleted",
|
|
"filter_active": "Active",
|
|
"health": "Health",
|
|
"serviceHealth": "Service Health",
|
|
"vllmDescription": "GPU inference engine",
|
|
"litellmDescription": "LLM proxy & spend tracking",
|
|
"tenantOverview": "Tenant Overview",
|
|
"spendOverview": "Spend Overview",
|
|
"globalSpend": "Global Spend (CHF)",
|
|
"activeTenants": "Active Tenants",
|
|
"tenantsWithSpend": "tenants with recorded spend",
|
|
"refresh": "Refresh",
|
|
"healthUnavailable": "Health data unavailable.",
|
|
"loadingHealth": "Loading health data…",
|
|
"statusHealthy": "Healthy",
|
|
"statusDown": "Down",
|
|
"spendChf": "Spend (CHF)",
|
|
"resumeRequestBadge": "Resume",
|
|
"resumeRequestTooltip": "Reactivation request for an existing tenant. Approving will un-suspend the tenant; no provisioning runs.",
|
|
"openclawTool": "OpenClaw versions",
|
|
"billingTool": "Billing →",
|
|
"skillsQueueTool": "Activation Queue"
|
|
},
|
|
"channelUsers": {
|
|
"title": "Authorized Users",
|
|
"description": "Manage which users can interact with your assistant on each channel. Add their numeric user ID to authorize access.",
|
|
"users": "users",
|
|
"placeholder": "Enter numeric user ID…",
|
|
"add": "Add",
|
|
"remove": "Remove",
|
|
"alreadyAdded": "This user ID is already authorized.",
|
|
"telegramIdHelp": "To find your Telegram user ID:\n1. Open Telegram and message @userinfobot\n2. It instantly replies with your numeric ID\n3. Enter that number here",
|
|
"discordIdHelp": "To find your Discord user ID:\n1. Enable Developer Mode in Discord settings (Advanced)\n2. Right-click your name → Copy User ID\n3. Enter that number here",
|
|
"threemaIdHelp": "Enter your own Threema ID — the 8 characters shown in your Threema app under Settings → My Threema ID. Once added, you'll be able to chat with the assistant directly from Threema.",
|
|
"threemaSetup": {
|
|
"title": "Add the assistant to your Threema",
|
|
"step1": "Open Threema on your phone.",
|
|
"step2": "Tap the scan icon and scan this QR code to add the assistant as a contact.",
|
|
"step3": "Then add your own Threema ID below.",
|
|
"qrAlt": "QR code to add {gateway} as a Threema contact",
|
|
"bannerTitle": "Set up Threema",
|
|
"bannerBody": "Open Threema on your phone and scan our QR code to add the assistant as a contact. Then add your own Threema ID below.",
|
|
"bannerButton": "Show QR code"
|
|
}
|
|
},
|
|
"team": {
|
|
"title": "Team",
|
|
"description": "Manage members of your organization. Invite colleagues and assign them to instances.",
|
|
"inviteSectionTitle": "Invite a member",
|
|
"membersSectionTitle": "Members",
|
|
"noMembers": "No members yet.",
|
|
"you": "You",
|
|
"noRole": "no role",
|
|
"givenName": "First name",
|
|
"familyName": "Last name",
|
|
"email": "Email",
|
|
"role": "Role",
|
|
"roleUser": "User (read-only, must be assigned to instances)",
|
|
"roleOwner": "Owner (full access to all instances)",
|
|
"roleHint": "Owners can manage instances, billing, and team members. Users can only view instances they've been assigned to.",
|
|
"inviteButton": "Send invitation",
|
|
"inviteSent": "Invitation sent. The user will receive an email with a link to set their password.",
|
|
"inviteUserExists": "A user with this email is already registered.",
|
|
"changeRole": "Change role",
|
|
"roleUpdated": "Role updated.",
|
|
"roleUpdateFailed": "Could not update role.",
|
|
"cancel": "Cancel",
|
|
"save": "Save",
|
|
"selfChangeBlocked": "You cannot change your own role."
|
|
},
|
|
"assignments": {
|
|
"loading": "Loading assignments…",
|
|
"noneAssigned": "No users are assigned to this instance yet.",
|
|
"noCandidates": "No team members available to assign. Invite users from the Team page first.",
|
|
"pickUser": "Select a user…",
|
|
"assign": "Assign",
|
|
"revoke": "Remove"
|
|
},
|
|
"countries": {
|
|
"CH": "Switzerland",
|
|
"DE": "Germany",
|
|
"AT": "Austria",
|
|
"FR": "France",
|
|
"IT": "Italy",
|
|
"LI": "Liechtenstein"
|
|
},
|
|
"phase": {
|
|
"Pending": "Pending",
|
|
"Provisioning": "Provisioning",
|
|
"Running": "Running",
|
|
"Ready": "Ready",
|
|
"Suspended": "Suspended",
|
|
"Error": "Error",
|
|
"Deleting": "Deleting",
|
|
"Reconfiguring": "Reconfiguring"
|
|
},
|
|
"warnings": {
|
|
"oneTooltip": "1 warning",
|
|
"manyTooltip": "{count} warnings"
|
|
},
|
|
"settings": {
|
|
"title": "Settings",
|
|
"subtitle": "Manage org-level configuration that applies to all your tenants.",
|
|
"billingTitle": "Billing",
|
|
"billingDescription": "Address, VAT number, and invoice email used for all your tenants.",
|
|
"nothingForYou": "There's nothing here for your role yet. Owners can manage org settings.",
|
|
"billingDescriptionPersonal": "Address and invoice email used for all your tenants."
|
|
},
|
|
"settingsBilling": {
|
|
"title": "Billing",
|
|
"subtitle": "Captured once at first onboarding and reused for every tenant in your organization. Update here whenever your billing details change.",
|
|
"companyName": "Company name",
|
|
"streetAddress": "Street address",
|
|
"postalCode": "Postal code",
|
|
"city": "City",
|
|
"country": "Country",
|
|
"vatNumber": "VAT number",
|
|
"vatHelp": "Your registered VAT identifier (e.g. CHE-123.456.789 MWST for Switzerland).",
|
|
"billingEmail": "Billing email",
|
|
"billingEmailHelp": "Where invoices and billing communication will be sent.",
|
|
"notes": "Notes",
|
|
"notesPlaceholder": "Anything else accounting needs to know — VAT exemption, special invoicing arrangements, etc.",
|
|
"save": "Save",
|
|
"saved": "Saved.",
|
|
"saveFailed": "Could not save. Please try again.",
|
|
"lastUpdated": "Last updated {when}",
|
|
"fullName": "Full name",
|
|
"notesPlaceholderPersonal": "Anything we should know — preferred payment method, billing reference, etc."
|
|
},
|
|
"support": {
|
|
"title": "Support",
|
|
"subtitle": "Open a ticket to ask a question, report a bug, or share feedback. Replies will be sent to your registered email.",
|
|
"titleAdmin": "Support queue",
|
|
"subtitleAdmin": "Tickets across all customers, newest activity first.",
|
|
"newTicket": "New ticket",
|
|
"newTicketTitle": "Open a support ticket",
|
|
"newTicketSubtitle": "Tell us what's going on. The more detail you share, the faster we can help.",
|
|
"empty": "You haven't opened any tickets yet.",
|
|
"emptyAdmin": "No support tickets in the queue.",
|
|
"fieldCategory": "Category",
|
|
"fieldTitle": "Title",
|
|
"fieldDescription": "Description",
|
|
"fieldStatus": "Status",
|
|
"titlePlaceholder": "Short summary of what you need",
|
|
"descriptionPlaceholder": "Describe what happened, what you expected, and any error messages you saw.",
|
|
"descriptionHelp": "You can paste error messages and logs. Don't include passwords or other secrets.",
|
|
"submitTicket": "Submit ticket",
|
|
"createFailed": "Could not create ticket. Please try again.",
|
|
"category_bug": "Bug",
|
|
"category_feature_request": "Feature request",
|
|
"category_question": "Question",
|
|
"category_billing": "Billing",
|
|
"category_other": "Other",
|
|
"status_open": "Open",
|
|
"status_in_progress": "In progress",
|
|
"status_waiting_for_customer": "Awaiting your reply",
|
|
"status_resolved": "Resolved",
|
|
"status_reopened": "Reopened",
|
|
"openedBy": "Opened by {name} on {when}",
|
|
"authorTagAdmin": "PieCed support",
|
|
"replyLabel": "Add a reply",
|
|
"replyPlaceholder": "Your message…",
|
|
"replyPlaceholderReopen": "Reply (this will reopen the ticket)…",
|
|
"sendReply": "Send reply",
|
|
"commentFailed": "Could not send reply. Please try again.",
|
|
"closeTicket": "Mark as resolved",
|
|
"confirmClose": "Mark this ticket as resolved? You can reopen it later by replying.",
|
|
"closeFailed": "Could not close the ticket. Please try again.",
|
|
"resolvedBanner": "This ticket is resolved. Reply below if you need to follow up — that will reopen it.",
|
|
"adminControlsTitle": "Admin controls",
|
|
"updateFailed": "Could not save changes. Please try again."
|
|
},
|
|
"openclawAdmin": {
|
|
"title": "OpenClaw versions",
|
|
"subtitle": "Configure the platform-default OpenClaw image tag and per-tenant overrides for testing new releases.",
|
|
"defaultSection": "Platform default",
|
|
"defaultDescription": "Used by every tenant that doesn't have its own override.",
|
|
"fieldTag": "Tag",
|
|
"emptyHint": "Leave empty to fall back to the operator's built-in default.",
|
|
"saveDefault": "Save default",
|
|
"defaultSaved": "Default saved. Tenants without overrides will pick this up on the next reconcile.",
|
|
"saveFailed": "Could not save. Please try again.",
|
|
"overridesSection": "Tenant overrides",
|
|
"noTenants": "No tenants in the cluster.",
|
|
"statusOverridden": "Override",
|
|
"statusFollowsDefault": "Follows default",
|
|
"builtinFallback": "(operator built-in fallback)",
|
|
"defaultPrefix": "Default:",
|
|
"saveOverride": "Save override",
|
|
"clearOverride": "Clear override"
|
|
},
|
|
"adminBilling": {
|
|
"title": "Billing administration",
|
|
"subtitle": "Manage platform pricing, generate invoices, and review billing status across all organizations.",
|
|
"backToAdmin": "Back to Admin",
|
|
"backToBilling": "Back to Billing",
|
|
"backToInvoices": "Back to Invoices",
|
|
"totalOpenBalance": "Total open balance",
|
|
"orgsWithBalance": "Orgs with balance",
|
|
"overdueInvoices": "Overdue invoices",
|
|
"pricingTitle": "Pricing",
|
|
"pricingDesc": "Platform & skill prices, VAT rate.",
|
|
"pricingPageDesc": "Edit platform-wide pricing and per-skill daily rates.",
|
|
"generateTitle": "Generate invoice",
|
|
"generateDesc": "Compute and issue an invoice for a given org & month.",
|
|
"generatePageDesc": "Pick an org, period and locale. Preview shows the computed lines; commit issues the invoice and renders the PDF.",
|
|
"invoicesTitle": "Invoices",
|
|
"invoicesDesc": "Browse all issued invoices, mark paid, download PDFs.",
|
|
"invoicesPageDesc": "All invoices issued by the platform. Use the status filter to focus on open or overdue items.",
|
|
"balancesTitle": "Orgs with open balance",
|
|
"orgIdCol": "Zitadel org ID",
|
|
"openCountCol": "Open",
|
|
"overdueCountCol": "Overdue",
|
|
"totalOpenCol": "Total open",
|
|
"platformPricingTitle": "Platform pricing",
|
|
"monthlyFeeLabel": "Tenant monthly fee",
|
|
"setupFeeLabel": "Tenant setup fee",
|
|
"threemaMessageLabel": "Threema per message",
|
|
"vatRateLabel": "VAT rate (CH/LI)",
|
|
"save": "Save",
|
|
"saving": "Saving…",
|
|
"savedOk": "Saved",
|
|
"skillPricingTitle": "Package pricing",
|
|
"skillPricingDesc": "Set per-day rate and one-time setup fee for any package — core, channel, or skill. Pricing applies to every tenant that enables the package.",
|
|
"skillCol": "Package",
|
|
"dailyPriceCol": "Daily price",
|
|
"actionsCol": "",
|
|
"remove": "Remove",
|
|
"noSkillsPriced": "No packages priced yet.",
|
|
"addSkillLabel": "Add package",
|
|
"dailyPriceLabel": "Daily price",
|
|
"add": "Add",
|
|
"confirmDeleteSkillPrice": "Remove pricing for {skill}? Already-billed periods are unaffected.",
|
|
"clickToEdit": "Click to edit",
|
|
"generateFormTitle": "Generate invoice",
|
|
"noOrgsToGenerate": "No organizations with tenants found.",
|
|
"orgLabel": "Organization",
|
|
"noBillingAddrTag": "no billing address",
|
|
"noBillingAddrWarning": "This org has no billing address on file. The customer must complete /settings/billing before an invoice can be issued.",
|
|
"tenantsLabel": "tenants",
|
|
"yearLabel": "Year",
|
|
"monthLabel": "Month",
|
|
"localeLabel": "PDF language",
|
|
"localeAuto": "Auto",
|
|
"previewBtn": "Preview",
|
|
"commitBtn": "Commit & issue",
|
|
"computing": "Computing…",
|
|
"confirmGenerate": "Issue this invoice? This action allocates an invoice number and renders the PDF.",
|
|
"previewTitle": "Draft preview",
|
|
"warningsTitle": "Warnings",
|
|
"noLinesGenerated": "No billable lines for this period.",
|
|
"descCol": "Description",
|
|
"qtyCol": "Qty",
|
|
"unitPriceCol": "Unit price",
|
|
"amountCol": "Amount (CHF)",
|
|
"subtotal": "Subtotal",
|
|
"vat": "VAT",
|
|
"total": "Total",
|
|
"statusFilterLabel": "Status",
|
|
"allStatuses": "All",
|
|
"monthFilterLabel": "Period",
|
|
"clearFilter": "Clear",
|
|
"loading": "Loading…",
|
|
"noInvoicesFound": "No invoices match the current filters.",
|
|
"invoiceNumberCol": "Number",
|
|
"orgCol": "Organization",
|
|
"periodCol": "Period",
|
|
"statusCol": "Status",
|
|
"totalCol": "Total",
|
|
"dueCol": "Due",
|
|
"status_draft": "Draft",
|
|
"status_open": "Open",
|
|
"status_paid": "Paid",
|
|
"status_overdue": "Overdue",
|
|
"status_void": "Void",
|
|
"status_uncollectible": "Uncollectible",
|
|
"dueOnLabel": "Due",
|
|
"totalLabel": "Total",
|
|
"downloadPdfBtn": "Download PDF",
|
|
"markPaidBtn": "Mark as paid",
|
|
"paidNotePlaceholder": "Optional note (e.g. bank reference, deposit date)",
|
|
"confirm": "Confirm",
|
|
"cancel": "Cancel",
|
|
"deleteBtn": "Delete",
|
|
"deleting": "Deleting…",
|
|
"deleteHint": "Hard-delete this invoice (testing tool). Number is consumed.",
|
|
"confirmDeleteInvoice": "Delete invoice {num}? This is a hard delete — the invoice number stays consumed.",
|
|
"paidOnLabel": "Paid",
|
|
"lineItemsTitle": "Line items",
|
|
"billToSnapshotTitle": "Billed to",
|
|
"setupFeeCol": "Setup fee",
|
|
"skillSetupFeeLabel": "Setup fee"
|
|
},
|
|
"skillCostDialog": {
|
|
"title": "Confirm activation cost",
|
|
"intro": "Activating {skill} will incur the following charges:",
|
|
"setupFeeLabel": "Setup fee",
|
|
"setupFeeNote": "One-time, charged on first activation only",
|
|
"monthlyPriceLabel": "Monthly price",
|
|
"monthlyPriceNote": "CHF {daily}/day enabled; partial months prorated by day",
|
|
"monthUnit": "month",
|
|
"disclaimer": "These charges appear on your next monthly invoice. By confirming you agree to incur them.",
|
|
"cancel": "Cancel",
|
|
"confirm": "Confirm & activate",
|
|
"confirming": "Activating…"
|
|
},
|
|
"adminSkills": {
|
|
"title": "Activation queue",
|
|
"subtitle": "Customer requests to activate packages that need manual platform-side setup. Approve once configuration is in place; reject with a reason if the activation can't proceed.",
|
|
"backToAdmin": "Back to Admin",
|
|
"emptyQueue": "No pending skill activation requests.",
|
|
"requestedAtCol": "Requested",
|
|
"skillCol": "Skill",
|
|
"tenantCol": "Tenant",
|
|
"orgCol": "Organization",
|
|
"actionsCol": "",
|
|
"approveBtn": "Approve",
|
|
"rejectBtn": "Reject",
|
|
"confirmRejectBtn": "Confirm rejection",
|
|
"working": "Working…",
|
|
"cancel": "Cancel",
|
|
"reasonLabel": "Reason (shown to the customer)",
|
|
"reasonPlaceholder": "Explain why this can't be activated — e.g. missing customer data, hardware unavailable, etc.",
|
|
"reasonRequired": "A reason is required to reject."
|
|
}
|
|
}
|