{
  "app": {
    "title": "LLM Wiki",
    "subtitle": "Build and maintain your personal knowledge base with LLMs"
  },
  "common": {
    "retry": "Retry", "cancel": "Cancel", "ignore": "Ignore", "close": "Close",
    "dismiss": "Dismiss", "loading": "Loading...", "optional": "optional"
  },
  "layout": { "showSidebar": "Show sidebar", "hideSidebar": "Hide sidebar" },
  "errors": { "generic": "Something went wrong" },
  "mermaid": {
    "renderFailed": "Mermaid diagram could not be rendered",
    "showDetails": "Show parser details",
    "enlarge": "Enlarge diagram",
    "rendering": "Rendering diagram...",
    "diagram": "Diagram"
  },
  "nav": {
    "chat": "Chat",
    "wiki": "Wiki",
    "sources": "Sources",
    "search": "Search",
    "graph": "Graph",
    "lint": "Lint",
    "review": "Review",
    "skills": "Skills",
    "settings": "Settings",
    "switchProject": "Switch Project",
    "updateAvailable": "Update available",
    "updateAvailableSuffix": " · update"
  },
  "updateBanner": {
    "message": "Version {{version}} is available",
    "openDownload": "Open download page",
    "dismiss": "Dismiss"
  },
  "welcome": {
    "newProject": "New Project",
    "openProject": "Open Project",
    "recentProjects": "Recent Projects"
  },
  "sidebar": {
    "knowledge": "Knowledge",
    "files": "Files",
    "rawSources": "Raw Sources",
    "noWikiPages": "No wiki pages yet. Import sources to get started.",
    "typeLabels": {
      "overview": "Overview", "entity": "Entities", "concept": "Concepts",
      "source": "Sources", "synthesis": "Synthesis", "finding": "Findings",
      "thesis": "Theses", "methodology": "Methodologies",
      "comparison": "Comparisons", "query": "Queries"
    }
  },
  "editor": {
    "edit": "Edit",
    "done": "Done",
    "editRaw": "Edit raw Markdown",
    "doneEditing": "Done editing",
    "selection": {
      "askAgent": "Ask Agent about selection",
      "placeholder": "Explain, rewrite, shorten...",
      "send": "Send",
      "ask": "Ask",
      "edit": "Edit",
      "generating": "Generating...",
      "stop": "Stop",
      "askAgain": "Ask again",
      "askOnlyHint": "This rendered selection cannot be mapped to one exact Markdown source range. You can ask about it, but editing is disabled to prevent changing the wrong text.",
      "wordDiff": "Word-level changes",
      "regenerate": "Regenerate",
      "closeReference": "Close",
      "requestFailed": "The selection assistant could not complete this request.",
      "applyFailed": "The selected text could not be updated.",
      "sourceChanged": "The file changed after this text was selected. Select the text again before applying the edit.",
      "referenceFailed": "The referenced page could not be opened.",
      "emptyResponse": "The model returned no answer. Please try again."
    },
    "pageLinks": {
      "button": "Links",
      "title": "Page links",
      "outgoing": "Outgoing links",
      "backlinks": "Backlinks",
      "missing": "Missing links",
      "noOutgoing": "This page has no outgoing wiki links.",
      "noBacklinks": "No other page links here yet.",
      "noMissing": "All wiki links resolve to existing pages.",
      "create": "Create",
      "draft": "Agent draft",
      "loadFailed": "Page links could not be loaded.",
      "createFailed": "The missing page could not be created.",
      "emptyDraftError": "The model returned an empty draft."
    },
    "frontmatter": { "origin": "Origin", "more": "More" },
    "rawMarkdownEditor": "Raw Markdown editor"
  },
  "research": {
    "title": "Deep Research",
    "notConfigured": "Deep Research sources are not configured. Go to Settings → External Information Sources to configure Web Search or AnyTXT.",
    "activeBadge": "{{running}} active{{queued, plural, =0 {} other {, {{queued}} queued}}}",
    "inputPlaceholder": "Enter a research topic...",
    "emptyTitle": "No research tasks yet",
    "emptyHint": "Enter a topic above or click Deep Research in Review",
    "sourcesCount": "Sources ({{count}})",
    "anyTxtSource": "AnyTXT source",
    "webSource": "Web source",
    "synthesis": "Synthesis",
    "thinking": "Thinking",
    "open": "Open",
    "remove": "Remove",
    "status": {
      "queued": "Queued",
      "searching": "Searching sources...",
      "synthesizing": "Synthesizing...",
      "saving": "Saving to wiki...",
      "saved": "Saved",
      "done": "Done",
      "failed": "Failed"
    }
  },
  "project": {
    "createTitle": "Create New Wiki Project",
    "name": "Project Name",
    "namePlaceholder": "my-research-wiki",
    "parentDir": "Parent Directory",
    "parentDirPlaceholder": "/Users/you/projects",
    "template": "Template",
    "cancel": "Cancel",
    "create": "Create",
    "creating": "Creating...",
    "errorNameRequired": "Name and path are required",
    "errorLanguageRequired": "Please pick an AI output language",
    "requiredHint": "Enter a name, pick a language, and choose a parent directory to create the project.",
    "requiredMarker": "*",
    "browse": "Select Parent Directory",
    "aiOutputLanguage": "AI Output Language",
    "aiOutputLanguageHint": "All AI-generated content (wiki pages, chat replies, research output) will use this language. You can change it later in Settings → Output.",
    "pickLanguage": "Pick a language…"
  },
  "templates": {
    "research": {
      "name": "Research",
      "description": "Deep-dive research with hypothesis tracking and methodology notes"
    },
    "reading": {
      "name": "Reading",
      "description": "Track a book's characters, themes, plot threads, and chapter notes"
    },
    "personal": {
      "name": "Personal Growth",
      "description": "Track goals, habits, reflections, and journal entries for self-improvement"
    },
    "business": {
      "name": "Business",
      "description": "Manage meetings, decisions, projects, and stakeholder context for a team"
    },
    "general": {
      "name": "General",
      "description": "Minimal setup — a blank slate for any purpose"
    }
  },
  "sources": {
    "title": "Raw Sources",
    "import": "Import",
    "importing": "Importing...",
    "noSources": "No sources yet",
    "importHint": "Import documents to start building your wiki",
    "importFiles": "Import Files",
    "importFolder": "Folder",
    "importUrls": "URLs",
    "importSourceFiles": "Import Source Files",
    "importSourceFolder": "Import Source Folder",
    "urlImport": {
      "title": "Import web pages",
      "description": "Enter one HTTP(S) URL per line. Each page is saved as a source and queued for ingest; failed URLs do not stop the rest of the batch.",
      "placeholder": "https://example.com/article-one\nhttps://example.com/article-two",
      "submit": "Import URLs",
      "empty": "Enter at least one URL.",
      "imported": "Imported"
    },
    "refresh": "Refresh",
    "refreshFolder": "Refresh folder",
    "refreshingFolder": "Refreshing...",
    "refreshFolderHint": "Rescan the source folder and process new, changed, or deleted files.",
    "refreshFolderTooltip": "Rescan the project source folder with the same rules as automatic monitoring. New or modified allowed files are queued for ingest; deleted sources trigger the normal wiki and index cleanup; then the file tree is rebuilt.",
    "refreshFailed": "Failed to refresh sources: {{error}}",
    "ingest": "Ingest",
    "delete": "Delete source and related wiki pages",
    "deleteConfirm": "Delete \"{{name}}\" and its related wiki pages?\n\nThis will:\n- Delete the source file\n- Delete wiki pages generated from this source\n- Update index.md",
    "deleteFolder": "Delete folder {{name}} (recursive)",
    "deleteFolderConfirm": "Click again to delete folder {{name}} and ALL its contents",
    "deleteFile": "Delete {{name}}",
    "deleteFileConfirm": "Click again to delete {{name}}",
    "confirm": "Confirm",
    "loadingMore": "Loading more sources...",
    "sourceCount": "{{count}} source",
    "sourceCount_plural": "{{count}} sources"
  },
  "chat": {
    "selectionEdit": {
      "title": "Proposed selection edit",
      "reviewHint": "Review before writing",
      "original": "Original",
      "replacement": "Replacement",
      "accept": "Accept",
      "reject": "Reject",
      "applying": "Applying..."
    },
    "agentChanges": {
      "title": "Agent file changes",
      "taskTitle": "Agent activity",
      "fileCount": "{{count}} file",
      "fileCount_other": "{{count}} files",
      "editCount": "{{count}} edit",
      "editCount_other": "{{count}} edits",
      "editNumber": "edit {{number}}",
      "expandDiff": "Expand file diff",
      "collapseDiff": "Collapse file diff",
      "undo": "Undo this Agent change",
      "undoUnavailable": "Undo is unavailable after the app restarts",
      "diffUnavailable": "Diff unavailable because the previous file was too large to snapshot safely.",
      "shellSnapshotUnavailable": "This file was changed by a shell command. A safe before-write snapshot is unavailable.",
      "undoConflict": "Undo stopped because the file changed after the Agent wrote it."
    },
    "contextFileHint": "Add project files to this conversation",
    "removeContextFile": "Remove {{name}} from context",
    "placeholder": "Ask about your wiki...",
    "ingestPlaceholder": "Discuss the source or ask follow-up questions...",
    "saveToWiki": "Save to Wiki",
    "saving": "Saving...",
    "saved": "Saved!",
    "regenerate": "Regenerate",
    "regenerateResponse": "Regenerate this response",
    "copy": "Copy",
    "copied": "Copied!",
    "copyToClipboard": "Copy to clipboard",
    "thinking": "Thinking...",
    "lineCount": "{{count}} line",
    "lineCount_other": "{{count}} lines",
    "thoughtLineCount": "Thought for {{count}} line",
    "thoughtLineCount_other": "Thought for {{count}} lines",
    "writeToWiki": "Write to Wiki",
    "emptyHint": "Ask a question or start an ingest to begin.",
    "sources": "Sources",
    "newChat": "New Chat",
    "newConversation": "New Conversation",
    "noConversationsYet": "No conversations yet",
    "msgCount": "msgs",
    "startNewConversation": "Start a new conversation",
    "clickNewChatToBegin": "Click \"New Chat\" to begin",
    "typeAMessage": "Type a message...",
    "useWebSearch": "Web search",
    "useAnyTxtSearch": "AnyTXT search",
    "skills": "Skills",
    "enabledSkills": "Enabled skills",
    "skillsAutoMode": "Auto",
    "slashSkillHint": "Select a skill",
    "removeSkill": "Remove {{name}}",
    "noSkillsAvailable": "No skills found. Add SKILL.md files under .llm-wiki/skills or your user skills folder.",
    "approveCommand": "Approve command",
    "skillSources": {
      "project": "Project",
      "claude": "Claude",
      "codex": "Codex",
      "agents": "Agents"
    },
    "agentMode": "Agent mode",
    "retrievalMode": "Retrieval mode",
    "retrievalModeHint": "Standard keeps the existing behavior. Smart iteratively closes evidence gaps. Raw sources only answers exclusively from original source excerpts.",
    "retrievalModes": {
      "standard": "Standard retrieval",
      "smart": "Smart retrieval",
      "faithful": "Raw sources only"
    },
    "agentModes": {
      "fast": "Fast",
      "standard": "Standard",
      "deep": "Deep",
      "localFirst": "Local first"
    },
    "enableAnyTxtInSettings": "Enable AnyTXT in Settings → External Information Sources",
    "sendMessage": "Send message",
    "stopGeneration": "Stop generation",
    "attachImage": "Attach image",
    "removeImage": "Remove image",
    "imageMessage": "Image",
    "imageVisionHint": "Images are sent to the current LLM. Use a vision-capable model for image questions.",
    "imageInputUnavailable": "The current provider does not support image input. Switch to a vision-capable provider in Settings.",
    "imageTooLarge": "Image too large (max {{max}}MB): {{name}}",
    "tooManyImages": "Too many images (max {{max}})",
    "unsupportedImageType": "Unsupported image type: {{type}}",
    "referencePreview": "Reference preview",
    "references": "References",
    "generatedOutputs": "Generated outputs",
    "generatedOutput": "Output",
    "openGeneratedOutputFolder": "Open output folder",
    "generatedOutputCount": "{{count}} file",
    "generatedOutputCount_plural": "{{count}} files",
    "closeGeneratedOutputs": "Close generated outputs",
    "closeGeneratedOutputPreview": "Close generated output preview",
    "closeReferencePreview": "Close reference preview",
    "resizeReferencePreview": "Resize reference preview",
    "noReferencePreviewFragment": "No preview fragment returned.",
    "userInputRequiredDescription": "Please provide the requested information to continue.",
    "userInputSubmit": "Submit and continue",
    "userInputSubmitted": "Submitted",
    "userInputRecommended": "Recommended",
    "userInputEnabled": "Enabled",
    "agent": {
      "understanding": "Understanding request",
      "routing": "Planning next step",
      "tool_call": "Calling tool",
      "tool_result": "Tool result",
      "searching_wiki": "Searching wiki",
      "searching_graph": "Exploring knowledge graph",
      "searching_web": "Searching web",
      "searching_anytxt": "Searching AnyTXT",
      "reading_context": "Reading context",
      "writing": "Writing answer",
      "resultCount": "results: {{count}}"
    }
  },
  "search": {
    "title": "Search",
    "placeholder": "Search wiki pages...",
    "placeholderWithShortcut": "Search wiki pages... (Enter to search)",
    "searching": "Searching...",
    "pressEnter": "Press Enter to search",
    "pageCount": "{{count}} page",
    "pageCount_other": "{{count}} pages",
    "imageMatchCount": "{{count}} image match",
    "imageMatchCount_other": "{{count}} image matches",
    "supportingImageCount": "+{{count}} from matched pages",
    "images": "Images",
    "pages": "Pages",
    "hideSupporting": "Hide supporting",
    "showAllSupporting": "Show all (+{{count}})",
    "noCaption": "No caption",
    "fromSource": "From: {{source}}",
    "jumpToSource": "Jump to source document",
    "noResults": "No results found",
    "startSearching": "Type to search wiki pages"
  },
  "lint": {
    "title": "Wiki Lint",
    "semantic": "Semantic (LLM)",
    "running": "Running...",
    "cancel": "Cancel check",
    "cancelProgress": "Cancel {{completed}}/{{total}}",
    "runLint": "Run Lint",
    "runLintHint": "Run lint to check wiki health",
    "runLintDescription": "Checks for orphan pages, broken links, and more",
    "allClear": "All clear!",
    "noIssues": "No issues found.",
    "warnings": "Warnings",
    "info": "Info",
    "sectionCount": "{{label}} ({{count}})",
    "open": "Open",
    "fixing": "Fixing...",
    "fix": "Fix",
    "fixFailed": "Fix failed: {{error}}",
    "delete": "Delete",
    "selectAll": "Select all",
    "selectItem": "Select {{page}}",
    "selectedCount": "{{count}} selected",
    "fixSelected": "Fix selected",
    "sendSelectedToReview": "Send selected to Review",
    "ignoreSelected": "Ignore selected",
    "openEdit": "Open & Edit",
    "skip": "Skip",
    "deletePage": "Delete Page",
    "fixBrokenLink": "Fix broken link in {{page}}",
    "addCrossRefs": "Add cross-references to {{page}}",
    "addCrossRefsDescription": "This page has no outbound [[wikilinks]]. Consider adding cross-references to related entities and concepts.",
    "suggestedTarget": "Suggested target: {{page}}",
    "suggestedSource": "Suggested source: {{page}}",
    "deleteOrphanConfirm": "Delete orphan page \"{{page}}\"?",
    "typeLabels": {
      "orphan": "Orphan Page",
      "broken-link": "Broken Link",
      "no-outlinks": "No Outbound Links",
      "semantic": "Semantic Issue"
    },
    "issues": "{{count}} issue",
    "issues_plural": "{{count}} issues"
  },
  "review": {
    "title": "Review",
    "clearResolved": "Clear resolved",
    "refresh": "Refresh",
    "refreshHint": "Reload review items from disk",
    "selectPending": "Select pending",
    "selectItem": "Select {{title}}",
    "selectedCount": "{{count}} selected",
    "markSelectedResolved": "Mark selected resolved",
    "dismissSelected": "Dismiss selected",
    "affectedPages": "Pages",
    "allClear": "All clear — nothing to review",
    "resolvedDivider": "— Resolved —"
  },
  "settings": {
    "title": "Settings",
    "llmProvider": "LLM Provider",
    "provider": "Provider",
    "apiKey": "API Key",
    "apiKeyPlaceholder": "Enter your {{provider}} API key",
    "model": "Model",
    "customModel": "Or type a custom model name",
    "ollamaUrl": "Ollama URL",
    "customEndpoint": "API Endpoint (OpenAI-compatible)",
    "customEndpointHint": "Any OpenAI-compatible API endpoint (e.g., LiteLLM, vLLM, LocalAI, Azure OpenAI)",
    "customApiKey": "Enter API key (if required)",
    "modelPlaceholder": "Enter model name",
    "save": "Save",
    "saved": "Saved",
    "savedTick": "Saved ✓",
    "changeHint": "Changes apply after saving.",
    "saveFailed": "Save failed. Some settings may not have been saved. See the console for details.",
    "language": "Language",
    "languageHint": "Interface language (wiki content follows source material language)",
    "categories": {
      "general": "General",
      "llm": "LLM Models",
      "embedding": "Embeddings",
      "multimodal": "Image Captioning",
      "webSearch": "External Information Sources",
      "network": "Network",
      "sourceWatch": "Source Watch",
      "scheduledImport": "Scheduled Import",
      "mineru": "MinerU PDF",
      "apiServer": "API + MCP",
      "output": "Output",
      "interface": "Interface",
      "maintenance": "Maintenance",
      "changelog": "Changelog",
      "about": "About"
    },
    "sections": {
      "general": {
        "title": "General",
        "description": "Startup and window behavior for the desktop app.",
        "autostart": "Launch at system startup",
        "autostartHint": "Starts LLM Wiki automatically after you sign in to this computer.",
        "closeBehavior": "When closing the window",
        "closeBehaviorHint": "This setting applies when you click the title-bar close button. The tray menu can still quit the app directly.",
        "closeAsk": "Ask every time",
        "closeAskHint": "Show a confirmation. Cancel hides the window and keeps background features running.",
        "closeMinimize": "Hide window",
        "closeMinimizeHint": "Keep LLM Wiki running in the background when the window closes. On macOS this matches the normal red close button behavior. If a Linux tray is unavailable, the window is minimized instead of hidden.",
        "closeExit": "Quit app",
        "closeExitHint": "Exit LLM Wiki immediately when the window closes."
      },
      "skills": {
        "title": "Skills",
        "description": "Scan project and user skill folders, then choose which skills can be used from Chat.",
        "paths": "Scanned folders: .llm-wiki/skills, ~/.claude/skills, ~/.codex/skills, ~/.agents/skills.",
        "summary": "{{enabled}} enabled / {{total}} discovered",
        "enableAll": "Enable all",
        "disableAll": "Disable all",
        "refresh": "Rescan",
        "searchPlaceholder": "Search skills by name, id, description, or source...",
        "scanDone": "Found {{count}} skills.",
        "empty": "No skills found. Add SKILL.md files to a scanned folder, then rescan.",
        "noSearchResults": "No skills match this search.",
        "enabled": "Enabled",
        "disabled": "Disabled"
      },
      "llm": {
        "title": "LLM Models",
        "description": "Configure built-in providers or add multiple custom endpoints. Activating one automatically deactivates the others, while every provider keeps its own credentials and model settings.",
        "taskRouting": {
          "chat": "Chat model",
          "ingest": "Ingest model",
          "activeDefault": "Use active model",
          "hint": "Choose separate models for interactive chat and document ingest. The active model remains the fallback."
        },
      "projectOverride": {
          "enabled": "Use a project-specific model",
          "provider": "Project provider",
          "selectProvider": "Select a provider",
          "model": "Project model",
          "modelPlaceholder": "Use the provider's configured model",
          "hint": "When enabled, this project uses the selected provider and model for both Chat and Ingest. Credentials remain in the global provider settings."
        },
        "customProfiles": {
          "add": "Add custom provider",
          "defaultName": "Custom provider {{number}}",
          "name": "Provider name",
          "delete": "Delete custom provider"
        },
        "expand": "Expand config",
        "collapse": "Collapse",
        "toggleOff": "Click to deactivate",
        "toggleOn": "Click to activate (turns off other providers)",
        "deactivate": "Deactivate",
        "activate": "Activate",
        "apiMode": "API Mode",
        "endpoint": "Endpoint",
        "contextWindow": "Context window",
        "wireOpenAi": "OpenAI-compat",
        "wireAnthropic": "Anthropic-compat",
        "apiKeyPlaceholderCustom": "Leave empty if no key (local models)",
        "apiKeyPlaceholder": "Enter your API key",
        "savedBadge": "saved",
        "configuredBadge": "configured",
        "activeBadge": "● active",
        "useModel": "Use {{model}}",
        "typeCustomModel": "Type a custom model id",
        "customModel": "Custom…",
        "customModelBadge": "Custom: {{model}}",
        "endpointPreviewWillUse": "Will resolve to",
        "endpointPreviewAutoApply": "(applied automatically when you leave the input)",
        "providerTests": "Provider tests",
        "providerTestsHint": "Connection test verifies the endpoint can respond. Functional test asks the model to follow a tiny instruction.",
        "localCliIsolation": "Isolate local CLI configuration",
        "localCliIsolationHint": "Optional for Claude Code and Codex CLI. When enabled, LLM Wiki asks the CLI to ignore user-level rules/config/MCP/tools where supported. This is configuration isolation, not a process sandbox: the CLI still uses your local login credentials and network access. Leave off if you intentionally rely on your local CLI setup.",
        "localCliIsolationOn": "Isolation on: user CLI rules, MCP/tools, and persisted sessions are disabled where the CLI supports it. Local credentials and network access are still controlled by the CLI itself.",
        "localCliIsolationOff": "Isolation off: this provider can use your normal local CLI configuration.",
        "codexCliTimeout": "Codex CLI timeout",
        "codexCliTimeoutUnit": "minutes",
        "codexCliTimeoutHint": "Overall timeout for one Codex CLI request. Raise this for long PDF ingest or slower local/network sessions.",
        "requestTimeout": "Request timeout (minutes)",
        "requestTimeoutHint": "Increase this for slow local CPU models. The default is 30 minutes.",
        "streamingOutput": "Stream responses",
        "streamingOutputHint": "When disabled, HTTP providers wait for the complete response before displaying it. CLI providers still use their native protocol but buffer visible output until completion.",
        "streamingOutputOn": "Streaming on: response text appears as it is generated.",
        "streamingOutputOff": "Streaming off: response text appears after generation completes.",
        "customHeaders": "Custom request headers",
        "customHeadersHint": "Optional. Enter one Header-Name: value per line. Content-Type and configured API-key headers take precedence.",
        "cliStatus": "CLI status",
        "checkingCli": "Checking…",
        "recheckCli": "Re-check",
        "detectingCli": "Detecting local {{name}} binary…",
        "cliDetected": "Detected{{version}}. Ready to use your local {{login}} — no API key needed.",
        "claudeSubscription": "subscription",
        "codexLogin": "Codex login",
        "cliAuthBefore": "If chat fails with an authentication error, run",
        "cliAuthAfter": "in a terminal to refresh the login.",
        "cliUnavailable": "{{name}} CLI not available.",
        "cliInstallBefore": "Install with",
        "cliInstallAfter": "then re-check.",
        "testConnection": "Test connection",
        "testFunction": "Test function",
        "testingConnection": "Testing connection…",
        "testingFunction": "Testing function…",
        "deploymentName": "Deployment name",
        "azureApiVersion": "Azure API version",
        "azureApiVersionHint": "Sent as the Azure OpenAI api-version query parameter.",
        "azureModelFamily": "Azure model family",
        "azureModelFamilyAuto": "Auto-detect from deployment name",
        "azureModelFamilyGpt5": "GPT-5 / o-series strict parameters",
        "azureModelFamilyHint": "Azure deployment names are arbitrary. Choose GPT-5 / o-series if this deployment rejects max_tokens or non-default temperature.",
        "reasoning": {
          "title": "Reasoning / thinking",
          "auto": "Auto",
          "off": "Off",
          "low": "Low",
          "medium": "Medium",
          "high": "High",
          "max": "Max",
          "custom": "Custom",
          "budgetTokens": "thinking budget tokens",
          "hint": "Structured tasks such as ingest may override this to Off to avoid reasoning-only responses."
        }
      },
      "embedding": {
        "title": "Vector Embeddings",
        "description": "Enable semantic search against your wiki. Works with OpenAI-compatible /v1/embeddings endpoints, Google Gemini native embedContent endpoints, and Volcengine/Doubao embedding endpoints. Local models (LM Studio, Ollama embedding) don't need an API key.",
        "enableLabel": "Enable vector search",
        "enableHint": "When off, search uses token matching only.",
        "endpoint": "Endpoint",
        "endpointHint": "OpenAI-compatible example: http://127.0.0.1:1234/v1/embeddings. Gemini example: https://generativelanguage.googleapis.com/v1beta with model gemini-embedding-001. Volcengine example: https://ark.cn-beijing.volces.com/api/v3 with model doubao-embedding-vision.",
        "apiKey": "API Key (optional)",
        "apiKeyPlaceholder": "Leave empty for local models",
        "model": "Model",
        "modelHint": "Common examples are suggested, but custom OpenAI-compatible model IDs are accepted.",
        "outputDimensionality": "Output dimensionality (Gemini only)",
        "outputDimensionalityHint": "Optional. Sent only for Gemini native embedContent endpoints as `output_dimensionality`; OpenAI-compatible endpoints ignore this field. Leave empty for the model default. Rebuild embeddings after changing model or dimension.",
        "extraHeaders": "Custom request headers",
        "extraHeadersHint": "Optional. One per line, formatted `Header-Name: value`. Used for gateways that route by request header — e.g. mify needs `X-Model-Provider-Id: siliconflow`. Authorization, Content-Type, Host, Content-Length, and x-goog-api-key are managed by the client and will be ignored.",
        "chunking": "Chunking",
        "maxChunkChars": "Max chunk size (characters)",
        "maxChunkCharsHint": "Target size of each chunk. Lower this (e.g. 500) when your endpoint's context is small (llama.cpp n_ctx=512, mxbai-embed-large, etc.).",
        "overlapChunkChars": "Overlap (characters)",
        "overlapChunkCharsHint": "Characters of overlap between adjacent chunks so ideas aren't severed at boundaries.",
        "concurrency": "Concurrent requests",
        "concurrencyHint": "Maximum embedding requests in flight (1–32). Increase gradually according to your endpoint's capacity.",
        "batchSize": "Inputs per request",
        "batchSizeHint": "OpenAI-compatible endpoints only (1–64). Unsupported providers automatically use single-input requests.",
        "providerTests": "Provider tests",
        "providerTestsHint": "Connection test sends one short embedding request. Functional test verifies stable finite vectors and reports the returned dimension.",
        "testConnection": "Test connection",
        "testFunction": "Test function",
        "testingConnection": "Testing embedding connection…",
        "testingFunction": "Testing embedding function…",
        "statsHeading": "Index status",
        "chunkCount": "{{count}} chunks indexed",
        "lastErrorHeading": "Last embedding error",
        "reindexAll": "Re-index all pages",
        "reindexing": "Indexing {{done}}/{{total}}…",
        "reindexDone": "Indexed {{count}} pages.",
        "reindexError": "Re-index failed: {{message}}",
        "legacyPromptTitle": "Legacy per-page index detected",
        "legacyPromptBody": "Your project has {{count}} entries in the old per-page vector store. The new per-chunk index gives better retrieval but needs a one-time re-embed. Run \"Re-index all pages\" to upgrade.",
        "dropLegacy": "Drop legacy index",
        "dropLegacyDone": "Legacy index removed."
      },
      "multimodal": {
        "title": "Image Captioning",
        "description": "Generate factual captions for images extracted from PDFs / DOCX / PPTX during ingest. Captions are inserted as alt text inside the source markdown — they're what semantic search matches when you search for image content. Cached by image hash so duplicate logos / charts only call the LLM once.",
        "enableLabel": "Enable captioning at ingest",
        "enableHint": "Off: image references are stripped from ingested content — no images appear in wiki pages, search won't return them. (Files still extract to wiki/media/ for the raw-source preview.) On: each new image gets a factual caption from the vision LLM (cached by hash) and lands in the wiki page's alt text.",
        "stateOn": "ON",
        "stateOff": "OFF",
        "useMainLabel": "Use main LLM for captions",
        "useMainHint": "Reuse the model picked under Settings → LLM provider. Only enable this if that model accepts image input — text-only models will return a 400.",
        "dedicatedHeading": "Dedicated vision endpoint",
        "provider": "Provider",
        "ollamaUrl": "Ollama URL",
        "customEndpoint": "Endpoint URL",
        "customEndpointHint": "OpenAI-compatible /v1 base. LM Studio, llama.cpp server, vLLM, LocalAI all work.",
        "azureEndpoint": "Azure endpoint",
        "azureEndpointHint": "Use your Azure OpenAI resource endpoint. The model field is the deployment name.",
        "azureApiVersion": "Azure API version",
        "azureApiVersionHint": "Sent as the Azure OpenAI api-version query parameter.",
        "azureModelFamily": "Azure model family",
        "azureModelFamilyAuto": "Auto-detect from deployment name",
        "azureModelFamilyGpt5": "GPT-5 / o-series strict parameters",
        "azureModelFamilyHint": "Choose GPT-5 / o-series if this deployment rejects max_tokens or non-default temperature.",
        "azureDeployment": "Deployment name",
        "apiKey": "API key",
        "apiKeyPlaceholder": "Leave blank for local / no-auth endpoints",
        "model": "Model",
        "modelHint": "Must be a vision-capable model. Text-only models will fail with a 400 / image-not-supported error at first ingest.",
        "concurrency": "Concurrent caption requests",
        "concurrencyHint": "How many caption requests run in parallel. 1 = strictly sequential. 4 is a good default for most setups; raise to 8+ only on a beefy GPU or hosted endpoint.",
        "costHeading": "Cost guardrails",
        "costPoint1": "Each new image triggers one vision-LLM call (~500-2000 tokens depending on model + thinking mode).",
        "costPoint2": "Captions are cached by SHA-256 of image bytes. Duplicate logos / shared chart templates across documents only ever incur ONE call.",
        "costPoint3": "Rust-side filter drops images smaller than 100×100 px and caps at 500 images per source — pathological PDFs can't blow up the bill.",
        "costPoint4": "Prefer a local vision model (Qwen2.5-VL via LM Studio / Ollama) for bulk ingestion; reserve hosted vision APIs for one-off high-stakes documents."
      },
      "webSearch": {
        "title": "External Information Sources",
        "description": "Configure external information sources that LLM Wiki can use.",
        "deepResearchSources": "Deep Research source mode",
        "deepResearchSourcesHint": "Web Search uses the selected online provider. AnyTXT searches local indexed files through ATGUI.exe on this machine.",
        "sourceWeb": "Web Search",
        "sourceAnyTxt": "AnyTXT",
        "sourceBoth": "Both",
        "webProviders": "Web Search providers",
        "anyTxtTitle": "AnyTXT local file search",
        "anyTxtDescription": "Use AnyTXT's local JSON-RPC API as a Deep Research source. Keep ATGUI.exe running before starting research.",
        "anyTxtEndpoint": "AnyTXT endpoint",
        "anyTxtFilterDir": "Search folder",
        "anyTxtFilterDirPlaceholder": "Leave blank for AnyTXT's default scope; on Windows, set a drive or folder if needed",
        "anyTxtFilterExt": "Extension filter",
        "anyTxtLimit": "Max local results",
        "anyTxtHint": "AnyTXT pattern text is sent directly to AnyTXT, so its native search syntax applies. AnyTXT API is local beta software; respect AnyTXT's usage terms.",
        "anyTxtBroadDirWarning": "This folder looks very broad. Deep Research may send matching local file fragments, including sensitive content, to the selected LLM.",
        "expand": "Expand",
        "collapse": "Collapse",
        "activate": "Activate",
        "deactivate": "Deactivate",
        "configuredBadge": "Configured",
        "activeBadge": "Active",
        "savedBadge": "Saved",
        "instanceUrl": "Instance URL",
        "ollamaHint": "Uses the official Ollama Web Search API (`https://ollama.com/api/web_search`). An Ollama API key is required.",
        "bochaHint": "Uses the official Bocha Web Search API. Create and manage API keys at open.bocha.cn.",
        "firecrawlHint": "Leave API key blank for anonymous search, or add a Firecrawl API key for authenticated quota. Base URL supports compatible self-hosted endpoints.",
        "searxngJsonHint": "The instance must allow JSON search responses (`format=json`).",
        "searchCategories": "Search categories",
        "searxngCategoriesHint": "Categories are sent as the SearXNG `categories` parameter.",
        "searchEngine": "Search engine / category",
        "customSerpApiPlaceholder": "Custom SerpApi engine, e.g. google_finance",
        "customSerpApiHint": "Custom engine will be sent as the SerpApi `engine` parameter.",
        "testProvider": "Test search",
        "testRunning": "Testing...",
        "testSuccess": "Search test succeeded ({{count}} result).",
        "testSuccess_plural": "Search test succeeded ({{count}} results).",
        "testNoResults": "Connection worked, but this test query returned no results.",
        "testFailed": "Search test failed: {{message}}",
        "firecrawlIpBlocked": "Firecrawl anonymous search is blocked for this IP. Choose another Web Search provider or try a different network.",
        "firecrawlNetworkError": "Could not reach Firecrawl Search. Check your network or choose another Web Search provider.",
        "firecrawlInvalidJson": "Firecrawl returned an invalid response. Try again later or choose another Web Search provider.",
        "configureBeforeTesting": "Configure first"
      },
      "network": {
        "title": "Network",
        "description": "Route all outbound HTTP requests (LLM, embedding, search, update check) through a proxy. Changes apply on Save — no restart needed.",
        "enable": "Enable proxy",
        "url": "Proxy URL",
        "urlHelp": "Full URL with scheme. Supported: http://, https://. (SOCKS5 not supported in this version.)",
        "bypassLocal": "Bypass proxy for local addresses (recommended)",
        "bypassLocalHelp": "Requests to localhost, 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, and *.local don't go through the proxy. Keep this on if you use Ollama / LM Studio / other local or LAN-deployed LLMs."
      },
      "sourceWatch": {
        "title": "Source Folder Auto Watch",
        "description": "Monitor raw/sources for external changes and choose which files are allowed into automatic ingest.",
        "enable": "Monitor project source folder",
        "enableDescription": "Refreshes the Sources view and indexes allowed new or modified files under raw/sources.",
        "autoIngest": "Auto-ingest allowed source files",
        "autoIngestDescription": "When disabled, external changes still refresh the file tree but do not create ingest tasks.",
        "noProject": "Open a project to change this project-level setting.",
        "fileTypes": "Allowed file types",
        "fileTypesDescription": "Document types are enabled by default. Media, binaries, source code, and config-like formats stay off unless selected.",
        "exclusions": "Exclusions and limits",
        "maxSize": "Maximum auto-ingest file size (MB)",
        "excludeDirs": "Excluded folders",
        "excludeDirsPlaceholder": ".git, node_modules, drafts, subdir/drafts",
        "excludeDirsHint": "Folder names match any path segment. Paths such as subdir/drafts match that nested folder.",
        "excludeExtensions": "Excluded file extensions",
        "excludeExtensionsPlaceholder": "tmp, bak, exe, dll, iso, dmg",
        "excludeExtensionsHint": "Use extensions without dots. These override the allowed file type checkboxes.",
        "excludeGlobs": "Excluded filename patterns",
        "excludeGlobsHint": "Use comma-separated patterns such as *.draft.*, ~$*, .~lock.*#.",
        "groups": {
          "documents": "Documents",
          "presentations": "Presentations",
          "spreadsheets": "Spreadsheets",
          "web": "Web documents",
          "data": "Data / config",
          "images": "Images",
          "media": "Audio / video",
          "code": "Source code"
        }
      },
      "scheduledImport": {
        "title": "Scheduled Import",
        "description": "Automatically monitor a directory and import new or modified files at regular intervals.",
        "enable": "Enable scheduled import",
        "directory": "Monitor Directory",
        "directoryHelp": "Choose an external folder outside the current LLM Wiki project. Project folders such as raw, raw/sources, wiki, and .llm-wiki are skipped because source folder monitoring already handles them.",
        "managedPathWarning": "This path is inside the current LLM Wiki project and is already managed by source folder monitoring. Pick an external folder to avoid duplicate scans.",
        "privacyNotice": "Files from the selected directory may be copied into this project and sent to your configured LLM during ingest. Removed files are not automatically deleted from the project.",
        "browse": "Browse",
        "selectDirectory": "Select Directory to Monitor",
        "interval": "Scan Interval (minutes)",
        "intervalHelp": "How often to check for changes. Minimum: 1 minute.",
        "scanNow": "Scan Now",
        "scanning": "Scanning...",
        "lastScan": "Last scan: {{time}}",
        "never": "Never"
      },
      "apiServer": {
        "title": "API + MCP",
        "description": "Expose LLM Wiki to your own tools through the local HTTP API, and optionally through the bundled MCP server for agent clients.",
        "enable": "Enable local HTTP API",
        "enableHint": "Disable to make every non-/health endpoint return 503 even if a token is configured. Useful as a kill-switch without unsetting the token.",
        "status": "Status",
        "statusRunning": "Running",
        "statusOpen": "Running, no auth",
        "statusNoToken": "Running, no token",
        "statusDisabled": "Disabled",
        "statusStarting": "Starting…",
        "statusPortConflict": "Port 19828 in use",
        "statusError": "Error",
        "statusUnknown": "Unknown",
        "baseUrl": "Base URL",
        "openHealth": "Open /health",
        "openHealthHint": "Opens in your system browser. /health is the only unauthenticated endpoint.",
        "allowUnauthenticated": "Allow access without a token",
        "allowUnauthenticatedHint": "Use only for trusted local agents. Any process or browser page on this machine can call the API while this is enabled.",
        "allowLanAccess": "Allow API and Clip server access from the local network",
        "allowLanAccessHint": "After restarting the app, the API and Clip server listen on 0.0.0.0 instead of 127.0.0.1. Use only on trusted networks, and keep token auth enabled unless you fully trust the LAN.",
        "mcpEnable": "Enable MCP access",
        "mcpEnableHint": "MCP uses the local API and the same token rules. Keep the HTTP API enabled, then connect an MCP client to the bundled Node server.",
        "mcpUsage": "MCP usage",
        "mcpUsageHint": "Build once with `npm run mcp:build`, then configure your MCP client to run the server below. Use LLM_WIKI_API_TOKEN unless unauthenticated access is enabled.",
        "mcpPathUnavailable": "MCP server entry was not found. Run `npm run mcp:build` from the LLM Wiki repository, then reopen Settings.",
        "token": "Access token",
        "tokenHint": "Required unless unauthenticated access is enabled. Send as `Authorization: Bearer <token>` or `X-LLM-Wiki-Token: <token>`. The environment variable LLM_WIKI_API_TOKEN overrides this field if set.",
        "tokenPlaceholder": "Paste an existing token or click Generate",
        "generate": "Generate new token",
        "show": "Show",
        "hide": "Hide",
        "copy": "Copy",
        "copied": "Copied",
        "tokenMissing": "No token — every endpoint will return 401",
        "tokenUnused": "Token is not used while unauthenticated access is enabled",
        "envTokenActive": "LLM_WIKI_API_TOKEN is active and overrides this field",
        "tokenWeak": "Token is short — consider Generate for 256-bit entropy",
        "saveFirst": "Save settings to apply API/MCP changes",
        "saveFirstExample": "Save settings first, then copy an example request.",
        "tokenWarning": "Keep this token secret. Anyone with the token on this machine can read your project files via localhost.",
        "tokenQueryWarning": "Prefer the Authorization header — passing ?token=… via URL leaks the value into shell history, logs, and Referer headers.",
        "sample": "Example request",
        "endpoints": "Endpoints",
        "endpointsHint": "Replace {id} with a project UUID, a project filesystem path, or the literal 'current'.",
        "endpointHealthNote": "Liveness probe. No auth.",
        "endpointProjectsNote": "List known projects with their IDs and paths.",
        "endpointFilesNote": "?root=wiki|sources|all; ?recursive=false; ?maxFiles=N (≤10000).",
        "endpointContentNote": "?path=wiki/index.md — text files only, 2 MB max.",
        "endpointReviewsNote": "?status=unresolved|resolved|all; ?type=missing-page; ?limit=N. Defaults to unresolved Review items.",
        "endpointPatchReviewNote": "Update one Review item. JSON body: { resolved?, action? } (resolved defaults to true; pass false to reopen). Use the Review tab's Refresh button to re-read.",
        "endpointBulkResolveNote": "Bulk-resolve Review items. JSON body: { ids, action? }. Returns { resolved, notFound, count }.",
        "endpointSearchNote": "JSON body: { query, topK?, includeContent?, queryEmbedding? }. Uses shared keyword + vector retrieval when embeddings are configured.",
        "endpointGraphNote": "?q=…&nodeType=…&limit=N — wikilinks graph derived from wiki/*.md.",
        "endpointRescanNote": "Triggers a backend rescan using your Source Watch config.",
        "endpointChatNote": "Not implemented yet (returns 501)."
      },
      "output": {
        "title": "Output Preferences",
        "description": "Controls for generated content — language, conversation history length.",
        "aiLanguage": "AI Output Language",
        "aiLanguageHint": "Force AI-generated content (chat replies, wiki pages, research output, lint reports) to use the selected language. Pick \"Auto\" to let the AI follow the user's input or source document language.",
        "historyLength": "Conversation History Length",
        "historyHint": "Number of prior messages sent to the AI on each request. More = richer context but more tokens.",
        "historyCurrent": "Currently {{count}} messages (about {{turns}} turns)"
      },
      "interface": {
        "title": "Interface",
        "description": "UI language and appearance. Changes apply immediately and persist.",
        "uiLanguage": "UI Language",
        "uiLanguageHint": "Affects labels, buttons, and other UI strings only. The AI output language is set separately in Output Preferences.",
        "theme": "Theme",
        "themeHint": "Preview applies immediately. Save settings to keep the selected theme. System follows your operating system appearance.",
        "themeLight": "Light",
        "themeDark": "Dark",
        "themeSystem": "System",
        "zoom": "Interface zoom",
        "zoomHint": "Scales text and rem-based spacing across the app. Some fixed pixel panels keep their practical size limits.",
        "zoomIn": "Zoom in",
        "zoomOut": "Zoom out"
      },
      "maintenance": {
        "title": "Maintenance",
        "description": "Tools for cleaning up the wiki — detect and merge duplicate entities/concepts that the LLM created under different names across re-ingests.",
        "noProject": "Open a project first.",
        "noLlm": "Configure an LLM provider first.",
        "projectData": {
          "title": "Project data",
          "description": "Rebuild navigation from existing pages, or move a complete project including its hidden processing state.",
          "rebuild": "Rebuild index",
          "export": "Export project",
          "import": "Import project",
          "rebuilt": "Rebuilt index with {{pages}} pages in {{groups}} groups.",
          "exported": "Project exported to {{path}}",
          "imported": "Imported {{name}}. Switch projects to open it."
        },
        "dedup": {
          "title": "Detect duplicate entities / concepts",
          "description": "Asks the LLM to scan all entity / concept pages and group ones that likely refer to the same topic under different names (English vs Chinese, plural vs singular, abbreviation vs full form). You confirm each group before merging. Merges are queued and run one at a time so cross-references stay consistent.",
          "scanButton": "Scan for duplicates",
          "scanning": "Scanning…",
          "noneFound": "No duplicate groups found. The wiki is clean.",
          "candidates": "{{n}} candidates",
          "canonicalLabel": "Keep this slug as canonical:",
          "mergeButton": "Merge into {{slug}}",
          "merging": "Merging…",
          "queued": "Queued",
          "queuedAhead": "Queued ({{n}} ahead)",
          "failed": "Failed ({{retries}}/3)",
          "cancel": "Cancel",
          "retry": "Retry",
          "delete": "Delete",
          "queueTitle": "In-progress merges",
          "queueDescription": "Tasks queued from a previous scan that haven't finished yet. Merges run one at a time.",
          "restoredBacklog": "These merge tasks were restored from the previous session and are paused to avoid unexpected LLM usage.",
          "resumeRestored": "Resume merges",
          "notDuplicates": "Not duplicates",
          "merged": "Merged",
          "skipped": "Marked not duplicates"
        }
      },
      "changelog": {
        "title": "Changelog",
        "description": "Notable user-visible changes in each released version, newest first."
      },
      "about": {
        "title": "About",
        "description": "Build info and runtime status.",
        "version": "Version",
        "clipServer": "Clip Server",
        "apiServer": "API Server",
        "apiDisabled": "disabled",
        "apiOpen": "running (no auth)",
        "apiNoToken": "running (no token)",
        "updateCheck": "Update Check",
        "lastChecked": "Last checked",
        "lastCheckedNever": "Never",
        "unreachable": "couldn't reach GitHub",
        "checkNow": "Check now",
        "checking": "Checking…",
        "upToDate": "Up to date (v{{version}}).",
        "updateAvailable": "Update available: v{{version}}",
        "openDownload": "Open download page",
        "later": "Later",
        "autoCheck": "Check for updates automatically on startup (at most once every 6 hours)",
        "appDescription": "An LLM-driven personal knowledge base. Source:"
      },
      "mineru": {
        "title": "MinerU PDF Parser",
        "description": "Use MinerU cloud or a self-hosted local service for higher quality PDF parsing (tables, formulas, complex layouts). Default uses built-in pdfium extraction.",
        "privacyNotice": "When enabled, PDF contents are uploaded to MinerU cloud for parsing. Do not enable this for sensitive documents unless you accept that.",
        "enabled": "Enable MinerU",
        "backend": "Backend",
        "cloudBackend": "Cloud (mineru.net) - requires token, higher quality",
        "localBackend": "Official self-hosted mineru-api - private, offline",
        "localEndpoint": "Local service endpoint",
        "localInfo": "Base URL of an official mineru-api or mineru-router service.",
        "parsingBackend": "Parsing backend",
        "backendHybrid": "Hybrid engine (Recommended)",
        "backendPipeline": "Pipeline",
        "backendVlm": "VLM engine",
        "backendHybridHttp": "Hybrid HTTP client",
        "backendVlmHttp": "VLM HTTP client",
        "effort": "Hybrid effort",
        "effortMedium": "Medium (Faster)",
        "effortHigh": "High (Image analysis and maximum accuracy)",
        "ocrLanguage": "OCR language",
        "parseMethod": "Parse method",
        "parseAuto": "Auto",
        "parseText": "Text extraction",
        "parseOcr": "Force OCR",
        "serverUrl": "OpenAI-compatible model server URL",
        "formulaParsing": "Formula parsing",
        "tableParsing": "Table parsing",
        "imageAnalysis": "Image analysis",
        "token": "API Token",
        "tokenHint": "Get your token from mineru.net",
        "model": "Model Version",
        "modelVlm": "VLM (Recommended, best for complex layouts)",
        "modelPipeline": "Pipeline (Faster)",
        "modelHint": "PDF parsing supports pipeline and vlm. MinerU-HTML is for HTML files and is not used here.",
        "test": "Test Connection",
        "testQuotaNotice": "Connection test submits a small demo file to MinerU and may consume a small amount of quota.",
        "testing": "Testing...",
        "testSuccess": "Connection successful",
        "testFailed": "Test failed"
      }
    }
  },
  "preview": {
    "selectFile": "Select a file to preview",
    "notAvailable": "Preview not available for this file type",
    "viewAsText": "View as text",
    "loadingText": "Loading text...",
    "openWithSystem": "Open with system app",
    "showSource": "Show source",
    "showRendered": "Show rendered preview",
    "reload": "Reload preview",
    "history": "File history",
    "historyLoading": "Loading...",
    "historyEmpty": "No recorded versions yet.",
    "historySelect": "Select a version to compare.",
    "historyRestore": "Restore this version",
    "pdfText": "Text",
    "pdfDocument": "PDF",
    "pdfPage": "Page",
    "pdfLoading": "Loading PDF...",
    "pdfLoadError": "The PDF could not be rendered. You can retry or open it with the system app.",
    "pdfTooLarge": "This PDF is too large for the in-app preview. Open it with the system app."
  },
  "activity": {
    "processing": "Processing: {{title}}",
    "done": "Done: {{title}}",
    "clearCompleted": "Clear completed",
    "ingestQueue": "Ingest Queue",
    "ingestQueuePaused": "Ingest Queue (paused)",
    "pauseQueue": "Pause",
    "resumeQueue": "Resume",
    "pauseQueueTitle": "Pause after the current task finishes. No new ingest tasks will start.",
    "resumeQueueTitle": "Resume processing queued ingest tasks",
    "queueCompleteCount": "{{done}}/{{total}} complete",
    "failedCount": "{{count}} failed",
    "cancelAll": "Cancel all",
    "cancelAllTitle": "Cancel all queued and in-progress tasks",
    "cancelAllConfirm": "Cancel all {{count}} queued/processing ingest tasks? Partial files from the in-progress task will be removed. Failed tasks will be kept so you can retry them.",
    "retryFailed": "Retry failed",
    "retryFailedTitle": "Retry all failed ingest tasks",
    "fileSync": "File Sync",
    "rescan": "Rescan",
    "rescanTitle": "Scan project files for external changes",
    "changeKinds": { "created": "Created", "modified": "Modified", "deleted": "Deleted" },
    "fileTypes": {
      "entity": "Entity", "concept": "Concept", "source": "Source", "query": "Query",
      "synthesis": "Synthesis", "comparison": "Comparison", "finding": "Finding",
      "thesis": "Thesis", "methodology": "Methodology", "overview": "Overview",
      "index": "Index", "log": "Log", "file": "File"
    }
  },
  "fileTree": {
    "noProject": "No project open",
    "openProjectFolder": "Open project folder",
    "openProjectFolderFailed": "Failed to open the project folder."
  },
  "graph": {
    "openProject": "Open a project to view the graph",
    "buildingGraph": "Building graph...",
    "retry": "Retry",
    "noPages": "No pages yet",
    "importSourcesHint": "Import sources to start building the knowledge graph",
    "knowledgeGraph": "Knowledge Graph",
    "hidden": "hidden",
    "pages": "pages",
    "links": "links",
    "searchLabel": "Search graph",
    "searchPlaceholder": "Search nodes...",
    "clearSearch": "Clear graph search",
    "closeSearch": "Close graph search",
    "noSearchResults": "No matching nodes",
    "noVisibleNodes": "No visible nodes",
    "filter": "Filter",
    "reset": "Reset",
    "resetFilters": "Reset graph filters",
    "any": "Any",
    "showAllTypes": "Show all types",
    "doubleClickToggle": "Double-click to toggle visibility",
    "expandLegend": "Expand legend",
    "collapseLegend": "Collapse legend",
    "type": "Type",
    "community": "Community",
    "insights": "Insights",
    "resizing": "Resizing...",
    "graphFilters": "Graph Filters",
    "quickFilters": "Quick filters",
    "hideIndexOverview": "Hide index / overview / log",
    "hideIsolated": "Hide isolated nodes",
    "minLinks": "Min links",
    "minLinksHint": "Hide nodes below this link count",
    "maxLinks": "Max links",
    "maxLinksHint": "Hide nodes above this link count",
    "displayTuning": "Display tuning",
    "nodeSize": "Node size",
    "spacing": "Spacing",
    "displayTuningHint": "Use these controls to keep dense graphs readable on smaller screens.",
    "nodeTypes": "Node types",
    "hiddenNodes": "Hidden nodes",
    "show": "Show",
    "showingStats": "Showing {{pages}} of {{total}} pages and {{links}} of {{totalLinks}} links.",
    "hideThisNode": "Hide this node",
    "nodeTypesLabel": "Node Types",
    "communitiesLabel": "Communities",
    "showAll": "Show all",
    "cluster": "Cluster {{id}}",
    "surprisingConnections": "Surprising Connections",
    "knowledgeGaps": "Knowledge Gaps",
    "deepResearch": "Deep Research",
    "generatingTopic": "Generating research topic...",
    "researchTopic": "Research Topic",
    "searchQueries": "Search Queries",
    "cancel": "Cancel",
    "startResearch": "Start Research",
    "nodeTypeLabels": {
      "entity": "Entity",
      "concept": "Concept",
      "source": "Source",
      "query": "Query",
      "synthesis": "Synthesis",
      "overview": "Overview",
      "comparison": "Comparison",
      "finding": "Finding",
      "thesis": "Thesis",
      "methodology": "Methodology",
      "other": "Other"
    }
  },
  "time": {
    "justNow": "just now",
    "minutesAgo": "{{count}} min ago",
    "hoursAgo": "{{count}} h ago",
    "daysAgo": "{{count}} d ago"
  }
}
