diff --git a/package-lock.json b/package-lock.json index 1c6f4b57f..ecb84a6b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12842,7 +12842,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } diff --git a/packages/cli/src/i18n/index.ts b/packages/cli/src/i18n/index.ts index b22c8c9b2..5fe71a8bc 100644 --- a/packages/cli/src/i18n/index.ts +++ b/packages/cli/src/i18n/index.ts @@ -57,15 +57,18 @@ const getLocalePath = ( export function detectSystemLanguage(): SupportedLanguage { const envLang = process.env['QWEN_CODE_LANG'] || process.env['LANG']; if (envLang) { + // Normalize POSIX locales (e.g. zh_TW.UTF-8 → zh-tw) before matching + const normalized = envLang.replace(/_/g, '-').toLowerCase(); for (const lang of SUPPORTED_LANGUAGES) { - if (envLang.startsWith(lang.code)) return lang.code; + if (normalized.startsWith(lang.code.toLowerCase())) return lang.code; } } try { const locale = Intl.DateTimeFormat().resolvedOptions().locale; + const normalized = locale.replace(/_/g, '-').toLowerCase(); for (const lang of SUPPORTED_LANGUAGES) { - if (locale.startsWith(lang.code)) return lang.code; + if (normalized.startsWith(lang.code.toLowerCase())) return lang.code; } } catch { // Fallback to default diff --git a/packages/cli/src/i18n/languages.ts b/packages/cli/src/i18n/languages.ts index d840f26ea..0f72c7c96 100644 --- a/packages/cli/src/i18n/languages.ts +++ b/packages/cli/src/i18n/languages.ts @@ -7,6 +7,7 @@ export type SupportedLanguage = | 'en' | 'zh' + | 'zh-TW' | 'ru' | 'de' | 'ja' @@ -32,6 +33,12 @@ export const SUPPORTED_LANGUAGES: readonly LanguageDefinition[] = [ fullName: 'English', nativeName: 'English', }, + { + code: 'zh-TW', + id: 'zh-TW', + fullName: 'Traditional Chinese', + nativeName: '繁體中文', + }, { code: 'zh', id: 'zh-CN', @@ -75,7 +82,8 @@ export const SUPPORTED_LANGUAGES: readonly LanguageDefinition[] = [ * Used for LLM output language instructions. */ export function getLanguageNameFromLocale(locale: SupportedLanguage): string { - const lang = SUPPORTED_LANGUAGES.find((l) => l.code === locale); + const lower = locale.toLowerCase(); + const lang = SUPPORTED_LANGUAGES.find((l) => l.code.toLowerCase() === lower); return lang?.fullName || 'English'; } diff --git a/packages/cli/src/i18n/locales/zh-TW.js b/packages/cli/src/i18n/locales/zh-TW.js new file mode 100644 index 000000000..9460ba71d --- /dev/null +++ b/packages/cli/src/i18n/locales/zh-TW.js @@ -0,0 +1,1676 @@ +/** + * @license + * Copyright 2025 Qwen team + * SPDX-License-Identifier: Apache-2.0 + */ + +// Traditional Chinese (zh-TW) translations for Qwen Code CLI +// Auto-generated: structure from en.js, values from zh-TW (manual) or opencc(zh.js s2t) + +export default { + '↑ to manage attachments': '↑ 管理附件', + '← → select, Delete to remove, ↓ to exit': '← → 選擇,Delete 刪除,↓ 退出', + 'Attachments: ': '附件:', + 'Basics:': '基礎功能:', + 'Add context': '添加上下文', + 'Use {{symbol}} to specify files for context (e.g., {{example}}) to target specific files or folders.': + '使用 {{symbol}} 指定文件作爲上下文(例如,{{example}}),用於定位特定文件或文件夾', + '@': '@', + '@src/myFile.ts': '@src/myFile.ts', + 'Shell mode': 'Shell 模式', + 'YOLO mode': 'YOLO 模式', + 'plan mode': '規劃模式', + 'auto-accept edits': '自動接受編輯', + 'Accepting edits': '接受編輯', + '(shift + tab to cycle)': '(shift + tab 切換)', + '(tab to cycle)': '(按 tab 切換)', + 'Execute shell commands via {{symbol}} (e.g., {{example1}}) or use natural language (e.g., {{example2}}).': + '通過 {{symbol}} 執行 shell 命令(例如,{{example1}})或使用自然語言(例如,{{example2}})', + '!': '!', + '!npm run start': '!npm run start', + 'start server': 'start server', + 'Commands:': '命令:', + 'shell command': 'shell 命令', + 'Model Context Protocol command (from external servers)': + '模型上下文協議命令(來自外部服務器)', + 'Keyboard Shortcuts:': '鍵盤快捷鍵:', + 'Toggle this help display': '切換此幫助顯示', + 'Toggle shell mode': '切換命令行模式', + 'Open command menu': '打開命令菜單', + 'Add file context': '添加文件上下文', + 'Accept suggestion / Autocomplete': '接受建議 / 自動補全', + 'Reverse search history': '反向搜索歷史', + 'Press ? again to close': '再次按 ? 關閉', + 'for shell mode': '命令行模式', + 'for commands': '命令菜單', + 'for file paths': '文件路徑', + 'to clear input': '清空輸入', + 'to cycle approvals': '切換審批模式', + 'to quit': '退出', + 'for newline': '換行', + 'to clear screen': '清屏', + 'to search history': '搜索歷史', + 'to paste images': '粘貼圖片', + 'for external editor': '外部編輯器', + 'to toggle compact mode': '切換緊湊模式', + 'Jump through words in the input': '在輸入中按單詞跳轉', + 'Close dialogs, cancel requests, or quit application': + '關閉對話框、取消請求或退出應用程序', + 'New line': '換行', + 'New line (Alt+Enter works for certain linux distros)': + '換行(某些 Linux 發行版支持 Alt+Enter)', + 'Clear the screen': '清屏', + 'Open input in external editor': '在外部編輯器中打開輸入', + 'Send message': '發送消息', + 'Initializing...': '正在初始化...', + 'Connecting to MCP servers... ({{connected}}/{{total}})': + '正在連接到 MCP 服務器... ({{connected}}/{{total}})', + 'Type your message or @path/to/file': '輸入您的消息或 @ 文件路徑', + '? for shortcuts': '按 ? 查看快捷鍵', + "Press 'i' for INSERT mode and 'Esc' for NORMAL mode.": + "按 'i' 進入插入模式,按 'Esc' 進入普通模式", + 'Cancel operation / Clear input (double press)': + '取消操作 / 清空輸入(雙擊)', + 'Cycle approval modes': '循環切換審批模式', + 'Cycle through your prompt history': '循環瀏覽提示歷史', + 'For a full list of shortcuts, see {{docPath}}': + '完整快捷鍵列表,請參閱 {{docPath}}', + 'docs/keyboard-shortcuts.md': 'docs/keyboard-shortcuts.md', + 'for help on Qwen Code': '獲取 Qwen Code 幫助', + 'show version info': '顯示版本信息', + 'submit a bug report': '提交錯誤報告', + 'About Qwen Code': '關於 Qwen Code', + Status: '狀態', + 'Qwen Code': 'Qwen Code', + Runtime: '運行環境', + OS: '操作系統', + Auth: '認證', + 'CLI Version': 'CLI 版本', + 'Git Commit': 'Git 提交', + Model: '模型', + 'Fast Model': '快速模型', + Sandbox: '沙箱', + 'OS Platform': '操作系統平臺', + 'OS Arch': '操作系統架構', + 'OS Release': '操作系統版本', + 'Node.js Version': 'Node.js 版本', + 'NPM Version': 'NPM 版本', + 'Session ID': '會話 ID', + 'Auth Method': '認證方式', + 'Base URL': '基礎 URL', + Proxy: '代理', + 'Memory Usage': '內存使用', + 'IDE Client': 'IDE 客戶端', + 'Analyzes the project and creates a tailored QWEN.md file.': + '分析項目並創建定製的 QWEN.md 文件', + 'List available Qwen Code tools. Usage: /tools [desc]': + '列出可用的 Qwen Code 工具。用法:/tools [desc]', + 'List available skills.': '列出可用技能。', + 'Available Qwen Code CLI tools:': '可用的 Qwen Code CLI 工具:', + 'No tools available': '沒有可用工具', + 'View or change the approval mode for tool usage': + '查看或更改工具使用的審批模式', + 'Invalid approval mode "{{arg}}". Valid modes: {{modes}}': + '無效的審批模式 "{{arg}}"。有效模式:{{modes}}', + 'Approval mode set to "{{mode}}"': '審批模式已設置爲 "{{mode}}"', + 'View or change the language setting': '查看或更改語言設置', + 'change the theme': '更改主題', + 'Select Theme': '選擇主題', + Preview: '預覽', + '(Use Enter to select, Tab to configure scope)': + '(使用 Enter 選擇,Tab 配置作用域)', + '(Use Enter to apply scope, Tab to go back)': + '(使用 Enter 應用作用域,Tab 返回)', + 'Theme configuration unavailable due to NO_COLOR env variable.': + '由於 NO_COLOR 環境變量,主題配置不可用。', + 'Theme "{{themeName}}" not found.': '未找到主題 "{{themeName}}"。', + 'Theme "{{themeName}}" not found in selected scope.': + '在所選作用域中未找到主題 "{{themeName}}"。', + 'Clear conversation history and free up context': '清除對話歷史並釋放上下文', + 'Compresses the context by replacing it with a summary.': + '通過摘要替換來壓縮上下文', + 'open full Qwen Code documentation in your browser': + '在瀏覽器中打開完整的 Qwen Code 文檔', + 'Configuration not available.': '配置不可用', + 'change the auth method': '更改認證方法', + 'Configure authentication information for login': '配置登錄認證信息', + 'Copy the last result or code snippet to clipboard': + '將最後的結果或代碼片段複製到剪貼板', + 'Manage subagents for specialized task delegation.': + '管理用於專門任務委派的子智能體', + 'Manage existing subagents (view, edit, delete).': + '管理現有子智能體(查看、編輯、刪除)', + 'Create a new subagent with guided setup.': '通過引導式設置創建新的子智能體', + Agents: '智能體', + 'Choose Action': '選擇操作', + 'Edit {{name}}': '編輯 {{name}}', + 'Edit Tools: {{name}}': '編輯工具: {{name}}', + 'Edit Color: {{name}}': '編輯顏色: {{name}}', + 'Delete {{name}}': '刪除 {{name}}', + 'Unknown Step': '未知步驟', + 'Esc to close': '按 Esc 關閉', + 'Enter to select, ↑↓ to navigate, Esc to close': + 'Enter 選擇,↑↓ 導航,Esc 關閉', + 'Esc to go back': '按 Esc 返回', + 'Enter to confirm, Esc to cancel': 'Enter 確認,Esc 取消', + 'Enter to select, ↑↓ to navigate, Esc to go back': + 'Enter 選擇,↑↓ 導航,Esc 返回', + 'Enter to submit, Esc to go back': 'Enter 提交,Esc 返回', + 'Invalid step: {{step}}': '無效步驟: {{step}}', + 'No subagents found.': '未找到子智能體。', + "Use '/agents create' to create your first subagent.": + "使用 '/agents create' 創建您的第一個子智能體。", + '(built-in)': '(內置)', + '(overridden by project level agent)': '(已被項目級智能體覆蓋)', + 'Project Level ({{path}})': '項目級 ({{path}})', + 'User Level ({{path}})': '用戶級 ({{path}})', + 'Built-in Agents': '內置智能體', + 'Extension Agents': '擴展智能體', + 'Using: {{count}} agents': '使用中: {{count}} 個智能體', + 'View Agent': '查看智能體', + 'Edit Agent': '編輯智能體', + 'Delete Agent': '刪除智能體', + Back: '返回', + 'No agent selected': '未選擇智能體', + 'File Path: ': '文件路徑: ', + 'Tools: ': '工具: ', + 'Color: ': '顏色: ', + 'Description:': '描述:', + 'System Prompt:': '系統提示:', + 'Open in editor': '在編輯器中打開', + 'Edit tools': '編輯工具', + 'Edit color': '編輯顏色', + '❌ Error:': '❌ 錯誤:', + 'Are you sure you want to delete agent "{{name}}"?': + '您確定要刪除智能體 "{{name}}" 嗎?', + 'Project Level (.qwen/agents/)': '項目級 (.qwen/agents/)', + 'User Level (~/.qwen/agents/)': '用戶級 (~/.qwen/agents/)', + '✅ Subagent Created Successfully!': '✅ 子智能體創建成功!', + 'Subagent "{{name}}" has been saved to {{level}} level.': + '子智能體 "{{name}}" 已保存到 {{level}} 級別。', + 'Name: ': '名稱: ', + 'Location: ': '位置: ', + '❌ Error saving subagent:': '❌ 保存子智能體時出錯:', + 'Warnings:': '警告:', + 'Name "{{name}}" already exists at {{level}} level - will overwrite existing subagent': + '名稱 "{{name}}" 在 {{level}} 級別已存在 - 將覆蓋現有子智能體', + 'Name "{{name}}" exists at user level - project level will take precedence': + '名稱 "{{name}}" 在用戶級別存在 - 項目級別將優先', + 'Name "{{name}}" exists at project level - existing subagent will take precedence': + '名稱 "{{name}}" 在項目級別存在 - 現有子智能體將優先', + 'Description is over {{length}} characters': '描述超過 {{length}} 個字符', + 'System prompt is over {{length}} characters': + '系統提示超過 {{length}} 個字符', + 'Step {{n}}: Choose Location': '步驟 {{n}}: 選擇位置', + 'Step {{n}}: Choose Generation Method': '步驟 {{n}}: 選擇生成方式', + 'Generate with Qwen Code (Recommended)': '使用 Qwen Code 生成(推薦)', + 'Manual Creation': '手動創建', + 'Describe what this subagent should do and when it should be used. (Be comprehensive for best results)': + '描述此子智能體應該做什麼以及何時使用它。(爲了獲得最佳效果,請全面描述)', + 'e.g., Expert code reviewer that reviews code based on best practices...': + '例如:專業的代碼審查員,根據最佳實踐審查代碼...', + 'Generating subagent configuration...': '正在生成子智能體配置...', + 'Failed to generate subagent: {{error}}': '生成子智能體失敗: {{error}}', + 'Step {{n}}: Describe Your Subagent': '步驟 {{n}}: 描述您的子智能體', + 'Step {{n}}: Enter Subagent Name': '步驟 {{n}}: 輸入子智能體名稱', + 'Step {{n}}: Enter System Prompt': '步驟 {{n}}: 輸入系統提示', + 'Step {{n}}: Enter Description': '步驟 {{n}}: 輸入描述', + 'Step {{n}}: Select Tools': '步驟 {{n}}: 選擇工具', + 'All Tools (Default)': '所有工具(默認)', + 'All Tools': '所有工具', + 'Read-only Tools': '只讀工具', + 'Read & Edit Tools': '讀取和編輯工具', + 'Read & Edit & Execution Tools': '讀取、編輯和執行工具', + 'All tools selected, including MCP tools': '已選擇所有工具,包括 MCP 工具', + 'Selected tools:': '已選擇的工具:', + 'Read-only tools:': '只讀工具:', + 'Edit tools:': '編輯工具:', + 'Execution tools:': '執行工具:', + 'Step {{n}}: Choose Background Color': '步驟 {{n}}: 選擇背景顏色', + 'Step {{n}}: Confirm and Save': '步驟 {{n}}: 確認並保存', + 'Esc to cancel': '按 Esc 取消', + 'Press Enter to save, e to save and edit, Esc to go back': + '按 Enter 保存,e 保存並編輯,Esc 返回', + 'Press Enter to continue, {{navigation}}Esc to {{action}}': + '按 Enter 繼續,{{navigation}}Esc {{action}}', + cancel: '取消', + 'go back': '返回', + '↑↓ to navigate, ': '↑↓ 導航,', + 'Enter a clear, unique name for this subagent.': + '爲此子智能體輸入一個清晰、唯一的名稱。', + 'e.g., Code Reviewer': '例如:代碼審查員', + 'Name cannot be empty.': '名稱不能爲空。', + "Write the system prompt that defines this subagent's behavior. Be comprehensive for best results.": + '編寫定義此子智能體行爲的系統提示。爲了獲得最佳效果,請全面描述。', + 'e.g., You are an expert code reviewer...': + '例如:您是一位專業的代碼審查員...', + 'System prompt cannot be empty.': '系統提示不能爲空。', + 'Describe when and how this subagent should be used.': + '描述何時以及如何使用此子智能體。', + 'e.g., Reviews code for best practices and potential bugs.': + '例如:審查代碼以查找最佳實踐和潛在錯誤。', + 'Description cannot be empty.': '描述不能爲空。', + 'Failed to launch editor: {{error}}': '啓動編輯器失敗: {{error}}', + 'Failed to save and edit subagent: {{error}}': + '保存並編輯子智能體失敗: {{error}}', + 'Manage Extensions': '管理擴展', + 'Extension Details': '擴展詳情', + 'View Extension': '查看擴展', + 'Update Extension': '更新擴展', + 'Disable Extension': '禁用擴展', + 'Enable Extension': '啓用擴展', + 'Uninstall Extension': '卸載擴展', + 'Select Scope': '選擇作用域', + 'User Scope': '用戶作用域', + 'Workspace Scope': '工作區作用域', + 'No extensions found.': '未找到擴展。', + Active: '已啓用', + Disabled: '已禁用', + 'Update available': '有可用更新', + 'Up to date': '已是最新', + 'Checking...': '檢查中...', + 'Updating...': '更新中...', + Unknown: '未知', + Error: '錯誤', + 'Version:': '版本:', + 'Status:': '狀態:', + 'Are you sure you want to uninstall extension "{{name}}"?': + '確定要卸載擴展 "{{name}}" 嗎?', + 'This action cannot be undone.': '此操作無法撤銷。', + 'Extension "{{name}}" disabled successfully.': '擴展 "{{name}}" 禁用成功。', + 'Extension "{{name}}" enabled successfully.': '擴展 "{{name}}" 啓用成功。', + 'Extension "{{name}}" updated successfully.': '擴展 "{{name}}" 更新成功。', + 'Failed to update extension "{{name}}": {{error}}': + '更新擴展 "{{name}}" 失敗:{{error}}', + 'Select the scope for this action:': '選擇此操作的作用域:', + 'User - Applies to all projects': '用戶 - 應用於所有項目', + 'Workspace - Applies to current project only': '工作區 - 僅應用於當前項目', + 'Name:': '名稱:', + 'MCP Servers:': 'MCP 服務器:', + 'Settings:': '設置:', + active: '已啓用', + disabled: '已禁用', + 'View Details': '查看詳情', + 'Update failed:': '更新失敗:', + 'Updating {{name}}...': '正在更新 {{name}}...', + 'Update complete!': '更新完成!', + 'User (global)': '用戶(全局)', + 'Workspace (project-specific)': '工作區(項目特定)', + 'Disable "{{name}}" - Select Scope': '禁用 "{{name}}" - 選擇作用域', + 'Enable "{{name}}" - Select Scope': '啓用 "{{name}}" - 選擇作用域', + 'No extension selected': '未選擇擴展', + 'Press Y/Enter to confirm, N/Esc to cancel': '按 Y/Enter 確認,N/Esc 取消', + 'Y/Enter to confirm, N/Esc to cancel': 'Y/Enter 確認,N/Esc 取消', + '{{count}} extensions installed': '已安裝 {{count}} 個擴展', + "Use '/extensions install' to install your first extension.": + "使用 '/extensions install' 安裝您的第一個擴展。", + 'up to date': '已是最新', + 'update available': '有可用更新', + 'checking...': '檢查中...', + 'not updatable': '不可更新', + error: '錯誤', + 'View and edit Qwen Code settings': '查看和編輯 Qwen Code 設置', + Settings: '設置', + 'To see changes, Qwen Code must be restarted. Press r to exit and apply changes now.': + '要查看更改,必須重啓 Qwen Code。按 r 退出並立即應用更改。', + 'The command "/{{command}}" is not supported in non-interactive mode.': + '不支持在非交互模式下使用命令 "/{{command}}"。', + 'Vim Mode': 'Vim 模式', + 'Disable Auto Update': '禁用自動更新', + 'Attribution: commit': '署名:提交', + 'Terminal Bell Notification': '終端響鈴通知', + 'Enable Usage Statistics': '啓用使用統計', + Theme: '主題', + 'Preferred Editor': '首選編輯器', + 'Auto-connect to IDE': '自動連接到 IDE', + 'Enable Prompt Completion': '啓用提示補全', + 'Debug Keystroke Logging': '調試按鍵記錄', + 'Language: UI': '語言:界面', + 'Language: Model': '語言:模型', + 'Output Format': '輸出格式', + 'Hide Window Title': '隱藏窗口標題', + 'Show Status in Title': '在標題中顯示狀態', + 'Hide Tips': '隱藏提示', + 'Show Line Numbers in Code': '在代碼中顯示行號', + 'Show Citations': '顯示引用', + 'Custom Witty Phrases': '自定義詼諧短語', + 'Show Welcome Back Dialog': '顯示歡迎回來對話框', + 'Enable User Feedback': '啓用用戶反饋', + 'How is Qwen doing this session? (optional)': 'Qwen 這次表現如何?(可選)', + Bad: '不滿意', + Fine: '還行', + Good: '滿意', + Dismiss: '忽略', + 'Not Sure Yet': '暫不評價', + 'Any other key': '任意其他鍵', + 'Disable Loading Phrases': '禁用加載短語', + 'Screen Reader Mode': '屏幕閱讀器模式', + 'IDE Mode': 'IDE 模式', + 'Max Session Turns': '最大會話輪次', + 'Skip Next Speaker Check': '跳過下一個說話者檢查', + 'Skip Loop Detection': '跳過循環檢測', + 'Skip Startup Context': '跳過啓動上下文', + 'Enable OpenAI Logging': '啓用 OpenAI 日誌', + 'OpenAI Logging Directory': 'OpenAI 日誌目錄', + Timeout: '超時', + 'Max Retries': '最大重試次數', + 'Disable Cache Control': '禁用緩存控制', + 'Memory Discovery Max Dirs': '內存發現最大目錄數', + 'Load Memory From Include Directories': '從包含目錄加載內存', + 'Respect .gitignore': '遵守 .gitignore', + 'Respect .qwenignore': '遵守 .qwenignore', + 'Enable Recursive File Search': '啓用遞歸文件搜索', + 'Disable Fuzzy Search': '禁用模糊搜索', + 'Interactive Shell (PTY)': '交互式 Shell (PTY)', + 'Show Color': '顯示顏色', + 'Auto Accept': '自動接受', + 'Use Ripgrep': '使用 Ripgrep', + 'Use Builtin Ripgrep': '使用內置 Ripgrep', + 'Enable Tool Output Truncation': '啓用工具輸出截斷', + 'Tool Output Truncation Threshold': '工具輸出截斷閾值', + 'Tool Output Truncation Lines': '工具輸出截斷行數', + 'Folder Trust': '文件夾信任', + 'Vision Model Preview': '視覺模型預覽', + 'Tool Schema Compliance': '工具 Schema 兼容性', + 'Auto (detect from system)': '自動(從系統檢測)', + 'Auto (detect terminal theme)': '自動(檢測終端主題)', + Auto: '自動', + Text: '文本', + JSON: 'JSON', + Plan: '規劃', + Default: '默認', + 'Auto Edit': '自動編輯', + YOLO: 'YOLO', + 'toggle vim mode on/off': '切換 vim 模式開關', + 'check session stats. Usage: /stats [model|tools]': + '檢查會話統計信息。用法:/stats [model|tools]', + 'Show model-specific usage statistics.': '顯示模型相關的使用統計信息', + 'Show tool-specific usage statistics.': '顯示工具相關的使用統計信息', + 'exit the cli': '退出命令行界面', + 'Open MCP management dialog, or authenticate with OAuth-enabled servers': + '打開 MCP 管理對話框,或在支持 OAuth 的服務器上進行身份驗證', + 'List configured MCP servers and tools, or authenticate with OAuth-enabled servers': + '列出已配置的 MCP 服務器和工具,或使用支持 OAuth 的服務器進行身份驗證', + 'Manage workspace directories': '管理工作區目錄', + 'Add directories to the workspace. Use comma to separate multiple paths': + '將目錄添加到工作區。使用逗號分隔多個路徑', + 'Show all directories in the workspace': '顯示工作區中的所有目錄', + 'set external editor preference': '設置外部編輯器首選項', + 'Select Editor': '選擇編輯器', + 'Editor Preference': '編輯器首選項', + 'These editors are currently supported. Please note that some editors cannot be used in sandbox mode.': + '當前支持以下編輯器。請注意,某些編輯器無法在沙箱模式下使用。', + 'Your preferred editor is:': '您的首選編輯器是:', + 'Manage extensions': '管理擴展', + 'Manage installed extensions': '管理已安裝的擴展', + 'List active extensions': '列出活動擴展', + 'Update extensions. Usage: update |--all': + '更新擴展。用法:update |--all', + 'Disable an extension': '禁用擴展', + 'Enable an extension': '啓用擴展', + 'Install an extension from a git repo or local path': + '從 Git 倉庫或本地路徑安裝擴展', + 'Uninstall an extension': '卸載擴展', + 'No extensions installed.': '未安裝擴展。', + 'Usage: /extensions update |--all': + '用法:/extensions update <擴展名>|--all', + 'Extension "{{name}}" not found.': '未找到擴展 "{{name}}"。', + 'No extensions to update.': '沒有可更新的擴展。', + 'Usage: /extensions install ': '用法:/extensions install <來源>', + 'Installing extension from "{{source}}"...': + '正在從 "{{source}}" 安裝擴展...', + 'Extension "{{name}}" installed successfully.': '擴展 "{{name}}" 安裝成功。', + 'Failed to install extension from "{{source}}": {{error}}': + '從 "{{source}}" 安裝擴展失敗:{{error}}', + 'Usage: /extensions uninstall ': + '用法:/extensions uninstall <擴展名>', + 'Uninstalling extension "{{name}}"...': '正在卸載擴展 "{{name}}"...', + 'Extension "{{name}}" uninstalled successfully.': + '擴展 "{{name}}" 卸載成功。', + 'Failed to uninstall extension "{{name}}": {{error}}': + '卸載擴展 "{{name}}" 失敗:{{error}}', + 'Usage: /extensions {{command}} [--scope=]': + '用法:/extensions {{command}} <擴展> [--scope=]', + 'Unsupported scope "{{scope}}", should be one of "user" or "workspace"': + '不支持的作用域 "{{scope}}",應爲 "user" 或 "workspace"', + 'Extension "{{name}}" disabled for scope "{{scope}}"': + '擴展 "{{name}}" 已在作用域 "{{scope}}" 中禁用', + 'Extension "{{name}}" enabled for scope "{{scope}}"': + '擴展 "{{name}}" 已在作用域 "{{scope}}" 中啓用', + 'Do you want to continue? [Y/n]: ': '是否繼續?[Y/n]:', + 'Do you want to continue?': '是否繼續?', + 'Installing extension "{{name}}".': '正在安裝擴展 "{{name}}"。', + '**Extensions may introduce unexpected behavior. Ensure you have investigated the extension source and trust the author.**': + '**擴展可能會引入意外行爲。請確保您已調查過擴展源並信任作者。**', + 'This extension will run the following MCP servers:': + '此擴展將運行以下 MCP 服務器:', + local: '本地', + remote: '遠程', + 'This extension will add the following commands: {{commands}}.': + '此擴展將添加以下命令:{{commands}}。', + 'This extension will append info to your QWEN.md context using {{fileName}}': + '此擴展將使用 {{fileName}} 向您的 QWEN.md 上下文追加信息', + 'This extension will exclude the following core tools: {{tools}}': + '此擴展將排除以下核心工具:{{tools}}', + 'This extension will install the following skills:': '此擴展將安裝以下技能:', + 'This extension will install the following subagents:': + '此擴展將安裝以下子智能體:', + 'Installation cancelled for "{{name}}".': '已取消安裝 "{{name}}"。', + 'You are installing an extension from {{originSource}}. Some features may not work perfectly with Qwen Code.': + '您正在安裝來自 {{originSource}} 的擴展。某些功能可能無法完美兼容 Qwen Code。', + '--ref and --auto-update are not applicable for marketplace extensions.': + '--ref 和 --auto-update 不適用於市場擴展。', + 'Extension "{{name}}" installed successfully and enabled.': + '擴展 "{{name}}" 安裝成功並已啓用。', + 'Installs an extension from a git repository URL, local path, or claude marketplace (marketplace-url:plugin-name).': + '從 Git 倉庫 URL、本地路徑或 Claude 市場(marketplace-url:plugin-name)安裝擴展。', + 'The github URL, local path, or marketplace source (marketplace-url:plugin-name) of the extension to install.': + '要安裝的擴展的 GitHub URL、本地路徑或市場源(marketplace-url:plugin-name)。', + 'The git ref to install from.': '要安裝的 Git 引用。', + 'Enable auto-update for this extension.': '爲此擴展啓用自動更新。', + 'Enable pre-release versions for this extension.': '爲此擴展啓用預發佈版本。', + 'Acknowledge the security risks of installing an extension and skip the confirmation prompt.': + '確認安裝擴展的安全風險並跳過確認提示。', + 'The source argument must be provided.': '必須提供來源參數。', + 'Extension "{{name}}" successfully uninstalled.': + '擴展 "{{name}}" 卸載成功。', + 'Uninstalls an extension.': '卸載擴展。', + 'The name or source path of the extension to uninstall.': + '要卸載的擴展的名稱或源路徑。', + 'Please include the name of the extension to uninstall as a positional argument.': + '請將要卸載的擴展名稱作爲位置參數。', + 'Enables an extension.': '啓用擴展。', + 'The name of the extension to enable.': '要啓用的擴展名稱。', + 'The scope to enable the extenison in. If not set, will be enabled in all scopes.': + '啓用擴展的作用域。如果未設置,將在所有作用域中啓用。', + 'Extension "{{name}}" successfully enabled for scope "{{scope}}".': + '擴展 "{{name}}" 已在作用域 "{{scope}}" 中啓用。', + 'Extension "{{name}}" successfully enabled in all scopes.': + '擴展 "{{name}}" 已在所有作用域中啓用。', + 'Invalid scope: {{scope}}. Please use one of {{scopes}}.': + '無效的作用域:{{scope}}。請使用 {{scopes}} 之一。', + 'Disables an extension.': '禁用擴展。', + 'The name of the extension to disable.': '要禁用的擴展名稱。', + 'The scope to disable the extenison in.': '禁用擴展的作用域。', + 'Extension "{{name}}" successfully disabled for scope "{{scope}}".': + '擴展 "{{name}}" 已在作用域 "{{scope}}" 中禁用。', + 'Extension "{{name}}" successfully updated: {{oldVersion}} → {{newVersion}}.': + '擴展 "{{name}}" 更新成功:{{oldVersion}} → {{newVersion}}。', + 'Unable to install extension "{{name}}" due to missing install metadata': + '由於缺少安裝元數據,無法安裝擴展 "{{name}}"', + 'Extension "{{name}}" is already up to date.': + '擴展 "{{name}}" 已是最新版本。', + 'Updates all extensions or a named extension to the latest version.': + '將所有擴展或指定擴展更新到最新版本。', + 'Update all extensions.': '更新所有擴展。', + 'The name of the extension to update.': '要更新的擴展名稱。', + 'Either an extension name or --all must be provided': + '必須提供擴展名稱或 --all', + 'Lists installed extensions.': '列出已安裝的擴展。', + 'Path:': '路徑:', + 'Source:': '來源:', + 'Type:': '類型:', + 'Ref:': '引用:', + 'Release tag:': '發佈標籤:', + 'Enabled (User):': '已啓用(用戶):', + 'Enabled (Workspace):': '已啓用(工作區):', + 'Context files:': '上下文文件:', + 'Skills:': '技能:', + 'Agents:': '智能體:', + 'MCP servers:': 'MCP 服務器:', + 'Link extension failed to install.': '鏈接擴展安裝失敗。', + 'Extension "{{name}}" linked successfully and enabled.': + '擴展 "{{name}}" 鏈接成功並已啓用。', + 'Links an extension from a local path. Updates made to the local path will always be reflected.': + '從本地路徑鏈接擴展。對本地路徑的更新將始終反映。', + 'The name of the extension to link.': '要鏈接的擴展名稱。', + 'Set a specific setting for an extension.': '爲擴展設置特定配置。', + 'Name of the extension to configure.': '要配置的擴展名稱。', + 'The setting to configure (name or env var).': + '要配置的設置(名稱或環境變量)。', + 'The scope to set the setting in.': '設置配置的作用域。', + 'List all settings for an extension.': '列出擴展的所有設置。', + 'Name of the extension.': '擴展名稱。', + 'Extension "{{name}}" has no settings to configure.': + '擴展 "{{name}}" 沒有可配置的設置。', + 'Settings for "{{name}}":': '"{{name}}" 的設置:', + '(workspace)': '(工作區)', + '(user)': '(用戶)', + '[not set]': '[未設置]', + '[value stored in keychain]': '[值存儲在鑰匙串中]', + 'Value:': '值:', + 'Manage extension settings.': '管理擴展設置。', + 'You need to specify a command (set or list).': + '您需要指定命令(set 或 list)。', + 'No plugins available in this marketplace.': '此市場中沒有可用的插件。', + 'Select a plugin to install from marketplace "{{name}}":': + '從市場 "{{name}}" 中選擇要安裝的插件:', + 'Plugin selection cancelled.': '插件選擇已取消。', + 'Select a plugin from "{{name}}"': '從 "{{name}}" 中選擇插件', + 'Use ↑↓ or j/k to navigate, Enter to select, Escape to cancel': + '使用 ↑↓ 或 j/k 導航,回車選擇,Esc 取消', + '{{count}} more above': '上方還有 {{count}} 項', + '{{count}} more below': '下方還有 {{count}} 項', + 'manage IDE integration': '管理 IDE 集成', + 'check status of IDE integration': '檢查 IDE 集成狀態', + 'install required IDE companion for {{ideName}}': + '安裝 {{ideName}} 所需的 IDE 配套工具', + 'enable IDE integration': '啓用 IDE 集成', + 'disable IDE integration': '禁用 IDE 集成', + 'IDE integration is not supported in your current environment. To use this feature, run Qwen Code in one of these supported IDEs: VS Code or VS Code forks.': + '您當前環境不支持 IDE 集成。要使用此功能,請在以下支持的 IDE 之一中運行 Qwen Code:VS Code 或 VS Code 分支版本。', + 'Set up GitHub Actions': '設置 GitHub Actions', + 'Configure terminal keybindings for multiline input (VS Code, Cursor, Windsurf, Trae)': + '配置終端按鍵綁定以支持多行輸入(VS Code、Cursor、Windsurf、Trae)', + 'Please restart your terminal for the changes to take effect.': + '請重啓終端以使更改生效。', + 'Failed to configure terminal: {{error}}': '配置終端失敗:{{error}}', + 'Could not determine {{terminalName}} config path on Windows: APPDATA environment variable is not set.': + '無法確定 {{terminalName}} 在 Windows 上的配置路徑:未設置 APPDATA 環境變量。', + '{{terminalName}} keybindings.json exists but is not a valid JSON array. Please fix the file manually or delete it to allow automatic configuration.': + '{{terminalName}} keybindings.json 存在但不是有效的 JSON 數組。請手動修復文件或刪除它以允許自動配置。', + 'File: {{file}}': '文件:{{file}}', + 'Failed to parse {{terminalName}} keybindings.json. The file contains invalid JSON. Please fix the file manually or delete it to allow automatic configuration.': + '解析 {{terminalName}} keybindings.json 失敗。文件包含無效的 JSON。請手動修復文件或刪除它以允許自動配置。', + 'Error: {{error}}': '錯誤:{{error}}', + 'Shift+Enter binding already exists': 'Shift+Enter 綁定已存在', + 'Ctrl+Enter binding already exists': 'Ctrl+Enter 綁定已存在', + 'Existing keybindings detected. Will not modify to avoid conflicts.': + '檢測到現有按鍵綁定。爲避免衝突,不會修改。', + 'Please check and modify manually if needed: {{file}}': + '如有需要,請手動檢查並修改:{{file}}', + 'Added Shift+Enter and Ctrl+Enter keybindings to {{terminalName}}.': + '已爲 {{terminalName}} 添加 Shift+Enter 和 Ctrl+Enter 按鍵綁定。', + 'Modified: {{file}}': '已修改:{{file}}', + '{{terminalName}} keybindings already configured.': + '{{terminalName}} 按鍵綁定已配置。', + 'Failed to configure {{terminalName}}.': '配置 {{terminalName}} 失敗。', + 'Your terminal is already configured for an optimal experience with multiline input (Shift+Enter and Ctrl+Enter).': + '您的終端已配置爲支持多行輸入(Shift+Enter 和 Ctrl+Enter)的最佳體驗。', + 'Manage Qwen Code hooks': '管理 Qwen Code Hook', + 'List all configured hooks': '列出所有已配置的 Hook', + 'Enable a disabled hook': '啓用已禁用的 Hook', + 'Disable an active hook': '禁用已啓用的 Hook', + Hooks: 'Hook', + 'Loading hooks...': '正在加載 Hook...', + 'Error loading hooks:': '加載 Hook 出錯:', + 'Press Escape to close': '按 Escape 關閉', + 'Press Escape, Ctrl+C, or Ctrl+D to cancel': + '按 Escape、Ctrl+C 或 Ctrl+D 取消', + 'Press Space, Enter, or Escape to dismiss': '按空格、回車或 Escape 關閉', + 'No hook selected': '未選擇 Hook', + 'No hook events found.': '未找到 Hook 事件。', + '{{count}} hook configured': '{{count}} 個 Hook 已配置', + '{{count}} hooks configured': '{{count}} 個 Hook 已配置', + 'This menu is read-only. To add or modify hooks, edit settings.json directly or ask Qwen Code.': + '此菜單爲只讀。要添加或修改 Hook,請直接編輯 settings.json 或詢問 Qwen Code。', + 'Enter to select · Esc to cancel': 'Enter 選擇 · Esc 取消', + 'Exit codes:': '退出碼:', + 'Configured hooks:': '已配置的 Hook:', + 'No hooks configured for this event.': '此事件未配置 Hook。', + 'To add hooks, edit settings.json directly or ask Qwen.': + '要添加 Hook,請直接編輯 settings.json 或詢問 Qwen。', + 'Enter to select · Esc to go back': 'Enter 選擇 · Esc 返回', + 'Hook details': 'Hook 詳情', + 'Event:': '事件:', + 'Extension:': '擴展:', + 'Desc:': '描述:', + 'No hook config selected': '未選擇 Hook 配置', + 'To modify or remove this hook, edit settings.json directly or ask Qwen to help.': + '要修改或刪除此 Hook,請直接編輯 settings.json 或詢問 Qwen。', + 'Hook Configuration - Disabled': 'Hook 配置 - 已禁用', + 'All hooks are currently disabled. You have {{count}} that are not running.': + '所有 Hook 當前已禁用。您有 {{count}} 未運行。', + '{{count}} configured hook': '{{count}} 個已配置的 Hook', + '{{count}} configured hooks': '{{count}} 個已配置的 Hook', + 'When hooks are disabled:': '當 Hook 被禁用時:', + 'No hook commands will execute': '不會執行任何 Hook 命令', + 'StatusLine will not be displayed': '不會顯示狀態欄', + 'Tool operations will proceed without hook validation': + '工具操作將在沒有 Hook 驗證的情況下繼續', + 'To re-enable hooks, remove "disableAllHooks" from settings.json or ask Qwen Code.': + '要重新啓用 Hook,請從 settings.json 中刪除 "disableAllHooks" 或詢問 Qwen Code。', + Project: '項目', + User: '用戶', + System: '系統', + Extension: '擴展', + 'Local Settings': '本地設置', + 'User Settings': '用戶設置', + 'System Settings': '系統設置', + Extensions: '擴展', + 'Session (temporary)': '會話(臨時)', + '✓ Enabled': '✓ 已啓用', + '✗ Disabled': '✗ 已禁用', + 'Before tool execution': '工具執行前', + 'After tool execution': '工具執行後', + 'After tool execution fails': '工具執行失敗後', + 'When notifications are sent': '發送通知時', + 'When the user submits a prompt': '用戶提交提示時', + 'When a new session is started': '新會話開始時', + 'Right before Qwen Code concludes its response': 'Qwen Code 結束響應之前', + 'When a subagent (Agent tool call) is started': + '子智能體(Agent 工具調用)啓動時', + 'Right before a subagent concludes its response': '子智能體結束響應之前', + 'Before conversation compaction': '對話壓縮前', + 'When a session is ending': '會話結束時', + 'When a permission dialog is displayed': '顯示權限對話框時', + 'Input to command is JSON of tool call arguments.': + '命令輸入爲工具調用參數的 JSON。', + 'Input to command is JSON with fields "inputs" (tool call arguments) and "response" (tool call response).': + '命令輸入爲包含 "inputs"(工具調用參數)和 "response"(工具調用響應)字段的 JSON。', + 'Input to command is JSON with tool_name, tool_input, tool_use_id, error, error_type, is_interrupt, and is_timeout.': + '命令輸入爲包含 tool_name、tool_input、tool_use_id、error、error_type、is_interrupt 和 is_timeout 的 JSON。', + 'Input to command is JSON with notification message and type.': + '命令輸入爲包含通知消息和類型的 JSON。', + 'Input to command is JSON with original user prompt text.': + '命令輸入爲包含原始用戶提示文本的 JSON。', + 'Input to command is JSON with session start source.': + '命令輸入爲包含會話啓動來源的 JSON。', + 'Input to command is JSON with session end reason.': + '命令輸入爲包含會話結束原因的 JSON。', + 'Input to command is JSON with agent_id and agent_type.': + '命令輸入爲包含 agent_id 和 agent_type 的 JSON。', + 'Input to command is JSON with agent_id, agent_type, and agent_transcript_path.': + '命令輸入爲包含 agent_id、agent_type 和 agent_transcript_path 的 JSON。', + 'Input to command is JSON with compaction details.': + '命令輸入爲包含壓縮詳情的 JSON。', + 'Input to command is JSON with tool_name, tool_input, and tool_use_id. Output JSON with hookSpecificOutput containing decision to allow or deny.': + '命令輸入爲包含 tool_name、tool_input 和 tool_use_id 的 JSON。輸出包含 hookSpecificOutput 的 JSON,其中包含允許或拒絕的決定。', + 'stdout/stderr not shown': 'stdout/stderr 不顯示', + 'show stderr to model and continue conversation': + '向模型顯示 stderr 並繼續對話', + 'show stderr to user only': '僅向用戶顯示 stderr', + 'stdout shown in transcript mode (ctrl+o)': 'stdout 以轉錄模式顯示 (ctrl+o)', + 'show stderr to model immediately': '立即向模型顯示 stderr', + 'show stderr to user only but continue with tool call': + '僅向用戶顯示 stderr 但繼續工具調用', + 'block processing, erase original prompt, and show stderr to user only': + '阻止處理,擦除原始提示,僅向用戶顯示 stderr', + 'stdout shown to Qwen': '向 Qwen 顯示 stdout', + 'show stderr to user only (blocking errors ignored)': + '僅向用戶顯示 stderr(忽略阻塞錯誤)', + 'command completes successfully': '命令成功完成', + 'stdout shown to subagent': '向子智能體顯示 stdout', + 'show stderr to subagent and continue having it run': + '向子智能體顯示 stderr 並繼續運行', + 'stdout appended as custom compact instructions': + 'stdout 作爲自定義壓縮指令追加', + 'block compaction': '阻止壓縮', + 'show stderr to user only but continue with compaction': + '僅向用戶顯示 stderr 但繼續壓縮', + 'use hook decision if provided': '如果提供則使用 Hook 決定', + 'Config not loaded.': '配置未加載。', + 'Hooks are not enabled. Enable hooks in settings to use this feature.': + 'Hook 未啓用。請在設置中啓用 Hook 以使用此功能。', + 'No hooks configured. Add hooks in your settings.json file.': + '未配置 Hook。請在 settings.json 文件中添加 Hook。', + 'Configured Hooks ({{count}} total)': '已配置的 Hook(共 {{count}} 個)', + 'Export current session message history to a file': + '將當前會話的消息記錄導出到文件', + 'Export session to HTML format': '將會話導出爲 HTML 文件', + 'Export session to JSON format': '將會話導出爲 JSON 文件', + 'Export session to JSONL format (one message per line)': + '將會話導出爲 JSONL 文件(每行一條消息)', + 'Export session to markdown format': '將會話導出爲 Markdown 文件', + 'generate personalized programming insights from your chat history': + '根據你的聊天記錄生成個性化編程洞察', + 'Resume a previous session': '恢復先前會話', + 'Restore a tool call. This will reset the conversation and file history to the state it was in when the tool call was suggested': + '恢復某次工具調用。這將把對話與文件歷史重置到提出該工具調用建議時的狀態', + 'Could not detect terminal type. Supported terminals: VS Code, Cursor, Windsurf, and Trae.': + '無法檢測終端類型。支持的終端:VS Code、Cursor、Windsurf 和 Trae。', + 'Terminal "{{terminal}}" is not supported yet.': + '終端 "{{terminal}}" 尚未支持。', + 'Invalid language. Available: {{options}}': + '無效的語言。可用選項:{{options}}', + 'Language subcommands do not accept additional arguments.': + '語言子命令不接受額外參數', + 'Current UI language: {{lang}}': '當前 UI 語言:{{lang}}', + 'Current LLM output language: {{lang}}': '當前 LLM 輸出語言:{{lang}}', + 'LLM output language not set': '未設置 LLM 輸出語言', + 'Set UI language': '設置 UI 語言', + 'Set LLM output language': '設置 LLM 輸出語言', + 'Usage: /language ui [{{options}}]': '用法:/language ui [{{options}}]', + 'Usage: /language output ': '用法:/language output <語言>', + 'Example: /language output 中文': '示例:/language output 中文', + 'Example: /language output English': '示例:/language output English', + 'Example: /language output 日本語': '示例:/language output 日本語', + 'Example: /language output Português': '示例:/language output Português', + 'UI language changed to {{lang}}': 'UI 語言已更改爲 {{lang}}', + 'LLM output language set to {{lang}}': 'LLM 輸出語言已設置爲 {{lang}}', + 'LLM output language rule file generated at {{path}}': + 'LLM 輸出語言規則文件已生成於 {{path}}', + 'Please restart the application for the changes to take effect.': + '請重啓應用程序以使更改生效。', + 'Failed to generate LLM output language rule file: {{error}}': + '生成 LLM 輸出語言規則文件失敗:{{error}}', + 'Invalid command. Available subcommands:': '無效的命令。可用的子命令:', + 'Available subcommands:': '可用的子命令:', + 'To request additional UI language packs, please open an issue on GitHub.': + '如需請求其他 UI 語言包,請在 GitHub 上提交 issue', + 'Available options:': '可用選項:', + 'Set UI language to {{name}}': '將 UI 語言設置爲 {{name}}', + 'Tool Approval Mode': '工具審批模式', + 'Current approval mode: {{mode}}': '當前審批模式:{{mode}}', + 'Available approval modes:': '可用的審批模式:', + 'Approval mode changed to: {{mode}}': '審批模式已更改爲:{{mode}}', + 'Approval mode changed to: {{mode}} (saved to {{scope}} settings{{location}})': + '審批模式已更改爲:{{mode}}(已保存到{{scope}}設置{{location}})', + 'Usage: /approval-mode [--session|--user|--project]': + '用法:/approval-mode [--session|--user|--project]', + 'Scope subcommands do not accept additional arguments.': + '作用域子命令不接受額外參數', + 'Plan mode - Analyze only, do not modify files or execute commands': + '規劃模式 - 僅分析,不修改文件或執行命令', + 'Default mode - Require approval for file edits or shell commands': + '默認模式 - 需要批准文件編輯或 shell 命令', + 'Auto-edit mode - Automatically approve file edits': + '自動編輯模式 - 自動批准文件編輯', + 'YOLO mode - Automatically approve all tools': 'YOLO 模式 - 自動批准所有工具', + '{{mode}} mode': '{{mode}} 模式', + 'Settings service is not available; unable to persist the approval mode.': + '設置服務不可用;無法持久化審批模式。', + 'Failed to save approval mode: {{error}}': '保存審批模式失敗:{{error}}', + 'Failed to change approval mode: {{error}}': '更改審批模式失敗:{{error}}', + 'Apply to current session only (temporary)': '僅應用於當前會話(臨時)', + 'Persist for this project/workspace': '持久化到此項目/工作區', + 'Persist for this user on this machine': '持久化到此機器上的此用戶', + 'Analyze only, do not modify files or execute commands': + '僅分析,不修改文件或執行命令', + 'Require approval for file edits or shell commands': + '需要批准文件編輯或 shell 命令', + 'Automatically approve file edits': '自動批准文件編輯', + 'Automatically approve all tools': '自動批准所有工具', + 'Workspace approval mode exists and takes priority. User-level change will have no effect.': + '工作區審批模式已存在並具有優先級。用戶級別的更改將無效。', + 'Apply To': '應用於', + 'Workspace Settings': '工作區設置', + 'Commands for interacting with memory.': '用於與記憶交互的命令', + 'Show the current memory contents.': '顯示當前記憶內容', + 'Show project-level memory contents.': '顯示項目級記憶內容', + 'Show global memory contents.': '顯示全局記憶內容', + 'Add content to project-level memory.': '添加內容到項目級記憶', + 'Add content to global memory.': '添加內容到全局記憶', + 'Refresh the memory from the source.': '從源刷新記憶', + 'Usage: /memory add --project ': + '用法:/memory add --project <要記住的文本>', + 'Usage: /memory add --global ': + '用法:/memory add --global <要記住的文本>', + 'Attempting to save to project memory: "{{text}}"': + '正在嘗試保存到項目記憶:"{{text}}"', + 'Attempting to save to global memory: "{{text}}"': + '正在嘗試保存到全局記憶:"{{text}}"', + 'Current memory content from {{count}} file(s):': + '來自 {{count}} 個文件的當前記憶內容:', + 'Memory is currently empty.': '記憶當前爲空', + 'Project memory file not found or is currently empty.': + '項目記憶文件未找到或當前爲空', + 'Global memory file not found or is currently empty.': + '全局記憶文件未找到或當前爲空', + 'Global memory is currently empty.': '全局記憶當前爲空', + 'Global memory content:\n\n---\n{{content}}\n---': + '全局記憶內容:\n\n---\n{{content}}\n---', + 'Project memory content from {{path}}:\n\n---\n{{content}}\n---': + '項目記憶內容來自 {{path}}:\n\n---\n{{content}}\n---', + 'Project memory is currently empty.': '項目記憶當前爲空', + 'Refreshing memory from source files...': '正在從源文件刷新記憶...', + 'Add content to the memory. Use --global for global memory or --project for project memory.': + '添加內容到記憶。使用 --global 表示全局記憶,使用 --project 表示項目記憶', + 'Usage: /memory add [--global|--project] ': + '用法:/memory add [--global|--project] <要記住的文本>', + 'Attempting to save to memory {{scope}}: "{{fact}}"': + '正在嘗試保存到記憶 {{scope}}:"{{fact}}"', + 'Open auto-memory folder': '打開自動記憶文件夾', + 'Auto-memory: {{status}}': '自動記憶:{{status}}', + 'Auto-dream: {{status}} · {{lastDream}} · /dream to run': + '自動整理:{{status}} · {{lastDream}} · /dream 立即運行', + never: '從未', + on: '開', + off: '關', + '✦ dreaming': '✦ 整理中', + 'Remove matching entries from managed auto-memory.': + '從託管自動記憶中刪除匹配的條目。', + 'Usage: /forget ': '用法:/forget <要刪除的記憶文本>', + 'No managed auto-memory entries matched: {{query}}': + '沒有匹配的託管自動記憶條目:{{query}}', + 'Show managed auto-memory status.': '顯示託管自動記憶狀態', + 'Run managed auto-memory extraction for the current session.': + '爲當前會話運行託管自動記憶提煉', + 'Managed auto-memory root: {{root}}': '託管自動記憶根目錄:{{root}}', + 'Managed auto-memory topics:': '託管自動記憶主題:', + 'No extraction cursor found yet.': '尚未找到提煉遊標。', + 'Cursor: session={{sessionId}}, offset={{offset}}, updated={{updatedAt}}': + '遊標:session={{sessionId}},offset={{offset}},updated={{updatedAt}}', + 'No chat client available to extract memory.': + '沒有可用於提煉記憶的聊天客戶端。', + 'Managed auto-memory extraction is already running.': + '託管自動記憶提煉已在運行中。', + 'Managed auto-memory extraction found no new durable memories.': + '託管自動記憶提煉未發現新的持久記憶。', + 'Consolidate managed auto-memory topic files.': '整理託管自動記憶主題文件', + 'Managed auto-memory dream found nothing to improve.': + '託管自動記憶 dream 未發現可改進內容。', + 'Deduplicated entries: {{count}}': '去重條目數:{{count}}', + 'Save a durable memory using the save_memory tool.': + '使用 save_memory 工具保存一條持久記憶', + 'Usage: /remember [--global|--project] ': + '用法:/remember [--global|--project] <要記住的文本>', + 'Authenticate with an OAuth-enabled MCP server': + '使用支持 OAuth 的 MCP 服務器進行認證', + 'List configured MCP servers and tools': '列出已配置的 MCP 服務器和工具', + 'Restarts MCP servers.': '重啓 MCP 服務器', + 'Open MCP management dialog': '打開 MCP 管理對話框', + 'Could not retrieve tool registry.': '無法檢索工具註冊表', + 'No MCP servers configured with OAuth authentication.': + '未配置支持 OAuth 認證的 MCP 服務器', + 'MCP servers with OAuth authentication:': '支持 OAuth 認證的 MCP 服務器:', + 'Use /mcp auth to authenticate.': + '使用 /mcp auth 進行認證', + "MCP server '{{name}}' not found.": "未找到 MCP 服務器 '{{name}}'", + "Successfully authenticated and refreshed tools for '{{name}}'.": + "成功認證並刷新了 '{{name}}' 的工具", + "Failed to authenticate with MCP server '{{name}}': {{error}}": + "認證 MCP 服務器 '{{name}}' 失敗:{{error}}", + "Re-discovering tools from '{{name}}'...": + "正在重新發現 '{{name}}' 的工具...", + "Discovered {{count}} tool(s) from '{{name}}'.": + "從 '{{name}}' 發現了 {{count}} 個工具。", + 'Authentication complete. Returning to server details...': + '認證完成,正在返回服務器詳情...', + 'Authentication successful.': '認證成功。', + 'If the browser does not open, copy and paste this URL into your browser:': + '如果瀏覽器未自動打開,請複製以下 URL 並粘貼到瀏覽器中:', + 'Make sure to copy the COMPLETE URL - it may wrap across multiple lines.': + '⚠️ 請確保複製完整的 URL —— 它可能跨越多行。', + 'Manage MCP servers': '管理 MCP 服務器', + 'Server Detail': '服務器詳情', + 'Disable Server': '禁用服務器', + Tools: '工具', + 'Tool Detail': '工具詳情', + 'MCP Management': 'MCP 管理', + 'Loading...': '加載中...', + 'Unknown step': '未知步驟', + 'Esc to back': 'Esc 返回', + '↑↓ to navigate · Enter to select · Esc to close': + '↑↓ 導航 · Enter 選擇 · Esc 關閉', + '↑↓ to navigate · Enter to select · Esc to back': + '↑↓ 導航 · Enter 選擇 · Esc 返回', + '↑↓ to navigate · Enter to confirm · Esc to back': + '↑↓ 導航 · Enter 確認 · Esc 返回', + 'User Settings (global)': '用戶設置(全局)', + 'Workspace Settings (project-specific)': '工作區設置(項目級)', + 'Disable server:': '禁用服務器:', + 'Select where to add the server to the exclude list:': + '選擇將服務器添加到排除列表的位置:', + 'Press Enter to confirm, Esc to cancel': '按 Enter 確認,Esc 取消', + 'View tools': '查看工具', + Reconnect: '重新連接', + Enable: '啓用', + Disable: '禁用', + Authenticate: '認證', + 'Re-authenticate': '重新認證', + 'Clear Authentication': '清空認證', + 'Server:': '服務器:', + 'Command:': '命令:', + 'Working Directory:': '工作目錄:', + 'Capabilities:': '功能:', + 'No server selected': '未選擇服務器', + prompts: '提示詞', + '(disabled)': '(已禁用)', + 'Error:': '錯誤:', + tool: '工具', + tools: '個工具', + connected: '已連接', + connecting: '連接中', + disconnected: '已斷開', + 'User MCPs': '用戶 MCP', + 'Project MCPs': '項目 MCP', + 'Extension MCPs': '擴展 MCP', + server: '個服務器', + servers: '個服務器', + 'Add MCP servers to your settings to get started.': + '請在設置中添加 MCP 服務器以開始使用。', + 'Run qwen --debug to see error logs': '運行 qwen --debug 查看錯誤日誌', + 'OAuth Authentication': 'OAuth 認證', + 'Press Enter to start authentication, Esc to go back': + '按 Enter 開始認證,Esc 返回', + 'Authenticating... Please complete the login in your browser.': + '認證中... 請在瀏覽器中完成登錄。', + 'Press c to copy the authorization URL to your clipboard.': + '按 c 複製授權 URL 到剪貼板。', + 'Copy request sent to your terminal. If paste is empty, copy the URL above manually.': + '已向終端發送複製請求;若粘貼爲空,請手動複製上方 URL。', + 'Cannot write to terminal — copy the URL above manually.': + '無法寫入終端,請手動複製上方 URL。', + 'Press Enter or Esc to go back': '按 Enter 或 Esc 返回', + 'No tools available for this server.': '此服務器沒有可用工具。', + destructive: '破壞性', + 'read-only': '只讀', + 'open-world': '開放世界', + idempotent: '冪等', + 'Tools for {{name}}': '{{name}} 的工具', + 'Tools for {{serverName}}': '{{serverName}} 的工具', + '{{current}}/{{total}}': '{{current}}/{{total}}', + required: '必填', + Type: '類型', + Enum: '枚舉', + Parameters: '參數', + 'No tool selected': '未選擇工具', + Annotations: '註解', + Title: '標題', + 'Read Only': '只讀', + Destructive: '破壞性', + Idempotent: '冪等', + 'Open World': '開放世界', + Server: '服務器', + '{{count}} invalid tools': '{{count}} 個無效工具', + invalid: '無效', + 'invalid: {{reason}}': '無效:{{reason}}', + 'missing name': '缺少名稱', + 'missing description': '缺少描述', + '(unnamed)': '(未命名)', + 'Warning: This tool cannot be called by the LLM': + '警告:此工具無法被 LLM 調用', + Reason: '原因', + 'Tools must have both name and description to be used by the LLM.': + '工具必須同時具有名稱和描述才能被 LLM 使用。', + 'Manage conversation history.': '管理對話歷史', + 'List saved conversation checkpoints': '列出已保存的對話檢查點', + 'No saved conversation checkpoints found.': '未找到已保存的對話檢查點', + 'List of saved conversations:': '已保存的對話列表:', + 'Note: Newest last, oldest first': '注意:最新的在最後,最舊的在最前', + 'Save the current conversation as a checkpoint. Usage: /chat save ': + '將當前對話保存爲檢查點。用法:/chat save ', + 'Missing tag. Usage: /chat save ': '缺少標籤。用法:/chat save ', + 'Delete a conversation checkpoint. Usage: /chat delete ': + '刪除對話檢查點。用法:/chat delete ', + 'Missing tag. Usage: /chat delete ': + '缺少標籤。用法:/chat delete ', + "Conversation checkpoint '{{tag}}' has been deleted.": + "對話檢查點 '{{tag}}' 已刪除", + "Error: No checkpoint found with tag '{{tag}}'.": + "錯誤:未找到標籤爲 '{{tag}}' 的檢查點", + 'Resume a conversation from a checkpoint. Usage: /chat resume ': + '從檢查點恢復對話。用法:/chat resume ', + 'Missing tag. Usage: /chat resume ': + '缺少標籤。用法:/chat resume ', + 'No saved checkpoint found with tag: {{tag}}.': + '未找到標籤爲 {{tag}} 的已保存檢查點', + 'A checkpoint with the tag {{tag}} already exists. Do you want to overwrite it?': + '標籤爲 {{tag}} 的檢查點已存在。您要覆蓋它嗎?', + 'No chat client available to save conversation.': + '沒有可用的聊天客戶端來保存對話', + 'Conversation checkpoint saved with tag: {{tag}}.': + '對話檢查點已保存,標籤:{{tag}}', + 'No conversation found to save.': '未找到要保存的對話', + 'No chat client available to share conversation.': + '沒有可用的聊天客戶端來分享對話', + 'Invalid file format. Only .md and .json are supported.': + '無效的文件格式。僅支持 .md 和 .json 文件', + 'Error sharing conversation: {{error}}': '分享對話時出錯:{{error}}', + 'Conversation shared to {{filePath}}': '對話已分享到 {{filePath}}', + 'No conversation found to share.': '未找到要分享的對話', + 'Share the current conversation to a markdown or json file. Usage: /chat share ': + '將當前對話分享到 markdown 或 json 文件。用法:/chat share ', + 'Generate a project summary and save it to .qwen/PROJECT_SUMMARY.md': + '生成項目摘要並保存到 .qwen/PROJECT_SUMMARY.md', + 'No chat client available to generate summary.': + '沒有可用的聊天客戶端來生成摘要', + 'Already generating summary, wait for previous request to complete': + '正在生成摘要,請等待上一個請求完成', + 'No conversation found to summarize.': '未找到要總結的對話', + 'Failed to generate project context summary: {{error}}': + '生成項目上下文摘要失敗:{{error}}', + 'Saved project summary to {{filePathForDisplay}}.': + '項目摘要已保存到 {{filePathForDisplay}}', + 'Saving project summary...': '正在保存項目摘要...', + 'Generating project summary...': '正在生成項目摘要...', + 'Failed to generate summary - no text content received from LLM response': + '生成摘要失敗 - 未從 LLM 響應中接收到文本內容', + 'Switch the model for this session (--fast for suggestion model)': + '切換此會話的模型(--fast 可設置建議模型)', + 'Set a lighter model for prompt suggestions and speculative execution': + '設置用於輸入建議和推測執行的輕量模型', + 'Content generator configuration not available.': '內容生成器配置不可用', + 'Authentication type not available.': '認證類型不可用', + 'No models available for the current authentication type ({{authType}}).': + '當前認證類型 ({{authType}}) 沒有可用的模型', + 'Starting a new session, resetting chat, and clearing terminal.': + '正在開始新會話,重置聊天並清屏。', + 'Starting a new session and clearing.': '正在開始新會話並清屏。', + 'Already compressing, wait for previous request to complete': + '正在壓縮中,請等待上一個請求完成', + 'Failed to compress chat history.': '壓縮聊天曆史失敗', + 'Failed to compress chat history: {{error}}': '壓縮聊天曆史失敗:{{error}}', + 'Compressing chat history': '正在壓縮聊天曆史', + 'Chat history compressed from {{originalTokens}} to {{newTokens}} tokens.': + '聊天曆史已從 {{originalTokens}} 個 token 壓縮到 {{newTokens}} 個 token。', + 'Compression was not beneficial for this history size.': + '對於此歷史記錄大小,壓縮沒有益處。', + 'Chat history compression did not reduce size. This may indicate issues with the compression prompt.': + '聊天曆史壓縮未能減小大小。這可能表明壓縮提示存在問題。', + 'Could not compress chat history due to a token counting error.': + '由於 token 計數錯誤,無法壓縮聊天曆史。', + 'Chat history is already compressed.': '聊天曆史已經壓縮。', + 'Configuration is not available.': '配置不可用。', + 'Please provide at least one path to add.': '請提供至少一個要添加的路徑。', + 'The /directory add command is not supported in restrictive sandbox profiles. Please use --include-directories when starting the session instead.': + '/directory add 命令在限制性沙箱配置文件中不受支持。請改爲在啓動會話時使用 --include-directories。', + "Error adding '{{path}}': {{error}}": "添加 '{{path}}' 時出錯:{{error}}", + 'Successfully added QWEN.md files from the following directories if there are:\n- {{directories}}': + '如果存在,已成功從以下目錄添加 QWEN.md 文件:\n- {{directories}}', + 'Error refreshing memory: {{error}}': '刷新內存時出錯:{{error}}', + 'Successfully added directories:\n- {{directories}}': + '成功添加目錄:\n- {{directories}}', + 'Current workspace directories:\n{{directories}}': + '當前工作區目錄:\n{{directories}}', + 'Please open the following URL in your browser to view the documentation:\n{{url}}': + '請在瀏覽器中打開以下 URL 以查看文檔:\n{{url}}', + 'Opening documentation in your browser: {{url}}': + '正在瀏覽器中打開文檔:{{url}}', + 'Do you want to proceed?': '是否繼續?', + 'Yes, allow once': '是,允許一次', + 'Allow always': '總是允許', + Yes: '是', + No: '否', + 'No (esc)': '否 (esc)', + 'Yes, allow always for this session': '是,本次會話總是允許', + 'Modify in progress:': '正在修改:', + 'Save and close external editor to continue': '保存並關閉外部編輯器以繼續', + 'Apply this change?': '是否應用此更改?', + 'Yes, allow always': '是,總是允許', + 'Modify with external editor': '使用外部編輯器修改', + 'No, suggest changes (esc)': '否,建議更改 (esc)', + "Allow execution of: '{{command}}'?": "允許執行:'{{command}}'?", + 'Yes, allow always ...': '是,總是允許 ...', + 'Always allow in this project': '在本項目中總是允許', + 'Always allow {{action}} in this project': '在本項目中總是允許{{action}}', + 'Always allow for this user': '對該用戶總是允許', + 'Always allow {{action}} for this user': '對該用戶總是允許{{action}}', + 'Yes, restore previous mode ({{mode}})': '是,恢復之前的模式 ({{mode}})', + 'Yes, and auto-accept edits': '是,並自動接受編輯', + 'Yes, and manually approve edits': '是,並手動批准編輯', + 'No, keep planning (esc)': '否,繼續規劃 (esc)', + 'URLs to fetch:': '要獲取的 URL:', + 'MCP Server: {{server}}': 'MCP 服務器:{{server}}', + 'Tool: {{tool}}': '工具:{{tool}}', + 'Allow execution of MCP tool "{{tool}}" from server "{{server}}"?': + '允許執行來自服務器 "{{server}}" 的 MCP 工具 "{{tool}}"?', + 'Yes, always allow tool "{{tool}}" from server "{{server}}"': + '是,總是允許來自服務器 "{{server}}" 的工具 "{{tool}}"', + 'Yes, always allow all tools from server "{{server}}"': + '是,總是允許來自服務器 "{{server}}" 的所有工具', + 'Shell Command Execution': 'Shell 命令執行', + 'A custom command wants to run the following shell commands:': + '自定義命令想要運行以下 shell 命令:', + 'Pro quota limit reached for {{model}}.': '{{model}} 的 Pro 配額已達到上限', + 'Change auth (executes the /auth command)': '更改認證(執行 /auth 命令)', + 'Continue with {{model}}': '使用 {{model}} 繼續', + 'Current Plan:': '當前計劃:', + 'Progress: {{done}}/{{total}} tasks completed': + '進度:已完成 {{done}}/{{total}} 個任務', + ', {{inProgress}} in progress': ',{{inProgress}} 個進行中', + 'Pending Tasks:': '待處理任務:', + 'What would you like to do?': '您想要做什麼?', + 'Choose how to proceed with your session:': '選擇如何繼續您的會話:', + 'Start new chat session': '開始新的聊天會話', + 'Continue previous conversation': '繼續之前的對話', + '👋 Welcome back! (Last updated: {{timeAgo}})': + '👋 歡迎回來!(最後更新:{{timeAgo}})', + '🎯 Overall Goal:': '🎯 總體目標:', + 'Get started': '開始使用', + 'Select Authentication Method': '選擇認證方式', + 'OpenAI API key is required to use OpenAI authentication.': + '使用 OpenAI 認證需要 OpenAI API 密鑰', + 'You must select an auth method to proceed. Press Ctrl+C again to exit.': + '您必須選擇認證方法才能繼續。再次按 Ctrl+C 退出', + 'Terms of Services and Privacy Notice': '服務條款和隱私聲明', + 'Qwen OAuth': 'Qwen OAuth (免費)', + 'Discontinued — switch to Coding Plan or API Key': + '已停用 — 請切換到 Coding Plan 或 API Key', + 'Qwen OAuth free tier was discontinued on 2026-04-15. Run /auth to switch provider.': + 'Qwen OAuth 免費額度已於 2026-04-15 停用。請運行 /auth 切換服務商。', + 'Qwen OAuth free tier was discontinued on 2026-04-15. Please select Coding Plan or API Key instead.': + 'Qwen OAuth 免費額度已於 2026-04-15 停用。請選擇 Coding Plan 或 API Key。', + 'Qwen OAuth free tier was discontinued on 2026-04-15. Please select a model from another provider or run /auth to switch.': + 'Qwen OAuth免費層已於2026-04-15停止服務。請選擇其他提供商的模型或運行 /auth 切換。', + '\n⚠ Qwen OAuth free tier was discontinued on 2026-04-15. Please select another option.\n': + '\n⚠ Qwen OAuth 免費額度已於 2026-04-15 停用。請選擇其他選項。\n', + 'Paid · Up to 6,000 requests/5 hrs · All Alibaba Cloud Coding Plan Models': + '付費 · 每 5 小時最多 6,000 次請求 · 支持阿里雲百鍊 Coding Plan 全部模型', + 'Alibaba Cloud Coding Plan': '阿里雲百鍊 Coding Plan', + 'Bring your own API key': '使用自己的 API 密鑰', + 'API-KEY': 'API-KEY', + 'Use coding plan credentials or your own api-keys/providers.': + '使用 Coding Plan 憑證或您自己的 API 密鑰/提供商。', + OpenAI: 'OpenAI', + 'Failed to login. Message: {{message}}': '登錄失敗。消息:{{message}}', + 'Authentication is enforced to be {{enforcedType}}, but you are currently using {{currentType}}.': + '認證方式被強制設置爲 {{enforcedType}},但您當前使用的是 {{currentType}}', + 'Qwen OAuth authentication timed out. Please try again.': + 'Qwen OAuth 認證超時。請重試', + 'Qwen OAuth authentication cancelled.': 'Qwen OAuth 認證已取消', + 'Qwen OAuth Authentication': 'Qwen OAuth 認證', + 'Please visit this URL to authorize:': '請訪問此 URL 進行授權:', + 'Or scan the QR code below:': '或掃描下方的二維碼:', + 'Waiting for authorization': '等待授權中', + 'Time remaining:': '剩餘時間:', + '(Press ESC or CTRL+C to cancel)': '(按 ESC 或 CTRL+C 取消)', + 'Qwen OAuth Authentication Timeout': 'Qwen OAuth 認證超時', + 'OAuth token expired (over {{seconds}} seconds). Please select authentication method again.': + 'OAuth 令牌已過期(超過 {{seconds}} 秒)。請重新選擇認證方法', + 'Press any key to return to authentication type selection.': + '按任意鍵返回認證類型選擇', + 'Waiting for Qwen OAuth authentication...': '正在等待 Qwen OAuth 認證...', + 'Note: Your existing API key in settings.json will not be cleared when using Qwen OAuth. You can switch back to OpenAI authentication later if needed.': + '注意:使用 Qwen OAuth 時,settings.json 中現有的 API 密鑰不會被清除。如果需要,您可以稍後切換回 OpenAI 認證。', + 'Note: Your existing API key will not be cleared when using Qwen OAuth.': + '注意:使用 Qwen OAuth 時,現有的 API 密鑰不會被清除。', + 'Authentication timed out. Please try again.': '認證超時。請重試。', + 'Waiting for auth... (Press ESC or CTRL+C to cancel)': + '正在等待認證...(按 ESC 或 CTRL+C 取消)', + 'Missing API key for OpenAI-compatible auth. Set settings.security.auth.apiKey, or set the {{envKeyHint}} environment variable.': + '缺少 OpenAI 兼容認證的 API 密鑰。請設置 settings.security.auth.apiKey 或設置 {{envKeyHint}} 環境變量。', + '{{envKeyHint}} environment variable not found.': + '未找到 {{envKeyHint}} 環境變量。', + '{{envKeyHint}} environment variable not found. Please set it in your .env file or environment variables.': + '未找到 {{envKeyHint}} 環境變量。請在 .env 文件或系統環境變量中進行設置。', + '{{envKeyHint}} environment variable not found (or set settings.security.auth.apiKey). Please set it in your .env file or environment variables.': + '未找到 {{envKeyHint}} 環境變量(或設置 settings.security.auth.apiKey)。請在 .env 文件或系統環境變量中進行設置。', + 'Missing API key for OpenAI-compatible auth. Set the {{envKeyHint}} environment variable.': + '缺少 OpenAI 兼容認證的 API 密鑰。請設置 {{envKeyHint}} 環境變量。', + 'Anthropic provider missing required baseUrl in modelProviders[].baseUrl.': + 'Anthropic 提供商缺少必需的 baseUrl,請在 modelProviders[].baseUrl 中配置。', + 'ANTHROPIC_BASE_URL environment variable not found.': + '未找到 ANTHROPIC_BASE_URL 環境變量。', + 'Invalid auth method selected.': '選擇了無效的認證方式。', + 'Failed to authenticate. Message: {{message}}': '認證失敗。消息:{{message}}', + 'Authenticated successfully with {{authType}} credentials.': + '使用 {{authType}} 憑據成功認證。', + 'Invalid QWEN_DEFAULT_AUTH_TYPE value: "{{value}}". Valid values are: {{validValues}}': + '無效的 QWEN_DEFAULT_AUTH_TYPE 值:"{{value}}"。有效值爲:{{validValues}}', + 'OpenAI Configuration Required': '需要配置 OpenAI', + 'Please enter your OpenAI configuration. You can get an API key from': + '請輸入您的 OpenAI 配置。您可以從以下地址獲取 API 密鑰:', + 'API Key:': 'API 密鑰:', + 'Invalid credentials: {{errorMessage}}': '憑據無效:{{errorMessage}}', + 'Failed to validate credentials': '驗證憑據失敗', + 'Press Enter to continue, Tab/↑↓ to navigate, Esc to cancel': + '按 Enter 繼續,Tab/↑↓ 導航,Esc 取消', + 'Select Model': '選擇模型', + '(Press Esc to close)': '(按 Esc 關閉)', + 'Current (effective) configuration': '當前(實際生效)配置', + AuthType: '認證方式', + 'API Key': 'API 密鑰', + unset: '未設置', + '(default)': '(默認)', + '(set)': '(已設置)', + '(not set)': '(未設置)', + Modality: '模態', + 'Context Window': '上下文窗口', + text: '文本', + 'text-only': '純文本', + image: '圖像', + pdf: 'PDF', + audio: '音頻', + video: '視頻', + 'not set': '未設置', + none: '無', + unknown: '未知', + "Failed to switch model to '{{modelId}}'.\n\n{{error}}": + "無法切換到模型 '{{modelId}}'.\n\n{{error}}", + 'Qwen 3.6 Plus — efficient hybrid model with leading coding performance': + 'Qwen 3.6 Plus — 高效混合架構,編程性能業界領先', + 'The latest Qwen Vision model from Alibaba Cloud ModelStudio (version: qwen3-vl-plus-2025-09-23)': + '來自阿里雲 ModelStudio 的最新 Qwen Vision 模型(版本:qwen3-vl-plus-2025-09-23)', + 'Manage folder trust settings': '管理文件夾信任設置', + 'Manage permission rules': '管理權限規則', + Allow: '允許', + Ask: '詢問', + Deny: '拒絕', + Workspace: '工作區', + "Qwen Code won't ask before using allowed tools.": + 'Qwen Code 使用已允許的工具前不會詢問。', + 'Qwen Code will ask before using these tools.': + 'Qwen Code 使用這些工具前會先詢問。', + 'Qwen Code is not allowed to use denied tools.': + 'Qwen Code 不允許使用被拒絕的工具。', + 'Manage trusted directories for this workspace.': + '管理此工作區的受信任目錄。', + 'Any use of the {{tool}} tool': '{{tool}} 工具的任何使用', + "{{tool}} commands matching '{{pattern}}'": + "匹配 '{{pattern}}' 的 {{tool}} 命令", + 'From user settings': '來自用戶設置', + 'From project settings': '來自項目設置', + 'From session': '來自會話', + 'Project settings (local)': '項目設置(本地)', + 'Saved in .qwen/settings.local.json': '保存在 .qwen/settings.local.json', + 'Project settings': '項目設置', + 'Checked in at .qwen/settings.json': '保存在 .qwen/settings.json', + 'User settings': '用戶設置', + 'Saved in at ~/.qwen/settings.json': '保存在 ~/.qwen/settings.json', + 'Add a new rule…': '添加新規則…', + 'Add {{type}} permission rule': '添加{{type}}權限規則', + 'Permission rules are a tool name, optionally followed by a specifier in parentheses.': + '權限規則是一個工具名稱,可選地後跟括號中的限定符。', + 'e.g.,': '例如', + or: '或', + 'Enter permission rule…': '輸入權限規則…', + 'Enter to submit · Esc to cancel': '回車提交 · Esc 取消', + 'Where should this rule be saved?': '此規則應保存在哪裏?', + 'Enter to confirm · Esc to cancel': '回車確認 · Esc 取消', + 'Delete {{type}} rule?': '刪除{{type}}規則?', + 'Are you sure you want to delete this permission rule?': + '確定要刪除此權限規則嗎?', + 'Permissions:': '權限:', + '(←/→ or tab to cycle)': '(←/→ 或 tab 切換)', + 'Press ↑↓ to navigate · Enter to select · Type to search · Esc to cancel': + '按 ↑↓ 導航 · 回車選擇 · 輸入搜索 · Esc 取消', + 'Search…': '搜索…', + 'Use /trust to manage folder trust settings for this workspace.': + '使用 /trust 管理此工作區的文件夾信任設置。', + 'Add directory…': '添加目錄…', + 'Add directory to workspace': '添加工作區目錄', + 'Qwen Code can read files in the workspace, and make edits when auto-accept edits is on.': + 'Qwen Code 可以讀取工作區中的文件,並在自動接受編輯模式開啓時進行編輯。', + 'Qwen Code will be able to read files in this directory and make edits when auto-accept edits is on.': + 'Qwen Code 將能夠讀取此目錄中的文件,並在自動接受編輯模式開啓時進行編輯。', + 'Enter the path to the directory:': '輸入目錄路徑:', + 'Enter directory path…': '輸入目錄路徑…', + 'Tab to complete · Enter to add · Esc to cancel': + 'Tab 補全 · 回車添加 · Esc 取消', + 'Remove directory?': '刪除目錄?', + 'Are you sure you want to remove this directory from the workspace?': + '確定要將此目錄從工作區中移除嗎?', + ' (Original working directory)': ' (原始工作目錄)', + ' (from settings)': ' (來自設置)', + 'Directory does not exist.': '目錄不存在。', + 'Path is not a directory.': '路徑不是目錄。', + 'This directory is already in the workspace.': '此目錄已在工作區中。', + 'Already covered by existing directory: {{dir}}': '已被現有目錄覆蓋:{{dir}}', + 'Using:': '已加載: ', + '{{count}} open file': '{{count}} 個打開的文件', + '{{count}} open files': '{{count}} 個打開的文件', + '(ctrl+g to view)': '(按 ctrl+g 查看)', + '{{count}} {{name}} file': '{{count}} 個 {{name}} 文件', + '{{count}} {{name}} files': '{{count}} 個 {{name}} 文件', + '{{count}} MCP server': '{{count}} 個 MCP 服務器', + '{{count}} MCP servers': '{{count}} 個 MCP 服務器', + '{{count}} Blocked': '{{count}} 個已阻止', + '(ctrl+t to view)': '(按 ctrl+t 查看)', + '(ctrl+t to toggle)': '(按 ctrl+t 切換)', + 'Press Ctrl+C again to exit.': '再次按 Ctrl+C 退出', + 'Press Ctrl+D again to exit.': '再次按 Ctrl+D 退出', + 'Press Esc again to clear.': '再次按 Esc 清除', + 'Press ↑ to edit queued messages': '按 ↑ 編輯排隊消息', + 'No MCP servers configured.': '未配置 MCP 服務器', + '⏳ MCP servers are starting up ({{count}} initializing)...': + '⏳ MCP 服務器正在啓動({{count}} 個正在初始化)...', + 'Note: First startup may take longer. Tool availability will update automatically.': + '注意:首次啓動可能需要更長時間。工具可用性將自動更新', + 'Configured MCP servers:': '已配置的 MCP 服務器:', + Ready: '就緒', + 'Starting... (first startup may take longer)': + '正在啓動...(首次啓動可能需要更長時間)', + Disconnected: '已斷開連接', + '{{count}} tool': '{{count}} 個工具', + '{{count}} tools': '{{count}} 個工具', + '{{count}} prompt': '{{count}} 個提示', + '{{count}} prompts': '{{count}} 個提示', + '(from {{extensionName}})': '(來自 {{extensionName}})', + OAuth: 'OAuth', + 'OAuth expired': 'OAuth 已過期', + 'OAuth not authenticated': 'OAuth 未認證', + 'tools and prompts will appear when ready': '工具和提示將在就緒時顯示', + '{{count}} tools cached': '{{count}} 個工具已緩存', + 'Tools:': '工具:', + 'Parameters:': '參數:', + 'Prompts:': '提示:', + Blocked: '已阻止', + '💡 Tips:': '💡 提示:', + Use: '使用', + 'to show server and tool descriptions': '顯示服務器和工具描述', + 'to show tool parameter schemas': '顯示工具參數架構', + 'to hide descriptions': '隱藏描述', + 'to authenticate with OAuth-enabled servers': + '使用支持 OAuth 的服務器進行認證', + Press: '按', + 'to toggle tool descriptions on/off': '切換工具描述開關', + "Starting OAuth authentication for MCP server '{{name}}'...": + "正在爲 MCP 服務器 '{{name}}' 啓動 OAuth 認證...", + 'Restarting MCP servers...': '正在重啓 MCP 服務器...', + 'Tips:': '提示:', + 'Use /compress when the conversation gets long to summarize history and free up context.': + '對話變長時用 /compress,總結歷史並釋放上下文。', + 'Start a fresh idea with /clear or /new; the previous session stays available in history.': + '用 /clear 或 /new 開啓新思路;之前的會話會保留在歷史記錄中。', + 'Use /bug to submit issues to the maintainers when something goes off.': + '遇到問題時,用 /bug 將問題提交給維護者。', + 'Switch auth type quickly with /auth.': '用 /auth 快速切換認證方式。', + 'You can run any shell commands from Qwen Code using ! (e.g. !ls).': + '在 Qwen Code 中使用 ! 可運行任意 shell 命令(例如 !ls)。', + 'Type / to open the command popup; Tab autocompletes slash commands and saved prompts.': + '輸入 / 打開命令彈窗;按 Tab 自動補全斜槓命令和保存的提示詞。', + 'You can resume a previous conversation by running qwen --continue or qwen --resume.': + '運行 qwen --continue 或 qwen --resume 可繼續之前的會話。', + 'You can switch permission mode quickly with Shift+Tab or /approval-mode.': + '按 Shift+Tab 或輸入 /approval-mode 可快速切換權限模式。', + 'You can switch permission mode quickly with Tab or /approval-mode.': + '按 Tab 或輸入 /approval-mode 可快速切換權限模式。', + 'Try /insight to generate personalized insights from your chat history.': + '試試 /insight,從聊天記錄中生成個性化洞察。', + 'Press Ctrl+O to toggle compact mode — hide tool output and thinking for a cleaner view.': + '按 Ctrl+O 切換緊湊模式 ── 隱藏工具輸出和思考過程,界面更簡潔。', + 'Add a QWEN.md file to give Qwen Code persistent project context.': + '添加 QWEN.md 文件,爲 Qwen Code 提供持久的項目上下文。', + 'Use /btw to ask a quick side question without disrupting the conversation.': + '用 /btw 快速問一個小問題,不會打斷當前對話。', + 'Context is almost full! Run /compress now or start /new to continue.': + '上下文即將用滿!請立即執行 /compress 或使用 /new 開啓新會話。', + 'Context is getting full. Use /compress to free up space.': + '上下文空間不足,用 /compress 釋放空間。', + 'Long conversation? /compress summarizes history to free context.': + '對話太長?用 /compress 總結歷史,釋放上下文。', + 'Agent powering down. Goodbye!': 'Qwen Code 正在關閉,再見!', + 'To continue this session, run': '要繼續此會話,請運行', + 'Interaction Summary': '交互摘要', + 'Session ID:': '會話 ID:', + 'Tool Calls:': '工具調用:', + 'Success Rate:': '成功率:', + 'User Agreement:': '用戶同意率:', + reviewed: '已審覈', + 'Code Changes:': '代碼變更:', + Performance: '性能', + 'Wall Time:': '總耗時:', + 'Agent Active:': '智能體活躍時間:', + 'API Time:': 'API 時間:', + 'Tool Time:': '工具時間:', + 'Session Stats': '會話統計', + 'Model Usage': '模型使用情況', + Reqs: '請求數', + 'Input Tokens': '輸入 token 數', + 'Output Tokens': '輸出 token 數', + 'Savings Highlight:': '節省亮點:', + 'of input tokens were served from the cache, reducing costs.': + '從緩存載入 token ,降低了成本', + 'Tip: For a full token breakdown, run `/stats model`.': + '提示:要查看完整的令牌明細,請運行 `/stats model`', + 'Model Stats For Nerds': '模型統計(技術細節)', + 'Tool Stats For Nerds': '工具統計(技術細節)', + Metric: '指標', + API: 'API', + Requests: '請求數', + Errors: '錯誤數', + 'Avg Latency': '平均延遲', + Tokens: '令牌', + Total: '總計', + Prompt: '提示', + Cached: '緩存', + Thoughts: '思考', + Tool: '工具', + Output: '輸出', + 'No API calls have been made in this session.': + '本次會話中未進行任何 API 調用', + 'Tool Name': '工具名稱', + Calls: '調用次數', + 'Success Rate': '成功率', + 'Avg Duration': '平均耗時', + 'User Decision Summary': '用戶決策摘要', + 'Total Reviewed Suggestions:': '已審覈建議總數:', + ' » Accepted:': ' » 已接受:', + ' » Rejected:': ' » 已拒絕:', + ' » Modified:': ' » 已修改:', + ' Overall Agreement Rate:': ' 總體同意率:', + 'No tool calls have been made in this session.': + '本次會話中未進行任何工具調用', + 'Session start time is unavailable, cannot calculate stats.': + '會話開始時間不可用,無法計算統計信息', + 'Command Format Migration': '命令格式遷移', + 'Found {{count}} TOML command file:': '發現 {{count}} 個 TOML 命令文件:', + 'Found {{count}} TOML command files:': '發現 {{count}} 個 TOML 命令文件:', + '... and {{count}} more': '... 以及其他 {{count}} 個', + 'The TOML format is deprecated. Would you like to migrate them to Markdown format?': + 'TOML 格式已棄用。是否將它們遷移到 Markdown 格式?', + '(Backups will be created and original files will be preserved)': + '(將創建備份,原始文件將保留)', + 'Waiting for user confirmation...': '等待用戶確認...', + '(esc to cancel, {{time}})': '(按 esc 取消,{{time}})', + WITTY_LOADING_PHRASES: [ + '正在努力搬磚,請稍候...', + '老闆在身後,快加載啊!', + '頭髮掉光前,一定能加載完...', + '服務器正在深呼吸,準備放大招...', + '正在向服務器投餵咖啡...', + '正在賦能全鏈路,尋找關鍵抓手...', + '正在降本增效,優化加載路徑...', + '正在打破部門壁壘,沉澱方法論...', + '正在擁抱變化,迭代核心價值...', + '正在對齊顆粒度,打磨底層邏輯...', + '大力出奇跡,正在強行加載...', + '只要我不寫代碼,代碼就沒有 Bug...', + '正在把 Bug 轉化爲 Feature...', + '只要我不尷尬,Bug 就追不上我...', + '正在試圖理解去年的自己寫了什麼...', + '正在猿力覺醒中,請耐心等待...', + '正在詢問產品經理:這需求是真的嗎?', + '正在給產品經理畫餅,請稍等...', + '每一行代碼,都在努力讓世界變得更好一點點...', + '每一個偉大的想法,都值得這份耐心的等待...', + '別急,美好的事物總是需要一點時間去醞釀...', + '願你的代碼永無 Bug,願你的夢想終將成真...', + '哪怕只有 0.1% 的進度,也是在向目標靠近...', + '加載的是字節,承載的是對技術的熱愛...', + ], + 'Enter value...': '請輸入值...', + 'Enter sensitive value...': '請輸入敏感值...', + 'Press Enter to submit, Escape to cancel': '按 Enter 提交,Escape 取消', + 'Markdown file already exists: {{filename}}': + 'Markdown 文件已存在:{{filename}}', + 'TOML Command Format Deprecation Notice': 'TOML 命令格式棄用通知', + 'Found {{count}} command file(s) in TOML format:': + '發現 {{count}} 個 TOML 格式的命令文件:', + 'The TOML format for commands is being deprecated in favor of Markdown format.': + '命令的 TOML 格式正在被棄用,推薦使用 Markdown 格式。', + 'Markdown format is more readable and easier to edit.': + 'Markdown 格式更易讀、更易編輯。', + 'You can migrate these files automatically using:': + '您可以使用以下命令自動遷移這些文件:', + 'Or manually convert each file:': '或手動轉換每個文件:', + 'TOML: prompt = "..." / description = "..."': + 'TOML:prompt = "..." / description = "..."', + 'Markdown: YAML frontmatter + content': 'Markdown:YAML frontmatter + 內容', + 'The migration tool will:': '遷移工具將:', + 'Convert TOML files to Markdown': '將 TOML 文件轉換爲 Markdown', + 'Create backups of original files': '創建原始文件的備份', + 'Preserve all command functionality': '保留所有命令功能', + 'TOML format will continue to work for now, but migration is recommended.': + 'TOML 格式目前仍可使用,但建議遷移。', + 'Open extensions page in your browser': '在瀏覽器中打開擴展市場頁面', + 'Unknown extensions source: {{source}}.': '未知的擴展來源:{{source}}。', + 'Would open extensions page in your browser: {{url}} (skipped in test environment)': + '將在瀏覽器中打開擴展頁面:{{url}}(測試環境中已跳過)', + 'View available extensions at {{url}}': '在 {{url}} 查看可用擴展', + 'Opening extensions page in your browser: {{url}}': + '正在瀏覽器中打開擴展頁面:{{url}}', + 'Failed to open browser. Check out the extensions gallery at {{url}}': + '打開瀏覽器失敗。請訪問擴展市場:{{url}}', + 'Rate limit error: {{reason}}': '觸發限流:{{reason}}', + 'Retrying in {{seconds}} seconds… (attempt {{attempt}}/{{maxRetries}})': + '將於 {{seconds}} 秒後重試…(第 {{attempt}}/{{maxRetries}} 次)', + 'Press Ctrl+Y to retry': '按 Ctrl+Y 重試。', + 'No failed request to retry.': '沒有可重試的失敗請求。', + 'to retry last request': '重試上一次請求', + 'API key cannot be empty.': 'API Key 不能爲空。', + 'Invalid API key. Coding Plan API keys start with "sk-sp-". Please check.': + '無效的 API Key,Coding Plan API Key 均以 "sk-sp-" 開頭,請檢查', + 'You can get your Coding Plan API key here': + '您可以在這裏獲取 Coding Plan API Key', + 'API key is stored in settings.env. You can migrate it to a .env file for better security.': + 'API Key 已存儲在 settings.env 中。您可以將其遷移到 .env 文件以獲得更好的安全性。', + 'New model configurations are available for Alibaba Cloud Coding Plan. Update now?': + '阿里雲百鍊 Coding Plan 有新模型配置可用。是否立即更新?', + 'Coding Plan configuration updated successfully. New models are now available.': + 'Coding Plan 配置更新成功。新模型現已可用。', + 'Coding Plan API key not found. Please re-authenticate with Coding Plan.': + '未找到 Coding Plan API Key。請重新通過 Coding Plan 認證。', + 'Failed to update Coding Plan configuration: {{message}}': + '更新 Coding Plan 配置失敗:{{message}}', + 'You can configure your API key and models in settings.json': + '您可以在 settings.json 中配置 API Key 和模型', + 'Refer to the documentation for setup instructions': '請參考文檔瞭解配置說明', + 'Coding Plan': 'Coding Plan', + "Paste your api key of ModelStudio Coding Plan and you're all set!": + '粘貼您的百鍊 Coding Plan API Key,即可完成設置!', + Custom: '自定義', + 'More instructions about configuring `modelProviders` manually.': + '關於手動配置 `modelProviders` 的更多說明。', + 'Select API-KEY configuration mode:': '選擇 API-KEY 配置模式:', + '(Press Escape to go back)': '(按 Escape 鍵返回)', + '(Press Enter to submit, Escape to cancel)': '(按 Enter 提交,Escape 取消)', + 'Select Region for Coding Plan': '選擇 Coding Plan 區域', + 'Choose based on where your account is registered': + '請根據您的賬號註冊地區選擇', + 'Enter Coding Plan API Key': '輸入 Coding Plan API Key', + 'New model configurations are available for {{region}}. Update now?': + '{{region}} 有新的模型配置可用。是否立即更新?', + '{{region}} configuration updated successfully. Model switched to "{{model}}".': + '{{region}} 配置更新成功。模型已切換至 "{{model}}"。', + 'Authenticated successfully with {{region}}. API key and model configs saved to settings.json (backed up).': + '成功通過 {{region}} 認證。API Key 和模型配置已保存至 settings.json(已備份)。', + 'Context Usage': '上下文使用情況', + '% used': '% 已用', + '% context used': '% 上下文已用', + 'Context exceeds limit! Use /compress or /clear to reduce.': + '上下文超出限制!請使用 /compress 或 /clear 來減少上下文。', + 'Use /compress or /clear': '使用 /compress 或 /clear', + 'No API response yet. Send a message to see actual usage.': + '暫無 API 響應。發送消息以查看實際使用情況。', + 'Estimated pre-conversation overhead': '預估對話前開銷', + 'Context window': '上下文窗口', + tokens: 'tokens', + Used: '已用', + Free: '空閒', + 'Autocompact buffer': '自動壓縮緩衝區', + 'Usage by category': '分類用量', + 'System prompt': '系統提示', + 'Built-in tools': '內置工具', + 'MCP tools': 'MCP 工具', + 'Memory files': '記憶文件', + Skills: '技能', + Messages: '消息', + 'Show context window usage breakdown.': '顯示上下文窗口使用情況分解。', + 'Run /context detail for per-item breakdown.': + '運行 /context detail 查看詳細分解。', + 'Show context window usage breakdown. Use "/context detail" for per-item breakdown.': + '顯示上下文窗口使用情況分解。輸入 "/context detail" 查看詳細分解。', + 'body loaded': '內容已加載', + memory: '記憶', + '{{region}} configuration updated successfully.': '{{region}} 配置更新成功。', + 'Authenticated successfully with {{region}}. API key and model configs saved to settings.json.': + '成功通過 {{region}} 認證。API Key 和模型配置已保存至 settings.json。', + 'Tip: Use /model to switch between available Coding Plan models.': + '提示:使用 /model 切換可用的 Coding Plan 模型。', + 'Please answer the following question(s):': '請回答以下問題:', + 'Cannot ask user questions in non-interactive mode. Please run in interactive mode to use this tool.': + '無法在非交互模式下詢問用戶問題。請在交互模式下運行以使用此工具。', + 'User declined to answer the questions.': '用戶拒絕回答問題。', + 'User has provided the following answers:': '用戶提供了以下答案:', + 'Failed to process user answers:': '處理用戶答案失敗:', + 'Type something...': '輸入內容...', + Submit: '提交', + 'Submit answers': '提交答案', + Cancel: '取消', + 'Your answers:': '您的答案:', + '(not answered)': '(未回答)', + 'Ready to submit your answers?': '準備好提交您的答案了嗎?', + '↑/↓: Navigate | ←/→: Switch tabs | Enter: Select': + '↑/↓: 導航 | ←/→: 切換標籤頁 | Enter: 選擇', + '↑/↓: Navigate | ←/→: Switch tabs | Space/Enter: Toggle | Esc: Cancel': + '↑/↓: 導航 | ←/→: 切換標籤頁 | Space/Enter: 切換 | Esc: 取消', + '↑/↓: Navigate | Space/Enter: Toggle | Esc: Cancel': + '↑/↓: 導航 | Space/Enter: 切換 | Esc: 取消', + '↑/↓: Navigate | Enter: Select | Esc: Cancel': + '↑/↓: 導航 | Enter: 選擇 | Esc: 取消', + 'Configure Qwen authentication information with Qwen-OAuth or Alibaba Cloud Coding Plan': + '使用 Qwen OAuth 或阿里雲百鍊 Coding Plan 配置 Qwen 認證信息', + 'Authenticate using Qwen OAuth': '使用 Qwen OAuth 進行認證', + 'Authenticate using Alibaba Cloud Coding Plan': + '使用阿里雲百鍊 Coding Plan 進行認證', + 'Region for Coding Plan (china/global)': 'Coding Plan 區域 (china/global)', + 'API key for Coding Plan': 'Coding Plan 的 API 密鑰', + 'Show current authentication status': '顯示當前認證狀態', + 'Authentication completed successfully.': '認證完成。', + 'Starting Qwen OAuth authentication...': '正在啓動 Qwen OAuth 認證...', + 'Successfully authenticated with Qwen OAuth.': '已成功通過 Qwen OAuth 認證。', + 'Failed to authenticate with Qwen OAuth: {{error}}': + 'Qwen OAuth 認證失敗:{{error}}', + 'Processing Alibaba Cloud Coding Plan authentication...': + '正在處理阿里雲百鍊 Coding Plan 認證...', + 'Successfully authenticated with Alibaba Cloud Coding Plan.': + '已成功通過阿里雲百鍊 Coding Plan 認證。', + 'Failed to authenticate with Coding Plan: {{error}}': + 'Coding Plan 認證失敗:{{error}}', + '中国 (China)': '中國 (China)', + '阿里云百炼 (aliyun.com)': '阿里雲百鍊 (aliyun.com)', + Global: '全球', + 'Alibaba Cloud (alibabacloud.com)': 'Alibaba Cloud (alibabacloud.com)', + 'Select region for Coding Plan:': '選擇 Coding Plan 區域:', + 'Enter your Coding Plan API key: ': '請輸入您的 Coding Plan API 密鑰:', + 'Select authentication method:': '選擇認證方式:', + '\n=== Authentication Status ===\n': '\n=== 認證狀態 ===\n', + '⚠️ No authentication method configured.\n': '⚠️ 未配置認證方式。\n', + 'Run one of the following commands to get started:\n': + '運行以下命令之一開始配置:\n', + ' qwen auth qwen-oauth - Authenticate with Qwen OAuth (discontinued)': + ' qwen auth qwen-oauth - 使用 Qwen OAuth 登錄(已停用)', + ' qwen auth coding-plan - Authenticate with Alibaba Cloud Coding Plan\n': + ' qwen auth coding-plan - 使用阿里雲百鍊 Coding Plan 認證\n', + 'Or simply run:': '或者直接運行:', + ' qwen auth - Interactive authentication setup\n': + ' qwen auth - 交互式認證配置\n', + '✓ Authentication Method: Qwen OAuth': '✓ 認證方式:Qwen OAuth', + ' Type: Free tier (discontinued 2026-04-15)': + ' 類型:免費額度(2026-04-15 已停用)', + ' Limit: No longer available': ' 限額:已不可用', + 'Qwen OAuth free tier was discontinued on 2026-04-15. Run /auth to switch to Coding Plan, OpenRouter, Fireworks AI, or another provider.': + 'Qwen OAuth 免費額度已於 2026-04-15 停用。請運行 /auth 切換到 Coding Plan、OpenRouter、Fireworks AI 或其他服務商。', + ' Models: Qwen latest models\n': ' 模型:Qwen 最新模型\n', + '✓ Authentication Method: Alibaba Cloud Coding Plan': + '✓ 認證方式:阿里雲百鍊 Coding Plan', + '中国 (China) - 阿里云百炼': '中國 (China) - 阿里雲百鍊', + 'Global - Alibaba Cloud': '全球 - Alibaba Cloud', + ' Region: {{region}}': ' 區域:{{region}}', + ' Current Model: {{model}}': ' 當前模型:{{model}}', + ' Config Version: {{version}}': ' 配置版本:{{version}}', + ' Status: API key configured\n': ' 狀態:API 密鑰已配置\n', + '⚠️ Authentication Method: Alibaba Cloud Coding Plan (Incomplete)': + '⚠️ 認證方式:阿里雲百鍊 Coding Plan(不完整)', + ' Issue: API key not found in environment or settings\n': + ' 問題:在環境變量或設置中未找到 API 密鑰\n', + ' Run `qwen auth coding-plan` to re-configure.\n': + ' 運行 `qwen auth coding-plan` 重新配置。\n', + '✓ Authentication Method: {{type}}': '✓ 認證方式:{{type}}', + ' Status: Configured\n': ' 狀態:已配置\n', + 'Failed to check authentication status: {{error}}': + '檢查認證狀態失敗:{{error}}', + 'Select an option:': '請選擇:', + 'Raw mode not available. Please run in an interactive terminal.': + '原始模式不可用。請在交互式終端中運行。', + '(Use ↑ ↓ arrows to navigate, Enter to select, Ctrl+C to exit)\n': + '(使用 ↑ ↓ 箭頭導航,Enter 選擇,Ctrl+C 退出)\n', + compact: '緊湊', + 'compact mode: on (Ctrl+O off)': '緊湊模式:開(Ctrl+O 關閉)', + 'Hide tool output and thinking for a cleaner view (toggle with Ctrl+O).': + '緊湊模式下隱藏工具輸出和思考過程,界面更簡潔(Ctrl+O 切換)。', + 'Press Ctrl+O to show full tool output': '按 Ctrl+O 查看詳細工具調用結果', + 'Switch to plan mode or exit plan mode': '切換到計劃模式或退出計劃模式', + 'Exited plan mode. Previous approval mode restored.': + '已退出計劃模式,已恢復之前的審批模式。', + 'Enabled plan mode. The agent will analyze and plan without executing tools.': + '啓用計劃模式。智能體將只分析和規劃,而不執行工具。', + 'Already in plan mode. Use "/plan exit" to exit plan mode.': + '已處於計劃模式。使用 "/plan exit" 退出計劃模式。', + 'Not in plan mode. Use "/plan" to enter plan mode first.': + '未處於計劃模式。請先使用 "/plan" 進入計劃模式。', + "Set up Qwen Code's status line UI": '配置 Qwen Code 的狀態欄', +}; diff --git a/packages/cli/src/ui/hooks/usePhraseCycler.ts b/packages/cli/src/ui/hooks/usePhraseCycler.ts index 4aa202e6c..30105deee 100644 --- a/packages/cli/src/ui/hooks/usePhraseCycler.ts +++ b/packages/cli/src/ui/hooks/usePhraseCycler.ts @@ -5,7 +5,7 @@ */ import { useState, useEffect, useRef, useMemo } from 'react'; -import { t, ta } from '../../i18n/index.js'; +import { t, ta, getCurrentLanguage } from '../../i18n/index.js'; export const WITTY_LOADING_PHRASES: string[] = ["I'm Feeling Lucky"]; @@ -23,6 +23,7 @@ export const usePhraseCycler = ( customPhrases?: string[], ) => { // Get phrases from translations if available + const currentLanguage = getCurrentLanguage(); const loadingPhrases = useMemo(() => { if (customPhrases && customPhrases.length > 0) { return customPhrases; @@ -31,7 +32,8 @@ export const usePhraseCycler = ( return translatedPhrases.length > 0 ? translatedPhrases : WITTY_LOADING_PHRASES; - }, [customPhrases]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [customPhrases, currentLanguage]); const [currentLoadingPhrase, setCurrentLoadingPhrase] = useState( loadingPhrases[0], diff --git a/packages/cli/src/utils/languageUtils.test.ts b/packages/cli/src/utils/languageUtils.test.ts index 63e793015..8aa0923e8 100644 --- a/packages/cli/src/utils/languageUtils.test.ts +++ b/packages/cli/src/utils/languageUtils.test.ts @@ -22,6 +22,7 @@ vi.mock('../i18n/index.js', () => ({ getLanguageNameFromLocale: vi.fn((locale: string) => { const map: Record = { en: 'English', + 'zh-tw': 'Traditional Chinese', zh: 'Chinese', ru: 'Russian', de: 'German', @@ -30,7 +31,7 @@ vi.mock('../i18n/index.js', () => ({ fr: 'French', es: 'Spanish', }; - return map[locale] || 'English'; + return map[locale.toLowerCase()] || 'English'; }), })); @@ -123,6 +124,12 @@ describe('languageUtils', () => { expect(normalizeOutputLanguage('Ru')).toBe('Russian'); }); + it('should convert "zh-TW" (mixed case) to "Traditional Chinese"', () => { + expect(normalizeOutputLanguage('zh-TW')).toBe('Traditional Chinese'); + expect(normalizeOutputLanguage('zh-tw')).toBe('Traditional Chinese'); + expect(normalizeOutputLanguage('ZH-TW')).toBe('Traditional Chinese'); + }); + it('should preserve explicit language names as-is', () => { expect(normalizeOutputLanguage('Japanese')).toBe('Japanese'); expect(normalizeOutputLanguage('French')).toBe('French'); diff --git a/packages/core/src/core/loggingContentGenerator/loggingContentGenerator.test.ts b/packages/core/src/core/loggingContentGenerator/loggingContentGenerator.test.ts index bd1bea8b7..30c4b1235 100644 --- a/packages/core/src/core/loggingContentGenerator/loggingContentGenerator.test.ts +++ b/packages/core/src/core/loggingContentGenerator/loggingContentGenerator.test.ts @@ -405,11 +405,8 @@ describe('LoggingContentGenerator', () => { it('uses generator modalities when converting logged OpenAI requests', async () => { convertGeminiRequestToOpenAISpy.mockImplementationOnce( - (request, requestContext, options) => realConvertGeminiRequestToOpenAI( - request, - requestContext, - options, - ), + (request, requestContext, options) => + realConvertGeminiRequestToOpenAI(request, requestContext, options), ); const wrapped = createWrappedGenerator( diff --git a/packages/core/src/qwen/qwenOAuth2.ts b/packages/core/src/qwen/qwenOAuth2.ts index 68512c09b..fbe2d5b47 100644 --- a/packages/core/src/qwen/qwenOAuth2.ts +++ b/packages/core/src/qwen/qwenOAuth2.ts @@ -489,10 +489,10 @@ export enum QwenOAuth2Event { export type AuthResult = | { success: true } | { - success: false; - reason: 'timeout' | 'cancelled' | 'error' | 'rate_limit'; - message?: string; // Detailed error message for better error reporting - }; + success: false; + reason: 'timeout' | 'cancelled' | 'error' | 'rate_limit'; + message?: string; // Detailed error message for better error reporting + }; /** * Global event emitter instance for QwenOAuth2 authentication events @@ -731,13 +731,14 @@ async function authWithQwenDeviceFlow( debugLogger.info(`Please open this URL manually: ${url}`); }); - // Optional: Also listen for 'close' or 'exit' if needed for cleanup, + // Optional: Also listen for 'close' or 'exit' if needed for cleanup, // but 'error' is the main crasher. } else { // Fallback: If open() didn't return a valid process object, log a warning - debugLogger.debug('open() did not return a valid child process object.'); + debugLogger.debug( + 'open() did not return a valid child process object.', + ); } - } catch (err) { // Handle synchronous errors or promise rejections from open() const errorMessage = err instanceof Error ? err.message : String(err); diff --git a/packages/vscode-ide-companion/schemas/settings.schema.json b/packages/vscode-ide-companion/schemas/settings.schema.json index 0b0aa04be..13e230672 100644 --- a/packages/vscode-ide-companion/schemas/settings.schema.json +++ b/packages/vscode-ide-companion/schemas/settings.schema.json @@ -83,10 +83,11 @@ "default": false }, "language": { - "description": "The language for the user interface. Use \"auto\" to detect from system settings. You can also use custom language codes (e.g., \"es\", \"fr\") by placing JS language files in ~/.qwen/locales/ (e.g., ~/.qwen/locales/es.js). Options: auto, en, zh, ru, de, ja, pt, fr", + "description": "The language for the user interface. Use \"auto\" to detect from system settings. You can also use custom language codes (e.g., \"es\", \"fr\") by placing JS language files in ~/.qwen/locales/ (e.g., ~/.qwen/locales/es.js). Options: auto, en, zh-TW, zh, ru, de, ja, pt, fr", "enum": [ "auto", "en", + "zh-TW", "zh", "ru", "de", diff --git a/scripts/check-i18n.ts b/scripts/check-i18n.ts index af2486d6b..660ec24e6 100644 --- a/scripts/check-i18n.ts +++ b/scripts/check-i18n.ts @@ -13,7 +13,6 @@ import { fileURLToPath } from 'url'; import { dirname } from 'path'; // Get __dirname for ESM modules -// @ts-expect-error - import.meta is supported in NodeNext module system at runtime const __dirname = dirname(fileURLToPath(import.meta.url)); interface CheckResult { @@ -23,6 +22,7 @@ interface CheckResult { stats: { totalKeys: number; translatedKeys: number; + zhTWTranslatedKeys: number; unusedKeys: string[]; unusedKeysOnlyInLocales?: string[]; // 新增:只在 locales 中存在的未使用键 }; @@ -172,27 +172,31 @@ function checkKeyValueConsistency( } /** - * Check if en.js and zh.js have matching keys + * Check if locale files have matching keys with en.js + * @param enTranslations The en.js translations + * @param localeTranslations The target locale translations (zh.js or zh-TW.js) + * @param localeLabel Label for diagnostics (e.g., "zh.js" or "zh-TW.js") */ function checkKeyMatching( enTranslations: Record, - zhTranslations: Record, + localeTranslations: Record, + localeLabel: string, ): string[] { const errors: string[] = []; const enKeys = new Set(Object.keys(enTranslations)); - const zhKeys = new Set(Object.keys(zhTranslations)); + const localeKeys = new Set(Object.keys(localeTranslations)); - // Check for keys in en but not in zh + // Check for keys in en but not in locale for (const key of enKeys) { - if (!zhKeys.has(key)) { - errors.push(`Missing translation in zh.js: "${key}"`); + if (!localeKeys.has(key)) { + errors.push(`Missing translation in ${localeLabel}: "${key}"`); } } - // Check for keys in zh but not in en - for (const key of zhKeys) { + // Check for keys in locale but not in en + for (const key of localeKeys) { if (!enKeys.has(key)) { - errors.push(`Extra key in zh.js (not in en.js): "${key}"`); + errors.push(`Extra key in ${localeLabel} (not in en.js): "${key}"`); } } @@ -304,10 +308,12 @@ async function checkI18n(): Promise { const enPath = path.join(localesDir, 'en.js'); const zhPath = path.join(localesDir, 'zh.js'); + const zhTWPath = path.join(localesDir, 'zh-TW.js'); // Load translation files let enTranslations: Record; let zhTranslations: Record; + let zhTWTranslations: Record; try { enTranslations = await loadTranslationsFile(enPath); @@ -319,7 +325,12 @@ async function checkI18n(): Promise { success: false, errors, warnings, - stats: { totalKeys: 0, translatedKeys: 0, unusedKeys: [] }, + stats: { + totalKeys: 0, + translatedKeys: 0, + zhTWTranslatedKeys: 0, + unusedKeys: [], + }, }; } @@ -333,7 +344,31 @@ async function checkI18n(): Promise { success: false, errors, warnings, - stats: { totalKeys: 0, translatedKeys: 0, unusedKeys: [] }, + stats: { + totalKeys: 0, + translatedKeys: 0, + zhTWTranslatedKeys: 0, + unusedKeys: [], + }, + }; + } + + try { + zhTWTranslations = await loadTranslationsFile(zhTWPath); + } catch (error) { + errors.push( + `Failed to load zh-TW.js: ${error instanceof Error ? error.message : String(error)}`, + ); + return { + success: false, + errors, + warnings, + stats: { + totalKeys: 0, + translatedKeys: 0, + zhTWTranslatedKeys: 0, + unusedKeys: [], + }, }; } @@ -342,9 +377,21 @@ async function checkI18n(): Promise { errors.push(...consistencyErrors); // Check key matching between en and zh - const matchingErrors = checkKeyMatching(enTranslations, zhTranslations); + const matchingErrors = checkKeyMatching( + enTranslations, + zhTranslations, + 'zh.js', + ); errors.push(...matchingErrors); + // Check key matching between en and zh-TW + const matchingTWErrors = checkKeyMatching( + enTranslations, + zhTWTranslations, + 'zh-TW.js', + ); + errors.push(...matchingTWErrors); + // Extract used keys from source code const usedKeys = await extractUsedKeys(sourceDir); @@ -363,7 +410,8 @@ async function checkI18n(): Promise { } const totalKeys = Object.keys(enTranslations).length; - const translatedKeys = Object.keys(zhTranslations).length; + const zhTranslatedKeys = Object.keys(zhTranslations).length; + const zhTWTranslatedKeys = Object.keys(zhTWTranslations).length; return { success: errors.length === 0, @@ -371,7 +419,8 @@ async function checkI18n(): Promise { warnings, stats: { totalKeys, - translatedKeys, + translatedKeys: zhTranslatedKeys, + zhTWTranslatedKeys, unusedKeys, unusedKeysOnlyInLocales, }, diff --git a/scripts/unused-keys-only-in-locales.json b/scripts/unused-keys-only-in-locales.json index 8c0076ffd..67888a4ca 100644 --- a/scripts/unused-keys-only-in-locales.json +++ b/scripts/unused-keys-only-in-locales.json @@ -1,5 +1,5 @@ { - "generatedAt": "2026-04-22T15:40:32.318Z", + "generatedAt": "2026-04-24T07:06:13.173Z", "keys": [ " Models: Qwen latest models\n", " qwen auth qwen-oauth - Authenticate with Qwen OAuth (discontinued)",