export const messages = {
  en: {
    localeEnglish: 'EN',
    localeChinese: '中文',
    searchPlaceholder: 'Search PDFs / filter files',
    recent: 'Recent',
    addFolder: '+ Add Folder',
    scanningWorkspace: 'Scanning...',
    rescanWorkspace: 'Rescan',
    rescanningWorkspace: 'Scanning...',
    noPdfsFound: 'Choose a folder to load local PDFs.',
    noDocumentSelected: 'No PDF selected',
    settings: 'Settings',
    openWorkspaceInFileManager: 'Show workspace in Finder',
    addPdfs: 'Add PDFs to this folder',
    collapse: 'Collapse',
    expand: 'Expand',
    tabClose: 'Close tab',
    chat: 'Chat',
    notes: 'Notes',
    currentDoc: 'Current doc',
    preparingDocument: 'Preparing document...',
    extractingBlocks: 'Extracting text blocks',
    mappingCitations: 'Building citation mapping',
    preparingContext: 'Preparing chat context',
    assistant: 'Assistant',
    user: 'User',
    sources: 'Sources',
    chatWorking: 'Working...',
    chatGenerating: 'Generating answer...',
    chatFailed: 'Model request failed',
    thinking: 'Thinking',
    thinkingStreaming: 'streaming',
    thinkingComplete: 'complete',
    clearChatHistory: 'Clear chat history',
    editAndReask: 'Edit & re-ask',
    reAsk: 'Re-ask',
    clearChatHistoryShort: 'Clear',
    clearChatHistoryConfirm: 'Clear chat history for this PDF? This removes saved messages and resets conversation memory.',
    newSession: 'New chat',
    sessionHistory: 'Session history',
    exportChat: 'Export as Markdown',
    exportChatEmpty: 'Nothing to export yet.',
    exportChatDone: 'Chat exported.',
    closeTab: 'Close tab',
    deleteSession: 'Delete session',
    close: 'Close',
    focusDoc: 'Focus',
    focusOnCurrent: 'Focus current doc',
    sources: 'Sources',
    clearChatHistoryFailed: 'Failed to clear chat history',
    removeWorkspace: 'Remove Folder',
    removeWorkspaceConfirm: 'Remove the workspace "{name}" and all its PDF references from this app?',
    removeWorkspaceSummary: 'PDF count',
    removeWorkspaceFailed: 'Failed to remove workspace folder',
    inputPlaceholder: 'Ask a question, press Enter to send',
    inputDisabled: 'Document is preparing, chat is disabled',
    chatEmptyTitle: 'Ask about this PDF',
    chatEmptyHint: 'Use the composer below to ask for explanations, summaries, tables, figures, or evidence-backed answers.',
    jumpToLatest: 'Jump to latest message',
    imageInputPlaceholder: 'Ask about this PDF or image',
    imageDropHint: 'Paste image or drop image here',
    imageOnlyPrompt: 'Please analyze the attached image.',
    docStillIndexing: "I'm still indexing this paper — give it a moment to finish, then ask again and I'll answer from its content.",
    mentionPaperPlaceholder: 'Search papers to mention…',
    mentionPaperNotFound: 'No papers found',
    mentionPaperRemove: 'Remove mention',
    mentionPaperLimit: 'You can mention up to 4 papers',
    send: 'Send',
    capabilities: 'Capabilities',
    capabilityText: 'Text',
    capabilityVision: 'Vision',
    capabilityReasoning: 'Reasoning',
    capabilityToolUse: 'Tool use',
    attach: 'Attach',
    voiceInput: 'Voice Input',
    sendMessage: 'Send Message',
    stopGeneration: 'Stop generating',
    generationStopped: '_(Stopped.)_',
    page: 'Page',
    paragraph: 'Paragraph',
    selectedText: 'Selected text',
    quoteParagraph: 'Quote paragraph',
    previousPage: 'Prev',
    nextPage: 'Next',
    pdfLoading: 'Loading PDF...',
    pdfLoadFailed: 'PDF failed to load',
    startTranslation: 'Translate',
    translating: 'Translating...',
    enterDual: 'Dual View',
    exitDual: 'Exit Dual View',
    retry: 'Retry',
    refresh: 'Refresh',
    upvotes: 'Upvotes',
    trendingPapers: 'Trending Papers',
    trendingDaily: 'Daily',
    trendingWeekly: 'Weekly',
    trendingMonthly: 'Monthly',
    browsing: 'Browsing',
    trendingPapersHint: 'Discover trending new papers from Hugging Face',
    trendingLoading: 'Loading trending papers…',
    trendingOffline: 'Could not load trending papers (offline or unavailable).',
    trendingEmpty: 'No trending papers right now.',
    trendingAdd: 'Add & read',
    trendingAdding: 'Adding…',
    trendingOpenHf: 'Open on HF',
    updateAvailable: 'A new version is available:',
    updateView: 'View',
    dismiss: 'Dismiss',
    trendingDiscovery: 'Enable Trending Papers (online discovery)',
    trendingDiscoveryHint: 'When off, nothing is fetched from the network and the Trending Papers entry is hidden.',
    knowledgePrecipitation: 'Precipitate knowledge from documents (LLM)',
    knowledgePrecipitationHint: 'After indexing, one LLM call per document extracts a summary, entities and concepts (cached; runs once per document). When off, no extraction is triggered.',
    knowledge: 'Knowledge',
    knowledgeRunning: 'Precipitating…',
    knowledgeFailed: 'Precipitation failed',
    knowledgeEntities: 'Entities',
    knowledgeConcepts: 'Concepts',
    knowledgeKeywords: 'Keywords',
    knowledgeReprecipitate: 'Re-precipitate',
    knowledgeRelated: 'Related papers',
    knowledgeRelatedCoCited: 'Cited together in a conversation',
    readerTabRead: 'Read',
    knowledgeEmpty: 'No knowledge yet — it precipitates automatically after indexing, or press ↻.',
    knowledgeViewInGraph: 'View in knowledge graph',
    knowledgeMiniGraphHint: 'Center = this paper · purple = concepts (size = salience) · blue = related papers, click to open · purple edge = shared / co-cited',
    knowledgeGraph: 'Knowledge Graph',
    graphModeConcept: 'Concepts',
    graphModeDocument: 'Documents',
    graphColorType: 'Type',
    graphColorCommunity: 'Community',
    graphLegendDocument: 'Document',
    graphLegendConcept: 'Concept',
    graphLegendEntity: 'Entity',
    graphFocus: 'Focus current',
    graphFocusHint: 'Show only the open document and its 1–2 hop neighbourhood',
    graphInsights: 'Insights',
    graphInsightSurprising: 'Surprising connections',
    graphInsightBridges: 'Bridge documents',
    graphInsightGaps: 'Knowledge gaps (isolated)',
    graphInsightEmpty: 'No insights yet — precipitate and chat across more documents.',
    graphEdgeShared: 'Shared',
    graphEdgeCoCited: 'Co-cited in a conversation',
    graphSearch: 'Find a node…',
    graphCollapse: 'Collapse',
    graphCollapseHint: 'Collapse communities into super-nodes; click one to expand it',
    graphCommunityLabel: 'Community',
    graphClose: 'Close (Esc)',
    graphLoading: 'Building the knowledge graph…',
    graphFailed: 'Could not build the knowledge graph.',
    graphEmpty: 'No knowledge yet — open and chat about a few documents first.',
    retranslate: 'Retranslate',
    cancel: 'Cancel',
    align: 'Sync',
    original: 'original',
    dual: 'dual',
    statusIdle: 'ready',
    statusPending: 'queued',
    statusRunning: 'translating',
    statusSucceeded: 'ready',
    statusFailed: 'failed',
    translationFailed: 'Translation failed',
    translationResult: 'Translation',
    translationPending: 'Translating...',
    translationPageLoading: 'Loading page...',
    translationEmptyPage: 'No translated text on this page.',
    translationCached: 'Cached',
    translationPartial: 'Partial',
    translationProvider: 'Provider',
    viewerTitle: 'PDF Viewer',
    fitWidth: 'Fit Width',
    originalPdf: 'Original PDF',
    translatedPdf: 'Translation',
    translatedPdfFile: 'Translated PDF',
    dualPdfFile: 'Dual PDF',
    openTranslatedPdf: 'Show translated PDF in Finder',
    openDualPdf: 'Show dual PDF in Finder',
    scrollSynced: 'scroll synced',
    pageTranslationProgress: 'Page',
    loadedTranslationPages: 'Loaded pages',
    documentTranslationProgress: 'Document',
    translationPhaseQueued: 'Preparing translation',
    translationPhaseRunning: 'Translating',
    translationPhaseFinished: 'Translation complete',
    ask: 'Ask',
    translate: 'Translate',
    note: 'Note',
    translateTo: 'Translate to',
    showSource: 'Show source',
    hideSource: 'Hide source',
    askSelection: 'Explain the selected passage.',
    noteCreated: 'Created a local note draft for the current selection.',
    edit: 'Edit',
    delete: 'Delete',
    takeNote: 'Note',
    notesLoading: 'Loading notes...',
    notesEmptyTitle: 'No notes yet',
    notesEmptyHint: 'Select text in the PDF and choose "Note" to highlight it or add a comment.',
    noteEditorPlaceholder: 'Add a comment (optional, supports Markdown)...',
    noteComposerTitle: 'New note',
    noteEditTitle: 'Edit note',
    noteSave: 'Save',
    noteCancel: 'Cancel',
    noteDeleteTitle: 'Delete note',
    noteDeleteConfirm: 'Delete this note?',
    noteDeleteFailed: 'Failed to delete note',
    mockAnswer: 'I searched the local PDF index for evidence. Use the citations below to jump back to the source text.',
    mockTranslationPreview: 'Selection translation is not connected yet. The next phase will route this text through the configured translation provider.',
    realignDone: 'Sync completed. The full dual-view alignment will use block anchors after translation blocks are available.',
    scannedPdfUnsupported: 'This looks like a scanned PDF with no text layer. Text recognition (OCR) is not supported yet, so it cannot be indexed.',
    scannedPdfTranslationTitle: 'Translation not available',
    scannedPdfTranslationUnsupported: 'This is a scanned PDF with no text layer, so it can’t be translated. You can still read it and ask the agent about it.',
    progressDone: 'Completed',
    progressDoing: 'In progress',
    progressSummary: 'page counting, base preview',
    progressDetails: 'block parsing, bbox mapping, citation indexing',
    statusIndexed: 'indexed',
    statusIndexing: 'indexing',
    statusStale: 'stale',
    treeReady: 'tree ready',
    treeMissing: 'tree missing',
    docStatusReady: 'Ready',
    docStatusProcessing: 'Processing…',
    docStatusFailed: 'Failed',
    reindexDocument: 'Reindex',
    modelSettings: 'Model settings',
    modelNotConfigured: 'No model configured',
    modelNotConfiguredHint: 'Configure a model provider in Settings before chatting.',
    providerConfig: 'Provider configuration',
    settingsSections: 'Settings sections',
    generalNav: 'General',
    generalNavHint: 'Interface language and basics',
    interfaceLanguage: 'Interface language',
    interfaceLanguageHint: 'Language used across the app interface.',
    languageNameEnglish: 'English',
    languageNameChinese: 'Chinese',
    chatProvidersNav: 'Chat providers',
    localAgents: 'Local agents',
    localAgentsNote: 'Use a locally-installed Codex or Claude Code (your subscription, no API key). Codex is preferred by default.',
    localAgentInstalled: 'Installed',
    localAgentNotInstalled: 'Not installed',
    localAgentInstall: 'Install',
    localAgentRecheck: 'Re-check',
    localAgentChecking: 'Checking…',
    localAgentPreferred: 'Preferred local agent (used as the first-run default)',
    localAgentNone: 'Detecting local agents…',
    localAgentTest: 'Test connection',
    localAgentTesting: 'Testing…',
    chatProvidersNavHint: 'Connections and chat models',
    translationNav: 'Translation',
    translationNavHint: 'Translation provider and fallback',
    chatProvidersListNote: 'Choose which provider connection to edit.',
    providerName: 'Configuration name',
    providerType: 'Provider type',
    baseUrl: 'Base URL',
    modelName: 'Model',
    modelId: 'Model ID',
    modelNickname: 'Display name',
    modelCapabilities: 'Capabilities',
    contextWindow: 'Context window',
    contextWindowAuto: 'auto',
    contextWindowHint: "Context window in tokens. Leave empty to auto-detect from the provider (or fall back to the catalog). Set it to force the model's real window.",
    defaultChatModel: 'Default chat model',
    defaultShort: 'Default',
    chatModelsSection: 'Chat models',
    chatModelsNote: 'Add one or more models under this provider. The chat composer chooses from enabled models below.',
    modelsForProvider: 'Models for this provider',
    availableModels: 'Available models',
    modelsForProviderNote: 'Fetch models from this provider, then enable the ones you want to use for chat. These models share the Base URL and API key configured above.',
    addModel: 'Add model',
    addManually: 'Add manually',
    fetchModels: 'Fetch models',
    fetchingModels: 'Fetching models...',
    fetchModelsFailed: 'Failed to fetch models',
    fetchModelsImported: 'Imported {count} models',
    fetchModelsNoNewModels: 'No new models found',
    newProvider: 'New provider',
    unsavedProvider: 'Unsaved provider',
    oneModel: '1 model',
    modelsCount: 'models',
    defaultProviderShort: 'Default',
    setDefaultProvider: 'Set default provider',
    remove: 'Remove',
    deleteProviderConfirm: 'Delete "{name}"? This removes its models and saved local API key.',
    apiKey: 'API key',
    apiKeySaved: 'API key saved locally',
    apiKeyNotSaved: 'API key not saved',
    apiKeyPlaceholder: 'Leave blank to keep the saved key',
    enabled: 'Enabled',
    defaultProvider: 'Default provider',
    save: 'Save',
    testConnection: 'Test',
    copy: 'Copy',
    copied: 'Copied',
    close: 'Close',
    settingsSaved: 'Settings saved',
    settingsSaveFailed: 'Save failed',
    providerTestSucceeded: 'Connected',
    providerTestFailed: 'Connection failed',
    translationProviderMode: 'Translation provider',
    translationProviderGoogleWeb: 'Google Web (free, experimental)',
    translationProviderMicrosoft: 'Microsoft / Bing',
    translationProviderLlm: 'LLM provider',
    translationProviderPlaceholder: 'Local placeholder',
    translationProviderGoogleWebNote: 'No API key is required. This uses Google Translate web pages and may be rate limited or break if the page changes.',
    translationProviderMicrosoftNote: 'Text translation uses the official Azure Translator REST API when configured. PDF translation uses PDFMathTranslate-next Bing Web as a keyless fallback.',
    translationProviderLlmNote: 'LLM translation uses the model provider configured below.',
    translationProviderPlaceholderNote: 'Returns local placeholder text without sending data to a network service.',
    translationProviderSection: 'Translation provider',
    chatModelProviderSection: 'Chat model provider',
    chatModelProviderNote: 'This provider is used for Ask/chat, and also for translation when you choose LLM provider above.',
    testChatModel: 'Test chat model',
    translationFallback: 'Enable fallback providers',
    translationFallbackNote: 'If the selected provider fails, Lumenfolio will try Microsoft, then the configured LLM, and finally a local placeholder when available.',
    translationErrorHint: 'You can retry, switch the translation provider in Settings, or select a shorter passage.',
    microsoftEndpoint: 'Microsoft endpoint',
    microsoftRegion: 'Microsoft region',
    freeTranslationProvider: 'Testing translation provider...',
    evidence: 'Evidence',
    evidenceCollapse: 'Collapse',
    agentActivity: 'Agent activity',
    retrievalTrace: 'Agent activity',
    traceRun: 'Run:',
    traceIntent: 'Intent:',
    traceFinalize: 'Gate:',
    traceTreeNodes: 'Tree nodes',
    traceCandidates: 'Candidates',
    traceSteps: 'Agent steps',
    traceSessionSummary: 'Session summary',
    traceCompact: 'Compact',
    traceCompactRetained: 'Retained turns:',
    traceCompactSummarized: 'Summarized turns:',
    traceCompactTrigger: 'Trigger:',
    traceStepCompleted: 'completed',
    traceStepSkipped: 'skipped',
    traceStatusAnswerable: 'Ready to answer',
    traceStatusInsufficient: 'Needs review',
    traceStatusBestEffort: 'Best-effort answer',
    traceStatusSearching: 'Searching',
    traceStatusUnknown: 'Checked',
    traceAttemptSummary: 'step {attempt}/{max}',
  },
  zh: {
    localeEnglish: 'EN',
    localeChinese: '中文',
    searchPlaceholder: '搜索 PDF / 过滤文件',
    recent: '最近打开',
    addFolder: '+ 添加目录',
    scanningWorkspace: '扫描中...',
    rescanWorkspace: '重新扫描',
    rescanningWorkspace: '扫描中...',
    noPdfsFound: '选择一个目录以加载本地 PDF。',
    noDocumentSelected: '未选择 PDF',
    settings: '设置',
    openWorkspaceInFileManager: '在访达中显示当前文件夹',
    addPdfs: '向此文件夹添加 PDF',
    collapse: '收起',
    expand: '展开',
    tabClose: '关闭标签页',
    chat: '聊天',
    notes: '笔记',
    currentDoc: '当前文档',
    preparingDocument: '正在准备文档内容',
    extractingBlocks: '抽取文本块',
    mappingCitations: '建立 citation 映射',
    preparingContext: '准备问答上下文',
    assistant: '助手',
    user: '用户',
    sources: '引用来源',
    chatWorking: '处理中...',
    chatGenerating: '正在生成回答...',
    chatFailed: '模型请求失败',
    thinking: '思考过程',
    thinkingStreaming: '生成中',
    thinkingComplete: '已完成',
    clearChatHistory: '清空聊天历史',
    editAndReask: '编辑并重问',
    reAsk: '重新提问',
    clearChatHistoryShort: '清空',
    clearChatHistoryConfirm: '清空当前 PDF 的聊天历史？这会删除已保存消息并重置会话记忆。',
    newSession: '新会话',
    sessionHistory: '会话历史',
    exportChat: '导出为 Markdown',
    exportChatEmpty: '当前对话还没有内容可导出。',
    exportChatDone: '对话已导出。',
    closeTab: '关闭标签',
    deleteSession: '删除会话',
    close: '关闭',
    focusDoc: '焦点',
    focusOnCurrent: '聚焦当前文档',
    sources: '来源',
    clearChatHistoryFailed: '清空聊天历史失败',
    removeWorkspace: '移除目录',
    removeWorkspaceConfirm: '移除工作区“{name}”并清除该目录下 PDF 的应用关联？（不会删除磁盘文件）',
    removeWorkspaceSummary: '包含 PDF 数量',
    removeWorkspaceFailed: '移除目录失败',
    inputPlaceholder: '输入问题，Enter 发送',
    inputDisabled: '文档准备中，暂不可提问',
    chatEmptyTitle: '开始询问这篇 PDF',
    chatEmptyHint: '你可以让它解释段落、总结全文、查表格图示，或基于证据回答问题。',
    jumpToLatest: '跳到最新消息',
    imageInputPlaceholder: '结合当前 PDF 或图片提问',
    imageDropHint: '粘贴图片或拖拽图片到这里',
    imageOnlyPrompt: '请分析这张附加图片。',
    docStillIndexing: '这篇论文我还在建立索引，稍等片刻索引完成后再问我，我就能根据它的内容回答了。',
    mentionPaperPlaceholder: '搜索要引用的论文…',
    mentionPaperNotFound: '未找到论文',
    mentionPaperRemove: '移除引用',
    mentionPaperLimit: '最多可引用 4 篇论文',
    send: '发送',
    capabilities: '能力',
    capabilityText: '文本',
    capabilityVision: '视觉',
    capabilityReasoning: '推理',
    capabilityToolUse: '工具调用',
    attach: '附件',
    voiceInput: '语音输入',
    sendMessage: '发送消息',
    stopGeneration: '停止生成',
    generationStopped: '_(已停止)_',
    page: '页',
    paragraph: '段落',
    selectedText: '选中文本',
    quoteParagraph: '引用当前段落',
    previousPage: '上一页',
    nextPage: '下一页',
    pdfLoading: '正在加载 PDF...',
    pdfLoadFailed: 'PDF 加载失败',
    startTranslation: '开始翻译',
    translating: '翻译中...',
    enterDual: '进入双栏',
    exitDual: '退出双栏',
    retry: '重试',
    refresh: '刷新',
    upvotes: '点赞',
    trendingPapers: '趋势论文',
    trendingDaily: '每日',
    trendingWeekly: '每周',
    trendingMonthly: '每月',
    browsing: '正在浏览',
    trendingPapersHint: '从 Hugging Face 发现趋势中的新论文',
    trendingLoading: '正在加载趋势论文…',
    trendingOffline: '无法加载趋势论文(离线或不可用)。',
    trendingEmpty: '当前没有趋势论文。',
    trendingAdd: '加入并阅读',
    trendingAdding: '正在加入…',
    trendingOpenHf: '在 HF 打开',
    updateAvailable: '有新版本可用:',
    updateView: '查看',
    dismiss: '忽略',
    trendingDiscovery: '启用趋势论文(联网发现)',
    trendingDiscoveryHint: '关闭后不会发起任何联网请求,左侧的趋势论文入口也会隐藏。',
    knowledgePrecipitation: '从文档沉淀知识(LLM)',
    knowledgePrecipitationHint: '索引后,每篇文档调用一次 LLM 析出摘要、实体与概念(带缓存,每篇仅一次)。关闭后不触发任何抽取。',
    knowledge: '知识',
    knowledgeRunning: '沉淀中…',
    knowledgeFailed: '沉淀失败',
    knowledgeEntities: '实体',
    knowledgeConcepts: '概念',
    knowledgeKeywords: '关键词',
    knowledgeReprecipitate: '重新沉淀',
    knowledgeRelated: '相关论文',
    knowledgeRelatedCoCited: '曾在对话中被一起引用',
    readerTabRead: '阅读',
    knowledgeEmpty: '暂无沉淀知识 —— 索引完成后自动沉淀,或点 ↻ 手动触发。',
    knowledgeViewInGraph: '在全局图谱中查看',
    knowledgeMiniGraphHint: '中心 = 当前论文 · 紫 = 概念(大小 = 重要度)· 蓝 = 相关论文,点击打开 · 紫边 = 共享/共引',
    knowledgeGraph: '知识图谱',
    graphModeConcept: '概念',
    graphModeDocument: '文档',
    graphColorType: '类型',
    graphColorCommunity: '社区',
    graphLegendDocument: '文档',
    graphLegendConcept: '概念',
    graphLegendEntity: '实体',
    graphFocus: '聚焦当前',
    graphFocusHint: '只显示当前文档及其 1–2 跳邻域',
    graphInsights: '洞察',
    graphInsightSurprising: '惊喜连接',
    graphInsightBridges: '桥梁文档',
    graphInsightGaps: '知识缺口(孤立)',
    graphInsightEmpty: '暂无洞察 —— 多沉淀、多跨文档对话。',
    graphEdgeShared: '共享',
    graphEdgeCoCited: '对话中被一起引用',
    graphSearch: '查找节点…',
    graphCollapse: '社区折叠',
    graphCollapseHint: '把社区折叠成超级节点;点击可展开该社区',
    graphCommunityLabel: '社区',
    graphClose: '关闭(Esc)',
    graphLoading: '正在构建知识图谱…',
    graphFailed: '无法构建知识图谱。',
    graphEmpty: '暂无知识 —— 先打开并就几篇文档对话/沉淀。',
    retranslate: '重新翻译',
    cancel: '取消',
    align: '同步',
    original: '原文',
    dual: '双栏',
    statusIdle: '就绪',
    statusPending: '排队中',
    statusRunning: '处理中',
    statusSucceeded: '已就绪',
    statusFailed: '失败',
    translationFailed: '译文生成失败',
    translationResult: '翻译结果',
    translationPending: '翻译中...',
    translationPageLoading: '正在加载这一页...',
    translationEmptyPage: '这一页没有可展示的译文。',
    translationCached: '已缓存',
    translationPartial: '部分结果',
    translationProvider: 'Provider',
    viewerTitle: 'PDF 预览',
    fitWidth: '适应宽度',
    originalPdf: '原文 PDF',
    translatedPdf: '译文',
    translatedPdfFile: '译文 PDF',
    dualPdfFile: '双栏 PDF',
    openTranslatedPdf: '在 Finder 中显示译文 PDF',
    openDualPdf: '在 Finder 中显示双栏 PDF',
    scrollSynced: '滚动同步',
    pageTranslationProgress: '当前页',
    loadedTranslationPages: '已加载页',
    documentTranslationProgress: '全文',
    translationPhaseQueued: '准备翻译',
    translationPhaseRunning: '翻译中',
    translationPhaseFinished: '翻译完成',
    ask: '提问',
    translate: '翻译',
    note: '笔记',
    translateTo: '翻译为',
    showSource: '显示原文',
    hideSource: '隐藏原文',
    askSelection: '请解释当前选中的这段内容。',
    noteCreated: '已为当前选区创建一条本地笔记草稿。',
    edit: '编辑',
    delete: '删除',
    takeNote: '笔记',
    notesLoading: '正在加载笔记...',
    notesEmptyTitle: '还没有笔记',
    notesEmptyHint: '在 PDF 中选中文字,点"笔记"即可高亮或添加批注。',
    noteEditorPlaceholder: '添加批注(可选,支持 Markdown)...',
    noteComposerTitle: '新建笔记',
    noteEditTitle: '编辑笔记',
    noteSave: '保存',
    noteCancel: '取消',
    noteDeleteTitle: '删除笔记',
    noteDeleteConfirm: '删除这条笔记?',
    noteDeleteFailed: '删除笔记失败',
    mockAnswer: '我已在当前 PDF 的本地索引中检索证据。可以点击下方 citation 跳回原文位置。',
    mockTranslationPreview: '选区翻译尚未接入 Provider。下一阶段会把这段文本发送到已配置的翻译服务。',
    realignDone: '已执行同步。完整双栏对齐会在 translated_blocks 可用后使用 block anchor。',
    scannedPdfUnsupported: '这似乎是没有文字层的扫描版 PDF。暂不支持文字识别(OCR),因此无法索引。',
    scannedPdfTranslationTitle: '暂不支持翻译',
    scannedPdfTranslationUnsupported: '这是没有文字层的扫描版 PDF,无法翻译。你仍可以阅读,并就其内容向 agent 提问。',
    progressDone: '已完成',
    progressDoing: '进行中',
    progressSummary: '页数识别、基础预览',
    progressDetails: 'block 解析、bbox 建模、citation 映射',
    statusIndexed: '已索引',
    statusIndexing: '索引中',
    statusStale: '需刷新',
    treeReady: '树已就绪',
    treeMissing: '树缺失',
    docStatusReady: '已就绪',
    docStatusProcessing: '处理中…',
    docStatusFailed: '处理失败',
    reindexDocument: '重新索引',
    modelSettings: '大模型配置',
    modelNotConfigured: '未配置模型',
    modelNotConfiguredHint: '请先在设置里配置模型 Provider，然后再开始聊天。',
    providerConfig: 'Provider 配置',
    settingsSections: '设置目录',
    generalNav: '通用',
    generalNavHint: '界面语言与基础设置',
    interfaceLanguage: '界面语言',
    interfaceLanguageHint: '应用界面所使用的语言。',
    languageNameEnglish: '英语',
    languageNameChinese: '中文',
    chatProvidersNav: '聊天 Provider',
    localAgents: '本地 Agent',
    localAgentsNote: '使用本机已安装的 Codex 或 Claude Code(走你的订阅,免 API key)。默认优先 Codex。',
    localAgentInstalled: '已安装',
    localAgentNotInstalled: '未安装',
    localAgentInstall: '安装',
    localAgentRecheck: '重新检测',
    localAgentChecking: '检测中…',
    localAgentPreferred: '首选本地 Agent(作为首次启动默认)',
    localAgentNone: '正在检测本地 Agent…',
    localAgentTest: '测试连接',
    localAgentTesting: '测试中…',
    chatProvidersNavHint: '连接配置与聊天模型',
    translationNav: '翻译',
    translationNavHint: '翻译 Provider 与兜底',
    chatProvidersListNote: '选择要编辑的 Provider 连接。',
    providerName: '配置名称',
    providerType: 'Provider 类型',
    baseUrl: 'Base URL',
    modelName: '模型',
    modelId: '模型 ID',
    modelNickname: '显示名称',
    modelCapabilities: '能力',
    contextWindow: '上下文窗口',
    contextWindowAuto: '自动',
    contextWindowHint: '上下文窗口(token 数)。留空则自动探测(优先用 provider 的 /models,其次内置目录);填入数值可强制使用模型的真实窗口。',
    defaultChatModel: '默认聊天模型',
    defaultShort: '默认',
    chatModelsSection: '聊天模型',
    chatModelsNote: '在这个 Provider 下添加一个或多个模型。右下角聊天下拉会从这些已启用模型中选择。',
    modelsForProvider: '此 Provider 下的模型',
    availableModels: '可用模型',
    modelsForProviderNote: '从当前 Provider 拉取模型列表，再启用要用于聊天的模型。这些模型共用上面配置的 Base URL 和 API Key。',
    addModel: '添加模型',
    addManually: '手动添加',
    fetchModels: '拉取模型',
    fetchingModels: '正在拉取模型...',
    fetchModelsFailed: '拉取模型失败',
    fetchModelsImported: '已导入 {count} 个模型',
    fetchModelsNoNewModels: '没有发现新的模型',
    newProvider: '新 Provider',
    unsavedProvider: '未保存 Provider',
    oneModel: '1 个模型',
    modelsCount: '个模型',
    defaultProviderShort: '默认',
    setDefaultProvider: '设为默认 Provider',
    remove: '移除',
    deleteProviderConfirm: '删除“{name}”？这会移除它的模型和本地保存的 API Key。',
    apiKey: 'API Key',
    apiKeySaved: 'API Key 已保存到本地',
    apiKeyNotSaved: 'API Key 未保存',
    apiKeyPlaceholder: '留空则保留已保存密钥',
    enabled: '启用',
    defaultProvider: '默认 Provider',
    save: '保存',
    testConnection: '测试连接',
    copy: '复制',
    copied: '已复制',
    close: '关闭',
    settingsSaved: '设置已保存',
    settingsSaveFailed: '保存失败',
    providerTestSucceeded: '连接成功',
    providerTestFailed: '连接失败',
    translationProviderMode: '翻译 Provider',
    translationProviderGoogleWeb: 'Google Web（免费，实验性）',
    translationProviderMicrosoft: 'Microsoft / Bing',
    translationProviderLlm: '大模型 Provider',
    translationProviderPlaceholder: '本地占位',
    translationProviderGoogleWebNote: '无需 API Key。它使用 Google 翻译网页结果，可能被限流，也可能因页面变化失效。',
    translationProviderMicrosoftNote: '文本翻译使用已配置的 Azure Translator REST API；PDF 翻译使用 PDFMathTranslate-next 的 Bing Web 免密兜底引擎。',
    translationProviderLlmNote: '大模型翻译会使用下方配置的模型 Provider。',
    translationProviderPlaceholderNote: '只返回本地占位文本，不会发送到网络服务。',
    translationProviderSection: '翻译 Provider',
    chatModelProviderSection: '聊天模型 Provider',
    chatModelProviderNote: '这个 Provider 用于 Ask/chat；当上方翻译模式选择“大模型 Provider”时，也会复用这里的配置。',
    testChatModel: '测试聊天模型',
    translationFallback: '启用兜底翻译链路',
    translationFallbackNote: '当当前 Provider 失败时，Lumenfolio 会继续尝试 Microsoft、已配置的大模型，最后再回退到本地占位结果。',
    translationErrorHint: '可以重试，或在设置里切换翻译 Provider，也可以选择更短的内容。',
    microsoftEndpoint: 'Microsoft Endpoint',
    microsoftRegion: 'Microsoft Region',
    freeTranslationProvider: '正在测试翻译 Provider...',
    evidence: '证据链',
    evidenceCollapse: '收起',
    agentActivity: 'Agent 活动',
    retrievalTrace: 'Agent 活动',
    traceRun: '运行:',
    traceIntent: '意图:',
    traceFinalize: '判定:',
    traceTreeNodes: '命中章节',
    traceCandidates: '候选证据',
    traceSteps: 'Agent 步骤',
    traceSessionSummary: '会话摘要',
    traceCompact: '压缩摘要',
    traceCompactRetained: '保留轮次:',
    traceCompactSummarized: '压缩轮次:',
    traceCompactTrigger: '触发器:',
    traceStepCompleted: '已执行',
    traceStepSkipped: '已跳过',
    traceStatusAnswerable: '可以回答',
    traceStatusInsufficient: '需要确认',
    traceStatusBestEffort: '尽力作答',
    traceStatusSearching: '检索中',
    traceStatusUnknown: '已检查',
    traceAttemptSummary: '第 {attempt}/{max} 步',
  },
}
