mirror of
https://github.com/CJackHwang/ds2api.git
synced 2026-05-10 11:17:41 +08:00
489 lines
23 KiB
JSON
489 lines
23 KiB
JSON
{
|
||
"language": {
|
||
"label": "Language",
|
||
"english": "English",
|
||
"chinese": "中文"
|
||
},
|
||
"nav": {
|
||
"accounts": {
|
||
"label": "Account Management",
|
||
"desc": "Manage the DeepSeek account pool"
|
||
},
|
||
"proxies": {
|
||
"label": "Proxy IPs",
|
||
"desc": "Manage outbound proxy nodes for accounts"
|
||
},
|
||
"test": {
|
||
"label": "API Test",
|
||
"desc": "Test API connectivity and responses"
|
||
},
|
||
"history": {
|
||
"label": "Responses",
|
||
"desc": "Browse server-side upstream response records"
|
||
},
|
||
"import": {
|
||
"label": "Batch Import",
|
||
"desc": "Bulk import account configuration"
|
||
},
|
||
"vercel": {
|
||
"label": "Vercel Sync",
|
||
"desc": "Sync configuration to Vercel"
|
||
},
|
||
"settings": {
|
||
"label": "Settings",
|
||
"desc": "Edit runtime and security settings online"
|
||
}
|
||
},
|
||
"sidebar": {
|
||
"onlineAdminConsole": "Online Admin Console",
|
||
"systemStatus": "System Status",
|
||
"statusOnline": "Online",
|
||
"accounts": "Accounts",
|
||
"keys": "Keys",
|
||
"signOut": "Sign out",
|
||
"version": "Version",
|
||
"updateAvailable": "Update available: {latest}"
|
||
},
|
||
"auth": {
|
||
"expired": "Authentication expired. Please sign in again.",
|
||
"checking": "Checking authentication status..."
|
||
},
|
||
"errors": {
|
||
"fetchConfig": "Failed to fetch configuration: {error}"
|
||
},
|
||
"actions": {
|
||
"cancel": "Cancel",
|
||
"add": "Add",
|
||
"delete": "Delete",
|
||
"copy": "Copy",
|
||
"generate": "Generate",
|
||
"test": "Refresh token",
|
||
"testing": "Refreshing...",
|
||
"loading": "Loading..."
|
||
},
|
||
"messages": {
|
||
"deleted": "Deleted successfully",
|
||
"deleteFailed": "Delete failed",
|
||
"failedToAdd": "Failed to add",
|
||
"networkError": "Network error.",
|
||
"requestFailed": "Request failed.",
|
||
"generationStopped": "Generation stopped.",
|
||
"invalidJson": "Invalid JSON format.",
|
||
"importFailed": "Import failed.",
|
||
"copyFailed": "Copy failed."
|
||
},
|
||
"landing": {
|
||
"adminConsole": "Admin Console",
|
||
"apiStatus": "API Status",
|
||
"features": {
|
||
"compatibility": {
|
||
"title": "Full Compatibility",
|
||
"desc": "OpenAI & Claude format support"
|
||
},
|
||
"loadBalancing": {
|
||
"title": "Load Balancing",
|
||
"desc": "Smart rotation with stable throughput"
|
||
},
|
||
"reasoning": {
|
||
"title": "Deep Reasoning",
|
||
"desc": "Expose reasoning traces when enabled"
|
||
},
|
||
"search": {
|
||
"title": "Web Search",
|
||
"desc": "Integrated native web search"
|
||
}
|
||
}
|
||
},
|
||
"accountManager": {
|
||
"addKeySuccess": "API key added successfully.",
|
||
"updateKeySuccess": "API key updated successfully.",
|
||
"addAccountSuccess": "Account added successfully.",
|
||
"updateAccountSuccess": "Account metadata updated successfully.",
|
||
"requiredFields": "Password and email/mobile are required.",
|
||
"deleteKeyConfirm": "Are you sure you want to delete this API key?",
|
||
"deleteAccountConfirm": "Are you sure you want to delete this account?",
|
||
"invalidIdentifier": "Invalid account identifier. Operation aborted.",
|
||
"testAllConfirm": "Refresh all account tokens and verify login?",
|
||
"testAllCompleted": "Completed: {success}/{total} refreshed",
|
||
"testFailed": "Test failed: {error}",
|
||
"available": "Available",
|
||
"inUse": "In use",
|
||
"totalPool": "Total pool",
|
||
"accountsUnit": "accounts",
|
||
"threadsUnit": "threads",
|
||
"apiKeysTitle": "API Keys",
|
||
"apiKeysDesc": "Manage the API access key pool. Click the pencil icon on each row to edit name and remark.",
|
||
"addKey": "Add key",
|
||
"editKeyTitle": "Edit key",
|
||
"editAccountTitle": "Edit account",
|
||
"copied": "Copied",
|
||
"copyFailed": "Copy failed",
|
||
"copyKeyTitle": "Copy key",
|
||
"deleteKeyTitle": "Delete key",
|
||
"noApiKeys": "No API keys found.",
|
||
"accountsTitle": "DeepSeek Accounts",
|
||
"accountsDesc": "Manage the DeepSeek account pool and edit name/remark.",
|
||
"testAll": "Refresh all tokens",
|
||
"addAccount": "Add account",
|
||
"testingAllAccounts": "Refreshing tokens for all accounts...",
|
||
"sessionActive": "Session active",
|
||
"reauthRequired": "Retest status required",
|
||
"runtimeStatusUnknown": "Will be determined after sync",
|
||
"testStatusFailed": "Last test failed",
|
||
"noAccounts": "No accounts found.",
|
||
"modalAddKeyTitle": "Add API key",
|
||
"modalEditKeyTitle": "Edit API key",
|
||
"modalEditAccountTitle": "Edit account details",
|
||
"newKeyLabel": "New key value",
|
||
"newKeyPlaceholder": "Enter a custom API key",
|
||
"keyLabel": "Key value",
|
||
"keyReadonlyPlaceholder": "Key value cannot be changed",
|
||
"keyReadonlyHint": "The key value is read-only. Update the name and remark instead.",
|
||
"generate": "Generate",
|
||
"generateHint": "Click Generate to create a random key.",
|
||
"addKeyLoading": "Adding...",
|
||
"addKeyAction": "Add key",
|
||
"editKeyLoading": "Saving...",
|
||
"editKeyAction": "Save changes",
|
||
"editAccountHint": "Only name and remark can be changed here. The account identifier stays the same.",
|
||
"accountIdentifierLabel": "Account identifier",
|
||
"editAccountLoading": "Saving...",
|
||
"editAccountAction": "Save changes",
|
||
"modalAddAccountTitle": "Add DeepSeek account",
|
||
"nameOptional": "Name (optional)",
|
||
"namePlaceholder": "e.g. Primary Account A",
|
||
"remarkOptional": "Remark (optional)",
|
||
"remarkPlaceholder": "e.g. Team shared / test only",
|
||
"emailOptional": "Email (optional)",
|
||
"mobileOptional": "Mobile (optional)",
|
||
"passwordLabel": "Password",
|
||
"passwordPlaceholder": "Account password",
|
||
"addAccountLoading": "Adding...",
|
||
"addAccountAction": "Add account",
|
||
"pageInfo": "Page {current}/{total}, {count} accounts total",
|
||
"searchPlaceholder": "Search accounts...",
|
||
"searchNoResults": "No accounts match your search",
|
||
"sessionCount": "Sessions: {count}",
|
||
"deleteAllSessions": "Delete all sessions",
|
||
"deleteAllSessionsConfirm": "Are you sure you want to delete all sessions for this account? This action cannot be undone.",
|
||
"deleteAllSessionsSuccess": "Successfully deleted all sessions",
|
||
"accountProxyLabel": "Account proxy",
|
||
"proxyNone": "Direct connection",
|
||
"proxyBadge": "Proxy: {name}",
|
||
"proxyUpdateSuccess": "Account proxy updated.",
|
||
"envModeRiskTitle": "Environment-variable config mode detected (persistence risk)",
|
||
"envModeRiskDesc": "Detected DS2API_CONFIG_JSON. If DS2API_ENV_WRITEBACK is not enabled, Admin UI edits are in-memory only and may be lost after restart.",
|
||
"envModeWritebackPendingTitle": "Env mode + auto-persistence enabled (pending file handoff)",
|
||
"envModeWritebackActiveTitle": "Env mode + auto-persistence active",
|
||
"envModeWritebackDesc": "The app will auto-create/write the config file and transition to file-backed mode. Current persistence path: {path}"
|
||
},
|
||
"proxyManager": {
|
||
"title": "Proxy IPs",
|
||
"desc": "Manage SOCKS egress nodes for accounts and test outbound connectivity to DeepSeek.",
|
||
"addProxy": "Add proxy",
|
||
"editProxy": "Edit proxy",
|
||
"deleteProxy": "Delete proxy",
|
||
"modalAddTitle": "Add proxy node",
|
||
"modalEditTitle": "Edit proxy node",
|
||
"modalDesc": "Supports socks5 and socks5h. Accounts will use the bound node as their outbound route.",
|
||
"nameLabel": "Proxy name",
|
||
"namePlaceholder": "Example: Hong Kong Exit A",
|
||
"typeLabel": "Proxy type",
|
||
"hostLabel": "Proxy host",
|
||
"hostPlaceholder": "127.0.0.1 or proxy hostname",
|
||
"portLabel": "Port",
|
||
"usernameLabel": "Username (optional)",
|
||
"usernamePlaceholder": "Proxy auth username",
|
||
"passwordLabel": "Password (optional)",
|
||
"passwordPlaceholder": "Proxy auth password",
|
||
"passwordKeepHint": "Leave blank to keep the currently stored password.",
|
||
"typeHelp": "socks5 resolves the target hostname locally before dialing through the proxy; socks5h forwards the hostname to the proxy for remote DNS resolution.",
|
||
"requiredFields": "Host and port are required.",
|
||
"saving": "Saving...",
|
||
"testing": "Testing",
|
||
"testAction": "Check proxy",
|
||
"untested": "Untested",
|
||
"saveAdd": "Add proxy",
|
||
"saveEdit": "Save changes",
|
||
"addSuccess": "Proxy added successfully.",
|
||
"updateSuccess": "Proxy updated successfully.",
|
||
"deleteConfirm": "Delete proxy {name}? Accounts bound to it will fall back to direct connection.",
|
||
"noProxies": "No proxy nodes yet.",
|
||
"authEnabled": "Auth enabled",
|
||
"testSuccessShort": "Reachable {time}ms",
|
||
"testFailedShort": "Test failed",
|
||
"totalProxies": "Total proxies",
|
||
"socks5hCount": "socks5h nodes",
|
||
"authProxyCount": "Authenticated nodes"
|
||
},
|
||
"apiTester": {
|
||
"defaultMessage": "Hello, please introduce yourself in one sentence.",
|
||
"models": {
|
||
"flash": "v4 Flash (thinking on by default)",
|
||
"pro": "v4 Pro (thinking on by default)",
|
||
"flashSearch": "v4 Flash (with search)",
|
||
"proSearch": "v4 Pro (with search)",
|
||
"vision": "v4 Vision (thinking on by default)",
|
||
"generic": "Compatible model",
|
||
"noThinking": "thinking forced off"
|
||
},
|
||
"missingApiKey": "Please provide an API key.",
|
||
"requestFailed": "Request failed.",
|
||
"networkError": "Network error: {error}",
|
||
"requestSuccess": "{account}: Request successful ({time}ms)",
|
||
"testSuccess": "{account}: Token refresh successful ({time}ms)",
|
||
"config": "Configuration",
|
||
"modelLabel": "Model",
|
||
"modelPickerHint": "Use the dropdown to pick a model. The list scrolls automatically.",
|
||
"loadingModels": "Loading models...",
|
||
"loadingModelsHint": "Fetching the available model list from /v1/models.",
|
||
"noModels": "No models available",
|
||
"noModelsHint": "The /v1/models endpoint did not return any usable models. Check the backend configuration or API status.",
|
||
"noModelsMessagePlaceholder": "No models are available right now, so the tester cannot send a request.",
|
||
"streamMode": "Streaming",
|
||
"accountSelector": "Account",
|
||
"autoRandom": "🤖 Auto / Random",
|
||
"apiKeyOptional": "API Key (optional)",
|
||
"apiKeyDefault": "Default: {preview}",
|
||
"apiKeyPlaceholder": "Enter a custom key",
|
||
"modeManaged": "Managed key mode (uses account pool).",
|
||
"modeDirect": "Direct token mode (requires a valid DeepSeek token).",
|
||
"attachmentAccountHint": "Attached files are bound to account {account}. Sending will reuse the same account.",
|
||
"fileAccountConflict": "Attached files came from different accounts. Clear them and upload again under one account.",
|
||
"fileAccountMismatch": "The selected account does not match the attachment account. Switch to the bound account or clear the attachments and try again.",
|
||
"statusError": "Error",
|
||
"reasoningTrace": "Reasoning Trace",
|
||
"generating": "Generating response...",
|
||
"enterMessage": "Enter a message...",
|
||
"adminConsoleLabel": "DeepSeek admin console"
|
||
},
|
||
"chatHistory": {
|
||
"loading": "Loading conversation history...",
|
||
"loadFailed": "Failed to load conversation history.",
|
||
"retentionTitle": "Retention",
|
||
"retentionDesc": "The server keeps only the latest N DeepSeek upstream response records across OpenAI Chat, OpenAI Responses, Claude, and Gemini direct interfaces.",
|
||
"off": "OFF",
|
||
"refresh": "Refresh",
|
||
"clearAll": "Clear all",
|
||
"clearSuccess": "Conversation history cleared.",
|
||
"clearFailed": "Failed to clear conversation history.",
|
||
"deleteSuccess": "Conversation deleted.",
|
||
"deleteFailed": "Failed to delete conversation.",
|
||
"updateLimitFailed": "Failed to update retention limit.",
|
||
"disabledSuccess": "Conversation history saving disabled.",
|
||
"limitUpdated": "Retention limit updated to {limit}",
|
||
"listTitle": "History",
|
||
"detailTitle": "Details",
|
||
"viewModeList": "List mode",
|
||
"viewModeMerged": "Merged mode",
|
||
"emptyTitle": "No conversation history yet",
|
||
"emptyDesc": "When a supported interface talks to DeepSeek upstream and receives a response, the server saves the result here automatically.",
|
||
"untitled": "Untitled conversation",
|
||
"noPreview": "No preview available.",
|
||
"selectPrompt": "Select a record on the left to view details.",
|
||
"mergedInput": "Final message sent to DeepSeek",
|
||
"emptyMergedPrompt": "No merged prompt is available.",
|
||
"copyHistory": "Copy HISTORY",
|
||
"downloadHistory": "Download HISTORY",
|
||
"copyMerged": "Copy merged prompt",
|
||
"downloadMerged": "Download merged prompt",
|
||
"copySuccess": "Copied successfully.",
|
||
"copyFailed": "Copy failed.",
|
||
"downloadSuccess": "Downloaded successfully.",
|
||
"downloadFailed": "Download failed.",
|
||
"expand": "Expand",
|
||
"collapse": "Collapse",
|
||
"reasoningTrace": "Reasoning Trace",
|
||
"failedOutput": "The request failed and no assistant output is available.",
|
||
"emptyAssistantOutput": "No assistant output is available.",
|
||
"emptyUserInput": "No user input is available.",
|
||
"confirmClearTitle": "Clear all records?",
|
||
"confirmClearDesc": "This deletes every server-side conversation record and cannot be undone.",
|
||
"confirmClearAction": "Clear all",
|
||
"metaTitle": "Metadata",
|
||
"metaAccount": "Account",
|
||
"metaElapsed": "Elapsed",
|
||
"metaSurface": "Surface",
|
||
"metaModel": "Model",
|
||
"metaStatusCode": "Status code",
|
||
"metaStream": "Output mode",
|
||
"metaCaller": "Caller fingerprint",
|
||
"metaTime": "Completed at",
|
||
"metaUnknown": "Unknown",
|
||
"backToTop": "Back to top",
|
||
"backToBottom": "Jump to bottom",
|
||
"streamMode": "Streaming",
|
||
"nonStreamMode": "Non-streaming",
|
||
"status": {
|
||
"streaming": "Streaming",
|
||
"success": "Success",
|
||
"error": "Error",
|
||
"stopped": "Stopped"
|
||
},
|
||
"role": {
|
||
"user": "User",
|
||
"assistant": "Assistant",
|
||
"tool": "Tool",
|
||
"system": "System"
|
||
}
|
||
},
|
||
"batchImport": {
|
||
"templates": {
|
||
"full": {
|
||
"name": "Full configuration template",
|
||
"desc": "Loaded from config.example.json with keys, accounts, and defaults"
|
||
},
|
||
"emailOnly": {
|
||
"name": "Email-only accounts",
|
||
"desc": "Batch import accounts using email login"
|
||
},
|
||
"mobileOnly": {
|
||
"name": "Mobile-only accounts",
|
||
"desc": "Batch import accounts using mobile login"
|
||
},
|
||
"keysOnly": {
|
||
"name": "API keys only",
|
||
"desc": "Add API access keys only"
|
||
}
|
||
},
|
||
"enterJson": "Please provide JSON configuration content.",
|
||
"importSuccess": "Import successful: {keys} keys, {accounts} accounts",
|
||
"templateLoaded": "Template loaded: {name}",
|
||
"currentConfigLoaded": "Current configuration loaded.",
|
||
"fetchConfigFailed": "Failed to fetch configuration.",
|
||
"copySuccess": "Base64 configuration copied to clipboard.",
|
||
"quickTemplates": "Quick Templates",
|
||
"dataExport": "Data Export",
|
||
"dataExportDesc": "Copy the Base64-encoded configuration for Vercel environment variables.",
|
||
"copyBase64": "Copy Base64 config",
|
||
"copied": "Copied",
|
||
"variableName": "Variable name",
|
||
"jsonEditor": "JSON Editor",
|
||
"loadCurrentConfig": "Load current config",
|
||
"applyConfig": "Apply config",
|
||
"importing": "Importing...",
|
||
"importComplete": "Import complete",
|
||
"importSummary": "Imported {keys} API keys and updated {accounts} accounts."
|
||
},
|
||
"settings": {
|
||
"loadFailed": "Failed to load settings.",
|
||
"nonJsonResponse": "Unexpected non-JSON response from server (status: {status}).",
|
||
"save": "Save settings",
|
||
"saving": "Saving...",
|
||
"saveSuccess": "Settings saved and hot reloaded.",
|
||
"saveFailed": "Failed to save settings.",
|
||
"securityTitle": "Security",
|
||
"jwtExpireHours": "JWT expiry (hours)",
|
||
"newPassword": "New admin password",
|
||
"newPasswordPlaceholder": "Enter new password (min 4 chars)",
|
||
"updatePassword": "Update password",
|
||
"updating": "Updating...",
|
||
"passwordTooShort": "Password must be at least 4 characters.",
|
||
"passwordUpdated": "Password updated. Please sign in again.",
|
||
"passwordUpdateFailed": "Failed to update password.",
|
||
"runtimeTitle": "Runtime",
|
||
"accountMaxInflight": "Per-account max inflight",
|
||
"accountMaxQueue": "Account max queue size",
|
||
"globalMaxInflight": "Global max inflight",
|
||
"tokenRefreshIntervalHours": "Managed token refresh interval (hours)",
|
||
"behaviorTitle": "Behavior",
|
||
"responsesTTL": "Responses store TTL (seconds)",
|
||
"embeddingsProvider": "Embeddings provider",
|
||
"thinkingInjectionEnabled": "Thinking format injection",
|
||
"thinkingInjectionDesc": "Append a structured <think> checklist to the latest user message before prompt assembly.",
|
||
"thinkingInjectionPrompt": "Thinking format prompt",
|
||
"thinkingInjectionPromptHelp": "Leave empty to use the built-in default prompt shown as the input placeholder.",
|
||
"currentInputFileTitle": "Independent Split",
|
||
"currentInputFileEnabled": "Independent split (by size)",
|
||
"currentInputFileDesc": "Enabled by default. Once the character threshold is reached, upload the full context as a DS2API_HISTORY.txt context file.",
|
||
"currentInputFileMinChars": "Current input threshold (characters)",
|
||
"currentInputFileHelp": "Default is 0, which uses independent split for any non-empty input.",
|
||
"modelTitle": "Model mapping",
|
||
"modelAliases": "Global model aliases (JSON)",
|
||
"autoDeleteTitle": "Session Cleanup Policy",
|
||
"autoDeleteDesc": "Choose how DeepSeek remote chat records are cleaned up after each request completes.",
|
||
"autoDeleteMode": "Deletion mode",
|
||
"autoDeleteNone": "Do not delete",
|
||
"autoDeleteSingle": "Delete current session",
|
||
"autoDeleteAll": "Delete all sessions",
|
||
"autoDeleteNoneDesc": "Keep the remote session after the request completes.",
|
||
"autoDeleteSingleDesc": "Delete only the remote session created by this request.",
|
||
"autoDeleteAllDesc": "Delete every remote session for the account after the request completes.",
|
||
"autoDeleteWarning": "This mode deletes remote chat records. Use with caution.",
|
||
"backupTitle": "Backup & Restore",
|
||
"loadExport": "Load current export",
|
||
"downloadExport": "Download backup file",
|
||
"importModeMerge": "Merge import (default)",
|
||
"importModeReplace": "Replace all import",
|
||
"chooseImportFile": "Choose import file",
|
||
"importNow": "Import now",
|
||
"importing": "Importing...",
|
||
"importPlaceholder": "Paste config JSON to import",
|
||
"importEmpty": "Please input import JSON.",
|
||
"importInvalidJson": "Import JSON is invalid.",
|
||
"importFailed": "Import failed.",
|
||
"importSuccess": "Config imported (mode: {mode}).",
|
||
"importFileLoaded": "Import file content loaded.",
|
||
"importFileReadFailed": "Failed to read import file.",
|
||
"exportFailed": "Export failed.",
|
||
"exportLoaded": "Current export loaded.",
|
||
"exportDownloaded": "Backup file download started.",
|
||
"exportJson": "Export JSON",
|
||
"invalidJsonField": "{field} is not a valid JSON object.",
|
||
"defaultPasswordWarning": "You are using the default admin password \"admin\". Please change it.",
|
||
"vercelSyncHint": "Configuration changed. For Vercel deployments, sync manually in Vercel Sync and redeploy.",
|
||
"autoFetchPaused": "Auto loading paused after {count} failures: {error}",
|
||
"retryLoad": "Retry now"
|
||
},
|
||
"login": {
|
||
"welcome": "Welcome back",
|
||
"subtitle": "Enter your admin key to continue",
|
||
"adminKeyLabel": "Admin key",
|
||
"adminKeyPlaceholder": "Enter your admin key...",
|
||
"rememberSession": "Remember this session",
|
||
"signIn": "Sign in",
|
||
"secureConnection": "Secure connection",
|
||
"adminPortal": "DS2API admin portal",
|
||
"signInFailed": "Sign-in failed.",
|
||
"networkError": "Network error: {error}"
|
||
},
|
||
"vercel": {
|
||
"tokenRequired": "Vercel access token is required.",
|
||
"projectRequired": "Project ID is required.",
|
||
"syncFailed": "Sync failed.",
|
||
"networkError": "Network error.",
|
||
"title": "Vercel Deployment",
|
||
"description": "Sync the current keys and accounts directly to Vercel environment variables.",
|
||
"tokenLabel": "Vercel Access Token",
|
||
"getToken": "Get token",
|
||
"tokenPlaceholderPreconfig": "Using preconfigured token",
|
||
"tokenPlaceholder": "Enter Vercel access token",
|
||
"projectIdLabel": "Project ID",
|
||
"projectIdHint": "Find it in Project Settings → General.",
|
||
"teamIdLabel": "Team ID",
|
||
"optional": "optional",
|
||
"saveCredentials": "Remember Vercel credentials",
|
||
"saveCredentialsHint": "Save the token, project ID, and team ID for the next sync.",
|
||
"syncing": "Syncing...",
|
||
"syncRedeploy": "Sync & redeploy",
|
||
"redeployHint": "This triggers a Vercel redeploy and usually takes 30–60 seconds.",
|
||
"syncSucceeded": "Sync succeeded",
|
||
"syncFailedLabel": "Sync failed",
|
||
"openDeployment": "Open deployment",
|
||
"statusSynced": "Synced",
|
||
"statusNotSynced": "Not synced",
|
||
"statusNeverSynced": "Never synced",
|
||
"lastSyncTime": "Last sync: {time}",
|
||
"draftDiffers": "Frontend draft differs from env config. Click Sync & redeploy.",
|
||
"pollPaused": "Status polling paused after {count} failures.",
|
||
"manualRefresh": "Refresh manually",
|
||
"howItWorks": "How it works",
|
||
"steps": {
|
||
"one": "The current configuration (keys and accounts) is exported as JSON.",
|
||
"two": "The JSON is Base64-encoded for safe formatting.",
|
||
"three": "Update the env var in Vercel:",
|
||
"four": "Trigger a redeploy to apply the updated environment variables."
|
||
}
|
||
}
|
||
}
|