{
  "app": {
    "title": "LLM Wiki",
    "subtitle": "Build and maintain your personal knowledge base with LLMs"
  },
  "nav": {
    "chat": "Chat",
    "wiki": "Wiki",
    "sources": "Sources",
    "search": "Search",
    "graph": "Graph",
    "lint": "Lint",
    "review": "Review",
    "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"
  },
  "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",
    "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",
    "importSourceFiles": "Import Source Files",
    "importSourceFolder": "Import Source Folder",
    "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": {
    "placeholder": "Ask about your wiki...",
    "ingestPlaceholder": "Discuss the source or ask follow-up questions...",
    "saveToWiki": "Save to Wiki",
    "saving": "Saving...",
    "saved": "Saved!",
    "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",
    "agentMode": "Agent mode",
    "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",
    "closeReferencePreview": "Close reference preview",
    "resizeReferencePreview": "Resize reference preview",
    "noReferencePreviewFragment": "No preview fragment returned.",
    "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...",
    "noResults": "No results found",
    "startSearching": "Type to search wiki pages"
  },
  "lint": {
    "title": "Wiki Lint",
    "semantic": "Semantic (LLM)",
    "running": "Running...",
    "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",
    "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."
      },
      "llm": {
        "title": "LLM Models",
        "description": "One row per vendor. Toggling one on automatically turns off the others. Changes save instantly; each vendor's API key is stored independently so switching doesn't lose data.",
        "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.",
        "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.",
        "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.",
        "firecrawlHint": "Uses Firecrawl's anonymous Search API (`https://api.firecrawl.dev/v2/search`). No API key is required here, but Firecrawl may block suspicious IP addresses.",
        "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.",
        "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.",
          "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 API 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",
        "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"
  },
  "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"
  },
  "fileTree": {
    "noProject": "No project open"
  },
  "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",
    "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"
  }
}
