Files
Memoh/apps/web/src/i18n/locales/en.json
T
Acbox da2e999ce3 feat: searchable timezone select & bot timezone priority
- Add reusable TimezoneSelect component with search and UTC offset labels
- Replace plain Select with searchable TimezoneSelect in profile settings,
  bot settings, and browser context settings
- Move bot timezone setting from header dialog into bot settings tab
- Resolve timezone with bot > user > system priority for all LLM-facing
  time formatting (user message header, system prompt, heartbeat, tools,
  memory extraction)
- Format tool output timestamps (history, contacts) in resolved timezone
2026-03-26 21:00:21 +08:00

1099 lines
45 KiB
JSON

{
"common": {
"confirm": "Confirm",
"cancel": "Cancel",
"back": "Back",
"save": "Save",
"add": "Add",
"edit": "Edit",
"delete": "Delete",
"search": "Search",
"loading": "Loading...",
"operation": "Actions",
"enable": "Enable",
"optional": "optional",
"import": "Import",
"export": "Export",
"copy": "Copy",
"copied": "Copied to clipboard",
"tabAddSingle": "Add single",
"tabImportJson": "Import JSON",
"copyAsJson": "Copy as JSON",
"fillForm": "Fill form",
"batchSelected": "{count} selected",
"batchDelete": "Batch delete",
"batchDeleteConfirm": "Delete {count} selected item(s)?",
"batchExport": "Batch export",
"cancelSelection": "Cancel selection",
"name": "Name",
"namePlaceholder": "Enter name",
"type": "Type",
"typePlaceholder": "Select type",
"refresh": "Refresh",
"status": "Status",
"loadFailed": "Failed to load",
"saveFailed": "Failed to save",
"createdAt": "Created at",
"none": "None",
"searchTimezone": "Search timezones…",
"noTimezoneFound": "No timezone found."
},
"auth": {
"welcome": "Welcome Back",
"username": "Username",
"password": "Password",
"login": "Sign In",
"register": "Sign Up",
"forgotPassword": "Forgot password?",
"logout": "Sign Out",
"logoutConfirm": "Are you sure you want to sign out?",
"loginFailed": "Login failed",
"invalidCredentials": "Invalid username or password",
"retryHint": "Please check and try again"
},
"sidebar": {
"chat": "Chat",
"bots": "Bots",
"models": "Models",
"searchProvider": "Search Providers",
"memoryProvider": "Memory",
"ttsProvider": "TTS Providers",
"emailProvider": "Email Providers",
"settings": "Settings",
"home": "Home",
"mcp": "MCP",
"platform": "Platform",
"usage": "Usage",
"browserContexts": "Browser"
},
"breadcrumb": {
"main": "Home"
},
"settings": {
"display": "General",
"user": "User",
"backToChat": "Back to Chat",
"userProfile": "Profile",
"userID": "User ID",
"displayName": "Display Name",
"avatarUrl": "Avatar URL",
"timezone": "Timezone",
"timezonePlaceholder": "e.g. America/New_York",
"saveProfile": "Save Profile",
"profileUpdated": "Profile updated",
"profileUpdateFailed": "Failed to update profile",
"changePassword": "Change Password",
"currentPassword": "Current Password",
"newPassword": "New Password",
"confirmPassword": "Confirm New Password",
"updatePassword": "Update Password",
"passwordRequired": "Current password and new password are required",
"passwordNotMatch": "The new passwords do not match",
"passwordUpdated": "Password updated",
"passwordUpdateFailed": "Failed to update password",
"changeEmail": "Change Email",
"emailRequired": "Email is required",
"emailUpdated": "Email updated",
"emailUpdateFailed": "Failed to update email",
"linkedChannels": "Linked Platform Accounts",
"noLinkedChannels": "No linked platform accounts yet",
"bindCode": "Bind Code",
"platform": "Platform",
"platformAny": "Any platform",
"bindCodeTTL": "TTL (seconds)",
"generateBindCode": "Generate Bind Code",
"bindCodeGenerated": "Bind Code generated",
"bindCodeGenerateFailed": "Failed to generate bind code",
"bindCodeValue": "Bind Code",
"bindCodeExpiresAt": "Expires At",
"copyBindCode": "Copy",
"bindCodeCopied": "Bind code copied",
"bindCodeCopyFailed": "Failed to copy bind code",
"loadUserFailed": "Failed to load user data",
"language": "Language",
"languagePlaceholder": "Select language",
"theme": "Theme",
"themePlaceholder": "Select theme",
"themeLight": "Light",
"themeDark": "Dark",
"langZh": "中文",
"langEn": "English"
},
"chat": {
"greeting": "Hi! How can I help you today?",
"selectBot": "Select a Bot",
"selectBotHint": "Choose a bot from the sidebar to start chatting",
"thinking": "Thinking…",
"thinkingInProgress": "Thinking…",
"thinkingDone": "Thinking complete",
"currentBot": "Current Bot",
"inputPlaceholder": "Type your question…",
"readonlyHint": "This chat is read-only",
"readonlyPlaceholder": "This chat is read-only. Sending messages is disabled.",
"send": "Send",
"startChat": "Start Chat",
"noBot": "No bots available, please create a bot first",
"newChat": "New Chat",
"history": "History",
"historyParticipant": "Chats",
"historyObserved": "Observed Chats",
"readonly": "Read-only",
"toolDone": "Done",
"toolRunning": "Running",
"toolInput": "Input",
"toolResult": "Result",
"toolWriteContent": "Content",
"toolEditChanges": "Changes",
"toolSearchResults": "{count} results",
"toolSearchResultsLabel": "Results",
"toolExecOutput": "Output",
"toolExecExit": "exit: {code}",
"toolExecError": "Error",
"toolScheduleItems": "{count} items",
"toolMemoryResults": "{count} memories",
"toolWebFetchPreview": "Preview",
"toolContactsCount": "{count} contacts",
"toolEmailCount": "{count} emails",
"toolEmailAccounts": "{count} accounts",
"toolSpawnCount": "{count} tasks",
"unknownUser": "{platform} User",
"files": "Files",
"sessions": "Sessions",
"newSession": "New Session",
"deleteSession": "Delete Session",
"deleteSessionConfirm": "Are you sure you want to delete this session?",
"renameSession": "Rename Session",
"sessionTitle": "Session",
"untitledSession": "Untitled Session",
"noSessions": "No sessions yet",
"sessionTypeHeartbeat": "Heartbeat",
"sessionTypeSchedule": "Scheduled Task",
"sessionTypeSubagent": "Subagent"
},
"models": {
"title": "Models",
"searchPlaceholder": "Search providers…",
"addModel": "Add Model",
"editModel": "Edit Model",
"deleteModelConfirm": "Are you sure you want to delete this model?",
"searchModelPlaceholder": "Search models…",
"searchNoResults": "No matching models",
"emptyTitle": "No Models",
"emptyDescription": "Click the button above to add a model for this provider",
"clientType": "Client Type",
"clientTypePlaceholder": "Select client type",
"model": "Model ID",
"modelPlaceholder": "e.g. gpt-4o",
"displayName": "Display Name",
"displayNamePlaceholder": "Custom display name",
"dimensions": "Dimensions",
"dimensionsPlaceholder": "e.g. 1536",
"compatibilities": "Compatibilities",
"compatibility": {
"vision": "Vision",
"tool-call": "Tool Call",
"image-output": "Image Output",
"reasoning": "Reasoning"
},
"contextWindow": "Context Window",
"contextWindowPlaceholder": "e.g. 128000",
"testModel": "Test Model",
"testOk": "OK",
"testAuthError": "Auth Error",
"testError": "Error",
"testFailed": "Test failed",
"importModels": "Import Models",
"importSuccess": "Successfully imported {created} models, skipped {skipped}",
"importFailed": "Failed to import models",
"importConfirmHint": "Models will be imported from this provider's API with default compatibilities (vision, tool-call, reasoning).",
"showingCount": "Showing {count} of {total}",
"showMore": "Show More"
},
"provider": {
"add": "Add Provider",
"addBtn": "Add",
"apiKey": "API Key",
"apiKeyPlaceholder": "Enter API key",
"url": "Base URL",
"urlPlaceholder": "Enter base URL",
"deleteConfirm": "Are you sure you want to delete this provider?",
"saveChanges": "Save Changes",
"emptyTitle": "No Providers",
"emptyDescription": "Add a model provider first to configure models",
"testConnection": "Test Connection",
"reachable": "Reachable",
"unreachable": "Unreachable",
"testFailed": "Test failed",
"autoImport": "Auto Import Models",
"autoImportHint": "Automatically fetch and import models from the provider after creation",
"clientType": "Client Type",
"icon": "Icon",
"iconPlaceholder": "Icon URL or identifier (optional)",
"enable": "Enable",
"enableHint": "Only models from enabled providers appear in the available model list"
},
"searchProvider": {
"title": "Search Providers",
"add": "Add Search Provider",
"empty": "No search providers",
"provider": "Provider Type",
"selectHint": "Select or create a search provider",
"unsupportedProvider": "This provider does not have a settings panel yet",
"saveSuccess": "Search provider saved",
"deleteSuccess": "Search provider deleted",
"deleteFailed": "Failed to delete search provider",
"searchPlaceholder": "Search providers...",
"emptyTitle": "No Search Providers",
"emptyDescription": "Add a search provider to configure web search",
"deleteConfirm": "Are you sure you want to delete this search provider? This action cannot be undone.",
"providerNames": {
"brave": "Brave",
"bing": "Bing",
"google": "Google",
"tavily": "Tavily",
"sogou": "Sogou",
"serper": "Serper",
"searxng": "SearXNG",
"jina": "Jina",
"exa": "Exa",
"bocha": "Bocha",
"duckduckgo": "DuckDuckGo",
"yandex": "Yandex"
}
},
"memoryProvider": {
"title": "Memory Providers",
"add": "Add Memory Provider",
"empty": "No memory providers",
"provider": "Provider Type",
"searchPlaceholder": "Search providers...",
"emptyTitle": "No Memory Providers",
"emptyDescription": "Add a memory provider to enable long-term memory for your bots",
"saveSuccess": "Memory provider saved",
"deleteSuccess": "Memory provider deleted",
"deleteFailed": "Failed to delete memory provider",
"deleteConfirm": "Are you sure you want to delete this memory provider? Bots using it will lose memory access.",
"name": "Name",
"namePlaceholder": "Enter provider name",
"builtinMode": "Built-in Memory Mode",
"builtinModeDescription": "Choose how the built-in memory provider stores and retrieves memory for bots.",
"sparseSectionTitle": "Sparse Retrieval",
"denseSectionTitle": "Dense Retrieval",
"sparseInstallHint": "Sparse mode depends on the optional sparse service. Enable the sparse installation option when running the installer or start the sparse profile in Docker Compose.",
"denseBackend": "Dense Backend",
"denseBackendValue": "Embedding API + Qdrant",
"denseEmbeddingModel": "Dense Embedding Model",
"denseEmbeddingModelDescription": "Select the third-party embedding model used before local rerank.",
"denseQdrantHint": "Dense memory will use Qdrant as the storage backend after the backend runtime is connected.",
"qdrantCollection": "Qdrant Collection",
"sparseQdrantCollectionDescription": "Sparse mode writes to the Qdrant collection. Current/default collection: {collection}.",
"denseQdrantCollectionDescription": "Dense mode writes to the Qdrant collection. Current/default collection: {collection}.",
"collectionPoints": "Points in collection",
"collectionExists": "Collection exists",
"collectionMissing": "Collection not created yet",
"collectionHealthy": "Healthy",
"collectionUnavailable": "Unavailable",
"modeNames": {
"off": "Off",
"sparse": "Sparse",
"dense": "Dense"
},
"modeDescriptions": {
"off": "Keep the current file-based built-in memory behavior without Qdrant retrieval.",
"sparse": "Use the local OpenSearch sparse model for memory indexing and retrieval with Qdrant.",
"dense": "Use the selected embedding model API to build dense vectors and store/search them directly in Qdrant."
},
"providerNames": {
"builtin": "Built-in",
"mem0": "Mem0",
"openviking": "OpenViking"
}
},
"ttsProvider": {
"title": "TTS Providers",
"add": "Add TTS Provider",
"providerType": "Provider Type",
"searchPlaceholder": "Search TTS providers...",
"emptyTitle": "No TTS Providers",
"emptyDescription": "Add a TTS provider to enable text-to-speech for your bots",
"deleteConfirm": "Are you sure you want to delete this TTS provider? This action cannot be undone.",
"models": "Models",
"importModels": "Import Models",
"importSuccess": "Models imported successfully",
"importFailed": "Failed to import models",
"addModel": "Add Model",
"modelId": "Model ID",
"modelIdPlaceholder": "Enter model identifier (e.g. custom-voice)",
"noModels": "No models found. Click \"Import Models\" to discover available models or \"Add Model\" to create one manually.",
"noCapabilities": "No capabilities available for this model.",
"fields": {
"language": "Language",
"languagePlaceholder": "Select language...",
"voice": "Voice",
"voicePlaceholder": "Select voice...",
"format": "Output Format",
"formatPlaceholder": "Select format...",
"speed": "Speed",
"speedDescription": "Playback speed (default: {default})",
"pitch": "Pitch",
"pitchDescription": "Voice pitch adjustment in Hz (default: {default})"
},
"test": {
"title": "Test Synthesis",
"placeholder": "Enter text to synthesize...",
"generate": "Generate",
"failed": "Synthesis failed"
}
},
"emailProvider": {
"title": "Email Providers",
"add": "Add Email Provider",
"providerType": "Provider Type",
"searchPlaceholder": "Search email providers...",
"emptyTitle": "No Email Providers",
"emptyDescription": "Add an email provider to enable email for your bots",
"deleteConfirm": "Are you sure you want to delete this email provider? This action cannot be undone.",
"fields": {
"username": "Username",
"password": "Password",
"smtp_host": "SMTP Host",
"smtp_port": "SMTP Port",
"smtp_security": "SMTP Security",
"imap_host": "IMAP Host",
"imap_port": "IMAP Port",
"imap_security": "IMAP Security",
"poll_interval_seconds": "Poll Interval (seconds)",
"domain": "Domain",
"api_key": "API Key",
"region": "Region",
"inbound_mode": "Inbound Mode",
"webhook_signing_key": "Webhook Signing Key"
},
"oauth": {
"title": "OAuth2 Authorization",
"description": "Authorize this provider to send emails on your behalf. You will be redirected to the provider's login page.",
"authorize": "Authorize",
"authorizeOpened": "Authorization page opened in a new tab",
"authorizeFailed": "Failed to start authorization",
"status": {
"checking": "Checking authorization status...",
"authorized": "Authorized as {email}",
"authorizedUnknown": "Authorized",
"expired": "Authorization expired — please re-authorize.",
"missing": "Not authorized. Authorize to enable Gmail access.",
"notConfigured": "Client ID is missing. Add it before authorizing."
},
"logout": "Log out",
"logoutSuccess": "Authorization revoked",
"logoutFailed": "Failed to revoke authorization"
}
},
"browserContext": {
"title": "Browser Contexts",
"add": "Add Browser Context",
"searchPlaceholder": "Search browser contexts...",
"emptyTitle": "No Browser Contexts",
"emptyDescription": "Add a browser context to enable browser automation for your bots",
"deleteConfirm": "Are you sure you want to delete this browser context? Bots using it will lose browser access.",
"saveSuccess": "Browser context saved",
"deleteSuccess": "Browser context deleted",
"name": "Name",
"namePlaceholder": "Enter context name",
"viewportWidth": "Viewport Width",
"viewportHeight": "Viewport Height",
"userAgent": "User Agent",
"userAgentPlaceholder": "Custom user agent string",
"deviceScaleFactor": "Device Scale Factor",
"isMobile": "Mobile Device",
"locale": "Locale",
"localePlaceholder": "e.g. en-US",
"timezoneId": "Timezone",
"timezonePlaceholder": "e.g. America/New_York",
"ignoreHTTPSErrors": "Ignore HTTPS Errors",
"core": "Browser Core",
"chromium": "Chromium",
"firefox": "Firefox",
"config": "Configuration"
},
"mcp": {
"addTitle": "Add MCP",
"addDescription": "Configure MCP server connection",
"searchPlaceholder": "Search MCP servers...",
"emptyTitle": "No MCP Servers",
"emptyDescription": "Add an MCP server to extend your bot's capabilities",
"command": "Command",
"commandPlaceholder": "Enter start command",
"arguments": "Arguments",
"argumentsPlaceholder": "Type and press Enter to add",
"cwd": "Working Directory",
"cwdPlaceholder": "Enter working directory path",
"env": "Environment",
"envPlaceholder": "Format: KEY:VALUE",
"active": "Enabled",
"types": {
"stdio": "Stdio (Local)",
"remote": "Remote (HTTP/SSE)"
},
"table": {
"command": "Command",
"cwd": "Working Directory",
"arguments": "Arguments",
"env": "Environment"
},
"draft": "Draft",
"empty": "No MCP servers configured yet.",
"deleteConfirm": "Are you sure you want to delete this MCP server?",
"loadFailed": "Failed to load MCP servers",
"saveFailed": "Failed to save MCP server",
"createSuccess": "MCP server created",
"updateSuccess": "MCP server updated",
"deleteSuccess": "MCP server deleted",
"deleteFailed": "Failed to delete MCP server",
"importHint": "Paste a standard mcpServers JSON configuration. Existing servers with the same name will be updated.",
"importSuccess": "MCP servers imported",
"importFailed": "Failed to import MCP servers",
"exportFailed": "Failed to export MCP servers",
"probe": "Test Connection",
"probing": "Testing...",
"probeSuccess": "Connection verified",
"probeFailed": "Connection test failed",
"probeRefresh": "Refresh",
"tools": "Tools",
"toolsEmpty": "No tools discovered",
"toolsCount": "{count} tool(s) available",
"statusConnected": "Connected",
"statusError": "Error",
"statusUnknown": "Not tested",
"lastProbed": "Last tested",
"authRequired": "Authorization required",
"oauth": {
"title": "Authentication",
"status": "OAuth Status",
"notConfigured": "Not configured",
"authorized": "Authorized",
"expired": "Token expired",
"discover": "Detect OAuth",
"discovering": "Detecting...",
"authorize": "Authorize",
"authorizing": "Authorizing...",
"revoke": "Revoke",
"revokeConfirm": "Are you sure you want to revoke OAuth authorization?",
"revokeSuccess": "OAuth authorization revoked",
"revokeFailed": "Failed to revoke OAuth",
"discoverSuccess": "OAuth server detected",
"discoverFailed": "OAuth detection failed",
"authSuccess": "Authorization successful",
"authFailed": "Authorization failed",
"scopes": "Scopes",
"authServer": "Authorization Server",
"clientId": "Client ID",
"clientIdPlaceholder": "OAuth App Client ID",
"clientSecret": "Client Secret",
"clientSecretPlaceholder": "OAuth App Client Secret (if required)",
"clientIdHint": "The authorization server does not support automatic registration. Please create an OAuth App and enter its Client ID.",
"callbackUrl": "Callback URL",
"callbackUrlHint": "Set this as the callback/redirect URL in your OAuth App settings.",
"callbackMissingParams": "Missing authorization code or state parameter"
}
},
"home": {
"title": "Home"
},
"bots": {
"title": "Bots",
"searchPlaceholder": "Search bots…",
"createBot": "New Bot",
"createBotWaitHint": "Creating a bot may need to pull the base image on first use. Please wait a moment after submission.",
"editBot": "Edit Bot",
"deleteConfirm": "Are you sure you want to delete this bot?",
"renameSuccess": "Bot name updated",
"renameFailed": "Failed to update bot name",
"deleteSuccess": "Bot deleted",
"emptyTitle": "No Bots",
"emptyDescription": "Click the button above to create your first bot",
"displayName": "Name",
"displayNamePlaceholder": "Give your bot a name",
"avatarUrl": "Avatar URL",
"avatarUrlPlaceholder": "Enter avatar image URL",
"timezone": "Timezone",
"timezonePlaceholder": "e.g. America/New_York",
"timezoneInherited": "Inherited from user/system",
"timezoneInheritedHint": "Leave empty to inherit the user's timezone, or fall back to the system timezone.",
"editAvatar": "Edit Avatar",
"editAvatarDescription": "Set the image URL for the bot avatar.",
"editTimezone": "Edit Timezone",
"editTimezoneDescription": "Set a timezone override for this bot.",
"avatarUpdateSuccess": "Avatar updated",
"avatarUpdateFailed": "Failed to update avatar",
"timezoneUpdateSuccess": "Timezone updated",
"timezoneUpdateFailed": "Failed to update timezone",
"typePlaceholder": "Select bot type",
"types": {
"personal": "Personal",
"public": "Public"
},
"active": "Active",
"inactive": "Inactive",
"lifecycle": {
"creating": "Creating",
"deleting": "Deleting",
"createFailed": "Create failed",
"deleteFailed": "Delete failed"
},
"checks": {
"title": "Runtime Checks",
"subtitle": "View current health status and issue details.",
"ok": "No issues",
"hasIssue": "Has issues",
"issueCount": "{count} issues",
"empty": "No check items",
"loadFailed": "Failed to load runtime checks",
"actions": {},
"titles": {
"containerInit": "Container initialization",
"containerRecord": "Container record",
"containerTask": "Container task",
"containerDataPath": "Container data path",
"botDelete": "Bot deletion",
"mcpConnection": "MCP connection",
"channelConnection": "Channel connection"
},
"keys": {
"containerInit": "Container initialization",
"containerRecord": "Container record",
"containerTask": "Container task",
"containerDataPath": "Container data path",
"botDelete": "Bot deletion"
},
"status": {
"ok": "OK",
"warn": "WARN",
"error": "ERROR",
"unknown": "UNKNOWN"
}
},
"tabs": {
"overview": "Overview",
"memory": "Memory",
"channels": "Platforms",
"container": "Container",
"mcp": "MCP",
"heartbeat": "Heartbeat",
"compaction": "Compaction",
"schedule": "Schedule",
"history": "History",
"skills": "Skills",
"email": "Email",
"files": "Files",
"access": "Access",
"terminal": "Terminal",
"settings": "Settings"
},
"terminal": {
"title": "Terminal",
"reconnect": "Reconnect",
"newTab": "New Terminal",
"closeTab": "Close",
"defaultTabLabel": "Terminal",
"status": {
"idle": "Idle",
"connecting": "Connecting...",
"connected": "Connected",
"disconnected": "Disconnected"
}
},
"files": {
"name": "Name",
"size": "Size",
"modified": "Modified",
"empty": "This directory is empty",
"upload": "Upload",
"newFolder": "New Folder",
"download": "Download",
"rename": "Rename",
"delete": "Delete",
"save": "Save",
"unsaved": "(unsaved)",
"previewNotAvailable": "Preview not available for this file type",
"folderNamePlaceholder": "Folder name",
"newNamePlaceholder": "New name",
"confirmDelete": "Confirm Delete",
"confirmDeleteMessage": "Are you sure you want to delete \"{name}\"? This action cannot be undone.",
"loadFailed": "Failed to load directory",
"readFailed": "Failed to read file",
"saveSuccess": "File saved",
"saveFailed": "Failed to save file",
"uploadSuccess": "File uploaded",
"uploadFailed": "Failed to upload file",
"mkdirSuccess": "Folder created",
"mkdirFailed": "Failed to create folder",
"renameSuccess": "Renamed successfully",
"renameFailed": "Failed to rename",
"deleteSuccess": "Deleted successfully",
"deleteFailed": "Failed to delete"
},
"email": {
"title": "Email",
"subtitle": "Manage email provider bindings and view inbox / outbox.",
"bindings": "Bindings",
"addBinding": "Add Binding",
"inbox": "Inbox",
"outbox": "Outbox",
"emailAddress": "Email Address",
"emailPlaceholder": "user@example.com",
"noBindings": "No email bindings configured",
"noEmails": "No emails",
"canRead": "Read",
"canWrite": "Write",
"canDelete": "Delete",
"unbind": "Unbind",
"unbindConfirm": "Are you sure you want to remove this email binding?",
"bindSuccess": "Email binding added",
"unbindSuccess": "Email binding removed",
"from": "From",
"to": "To",
"subject": "Subject",
"status": "Status",
"receivedAt": "Received",
"sentAt": "Sent"
},
"container": {
"title": "Container Management",
"subtitle": "Manage the runtime container attached to this bot.",
"botNotReady": "This bot is in lifecycle transition. Container actions are temporarily disabled.",
"empty": "No container found for this bot. Create one to enable runtime tooling.",
"legacyWarning": "This container uses an older architecture and needs to be recreated for full compatibility. Your data will be preserved automatically.",
"legacyRecreate": "Recreate Container",
"legacyRecreateSuccess": "Container recreated successfully",
"createHint": "The container is created from the current image. If you explicitly enable restore, preserved data will be restored after creation.",
"createRestoreDataLabel": "Restore preserved data after creation",
"createRestoreDataDescription": "If a previously exported backup or legacy bind-mounted data exists, it will be restored into `/data` after the container is created.",
"createImageLabel": "Base image",
"createImageDescription": "Docker image to use as the container base (e.g. debian:bookworm-slim, alpine:latest, ubuntu:24.04). Leave empty for the default.",
"deleteConfirm": "Are you sure you want to permanently delete this container? Unpreserved data cannot be recovered.",
"deletePreserveConfirm": "Are you sure you want to export `/data` and then delete this container?",
"restoreConfirm": "Are you sure you want to restore preserved data into this container's `/data`?",
"rollbackConfirm": "Are you sure you want to roll back to this snapshot version?",
"taskRunning": "Running",
"taskStopped": "Stopped",
"taskCompleted": "Completed",
"statusCreated": "Created",
"statusRunning": "Running",
"statusStopped": "Stopped",
"statusExited": "Exited",
"statusUnknown": "Unknown",
"loadFailed": "Failed to load container information",
"actionFailed": "Container action failed",
"createSuccess": "Container created",
"createRestoreSuccess": "Container created and data restored",
"startSuccess": "Container started",
"stopSuccess": "Container stopped",
"deleteSuccess": "Container deleted",
"deletePreserveSuccess": "Container deleted and data preserved",
"snapshotSuccess": "Snapshot created",
"exportSuccess": "Data exported",
"importSuccess": "Data imported",
"restoreSuccess": "Preserved data restored",
"rollbackSuccess": "Snapshot rolled back",
"pullingImage": "Pulling image...",
"creatingContainer": "Creating container...",
"preservingData": "Backing up data, this may take a while for large volumes...",
"restoringData": "Restoring data, this may take a while for large volumes...",
"snapshotEmpty": "No snapshots found",
"snapshotLoadFailed": "Failed to load snapshots",
"snapshotNamePlaceholder": "Snapshot display name (optional)",
"snapshotNameHint": "This field is only for the user-visible display name. The internal snapshot name is generated automatically.",
"dataTitle": "Data Operations",
"dataSubtitle": "Independently manage import, export, and restore for the container `/data` directory.",
"deleteTitle": "Delete Container",
"deleteSubtitle": "Before deletion, explicitly choose whether `/data` should be preserved to avoid accidental data loss.",
"preservedDataAvailable": "Preserved data is available and can be restored into the current container.",
"preservedDataAvailableShort": "Available",
"preservedDataEmpty": "None",
"sourceManual": "Manual",
"sourcePreExec": "Auto before execution",
"sourceRollback": "Generated by rollback",
"fields": {
"id": "Container ID",
"status": "Container Status",
"task": "Task",
"namespace": "Namespace",
"image": "Image",
"hostPath": "Host Path",
"containerPath": "Container Path",
"preservedData": "Preserved Data",
"createdAt": "Created At",
"updatedAt": "Updated At"
},
"snapshotColumns": {
"name": "Name",
"version": "Version",
"source": "Source",
"parent": "Parent",
"createdAt": "Created At",
"actions": "Actions"
},
"actions": {
"create": "Create Container",
"start": "Start",
"stop": "Stop",
"delete": "Delete Permanently",
"deletePreserve": "Delete and Preserve Data",
"snapshot": "Create Snapshot",
"exportData": "Export Data",
"importData": "Import Data",
"restoreData": "Restore Preserved Data",
"rollback": "Rollback"
}
},
"settings": {
"chatModel": "Chat Model",
"titleModel": "Title Model",
"titleModelDescription": "Select a small model to auto-generate session titles. Leave empty to disable.",
"titleModelPlaceholder": "Disabled (no auto title)",
"searchProvider": "Search Provider",
"searchProviderPlaceholder": "Select search provider",
"memoryProvider": "Memory Provider",
"memoryProviderPlaceholder": "Select memory provider (disabled if empty)",
"memoryModePreview": "Selected built-in mode: {mode}",
"sparseStatusTitle": "Sparse Retrieval Status",
"sparseStatusHint": "Markdown files remain the only source of truth. Manual sync rebuilds Qdrant from entries under /data/memory.",
"denseStatusTitle": "Dense Retrieval Status",
"denseStatusHint": "Markdown files remain the only source of truth. Manual sync rebuilds the dense Qdrant index from entries under /data/memory.",
"mem0StatusTitle": "Mem0 Sync Status",
"mem0StatusHint": "Markdown files remain the only source of truth. Manual sync rebuilds managed Mem0 memories from entries under /data/memory.",
"indexedMemoryStatusPendingSave": "Save the selected memory provider before viewing indexed memory status or running a sync.",
"memorySyncAction": "Manual Sync",
"memorySyncSuccess": "Sync completed: {fsCount} source entries, {restoredCount} restored, {storageCount} indexed.",
"memorySyncFailed": "Manual sync failed",
"memorySourceDir": "Memory Directory",
"memoryOverviewPath": "Overview File",
"memoryMarkdownFiles": "Markdown Files",
"memorySourceEntries": "Source Entries",
"memoryIndexedEntries": "Indexed Entries",
"memoryQdrantCollection": "Qdrant Collection",
"memoryEncoderHealth": "Sparse Encoder",
"memoryDenseEmbeddingHealth": "Embedding Backend",
"memoryQdrantHealth": "Qdrant",
"memoryHealthOk": "Healthy",
"memoryHealthUnavailable": "Unavailable",
"ttsModel": "TTS Model",
"ttsModelPlaceholder": "Select TTS model",
"maxContextLoadTime": "Max Context Load Time",
"maxContextTokens": "Max Context Tokens",
"language": "Language",
"reasoningEnabled": "Enable Reasoning",
"reasoningEffort": "Reasoning Effort",
"reasoningEffortLow": "Low",
"reasoningEffortMedium": "Medium",
"reasoningEffortHigh": "High",
"heartbeatEnabled": "Enable Heartbeat",
"heartbeatDescription": "Periodically trigger agent to check for items that need attention",
"heartbeatInterval": "Heartbeat Interval (minutes)",
"heartbeatModel": "Heartbeat Model",
"heartbeatModelDescription": "Select a model for heartbeat checks. Defaults to the bot's chat model if not set.",
"heartbeatModelPlaceholder": "Use chat model (default)",
"compactionEnabled": "Enable Context Compaction",
"compactionDescription": "Automatically summarize older messages when context gets too large",
"compactionThreshold": "Compaction Threshold (input tokens)",
"compactionModel": "Compaction Model",
"compactionModelDescription": "Select a model for summarization. Defaults to the bot's chat model if not set.",
"compactionModelPlaceholder": "Use chat model (default)",
"browserContext": "Browser Context",
"browserContextPlaceholder": "Select browser context (disabled if empty)",
"allowGuest": "Allow Guest Access",
"allowGuestPersonalHint": "Personal bots do not support guest access. Use a public bot instead.",
"loopDetectionTitle": "Detect and auto-block output loops",
"searchModel": "Search models…",
"noModel": "No models available",
"saveSuccess": "Settings saved",
"save": "Save Settings",
"dangerZone": "Danger Zone",
"deleteBotDescription": "Deleting this bot cannot be undone. Proceed with caution.",
"deleteBot": "Delete Bot"
},
"access": {
"title": "Access Control",
"subtitle": "Guest chat trigger access is controlled by allow guest, whitelist, and blacklist together.",
"allowGuestDescription": "When enabled, guests may trigger chat by default. Blacklist rules still take precedence.",
"saveGuestAccess": "Save Guest Access",
"guestAccessSaved": "Guest access updated",
"guestRulesTitle": "Rule Summary",
"guestRulesDescription": "Owners and members always bypass these rules. The rules below only apply to guest chat triggers.",
"whitelistTitle": "Whitelist",
"whitelistDescription": "Whitelisted guests can still trigger chat even when guest access is not open.",
"blacklistTitle": "Blacklist",
"blacklistDescription": "Blacklisted guests are denied chat trigger even when guest access is open.",
"userSelector": "Select User",
"identitySelector": "Select Platform Identity",
"selectUser": "Search and select a user",
"selectIdentity": "Search and select a platform identity",
"searchUser": "Search users",
"searchIdentity": "Search platform identities",
"noUserCandidates": "No user candidates",
"noIdentityCandidates": "No platform identity candidates",
"userId": "User ID",
"userIdPlaceholder": "Enter user ID",
"channelIdentityId": "Channel Identity ID",
"channelIdentityIdPlaceholder": "Enter channel identity ID",
"addWhitelist": "Add to Whitelist",
"addBlacklist": "Add to Blacklist",
"clearSelection": "Clear Selection",
"whitelistEmpty": "No whitelist rules yet",
"blacklistEmpty": "No blacklist rules yet",
"validation": "Fill exactly one subject: user_id or channel_identity_id",
"validationConversationRequiresChannel": "Select a source platform before restricting by conversation or thread ID",
"validationConversationRequiresGroupOrThread": "Conversation ID restrictions are only supported for group or thread rules",
"validationThreadRequiresConversation": "Thread ID requires a conversation ID",
"validationThreadRequiresThreadType": "Thread ID restrictions require conversation type to be Thread",
"whitelistSaved": "Whitelist updated",
"blacklistSaved": "Blacklist updated",
"saveFailed": "Failed to save access rule",
"deleteSuccess": "Rule deleted",
"deleteFailed": "Failed to delete rule",
"sourceScopeTitle": "Source Scope",
"sourceScopeDescription": "Optionally restrict a rule to a platform, conversation type, or specific conversation/thread.",
"sourceChannel": "Source Platform",
"anyChannel": "Any platform",
"conversationType": "Conversation Type",
"anyConversationType": "Any conversation type",
"privateConversationType": "Private",
"groupConversationType": "Group",
"threadConversationType": "Thread",
"observedConversation": "Observed Group Or Thread",
"selectObservedConversation": "Select an observed group or thread",
"searchObservedConversation": "Search observed groups or threads",
"noObservedConversations": "No observed groups or threads",
"selectIdentityFirst": "Select a platform identity first to load observed groups or threads",
"observedConversationHint": "Use this only for group or thread rules. Private access should be controlled by conversation type alone.",
"conversationId": "Conversation ID",
"conversationIdPlaceholder": "Enter conversation ID",
"threadId": "Thread ID",
"threadIdPlaceholder": "Enter thread ID",
"clearScope": "Clear Scope",
"lastObserved": "Last seen"
},
"channels": {
"title": "Platforms",
"addChannel": "Add Platform",
"selectType": "Select platform type",
"configured": "Configured",
"notConfigured": "Not configured",
"emptyTitle": "No Platforms",
"emptyDescription": "Click below to add an access platform for this bot",
"credentials": "Credentials",
"saveSuccess": "Platform configuration saved",
"saveFailed": "Failed to save platform configuration",
"requiredField": "{field} is required",
"save": "Save Platform Configuration",
"statusActive": "Active",
"statusInactive": "Inactive",
"actionEnable": "Enable",
"actionDisable": "Disable",
"saveOnly": "Save only",
"saveAndEnable": "Save and enable",
"copyFailed": "Copy failed",
"deleteConfirm": "Are you sure you want to remove this platform?",
"deleteSuccess": "Platform removed",
"deleteFailed": "Failed to remove platform",
"webhookCallback": "WebHook Callback URL",
"webhookCallbackHint": "Use this URL as the event subscription request URL in Feishu/Lark.",
"webhookCallbackPending": "Save this platform configuration to generate the callback URL.",
"showSecretField": "Show {field}",
"hideSecretField": "Hide {field}",
"feishuWebhookSecurityHint": "For security, webhook mode requires either an Encrypt Key or a Verification Token; an unprotected public callback URL should not be exposed.",
"feishuWebhookSecretRequired": "For security, configure at least one of Encrypt Key or Verification Token.",
"noAvailableTypes": "All platform types have been configured",
"weixinQr": {
"title": "QR Code Login",
"description": "Scan the QR code with WeChat to connect your account.",
"startScan": "Get QR Code",
"waitingScan": "Open WeChat and scan this QR code",
"scanned": "Scanned — confirm on your phone",
"expired": "QR code expired",
"refresh": "Refresh QR Code",
"success": "WeChat connected successfully!",
"retry": "Try Again"
},
"types": {
"feishu": "Feishu",
"discord": "Discord",
"qq": "QQ",
"matrix": "Matrix",
"telegram": "Telegram",
"weixin": "WeChat",
"web": "Web",
"local": "Local"
},
"typesShort": {
"feishu": "FS",
"discord": "DC",
"qq": "QQ",
"matrix": "MX",
"telegram": "TG",
"weixin": "WX",
"web": "Web",
"local": "CLI"
}
},
"memory": {
"title": "Here lie the memories.",
"files": "Memory Files",
"empty": "No memory entries found.",
"searchPlaceholder": "Search memory...",
"newMemory": "New Memory",
"compact": "Compact Memory",
"compactConfirm": "Are you sure you want to compact the memory? This will merge similar content using AI and may reduce the number of entries.",
"compactRatio": "Compression Ratio",
"compactRatioLight": "Light (0.8)",
"compactRatioMedium": "Medium (0.5)",
"compactRatioAggressive": "Aggressive (0.3)",
"compactRatioLightDesc": "Keep most details, mostly deduplicate.",
"compactRatioMediumDesc": "Merge similar facts, balanced compression.",
"compactRatioAggressiveDesc": "Heavily consolidate, keep core facts only.",
"compactDecayDate": "Target memories before this date",
"compactSuccess": "Memory compacted successfully",
"compactFailed": "Memory compaction failed",
"selectConversation": "Select Conversation",
"fromConversation": "Create from Conversation",
"noConversations": "No history conversations found",
"idCopied": "ID copied to clipboard",
"deleteConfirm": "Are you sure you want to delete this memory? This cannot be undone."
},
"skills": {
"title": "Skills",
"addSkill": "New Skill",
"emptyTitle": "No Skills",
"emptyDescription": "Click above to create a new skill",
"description": "Description",
"descriptionPlaceholder": "Enter skill description",
"content": "Content",
"contentPlaceholder": "Enter skill content/prompt",
"deleteConfirm": "Are you sure you want to delete this skill?",
"deleteSuccess": "Skill deleted",
"deleteFailed": "Failed to delete skill",
"saveSuccess": "Skill saved",
"saveFailed": "Failed to save skill",
"loadFailed": "Failed to load skills"
},
"compaction": {
"title": "Compaction Logs",
"loadFailed": "Failed to load compaction logs",
"empty": "No compaction logs",
"loadMore": "Load More",
"clearLogs": "Clear Logs",
"clearConfirm": "Are you sure you want to clear all compaction logs? This cannot be undone.",
"clearSuccess": "Compaction logs cleared",
"clearFailed": "Failed to clear compaction logs",
"status": "Status",
"time": "Time",
"duration": "Duration",
"error": "Error",
"statusOk": "OK",
"statusPending": "Pending",
"statusError": "Error",
"filterAll": "All"
},
"heartbeat": {
"title": "Heartbeat Logs",
"loadFailed": "Failed to load heartbeat logs",
"empty": "No heartbeat logs",
"loadMore": "Load More",
"clearLogs": "Clear Logs",
"clearConfirm": "Are you sure you want to clear all heartbeat logs? This cannot be undone.",
"clearSuccess": "Heartbeat logs cleared",
"clearFailed": "Failed to clear heartbeat logs",
"status": "Status",
"time": "Time",
"duration": "Duration",
"result": "Result",
"error": "Error",
"statusOk": "OK",
"statusAlert": "Alert",
"statusError": "Error",
"filterAll": "All",
"noResult": "—"
},
"schedule": {
"title": "Scheduled Tasks",
"loadFailed": "Failed to load schedules",
"empty": "No scheduled tasks",
"name": "Name",
"pattern": "Pattern",
"enabled": "Enabled",
"calls": "Calls",
"createdAt": "Created",
"updatedAt": "Updated",
"statusEnabled": "Enabled",
"statusDisabled": "Disabled",
"unlimited": "∞"
},
"history": {
"title": "History",
"loadFailed": "Failed to load history",
"empty": "No history messages",
"loadMore": "Load More",
"messageCount": "{count} messages",
"selectAll": "Select all",
"deleteSelectedConfirm": "Are you sure you want to delete the selected {count} message(s)? This will clear all history and cannot be undone.",
"deleteSuccess": "Messages deleted",
"deleteFailed": "Failed to delete messages",
"role": {
"user": "User",
"assistant": "Assistant",
"tool": "Tool",
"system": "System"
},
"filter": "Filter by role",
"filterAll": "All",
"expandContent": "Expand",
"collapseContent": "Collapse"
}
},
"usage": {
"title": "Token Usage",
"selectBot": "Select Bot",
"selectBotPlaceholder": "Choose a bot to view usage",
"timeRange": "Time Range",
"last7Days": "Last 7 Days",
"last30Days": "Last 30 Days",
"last90Days": "Last 90 Days",
"noData": "No usage data for the selected period",
"loadFailed": "Failed to load token usage",
"totalInputTokens": "Total Input Tokens",
"totalOutputTokens": "Total Output Tokens",
"avgCacheHitRate": "Avg Cache Hit Rate",
"totalReasoningTokens": "Total Reasoning Tokens",
"dailyTokens": "Daily Token Usage",
"cacheBreakdown": "Cache Breakdown",
"cacheHitRate": "Cache Hit Rate",
"chatInput": "Chat Input",
"chatOutput": "Chat Output",
"heartbeatInput": "Heartbeat Input",
"heartbeatOutput": "Heartbeat Output",
"scheduleInput": "Schedule Input",
"scheduleOutput": "Schedule Output",
"totalInput": "Total Input",
"totalOutput": "Total Output",
"cacheRead": "Cache Read",
"cacheWrite": "Cache Write",
"noCache": "No Cache",
"tokens": "Tokens",
"date": "Date",
"modelDistribution": "Model Usage Distribution",
"filterByModel": "Filter by Model",
"allModels": "All Models",
"sessionType": "Session Type",
"allTypes": "All Types",
"chat": "Chat",
"heartbeat": "Heartbeat",
"schedule": "Schedule",
"inputTokens": "Input Tokens",
"outputTokens": "Output Tokens",
"dateFrom": "From",
"dateTo": "To",
"chartPie": "Pie",
"chartBar": "Bar"
}
}