add multi-language for hooks ui

This commit is contained in:
DennisYu07 2026-03-24 14:49:16 +08:00
parent b08154dbee
commit 7a53185dbf
11 changed files with 844 additions and 171 deletions

View file

@ -594,6 +594,112 @@ export default {
'List all configured hooks': 'Alle konfigurierten Hooks auflisten', 'List all configured hooks': 'Alle konfigurierten Hooks auflisten',
'Enable a disabled hook': 'Einen deaktivierten Hook aktivieren', 'Enable a disabled hook': 'Einen deaktivierten Hook aktivieren',
'Disable an active hook': 'Einen aktiven Hook deaktivieren', 'Disable an active hook': 'Einen aktiven Hook deaktivieren',
// Hooks - Dialog
Hooks: 'Hooks',
'Loading hooks...': 'Hooks werden geladen...',
'Error loading hooks:': 'Fehler beim Laden der Hooks:',
'Press Escape to close': 'Escape zum Schließen drücken',
'No hook selected': 'Kein Hook ausgewählt',
// Hooks - List Step
'No hook events found.': 'Keine Hook-Ereignisse gefunden.',
'{{count}} hook configured': '{{count}} Hook konfiguriert',
'{{count}} hooks configured': '{{count}} Hooks konfiguriert',
'This menu is read-only. To add or modify hooks, edit settings.json directly or ask Qwen Code.':
'Dieses Menü ist schreibgeschützt. Um Hooks hinzuzufügen oder zu ändern, bearbeiten Sie settings.json direkt oder fragen Sie Qwen Code.',
'Enter to select · Esc to cancel': 'Enter zum Auswählen · Esc zum Abbrechen',
// Hooks - Detail Step
'Exit codes:': 'Exit-Codes:',
'Configured hooks:': 'Konfigurierte Hooks:',
'No hooks configured for this event.':
'Für dieses Ereignis sind keine Hooks konfiguriert.',
'To add hooks, edit settings.json directly or ask Qwen.':
'Um Hooks hinzuzufügen, bearbeiten Sie settings.json direkt oder fragen Sie Qwen.',
// Hooks - Source
Project: 'Projekt',
User: 'Benutzer',
System: 'System',
Extension: 'Erweiterung',
'Local Settings': 'Lokale Einstellungen',
'User Settings': 'Benutzereinstellungen',
'System Settings': 'Systemeinstellungen',
Extensions: 'Erweiterungen',
// Hooks - Status
'✓ Enabled': '✓ Aktiviert',
'✗ Disabled': '✗ Deaktiviert',
// Hooks - Event Descriptions (short)
'Before tool execution': 'Vor der Tool-Ausführung',
'After tool execution': 'Nach der Tool-Ausführung',
'After tool execution fails': 'Wenn die Tool-Ausführung fehlschlägt',
'When notifications are sent': 'Wenn Benachrichtigungen gesendet werden',
'When the user submits a prompt': 'Wenn der Benutzer einen Prompt absendet',
'When a new session is started': 'Wenn eine neue Sitzung gestartet wird',
'Right before Qwen Code concludes its response':
'Direkt bevor Qwen Code seine Antwort abschließt',
'When a subagent (Agent tool call) is started':
'Wenn ein Subagent (Agent-Tool-Aufruf) gestartet wird',
'Right before a subagent concludes its response':
'Direkt bevor ein Subagent seine Antwort abschließt',
'Before conversation compaction': 'Vor der Gesprächskomprimierung',
'When a session is ending': 'Wenn eine Sitzung endet',
'When a permission dialog is displayed':
'Wenn ein Berechtigungsdialog angezeigt wird',
// Hooks - Event Descriptions (detailed)
'Input to command is JSON of tool call arguments.':
'Die Eingabe an den Befehl ist JSON der Tool-Aufruf-Argumente.',
'Input to command is JSON with fields "inputs" (tool call arguments) and "response" (tool call response).':
'Die Eingabe an den Befehl ist JSON mit den Feldern "inputs" (Tool-Aufruf-Argumente) und "response" (Tool-Aufruf-Antwort).',
'Input to command is JSON with tool_name, tool_input, tool_use_id, error, error_type, is_interrupt, and is_timeout.':
'Die Eingabe an den Befehl ist JSON mit tool_name, tool_input, tool_use_id, error, error_type, is_interrupt und is_timeout.',
'Input to command is JSON with notification message and type.':
'Die Eingabe an den Befehl ist JSON mit Benachrichtigungsnachricht und -typ.',
'Input to command is JSON with original user prompt text.':
'Die Eingabe an den Befehl ist JSON mit dem ursprünglichen Benutzer-Prompt-Text.',
'Input to command is JSON with session start source.':
'Die Eingabe an den Befehl ist JSON mit der Sitzungsstart-Quelle.',
'Input to command is JSON with session end reason.':
'Die Eingabe an den Befehl ist JSON mit dem Sitzungsende-Grund.',
'Input to command is JSON with agent_id and agent_type.':
'Die Eingabe an den Befehl ist JSON mit agent_id und agent_type.',
'Input to command is JSON with agent_id, agent_type, and agent_transcript_path.':
'Die Eingabe an den Befehl ist JSON mit agent_id, agent_type und agent_transcript_path.',
'Input to command is JSON with compaction details.':
'Die Eingabe an den Befehl ist JSON mit Komprimierungsdetails.',
'Input to command is JSON with tool_name, tool_input, and tool_use_id. Output JSON with hookSpecificOutput containing decision to allow or deny.':
'Die Eingabe an den Befehl ist JSON mit tool_name, tool_input und tool_use_id. Ausgabe ist JSON mit hookSpecificOutput, das die Entscheidung zum Zulassen oder Ablehnen enthält.',
// Hooks - Exit Code Descriptions
'stdout/stderr not shown': 'stdout/stderr nicht angezeigt',
'show stderr to model and continue conversation':
'stderr dem Modell anzeigen und Konversation fortsetzen',
'show stderr to user only': 'stderr nur dem Benutzer anzeigen',
'stdout shown in transcript mode (ctrl+o)':
'stdout im Transkriptmodus angezeigt (ctrl+o)',
'show stderr to model immediately': 'stderr sofort dem Modell anzeigen',
'show stderr to user only but continue with tool call':
'stderr nur dem Benutzer anzeigen, aber mit Tool-Aufruf fortfahren',
'block processing, erase original prompt, and show stderr to user only':
'Verarbeitung blockieren, ursprünglichen Prompt löschen und stderr nur dem Benutzer anzeigen',
'stdout shown to model': 'stdout dem Modell anzeigen',
'show stderr to user only (blocking errors ignored)':
'stderr nur dem Benutzer anzeigen (Blockierungsfehler ignoriert)',
'command completes successfully': 'Befehl erfolgreich abgeschlossen',
'stdout shown to subagent': 'stdout dem Subagenten anzeigen',
'show stderr to subagent and continue having it run':
'stderr dem Subagenten anzeigen und ihn weiterlaufen lassen',
'stdout appended as custom compact instructions':
'stdout als benutzerdefinierte Komprimierungsanweisungen angehängt',
'block compaction': 'Komprimierung blockieren',
'show stderr to user only but continue with compaction':
'stderr nur dem Benutzer anzeigen, aber mit Komprimierung fortfahren',
'use hook decision if provided':
'Hook-Entscheidung verwenden, falls bereitgestellt',
// Hooks - Messages
'Config not loaded.': 'Konfiguration nicht geladen.',
'Hooks are not enabled. Enable hooks in settings to use this feature.':
'Hooks sind nicht aktiviert. Aktivieren Sie Hooks in den Einstellungen, um diese Funktion zu nutzen.',
'No hooks configured. Add hooks in your settings.json file.':
'Keine Hooks konfiguriert. Fügen Sie Hooks in Ihrer settings.json-Datei hinzu.',
'Configured Hooks ({{count}} total)':
'Konfigurierte Hooks ({{count}} insgesamt)',
// ============================================================================ // ============================================================================
// Commands - Session Export // Commands - Session Export
@ -708,7 +814,6 @@ export default {
'Workspace approval mode exists and takes priority. User-level change will have no effect.': 'Workspace approval mode exists and takes priority. User-level change will have no effect.':
'Arbeitsbereich-Genehmigungsmodus existiert und hat Vorrang. Benutzerebene-Änderung hat keine Wirkung.', 'Arbeitsbereich-Genehmigungsmodus existiert und hat Vorrang. Benutzerebene-Änderung hat keine Wirkung.',
'Apply To': 'Anwenden auf', 'Apply To': 'Anwenden auf',
'User Settings': 'Benutzereinstellungen',
'Workspace Settings': 'Arbeitsbereich-Einstellungen', 'Workspace Settings': 'Arbeitsbereich-Einstellungen',
// ============================================================================ // ============================================================================
@ -763,7 +868,6 @@ export default {
'List configured MCP servers and tools': 'List configured MCP servers and tools':
'Konfigurierte MCP-Server und Werkzeuge auflisten', 'Konfigurierte MCP-Server und Werkzeuge auflisten',
'Restarts MCP servers.': 'MCP-Server neu starten.', 'Restarts MCP servers.': 'MCP-Server neu starten.',
'Config not loaded.': 'Konfiguration nicht geladen.',
'Could not retrieve tool registry.': 'Could not retrieve tool registry.':
'Werkzeugregister konnte nicht abgerufen werden.', 'Werkzeugregister konnte nicht abgerufen werden.',
'No MCP servers configured with OAuth authentication.': 'No MCP servers configured with OAuth authentication.':
@ -972,7 +1076,6 @@ export default {
'No server selected': 'Kein Server ausgewählt', 'No server selected': 'Kein Server ausgewählt',
'(disabled)': '(deaktiviert)', '(disabled)': '(deaktiviert)',
'Error:': 'Fehler:', 'Error:': 'Fehler:',
Extension: 'Erweiterung',
tool: 'Werkzeug', tool: 'Werkzeug',
tools: 'Werkzeuge', tools: 'Werkzeuge',
connected: 'verbunden', connected: 'verbunden',

View file

@ -668,6 +668,109 @@ export default {
'List all configured hooks': 'List all configured hooks', 'List all configured hooks': 'List all configured hooks',
'Enable a disabled hook': 'Enable a disabled hook', 'Enable a disabled hook': 'Enable a disabled hook',
'Disable an active hook': 'Disable an active hook', 'Disable an active hook': 'Disable an active hook',
// Hooks - Dialog
Hooks: 'Hooks',
'Loading hooks...': 'Loading hooks...',
'Error loading hooks:': 'Error loading hooks:',
'Press Escape to close': 'Press Escape to close',
'No hook selected': 'No hook selected',
// Hooks - List Step
'No hook events found.': 'No hook events found.',
'{{count}} hook configured': '{{count}} hook configured',
'{{count}} hooks configured': '{{count}} hooks configured',
'This menu is read-only. To add or modify hooks, edit settings.json directly or ask Qwen Code.':
'This menu is read-only. To add or modify hooks, edit settings.json directly or ask Qwen Code.',
'Enter to select · Esc to cancel': 'Enter to select · Esc to cancel',
// Hooks - Detail Step
'Exit codes:': 'Exit codes:',
'Configured hooks:': 'Configured hooks:',
'No hooks configured for this event.': 'No hooks configured for this event.',
'To add hooks, edit settings.json directly or ask Qwen.':
'To add hooks, edit settings.json directly or ask Qwen.',
// Hooks - Source
Project: 'Project',
User: 'User',
System: 'System',
Extension: 'Extension',
'Local Settings': 'Local Settings',
'User Settings': 'User Settings',
'System Settings': 'System Settings',
Extensions: 'Extensions',
// Hooks - Status
'✓ Enabled': '✓ Enabled',
'✗ Disabled': '✗ Disabled',
// Hooks - Event Descriptions (short)
'Before tool execution': 'Before tool execution',
'After tool execution': 'After tool execution',
'After tool execution fails': 'After tool execution fails',
'When notifications are sent': 'When notifications are sent',
'When the user submits a prompt': 'When the user submits a prompt',
'When a new session is started': 'When a new session is started',
'Right before Qwen Code concludes its response':
'Right before Qwen Code concludes its response',
'When a subagent (Agent tool call) is started':
'When a subagent (Agent tool call) is started',
'Right before a subagent concludes its response':
'Right before a subagent concludes its response',
'Before conversation compaction': 'Before conversation compaction',
'When a session is ending': 'When a session is ending',
'When a permission dialog is displayed':
'When a permission dialog is displayed',
// Hooks - Event Descriptions (detailed)
'Input to command is JSON of tool call arguments.':
'Input to command is JSON of tool call arguments.',
'Input to command is JSON with fields "inputs" (tool call arguments) and "response" (tool call response).':
'Input to command is JSON with fields "inputs" (tool call arguments) and "response" (tool call response).',
'Input to command is JSON with tool_name, tool_input, tool_use_id, error, error_type, is_interrupt, and is_timeout.':
'Input to command is JSON with tool_name, tool_input, tool_use_id, error, error_type, is_interrupt, and is_timeout.',
'Input to command is JSON with notification message and type.':
'Input to command is JSON with notification message and type.',
'Input to command is JSON with original user prompt text.':
'Input to command is JSON with original user prompt text.',
'Input to command is JSON with session start source.':
'Input to command is JSON with session start source.',
'Input to command is JSON with session end reason.':
'Input to command is JSON with session end reason.',
'Input to command is JSON with agent_id and agent_type.':
'Input to command is JSON with agent_id and agent_type.',
'Input to command is JSON with agent_id, agent_type, and agent_transcript_path.':
'Input to command is JSON with agent_id, agent_type, and agent_transcript_path.',
'Input to command is JSON with compaction details.':
'Input to command is JSON with compaction details.',
'Input to command is JSON with tool_name, tool_input, and tool_use_id. Output JSON with hookSpecificOutput containing decision to allow or deny.':
'Input to command is JSON with tool_name, tool_input, and tool_use_id. Output JSON with hookSpecificOutput containing decision to allow or deny.',
// Hooks - Exit Code Descriptions
'stdout/stderr not shown': 'stdout/stderr not shown',
'show stderr to model and continue conversation':
'show stderr to model and continue conversation',
'show stderr to user only': 'show stderr to user only',
'stdout shown in transcript mode (ctrl+o)':
'stdout shown in transcript mode (ctrl+o)',
'show stderr to model immediately': 'show stderr to model immediately',
'show stderr to user only but continue with tool call':
'show stderr to user only but continue with tool call',
'block processing, erase original prompt, and show stderr to user only':
'block processing, erase original prompt, and show stderr to user only',
'stdout shown to model': 'stdout shown to model',
'show stderr to user only (blocking errors ignored)':
'show stderr to user only (blocking errors ignored)',
'command completes successfully': 'command completes successfully',
'stdout shown to subagent': 'stdout shown to subagent',
'show stderr to subagent and continue having it run':
'show stderr to subagent and continue having it run',
'stdout appended as custom compact instructions':
'stdout appended as custom compact instructions',
'block compaction': 'block compaction',
'show stderr to user only but continue with compaction':
'show stderr to user only but continue with compaction',
'use hook decision if provided': 'use hook decision if provided',
// Hooks - Messages
'Config not loaded.': 'Config not loaded.',
'Hooks are not enabled. Enable hooks in settings to use this feature.':
'Hooks are not enabled. Enable hooks in settings to use this feature.',
'No hooks configured. Add hooks in your settings.json file.':
'No hooks configured. Add hooks in your settings.json file.',
'Configured Hooks ({{count}} total)': 'Configured Hooks ({{count}} total)',
// ============================================================================ // ============================================================================
// Commands - Session Export // Commands - Session Export
@ -775,7 +878,6 @@ export default {
'Workspace approval mode exists and takes priority. User-level change will have no effect.': 'Workspace approval mode exists and takes priority. User-level change will have no effect.':
'Workspace approval mode exists and takes priority. User-level change will have no effect.', 'Workspace approval mode exists and takes priority. User-level change will have no effect.',
'Apply To': 'Apply To', 'Apply To': 'Apply To',
'User Settings': 'User Settings',
'Workspace Settings': 'Workspace Settings', 'Workspace Settings': 'Workspace Settings',
// ============================================================================ // ============================================================================
@ -829,7 +931,6 @@ export default {
'List configured MCP servers and tools', 'List configured MCP servers and tools',
'Restarts MCP servers.': 'Restarts MCP servers.', 'Restarts MCP servers.': 'Restarts MCP servers.',
'Open MCP management dialog': 'Open MCP management dialog', 'Open MCP management dialog': 'Open MCP management dialog',
'Config not loaded.': 'Config not loaded.',
'Could not retrieve tool registry.': 'Could not retrieve tool registry.', 'Could not retrieve tool registry.': 'Could not retrieve tool registry.',
'No MCP servers configured with OAuth authentication.': 'No MCP servers configured with OAuth authentication.':
'No MCP servers configured with OAuth authentication.', 'No MCP servers configured with OAuth authentication.',
@ -895,7 +996,6 @@ export default {
prompts: 'prompts', prompts: 'prompts',
'(disabled)': '(disabled)', '(disabled)': '(disabled)',
'Error:': 'Error:', 'Error:': 'Error:',
Extension: 'Extension',
tool: 'tool', tool: 'tool',
tools: 'tools', tools: 'tools',
connected: 'connected', connected: 'connected',

View file

@ -380,6 +380,109 @@ export default {
'List all configured hooks': '設定済みのフックをすべて表示する', 'List all configured hooks': '設定済みのフックをすべて表示する',
'Enable a disabled hook': '無効なフックを有効にする', 'Enable a disabled hook': '無効なフックを有効にする',
'Disable an active hook': '有効なフックを無効にする', 'Disable an active hook': '有効なフックを無効にする',
// Hooks - Dialog
Hooks: 'フック',
'Loading hooks...': 'フックを読み込んでいます...',
'Error loading hooks:': 'フックの読み込みエラー:',
'Press Escape to close': 'Escape キーで閉じる',
'No hook selected': 'フックが選択されていません',
// Hooks - List Step
'No hook events found.': 'フックイベントが見つかりません。',
'{{count}} hook configured': '{{count}} 件のフックが設定されています',
'{{count}} hooks configured': '{{count}} 件のフックが設定されています',
'This menu is read-only. To add or modify hooks, edit settings.json directly or ask Qwen Code.':
'このメニューは読み取り専用です。フックを追加または変更するには、settings.json を直接編集するか、Qwen Code に尋ねてください。',
'Enter to select · Esc to cancel': 'Enter で選択 · Esc でキャンセル',
// Hooks - Detail Step
'Exit codes:': '終了コード:',
'Configured hooks:': '設定済みのフック:',
'No hooks configured for this event.':
'このイベントにはフックが設定されていません。',
'To add hooks, edit settings.json directly or ask Qwen.':
'フックを追加するには、settings.json を直接編集するか、Qwen に尋ねてください。',
// Hooks - Source
Project: 'プロジェクト',
User: 'ユーザー',
System: 'システム',
Extension: '拡張機能',
'Local Settings': 'ローカル設定',
'User Settings': 'ユーザー設定',
'System Settings': 'システム設定',
Extensions: '拡張機能',
// Hooks - Status
'✓ Enabled': '✓ 有効',
'✗ Disabled': '✗ 無効',
// Hooks - Event Descriptions (short)
'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': '権限ダイアログ表示時',
// Hooks - Event Descriptions (detailed)
'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 を出力します。',
// Hooks - Exit Code Descriptions
'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 model': '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': '提供されている場合はフックの決定を使用',
// Hooks - Messages
'Config not loaded.': '設定が読み込まれていません。',
'Hooks are not enabled. Enable hooks in settings to use this feature.':
'フックが有効になっていません。この機能を使用するには設定でフックを有効にしてください。',
'No hooks configured. Add hooks in your settings.json file.':
'フックが設定されていません。settings.json ファイルにフックを追加してください。',
'Configured Hooks ({{count}} total)': '設定済みのフック(合計 {{count}} 件)',
// ============================================================================ // ============================================================================
// Commands - Session Export // Commands - Session Export
@ -480,7 +583,6 @@ export default {
'(Use Enter to select, Tab to change focus)': '(Use Enter to select, Tab to change focus)':
'(Enter で選択、Tab でフォーカス変更)', '(Enter で選択、Tab でフォーカス変更)',
'Apply To': '適用先', 'Apply To': '適用先',
'User Settings': 'ユーザー設定',
'Workspace Settings': 'ワークスペース設定', 'Workspace Settings': 'ワークスペース設定',
// Memory // Memory
'Commands for interacting with memory.': 'メモリ操作のコマンド', 'Commands for interacting with memory.': 'メモリ操作のコマンド',
@ -527,7 +629,6 @@ export default {
'設定済みのMCPサーバーとツールを一覧表示', '設定済みのMCPサーバーとツールを一覧表示',
'No MCP servers configured.': 'MCPサーバーが設定されていません', 'No MCP servers configured.': 'MCPサーバーが設定されていません',
'Restarts MCP servers.': 'MCPサーバーを再起動します', 'Restarts MCP servers.': 'MCPサーバーを再起動します',
'Config not loaded.': '設定が読み込まれていません',
'Could not retrieve tool registry.': 'ツールレジストリを取得できませんでした', 'Could not retrieve tool registry.': 'ツールレジストリを取得できませんでした',
'No MCP servers configured with OAuth authentication.': 'No MCP servers configured with OAuth authentication.':
'OAuth認証が設定されたMCPサーバーはありません', 'OAuth認証が設定されたMCPサーバーはありません',
@ -712,7 +813,6 @@ export default {
'No server selected': 'サーバーが選択されていません', 'No server selected': 'サーバーが選択されていません',
'(disabled)': '(無効)', '(disabled)': '(無効)',
'Error:': 'エラー:', 'Error:': 'エラー:',
Extension: '拡張機能',
tool: 'ツール', tool: 'ツール',
tools: 'ツール', tools: 'ツール',
connected: '接続済み', connected: '接続済み',

View file

@ -599,6 +599,111 @@ export default {
'List all configured hooks': 'Listar todos os hooks configurados', 'List all configured hooks': 'Listar todos os hooks configurados',
'Enable a disabled hook': 'Ativar um hook desativado', 'Enable a disabled hook': 'Ativar um hook desativado',
'Disable an active hook': 'Desativar um hook ativo', 'Disable an active hook': 'Desativar um hook ativo',
// Hooks - Dialog
Hooks: 'Hooks',
'Loading hooks...': 'Carregando hooks...',
'Error loading hooks:': 'Erro ao carregar hooks:',
'Press Escape to close': 'Pressione Escape para fechar',
'No hook selected': 'Nenhum hook selecionado',
// Hooks - List Step
'No hook events found.': 'Nenhum evento de hook encontrado.',
'{{count}} hook configured': '{{count}} hook configurado',
'{{count}} hooks configured': '{{count}} hooks configurados',
'This menu is read-only. To add or modify hooks, edit settings.json directly or ask Qwen Code.':
'Este menu é somente leitura. Para adicionar ou modificar hooks, edite settings.json diretamente ou pergunte ao Qwen Code.',
'Enter to select · Esc to cancel':
'Enter para selecionar · Esc para cancelar',
// Hooks - Detail Step
'Exit codes:': 'Códigos de saída:',
'Configured hooks:': 'Hooks configurados:',
'No hooks configured for this event.':
'Nenhum hook configurado para este evento.',
'To add hooks, edit settings.json directly or ask Qwen.':
'Para adicionar hooks, edite settings.json diretamente ou pergunte ao Qwen.',
// Hooks - Source
Project: 'Projeto',
User: 'Usuário',
System: 'Sistema',
Extension: 'Extensão',
'Local Settings': 'Configurações Locais',
'User Settings': 'Configurações do Usuário',
'System Settings': 'Configurações do Sistema',
Extensions: 'Extensões',
// Hooks - Status
'✓ Enabled': '✓ Ativado',
'✗ Disabled': '✗ Desativado',
// Hooks - Event Descriptions (short)
'Before tool execution': 'Antes da execução da ferramenta',
'After tool execution': 'Após a execução da ferramenta',
'After tool execution fails': 'Após a falha da execução da ferramenta',
'When notifications are sent': 'Quando notificações são enviadas',
'When the user submits a prompt': 'Quando o usuário envia um prompt',
'When a new session is started': 'Quando uma nova sessão é iniciada',
'Right before Qwen Code concludes its response':
'Logo antes do Qwen Code concluir sua resposta',
'When a subagent (Agent tool call) is started':
'Quando um subagente (chamada de ferramenta Agent) é iniciado',
'Right before a subagent concludes its response':
'Logo antes de um subagente concluir sua resposta',
'Before conversation compaction': 'Antes da compactação da conversa',
'When a session is ending': 'Quando uma sessão está terminando',
'When a permission dialog is displayed':
'Quando um diálogo de permissão é exibido',
// Hooks - Event Descriptions (detailed)
'Input to command is JSON of tool call arguments.':
'A entrada para o comando é JSON dos argumentos da chamada da ferramenta.',
'Input to command is JSON with fields "inputs" (tool call arguments) and "response" (tool call response).':
'A entrada para o comando é JSON com campos "inputs" (argumentos da chamada da ferramenta) e "response" (resposta da chamada da ferramenta).',
'Input to command is JSON with tool_name, tool_input, tool_use_id, error, error_type, is_interrupt, and is_timeout.':
'A entrada para o comando é JSON com tool_name, tool_input, tool_use_id, error, error_type, is_interrupt e is_timeout.',
'Input to command is JSON with notification message and type.':
'A entrada para o comando é JSON com mensagem e tipo de notificação.',
'Input to command is JSON with original user prompt text.':
'A entrada para o comando é JSON com o texto original do prompt do usuário.',
'Input to command is JSON with session start source.':
'A entrada para o comando é JSON com a fonte de início da sessão.',
'Input to command is JSON with session end reason.':
'A entrada para o comando é JSON com o motivo do fim da sessão.',
'Input to command is JSON with agent_id and agent_type.':
'A entrada para o comando é JSON com agent_id e agent_type.',
'Input to command is JSON with agent_id, agent_type, and agent_transcript_path.':
'A entrada para o comando é JSON com agent_id, agent_type e agent_transcript_path.',
'Input to command is JSON with compaction details.':
'A entrada para o comando é JSON com detalhes da compactação.',
'Input to command is JSON with tool_name, tool_input, and tool_use_id. Output JSON with hookSpecificOutput containing decision to allow or deny.':
'A entrada para o comando é JSON com tool_name, tool_input e tool_use_id. Saída é JSON com hookSpecificOutput contendo decisão de permitir ou negar.',
// Hooks - Exit Code Descriptions
'stdout/stderr not shown': 'stdout/stderr não exibido',
'show stderr to model and continue conversation':
'mostrar stderr ao modelo e continuar conversa',
'show stderr to user only': 'mostrar stderr apenas ao usuário',
'stdout shown in transcript mode (ctrl+o)':
'stdout exibido no modo transcrição (ctrl+o)',
'show stderr to model immediately': 'mostrar stderr ao modelo imediatamente',
'show stderr to user only but continue with tool call':
'mostrar stderr apenas ao usuário mas continuar com chamada de ferramenta',
'block processing, erase original prompt, and show stderr to user only':
'bloquear processamento, apagar prompt original e mostrar stderr apenas ao usuário',
'stdout shown to model': 'stdout mostrado ao modelo',
'show stderr to user only (blocking errors ignored)':
'mostrar stderr apenas ao usuário (erros de bloqueio ignorados)',
'command completes successfully': 'comando concluído com sucesso',
'stdout shown to subagent': 'stdout mostrado ao subagente',
'show stderr to subagent and continue having it run':
'mostrar stderr ao subagente e continuar executando',
'stdout appended as custom compact instructions':
'stdout anexado como instruções de compactação personalizadas',
'block compaction': 'bloquear compactação',
'show stderr to user only but continue with compaction':
'mostrar stderr apenas ao usuário mas continuar com compactação',
'use hook decision if provided': 'usar decisão do hook se fornecida',
// Hooks - Messages
'Config not loaded.': 'Configuração não carregada.',
'Hooks are not enabled. Enable hooks in settings to use this feature.':
'Hooks não estão ativados. Ative hooks nas configurações para usar este recurso.',
'No hooks configured. Add hooks in your settings.json file.':
'Nenhum hook configurado. Adicione hooks no seu arquivo settings.json.',
'Configured Hooks ({{count}} total)': 'Hooks Configurados ({{count}} total)',
// ============================================================================ // ============================================================================
// Commands - Session Export // Commands - Session Export
@ -712,7 +817,6 @@ export default {
'Workspace approval mode exists and takes priority. User-level change will have no effect.': 'Workspace approval mode exists and takes priority. User-level change will have no effect.':
'O modo de aprovação do workspace existe e tem prioridade. A alteração no nível do usuário não terá efeito.', 'O modo de aprovação do workspace existe e tem prioridade. A alteração no nível do usuário não terá efeito.',
'Apply To': 'Aplicar A', 'Apply To': 'Aplicar A',
'User Settings': 'Configurações do Usuário',
'Workspace Settings': 'Configurações do Workspace', 'Workspace Settings': 'Configurações do Workspace',
// ============================================================================ // ============================================================================
@ -769,7 +873,6 @@ export default {
'List configured MCP servers and tools': 'List configured MCP servers and tools':
'Listar servidores e ferramentas MCP configurados', 'Listar servidores e ferramentas MCP configurados',
'Restarts MCP servers.': 'Reinicia os servidores MCP.', 'Restarts MCP servers.': 'Reinicia os servidores MCP.',
'Config not loaded.': 'Configuração não carregada.',
'Could not retrieve tool registry.': 'Could not retrieve tool registry.':
'Não foi possível recuperar o registro de ferramentas.', 'Não foi possível recuperar o registro de ferramentas.',
'No MCP servers configured with OAuth authentication.': 'No MCP servers configured with OAuth authentication.':
@ -979,7 +1082,6 @@ export default {
'No server selected': 'Nenhum servidor selecionado', 'No server selected': 'Nenhum servidor selecionado',
'(disabled)': '(desativado)', '(disabled)': '(desativado)',
'Error:': 'Erro:', 'Error:': 'Erro:',
Extension: 'Extensão',
tool: 'ferramenta', tool: 'ferramenta',
tools: 'ferramentas', tools: 'ferramentas',
connected: 'conectado', connected: 'conectado',

View file

@ -605,6 +605,110 @@ export default {
'List all configured hooks': 'Показать все настроенные хуки', 'List all configured hooks': 'Показать все настроенные хуки',
'Enable a disabled hook': 'Включить отключенный хук', 'Enable a disabled hook': 'Включить отключенный хук',
'Disable an active hook': 'Отключить активный хук', 'Disable an active hook': 'Отключить активный хук',
// Hooks - Dialog
Hooks: 'Хуки',
'Loading hooks...': 'Загрузка хуков...',
'Error loading hooks:': 'Ошибка загрузки хуков:',
'Press Escape to close': 'Нажмите Escape для закрытия',
'No hook selected': 'Хук не выбран',
// Hooks - List Step
'No hook events found.': 'События хуков не найдены.',
'{{count}} hook configured': '{{count}} хук настроен',
'{{count}} hooks configured': '{{count}} хуков настроено',
'This menu is read-only. To add or modify hooks, edit settings.json directly or ask Qwen Code.':
'Это меню только для чтения. Чтобы добавить или изменить хуки, отредактируйте settings.json напрямую или спросите Qwen Code.',
'Enter to select · Esc to cancel': 'Enter для выбора · Esc для отмены',
// Hooks - Detail Step
'Exit codes:': 'Коды выхода:',
'Configured hooks:': 'Настроенные хуки:',
'No hooks configured for this event.':
'Для этого события нет настроенных хуков.',
'To add hooks, edit settings.json directly or ask Qwen.':
'Чтобы добавить хуки, отредактируйте settings.json напрямую или спросите Qwen.',
// Hooks - Source
Project: 'Проект',
User: 'Пользователь',
System: 'Система',
Extension: 'Расширение',
'Local Settings': 'Локальные настройки',
'User Settings': 'Пользовательские настройки',
'System Settings': 'Системные настройки',
Extensions: 'Расширения',
// Hooks - Status
'✓ Enabled': '✓ Включен',
'✗ Disabled': '✗ Отключен',
// Hooks - Event Descriptions (short)
'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': 'При отображении диалога разрешений',
// Hooks - Event Descriptions (detailed)
'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).':
'Ввод в команду — это JSON с полями "inputs" (аргументы вызова инструмента) и "response" (ответ вызова инструмента).',
'Input to command is JSON with tool_name, tool_input, tool_use_id, error, error_type, is_interrupt, and is_timeout.':
'Ввод в команду — это JSON с tool_name, tool_input, tool_use_id, error, error_type, is_interrupt и is_timeout.',
'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.':
'Ввод в команду — это JSON с agent_id и agent_type.',
'Input to command is JSON with agent_id, agent_type, and agent_transcript_path.':
'Ввод в команду — это JSON с agent_id, agent_type и agent_transcript_path.',
'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.':
'Ввод в команду — это JSON с tool_name, tool_input и tool_use_id. Вывод — JSON с hookSpecificOutput, содержащим решение о разрешении или отказе.',
// Hooks - Exit Code Descriptions
'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 model': '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':
'использовать решение хука, если предоставлено',
// Hooks - Messages
'Config not loaded.': 'Конфигурация не загружена.',
'Hooks are not enabled. Enable hooks in settings to use this feature.':
'Хуки не включены. Включите хуки в настройках, чтобы использовать эту функцию.',
'No hooks configured. Add hooks in your settings.json file.':
'Хуки не настроены. Добавьте хуки в файл settings.json.',
'Configured Hooks ({{count}} total)': 'Настроенные хуки (всего {{count}})',
// ============================================================================ // ============================================================================
// Commands - Session Export // Commands - Session Export
@ -718,7 +822,6 @@ export default {
'Workspace approval mode exists and takes priority. User-level change will have no effect.': 'Workspace approval mode exists and takes priority. User-level change will have no effect.':
'Режим подтверждения рабочего пространства существует и имеет приоритет. Изменение на уровне пользователя не будет иметь эффекта.', 'Режим подтверждения рабочего пространства существует и имеет приоритет. Изменение на уровне пользователя не будет иметь эффекта.',
'Apply To': 'Применить к', 'Apply To': 'Применить к',
'User Settings': 'Настройки пользователя',
'Workspace Settings': 'Настройки рабочего пространства', 'Workspace Settings': 'Настройки рабочего пространства',
// ============================================================================ // ============================================================================
@ -773,7 +876,6 @@ export default {
'List configured MCP servers and tools': 'List configured MCP servers and tools':
'Просмотр настроенных MCP-серверов и инструментов', 'Просмотр настроенных MCP-серверов и инструментов',
'Restarts MCP servers.': 'Перезапустить MCP-серверы.', 'Restarts MCP servers.': 'Перезапустить MCP-серверы.',
'Config not loaded.': 'Конфигурация не загружена.',
'Could not retrieve tool registry.': 'Could not retrieve tool registry.':
'Не удалось получить реестр инструментов.', 'Не удалось получить реестр инструментов.',
'No MCP servers configured with OAuth authentication.': 'No MCP servers configured with OAuth authentication.':
@ -951,7 +1053,6 @@ export default {
'View tools': 'Просмотреть инструменты', 'View tools': 'Просмотреть инструменты',
'(disabled)': '(отключен)', '(disabled)': '(отключен)',
'Error:': 'Ошибка:', 'Error:': 'Ошибка:',
Extension: 'Расширение',
tool: 'инструмент', tool: 'инструмент',
connected: 'подключен', connected: 'подключен',
connecting: 'подключение', connecting: 'подключение',

View file

@ -632,6 +632,105 @@ export default {
'List all configured hooks': '列出所有已配置的 Hook', 'List all configured hooks': '列出所有已配置的 Hook',
'Enable a disabled hook': '启用已禁用的 Hook', 'Enable a disabled hook': '启用已禁用的 Hook',
'Disable an active hook': '禁用已启用的 Hook', 'Disable an active hook': '禁用已启用的 Hook',
// Hooks - Dialog
Hooks: 'Hook',
'Loading hooks...': '正在加载 Hook...',
'Error loading hooks:': '加载 Hook 出错:',
'Press Escape to close': '按 Escape 关闭',
'No hook selected': '未选择 Hook',
// Hooks - List Step
'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 取消',
// Hooks - Detail Step
'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。',
// Hooks - Source
Project: '项目',
User: '用户',
System: '系统',
Extension: '扩展',
'Local Settings': '本地设置',
'User Settings': '用户设置',
'System Settings': '系统设置',
Extensions: '扩展',
// Hooks - Status
'✓ Enabled': '✓ 已启用',
'✗ Disabled': '✗ 已禁用',
// Hooks - Event Descriptions (short)
'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': '显示权限对话框时',
// Hooks - Event Descriptions (detailed)
'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其中包含允许或拒绝的决定。',
// Hooks - Exit Code Descriptions
'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 model': '向模型显示 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 决定',
// Hooks - Messages
'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}} 个)',
// ============================================================================ // ============================================================================
// Commands - Session Export // Commands - Session Export
@ -732,7 +831,6 @@ export default {
'Workspace approval mode exists and takes priority. User-level change will have no effect.': 'Workspace approval mode exists and takes priority. User-level change will have no effect.':
'工作区审批模式已存在并具有优先级。用户级别的更改将无效。', '工作区审批模式已存在并具有优先级。用户级别的更改将无效。',
'Apply To': '应用于', 'Apply To': '应用于',
'User Settings': '用户设置',
'Workspace Settings': '工作区设置', 'Workspace Settings': '工作区设置',
// ============================================================================ // ============================================================================
@ -782,7 +880,6 @@ export default {
'List configured MCP servers and tools': '列出已配置的 MCP 服务器和工具', 'List configured MCP servers and tools': '列出已配置的 MCP 服务器和工具',
'Restarts MCP servers.': '重启 MCP 服务器', 'Restarts MCP servers.': '重启 MCP 服务器',
'Open MCP management dialog': '打开 MCP 管理对话框', 'Open MCP management dialog': '打开 MCP 管理对话框',
'Config not loaded.': '配置未加载',
'Could not retrieve tool registry.': '无法检索工具注册表', 'Could not retrieve tool registry.': '无法检索工具注册表',
'No MCP servers configured with OAuth authentication.': 'No MCP servers configured with OAuth authentication.':
'未配置支持 OAuth 认证的 MCP 服务器', '未配置支持 OAuth 认证的 MCP 服务器',
@ -841,7 +938,6 @@ export default {
'Server:': '服务器:', 'Server:': '服务器:',
'(disabled)': '(已禁用)', '(disabled)': '(已禁用)',
'Error:': '错误:', 'Error:': '错误:',
Extension: '扩展',
tool: '工具', tool: '工具',
tools: '个工具', tools: '个工具',
connected: '已连接', connected: '已连接',

View file

@ -20,13 +20,13 @@ import type { HookRegistryEntry } from '@qwen-code/qwen-code-core';
function formatHookSource(source: string): string { function formatHookSource(source: string): string {
switch (source) { switch (source) {
case 'project': case 'project':
return 'Project'; return t('Project');
case 'user': case 'user':
return 'User'; return t('User');
case 'system': case 'system':
return 'System'; return t('System');
case 'extensions': case 'extensions':
return 'Extension'; return t('Extension');
default: default:
return source; return source;
} }
@ -36,7 +36,7 @@ function formatHookSource(source: string): string {
* Format hook status for display * Format hook status for display
*/ */
function formatHookStatus(enabled: boolean): string { function formatHookStatus(enabled: boolean): string {
return enabled ? '✓ Enabled' : '✗ Disabled'; return enabled ? t('✓ Enabled') : t('✗ Disabled');
} }
const listCommand: SlashCommand = { const listCommand: SlashCommand = {

View file

@ -9,7 +9,8 @@ import { Box, Text } from 'ink';
import { theme } from '../../semantic-colors.js'; import { theme } from '../../semantic-colors.js';
import { useKeypress } from '../../hooks/useKeypress.js'; import { useKeypress } from '../../hooks/useKeypress.js';
import type { HookEventDisplayInfo } from './types.js'; import type { HookEventDisplayInfo } from './types.js';
import { SOURCE_DISPLAY_MAP } from './constants.js'; import { getTranslatedSourceDisplayMap } from './constants.js';
import { t } from '../../../i18n/index.js';
interface HookDetailStepProps { interface HookDetailStepProps {
hook: HookEventDisplayInfo; hook: HookEventDisplayInfo;
@ -23,6 +24,9 @@ export function HookDetailStep({
const hasConfigs = hook.configs.length > 0; const hasConfigs = hook.configs.length > 0;
const [selectedIndex, setSelectedIndex] = useState(0); const [selectedIndex, setSelectedIndex] = useState(0);
// Get translated source display map
const sourceDisplayMap = getTranslatedSourceDisplayMap();
// Handle keyboard navigation // Handle keyboard navigation
useKeypress( useKeypress(
(key) => { (key) => {
@ -61,7 +65,7 @@ export function HookDetailStep({
{hook.exitCodes.length > 0 && ( {hook.exitCodes.length > 0 && (
<Box flexDirection="column" marginBottom={1}> <Box flexDirection="column" marginBottom={1}>
<Text bold color={theme.text.primary}> <Text bold color={theme.text.primary}>
Exit codes: {t('Exit codes:')}
</Text> </Text>
{hook.exitCodes.map((ec, index) => ( {hook.exitCodes.map((ec, index) => (
<Box key={index}> <Box key={index}>
@ -79,12 +83,12 @@ export function HookDetailStep({
{hasConfigs ? ( {hasConfigs ? (
<> <>
<Text bold color={theme.text.primary}> <Text bold color={theme.text.primary}>
Configured hooks: {t('Configured hooks:')}
</Text> </Text>
{hook.configs.map((config, index) => { {hook.configs.map((config, index) => {
const isSelected = index === selectedIndex; const isSelected = index === selectedIndex;
const sourceDisplay = const sourceDisplay =
SOURCE_DISPLAY_MAP[config.source] || config.source; sourceDisplayMap[config.source] || config.source;
return ( return (
<Box key={index}> <Box key={index}>
@ -107,23 +111,23 @@ export function HookDetailStep({
); );
})} })}
<Box marginTop={1}> <Box marginTop={1}>
<Text color={theme.text.secondary}>Esc to go back</Text> <Text color={theme.text.secondary}>{t('Esc to go back')}</Text>
</Box> </Box>
</> </>
) : ( ) : (
<> <>
<Box> <Box>
<Text color={theme.text.secondary}> <Text color={theme.text.secondary}>
No hooks configured for this event. {t('No hooks configured for this event.')}
</Text> </Text>
</Box> </Box>
<Box marginTop={1}> <Box marginTop={1}>
<Text color={theme.text.secondary}> <Text color={theme.text.secondary}>
To add hooks, edit settings.json directly or ask Qwen. {t('To add hooks, edit settings.json directly or ask Qwen.')}
</Text> </Text>
</Box> </Box>
<Box marginTop={1}> <Box marginTop={1}>
<Text color={theme.text.secondary}>Esc to go back</Text> <Text color={theme.text.secondary}>{t('Esc to go back')}</Text>
</Box> </Box>
</> </>
)} )}

View file

@ -9,6 +9,7 @@ import { Box, Text } from 'ink';
import { theme } from '../../semantic-colors.js'; import { theme } from '../../semantic-colors.js';
import { useKeypress } from '../../hooks/useKeypress.js'; import { useKeypress } from '../../hooks/useKeypress.js';
import type { HookEventDisplayInfo } from './types.js'; import type { HookEventDisplayInfo } from './types.js';
import { t } from '../../../i18n/index.js';
interface HooksListStepProps { interface HooksListStepProps {
hooks: HookEventDisplayInfo[]; hooks: HookEventDisplayInfo[];
@ -41,7 +42,7 @@ export function HooksListStep({
if (hooks.length === 0) { if (hooks.length === 0) {
return ( return (
<Box flexDirection="column" paddingX={1}> <Box flexDirection="column" paddingX={1}>
<Text color={theme.text.secondary}>No hook events found.</Text> <Text color={theme.text.secondary}>{t('No hook events found.')}</Text>
</Box> </Box>
); );
} }
@ -52,21 +53,26 @@ export function HooksListStep({
0, 0,
); );
// Get the correct plural/singular form
const hooksConfiguredText =
totalConfigured === 1
? t('{{count}} hook configured', { count: String(totalConfigured) })
: t('{{count}} hooks configured', { count: String(totalConfigured) });
return ( return (
<Box flexDirection="column" paddingX={1}> <Box flexDirection="column" paddingX={1}>
<Box marginBottom={1}> <Box marginBottom={1}>
<Text bold color={theme.text.primary}> <Text bold color={theme.text.primary}>
Hooks {t('Hooks')}
</Text>
<Text color={theme.text.secondary}>
{` · ${totalConfigured} hook${totalConfigured !== 1 ? 's' : ''} configured`}
</Text> </Text>
<Text color={theme.text.secondary}>{` · ${hooksConfiguredText}`}</Text>
</Box> </Box>
<Box marginBottom={1}> <Box marginBottom={1}>
<Text color={theme.text.secondary}> <Text color={theme.text.secondary}>
This menu is read-only. To add or modify hooks, edit settings.json {t(
directly or ask Qwen Code. 'This menu is read-only. To add or modify hooks, edit settings.json directly or ask Qwen Code.',
)}
</Text> </Text>
</Box> </Box>
@ -101,7 +107,7 @@ export function HooksListStep({
<Box marginTop={1}> <Box marginTop={1}>
<Text color={theme.text.secondary}> <Text color={theme.text.secondary}>
Enter to select · Esc to cancel {t('Enter to select · Esc to cancel')}
</Text> </Text>
</Box> </Box>
</Box> </Box>

View file

@ -25,9 +25,10 @@ import { HooksListStep } from './HooksListStep.js';
import { HookDetailStep } from './HookDetailStep.js'; import { HookDetailStep } from './HookDetailStep.js';
import { import {
DISPLAY_HOOK_EVENTS, DISPLAY_HOOK_EVENTS,
SOURCE_DISPLAY_MAP, getTranslatedSourceDisplayMap,
createEmptyHookEventInfo, createEmptyHookEventInfo,
} from './constants.js'; } from './constants.js';
import { t } from '../../../i18n/index.js';
const debugLogger = createDebugLogger('HOOKS_DIALOG'); const debugLogger = createDebugLogger('HOOKS_DIALOG');
@ -44,6 +45,7 @@ export function HooksManagementDialog({
const [selectedHookIndex, setSelectedHookIndex] = useState<number>(-1); const [selectedHookIndex, setSelectedHookIndex] = useState<number>(-1);
const [hooks, setHooks] = useState<HookEventDisplayInfo[]>([]); const [hooks, setHooks] = useState<HookEventDisplayInfo[]>([]);
const [isLoading, setIsLoading] = useState(true); const [isLoading, setIsLoading] = useState(true);
const [loadError, setLoadError] = useState<string | null>(null);
// Load hooks data // Load hooks data
const fetchHooksData = useCallback((): HookEventDisplayInfo[] => { const fetchHooksData = useCallback((): HookEventDisplayInfo[] => {
@ -55,6 +57,9 @@ export function HooksManagementDialog({
SettingScope.Workspace, SettingScope.Workspace,
).settings; ).settings;
// Get translated source display map
const sourceDisplayMap = getTranslatedSourceDisplayMap();
const result: HookEventDisplayInfo[] = []; const result: HookEventDisplayInfo[] = [];
for (const eventName of DISPLAY_HOOK_EVENTS) { for (const eventName of DISPLAY_HOOK_EVENTS) {
@ -70,7 +75,7 @@ export function HooksManagementDialog({
hookInfo.configs.push({ hookInfo.configs.push({
config: hookConfig, config: hookConfig,
source: HooksConfigSource.User, source: HooksConfigSource.User,
sourceDisplay: SOURCE_DISPLAY_MAP[HooksConfigSource.User], sourceDisplay: sourceDisplayMap[HooksConfigSource.User],
enabled: true, enabled: true,
}); });
} }
@ -87,7 +92,7 @@ export function HooksManagementDialog({
hookInfo.configs.push({ hookInfo.configs.push({
config: hookConfig, config: hookConfig,
source: HooksConfigSource.Project, source: HooksConfigSource.Project,
sourceDisplay: SOURCE_DISPLAY_MAP[HooksConfigSource.Project], sourceDisplay: sourceDisplayMap[HooksConfigSource.Project],
enabled: true, enabled: true,
}); });
} }
@ -103,7 +108,7 @@ export function HooksManagementDialog({
hookInfo.configs.push({ hookInfo.configs.push({
config: hookConfig, config: hookConfig,
source: HooksConfigSource.Extensions, source: HooksConfigSource.Extensions,
sourceDisplay: SOURCE_DISPLAY_MAP[HooksConfigSource.Extensions], sourceDisplay: sourceDisplayMap[HooksConfigSource.Extensions],
enabled: true, enabled: true,
}); });
} }
@ -120,11 +125,15 @@ export function HooksManagementDialog({
// Load hooks data on initial render // Load hooks data on initial render
useEffect(() => { useEffect(() => {
setIsLoading(true); setIsLoading(true);
setLoadError(null);
try { try {
const hooksData = fetchHooksData(); const hooksData = fetchHooksData();
setHooks(hooksData); setHooks(hooksData);
} catch (error) { } catch (error) {
debugLogger.error('Error loading hooks:', error); debugLogger.error('Error loading hooks:', error);
setLoadError(
error instanceof Error ? error.message : 'Failed to load hooks',
);
} finally { } finally {
setIsLoading(false); setIsLoading(false);
} }
@ -180,7 +189,21 @@ export function HooksManagementDialog({
if (isLoading) { if (isLoading) {
return ( return (
<Box flexDirection="column" paddingX={1}> <Box flexDirection="column" paddingX={1}>
<Text color={theme.text.secondary}>Loading hooks...</Text> <Text color={theme.text.secondary}>{t('Loading hooks...')}</Text>
</Box>
);
}
if (loadError) {
return (
<Box flexDirection="column" paddingX={1}>
<Text color={theme.status.error}>{t('Error loading hooks:')}</Text>
<Text color={theme.text.secondary}>{loadError}</Text>
<Box marginTop={1}>
<Text color={theme.text.secondary}>
{t('Press Escape to close')}
</Text>
</Box>
</Box> </Box>
); );
} }
@ -203,7 +226,7 @@ export function HooksManagementDialog({
} }
return ( return (
<Box flexDirection="column" paddingX={1}> <Box flexDirection="column" paddingX={1}>
<Text color={theme.text.secondary}>No hook selected</Text> <Text color={theme.text.secondary}>{t('No hook selected')}</Text>
</Box> </Box>
); );

View file

@ -6,144 +6,182 @@
import { HooksConfigSource, HookEventName } from '@qwen-code/qwen-code-core'; import { HooksConfigSource, HookEventName } from '@qwen-code/qwen-code-core';
import type { HookExitCode, HookEventDisplayInfo } from './types.js'; import type { HookExitCode, HookEventDisplayInfo } from './types.js';
import { t } from '../../../i18n/index.js';
/** /**
* Exit code descriptions for different hook types * Exit code descriptions for different hook types
*/ */
export const HOOK_EXIT_CODES: Record<string, HookExitCode[]> = { export function getHookExitCodes(eventName: string): HookExitCode[] {
const exitCodesMap: Record<string, HookExitCode[]> = {
[HookEventName.Stop]: [ [HookEventName.Stop]: [
{ code: 0, description: 'stdout/stderr not shown' }, { code: 0, description: t('stdout/stderr not shown') },
{ code: 2, description: 'show stderr to model and continue conversation' }, {
{ code: 'Other', description: 'show stderr to user only' }, code: 2,
description: t('show stderr to model and continue conversation'),
},
{ code: 'Other', description: t('show stderr to user only') },
], ],
[HookEventName.PreToolUse]: [ [HookEventName.PreToolUse]: [
{ code: 0, description: 'stdout/stderr not shown' }, { code: 0, description: t('stdout/stderr not shown') },
{ code: 2, description: 'show stderr to model and block tool call' }, { code: 2, description: t('show stderr to model and block tool call') },
{ {
code: 'Other', code: 'Other',
description: 'show stderr to user only but continue with tool call', description: t('show stderr to user only but continue with tool call'),
}, },
], ],
[HookEventName.PostToolUse]: [ [HookEventName.PostToolUse]: [
{ code: 0, description: 'stdout shown in transcript mode (ctrl+o)' }, { code: 0, description: t('stdout shown in transcript mode (ctrl+o)') },
{ code: 2, description: 'show stderr to model immediately' }, { code: 2, description: t('show stderr to model immediately') },
{ code: 'Other', description: 'show stderr to user only' }, { code: 'Other', description: t('show stderr to user only') },
], ],
[HookEventName.PostToolUseFailure]: [ [HookEventName.PostToolUseFailure]: [
{ code: 0, description: 'stdout shown in transcript mode (ctrl+o)' }, { code: 0, description: t('stdout shown in transcript mode (ctrl+o)') },
{ code: 2, description: 'show stderr to model immediately' }, { code: 2, description: t('show stderr to model immediately') },
{ code: 'Other', description: 'show stderr to user only' }, { code: 'Other', description: t('show stderr to user only') },
], ],
[HookEventName.Notification]: [ [HookEventName.Notification]: [
{ code: 0, description: 'stdout/stderr not shown' }, { code: 0, description: t('stdout/stderr not shown') },
{ code: 'Other', description: 'show stderr to user only' }, { code: 'Other', description: t('show stderr to user only') },
], ],
[HookEventName.UserPromptSubmit]: [ [HookEventName.UserPromptSubmit]: [
{ code: 0, description: 'stdout shown to model' }, { code: 0, description: t('stdout shown to model') },
{ {
code: 2, code: 2,
description: description: t(
'block processing, erase original prompt, and show stderr to user only', 'block processing, erase original prompt, and show stderr to user only',
),
}, },
{ code: 'Other', description: 'show stderr to user only' }, { code: 'Other', description: t('show stderr to user only') },
], ],
[HookEventName.SessionStart]: [ [HookEventName.SessionStart]: [
{ code: 0, description: 'stdout shown to model' }, { code: 0, description: t('stdout shown to model') },
{ {
code: 'Other', code: 'Other',
description: 'show stderr to user only (blocking errors ignored)', description: t('show stderr to user only (blocking errors ignored)'),
}, },
], ],
[HookEventName.SessionEnd]: [ [HookEventName.SessionEnd]: [
{ code: 0, description: 'command completes successfully' }, { code: 0, description: t('command completes successfully') },
{ code: 'Other', description: 'show stderr to user only' }, { code: 'Other', description: t('show stderr to user only') },
], ],
[HookEventName.SubagentStart]: [ [HookEventName.SubagentStart]: [
{ code: 0, description: 'stdout shown to subagent' }, { code: 0, description: t('stdout shown to subagent') },
{ {
code: 'Other', code: 'Other',
description: 'show stderr to user only (blocking errors ignored)', description: t('show stderr to user only (blocking errors ignored)'),
}, },
], ],
[HookEventName.SubagentStop]: [ [HookEventName.SubagentStop]: [
{ code: 0, description: 'stdout/stderr not shown' }, { code: 0, description: t('stdout/stderr not shown') },
{ {
code: 2, code: 2,
description: 'show stderr to subagent and continue having it run', description: t('show stderr to subagent and continue having it run'),
}, },
{ code: 'Other', description: 'show stderr to user only' }, { code: 'Other', description: t('show stderr to user only') },
], ],
[HookEventName.PreCompact]: [ [HookEventName.PreCompact]: [
{ code: 0, description: 'stdout appended as custom compact instructions' }, {
{ code: 2, description: 'block compaction' }, code: 0,
description: t('stdout appended as custom compact instructions'),
},
{ code: 2, description: t('block compaction') },
{ {
code: 'Other', code: 'Other',
description: 'show stderr to user only but continue with compaction', description: t('show stderr to user only but continue with compaction'),
}, },
], ],
[HookEventName.PermissionRequest]: [ [HookEventName.PermissionRequest]: [
{ code: 0, description: 'use hook decision if provided' }, { code: 0, description: t('use hook decision if provided') },
{ code: 'Other', description: 'show stderr to user only' }, { code: 'Other', description: t('show stderr to user only') },
], ],
}; };
return exitCodesMap[eventName] || [];
}
/** /**
* Short one-line description for hooks list view * Short one-line description for hooks list view
*/ */
export const HOOK_SHORT_DESCRIPTIONS: Record<string, string> = { export function getHookShortDescription(eventName: string): string {
[HookEventName.PreToolUse]: 'Before tool execution', const descriptions: Record<string, string> = {
[HookEventName.PostToolUse]: 'After tool execution', [HookEventName.PreToolUse]: t('Before tool execution'),
[HookEventName.PostToolUseFailure]: 'After tool execution fails', [HookEventName.PostToolUse]: t('After tool execution'),
[HookEventName.Notification]: 'When notifications are sent', [HookEventName.PostToolUseFailure]: t('After tool execution fails'),
[HookEventName.UserPromptSubmit]: 'When the user submits a prompt', [HookEventName.Notification]: t('When notifications are sent'),
[HookEventName.SessionStart]: 'When a new session is started', [HookEventName.UserPromptSubmit]: t('When the user submits a prompt'),
[HookEventName.Stop]: 'Right before Qwen Code concludes its response', [HookEventName.SessionStart]: t('When a new session is started'),
[HookEventName.SubagentStart]: 'When a subagent (Agent tool call) is started', [HookEventName.Stop]: t('Right before Qwen Code concludes its response'),
[HookEventName.SubagentStop]: [HookEventName.SubagentStart]: t(
'When a subagent (Agent tool call) is started',
),
[HookEventName.SubagentStop]: t(
'Right before a subagent concludes its response', 'Right before a subagent concludes its response',
[HookEventName.PreCompact]: 'Before conversation compaction', ),
[HookEventName.SessionEnd]: 'When a session is ending', [HookEventName.PreCompact]: t('Before conversation compaction'),
[HookEventName.PermissionRequest]: 'When a permission dialog is displayed', [HookEventName.SessionEnd]: t('When a session is ending'),
[HookEventName.PermissionRequest]: t(
'When a permission dialog is displayed',
),
}; };
return descriptions[eventName] || '';
}
/** /**
* Detailed description for each hook event type (shown in detail view) * Detailed description for each hook event type (shown in detail view)
*/ */
export const HOOK_DESCRIPTIONS: Record<string, string> = { export function getHookDescription(eventName: string): string {
const descriptions: Record<string, string> = {
[HookEventName.Stop]: '', [HookEventName.Stop]: '',
[HookEventName.PreToolUse]: [HookEventName.PreToolUse]: t(
'Input to command is JSON of tool call arguments.', 'Input to command is JSON of tool call arguments.',
[HookEventName.PostToolUse]: ),
[HookEventName.PostToolUse]: t(
'Input to command is JSON with fields "inputs" (tool call arguments) and "response" (tool call response).', 'Input to command is JSON with fields "inputs" (tool call arguments) and "response" (tool call response).',
[HookEventName.PostToolUseFailure]: ),
[HookEventName.PostToolUseFailure]: t(
'Input to command is JSON with tool_name, tool_input, tool_use_id, error, error_type, is_interrupt, and is_timeout.', 'Input to command is JSON with tool_name, tool_input, tool_use_id, error, error_type, is_interrupt, and is_timeout.',
[HookEventName.Notification]: ),
[HookEventName.Notification]: t(
'Input to command is JSON with notification message and type.', 'Input to command is JSON with notification message and type.',
[HookEventName.UserPromptSubmit]: ),
[HookEventName.UserPromptSubmit]: t(
'Input to command is JSON with original user prompt text.', 'Input to command is JSON with original user prompt text.',
[HookEventName.SessionStart]: ),
[HookEventName.SessionStart]: t(
'Input to command is JSON with session start source.', 'Input to command is JSON with session start source.',
[HookEventName.SessionEnd]: ),
[HookEventName.SessionEnd]: t(
'Input to command is JSON with session end reason.', 'Input to command is JSON with session end reason.',
[HookEventName.SubagentStart]: ),
[HookEventName.SubagentStart]: t(
'Input to command is JSON with agent_id and agent_type.', 'Input to command is JSON with agent_id and agent_type.',
[HookEventName.SubagentStop]: ),
[HookEventName.SubagentStop]: t(
'Input to command is JSON with agent_id, agent_type, and agent_transcript_path.', 'Input to command is JSON with agent_id, agent_type, and agent_transcript_path.',
[HookEventName.PreCompact]: ),
[HookEventName.PreCompact]: t(
'Input to command is JSON with compaction details.', 'Input to command is JSON with compaction details.',
[HookEventName.PermissionRequest]: ),
[HookEventName.PermissionRequest]: t(
'Input to command is JSON with tool_name, tool_input, and tool_use_id. Output JSON with hookSpecificOutput containing decision to allow or deny.', 'Input to command is JSON with tool_name, tool_input, and tool_use_id. Output JSON with hookSpecificOutput containing decision to allow or deny.',
),
}; };
return descriptions[eventName] || '';
}
/** /**
* Source display mapping * Source display mapping (translated)
*/ */
export const SOURCE_DISPLAY_MAP: Record<HooksConfigSource, string> = { export function getTranslatedSourceDisplayMap(): Record<
[HooksConfigSource.Project]: 'Local Settings', HooksConfigSource,
[HooksConfigSource.User]: 'User Settings', string
[HooksConfigSource.System]: 'System Settings', > {
[HooksConfigSource.Extensions]: 'Extensions', return {
[HooksConfigSource.Project]: t('Local Settings'),
[HooksConfigSource.User]: t('User Settings'),
[HooksConfigSource.System]: t('System Settings'),
[HooksConfigSource.Extensions]: t('Extensions'),
}; };
}
/** /**
* List of hook events to display in the UI * List of hook events to display in the UI
@ -171,9 +209,9 @@ export function createEmptyHookEventInfo(
): HookEventDisplayInfo { ): HookEventDisplayInfo {
return { return {
event: eventName, event: eventName,
shortDescription: HOOK_SHORT_DESCRIPTIONS[eventName] || '', shortDescription: getHookShortDescription(eventName),
description: HOOK_DESCRIPTIONS[eventName] || '', description: getHookDescription(eventName),
exitCodes: HOOK_EXIT_CODES[eventName] || [], exitCodes: getHookExitCodes(eventName),
configs: [], configs: [],
}; };
} }