mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-10-12 20:49:53 +08:00
## Problem
Two audits of the repository (a workflow of finder, dedup and per-file verifier agents, run on 2026-10-11 against 1f4141e and again against 07f3e3c after a first round of refactoring) found dead code and features that were more machinery than the app needs: an Electron configuration-preset system with its own settings window, three copies of the about page, a hand-written `.env` parser, an "extended" system prompt nobody selected, two data migrations for formats from 2025-12 and 2026-01, a server-side example cache, type-to-confirm provider deletion, 81 unused dictionary keys, wrapper components around single call sites, and a long tail of unused exports, props, options and tests.
## Change
Every item below was either approved one by one or covered by "fix all of the others".
- **Electron:** the configuration-preset system is gone (settings window, preload, IPC, menu entry, dev watcher); `config-manager.ts` keeps only `userLocale`; `.env` files are parsed with `dotenv`. Entitlements file and a duplicate CI workflow removed; `test.yml` gets a type check and concurrency.
- **Server:** no extended prompt, no example cache, no `ENABLE_HISTORY_XML_REPLACE`, no message metadata or `hasConfig`; the connection test is one shared helper; EdgeOne loses its mock branch and model aliases; `DEBUG_LLM_PAYLOAD` logs message structure instead of payloads; Langfuse scoring helper; `apiKeyEnv` arrays kept and documented in `env.example` and the provider docs.
- **Pages:** one about page per language from a single component (old `/cn` and `/ja` URLs redirect with 308); layout uses `hasLocale`; the GitHub icon is a local component instead of `react-icons`; Cloudflare deploys without an R2 cache by default.
- **Chat and canvas:** the legacy `diagramHistory` conversion, the localStorage chat migration and the templates storage are gone; `chat-engine` reads the diagram through the context's refs; the diagram context has one tagged export path (`requestTaggedExport` / `fetchDiagramXml`); the screenshot check uses fetch + JSON and `generateText` with `Output.object`; `load-diagram` accepts `<svg:svg>` and strips the XML prolog.
- **Settings UI:** `model-selector` inlines its Dialog, Command and Tooltip; `ai-elements/model-selector`, `button-with-tooltip`, `error-toast` removed; no type-to-confirm, no footer, no `bedrockApiKey`; `use-model-config` loses the old-format migration; one reasoning component; the shimmer is CSS (no `motion`, no `@radix-ui/react-use-controllable-state`); 81 dictionary keys removed in all four languages.
- **MCP server:** `registerTool` / `ok` / `fail` replace per-tool try/catch; `syncFromBrowser`, `commitDocument`, `describePages`; the hand-written XML syntax check, unused result fields, `pickPageSelector`, `expandStyles` and the `host` attribute handling are gone; tests get a shared `setup.ts` and drive the server through the SDK client.
- **Prompt:** the web app's style rules come from the MCP drawing guide (`styleRules`), byte-identical to before.
- **Tests:** shared e2e helpers (`openApp`, `sse`, `toolCallEvents`, `chunkedReplies`); placeholder specs dropped; `settings-review-fixes` split by topic; unit tests use `vi.stubEnv`.
- **Dependencies removed:** `@xmldom/xmldom`, `remark-gfm`, `@anthropic-ai/tokenizer`, `@testing-library/user-event`, `concurrently`, `wait-on`, `eslint`, `eslint-config-next`, `@vitest/coverage-v8`, `shx`, `motion`, `@radix-ui/react-use-controllable-state`, `react-icons`.
Source lines: 74,983 before, 67,418 after (excluding lockfiles).
The last commit merges #984 (the canvas shell). Where the shell, the classic page or their tests depend on a wire format or signature this branch had changed, main's version wins (export fields of the poll response, `addHistory` signature); where main only extended code this branch restructured, main's change is carried into the new structure (`start_session`, `get_selection`, `prepareNewDiagram`, the diagram context's `requestExport`).
## Testing
- `tsc --noEmit` for the web app, `packages/mcp-server`, its shell and `electron`: clean
- `biome ci`: 0 errors (37 pre-existing warnings)
- Root `vitest run`: 719 passed; `packages/mcp-server` `vitest run`: 372 passed
- `next build`: clean
- Playwright, whole web suite on the dev server (4 workers): 280 tests, 279 passed; `language.spec.ts` "a stale offer to switch without saving does nothing once a message is being sent" failed under parallel load and passed alone, as it does on main
630 lines
30 KiB
JSON
630 lines
30 KiB
JSON
{
|
|
"common": {
|
|
"save": "Save",
|
|
"cancel": "Cancel",
|
|
"close": "Close",
|
|
"edit": "Edit",
|
|
"delete": "Delete",
|
|
"loading": "Loading.."
|
|
},
|
|
"nav": {
|
|
"newChat": "New diagram",
|
|
"settings": "Settings",
|
|
"hidePanel": "Hide chat panel",
|
|
"showPanel": "Show chat panel",
|
|
"aiChat": "AI chat"
|
|
},
|
|
"chat": {
|
|
"placeholder": "Describe your diagram or upload a file...",
|
|
"inputLabel": "Chat input",
|
|
"send": "Send",
|
|
"stopGeneration": "Stop generation",
|
|
"uploadFile": "Upload file (image, PDF, text)",
|
|
"minimalStyle": "Minimal",
|
|
"styledMode": "Styled",
|
|
"regenerate": "Regenerate response",
|
|
"copyResponse": "Copy response",
|
|
"copied": "Copied!",
|
|
"failedToCopyDetail": "Failed to copy message. Please copy manually or check clipboard permissions.",
|
|
"goodResponse": "Good response",
|
|
"badResponse": "Bad response",
|
|
"clickToEdit": "Click to edit",
|
|
"editMessage": "Edit message",
|
|
"saveAndSubmit": "Save & submit",
|
|
"ExtractURL": "Extract from URL",
|
|
"attach": "Add",
|
|
"placeholderFollowUp": "Ask for a change, or select shapes to edit them",
|
|
"emptyThread": "Draw on the canvas, or describe what you want below.",
|
|
"attachedImage": "Attached image",
|
|
"retry": "Retry"
|
|
},
|
|
"examples": {
|
|
"paperToDiagram": "Paper to diagram",
|
|
"paperDescription": "Upload .pdf, .txt, .md, .json, .csv, .py, .js, .ts and more",
|
|
"animatedDiagram": "Animated diagram",
|
|
"animatedDescription": "Draw a transformer architecture with animated connectors",
|
|
"awsArchitecture": "AWS architecture",
|
|
"awsDescription": "Create a cloud architecture diagram with AWS icons",
|
|
"replicateFlowchart": "Replicate a flowchart",
|
|
"replicateDescription": "Upload and replicate an existing flowchart",
|
|
"creativeDrawing": "Creative drawing",
|
|
"creativeDescription": "Draw something fun and creative",
|
|
"cachedNote": "Examples use saved answers: they appear instantly and don't call the AI.",
|
|
"mcpServer": "MCP Server",
|
|
"mcpDescription": "Use in Claude Desktop, VS Code & Cursor"
|
|
},
|
|
"settings": {
|
|
"title": "Settings",
|
|
"description": "Configure your application settings.",
|
|
"accessCode": "Access code",
|
|
"accessCodePlaceholder": "Enter access code",
|
|
"accessCodeDescription": "Required to use this application.",
|
|
"language": "Language",
|
|
"languageDescription": "Choose your interface language.",
|
|
"theme": "Theme",
|
|
"themeDescription": "Light or dark interface. The canvas follows the same theme.",
|
|
"diagramStyle": "Diagram style",
|
|
"diagramStyleDescription": "How the AI draws new diagrams: Styled uses colors and icons, Minimal keeps shapes plain.",
|
|
"sendShortcut": "Send shortcut",
|
|
"sendShortcutDescription": "Choose how to send messages.",
|
|
"enterToSend": "Enter to send",
|
|
"ctrlEnterToSend": "Cmd/Ctrl+Enter to send",
|
|
"proxy": "Proxy settings",
|
|
"proxyDescription": "Configure HTTP/HTTPS proxy for API requests (Desktop only)",
|
|
"httpProxy": "HTTP proxy",
|
|
"httpsProxy": "HTTPS proxy",
|
|
"applyProxy": "Apply",
|
|
"proxyApplied": "Proxy settings applied",
|
|
"diagramValidation": "Check diagrams with a screenshot (experimental)",
|
|
"diagramValidationDescription": "After each drawing, a model that can read images looks at a screenshot and asks for fixes. Needs a model that can read images.",
|
|
"customSystemMessage": "Custom instructions",
|
|
"customSystemMessageDescription": "Add custom instructions appended to the AI's system prompt.",
|
|
"customSystemMessagePlaceholder": "e.g., Always use blue color scheme for diagrams...",
|
|
"maxOutputTokens": "Output token limit",
|
|
"maxOutputTokensDescription": "Budget for one reply, shared by thinking and the diagram XML. Raise it if the AI keeps thinking and no diagram appears. Leave empty for the default.",
|
|
"tabModels": "Models",
|
|
"tabAbout": "About",
|
|
"themeLight": "Light",
|
|
"themeDarkMode": "Dark",
|
|
"themeSystem": "System",
|
|
"accessCodeSaved": "Access code saved",
|
|
"proxyInvalid": "Proxy addresses must start with http:// or https://",
|
|
"proxyFailed": "Couldn't apply the proxy settings",
|
|
"appVersion": "Version",
|
|
"projectWebsite": "Project website",
|
|
"tabGeneral": "General",
|
|
"tabDrawing": "Drawing",
|
|
"sectionInterface": "Interface",
|
|
"sectionAccess": "Access"
|
|
},
|
|
"save": {
|
|
"title": "Export diagram",
|
|
"description": "Pick a format and a file name.",
|
|
"format": "Format",
|
|
"filename": "Filename",
|
|
"filenamePlaceholder": "Enter filename",
|
|
"formats": {
|
|
"drawio": "draw.io file",
|
|
"png": "PNG image",
|
|
"svg": "SVG image",
|
|
"xmlsvg": "Editable SVG"
|
|
},
|
|
"savedSuccessfully": "Diagram exported",
|
|
"hints": {
|
|
"drawio": "Keeps everything editable",
|
|
"png": "A picture for slides and documents",
|
|
"svg": "A picture that scales without blur",
|
|
"xmlsvg": "A picture that still opens in draw.io"
|
|
}
|
|
},
|
|
"dialogs": {
|
|
"clearSuccess": "Started a fresh chat"
|
|
},
|
|
"errors": {
|
|
"maxFiles": "Too many files. Maximum {max} allowed.",
|
|
"onlyMoreAllowed": "Only {slots} more file(s) allowed",
|
|
"fileExceeds": "\"{name}\" is {size} (exceeds {max}MB)",
|
|
"unsupportedType": "\"{name}\" is not a supported file type",
|
|
"filesRejected": "{count} files rejected:",
|
|
"andMore": "...and {count} more",
|
|
"invalidAccessCode": "Invalid or missing access code. Please configure it in Settings.",
|
|
"networkError": "Network error. Please check your connection.",
|
|
"retryLimit": "Auto-retry limit reached ({max}). Please try again manually.",
|
|
"continuationRetryLimit": "Continuation retry limit reached ({max}). The diagram may be too complex.",
|
|
"sessionCorrupted": "Session data was corrupted. Starting fresh.",
|
|
"failedToExport": "Error fetching chart data",
|
|
"failedToLoadExample": "Error loading example image",
|
|
"failedToRecordFeedback": "Failed to record your feedback. Please try again.",
|
|
"sessionSaveFailed": "Could not save this chat. Browser storage may be full: delete old chats from history and try again.",
|
|
"sessionSaveFailedLeave": "Could not save this chat. Browser storage may be full. You can go on without saving it, then delete old chats from the list in the new chat.",
|
|
"continueWithoutSaving": "Continue without saving",
|
|
"notADiagramFile": "{name} isn't a draw.io diagram.",
|
|
"fileTooLong": "{name}: Content exceeds {limit}k character limit ({size}k chars)",
|
|
"fileReadFailed": "Failed to read file: {name}",
|
|
"answerEndedEarly": "The answer ended before the diagram was finished.",
|
|
"attachmentsStillReading": "Attachments are still being read. Send again when they are ready.",
|
|
"sendInProgress": "The last message is still being sent. Try again in a moment.",
|
|
"answerInProgress": "An answer is still coming. Send again when it is done.",
|
|
"cannotResend": "This message can't be sent again: the diagram from when it was sent wasn't saved.",
|
|
"llm": {
|
|
"invalid_api_key": "The provider rejected the API key. Check it in model settings.",
|
|
"forbidden": "The provider refused the request. The key may not have access to this model or region.",
|
|
"server_key_forbidden": "Today's free quota is used up. It resets tomorrow. You can also add your own API key in model settings to keep going.",
|
|
"model_not_found": "The provider does not know this model. Check the model ID in model settings.",
|
|
"insufficient_quota": "The provider account has no credit or quota left.",
|
|
"rate_limited": "The provider is limiting requests. Wait a moment and try again.",
|
|
"context_too_long": "The conversation is too long for this model. Start a new chat or pick a model with a larger context.",
|
|
"images_unsupported": "This model doesn't support image input.",
|
|
"tools_unsupported": "This model doesn't support tool calls, which drawing needs. Pick another model.",
|
|
"output_truncated": "The output was cut off before the diagram was complete. Try a simpler request or raise the output limit in settings.",
|
|
"provider_unavailable": "The provider is having problems. Try again later.",
|
|
"cannot_connect": "Could not reach the provider. Check the base URL and your network.",
|
|
"timeout": "The provider did not answer in time.",
|
|
"openModelSettings": "Open model settings"
|
|
}
|
|
},
|
|
"quota": {
|
|
"dailyLimit": "Daily Quota Reached",
|
|
"tokenLimit": "Daily Token Limit Reached",
|
|
"tpmMessageDetailed": "Rate limit reached ({limit} tokens/min). Please wait {seconds} seconds before sending another request.",
|
|
"messageApi": "Looks like you've reached today's demo limit. We're glad you're enjoying it; the limit keeps the demo fair for everyone.",
|
|
"messageApiSelfHosted": null,
|
|
"messageToken": "Looks like you've reached today's token limit. We're glad you're enjoying it; the limit keeps the demo fair for everyone.",
|
|
"messageTokenSelfHosted": null,
|
|
"tip": "<strong>Tip:</strong> You can use your own API key (click the Settings icon) or self-host the project to bypass these limits.",
|
|
"tipSelfHosted": "<strong>Tip:</strong> You can configure your own API key in the settings to continue using the service.",
|
|
"reset": "Your limit resets tomorrow. Thanks for understanding.",
|
|
"configModel": "Use Your API Key",
|
|
"selfHost": "Self-host",
|
|
"sponsor": "Sponsor",
|
|
"usedOf": "{used}/{limit}"
|
|
},
|
|
"tools": {
|
|
"truncated": "Truncated"
|
|
},
|
|
"file": {
|
|
"reading": "Reading...",
|
|
"chars": "chars",
|
|
"removeFile": "Remove file"
|
|
},
|
|
"url": {
|
|
"title": "Extract Content from URL",
|
|
"description": "Paste a URL to extract and analyze its content",
|
|
"Extracting": "Extracting...",
|
|
"extract": "Extract",
|
|
"Cancel": "Cancel",
|
|
"enterUrl": "Please enter a URL",
|
|
"invalidFormat": "Invalid URL format",
|
|
"failed": "Couldn't read that page"
|
|
},
|
|
"reasoning": {
|
|
"thinking": "Thinking...",
|
|
"thoughtFor": "Thought for {duration} seconds",
|
|
"thoughtForOne": "Thought for 1 second",
|
|
"thoughtBrief": "Thought for a few seconds"
|
|
},
|
|
"sessionHistory": {
|
|
"empty": "No diagrams yet",
|
|
"deleteTitle": "Delete this diagram?",
|
|
"deleteDescription": "The diagram and its conversation are deleted for good.",
|
|
"justNow": "Just now",
|
|
"searchPlaceholder": "Search diagrams…",
|
|
"noResults": "No chats found",
|
|
"rename": "Rename",
|
|
"busyHint": "Available when the answer is finished"
|
|
},
|
|
"templates": {
|
|
"emptyTitle": "No saved prompts yet",
|
|
"emptyDescription": "Save a prompt you reuse, for example \"Draw an AWS architecture for…\". It shows up here.",
|
|
"createFirst": "Save your first prompt",
|
|
"neverUsed": "Not used yet",
|
|
"usedCount": "{count} uses",
|
|
"myTemplates": "Saved prompts",
|
|
"createTitle": "Save a prompt",
|
|
"createDescription": "Save a prompt to use again later.",
|
|
"promptLabel": "Prompt",
|
|
"promptPlaceholder": "Describe the diagram you want to create...",
|
|
"promptRequired": "Prompt is required",
|
|
"titleLabel": "Title",
|
|
"titlePlaceholder": "Enter a title",
|
|
"titleHint": "Leave empty to use the first 20 characters of prompt",
|
|
"descriptionLabel": "Description",
|
|
"descriptionPlaceholder": "What this prompt is for",
|
|
"pinnedLabel": "Pin to top",
|
|
"pinnedHint": "Pinned prompts appear at the top of the list",
|
|
"createButton": "Save prompt",
|
|
"createFailed": "Couldn't save the prompt. Try again.",
|
|
"editTitle": "Edit saved prompt",
|
|
"editDescription": "Change the prompt and its settings.",
|
|
"updateFailed": "Couldn't update the prompt. Try again.",
|
|
"duplicate": "Duplicate",
|
|
"copySuffix": "(copy)",
|
|
"deleteTitle": "Delete this saved prompt?",
|
|
"deleteDescription": "The prompt is deleted for good.",
|
|
"confirmSendTitle": "Replace current input?",
|
|
"confirmSendDescription": "You have unsent text in the message box. Sending this prompt replaces it.",
|
|
"confirmSendButton": "Send prompt",
|
|
"searchPlaceholder": "Search saved prompts…",
|
|
"searchNoResults": "No saved prompts match",
|
|
"pin": "Pin to top",
|
|
"unpin": "Unpin from top",
|
|
"saveAsTemplate": "Save this prompt",
|
|
"exportTemplates": "Export saved prompts",
|
|
"importTemplates": "Import saved prompts",
|
|
"exportEmpty": "No saved prompts to export",
|
|
"exportSuccess": "Exported {count} saved prompt(s)",
|
|
"importNoFile": "Please select a JSON file",
|
|
"importFailed": "Import failed: {error}",
|
|
"importSuccess": "Imported {imported} saved prompt(s), skipped {skipped} duplicate(s)",
|
|
"saveDisabledHint": "Type a prompt first"
|
|
},
|
|
"validation": {
|
|
"title": "Validate Diagram",
|
|
"capturing": "Capturing",
|
|
"validating": "Validating",
|
|
"validatingWithAttempt": "Validating ({attempt}/{max})",
|
|
"valid": "Valid",
|
|
"validWithWarnings": "Valid with Warnings",
|
|
"issuesFound": "Issues Found",
|
|
"error": "Error",
|
|
"skipped": "Skipped",
|
|
"capturedScreenshot": "Captured Screenshot:",
|
|
"issuesFoundLabel": "Issues Found:",
|
|
"suggestions": "Suggestions:",
|
|
"passedValidation": "Diagram passed visual validation - no issues detected.",
|
|
"improvementRequested": "Improvement requested - check the new diagram below",
|
|
"improveWithSuggestions": "Improve with Suggestions",
|
|
"regenerateWithFeedback": "Regenerate the diagram using the validation feedback"
|
|
},
|
|
"modelConfig": {
|
|
"addProvider": "Add provider",
|
|
"modelId": "Model ID",
|
|
"deleteProvider": "Delete provider",
|
|
"validationError": "The test failed",
|
|
"addModelFirst": "Add a model first.",
|
|
"displayName": "Display Name",
|
|
"bedrockApiKey": "Bedrock API key",
|
|
"awsAccessKeyId": "AWS Access Key ID",
|
|
"awsSecretAccessKey": "AWS Secret Access Key",
|
|
"awsRegion": "AWS Region",
|
|
"selectRegion": "Select region",
|
|
"apiKey": "API key",
|
|
"enterApiKey": "Enter your API key",
|
|
"enterSecretKey": "Enter your secret access key",
|
|
"optional": "(optional)",
|
|
"getApiKey": "Get API key",
|
|
"noTools": "no tool calls",
|
|
"mayNotDraw": "models.dev lists no tool call support for this model, so it may not be able to draw.",
|
|
"requestUrl": "Requests go to {url}",
|
|
"baseUrlWithExample": "Base URL (optional, e.g. {example})",
|
|
"customEndpoint": "Custom endpoint URL",
|
|
"minimaxBaseUrlHint": "Use /anthropic for Anthropic-compatible API (recommended), or /v1 for OpenAI-compatible API",
|
|
"mimoBaseUrlHint": "Default works with pay-as-you-go keys (sk-...). Token Plan subscribers (tp-... keys) must set https://token-plan-cn.xiaomimimo.com/v1",
|
|
"models": "Models",
|
|
"customModelId": "Custom model ID...",
|
|
"allAdded": "All added",
|
|
"modelIdEmpty": "Model ID cannot be empty",
|
|
"modelIdExists": "This model ID already exists",
|
|
"deleteConfirmDesc": "Are you sure you want to delete {name}? This will remove all configured models and cannot be undone.",
|
|
"requestFailed": "Request failed ({status})",
|
|
"cancel": "Cancel",
|
|
"delete": "Delete",
|
|
"clickToChange": "(click to change)",
|
|
"usingServerDefault": "Using server default model",
|
|
"selectModel": "Select Model",
|
|
"searchModels": "Search models...",
|
|
"noModelsFound": "No models found.",
|
|
"default": "Default",
|
|
"serverDefault": "Server model",
|
|
"serverModels": "Server Models",
|
|
"userModels": "User Models",
|
|
"configureModels": "Configure Models...",
|
|
"serverDefaultModel": "Server default model",
|
|
"showValue": "Show value",
|
|
"hideValue": "Hide value",
|
|
"myProviders": "My providers",
|
|
"inUse": "In use",
|
|
"listSeparator": ", ",
|
|
"serverModelsTitle": "Models from this server",
|
|
"serverDefaultSummary": "No API key needed: the server's default model.",
|
|
"statusError": "{count} failed",
|
|
"statusIncomplete": "Not set up yet",
|
|
"statusUntested": "{count} untested",
|
|
"statusOk": "{count} working",
|
|
"noModelsYet": "No models yet",
|
|
"keysStayLocal": "API keys stay in this browser on this device and go to the server only with your requests.",
|
|
"useOwnKey": "Use your own API key",
|
|
"useOwnKeyHint": "Add a provider to use its models from the chat's model picker. Pick one to start:",
|
|
"viewAllProviders": "See all {count} providers",
|
|
"searchProviders": "Search providers, e.g. DeepSeek, Qwen, Ollama",
|
|
"noProvidersFound": "No provider matches.",
|
|
"groupVendors": "Model makers",
|
|
"groupAggregators": "Aggregators",
|
|
"groupCloud": "Cloud platforms",
|
|
"groupSelfHosted": "Self-hosted",
|
|
"noteBedrock": "AWS credentials",
|
|
"noteVertex": "Express mode key",
|
|
"noteAzure": "Key and resource URL",
|
|
"noteEdgeone": "No key needed",
|
|
"noteOllama": "Key optional",
|
|
"noteSglang": "Your server's URL",
|
|
"added": "Added",
|
|
"awsCredentials": "AWS credentials",
|
|
"bedrockAuthApiKey": "Bedrock API key",
|
|
"bedrockAuthAccessKey": "Access keys",
|
|
"moreOptions": "More options: base URL, display name",
|
|
"moreOptionsName": "More options: display name",
|
|
"keyRejected": "The provider rejected this API key. Check that the key above was copied in full.",
|
|
"modelNotFound": "The provider can't find this model ID. Check its spelling.",
|
|
"modelWorks": "Works",
|
|
"modelWorksTime": "Works · {seconds} s",
|
|
"modelFailed": "Failed",
|
|
"modelUntested": "Untested",
|
|
"needKey": "Fill in the API key first.",
|
|
"needAws": "Fill in the AWS credentials and region first.",
|
|
"needModel": "Add a model first.",
|
|
"stepConnect": "Connection",
|
|
"edgeoneNoKey": "EdgeOne Pages uses the model service that comes with this site's deployment: no API key needed.",
|
|
"stepModels": "Models",
|
|
"fetchAllModels": "Get all models from {name}",
|
|
"suggestedLabel": "Suggested:",
|
|
"orTypeModelId": "Or type another model ID",
|
|
"add": "Add",
|
|
"browseModels": "Browse models",
|
|
"stepTest": "Test",
|
|
"testHint": "Sends each model a very short message to check that the key and the model work.",
|
|
"testOne": "Test {model}",
|
|
"testAll": "Test all {count} models",
|
|
"testPassedOne": "{model} works",
|
|
"testPassedAll": "All {count} models work",
|
|
"answeredIn": "(answered in {seconds} s)",
|
|
"useInChat": "Use {model} in the chat",
|
|
"backToProviders": "Back to providers",
|
|
"deleteProviderOnly": "Delete {name}",
|
|
"addProviderEntry": "Add a provider…",
|
|
"awsKeysRejected": "AWS rejected these access keys. Check that both were copied in full.",
|
|
"needAzure": "Fill in the API key and your Azure resource's base URL first.",
|
|
"validationFailedCountOne": "{count} model failed the test",
|
|
"validationFailedCountOther": "{count} models failed the test",
|
|
"deleteProviderNamedOne": "Delete {name} and its model",
|
|
"deleteProviderNamedOther": "Delete {name} and its {count} models",
|
|
"serverModelsSummaryOne": "No API key needed. {count} model: {names}",
|
|
"serverModelsSummaryOther": "No API key needed. {count} models: {names}",
|
|
"noModelsReturned": "The provider returned no models.",
|
|
"awsSessionToken": "AWS session token (optional)",
|
|
"awsSessionTokenHint": "Only for temporary credentials: access keys that start with ASIA.",
|
|
"bedrockBothSaved": "This provider also keeps an access key pair, unused while there is an API key.",
|
|
"removeAccessKeys": "Remove the access keys"
|
|
},
|
|
"admin": {
|
|
"title": "Admin Settings",
|
|
"loginPrompt": "Enter the admin password (the ADMIN_PASSWORD environment variable)",
|
|
"password": "Password",
|
|
"signIn": "Sign In",
|
|
"signingIn": "Signing in…",
|
|
"loginFailed": "Login failed",
|
|
"precedence": "Priority: this page > environment variables > defaults",
|
|
"notWritable": "Settings can't be saved on this deployment, only viewed; use environment variables instead",
|
|
"settingGroups": "Setting groups",
|
|
"enabled": "On",
|
|
"disabled": "Off",
|
|
"enableGroup": "Turn on {group}",
|
|
"unsavedChanges": "Unsaved changes",
|
|
"saved": "Saved. Changes apply right away, except items marked \"Needs restart\"",
|
|
"saveFailed": "Save failed. Check your connection and try again",
|
|
"invalidSettings": "Some settings are invalid; see the notes under them",
|
|
"discard": "Discard changes",
|
|
"saveChanges": "Save changes",
|
|
"saving": "Saving…",
|
|
"sourceSaved": "This page",
|
|
"sourceEnv": "Env",
|
|
"sourceSavedTitle": "Set on this page",
|
|
"sourceEnvTitle": "From an environment variable",
|
|
"restartRequired": "Needs restart",
|
|
"modified": "Modified",
|
|
"notSet": "Not set",
|
|
"savedReplace": "Saved ({hint}); type a new value to replace it",
|
|
"showValue": "Show",
|
|
"hideValue": "Hide",
|
|
"removeValue": "Clear",
|
|
"removeValueTitle": "Clear the saved value",
|
|
"resetToDefault": "Reset to default",
|
|
"models": "Models",
|
|
"modelsDescription": "Models every user can use, no personal API key needed",
|
|
"addProviderHint": "Add a provider to offer models to all users",
|
|
"selectProviderHint": "Select or add a provider, then enter its key and models",
|
|
"addProviderToOfferModels": "Add at least one model before users can see this provider",
|
|
"managedViaEnv": "(environment variables)",
|
|
"envReadOnly": "Defined in AI_MODELS_CONFIG / ai-models.json; view only here, edit it there",
|
|
"defaultModel": "Default Model",
|
|
"noModelsConfigured": "No models yet",
|
|
"modelCount": "{count} model",
|
|
"modelCountPlural": "{count} models",
|
|
"default": "Default",
|
|
"setAsDefault": "Set as default provider",
|
|
"defaultProvider": "Default provider",
|
|
"modelIdPlaceholder": "Model ID…",
|
|
"addModel": "Add model",
|
|
"suggested": "Suggested",
|
|
"test": "Test",
|
|
"testOk": "Passed ({ms} ms)",
|
|
"testFailed": "Failed",
|
|
"removeModel": "Delete {model}",
|
|
"deleteProviderTitle": "Delete {name}?",
|
|
"deleteProviderDesc": "After you save, its key and models are deleted from the server",
|
|
"cancel": "Cancel",
|
|
"delete": "Delete",
|
|
"groups": {
|
|
"generation": {
|
|
"title": "Replies",
|
|
"description": "How the AI replies, for every conversation"
|
|
},
|
|
"access": {
|
|
"title": "Access",
|
|
"description": "Limit who can use this site"
|
|
},
|
|
"features": {
|
|
"title": "Optional Features",
|
|
"description": "Extra features and safety options"
|
|
},
|
|
"observability": {
|
|
"title": "Call Logs",
|
|
"description": "Record model calls with Langfuse"
|
|
},
|
|
"quota": {
|
|
"title": "Usage Limits",
|
|
"description": "Per-IP limits; they take effect only with a DynamoDB table"
|
|
}
|
|
},
|
|
"settings": {
|
|
"TEMPERATURE": {
|
|
"label": "Temperature",
|
|
"description": "Higher is more random; leave empty for reasoning models that don't support it"
|
|
},
|
|
"MAX_OUTPUT_TOKENS": {
|
|
"label": "Output Token Limit"
|
|
},
|
|
"ACCESS_CODE_LIST": {
|
|
"label": "Access Codes",
|
|
"description": "Separate several with commas; users must enter one to chat; empty means no limit"
|
|
},
|
|
"ENABLE_VLM_VALIDATION": {
|
|
"label": "Diagram Check",
|
|
"description": "After drawing, a model that can see images checks a screenshot"
|
|
},
|
|
"VALIDATION_MODEL": {
|
|
"label": "Check Model",
|
|
"description": "Empty means the default model"
|
|
},
|
|
"VALIDATION_TIMEOUT": {
|
|
"label": "Check Timeout (ms)"
|
|
},
|
|
"ALLOW_PRIVATE_URLS": {
|
|
"label": "Allow Private URLs",
|
|
"description": "When off, custom model URLs can't point to private networks; safer"
|
|
},
|
|
"LANGFUSE_PUBLIC_KEY": {
|
|
"label": "Langfuse Public Key"
|
|
},
|
|
"LANGFUSE_SECRET_KEY": {
|
|
"label": "Langfuse Secret Key"
|
|
},
|
|
"LANGFUSE_BASEURL": {
|
|
"label": "Langfuse URL"
|
|
},
|
|
"DAILY_REQUEST_LIMIT": {
|
|
"label": "Daily Requests",
|
|
"description": "Requests per IP per day"
|
|
},
|
|
"DAILY_TOKEN_LIMIT": {
|
|
"label": "Daily Tokens",
|
|
"description": "Tokens per IP per day"
|
|
},
|
|
"TPM_LIMIT": {
|
|
"label": "Tokens Per Minute"
|
|
},
|
|
"DYNAMODB_QUOTA_TABLE": {
|
|
"label": "DynamoDB Table Name",
|
|
"description": "Empty means no usage limits"
|
|
},
|
|
"DYNAMODB_REGION": {
|
|
"label": "DynamoDB Region"
|
|
},
|
|
"QUOTA_TIMEZONE": {
|
|
"label": "Time Zone",
|
|
"description": "Daily usage resets at midnight in this time zone"
|
|
}
|
|
}
|
|
},
|
|
"workspace": {
|
|
"export": "Export",
|
|
"openFile": "Open .drawio file",
|
|
"canvasLoading": "Loading the canvas…",
|
|
"askAi": "Ask AI to change this",
|
|
"untitled": "Untitled diagram",
|
|
"mobileCanvas": "Canvas",
|
|
"mobileChat": "Chat"
|
|
},
|
|
"selection": {
|
|
"one": "Selected: {label}",
|
|
"many": "{count} shapes selected",
|
|
"shape": "shape",
|
|
"connector": "connector",
|
|
"remove": "Don't send the selection",
|
|
"placeholder": "Describe how to change the selected shapes"
|
|
},
|
|
"versions": {
|
|
"strip": "Versions",
|
|
"created": "Drew the diagram",
|
|
"edited": "Changed the diagram",
|
|
"undone": "Change undone",
|
|
"undo": "Undo change",
|
|
"redo": "Redo change",
|
|
"compare": "Compare",
|
|
"compareTitle": "Compare versions",
|
|
"currentCanvas": "Canvas now",
|
|
"versionLabel": "Version {n}",
|
|
"previous": "Previous version",
|
|
"next": "Next version",
|
|
"rendering": "Rendering preview…",
|
|
"showCode": "Show XML",
|
|
"hideCode": "Hide XML",
|
|
"drawing": "Drawing the diagram…",
|
|
"editing": "Changing the diagram…",
|
|
"loadingLibrary": "Loading a shape library…",
|
|
"libraryLoaded": "Loaded a shape library",
|
|
"failed": "This attempt failed",
|
|
"failedRetrying": "This attempt failed, trying again",
|
|
"stopped": "Stopped",
|
|
"truncatedHint": "The reply hit the output limit before the diagram was complete. Ask for a simpler diagram, or raise Max output tokens in Settings > Drawing.",
|
|
"noChanges": "No visible changes",
|
|
"listSeparator": ", ",
|
|
"shapesAddedOne": "added 1 shape",
|
|
"shapesAddedOther": "added {count} shapes",
|
|
"edgesAddedOne": "added 1 connector",
|
|
"edgesAddedOther": "added {count} connectors",
|
|
"shapesChangedOne": "changed 1 shape",
|
|
"shapesChangedOther": "changed {count} shapes",
|
|
"edgesChangedOne": "changed 1 connector",
|
|
"edgesChangedOther": "changed {count} connectors",
|
|
"shapesRemovedOne": "removed 1 shape",
|
|
"shapesRemovedOther": "removed {count} shapes",
|
|
"edgesRemovedOne": "removed 1 connector",
|
|
"edgesRemovedOther": "removed {count} connectors",
|
|
"totals": "{shapes}, {edges}",
|
|
"shapesTotalOne": "1 shape",
|
|
"shapesTotalOther": "{count} shapes",
|
|
"edgesTotalOne": "1 connector",
|
|
"edgesTotalOther": "{count} connectors",
|
|
"restoreVersion": "Restore v{n}",
|
|
"restoredVersion": "Restored v{n}",
|
|
"undoRestore": "Undo",
|
|
"noPreview": "No preview",
|
|
"compareSince": "Since version {n}, the canvas has changed:",
|
|
"isOnCanvas": "This version is what the canvas shows now.",
|
|
"differsElsewhere": "The shapes and connectors on the first page are the same as in version {n}; their order, other pages or the page settings differ."
|
|
},
|
|
"lobby": {
|
|
"title": "What would you like to draw?",
|
|
"lede": "Describe a diagram or upload a screenshot or PDF. You get a draw.io diagram you can keep editing and export.",
|
|
"placeholder": "For example: a login sequence diagram with SMS codes and retries",
|
|
"recent": "Recent diagrams",
|
|
"drawYourself": "Start with a blank canvas"
|
|
},
|
|
"shell": {
|
|
"waiting": "Waiting for the MCP server…",
|
|
"toggleTheme": "Switch between light and dark",
|
|
"connected": "Connected to the MCP server",
|
|
"offline": "Can't reach the MCP server",
|
|
"tooLarge": "This diagram is too large to save to the MCP server (over 10 MB).",
|
|
"unreachable": "Can't reach the MCP server. Your changes are only in this tab for now.",
|
|
"restoredFromFile": "The diagram was restored from its saved file. What this tab showed before is in History.",
|
|
"aiChanged": "The AI changed the diagram while you were editing. Your last change was saved in History.",
|
|
"historyChanged": "History changed on the server. Please open it again.",
|
|
"restoreFailed": "Restore failed. Please try again.",
|
|
"userEdit": "Changed by hand",
|
|
"showVersions": "Show the versions",
|
|
"hideVersions": "Hide the versions"
|
|
}
|
|
}
|