diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3608d961b..dab4d1984 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,6 +83,9 @@ jobs: - name: 'Run sensitive keyword linter' run: 'node scripts/lint.js --sensitive-keywords' + - name: 'Run i18n check' + run: 'npm run check-i18n' + - name: 'Build CLI package' run: 'npm run build --workspace=packages/cli' diff --git a/packages/cli/src/i18n/locales/en.js b/packages/cli/src/i18n/locales/en.js index 04b195449..c2a427bdb 100644 --- a/packages/cli/src/i18n/locales/en.js +++ b/packages/cli/src/i18n/locales/en.js @@ -575,6 +575,8 @@ export default { 'Updates all extensions or a named extension to the latest version.': 'Updates all extensions or a named extension to the latest version.', 'Update all extensions.': 'Update all extensions.', + 'The name of the extension to update.': + 'The name of the extension to update.', 'Either an extension name or --all must be provided': 'Either an extension name or --all must be provided', 'Lists installed extensions.': 'Lists installed extensions.', @@ -726,6 +728,7 @@ export default { 'User Settings': 'User Settings', 'System Settings': 'System Settings', Extensions: 'Extensions', + 'Session (temporary)': 'Session (temporary)', // Hooks - Status '✓ Enabled': '✓ Enabled', '✗ Disabled': '✗ Disabled', @@ -1896,6 +1899,8 @@ export default { // Coding Plan Authentication // ============================================================================ 'API key cannot be empty.': 'API key cannot be empty.', + 'Invalid API key. Coding Plan API keys start with "sk-sp-". Please check.': + 'Invalid API key. Coding Plan API keys start with "sk-sp-". Please check.', 'You can get your Coding Plan API key here': 'You can get your Coding Plan API key here', 'API key is stored in settings.env. You can migrate it to a .env file for better security.': @@ -1973,6 +1978,8 @@ export default { 'Show context window usage breakdown.', 'Run /context detail for per-item breakdown.': 'Run /context detail for per-item breakdown.', + 'Show context window usage breakdown. Use "/context detail" for per-item breakdown.': + 'Show context window usage breakdown. Use "/context detail" for per-item breakdown.', 'body loaded': 'body loaded', memory: 'memory', '{{region}} configuration updated successfully.': diff --git a/packages/cli/src/i18n/locales/zh.js b/packages/cli/src/i18n/locales/zh.js index a1e7df51a..4c3c98ba6 100644 --- a/packages/cli/src/i18n/locales/zh.js +++ b/packages/cli/src/i18n/locales/zh.js @@ -578,6 +578,7 @@ export default { '(user)': '(用户)', '[not set]': '[未设置]', '[value stored in keychain]': '[值存储在钥匙串中]', + 'Value:': '值:', 'Manage extension settings.': '管理扩展设置。', 'You need to specify a command (set or list).': '您需要指定命令(set 或 list)。', @@ -1037,6 +1038,8 @@ export default { 'Command:': '命令:', 'Working Directory:': '工作目录:', 'Capabilities:': '功能:', + 'No server selected': '未选择服务器', + prompts: '提示', // MCP Tool List 'No tools available for this server.': '此服务器没有可用工具。', @@ -1049,7 +1052,9 @@ export default { '{{current}}/{{total}}': '{{current}}/{{total}}', // MCP Tool Detail + required: '必需', Type: '类型', + Enum: '枚举', Parameters: '参数', 'No tool selected': '未选择工具', Annotations: '注解', diff --git a/scripts/check-i18n.ts b/scripts/check-i18n.ts index 0bd745299..af2486d6b 100644 --- a/scripts/check-i18n.ts +++ b/scripts/check-i18n.ts @@ -429,15 +429,17 @@ async function main() { console.log(` - "${key}"`), ); - // Save these keys to a JSON file - const outputPath = path.join( - __dirname, - 'unused-keys-only-in-locales.json', - ); - saveKeysOnlyInLocalesToJson( - result.stats.unusedKeysOnlyInLocales, - outputPath, - ); + // Save these keys to a JSON file (skip in CI to avoid dirtying the working tree) + if (!process.env['CI']) { + const outputPath = path.join( + __dirname, + 'unused-keys-only-in-locales.json', + ); + saveKeysOnlyInLocalesToJson( + result.stats.unusedKeysOnlyInLocales, + outputPath, + ); + } } console.log(); diff --git a/scripts/unused-keys-only-in-locales.json b/scripts/unused-keys-only-in-locales.json index 45097f8da..8c0076ffd 100644 --- a/scripts/unused-keys-only-in-locales.json +++ b/scripts/unused-keys-only-in-locales.json @@ -1,62 +1,229 @@ { - "generatedAt": "2026-01-07T14:56:23.662Z", + "generatedAt": "2026-04-22T15:40:32.318Z", "keys": [ - " - en-US: English", - " - zh-CN: Simplified Chinese", + " Models: Qwen latest models\n", + " qwen auth qwen-oauth - Authenticate with Qwen OAuth (discontinued)", + "(Press Enter to submit, Escape to cancel)", + "(Press Esc to close)", + "(Press Escape to go back)", + "(esc to cancel, {{time}})", + "(set)", "A checkpoint with the tag {{tag}} already exists. Do you want to overwrite it?", + "API Key:", + "API key is stored in settings.env. You can migrate it to a .env file for better security.", + "API-KEY", + "About Qwen Code", + "Accept suggestion / Autocomplete", + "Add content to global memory.", + "Add content to project-level memory.", + "Add content to the memory. Use --global for global memory or --project for project memory.", + "Add file context", + "Any other key", "Apply to current session only (temporary)", "Approval mode changed to: {{mode}}", "Approval mode changed to: {{mode}} (saved to {{scope}} settings{{location}})", + "Attempting to save to global memory: \"{{text}}\"", + "Attempting to save to memory {{scope}}: \"{{fact}}\"", + "Attempting to save to project memory: \"{{text}}\"", + "Auth Method", + "Authenticate with an OAuth-enabled MCP server", + "Authenticated successfully with {{region}}. API key and model configs saved to settings.json (backed up).", "Auto-edit mode - Automatically approve file edits", "Available approval modes:", + "CLI Version", + "Cannot ask user questions in non-interactive mode. Please run in interactive mode to use this tool.", "Change auth (executes the /auth command)", "Chat history is already compressed.", + "Checking...", + "Coding Plan API key not found. Please re-authenticate with Coding Plan.", + "Coding Plan configuration updated successfully. New models are now available.", + "Commands for interacting with memory.", + "Configured Hooks ({{count}} total)", "Continue with {{model}}", "Conversation checkpoint '{{tag}}' has been deleted.", "Conversation checkpoint saved with tag: {{tag}}.", "Conversation shared to {{filePath}}", + "Current (effective) configuration", "Current approval mode: {{mode}}", + "Current memory content from {{count}} file(s):", + "Cursor: session={{sessionId}}, offset={{offset}}, updated={{updatedAt}}", + "Deduplicated entries: {{count}}", "Default mode - Require approval for file edits or shell commands", "Delete a conversation checkpoint. Usage: /chat delete ", + "Destructive", + "Disable Auto Update", + "Disable Cache Control", + "Disable Fuzzy Search", + "Disable Loading Phrases", + "Disable Server", + "Disable an active hook", + "Disable an extension", "Enable Prompt Completion", + "Enable Tool Output Truncation", + "Enable a disabled hook", + "Enable an extension", "Error sharing conversation: {{error}}", "Error: No checkpoint found with tag '{{tag}}'.", + "Example: /language output Português", + "Extension \"{{name}}\" disabled for scope \"{{scope}}\"", + "Extension \"{{name}}\" disabled successfully.", + "Extension \"{{name}}\" enabled for scope \"{{scope}}\"", + "Extension \"{{name}}\" enabled successfully.", + "Extension \"{{name}}\" uninstalled successfully.", + "Failed to authenticate with MCP server '{{name}}': {{error}}", "Failed to change approval mode: {{error}}", "Failed to login. Message: {{message}}", + "Failed to process user answers:", "Failed to save approval mode: {{error}}", "Failed to switch model to '{{modelId}}'.\n\n{{error}}", + "Failed to uninstall extension \"{{name}}\": {{error}}", + "Failed to update extension \"{{name}}\": {{error}}", + "Failed to validate credentials", + "Get started", + "Git Commit", + "Global memory content:\n\n---\n{{content}}\n---", + "Global memory file not found or is currently empty.", + "Global memory is currently empty.", + "IDE Mode", + "If the browser does not open, copy and paste this URL into your browser:", + "Installs an extension from a git repository URL, local path, or claude marketplace (marketplace-url:plugin-name).", + "Invalid credentials: {{errorMessage}}", "Invalid file format. Only .md and .json are supported.", - "Invalid language. Available: en-US, zh-CN", + "LLM output language not set", + "LLM output language rule file generated at {{path}}", + "List active extensions", + "List available Qwen Code tools. Usage: /tools [desc]", + "List configured MCP servers and tools", + "List configured MCP servers and tools, or authenticate with OAuth-enabled servers", "List of saved conversations:", "List saved conversation checkpoints", + "MCP Management", + "MCP server '{{name}}' not found.", + "MCP servers with OAuth authentication:", + "Make sure to copy the COMPLETE URL - it may wrap across multiple lines.", "Manage conversation history.", + "Managed auto-memory dream found nothing to improve.", + "Managed auto-memory extraction found no new durable memories.", + "Managed auto-memory extraction is already running.", + "Managed auto-memory root: {{root}}", + "Managed auto-memory topics:", + "Memory Discovery Max Dirs", + "Memory is currently empty.", "Missing tag. Usage: /chat delete ", "Missing tag. Usage: /chat resume ", "Missing tag. Usage: /chat save ", + "More instructions about configuring `modelProviders` manually.", + "NPM Version", + "New model configurations are available for Alibaba Cloud Coding Plan. Update now?", + "No MCP servers configured with OAuth authentication.", + "No chat client available to extract memory.", "No chat client available to save conversation.", "No chat client available to share conversation.", "No conversation found to save.", "No conversation found to share.", + "No extensions found.", + "No extraction cursor found yet.", + "No hooks configured. Add hooks in your settings.json file.", "No saved checkpoint found with tag: {{tag}}.", "No saved conversation checkpoints found.", + "Node.js Version", + "Not Sure Yet", "Note: Newest last, oldest first", + "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.", + "Note: Your existing API key will not be cleared when using Qwen OAuth.", + "OS Arch", + "OS Platform", + "OS Release", + "Open MCP management dialog, or authenticate with OAuth-enabled servers", + "Open World", + "Open command menu", "OpenAI API key is required to use OpenAI authentication.", + "OpenAI Configuration Required", + "Or scan the QR code below:", + "Paste your api key of ModelStudio Coding Plan and you're all set!", "Persist for this project/workspace", "Persist for this user on this machine", "Plan mode - Analyze only, do not modify files or execute commands", + "Please answer the following question(s):", + "Please enter your OpenAI configuration. You can get an API key from", + "Press ? again to close", + "Press Enter or Esc to go back", + "Press Enter to continue, Tab/↑↓ to navigate, Esc to cancel", + "Press Enter to start authentication, Esc to go back", + "Press Y/Enter to confirm, N/Esc to cancel", "Pro quota limit reached for {{model}}.", + "Project memory content from {{path}}:\n\n---\n{{content}}\n---", + "Project memory file not found or is currently empty.", + "Project memory is currently empty.", + "Project settings (local)", + "Qwen 3.6 Plus — efficient hybrid model with leading coding performance", "Qwen OAuth authentication cancelled.", "Qwen OAuth authentication timed out. Please try again.", + "Qwen OAuth free tier was discontinued on 2026-04-15. Run /auth to switch provider.", + "Rate limit error: {{reason}}", + "Read Only", + "Refresh the memory from the source.", + "Refreshing memory from source files...", + "Restarting MCP servers...", + "Restarts MCP servers.", "Resume a conversation from a checkpoint. Usage: /chat resume ", + "Reverse search history", + "Run managed auto-memory extraction for the current session.", + "Save a durable memory using the save_memory tool.", "Save the current conversation as a checkpoint. Usage: /chat save ", + "Saved in .qwen/settings.local.json", "Scope subcommands do not accept additional arguments.", - "Set UI language to English (en-US)", - "Set UI language to Simplified Chinese (zh-CN)", + "Select API-KEY configuration mode:", + "Select the scope for this action:", "Settings service is not available; unable to persist the approval mode.", "Share the current conversation to a markdown or json file. Usage: /chat share ", + "Show global memory contents.", + "Show managed auto-memory status.", + "Show project-level memory contents.", + "Show the current memory contents.", + "The command \"/{{command}}\" is not supported in non-interactive mode.", + "The latest Qwen Vision model from Alibaba Cloud ModelStudio (version: qwen3-vl-plus-2025-09-23)", + "This extension will exclude the following core tools: {{tools}}", + "Toggle shell mode", + "Toggle this help display", + "Tools for {{name}}", + "Uninstall an extension", + "Uninstalling extension \"{{name}}\"...", + "Unsupported scope \"{{scope}}\", should be one of \"user\" or \"workspace\"", + "Up to date", + "Update available", + "Update extensions. Usage: update |--all", "Usage: /approval-mode [--session|--user|--project]", - "Usage: /language ui [zh-CN|en-US]", - "YOLO mode - Automatically approve all tools" + "Usage: /extensions uninstall ", + "Usage: /extensions update |--all", + "Usage: /extensions {{command}} [--scope=]", + "Usage: /memory add --global ", + "Usage: /memory add --project ", + "Usage: /memory add [--global|--project] ", + "Usage: /remember [--global|--project] ", + "Use /mcp auth to authenticate.", + "Use /trust to manage folder trust settings for this workspace.", + "Use coding plan credentials or your own api-keys/providers.", + "User - Applies to all projects", + "User Scope", + "User declined to answer the questions.", + "User has provided the following answers:", + "View Extension", + "Vision Model Preview", + "Workspace - Applies to current project only", + "Workspace Scope", + "Y/Enter to confirm, N/Esc to cancel", + "YOLO mode - Automatically approve all tools", + "Yes, allow always ...", + "Yes, allow always for this session", + "Yes, always allow all tools from server \"{{server}}\"", + "Yes, always allow tool \"{{tool}}\" from server \"{{server}}\"", + "change the auth method", + "compact mode: on (Ctrl+O off)", + "↑/↓: Navigate | Space/Enter: Toggle | Esc: Cancel", + "↑/↓: Navigate | ←/→: Switch tabs | Space/Enter: Toggle | Esc: Cancel", + "✓ Enabled", + "✗ Disabled" ], - "count": 56 + "count": 223 }