From f682dd7a5bc05139911193b7cf046f84b6c6470e Mon Sep 17 00:00:00 2001 From: YoVinchen Date: Sat, 9 Aug 2025 04:18:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A1=B5=E9=9D=A2=EF=BC=8C?= =?UTF-8?q?=E5=9B=BD=E9=99=85=E5=8C=96=E7=BB=86=E8=8A=82=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/AgentExecution.tsx | 48 +++++++++-------- src/components/AgentRunOutputViewer.tsx | 16 +++--- src/components/AgentRunView.tsx | 10 ++-- src/components/AgentRunsList.tsx | 4 +- src/components/AgentsModal.tsx | 2 +- src/components/ClaudeCodeSession.tsx | 35 ++++++------ src/components/CreateAgent.tsx | 2 +- src/components/FloatingPromptInput.tsx | 20 +++---- src/components/RunningClaudeSessions.tsx | 8 +-- src/components/SessionOutputViewer.tsx | 16 +++--- src/components/SlashCommandPicker.tsx | 10 ++-- src/components/StorageTab.tsx | 4 +- src/components/TimelineNavigator.tsx | 12 +++-- src/components/ToolWidgets.tsx | 23 ++++---- .../claude-code-session/SessionHeader.tsx | 8 +-- src/locales/en/common.json | 54 ++++++++++++++++++- src/locales/zh/common.json | 49 ++++++++++++++++- 17 files changed, 223 insertions(+), 98 deletions(-) diff --git a/src/components/AgentExecution.tsx b/src/components/AgentExecution.tsx index 9691ec6..2439112 100644 --- a/src/components/AgentExecution.tsx +++ b/src/components/AgentExecution.tsx @@ -26,6 +26,7 @@ import { DialogTitle, } from "@/components/ui/dialog"; import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"; +import { useTranslation } from "react-i18next"; import { api, type Agent } from "@/lib/api"; import { cn } from "@/lib/utils"; import { open } from "@tauri-apps/plugin-dialog"; @@ -81,6 +82,7 @@ export const AgentExecution: React.FC = ({ onBack, className, }) => { + const { t } = useTranslation(); const [projectPath, setProjectPath] = useState(""); const [task, setTask] = useState(agent.default_task || ""); const [model, setModel] = useState(agent.model || "sonnet"); @@ -452,7 +454,7 @@ export const AgentExecution: React.FC = ({ if (isRunning) { // Show confirmation dialog before navigating away during execution const shouldLeave = window.confirm( - "An agent is currently running. If you navigate away, the agent will continue running in the background. You can view running sessions in the 'Running Sessions' tab within CC Agents.\n\nDo you want to continue?" + t('agents.agentRunningWarning') ); if (!shouldLeave) { return; @@ -476,7 +478,7 @@ export const AgentExecution: React.FC = ({ const handleCopyAsMarkdown = async () => { let markdown = `# Agent Execution: ${agent.name}\n\n`; markdown += `**Task:** ${task}\n`; - markdown += `**Model:** ${model === 'opus' ? 'Claude 4 Opus' : 'Claude 4 Sonnet'}\n`; + markdown += `**Model:** ${model === 'opus' ? 'Claude 4.1 Opus' : 'Claude 4 Sonnet'}\n`; markdown += `**Date:** ${new Date().toISOString()}\n\n`; markdown += `---\n\n`; @@ -572,9 +574,9 @@ export const AgentExecution: React.FC = ({ {renderIcon()}
-

Execute: {agent.name}

+

{t('agents.execute')}: {agent.name}

- {model === 'opus' ? 'Claude 4 Opus' : 'Claude 4 Sonnet'} + {model === 'opus' ? 'Claude 4.1 Opus' : 'Claude 4 Sonnet'}

@@ -587,7 +589,7 @@ export const AgentExecution: React.FC = ({ disabled={messages.length === 0} > - Fullscreen + {t('agents.fullscreen')} @@ -612,12 +614,12 @@ export const AgentExecution: React.FC = ({ {/* Project Path */}
- +
setProjectPath(e.target.value)} - placeholder="Select or enter project path" + placeholder={t('agents.selectProjectPath')} disabled={isRunning} className="flex-1" /> @@ -633,17 +635,17 @@ export const AgentExecution: React.FC = ({ variant="outline" onClick={handleOpenHooksDialog} disabled={isRunning || !projectPath} - title="Configure hooks" + title={t('agents.configureHooks')} > - Hooks + {t('agents.hooks')}
{/* Model Selection */}
- +
@@ -701,12 +703,12 @@ export const AgentExecution: React.FC = ({ {/* Task Input */}
- +
setTask(e.target.value)} - placeholder="Enter the task for the agent" + placeholder={t('agents.enterTask')} disabled={isRunning} className="flex-1" onKeyPress={(e) => { @@ -723,12 +725,12 @@ export const AgentExecution: React.FC = ({ {isRunning ? ( <> - Stop + {t('agents.stop')} ) : ( <> - Execute + {t('agents.execute')} )} @@ -759,9 +761,9 @@ export const AgentExecution: React.FC = ({ {messages.length === 0 && !isRunning && (
-

Ready to Execute

+

{t('agents.readyToExecute')}

- Select a project path and enter a task to run the agent + {t('agents.selectProjectPathAndTask')}

)} @@ -841,7 +843,7 @@ export const AgentExecution: React.FC = ({ className="flex items-center gap-2" > - Copy Output + {t('app.copyOutput')} } @@ -853,7 +855,7 @@ export const AgentExecution: React.FC = ({ className="w-full justify-start" onClick={handleCopyAsJsonl} > - Copy as JSONL + {t('app.copyAsJsonl')}
} @@ -901,9 +903,9 @@ export const AgentExecution: React.FC = ({ {messages.length === 0 && !isRunning && (
-

Ready to Execute

+

{t('agents.readyToExecute')}

- Select a project path and enter a task to run the agent + {t('agents.selectProjectPathAndTask')}

)} @@ -957,7 +959,7 @@ export const AgentExecution: React.FC = ({ > - Configure Hooks + {t('agents.configureHooks')} Configure hooks that run before, during, and after tool executions. Changes are saved immediately. diff --git a/src/components/AgentRunOutputViewer.tsx b/src/components/AgentRunOutputViewer.tsx index d83fb93..ad1339a 100644 --- a/src/components/AgentRunOutputViewer.tsx +++ b/src/components/AgentRunOutputViewer.tsx @@ -1,4 +1,5 @@ import { useState, useEffect, useRef, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; import { motion, AnimatePresence } from 'framer-motion'; import { Maximize2, @@ -57,6 +58,7 @@ export function AgentRunOutputViewer({ tabId, className }: AgentRunOutputViewerProps) { + const { t } = useTranslation(); const { updateTabTitle, updateTabStatus } = useTabState(); const [run, setRun] = useState(null); const [messages, setMessages] = useState([]); @@ -330,7 +332,7 @@ export function AgentRunOutputViewer({ if (!run) return; let markdown = `# Agent Execution: ${run.agent_name}\n\n`; markdown += `**Task:** ${run.task}\n`; - markdown += `**Model:** ${run.model === 'opus' ? 'Claude 4 Opus' : 'Claude 4 Sonnet'}\n`; + markdown += `**Model:** ${run.model === 'opus' ? 'Claude 4.1 Opus' : 'Claude 4 Sonnet'}\n`; markdown += `**Date:** ${formatISOTimestamp(run.created_at)}\n`; if (run.metrics?.duration_ms) markdown += `**Duration:** ${(run.metrics.duration_ms / 1000).toFixed(2)}s\n`; if (run.metrics?.total_tokens) markdown += `**Total Tokens:** ${run.metrics.total_tokens}\n`; @@ -566,7 +568,7 @@ export function AgentRunOutputViewer({

- {run.model === 'opus' ? 'Claude 4 Opus' : 'Claude 4 Sonnet'} + {run.model === 'opus' ? 'Claude 4.1 Opus' : 'Claude 4 Sonnet'}
@@ -611,7 +613,7 @@ export function AgentRunOutputViewer({ className="w-full justify-start" onClick={handleCopyAsJsonl} > - Copy as JSONL + {t('app.copyAsJsonl')}
} @@ -723,7 +725,7 @@ export function AgentRunOutputViewer({ size="sm" > - Copy Output + {t('app.copyOutput')} } @@ -735,7 +737,7 @@ export function AgentRunOutputViewer({ className="w-full justify-start" onClick={handleCopyAsJsonl} > - Copy as JSONL + {t('app.copyAsJsonl')}
} diff --git a/src/components/AgentRunView.tsx b/src/components/AgentRunView.tsx index 16ade6c..093c1d3 100644 --- a/src/components/AgentRunView.tsx +++ b/src/components/AgentRunView.tsx @@ -14,6 +14,7 @@ import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent } from "@/components/ui/card"; import { Popover } from "@/components/ui/popover"; +import { useTranslation } from "react-i18next"; import { api, type AgentRunWithMetrics } from "@/lib/api"; import { cn } from "@/lib/utils"; import { formatISOTimestamp } from "@/lib/date-utils"; @@ -48,6 +49,7 @@ export const AgentRunView: React.FC = ({ onBack, className, }) => { + const { t } = useTranslation(); const [run, setRun] = useState(null); const [messages, setMessages] = useState([]); const [loading, setLoading] = useState(true); @@ -288,7 +290,7 @@ export const AgentRunView: React.FC = ({ className="flex items-center gap-2" > - Copy Output + {t('app.copyOutput')} } @@ -300,7 +302,7 @@ export const AgentRunView: React.FC = ({ className="w-full justify-start" onClick={handleCopyAsJsonl} > - Copy as JSONL + {t('app.copyAsJsonl')}
} @@ -327,7 +329,7 @@ export const AgentRunView: React.FC = ({

Task:

{run.task}

- {run.model === 'opus' ? 'Claude 4 Opus' : 'Claude 4 Sonnet'} + {run.model === 'opus' ? 'Claude 4.1 Opus' : 'Claude 4 Sonnet'} diff --git a/src/components/AgentRunsList.tsx b/src/components/AgentRunsList.tsx index deb403c..a2bf110 100644 --- a/src/components/AgentRunsList.tsx +++ b/src/components/AgentRunsList.tsx @@ -4,6 +4,7 @@ import { Play, Clock, Hash, Bot } from "lucide-react"; import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Pagination } from "@/components/ui/pagination"; +import { useTranslation } from "react-i18next"; import { cn } from "@/lib/utils"; import { formatISOTimestamp } from "@/lib/date-utils"; import type { AgentRunWithMetrics } from "@/lib/api"; @@ -41,6 +42,7 @@ export const AgentRunsList: React.FC = ({ onRunClick, className, }) => { + const { t } = useTranslation(); const [currentPage, setCurrentPage] = useState(1); const { createAgentTab } = useTabState(); @@ -91,7 +93,7 @@ export const AgentRunsList: React.FC = ({ return (
-

No execution history yet

+

{t('agents.noExecutionHistory')}

); } diff --git a/src/components/AgentsModal.tsx b/src/components/AgentsModal.tsx index f69a3de..4ab69bd 100644 --- a/src/components/AgentsModal.tsx +++ b/src/components/AgentsModal.tsx @@ -361,7 +361,7 @@ export const AgentsModal: React.FC = ({ open, onOpenChange })
Started: {formatISOTimestamp(run.created_at)} - {run.model === 'opus' ? 'Claude 4 Opus' : 'Claude 4 Sonnet'} + {run.model === 'opus' ? 'Claude 4.1 Opus' : 'Claude 4 Sonnet'}
diff --git a/src/components/ClaudeCodeSession.tsx b/src/components/ClaudeCodeSession.tsx index 20d32a0..c096295 100644 --- a/src/components/ClaudeCodeSession.tsx +++ b/src/components/ClaudeCodeSession.tsx @@ -17,6 +17,7 @@ import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Popover } from "@/components/ui/popover"; +import { useTranslation } from "react-i18next"; import { api, type Session } from "@/lib/api"; import { cn } from "@/lib/utils"; import { open } from "@tauri-apps/plugin-dialog"; @@ -76,6 +77,7 @@ export const ClaudeCodeSession: React.FC = ({ className, onStreamingChange, }) => { + const { t } = useTranslation(); const [projectPath, setProjectPath] = useState(initialProjectPath || session?.project_path || ""); const [messages, setMessages] = useState([]); const [isLoading, setIsLoading] = useState(false); @@ -1127,7 +1129,7 @@ export const ClaudeCodeSession: React.FC = ({ const messagesList = (
= ({ } return ( -
+
{/* Header */} = ({
-

Claude Code Session

+

{t('app.claudeCodeSession')}

{projectPath ? `${projectPath}` : "No project selected"}

@@ -1300,13 +1302,6 @@ export const ClaudeCodeSession: React.FC = ({ )}
- {showSettings && ( - - )} @@ -1320,7 +1315,7 @@ export const ClaudeCodeSession: React.FC = ({ -

Checkpoint Settings

+

{t('checkpoint.checkpointSettingsTitle')}

@@ -1352,7 +1347,7 @@ export const ClaudeCodeSession: React.FC = ({ className="flex items-center gap-2" > - Copy Output + {t('app.copyOutput')} } @@ -1364,7 +1359,7 @@ export const ClaudeCodeSession: React.FC = ({ onClick={handleCopyAsMarkdown} className="w-full justify-start" > - Copy as Markdown + {t('app.copyAsMarkdown')}
} @@ -1554,7 +1549,7 @@ export const ClaudeCodeSession: React.FC = ({ )}
= ({
{/* Timeline Header */}
-

Session Timeline

+

{t('app.sessionTimeline')}

diff --git a/src/components/FloatingPromptInput.tsx b/src/components/FloatingPromptInput.tsx index 4980568..81c8d71 100644 --- a/src/components/FloatingPromptInput.tsx +++ b/src/components/FloatingPromptInput.tsx @@ -20,7 +20,7 @@ import { SlashCommandPicker } from "./SlashCommandPicker"; import { ImagePreview } from "./ImagePreview"; import { type FileEntry, type SlashCommand } from "@/lib/api"; import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow"; -import { useTranslation } from "@/hooks/useTranslation"; +import { useTranslation } from "react-i18next"; interface FloatingPromptInputProps { /** @@ -110,7 +110,7 @@ const MODELS: Model[] = [ }, { id: "opus", - name: "Claude 4 Opus", + name: "Claude 4.1 Opus", description: "More capable, better for complex tasks", icon: } @@ -775,7 +775,7 @@ const FloatingPromptInputInner = (
- Model: + {t('app.model')}: @@ -422,7 +424,7 @@ export function SessionOutputViewer({ session, onClose, className }: SessionOutp className="flex items-center gap-2" > - Copy Output + {t('app.copyOutput')} } @@ -434,7 +436,7 @@ export function SessionOutputViewer({ session, onClose, className }: SessionOutp className="w-full justify-start" onClick={handleCopyAsJsonl} > - Copy as JSONL + {t('app.copyAsJsonl')}
} @@ -567,7 +569,7 @@ export function SessionOutputViewer({ session, onClose, className }: SessionOutp className="flex items-center gap-2" > - Copy Output + {t('app.copyOutput')} } @@ -579,7 +581,7 @@ export function SessionOutputViewer({ session, onClose, className }: SessionOutp className="w-full justify-start" onClick={handleCopyAsJsonl} > - Copy as JSONL + {t('app.copyAsJsonl')}
} diff --git a/src/components/SlashCommandPicker.tsx b/src/components/SlashCommandPicker.tsx index 3e6b887..4aa97ab 100644 --- a/src/components/SlashCommandPicker.tsx +++ b/src/components/SlashCommandPicker.tsx @@ -19,6 +19,7 @@ import { import type { SlashCommand } from "@/lib/api"; import { cn } from "@/lib/utils"; import { useTrackEvent, useFeatureAdoptionTracking } from "@/hooks"; +import { useTranslation } from "react-i18next"; interface SlashCommandPickerProps { /** @@ -79,6 +80,7 @@ export const SlashCommandPicker: React.FC = ({ initialQuery = "", className, }) => { + const { t } = useTranslation(); const [commands, setCommands] = useState([]); const [filteredCommands, setFilteredCommands] = useState([]); const [isLoading, setIsLoading] = useState(true); @@ -241,7 +243,7 @@ export const SlashCommandPicker: React.FC = ({ const groupedCommands = filteredCommands.reduce((acc, cmd) => { let key: string; if (cmd.scope === "user") { - key = cmd.namespace ? `User Commands: ${cmd.namespace}` : "User Commands"; + key = cmd.namespace ? `${t('slashCommands.userCommands')}: ${cmd.namespace}` : t('slashCommands.userCommands'); } else if (cmd.scope === "project") { key = cmd.namespace ? `Project Commands: ${cmd.namespace}` : "Project Commands"; } else { @@ -278,10 +280,10 @@ export const SlashCommandPicker: React.FC = ({
- Slash Commands + {t('slashCommands.slashCommands')} {searchQuery && ( - Searching: "{searchQuery}" + {t('slashCommands.searching')}: "{searchQuery}" )}
@@ -474,7 +476,7 @@ export const SlashCommandPicker: React.FC = ({ {Object.entries(groupedCommands).map(([groupKey, groupCommands]) => (

- {groupKey.startsWith("User Commands") && } + {groupKey.startsWith(t('slashCommands.userCommands')) && } {groupKey.startsWith("Project Commands") && } {groupKey}

diff --git a/src/components/StorageTab.tsx b/src/components/StorageTab.tsx index aa4071c..71bd84b 100644 --- a/src/components/StorageTab.tsx +++ b/src/components/StorageTab.tsx @@ -1,4 +1,5 @@ import React, { useState, useEffect, useCallback } from "react"; +import { useTranslation } from "react-i18next"; import { motion, AnimatePresence } from "framer-motion"; import { Database, @@ -81,6 +82,7 @@ interface QueryResult { * StorageTab component - A beautiful SQLite database viewer/editor */ export const StorageTab: React.FC = () => { + const { t } = useTranslation(); const [tables, setTables] = useState([]); const [selectedTable, setSelectedTable] = useState(""); const [tableData, setTableData] = useState(null); @@ -934,7 +936,7 @@ export const StorageTab: React.FC = () => { {loading ? ( ) : ( - "Execute" + t('agents.execute') )} diff --git a/src/components/TimelineNavigator.tsx b/src/components/TimelineNavigator.tsx index b4fea75..3f50e01 100644 --- a/src/components/TimelineNavigator.tsx +++ b/src/components/TimelineNavigator.tsx @@ -1,4 +1,5 @@ import React, { useState, useEffect } from "react"; +import { useTranslation } from "react-i18next"; import { motion } from "framer-motion"; import { GitBranch, @@ -57,6 +58,7 @@ export const TimelineNavigator: React.FC = ({ onCheckpointCreated, className }) => { + const { t } = useTranslation(); const [timeline, setTimeline] = useState(null); const [selectedCheckpoint, setSelectedCheckpoint] = useState(null); const [expandedNodes, setExpandedNodes] = useState>(new Set()); @@ -413,9 +415,9 @@ export const TimelineNavigator: React.FC = ({
-

Experimental Feature

+

{t('app.experimentalFeature')}

- Checkpointing may affect directory structure or cause data loss. Use with caution. + {t('app.checkpointingWarning')}

@@ -425,10 +427,10 @@ export const TimelineNavigator: React.FC = ({
-

Timeline

+

{t('app.timeline')}

{timeline && ( - {timeline.totalCheckpoints} checkpoints + {timeline.totalCheckpoints} {t('app.checkpoints')} )}
@@ -459,7 +461,7 @@ export const TimelineNavigator: React.FC = ({
) : (
- {isLoading ? "Loading timeline..." : "No checkpoints yet"} + {isLoading ? t('app.loadingTimeline') : t('app.noCheckpointsYet')}
)} diff --git a/src/components/ToolWidgets.tsx b/src/components/ToolWidgets.tsx index fdb00e8..301ac54 100644 --- a/src/components/ToolWidgets.tsx +++ b/src/components/ToolWidgets.tsx @@ -49,6 +49,7 @@ import { Hash, } from "lucide-react"; import { Badge } from "@/components/ui/badge"; +import { useTranslation } from "react-i18next"; import { cn } from "@/lib/utils"; import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; import { getClaudeSyntaxTheme } from "@/lib/claudeSyntaxTheme"; @@ -400,6 +401,7 @@ export const ReadWidget: React.FC<{ filePath: string; result?: any }> = ({ fileP * Widget for Read tool result - shows file content with line numbers */ export const ReadResultWidget: React.FC<{ content: string; filePath?: string }> = ({ content, filePath }) => { + const { t } = useTranslation(); const [isExpanded, setIsExpanded] = useState(false); const { theme } = useTheme(); const syntaxTheme = getClaudeSyntaxTheme(theme); @@ -510,7 +512,7 @@ export const ReadResultWidget: React.FC<{ content: string; filePath?: string }>
- {filePath || "File content"} + {filePath || t('app.fileContent')} {isLargeFile && ( @@ -572,6 +574,7 @@ export const ReadResultWidget: React.FC<{ content: string; filePath?: string }> * Widget for Glob tool */ export const GlobWidget: React.FC<{ pattern: string; result?: any }> = ({ pattern, result }) => { + const { t } = useTranslation(); // Extract result content if available let resultContent = ''; let isError = false; @@ -597,7 +600,7 @@ export const GlobWidget: React.FC<{ pattern: string; result?: any }> = ({ patter
- Searching for pattern: + {t('app.searchingForPattern')}: {pattern} @@ -874,6 +877,7 @@ export const GrepWidget: React.FC<{ exclude?: string; result?: any; }> = ({ pattern, include, path, exclude, result }) => { + const { t } = useTranslation(); const [isExpanded, setIsExpanded] = useState(true); // Extract result content if available @@ -927,7 +931,7 @@ export const GrepWidget: React.FC<{
- Searching with grep + {t('app.searchingWithGrep')} {!result && (
@@ -1804,6 +1808,7 @@ export const SystemInitializedWidget: React.FC<{ cwd?: string; tools?: string[]; }> = ({ sessionId, model, cwd, tools = [] }) => { + const { t } = useTranslation(); const [mcpExpanded, setMcpExpanded] = useState(false); // Separate regular tools from MCP tools @@ -1880,14 +1885,14 @@ export const SystemInitializedWidget: React.FC<{
-

System Initialized

+

{t('app.systemInitialized')}

{/* Session Info */}
{sessionId && (
- Session ID: + {t('app.sessionId')}: {sessionId} @@ -1897,7 +1902,7 @@ export const SystemInitializedWidget: React.FC<{ {model && (
- Model: + {t('app.model')}: {model} @@ -1907,7 +1912,7 @@ export const SystemInitializedWidget: React.FC<{ {cwd && (
- Working Directory: + {t('app.workingDirectory')}: {cwd} @@ -1921,7 +1926,7 @@ export const SystemInitializedWidget: React.FC<{
- Available Tools ({regularTools.length}) + {t('app.availableTools')} ({regularTools.length})
@@ -1950,7 +1955,7 @@ export const SystemInitializedWidget: React.FC<{ className="flex items-center gap-2 text-xs font-medium text-muted-foreground hover:text-foreground transition-colors" > - MCP Services ({mcpTools.length}) + {t('app.mcpServices')} ({mcpTools.length}) = React.memo(({ onSlashCommandsSettings, setCopyPopoverOpen }) => { + const { t } = useTranslation(); return ( = React.memo(({
- Claude Code Session + {t('app.claudeCodeSession')}
{projectPath && ( @@ -125,7 +127,7 @@ export const SessionHeader: React.FC = React.memo(({ className="w-full justify-start" onClick={onCopyAsJsonl} > - Copy as JSONL + {t('app.copyAsJsonl')}
} diff --git a/src/locales/en/common.json b/src/locales/en/common.json index f5dbff8..e3bd8f1 100644 --- a/src/locales/en/common.json +++ b/src/locales/en/common.json @@ -34,7 +34,34 @@ "of": "of", "loading": "Loading...", "from": "from", - "retry": "Retry" + "retry": "Retry", + "model": "Model", + "projectPath": "Project Path", + "task": "Task", + "started": "Started", + "output": "Output", + "copyOutput": "Copy Output", + "copyAsMarkdown": "Copy as Markdown", + "copyAsJsonl": "Copy as JSONL", + "close": "Close", + "systemInitialized": "System Initialized", + "availableTools": "Available Tools", + "workingDirectory": "Working Directory", + "sessionId": "Session ID", + "mcpServices": "MCP Services", + "searchingWithGrep": "Searching with grep", + "searchingForPattern": "Searching for pattern", + "fileContent": "File content", + "yesterday": "Yesterday", + "commands": "Commands", + "claudeCodeSession": "Claude Code Session", + "experimentalFeature": "Experimental Feature", + "checkpointingWarning": "Checkpointing may affect directory structure or cause data loss. Use with caution.", + "timeline": "Timeline", + "noCheckpointsYet": "No checkpoints yet", + "sessionTimeline": "Session Timeline", + "checkpoints": "checkpoints", + "loadingTimeline": "Loading timeline..." }, "navigation": { "projects": "CC Projects", @@ -80,6 +107,14 @@ "editAgent": "Edit Agent", "deleteAgent": "Delete Agent", "executeAgent": "Execute Agent", + "execute": "Execute", + "readyToExecute": "Ready to Execute", + "task": "Task", + "enterTask": "Enter the task for the agent", + "hooks": "Hooks", + "configureHooks": "Configure Hooks", + "fullscreen": "Fullscreen", + "stop": "Stop", "agentName": "Agent Name", "agentNameRequired": "Agent name is required", "agentIcon": "Agent Icon", @@ -102,6 +137,8 @@ "systemPromptRequired": "System prompt is required", "defaultTask": "Default Task", "model": "Model", + "projectPath": "Project Path", + "selectProjectPath": "Select or enter project path", "permissions": "Permissions", "fileAccess": "File Access", "networkAccess": "Network Access", @@ -119,7 +156,9 @@ "updateFailed": "Failed to update agent", "basicInformation": "Basic Information", "optional": "Optional", + "sonnetName": "Claude 4 Sonnet", "sonnetDescription": "Faster, efficient for most tasks", + "opusName": "Claude 4.1 Opus", "opusDescription": "More capable, better for complex tasks", "defaultTaskDescription": "This will be used as the default task placeholder when executing the agent", "systemPromptDescription": "Define the behavior and capabilities of your CC Agent", @@ -128,6 +167,15 @@ "createFirstAgent": "Create your first CC Agent to get started", "created": "Created", "execute": "Execute", + "readyToExecute": "Ready to Execute", + "enterTask": "Enter the task for the agent", + "hooks": "Hooks", + "configureHooks": "Configure Hooks", + "fullscreen": "Fullscreen", + "stop": "Stop", + "selectProjectPathAndTask": "Select a project path and enter a task to run the agent", + "noExecutionHistory": "No execution history yet", + "agentRunningWarning": "An agent is currently running. If you navigate away, the agent will continue running in the background. You can view running sessions in the 'Running Sessions' tab within CC Agents.\n\nDo you want to continue?", "export": "Export", "import": "Import", "importFromFile": "From File", @@ -155,6 +203,8 @@ }, "slashCommands": { "slashCommands": "Slash Commands", + "globalSearch": "Global Search", + "searching": "Searching", "projectSlashCommands": "Project Slash Commands", "createCustomCommandsProject": "Create custom commands for this project", "createCustomCommandsWorkflow": "Create custom commands to streamline your workflow", @@ -162,6 +212,8 @@ "allCommands": "All Commands", "project": "Project", "user": "User", + "userCommands": "User Commands", + "manageProjectCommands": "Manage project-specific slash commands for", "noCommandsFound": "No commands found", "noProjectCommandsYet": "No project commands created yet", "noCommandsYet": "No commands created yet", diff --git a/src/locales/zh/common.json b/src/locales/zh/common.json index e3b9913..f1f64f8 100644 --- a/src/locales/zh/common.json +++ b/src/locales/zh/common.json @@ -31,7 +31,34 @@ "page": "页面", "of": "共", "loading": "加载中...", - "from": "从" + "from": "从", + "model": "模型", + "projectPath": "项目路径", + "task": "任务", + "started": "开始时间", + "output": "输出", + "copyOutput": "复制输出", + "copyAsMarkdown": "复制为 Markdown", + "copyAsJsonl": "复制为 JSONL", + "close": "关闭", + "systemInitialized": "系统已初始化", + "availableTools": "可用工具", + "workingDirectory": "工作目录", + "sessionId": "会话 ID", + "mcpServices": "MCP 服务", + "searchingWithGrep": "使用 grep 搜索", + "searchingForPattern": "搜索模式", + "fileContent": "文件内容", + "yesterday": "昨天", + "commands": "命令", + "claudeCodeSession": "Claude Code 会话", + "experimentalFeature": "实验性功能", + "checkpointingWarning": "检查点可能会影响目录结构或导致数据丢失。请谨慎使用。", + "timeline": "时间线", + "noCheckpointsYet": "尚无检查点", + "sessionTimeline": "会话时间线", + "checkpoints": "个检查点", + "loadingTimeline": "加载时间线中..." }, "navigation": { "projects": "Claude Code 项目", @@ -99,6 +126,8 @@ "systemPromptRequired": "系统提示为必填项", "defaultTask": "默认任务", "model": "模型", + "projectPath": "项目路径", + "selectProjectPath": "选择或输入项目路径", "permissions": "权限", "fileAccess": "文件访问", "networkAccess": "网络访问", @@ -116,7 +145,9 @@ "updateFailed": "更新智能体失败", "basicInformation": "基本信息", "optional": "可选", + "sonnetName": "Claude 4 Sonnet", "sonnetDescription": "更快,适用于大多数任务", + "opusName": "Claude 4.1 Opus", "opusDescription": "功能更强,适用于复杂任务", "defaultTaskDescription": "执行智能体时将用作默认任务占位符", "systemPromptDescription": "定义您的 CC 智能体的行为和功能", @@ -125,6 +156,15 @@ "createFirstAgent": "创建您的第一个 CC 智能体来开始", "created": "创建于", "execute": "执行", + "readyToExecute": "准备执行", + "enterTask": "输入智能体的任务", + "hooks": "钩子", + "configureHooks": "配置钩子", + "fullscreen": "全屏", + "stop": "停止", + "selectProjectPathAndTask": "选择项目路径并输入任务以运行智能体", + "noExecutionHistory": "尚无执行历史", + "agentRunningWarning": "智能体正在运行。如果您离开此页面,智能体将在后台继续运行。您可以在 CC Agents 中的“运行中的会话”选项卡中查看运行中的会话。\n\n是否继续?", "export": "导出", "import": "导入", "importFromFile": "从文件导入", @@ -152,6 +192,8 @@ }, "slashCommands": { "slashCommands": "斜杠命令", + "globalSearch": "全局搜索", + "searching": "搜索中", "projectSlashCommands": "项目斜杠命令", "createCustomCommandsProject": "为此项目创建自定义命令", "createCustomCommandsWorkflow": "创建自定义命令来简化您的工作流程", @@ -159,6 +201,8 @@ "allCommands": "所有命令", "project": "项目", "user": "用户", + "userCommands": "用户命令", + "manageProjectCommands": "管理项目特定的斜杠命令", "noCommandsFound": "未找到命令", "noProjectCommandsYet": "尚未创建项目命令", "noCommandsYet": "尚未创建命令", @@ -519,6 +563,9 @@ "noAgentDataSpecified": "未指定智能体数据", "importAgentComingSoon": "导入智能体功能即将推出...", "unknownTabType": "未知的标签页类型", + "typeYourPromptHere": "在此输入您的提示...", + "dropImagesHere": "在此放置图片...", + "askClaudeAnything": "询问 Claude 任何问题...", "selectClaudeCodeInstallation": "选择 Claude Code 安装", "multipleInstallationsFound": "在您的系统上找到了多个 Claude Code 安装。请选择您要使用的安装。", "claudeCodeNotFoundDialog": "在常见安装位置中未找到 Claude Code。请安装 Claude Code 以继续。",