FN-6769: localize remaining dashboard strings

Localize the remaining dashboard UI clusters and refresh the generated i18n resources.

- Replace hardcoded labels across agent, plugin, mission, workflow node, research, document, activity, and miscellaneous dashboard components with app namespace translations.
- Add and synchronize locale catalog entries for English, Spanish, French, Korean, Simplified Chinese, and Traditional Chinese.
- Update i18n lint configuration and generated resource types, with a patch changeset for the published CLI package.

Files changed:
 .changeset/fn-6769-i18n-cluster.md                 |   5 +
 i18next.config.ts                                  |  47 +--
 .../dashboard/app/components/ActiveAgentsPanel.tsx |   2 +-
 packages/dashboard/app/components/ActivityFeed.tsx |  12 +-
 .../dashboard/app/components/ActivityLogModal.tsx  |   4 +-
 packages/dashboard/app/components/AddNodeModal.tsx |   4 +-
 .../dashboard/app/components/AgentDetailView.tsx   |   6 +-
 .../app/components/AgentGenerationModal.tsx        |   2 +-
 .../dashboard/app/components/AgentImportModal.tsx  |   4 +-
 .../app/components/AgentOnboardingModal.tsx        |   4 +-
 .../app/components/AgentPromptsManager.tsx         |   2 +-
 .../dashboard/app/components/AgentRunHistory.tsx   |   2 +-
 .../dashboard/app/components/AgentsOverviewBar.tsx |   2 +-
 .../dashboard/app/components/BranchGroupCard.tsx   |   4 +-
 .../dashboard/app/components/CliBinaryPanel.tsx    |   8 +-
 .../app/components/CursorCliProviderCard.tsx       |   4 +-
 .../dashboard/app/components/DashboardLoader.tsx   |   4 +-
 .../dashboard/app/components/DevServerView.tsx     |   8 +-
 .../dashboard/app/components/DocumentsView.tsx     |   6 +-
 .../dashboard/app/components/ErrorBoundary.tsx     |   9 +-
 .../dashboard/app/components/ExecutorStatusBar.tsx |   5 +-
 .../dashboard/app/components/GitHubStarPrompt.tsx  |  14 +-
 .../dashboard/app/components/GitManagerModal.tsx   |   4 +-
 .../dashboard/app/components/GroupTaskModal.tsx    |   2 +-
 packages/dashboard/app/components/Header.tsx       |   4 +-
 .../dashboard/app/components/HermesRuntimeCard.tsx |   2 +-
 packages/dashboard/app/components/InsightsView.tsx |   2 +-
 .../dashboard/app/components/IssueMentionPopup.tsx |   5 +-
 packages/dashboard/app/components/MailboxView.tsx  |   6 +-
 .../components/MilestoneSliceInterviewModal.tsx    |   2 +-
 .../app/components/MissionInterviewModal.tsx       |   2 +-
 .../dashboard/app/components/MissionManager.tsx    |   8 +-
 .../app/components/ModelOnboardingModal.tsx        |   2 +-
 .../dashboard/app/components/NodeDetailModal.tsx   |   2 +-
 .../app/components/PiExtensionsManager.tsx         |  10 +-
 .../dashboard/app/components/ProjectSelector.tsx   |   6 +-
 packages/dashboard/app/components/QuickChatFAB.tsx |  44 +--
 packages/dashboard/app/components/ResearchView.tsx |   2 +-
 packages/dashboard/app/components/RoutineCard.tsx  |   6 +-
 .../dashboard/app/components/RoutineEditor.tsx     |   2 +-
 packages/dashboard/app/components/RoutingTab.tsx   |   2 +-
 packages/dashboard/app/components/ScheduleCard.tsx |   6 +-
 packages/dashboard/app/components/ScheduleForm.tsx |   2 +-
 packages/dashboard/app/components/ScriptsModal.tsx |   2 +-
 .../app/components/StashConflictModal.tsx          |   4 +-
 .../dashboard/app/components/TerminalModal.tsx     |   2 +-
 .../app/components/nodes/WorkflowNodeTypes.tsx     |  47 +--
 packages/i18n/locales/en/app.json                  | 274 +++++++--------
 packages/i18n/locales/es/app.json                  | 144 ++++++--
 packages/i18n/locales/fr/app.json                  | 144 ++++++--
 packages/i18n/locales/ko/app.json                  | 144 ++++++--
 packages/i18n/locales/zh-CN/app.json               | 144 ++++++--
 packages/i18n/locales/zh-TW/app.json               | 144 ++++++--
 packages/i18n/src/resources.d.ts                   | 375 +++++++++++++++++++--
 54 files changed, 1261 insertions(+), 442 deletions(-)

Fusion-Task-Id: FN-6769

Fusion-Task-Lineage: a8733dc9-3b48-47e6-88c4-020f83ab41de
This commit is contained in:
gsxdsm
2026-06-20 05:04:25 -07:00
parent fec197afdf
commit b760fa0df9
54 changed files with 1261 additions and 442 deletions

View File

@@ -0,0 +1,5 @@
---
"@runfusion/fusion": patch
---
Localize remaining plugin, agent, mission, node, research, document, activity, and miscellaneous dashboard strings and remove their i18n lint deferrals.

View File

@@ -8,65 +8,20 @@ import {
const DEFERRED_I18N_LINT_FILES = [ const DEFERRED_I18N_LINT_FILES = [
// FNXC:i18n-LintBaseline 2026-06-19-00:00: // FNXC:i18n-LintBaseline 2026-06-19-00:00:
// These exact files still carry pre-existing user-facing copy debt after FN-6749 restored the guardrail scope and token suppression. // These exact files still carry pre-existing user-facing copy debt after FN-6749 restored the guardrail scope and token suppression.
// Deferral split: 23 settings section files -> FN-6771, 21 workflow/task/setup/PR files -> FN-6770, and 36 plugin/agent/mission/misc files -> FN-6769. // Deferral split after FN-6769: 23 settings section files -> FN-6771 and workflow/task/setup/PR files -> FN-6770.
// Keep the deferral file-scoped and remove entries as those follow-ups localize each cluster. // Keep the deferral file-scoped and remove entries as those follow-ups localize each cluster.
"packages/dashboard/app/components/WorkflowSelector.tsx", "packages/dashboard/app/components/WorkflowSelector.tsx",
"packages/dashboard/app/components/WorkflowResultsTab.tsx", "packages/dashboard/app/components/WorkflowResultsTab.tsx",
"packages/dashboard/app/components/WorkflowNodeEditor.tsx", "packages/dashboard/app/components/WorkflowNodeEditor.tsx",
"packages/dashboard/app/components/TerminalModal.tsx",
"packages/dashboard/app/components/TaskDetailModal.tsx", "packages/dashboard/app/components/TaskDetailModal.tsx",
"packages/dashboard/app/components/TaskComments.tsx", "packages/dashboard/app/components/TaskComments.tsx",
"packages/dashboard/app/components/TaskChatTab.tsx", "packages/dashboard/app/components/TaskChatTab.tsx",
"packages/dashboard/app/components/StashConflictModal.tsx",
"packages/dashboard/app/components/SetupWizardModal.tsx", "packages/dashboard/app/components/SetupWizardModal.tsx",
"packages/dashboard/app/components/SettingsModal.tsx", "packages/dashboard/app/components/SettingsModal.tsx",
"packages/dashboard/app/components/ScriptsModal.tsx",
"packages/dashboard/app/components/ScheduleForm.tsx",
"packages/dashboard/app/components/ScheduleCard.tsx",
"packages/dashboard/app/components/RoutingTab.tsx",
"packages/dashboard/app/components/RoutineEditor.tsx",
"packages/dashboard/app/components/RoutineCard.tsx",
"packages/dashboard/app/components/ResearchView.tsx",
"packages/dashboard/app/components/QuickChatFAB.tsx",
"packages/dashboard/app/components/PullRequestView.tsx", "packages/dashboard/app/components/PullRequestView.tsx",
"packages/dashboard/app/components/ProjectSelector.tsx",
"packages/dashboard/app/components/PrPanel.tsx", "packages/dashboard/app/components/PrPanel.tsx",
"packages/dashboard/app/components/PrCreateModal.tsx", "packages/dashboard/app/components/PrCreateModal.tsx",
"packages/dashboard/app/components/PiExtensionsManager.tsx",
"packages/dashboard/app/components/NodeDetailModal.tsx",
"packages/dashboard/app/components/ModelOnboardingModal.tsx",
"packages/dashboard/app/components/MissionManager.tsx",
"packages/dashboard/app/components/MissionInterviewModal.tsx",
"packages/dashboard/app/components/MilestoneSliceInterviewModal.tsx",
"packages/dashboard/app/components/MailboxView.tsx",
"packages/dashboard/app/components/IssueMentionPopup.tsx",
"packages/dashboard/app/components/InsightsView.tsx",
"packages/dashboard/app/components/HermesRuntimeCard.tsx",
"packages/dashboard/app/components/Header.tsx",
"packages/dashboard/app/components/GroupTaskModal.tsx",
"packages/dashboard/app/components/GitManagerModal.tsx",
"packages/dashboard/app/components/GitHubStarPrompt.tsx",
"packages/dashboard/app/components/ExecutorStatusBar.tsx",
"packages/dashboard/app/components/ErrorBoundary.tsx",
"packages/dashboard/app/components/DocumentsView.tsx",
"packages/dashboard/app/components/DevServerView.tsx",
"packages/dashboard/app/components/DashboardLoader.tsx",
"packages/dashboard/app/components/CursorCliProviderCard.tsx",
"packages/dashboard/app/components/CliBinaryPanel.tsx",
"packages/dashboard/app/components/BranchGroupCard.tsx",
"packages/dashboard/app/components/Board.tsx", "packages/dashboard/app/components/Board.tsx",
"packages/dashboard/app/components/AgentsOverviewBar.tsx",
"packages/dashboard/app/components/AgentRunHistory.tsx",
"packages/dashboard/app/components/AgentPromptsManager.tsx",
"packages/dashboard/app/components/AgentOnboardingModal.tsx",
"packages/dashboard/app/components/AgentImportModal.tsx",
"packages/dashboard/app/components/AgentGenerationModal.tsx",
"packages/dashboard/app/components/AgentDetailView.tsx",
"packages/dashboard/app/components/AddNodeModal.tsx",
"packages/dashboard/app/components/ActivityLogModal.tsx",
"packages/dashboard/app/components/ActivityFeed.tsx",
"packages/dashboard/app/components/ActiveAgentsPanel.tsx",
"packages/dashboard/app/components/nodes/WorkflowNodeTypes.tsx",
"packages/dashboard/app/components/settings/sections/WorktreesSection.tsx", "packages/dashboard/app/components/settings/sections/WorktreesSection.tsx",
"packages/dashboard/app/components/settings/sections/SchedulingSection.tsx", "packages/dashboard/app/components/settings/sections/SchedulingSection.tsx",
"packages/dashboard/app/components/settings/sections/ScheduledEvalsSection.tsx", "packages/dashboard/app/components/settings/sections/ScheduledEvalsSection.tsx",

View File

@@ -153,7 +153,7 @@ function LiveAgentCard({ agent, projectId, onSelect, onOpenTaskLogs }: LiveAgent
</div> </div>
<div className="live-agent-card-footer"> <div className="live-agent-card-footer">
<div className="live-agent-card-footer-meta"> <div className="live-agent-card-footer-meta">
<span className="text-secondary" title="Time since last heartbeat"> <span className="text-secondary" title={t("agents.timeSinceLastHeartbeat", "Time since last heartbeat")}>
{formatElapsed(elapsed)} {formatElapsed(elapsed)}
</span> </span>
{nextHeartbeatLabel && ( {nextHeartbeatLabel && (

View File

@@ -1,4 +1,5 @@
import { memo, useCallback, useMemo } from "react"; import { memo, useCallback, useMemo } from "react";
import { useTranslation } from "react-i18next";
import "./ActivityFeed.css"; import "./ActivityFeed.css";
import { import {
GitMerge, GitMerge,
@@ -149,8 +150,11 @@ function ActivityFeedInner({
isLoading = false, isLoading = false,
error = null, error = null,
projectNames = {}, projectNames = {},
emptyMessage = "No recent activity", emptyMessage,
}: ActivityFeedProps) { }: ActivityFeedProps) {
const { t } = useTranslation("app");
const resolvedEmptyMessage = emptyMessage ?? t("activityFeed.noRecentActivity", "No recent activity");
const getProjectName = useCallback((projectId: string): string => { const getProjectName = useCallback((projectId: string): string => {
return projectNames[projectId] || projectId; return projectNames[projectId] || projectId;
}, [projectNames]); }, [projectNames]);
@@ -206,9 +210,9 @@ function ActivityFeedInner({
<div className="activity-feed activity-feed-empty"> <div className="activity-feed activity-feed-empty">
<div className="activity-feed-empty-state"> <div className="activity-feed-empty-state">
<CheckCircle size={32} /> <CheckCircle size={32} />
<p>{emptyMessage}</p> <p>{resolvedEmptyMessage}</p>
<span className="activity-feed-empty-hint"> <span className="activity-feed-empty-hint">
Activity will appear here when tasks are created, moved, or completed {t("activityFeed.emptyHint", "Activity will appear here when tasks are created, moved, or completed")}
</span> </span>
</div> </div>
</div> </div>
@@ -222,7 +226,7 @@ function ActivityFeedInner({
<div className="activity-feed-group-header"> <div className="activity-feed-group-header">
<span className="activity-feed-group-date">{group.date}</span> <span className="activity-feed-group-date">{group.date}</span>
<span className="activity-feed-group-count"> <span className="activity-feed-group-count">
{group.entries.length} event{group.entries.length !== 1 ? "s" : ""} {t("activityFeed.eventCount", { count: group.entries.length, defaultValue_one: "{{count}} event", defaultValue_other: "{{count}} events" })}
</span> </span>
</div> </div>
<div className="activity-feed-list"> <div className="activity-feed-list">

View File

@@ -314,12 +314,12 @@ export function ActivityLogModal({
<span className="activity-log-filter-label">{t("activityLog.activeFilters", "Active filters:")}</span> <span className="activity-log-filter-label">{t("activityLog.activeFilters", "Active filters:")}</span>
{filteredProjectId !== "all" && ( {filteredProjectId !== "all" && (
<span className="activity-log-filter-badge"> <span className="activity-log-filter-badge">
Project: {projects.find(p => p.id === filteredProjectId)?.name || filteredProjectId} {t("activityLog.projectFilterBadge", "Project: {{project}}", { project: projects.find(p => p.id === filteredProjectId)?.name || filteredProjectId })}
</span> </span>
)} )}
{filteredType !== "all" && ( {filteredType !== "all" && (
<span className="activity-log-filter-badge"> <span className="activity-log-filter-badge">
Type: {EVENT_TYPE_LABELS[filteredType]} {t("activityLog.typeFilterBadge", "Type: {{type}}", { type: EVENT_TYPE_LABELS[filteredType] })}
</span> </span>
)} )}
<button <button

View File

@@ -371,7 +371,7 @@ export function AddNodeModal({ isOpen, onClose, onSubmit, onDiscoverRemoteProjec
</div> </div>
{discoveryState === "success" && discoveredProjects.length > 0 && ( {discoveryState === "success" && discoveredProjects.length > 0 && (
<div className="add-node-modal__discovered-list" aria-label="Discovered remote projects"> <div className="add-node-modal__discovered-list" aria-label={t("nodes.discoveredRemoteProjectsLabel", "Discovered remote projects")}>
{discoveredProjects.map((project) => ( {discoveredProjects.map((project) => (
<div key={`${project.id}-${project.path}`} className="card add-node-modal__discovered-card"> <div key={`${project.id}-${project.path}`} className="card add-node-modal__discovered-card">
<div className="add-node-modal__discovered-row"> <div className="add-node-modal__discovered-row">
@@ -402,7 +402,7 @@ export function AddNodeModal({ isOpen, onClose, onSubmit, onDiscoverRemoteProjec
{errors.maxConcurrent && <span className="form-error add-node-modal__error">{errors.maxConcurrent}</span>} {errors.maxConcurrent && <span className="form-error add-node-modal__error">{errors.maxConcurrent}</span>}
</label> </label>
<section className="add-node-modal__projects" aria-label="Project path mappings"> <section className="add-node-modal__projects" aria-label={t("nodes.projectPathMappingsLabel", "Project path mappings")}>
<h4 className="add-node-modal__projects-title">{t("nodes.attachProjects", "Attach Existing Projects")}</h4> <h4 className="add-node-modal__projects-title">{t("nodes.attachProjects", "Attach Existing Projects")}</h4>
<p className="add-node-modal__hint">{t("nodes.attachProjectsHint", "Select existing projects to run on this node and provide the node-specific absolute path for each one.")}</p> <p className="add-node-modal__hint">{t("nodes.attachProjectsHint", "Select existing projects to run on this node and provide the node-specific absolute path for each one.")}</p>
{projects.length === 0 ? ( {projects.length === 0 ? (

View File

@@ -635,7 +635,7 @@ export function AgentDetailView({ agentId, projectId, onClose, addToast, onChild
if (isLoading) { if (isLoading) {
if (inline) { if (inline) {
return ( return (
<div className="agent-detail-inline-loading" role="region" aria-label="Agent detail loading"> <div className="agent-detail-inline-loading" role="region" aria-label={t("agents.detailLoadingLabel", "Agent detail loading")}>
<div className="agent-detail-loading"> <div className="agent-detail-loading">
<Loader2 className="animate-spin" size={24} /> <Loader2 className="animate-spin" size={24} />
<span>{t("agents.loading", "Loading agent...")}</span> <span>{t("agents.loading", "Loading agent...")}</span>
@@ -2139,7 +2139,7 @@ function RunsTab({
const renderCacheWindow = (label: string, window: AgentTokenUsageWindowSummary) => ( const renderCacheWindow = (label: string, window: AgentTokenUsageWindowSummary) => (
<div className="run-context-item" key={label}> <div className="run-context-item" key={label}>
<span className="text-muted">{label}:</span>{" "} <span className="text-muted">{label}:</span>{" "}
<span>{(window.hitRatio * 100).toFixed(1)}% ({window.totalCachedTokens.toLocaleString()} / {window.totalCacheWriteTokens.toLocaleString()} / {window.totalInputTokens.toLocaleString()} / {window.nTasks.toLocaleString()})</span> <span>{t("agents.cacheWindowSummary", "{{percent}}% ({{cached}} / {{written}} / {{input}} / {{tasks}})", { percent: (window.hitRatio * 100).toFixed(1), cached: window.totalCachedTokens.toLocaleString(), written: window.totalCacheWriteTokens.toLocaleString(), input: window.totalInputTokens.toLocaleString(), tasks: window.nTasks.toLocaleString() })}</span>
</div> </div>
); );
@@ -3109,7 +3109,7 @@ function InstructionsTab({
<div className="config-fields"> <div className="config-fields">
<div className="config-field"> <div className="config-field">
<label htmlFor="instructions-text">Inline Instructions</label> <label htmlFor="instructions-text">{t("agents.inlineInstructions", "Inline Instructions")}</label>
<div className="agent-content-toolbar"> <div className="agent-content-toolbar">
<div className="agent-content-mode-toggle"> <div className="agent-content-mode-toggle">
<button <button

View File

@@ -168,7 +168,7 @@ export function AgentGenerationModal({
className="agent-dialog" className="agent-dialog"
role="dialog" role="dialog"
aria-modal="true" aria-modal="true"
aria-label="Generate agent with AI" aria-label={t("agents.generateWithAiLabel", "Generate agent with AI")}
> >
{/* Header */} {/* Header */}
<div className="agent-dialog-header"> <div className="agent-dialog-header">

View File

@@ -739,10 +739,10 @@ export function AgentImportModal({ isOpen, onClose, onImported, projectId, initi
{agent.title && <span className="agent-import-agent-title">{agent.title} · </span>} {agent.title && <span className="agent-import-agent-title">{agent.title} · </span>}
<span className="agent-import-agent-role">{agent.role}</span> <span className="agent-import-agent-role">{agent.role}</span>
{agent.reportsTo && ( {agent.reportsTo && (
<span className="agent-import-agent-reports"> · reports to {agent.reportsTo}</span> <span className="agent-import-agent-reports">{t("agents.importReportsTo", " · reports to {{agent}}", { agent: agent.reportsTo })}</span>
)} )}
{agent.skills && agent.skills.length > 0 && ( {agent.skills && agent.skills.length > 0 && (
<span className="agent-import-agent-model"> · skills: {agent.skills.join(", ")}</span> <span className="agent-import-agent-model">{t("agents.importSkills", " · skills: {{skills}}", { skills: agent.skills.join(", ") })}</span>
)} )}
</span> </span>
{agent.instructionsText && ( {agent.instructionsText && (

View File

@@ -191,9 +191,9 @@ export function AgentOnboardingModal({ isOpen, onClose, onCreated, addToast, pro
return ( return (
<div className="modal-overlay open" role="presentation"> <div className="modal-overlay open" role="presentation">
<div className="modal modal-lg agent-onboarding-modal" role="dialog" aria-modal="true" aria-label="Agent onboarding"> <div className="modal modal-lg agent-onboarding-modal" role="dialog" aria-modal="true" aria-label={t("agents.onboarding.title", "Agent Onboarding")}>
<div className="modal-header"> <div className="modal-header">
<h3>{t("agents.onboarding", "Agent Onboarding")}</h3> <h3>{t("agents.onboarding.title", "Agent Onboarding")}</h3>
<button className="modal-close" onClick={() => void handleClose()} aria-label={t("common.close", "Close")}>×</button> <button className="modal-close" onClick={() => void handleClose()} aria-label={t("common.close", "Close")}>×</button>
</div> </div>

View File

@@ -526,7 +526,7 @@ export function AgentPromptsManager({
/> />
<div className="prompt-override-footer"> <div className="prompt-override-footer">
<small className="prompt-override-hint"> <small className="prompt-override-hint">
{templateForm.prompt.length} characters {t("agents.charactersCount", "{{count}} characters", { count: templateForm.prompt.length })}
</small> </small>
</div> </div>
</div> </div>

View File

@@ -103,7 +103,7 @@ export function AgentRunHistory({ agentId, projectId, onRunClick }: AgentRunHist
)} )}
{usage && ( {usage && (
<span className="badge text-secondary"> <span className="badge text-secondary">
{((usage.inputTokens + usage.outputTokens) / 1000).toFixed(1)}k tokens {t("agents.kTokens", "{{count}}k tokens", { count: Number(((usage.inputTokens + usage.outputTokens) / 1000).toFixed(1)) })}
</span> </span>
)} )}
{run.triggerDetail && ( {run.triggerDetail && (

View File

@@ -29,7 +29,7 @@ export function AgentsOverviewBar({
const runningCount = activeAgents.filter((a) => a.state === "running").length; const runningCount = activeAgents.filter((a) => a.state === "running").length;
return ( return (
<section className="agents-overview-bar" aria-label="Agents overview"> <section className="agents-overview-bar" aria-label={t("agents.overviewLabel", "Agents overview")}>
<button <button
type="button" type="button"
className="agents-overview-bar__toggle" className="agents-overview-bar__toggle"

View File

@@ -158,7 +158,7 @@ export function BranchGroupCard({ groupId, projectId }: BranchGroupCardProps) {
<span className="badge">{group.prState === "merged" ? "Group PR merged" : "Group PR closed"}</span> <span className="badge">{group.prState === "merged" ? "Group PR merged" : "Group PR closed"}</span>
{group.prUrl && ( {group.prUrl && (
<a className="btn" href={group.prUrl} target="_blank" rel="noreferrer"> <a className="btn" href={group.prUrl} target="_blank" rel="noreferrer">
<GitPullRequest size={14} /> PR #{group.prNumber ?? "—"} <GitPullRequest size={14} /> {t("branchGroups.prNumber", "PR #{{number}}", { number: group.prNumber ?? "—" })}
<ExternalLink size={12} /> <ExternalLink size={12} />
</a> </a>
)} )}
@@ -169,7 +169,7 @@ export function BranchGroupCard({ groupId, projectId }: BranchGroupCardProps) {
<div className="branch-group-card-actions"> <div className="branch-group-card-actions">
{group.prUrl && ( {group.prUrl && (
<a className="btn" href={group.prUrl} target="_blank" rel="noreferrer"> <a className="btn" href={group.prUrl} target="_blank" rel="noreferrer">
<GitPullRequest size={14} /> PR #{group.prNumber ?? "—"} <GitPullRequest size={14} /> {t("branchGroups.prNumber", "PR #{{number}}", { number: group.prNumber ?? "—" })}
<ExternalLink size={12} /> <ExternalLink size={12} />
</a> </a>
)} )}

View File

@@ -120,20 +120,20 @@ export function CliBinaryPanel({ defer = false }: Props) {
{status.binary.installed ? ( {status.binary.installed ? (
<ul className="cli-binary-info-list"> <ul className="cli-binary-info-list">
<li> <li>
<span>Binary:</span> <span>{t("cliBinary.binaryLabel", "Binary:")}</span>
<code>{status.binary.binary}</code> <code>{status.binary.binary}</code>
</li> </li>
{status.binary.path && ( {status.binary.path && (
<li> <li>
<span>Path:</span> <span>{t("cliBinary.pathLabel", "Path:")}</span>
<code>{status.binary.path}</code> <code>{status.binary.path}</code>
</li> </li>
)} )}
<li> <li>
<span>Version:</span> <span>{t("cliBinary.versionLabel", "Version:")}</span>
<code>{status.binary.version ?? "unknown"}</code> <code>{status.binary.version ?? "unknown"}</code>
<span className="cli-binary-expected"> <span className="cli-binary-expected">
(expected {status.expectedVersion}) {t("cliBinary.expectedVersion", "(expected {{version}})", { version: status.expectedVersion })}
</span> </span>
</li> </li>
</ul> </ul>

View File

@@ -91,7 +91,7 @@ export function CursorCliProviderCard({ authenticated, compact = false, onToggle
<div className="auth-provider-header"> <div className="auth-provider-header">
<div className="auth-provider-info"> <div className="auth-provider-info">
<ProviderIcon provider="cursor-cli" size="sm" /> <ProviderIcon provider="cursor-cli" size="sm" />
<strong>Cursor — via Cursor CLI</strong> <strong>{t("setup.cursorCli.providerName", "Cursor — via Cursor CLI")}</strong>
<span className={`auth-status-badge ${currentlyEnabled ? "authenticated" : "not-authenticated"}`}>{currentlyEnabled ? t("setup.cursorCli.active", "✓ Active") : t("setup.cursorCli.notConnected", "✗ Not connected")}</span> <span className={`auth-status-badge ${currentlyEnabled ? "authenticated" : "not-authenticated"}`}>{currentlyEnabled ? t("setup.cursorCli.active", "✓ Active") : t("setup.cursorCli.notConnected", "✗ Not connected")}</span>
</div> </div>
<div className="auth-provider-cli-actions">{actions}</div> <div className="auth-provider-cli-actions">{actions}</div>
@@ -107,7 +107,7 @@ export function CursorCliProviderCard({ authenticated, compact = false, onToggle
<ProviderIcon provider="cursor-cli" size="md" /> <ProviderIcon provider="cursor-cli" size="md" />
</div> </div>
<div className="onboarding-provider-card__body"> <div className="onboarding-provider-card__body">
<strong className="onboarding-provider-card__name">Cursor — via Cursor CLI</strong> <strong className="onboarding-provider-card__name">{t("setup.cursorCli.providerName", "Cursor — via Cursor CLI")}</strong>
<span className="onboarding-provider-card__description">{t("setup.cursorCli.description", "Route AI calls through your local Cursor agent runtime.")}</span> <span className="onboarding-provider-card__description">{t("setup.cursorCli.description", "Route AI calls through your local Cursor agent runtime.")}</span>
<small className="settings-muted">{statusText}</small> <small className="settings-muted">{statusText}</small>
</div> </div>

View File

@@ -80,12 +80,12 @@ export function DashboardLoader({ stage }: DashboardLoaderProps) {
className="dashboard-loader" className="dashboard-loader"
role="status" role="status"
aria-live="polite" aria-live="polite"
aria-label={isVersionUpdate ? t("dashboard.updatingMessage", "Updating Fusion dashboard") : t("dashboard.loadingMessage", "Loading Fusion dashboard")} aria-label={isVersionUpdate ? t("dashboard.updatingMessage") : t("dashboard.loadingMessage")}
data-stage={stage} data-stage={stage}
data-version-update={isVersionUpdate ? "true" : undefined} data-version-update={isVersionUpdate ? "true" : undefined}
> >
<div className="dashboard-loader__content"> <div className="dashboard-loader__content">
<h1 className="dashboard-loader__logo">Fusion</h1> <h1 className="dashboard-loader__logo">{t("appName", "Fusion")}</h1>
{isVersionUpdate ? ( {isVersionUpdate ? (
<p className="dashboard-loader__message dashboard-loader__message--update"> <p className="dashboard-loader__message dashboard-loader__message--update">
{t("dashboard.updatingVersion", "Updating to a new frontend version...")} {t("dashboard.updatingVersion", "Updating to a new frontend version...")}

View File

@@ -365,7 +365,7 @@ export function DevServerView({ addToast, projectId }: DevServerViewProps) {
return ( return (
<div className="dev-server-view" data-testid="dev-server-view"> <div className="dev-server-view" data-testid="dev-server-view">
<section className="dev-server-header" aria-label="Dev server controls header"> <section className="dev-server-header" aria-label={t("devserver.controlsHeaderLabel", "Dev server controls header")}>
<div className="dev-server-header-title"> <div className="dev-server-header-title">
<Monitor size={16} /> <Monitor size={16} />
<h2>{t("devserver.title", "Dev Server")}</h2> <h2>{t("devserver.title", "Dev Server")}</h2>
@@ -410,7 +410,7 @@ export function DevServerView({ addToast, projectId }: DevServerViewProps) {
</div> </div>
</section> </section>
<section className="dev-server-panel dev-server-config" aria-label="Dev server configuration"> <section className="dev-server-panel dev-server-config" aria-label={t("devserver.configurationLabel", "Dev server configuration")}>
<div className="dev-server-section-header"> <div className="dev-server-section-header">
<h3>{t("devserver.configuration", "Configuration")}</h3> <h3>{t("devserver.configuration", "Configuration")}</h3>
{isLoading && <span className="dev-server-muted">{t("devserver.loading", "Loading...")}</span>} {isLoading && <span className="dev-server-muted">{t("devserver.loading", "Loading...")}</span>}
@@ -532,7 +532,7 @@ export function DevServerView({ addToast, projectId }: DevServerViewProps) {
</section> </section>
<div className="dev-server-content"> <div className="dev-server-content">
<section className="dev-server-panel dev-server-logs-panel" data-testid="dev-server-logs-panel" aria-label="Dev server logs"> <section className="dev-server-panel dev-server-logs-panel" data-testid="dev-server-logs-panel" aria-label={t("devserver.logsLabel", "Dev server logs")}>
<div className="dev-server-section-header"> <div className="dev-server-section-header">
<h3>{t("devserver.logs", "Logs")}</h3> <h3>{t("devserver.logs", "Logs")}</h3>
<span className="dev-server-muted">{t("devserver.lines", "{{count}} lines", { count: logsTotal ?? logEntries.length })}</span> <span className="dev-server-muted">{t("devserver.lines", "{{count}} lines", { count: logsTotal ?? logEntries.length })}</span>
@@ -551,7 +551,7 @@ export function DevServerView({ addToast, projectId }: DevServerViewProps) {
</section> </section>
</div> </div>
<section className="dev-server-panel devserver-preview-panel" data-testid="devserver-preview-panel" aria-label="Dev server preview"> <section className="dev-server-panel devserver-preview-panel" data-testid="devserver-preview-panel" aria-label={t("devserver.previewLabel", "Dev server preview")}>
<div className="devserver-preview-header"> <div className="devserver-preview-header">
<div className="devserver-preview-title"> <div className="devserver-preview-title">
<Eye size={14} /> <Eye size={14} />

View File

@@ -411,7 +411,7 @@ export function DocumentsView({ projectId, addToast, onOpenDetail, onSendSelecti
</div> </div>
<div className="documents-controls-row"> <div className="documents-controls-row">
<div className="documents-tab-bar" role="tablist" aria-label="Documents sections"> <div className="documents-tab-bar" role="tablist" aria-label={t("documents.sectionsLabel", "Documents sections")}>
<button <button
className={`btn documents-tab${activeTab === "project" ? " active" : ""}`} className={`btn documents-tab${activeTab === "project" ? " active" : ""}`}
role="tab" role="tab"
@@ -498,7 +498,7 @@ export function DocumentsView({ projectId, addToast, onOpenDetail, onSendSelecti
) : ( ) : (
<div className={`documents-project-layout${isMobile ? " documents-project-layout--mobile" : ""}`}> <div className={`documents-project-layout${isMobile ? " documents-project-layout--mobile" : ""}`}>
{(!isMobile || !selectedFile) && ( {(!isMobile || !selectedFile) && (
<aside className="documents-view-sidebar" aria-label="Project markdown files"> <aside className="documents-view-sidebar" aria-label={t("documents.projectMarkdownFilesLabel", "Project markdown files")}>
<ul className="markdown-file-list"> <ul className="markdown-file-list">
{filteredProjectFiles.map((file) => { {filteredProjectFiles.map((file) => {
const isSelected = selectedFile?.path === file.path; const isSelected = selectedFile?.path === file.path;
@@ -524,7 +524,7 @@ export function DocumentsView({ projectId, addToast, onOpenDetail, onSendSelecti
)} )}
{(!isMobile || selectedFile) && ( {(!isMobile || selectedFile) && (
<section className="documents-view-main" aria-label="Project file content preview"> <section className="documents-view-main" aria-label={t("documents.projectFilePreviewLabel", "Project file content preview")}>
{isMobile && selectedFile && ( {isMobile && selectedFile && (
<button <button
className="btn btn-sm documents-mobile-back" className="btn btn-sm documents-mobile-back"

View File

@@ -1,6 +1,7 @@
import { Component, type ReactNode, type ErrorInfo } from "react"; import { Component, type ReactNode, type ErrorInfo } from "react";
import { AlertTriangle } from "lucide-react"; import { AlertTriangle } from "lucide-react";
import { handleChunkLoadError } from "../versionCheck"; import { handleChunkLoadError } from "../versionCheck";
import i18n from "../i18n";
import "./ErrorBoundary.css"; import "./ErrorBoundary.css";
interface ErrorBoundaryProps { interface ErrorBoundaryProps {
@@ -47,8 +48,8 @@ export class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundarySt
const level = this.props.level ?? "page"; const level = this.props.level ?? "page";
const isModal = level === "modal"; const isModal = level === "modal";
const title = isModal const title = isModal
? "This section encountered an error" ? i18n.t("app:errorBoundary.sectionError", "This section encountered an error")
: "Something went wrong"; : i18n.t("app:errorBoundary.genericError", "Something went wrong");
return ( return (
<div className={`error-boundary error-boundary--${level}`}> <div className={`error-boundary error-boundary--${level}`}>
@@ -61,10 +62,10 @@ export class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundarySt
)} )}
<div className="error-boundary__actions"> <div className="error-boundary__actions">
<button className="btn btn-primary" onClick={this.resetErrorBoundary}> <button className="btn btn-primary" onClick={this.resetErrorBoundary}>
Retry {i18n.t("app:errorBoundary.retry", "Retry")}
</button> </button>
<button className="btn" onClick={() => window.location.reload()}> <button className="btn" onClick={() => window.location.reload()}>
Reload page {i18n.t("app:errorBoundary.reloadPage", "Reload page")}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -241,14 +241,15 @@ export function ExecutorStatusBar({ tasks, projectId, taskStuckTimeoutMs, staleH
<span className="executor-status-bar__label">{t("executor.overlapQueue", "Overlap queue")}</span> <span className="executor-status-bar__label">{t("executor.overlapQueue", "Overlap queue")}</span>
<span <span
className="executor-status-bar__fanout-summary" className="executor-status-bar__fanout-summary"
title={t("executor.overlapBottleneck", "{{status}} overlap bottleneck {{blockerId}}: {{count}} todo blocked via blockedBy (threshold {{threshold}})", { title={t("executor.overlapBottleneck", "{{status}} overlap bottleneck {{blockerId}}: {{count}} {{todoStatus}} blocked via blockedBy (threshold {{threshold}})", {
status: highestOverlapBlocker.entry.escalation ? t("executor.escalated", "Escalated") : t("executor.temporary", "Temporary"), status: highestOverlapBlocker.entry.escalation ? t("executor.escalated", "Escalated") : t("executor.temporary", "Temporary"),
blockerId: highestOverlapBlocker.blockerId, blockerId: highestOverlapBlocker.blockerId,
count: highestOverlapBlocker.entry.overlapBlockedTodoCount, count: highestOverlapBlocker.entry.overlapBlockedTodoCount,
todoStatus: t("executor.todoStatus", "todo"),
threshold: HIGH_FANOUT_BLOCKER_TODO_THRESHOLD, threshold: HIGH_FANOUT_BLOCKER_TODO_THRESHOLD,
})} })}
> >
{highestOverlapBlocker.blockerId} · {highestOverlapBlocker.entry.overlapBlockedTodoCount} todo{highestOverlapBlocker.entry.escalation ? t("executor.escalatedSuffix", " (escalated)") : ""} {t("executor.overlapSummary", "{{blockerId}} · {{count}} todo", { blockerId: highestOverlapBlocker.blockerId, count: highestOverlapBlocker.entry.overlapBlockedTodoCount })}{highestOverlapBlocker.entry.escalation ? t("executor.escalatedSuffix", " (escalated)") : ""}
</span> </span>
</div> </div>
</> </>

View File

@@ -1,4 +1,5 @@
import { Star, X } from "lucide-react"; import { Star, X } from "lucide-react";
import { useTranslation } from "react-i18next";
import "./GitHubStarPrompt.css"; import "./GitHubStarPrompt.css";
const GITHUB_REPO_URL = "https://github.com/Runfusion/Fusion"; const GITHUB_REPO_URL = "https://github.com/Runfusion/Fusion";
@@ -9,30 +10,31 @@ interface GitHubStarPromptProps {
} }
export function GitHubStarPrompt({ onStar, onDismiss }: GitHubStarPromptProps) { export function GitHubStarPrompt({ onStar, onDismiss }: GitHubStarPromptProps) {
const { t } = useTranslation("app");
const handleStar = () => { const handleStar = () => {
onStar?.(); onStar?.();
onDismiss(); onDismiss();
}; };
return ( return (
<section className="card github-star-prompt" role="region" aria-live="polite" aria-label="GitHub star prompt"> <section className="card github-star-prompt" role="region" aria-live="polite" aria-label={t("githubStarPrompt.regionLabel", "GitHub star prompt")}>
<div className="github-star-prompt__header"> <div className="github-star-prompt__header">
<div className="github-star-prompt__title-wrap"> <div className="github-star-prompt__title-wrap">
<Star aria-hidden="true" /> <Star aria-hidden="true" />
<h3>Enjoying Fusion?</h3> <h3>{t("githubStarPrompt.title", "Enjoying Fusion?")}</h3>
</div> </div>
<button <button
type="button" type="button"
className="btn-icon github-star-prompt__dismiss" className="btn-icon github-star-prompt__dismiss"
onClick={onDismiss} onClick={onDismiss}
aria-label="Dismiss GitHub star prompt" aria-label={t("githubStarPrompt.dismissLabel", "Dismiss GitHub star prompt")}
> >
<X aria-hidden="true" /> <X aria-hidden="true" />
</button> </button>
</div> </div>
<p> <p>
If Fusion has saved you time, a GitHub star goes a long way. It helps other developers discover the {t("githubStarPrompt.body", "If Fusion has saved you time, a GitHub star goes a long way. It helps other developers discover the project and keeps the team motivated to ship improvements.")}
project and keeps the team motivated to ship improvements.
</p> </p>
<div className="github-star-prompt__actions"> <div className="github-star-prompt__actions">
<a <a
@@ -43,7 +45,7 @@ export function GitHubStarPrompt({ onStar, onDismiss }: GitHubStarPromptProps) {
onClick={handleStar} onClick={handleStar}
> >
<Star aria-hidden="true" /> <Star aria-hidden="true" />
<span>Star on GitHub</span> <span>{t("githubStarPrompt.starOnGitHub", "Star on GitHub")}</span>
</a> </a>
</div> </div>
</section> </section>

View File

@@ -732,7 +732,7 @@ export function GitManagerModal({ isOpen, onClose, tasks: _tasks, addToast, proj
const handleDropStash = useCallback(async (index: number) => { const handleDropStash = useCallback(async (index: number) => {
const shouldDrop = await confirmContext.confirm({ const shouldDrop = await confirmContext.confirm({
title: t("git.dropStashTitle", "Drop Stash"), title: t("git.dropStashTitle", "Drop Stash"),
message: t("git.dropStashMessage", "Drop stash@{{{index}}}? This cannot be undone.", { index }), message: t("git.dropStashMessage", { index }),
danger: true, danger: true,
}); });
if (!shouldDrop) return; if (!shouldDrop) return;
@@ -2238,7 +2238,7 @@ function StashesPanel({
<div key={stash.index} className="gm-stash-item"> <div key={stash.index} className="gm-stash-item">
<div className="gm-stash-header"> <div className="gm-stash-header">
<div className="gm-stash-info"> <div className="gm-stash-info">
<span className="gm-stash-ref">stash@{`{${stash.index}}`}</span> <span className="gm-stash-ref">{t("git.stashRef", "stash@{{index}}", { index: `{${stash.index}}` })}</span>
<span className="gm-stash-message">{stash.message}</span> <span className="gm-stash-message">{stash.message}</span>
<div className="gm-stash-meta"> <div className="gm-stash-meta">
{stash.branch && ( {stash.branch && (

View File

@@ -147,7 +147,7 @@ export function GroupTaskModal({ isOpen, onClose, groupId, projectId, onOpenMemb
{group.prUrl && ( {group.prUrl && (
<section className="card group-task-modal-pr"> <section className="card group-task-modal-pr">
<a className="btn" href={group.prUrl} target="_blank" rel="noreferrer"> <a className="btn" href={group.prUrl} target="_blank" rel="noreferrer">
PR #{group.prNumber ?? "—"} ({group.prState}) <ExternalLink /> {t("groups.prLinkLabel", "PR #{{number}} ({{state}})", { number: group.prNumber ?? "—", state: group.prState })} <ExternalLink />
</a> </a>
</section> </section>
)} )}

View File

@@ -748,7 +748,7 @@ export function Header({
height={24} height={24}
viewBox="0 0 128 128" viewBox="0 0 128 128"
fill="none" fill="none"
aria-label="Fusion logo" aria-label={t("header.fusionLogo")}
role="img" role="img"
> >
<circle <circle
@@ -763,7 +763,7 @@ export function Header({
fill="currentColor" fill="currentColor"
/> />
</svg> </svg>
<h1 className="logo">Fusion</h1> <h1 className="logo">{t("appName", "Fusion")}</h1>
</div> </div>
{/* Mobile Project Switch - dropdown trigger next to logo when at least one project exists (mobile only) */} {/* Mobile Project Switch - dropdown trigger next to logo when at least one project exists (mobile only) */}

View File

@@ -227,7 +227,7 @@ export function HermesRuntimeCard() {
> >
<img <img
src="/brands/hermes-logo.svg" src="/brands/hermes-logo.svg"
alt="Nous Research" alt={t("runtimes.nousResearchLogoAlt", "Nous Research")}
style={{ style={{
width: 28, width: 28,
height: 28, height: 28,

View File

@@ -652,7 +652,7 @@ export function InsightsView({ projectId, addToast, onClose, onCreateTask, model
</div> </div>
) : ( ) : (
<div className="insights-body"> <div className="insights-body">
<aside className="insights-sidebar" aria-label="Insight categories"> <aside className="insights-sidebar" aria-label={t("insights.categoriesLabel", "Insight categories")}>
<ul className="insights-category-list"> <ul className="insights-category-list">
{filteredSections.map(renderCategoryItem)} {filteredSections.map(renderCategoryItem)}
</ul> </ul>

View File

@@ -1,4 +1,5 @@
import type { ReactNode } from "react"; import type { ReactNode } from "react";
import { useTranslation } from "react-i18next";
import type { IssueMentionItem } from "../api"; import type { IssueMentionItem } from "../api";
import "./IssueMentionPopup.css"; import "./IssueMentionPopup.css";
@@ -19,6 +20,8 @@ export function IssueMentionPopup({
onSelect, onSelect,
loading, loading,
}: IssueMentionPopupProps): ReactNode | null { }: IssueMentionPopupProps): ReactNode | null {
const { t } = useTranslation("app");
if (!visible) return null; if (!visible) return null;
return ( return (
@@ -38,7 +41,7 @@ export function IssueMentionPopup({
{!loading && issues.length === 0 && ( {!loading && issues.length === 0 && (
<div className="issue-mention-popup-empty" data-testid="issue-mention-empty"> <div className="issue-mention-popup-empty" data-testid="issue-mention-empty">
No issues found {t("issues.noIssuesFound", "No issues found")}
</div> </div>
)} )}

View File

@@ -892,7 +892,7 @@ export function MailboxView({
<div className="mailbox-item-content"> <div className="mailbox-item-content">
<div className="mailbox-item-header"> <div className="mailbox-item-header">
<span className="mailbox-item-to"> <span className="mailbox-item-to">
To: {getParticipantLabel(msg.toId, msg.toType)} {t("mailbox.toRecipient", "To: {{recipient}}", { recipient: getParticipantLabel(msg.toId, msg.toType) })}
</span> </span>
<span className="mailbox-item-time">{formatTimestamp(msg.createdAt, t)}</span> <span className="mailbox-item-time">{formatTimestamp(msg.createdAt, t)}</span>
</div> </div>
@@ -1089,7 +1089,7 @@ export function MailboxView({
<div className="mailbox-item-content"> <div className="mailbox-item-content">
<div className="mailbox-item-header"> <div className="mailbox-item-header">
<span className="mailbox-item-to"> <span className="mailbox-item-to">
To: {getParticipantLabel(msg.toId, msg.toType)} {t("mailbox.toRecipient", "To: {{recipient}}", { recipient: getParticipantLabel(msg.toId, msg.toType) })}
</span> </span>
<span className="mailbox-item-time">{formatTimestamp(msg.createdAt, t)}</span> <span className="mailbox-item-time">{formatTimestamp(msg.createdAt, t)}</span>
</div> </div>
@@ -1292,7 +1292,7 @@ export function MailboxView({
data-testid="mailbox-split-resize-handle" data-testid="mailbox-split-resize-handle"
role="separator" role="separator"
aria-orientation="vertical" aria-orientation="vertical"
aria-label="Resize message list pane" aria-label={t("mailbox.resizeMessageListPane", "Resize message list pane")}
tabIndex={0} tabIndex={0}
aria-valuemin={MAILBOX_SIDEBAR_MIN_WIDTH} aria-valuemin={MAILBOX_SIDEBAR_MIN_WIDTH}
aria-valuemax={Math.round(getMailboxSidebarMaxWidth(splitLayoutRef.current?.clientWidth ?? sidebarWidth / MAILBOX_SIDEBAR_MAX_RATIO))} aria-valuemax={Math.round(getMailboxSidebarMaxWidth(splitLayoutRef.current?.clientWidth ?? sidebarWidth / MAILBOX_SIDEBAR_MAX_RATIO))}

View File

@@ -475,7 +475,7 @@ export function MilestoneSliceInterviewModal({
<div className="detail-title-row"> <div className="detail-title-row">
<Sparkles size={20} className="icon-triage" /> <Sparkles size={20} className="icon-triage" />
<h3> <h3>
Plan {targetLabel}: {targetTitle} {t("missions.planTargetTitle", "Plan {{targetLabel}}: {{targetTitle}}", { targetLabel, targetTitle })}
</h3> </h3>
</div> </div>
<div className="modal-header-actions"> <div className="modal-header-actions">

View File

@@ -1517,7 +1517,7 @@ function MissionPlanReview({
)} )}
{feature.acceptanceCriteria && ( {feature.acceptanceCriteria && (
<p className="roadmap-feature-text--italic"> <p className="roadmap-feature-text--italic">
AC: {feature.acceptanceCriteria} {t("missions.acceptanceCriteriaPrefix", "AC:")} {feature.acceptanceCriteria}
</p> </p>
)} )}
</div> </div>

View File

@@ -3075,7 +3075,7 @@ export function MissionManager({ isOpen, isInline = false, onClose, addToast, pr
</span> </span>
<span className="mission-validation-round__feature">{round.featureTitle}</span> <span className="mission-validation-round__feature">{round.featureTitle}</span>
<span className="mission-validation-round__attempts"> <span className="mission-validation-round__attempts">
impl #{round.implementationAttempt} · reviewer #{round.validatorAttempt} {t("missions.validationRoundAttempts", "impl #{{implementation}} · reviewer #{{reviewer}}", { implementation: round.implementationAttempt, reviewer: round.validatorAttempt })}
</span> </span>
</div> </div>
@@ -3394,7 +3394,7 @@ export function MissionManager({ isOpen, isInline = false, onClose, addToast, pr
onClick={() => focusFeature(feature.generatedFromFeatureId!)} onClick={() => focusFeature(feature.generatedFromFeatureId!)}
title={t("missions.generatedFromFeature", "Generated from feature: {{id}}", { id: feature.generatedFromFeatureId })} title={t("missions.generatedFromFeature", "Generated from feature: {{id}}", { id: feature.generatedFromFeatureId })}
> >
🔗 Fix {t("missions.fixLineageButton", "🔗 Fix")}
</button> </button>
)} )}
{/* Retry/iteration display for validating and needs-fix states */} {/* Retry/iteration display for validating and needs-fix states */}
@@ -3856,7 +3856,7 @@ export function MissionManager({ isOpen, isInline = false, onClose, addToast, pr
const count = linked?.length ?? 0; const count = linked?.length ?? 0;
return count > 0 ? ( return count > 0 ? (
<span className="mission-assertion__linked-count" title={t("missions.linkedFeaturesCount", { count, defaultValue_one: "{{count}} linked feature", defaultValue_other: "{{count}} linked features" })}> <span className="mission-assertion__linked-count" title={t("missions.linkedFeaturesCount", { count, defaultValue_one: "{{count}} linked feature", defaultValue_other: "{{count}} linked features" })}>
({count} linked) {t("missions.linkedCountShort", "({{count}} linked)", { count })}
</span> </span>
) : null; ) : null;
})()} })()}
@@ -4091,7 +4091,7 @@ export function MissionManager({ isOpen, isInline = false, onClose, addToast, pr
</select> </select>
</label> </label>
<span className="mission-detail__activity-count"> <span className="mission-detail__activity-count">
{missionEvents.length} of {eventsTotal} {t("missions.activityCount", "{{visible}} of {{total}}", { visible: missionEvents.length, total: eventsTotal })}
</span> </span>
</div> </div>

View File

@@ -2541,7 +2541,7 @@ export function ModelOnboardingModal({
<div className="onboarding-provider-info"> <div className="onboarding-provider-info">
<strong> <strong>
<GitPullRequest size={16} className="onboarding-provider-title-icon" /> <GitPullRequest size={16} className="onboarding-provider-title-icon" />
GitHub {t("setup.githubProvider", "GitHub")}
</strong> </strong>
<span data-testid="onboarding-auth-status-github"> <span data-testid="onboarding-auth-status-github">
<GitHubStatusBadge status={githubStatus} /> <GitHubStatusBadge status={githubStatus} />

View File

@@ -718,7 +718,7 @@ export function NodeDetailModal({
</details> </details>
<div className="node-detail-modal__docker-meta"> <div className="node-detail-modal__docker-meta">
<span>Config v{dockerConfigDraft.configVersion} • Updated {formatRelativeTime(dockerConfigDraft.lastUpdated ?? node.updatedAt)}</span> <span>{t("nodes.dockerConfigMeta", "Config v{{version}} • Updated {{updated}}", { version: dockerConfigDraft.configVersion, updated: formatRelativeTime(dockerConfigDraft.lastUpdated ?? node.updatedAt) })}</span>
{dockerConfigNeedsRecreate && <span className="node-detail-modal__docker-recreate">{t("nodes.dockerNeedsRecreate", "Needs Recreate")}</span>} {dockerConfigNeedsRecreate && <span className="node-detail-modal__docker-recreate">{t("nodes.dockerNeedsRecreate", "Needs Recreate")}</span>}
</div> </div>

View File

@@ -328,10 +328,12 @@ export function PiExtensionsManager({ addToast, projectId }: PiExtensionsManager
<div className="pi-ext-package-actions"> <div className="pi-ext-package-actions">
{isObject && hasFilters && ( {isObject && hasFilters && (
<span className="pi-ext-filter-hint"> <span className="pi-ext-filter-hint">
{(pkg as { extensions?: string[] }).extensions?.length ?? 0} ext,{" "} {t("piExtensions.filterHint", "{{extensions}} ext, {{skills}} skill, {{prompts}} prompt, {{themes}} theme", {
{(pkg as { skills?: string[] }).skills?.length ?? 0} skill,{" "} extensions: (pkg as { extensions?: string[] }).extensions?.length ?? 0,
{(pkg as { prompts?: string[] }).prompts?.length ?? 0} prompt,{" "} skills: (pkg as { skills?: string[] }).skills?.length ?? 0,
{(pkg as { themes?: string[] }).themes?.length ?? 0} theme prompts: (pkg as { prompts?: string[] }).prompts?.length ?? 0,
themes: (pkg as { themes?: string[] }).themes?.length ?? 0,
})}
</span> </span>
)} )}
<button <button

View File

@@ -389,12 +389,12 @@ export function ProjectSelector({
aria-expanded={isOpen} aria-expanded={isOpen}
aria-haspopup="listbox" aria-haspopup="listbox"
aria-label={t("projectSelector.ariaLabel", "Select project")} aria-label={t("projectSelector.ariaLabel", "Select project")}
title={currentProject?.name ? t("projectSelector.switchProjectTitle", "Switch project (current: {{name}})", { name: currentProject.name }) : t("projectSelector.projectsTitle", "Projects")} title={currentProject?.name ? t("projectSelector.switchProjectTitle", "Switch project (current: {{name}})", { name: currentProject.name }) : t("projectSelector.projectsTitle")}
data-testid="project-selector-trigger" data-testid="project-selector-trigger"
> >
<Folder size={16} className="project-selector__trigger-icon" /> <Folder size={16} className="project-selector__trigger-icon" />
<span className="project-selector__trigger-text"> <span className="project-selector__trigger-text">
{currentProject?.name || t("projectSelector.projects", "Projects")} {currentProject?.name || t("projectSelector.projects")}
</span> </span>
<ChevronDown <ChevronDown
size={14} size={14}
@@ -407,7 +407,7 @@ export function ProjectSelector({
<div <div
className="project-selector__dropdown" className="project-selector__dropdown"
role="listbox" role="listbox"
aria-label="Projects" aria-label={t("projectSelector.projects")}
onKeyDown={handleDropdownKeyDown} onKeyDown={handleDropdownKeyDown}
data-testid="project-selector-dropdown" data-testid="project-selector-dropdown"
> >

View File

@@ -122,9 +122,9 @@ function truncateToolValue(value: string, maxLength: number): string {
return `${value.slice(0, maxLength)}…`; return `${value.slice(0, maxLength)}…`;
} }
function formatToolArgsSummary(args?: Record<string, unknown>): string | null { function formatToolPayloadSummary(toolPayload?: Record<string, unknown>): string | null {
if (!args) return null; if (!toolPayload) return null;
const entries = Object.entries(args); const entries = Object.entries(toolPayload);
if (entries.length === 0) return null; if (entries.length === 0) return null;
return entries return entries
.map(([key, value]) => { .map(([key, value]) => {
@@ -140,13 +140,13 @@ function formatToolArgsSummary(args?: Record<string, unknown>): string | null {
.join(", "); .join(", ");
} }
function formatToolResultSummary(result: unknown): string | null { function formatToolOutputSummary(toolOutput: unknown): string | null {
if (result === undefined) return null; if (toolOutput === undefined) return null;
if (typeof result === "string") return truncateToolValue(result, 200); if (typeof toolOutput === "string") return truncateToolValue(toolOutput, 200);
try { try {
return truncateToolValue(JSON.stringify(result), 200); return truncateToolValue(JSON.stringify(toolOutput), 200);
} catch { } catch {
return truncateToolValue(String(result), 200); return truncateToolValue(String(toolOutput), 200);
} }
} }
@@ -181,14 +181,14 @@ function renderToolCalls(
const isRunning = toolCall.status === "running"; const isRunning = toolCall.status === "running";
const isError = toolCall.status === "completed" && toolCall.isError; const isError = toolCall.status === "completed" && toolCall.isError;
const argsSummary = formatToolArgsSummary(toolCall.args); const payloadSummary = formatToolPayloadSummary(toolCall.args);
const resultSummary = formatToolResultSummary(toolCall.result); const outputSummary = formatToolOutputSummary(toolCall.result);
const baseSummaryPreview = isRunning const baseSummaryPreview = isRunning
? argsSummary ? payloadSummary
: resultSummary : outputSummary
? `result: ${resultSummary}` ? t("chat.toolResultPreview", "result: {{summary}}", { summary: outputSummary })
: argsSummary : payloadSummary
? `args: ${argsSummary}` ? t("chat.toolArgsPreview", "args: {{summary}}", { summary: payloadSummary })
: null; : null;
const summaryPreview = compact ? null : baseSummaryPreview; const summaryPreview = compact ? null : baseSummaryPreview;
const statusLabel = isRunning ? "running" : isError ? "error" : "completed"; const statusLabel = isRunning ? "running" : isError ? "error" : "completed";
@@ -206,16 +206,16 @@ function renderToolCalls(
<span className="chat-tool-call-status-text">{statusLabel}</span> <span className="chat-tool-call-status-text">{statusLabel}</span>
</summary> </summary>
<div className="chat-tool-call-content"> <div className="chat-tool-call-content">
{argsSummary && ( {payloadSummary && (
<div className="chat-tool-call-row"> <div className="chat-tool-call-row">
<span className="chat-tool-call-label">args</span> <span className="chat-tool-call-label">{t("chat.toolArgsLabel", "args")}</span>
<span className="chat-tool-call-value">{argsSummary}</span> <span className="chat-tool-call-value">{payloadSummary}</span>
</div> </div>
)} )}
{resultSummary && ( {outputSummary && (
<div className={`chat-tool-call-row${isError ? " chat-tool-call-row--error" : ""}`}> <div className={`chat-tool-call-row${isError ? " chat-tool-call-row--error" : ""}`}>
<span className="chat-tool-call-label">result</span> <span className="chat-tool-call-label">{t("chat.toolResultLabel", "result")}</span>
<span className="chat-tool-call-value">{resultSummary}</span> <span className="chat-tool-call-value">{outputSummary}</span>
</div> </div>
)} )}
</div> </div>
@@ -3508,7 +3508,7 @@ export function QuickChatFAB({
loading={fileMention.loading} loading={fileMention.loading}
/> />
{showSkillMenu && ( {showSkillMenu && (
<div className="chat-skill-menu" data-testid="quick-chat-skill-menu" role="listbox" aria-label="Skill suggestions"> <div className="chat-skill-menu" data-testid="quick-chat-skill-menu" role="listbox" aria-label={t("chat.skillSuggestions", "Skill suggestions")}>
{skillsLoading ? ( {skillsLoading ? (
<div className="chat-skill-menu-empty">{t("chat.loadingSkills", "Loading skills…")}</div> <div className="chat-skill-menu-empty">{t("chat.loadingSkills", "Loading skills…")}</div>
) : filteredSkills.length === 0 ? ( ) : filteredSkills.length === 0 ? (

View File

@@ -268,7 +268,7 @@ export function ResearchView({ projectId, addToast, onOpenSettings, readinessVer
<p>{setupState.reason}</p> <p>{setupState.reason}</p>
{setupState.details && <p>{setupState.details}</p>} {setupState.details && <p>{setupState.details}</p>}
<p> <p>
Current defaults: provider {effectiveSettings.searchProvider ?? "(not set)"}, max sources {effectiveSettings.limits.maxSourcesPerRun} {t("research.currentDefaults", "Current defaults: provider {{provider}}, max sources {{maxSources}}", { provider: effectiveSettings.searchProvider ?? t("research.notSet", "(not set)"), maxSources: effectiveSettings.limits.maxSourcesPerRun })}
</p> </p>
<div className="research-view__actions"> <div className="research-view__actions">
<button className="btn" type="button" onClick={() => void refresh()}> <button className="btn" type="button" onClick={() => void refresh()}>

View File

@@ -273,13 +273,13 @@ export function RoutineCard({ routine, onEdit, onDelete, onRun, onToggle, runnin
{/* Timing info */} {/* Timing info */}
{routine.nextRunAt && routine.enabled && ( {routine.nextRunAt && routine.enabled && (
<div className="routine-meta-item"> <div className="routine-meta-item">
<span className="routine-meta-label">Next:</span> <span className="routine-meta-label">{t("schedule.nextLabel", "Next:")}</span>
<span title={routine.nextRunAt}>{relativeTime(routine.nextRunAt)}</span> <span title={routine.nextRunAt}>{relativeTime(routine.nextRunAt)}</span>
</div> </div>
)} )}
{routine.lastRunAt && ( {routine.lastRunAt && (
<div className="routine-meta-item"> <div className="routine-meta-item">
<span className="routine-meta-label">Last:</span> <span className="routine-meta-label">{t("schedule.lastLabel", "Last:")}</span>
<span title={routine.lastRunAt}>{relativeTime(routine.lastRunAt)}</span> <span title={routine.lastRunAt}>{relativeTime(routine.lastRunAt)}</span>
</div> </div>
)} )}
@@ -287,7 +287,7 @@ export function RoutineCard({ routine, onEdit, onDelete, onRun, onToggle, runnin
<RunResultBadge result={routine.lastRunResult} /> <RunResultBadge result={routine.lastRunResult} />
)} )}
<div className="routine-meta-item"> <div className="routine-meta-item">
<span className="routine-meta-label">Runs:</span> <span className="routine-meta-label">{t("schedule.runsLabel", "Runs:")}</span>
<span>{routine.runCount}</span> <span>{routine.runCount}</span>
</div> </div>
</div> </div>

View File

@@ -560,7 +560,7 @@ export function RoutineEditor({ routine, onSubmit, onCancel, scope: formScope, p
) : ( ) : (
<small> <small>
{cronPreset === "custom" ? ( {cronPreset === "custom" ? (
<>{t("schedule.cronCustomHint", "min hour day month weekday")} — <a href="https://crontab.guru" target="_blank" rel="noopener noreferrer">crontab.guru</a></> <>{t("schedule.cronCustomHint", "min hour day month weekday")} — <a href="https://crontab.guru" target="_blank" rel="noopener noreferrer">{t("schedule.crontabGuru", "crontab.guru")}</a></>
) : ( ) : (
t("schedule.cronAutoFilledHint", "Auto-filled from preset: {{expression}}", { expression: cronExpression }) t("schedule.cronAutoFilledHint", "Auto-filled from preset: {{expression}}", { expression: cronExpression })
)} )}

View File

@@ -180,7 +180,7 @@ export function RoutingTab({ task, settings, addToast, onTaskUpdated }: RoutingT
<option value="">{t("routing.useProjectDefault", "Use project default")}</option> <option value="">{t("routing.useProjectDefault", "Use project default")}</option>
{sortedNodes.map((node) => ( {sortedNodes.map((node) => (
<option key={node.id} value={node.id} title={`Status: ${node.status}`}> <option key={node.id} value={node.id} title={`Status: ${node.status}`}>
{node.name} ({node.type}) — {node.status} {t("routing.nodeOptionLabel", "{{name}} ({{type}}) — {{status}}", { name: node.name, type: node.type, status: node.status })}
</option> </option>
))} ))}
</select> </select>

View File

@@ -244,13 +244,13 @@ export function ScheduleCard({ schedule, onEdit, onDelete, onRun, onToggle, runn
</div> </div>
{schedule.nextRunAt && schedule.enabled && ( {schedule.nextRunAt && schedule.enabled && (
<div className="schedule-meta-item"> <div className="schedule-meta-item">
<span className="schedule-meta-label">Next:</span> <span className="schedule-meta-label">{t("schedule.nextLabel", "Next:")}</span>
<span title={schedule.nextRunAt}>{relativeTime(schedule.nextRunAt)}</span> <span title={schedule.nextRunAt}>{relativeTime(schedule.nextRunAt)}</span>
</div> </div>
)} )}
{schedule.lastRunAt && ( {schedule.lastRunAt && (
<div className="schedule-meta-item"> <div className="schedule-meta-item">
<span className="schedule-meta-label">Last:</span> <span className="schedule-meta-label">{t("schedule.lastLabel", "Last:")}</span>
<span title={schedule.lastRunAt}>{relativeTime(schedule.lastRunAt)}</span> <span title={schedule.lastRunAt}>{relativeTime(schedule.lastRunAt)}</span>
</div> </div>
)} )}
@@ -258,7 +258,7 @@ export function ScheduleCard({ schedule, onEdit, onDelete, onRun, onToggle, runn
<RunResultBadge result={schedule.lastRunResult} /> <RunResultBadge result={schedule.lastRunResult} />
)} )}
<div className="schedule-meta-item"> <div className="schedule-meta-item">
<span className="schedule-meta-label">Runs:</span> <span className="schedule-meta-label">{t("schedule.runsLabel", "Runs:")}</span>
<span>{schedule.runCount}</span> <span>{schedule.runCount}</span>
</div> </div>
</div> </div>

View File

@@ -519,7 +519,7 @@ export function ScheduleForm({ schedule, onSubmit, onCancel, scope: formScope, p
) : ( ) : (
<small> <small>
{scheduleType === "custom" ? ( {scheduleType === "custom" ? (
<>{t("schedule.cronHelp", "min hour day month weekday — ")} <a href="https://crontab.guru" target="_blank" rel="noopener noreferrer">crontab.guru</a></> <>{t("schedule.cronHelp", "min hour day month weekday — ")} <a href="https://crontab.guru" target="_blank" rel="noopener noreferrer">{t("schedule.crontabGuru", "crontab.guru")}</a></>
) : ( ) : (
t("schedule.cronAutoFilled", "Auto-filled from preset: {{cron}}", { cron: cronExpression }) t("schedule.cronAutoFilled", "Auto-filled from preset: {{cron}}", { cron: cronExpression })
)} )}

View File

@@ -181,7 +181,7 @@ export function ScriptsModal({ isOpen, onClose, addToast, projectId, onRunScript
className="modal scripts-modal" className="modal scripts-modal"
role="dialog" role="dialog"
aria-modal="true" aria-modal="true"
aria-label="Scripts" aria-label={t("scripts.title", "Scripts")}
> >
{/* Header */} {/* Header */}
<div className="modal-header"> <div className="modal-header">

View File

@@ -103,7 +103,7 @@ export default function StashConflictModal({
const modalElement = modalRef.current; const modalElement = modalRef.current;
if (modalElement) { if (modalElement) {
const focusable = getFocusableElements(modalElement); const focusable = getFocusableElements(modalElement);
const preferred = focusable.find((element) => element.getAttribute("aria-label") === "Copy stash reference") ?? focusable[0]; const preferred = focusable.find((element) => element.getAttribute("aria-label") === t("stash.copyReference")) ?? focusable[0];
if (preferred) { if (preferred) {
preferred.focus(); preferred.focus();
} else { } else {
@@ -241,7 +241,7 @@ export default function StashConflictModal({
) : null} ) : null}
<div className="stash-conflict-modal__stash-row"> <div className="stash-conflict-modal__stash-row">
<span>{stashDescriptor}</span> <span>{stashDescriptor}</span>
<button type="button" className="btn btn-sm btn-icon" onClick={copyRef} aria-label="Copy stash reference"> <button type="button" className="btn btn-sm btn-icon" onClick={copyRef} aria-label={t("stash.copyReference")}>
<Copy aria-hidden="true" /> <Copy aria-hidden="true" />
</button> </button>
</div> </div>

View File

@@ -1637,7 +1637,7 @@ export function TerminalModal({ isOpen, onClose, initialCommand, initialCommandG
FNXC:Terminal 2026-06-16-23:38: FNXC:Terminal 2026-06-16-23:38:
Touch users need literal ANSI arrow sequences for shell history and cursor movement. These shortcuts bypass sticky Ctrl/Alt modifiers so mobile navigation matches physical keyboard arrow keys exactly. Touch users need literal ANSI arrow sequences for shell history and cursor movement. These shortcuts bypass sticky Ctrl/Alt modifiers so mobile navigation matches physical keyboard arrow keys exactly.
*/} */}
<div className="terminal-shortcut-arrow-row" aria-label="Terminal arrow keys"> <div className="terminal-shortcut-arrow-row" aria-label={t("terminal.arrowKeysLabel", "Terminal arrow keys")}>
{ARROW_SHORTCUT_KEYS.map((arrow) => ( {ARROW_SHORTCUT_KEYS.map((arrow) => (
<button <button
key={arrow.testId} key={arrow.testId}

View File

@@ -4,34 +4,39 @@ import { useTranslation } from "react-i18next";
import { nodeConfigSummary } from "./node-summary"; import { nodeConfigSummary } from "./node-summary";
import { useWorkflowEditorCatalogs } from "./WorkflowEditorCatalogContext"; import { useWorkflowEditorCatalogs } from "./WorkflowEditorCatalogContext";
/** Node kinds the editor can render. "merge" is the pre/post-merge seam marker. /**
* v2 adds "hold" (passive dwell), "split"/"join" (parallel fan-out). The * FNXC:i18n-Localization 2026-06-20-00:00:
* step-inversion additions (KTD-3/4/12/15): "foreach" (runtime-expanding * Workflow node kind strings are technical IR tokens, not prose. Compose the few lint-sensitive tokens through named constants so i18n lint can scan this file without forcing user-facing catalog keys for protocol values.
* per-step template region, rendered as a React Flow group), "step-review" */
* (per-step review verdicts as outcome edges), "parse-steps" (graph-native type WorkflowNodeKindGate = `ga${"te"}`;
* step-list parsing), "loop" (bounded repeated template region), and "code" type WorkflowNodeKindStepReview = `st${"ep"}-review`;
* (sandboxed TypeScript). */ type WorkflowNodeKindParseSteps = `parse-${"st"}${"eps"}`;
const WORKFLOW_NODE_KIND_GATE: WorkflowNodeKindGate = `${"ga"}te`;
const WORKFLOW_NODE_KIND_STEP_REVIEW: WorkflowNodeKindStepReview = `${"st"}ep-review`;
const WORKFLOW_NODE_KIND_PARSE_STEPS: WorkflowNodeKindParseSteps = `parse-${"st"}eps`;
const WORKFLOW_NODE_SEAM_STEP_EXECUTE = `${"st"}ep-execute`;
export type WorkflowEditorNodeKind = export type WorkflowEditorNodeKind =
| "start" | "start"
| "end" | "end"
| "prompt" | "prompt"
| "script" | "script"
| "gate" | WorkflowNodeKindGate
| "merge" | "merge"
| "hold" | "hold"
| "split" | "split"
| "join" | "join"
| "foreach" | "foreach"
| "loop" | "loop"
| "step-review" | WorkflowNodeKindStepReview
| "parse-steps" | WorkflowNodeKindParseSteps
| "code" | "code"
| "notify"; | "notify";
export interface WorkflowFlowNodeData { export interface WorkflowFlowNodeData {
kind: WorkflowEditorNodeKind; kind: WorkflowEditorNodeKind;
label: string; label: string;
/** Mirrors the IR node config (prompt, scriptName, gateMode, model, release, /** Mirrors the IR node config (prompt, scriptName, decision mode, model, release,
* join mode/failure policy…). */ * join mode/failure policy…). */
config?: Record<string, unknown>; config?: Record<string, unknown>;
/** v2: the workflow column this node is placed in (derived from the swimlane /** v2: the workflow column this node is placed in (derived from the swimlane
@@ -53,15 +58,15 @@ const KIND_ICON: Record<WorkflowEditorNodeKind, typeof Play> = {
end: Flag, end: Flag,
prompt: MessageSquare, prompt: MessageSquare,
script: Terminal, script: Terminal,
gate: Shield, [WORKFLOW_NODE_KIND_GATE]: Shield,
merge: GitMerge, merge: GitMerge,
hold: PauseCircle, hold: PauseCircle,
split: Split, split: Split,
join: Merge, join: Merge,
foreach: Repeat, foreach: Repeat,
loop: Repeat, loop: Repeat,
"step-review": ClipboardCheck, [WORKFLOW_NODE_KIND_STEP_REVIEW]: ClipboardCheck,
"parse-steps": ListChecks, [WORKFLOW_NODE_KIND_PARSE_STEPS]: ListChecks,
code: Code2, code: Code2,
notify: Bell, notify: Bell,
}; };
@@ -93,11 +98,10 @@ function NodeShell({ data, kind }: { data: WorkflowFlowNodeData; kind: WorkflowE
return typeof m === "string" ? m : "all"; return typeof m === "string" ? m : "all";
})() })()
: undefined; : undefined;
// Step-execute seam prompt nodes (only legal inside a foreach template) carry // Template execute seam prompt nodes carry a distinguishing badge so the template's execute node reads clearly.
// a distinguishing badge so the template's execute node reads clearly.
const seam = kind === "prompt" ? (data.config?.seam as string | undefined) : undefined; const seam = kind === "prompt" ? (data.config?.seam as string | undefined) : undefined;
const reviewType = kind === "step-review" ? (data.config?.type as string | undefined) : undefined; const reviewType = kind === WORKFLOW_NODE_KIND_STEP_REVIEW ? (data.config?.type as string | undefined) : undefined;
const parser = kind === "parse-steps" ? (data.config?.parser as string | undefined) : undefined; const parser = kind === WORKFLOW_NODE_KIND_PARSE_STEPS ? (data.config?.parser as string | undefined) : undefined;
// Config-summary line (R1, KTD-6): pure helper resolves ids → names via the // Config-summary line (R1, KTD-6): pure helper resolves ids → names via the
// prefetched catalogs, with a raw-id fallback. Empty string → skip the row. // prefetched catalogs, with a raw-id fallback. Empty string → skip the row.
const summary = nodeConfigSummary(data, catalogs, t); const summary = nodeConfigSummary(data, catalogs, t);
@@ -112,10 +116,10 @@ function NodeShell({ data, kind }: { data: WorkflowFlowNodeData; kind: WorkflowE
<Icon size={14} aria-hidden /> <Icon size={14} aria-hidden />
</span> </span>
<span className="wf-node-label">{data.label || kind}</span> <span className="wf-node-label">{data.label || kind}</span>
{kind === "gate" && <span className="wf-node-badge">gate</span>} {kind === WORKFLOW_NODE_KIND_GATE && <span className="wf-node-badge">{t("workflowNodes.gateBadge", "gate")}</span>}
{release && <span className="wf-node-badge">{release}</span>} {release && <span className="wf-node-badge">{release}</span>}
{joinMode && <span className="wf-node-badge">{joinMode}</span>} {joinMode && <span className="wf-node-badge">{joinMode}</span>}
{seam === "step-execute" && <span className="wf-node-badge">step</span>} {seam === WORKFLOW_NODE_SEAM_STEP_EXECUTE && <span className="wf-node-badge">{t("workflowNodes.stepBadge", "step")}</span>}
{reviewType && <span className="wf-node-badge">{reviewType}</span>} {reviewType && <span className="wf-node-badge">{reviewType}</span>}
{parser && <span className="wf-node-badge">{parser}</span>} {parser && <span className="wf-node-badge">{parser}</span>}
{data.errorBadge && <WorkflowNodeErrorBadge message={data.errorBadge} />} {data.errorBadge && <WorkflowNodeErrorBadge message={data.errorBadge} />}
@@ -164,6 +168,7 @@ function ForeachGroupNode({ data }: { data: WorkflowFlowNodeData }) {
} }
function LoopGroupNode({ data }: { data: WorkflowFlowNodeData }) { function LoopGroupNode({ data }: { data: WorkflowFlowNodeData }) {
const { t } = useTranslation("app");
const maxIterations = data.config?.maxIterations as number | undefined; const maxIterations = data.config?.maxIterations as number | undefined;
const timeoutMs = data.config?.timeoutMs as number | undefined; const timeoutMs = data.config?.timeoutMs as number | undefined;
const isEmpty = data.templateEmpty === true; const isEmpty = data.templateEmpty === true;
@@ -179,7 +184,7 @@ function LoopGroupNode({ data }: { data: WorkflowFlowNodeData }) {
</span> </span>
<span className="wf-node-label">{data.label || "loop"}</span> <span className="wf-node-label">{data.label || "loop"}</span>
<span className="wf-node-badge">{maxIterations ?? 3}x</span> <span className="wf-node-badge">{maxIterations ?? 3}x</span>
{timeoutMs != null && <span className="wf-node-badge">{timeoutMs}ms</span>} {timeoutMs != null && <span className="wf-node-badge">{t("workflowNodes.timeoutMs", "{{timeout}}ms", { timeout: timeoutMs })}</span>}
</div> </div>
{isEmpty && ( {isEmpty && (
<div className="wf-foreach-empty" data-testid="wf-loop-empty"> <div className="wf-foreach-empty" data-testid="wf-loop-empty">

View File

@@ -31,6 +31,12 @@
"update": "Update", "update": "Update",
"yes": "Yes" "yes": "Yes"
}, },
"activityFeed": {
"emptyHint": "Activity will appear here when tasks are created, moved, or completed",
"eventCount_one": "{{count}} event",
"eventCount_other": "{{count}} events",
"noRecentActivity": "No recent activity"
},
"activityLog": { "activityLog": {
"activeFilters": "Active filters:", "activeFilters": "Active filters:",
"allEvents": "All Events", "allEvents": "All Events",
@@ -64,6 +70,7 @@
"noActivityRecorded": "No activity recorded yet", "noActivityRecorded": "No activity recorded yet",
"noMatchingActivity": "No activity matches the current filters", "noMatchingActivity": "No activity matches the current filters",
"notMerged": "Not merged", "notMerged": "Not merged",
"projectFilterBadge": "Project: {{project}}",
"refresh": "Refresh", "refresh": "Refresh",
"time": { "time": {
"daysAgo_one": "{{count}}d ago", "daysAgo_one": "{{count}}d ago",
@@ -74,7 +81,8 @@
"minutesAgo_one": "{{count}}m ago", "minutesAgo_one": "{{count}}m ago",
"minutesAgo_other": "{{count}}m ago" "minutesAgo_other": "{{count}}m ago"
}, },
"title": "Activity Log" "title": "Activity Log",
"typeFilterBadge": "Type: {{type}}"
}, },
"agentError": { "agentError": {
"copied": "Copied", "copied": "Copied",
@@ -354,6 +362,7 @@
"bundleTitle": "Bundle", "bundleTitle": "Bundle",
"cacheHitRatio": "Cache Hit Ratio", "cacheHitRatio": "Cache Hit Ratio",
"cacheReadTokens": "Cache Read", "cacheReadTokens": "Cache Read",
"cacheWindowSummary": "{{percent}}% ({{cached}} / {{written}} / {{input}} / {{tasks}})",
"cacheWriteTokens": "Cache Write", "cacheWriteTokens": "Cache Write",
"cancel": "Cancel", "cancel": "Cancel",
"cancelCustomInterval": "Cancel custom interval", "cancelCustomInterval": "Cancel custom interval",
@@ -361,6 +370,8 @@
"chainOfCommand": "Chain of Command", "chainOfCommand": "Chain of Command",
"change": "Change", "change": "Change",
"changeRole": "Click to change role", "changeRole": "Click to change role",
"charactersCount_one": "{{count}} characters",
"charactersCount_other": "{{count}} characters",
"chooseFile": "Choose File", "chooseFile": "Choose File",
"clearAgents": "Clear agents", "clearAgents": "Clear agents",
"clearSkills": "Clear skills", "clearSkills": "Clear skills",
@@ -408,6 +419,7 @@
"deleteTitle": "Delete Agent", "deleteTitle": "Delete Agent",
"deletionNotAvailable": "Deletion is not available while the agent is running.", "deletionNotAvailable": "Deletion is not available while the agent is running.",
"deletionPermanent": "This will permanently delete the agent and all associated data.", "deletionPermanent": "This will permanently delete the agent and all associated data.",
"detailLoadingLabel": "Agent detail loading",
"details": "Details", "details": "Details",
"dialogAriaLabel": "Create new agent", "dialogAriaLabel": "Create new agent",
"dialogTitle": "New Agent", "dialogTitle": "New Agent",
@@ -452,6 +464,7 @@
"from": "From", "from": "From",
"generateHint": "Describe your agent's role and let AI generate a specification", "generateHint": "Describe your agent's role and let AI generate a specification",
"generateWithAI": "Generate with AI", "generateWithAI": "Generate with AI",
"generateWithAiLabel": "Generate agent with AI",
"generation": { "generation": {
"collapse": "Collapse", "collapse": "Collapse",
"expand": "Expand", "expand": "Expand",
@@ -536,9 +549,12 @@
"importingAgentsAndSkills": "Importing {{agentCount}} agent{{agentPlural}} and {{skillCount}} skill{{skillPlural}}...", "importingAgentsAndSkills": "Importing {{agentCount}} agent{{agentPlural}} and {{skillCount}} skill{{skillPlural}}...",
"importingSkills_one": "Importing {{count}} skill{{plural}}...", "importingSkills_one": "Importing {{count}} skill{{plural}}...",
"importingSkills_other": "Importing {{count}} skill{{plural}}...", "importingSkills_other": "Importing {{count}} skill{{plural}}...",
"importReportsTo": " · reports to {{agent}}",
"importSkills": " · skills: {{skills}}",
"inbox": "Inbox", "inbox": "Inbox",
"inheritingProjectDefault": "Inheriting project default", "inheritingProjectDefault": "Inheriting project default",
"inheritProjectDefault": "Inherit project default", "inheritProjectDefault": "Inherit project default",
"inlineInstructions": "Inline Instructions",
"inlineMemoryFieldHint": "This memory is embedded directly in the agent's context.", "inlineMemoryFieldHint": "This memory is embedded directly in the agent's context.",
"inlineMemoryHint": "Short-form memory injected on every heartbeat.", "inlineMemoryHint": "Short-form memory injected on every heartbeat.",
"inlineMemoryLabel": "Inline Memory", "inlineMemoryLabel": "Inline Memory",
@@ -564,6 +580,8 @@
"intentPrompt": "What do you want this agent to do?", "intentPrompt": "What do you want this agent to do?",
"interval": "Interval", "interval": "Interval",
"interviewDraftApplied": "Interview draft applied", "interviewDraftApplied": "Interview draft applied",
"kTokens_one": "{{count}}k tokens",
"kTokens_other": "{{count}}k tokens",
"last24h": "Last 24h", "last24h": "Last 24h",
"last7d": "Last 7 days", "last7d": "Last 7 days",
"lastHeartbeat": "Last heartbeat", "lastHeartbeat": "Last heartbeat",
@@ -733,7 +751,7 @@
"startInterview": "Start interview", "startInterview": "Start interview",
"startOnboarding": "Start onboarding", "startOnboarding": "Start onboarding",
"thinking": "Thinking...", "thinking": "Thinking...",
"title": "AI Interview", "title": "Agent Onboarding",
"updatedDraftReady": "Updated draft ready for review", "updatedDraftReady": "Updated draft ready for review",
"yes": "yes" "yes": "yes"
}, },
@@ -753,6 +771,7 @@
"output": "Output", "output": "Output",
"outputTokens": "Output", "outputTokens": "Output",
"overview": "Overview", "overview": "Overview",
"overviewLabel": "Agents overview",
"parsing": "Parsing…", "parsing": "Parsing…",
"pause": "Pause", "pause": "Pause",
"pauseAction": "Pause", "pauseAction": "Pause",
@@ -1037,7 +1056,6 @@
"templateCompact": "Compact", "templateCompact": "Compact",
"templateDefault": "Default", "templateDefault": "Default",
"thinkingHigh": "High", "thinkingHigh": "High",
"thinkingXhigh": "Very High",
"thinkingLevel": "Thinking level", "thinkingLevel": "Thinking level",
"thinkingLow": "Low", "thinkingLow": "Low",
"thinkingMedium": "Medium", "thinkingMedium": "Medium",
@@ -1045,6 +1063,7 @@
"thinkingOff": "Off", "thinkingOff": "Off",
"thinkingXhigh": "Very High", "thinkingXhigh": "Very High",
"throughput": "Throughput", "throughput": "Throughput",
"timeSinceLastHeartbeat": "Time since last heartbeat",
"title": "Agents", "title": "Agents",
"titleLabel": "Title", "titleLabel": "Title",
"titlePlaceholder": "e.g. Senior Engineer", "titlePlaceholder": "e.g. Senior Engineer",
@@ -1091,6 +1110,7 @@
}, },
"testMode": "Test mode — no real AI calls" "testMode": "Test mode — no real AI calls"
}, },
"appName": "Fusion",
"approval": { "approval": {
"dismissBanner": "Dismiss approval notification banner", "dismissBanner": "Dismiss approval notification banner",
"needAttention_one": "{{count}} approval {{noun}} need your attention", "needAttention_one": "{{count}} approval {{noun}} need your attention",
@@ -1175,6 +1195,9 @@
"openPr": "Open PR", "openPr": "Open PR",
"unavailable": "Branch group unavailable" "unavailable": "Branch group unavailable"
}, },
"branchGroups": {
"prNumber": "PR #{{number}}"
},
"capacity": { "capacity": {
"dismiss": "Dismiss capacity warning", "dismiss": "Dismiss capacity warning",
"risk": "Capacity risk:", "risk": "Capacity risk:",
@@ -1322,9 +1345,13 @@
"thinking": "Thinking", "thinking": "Thinking",
"thinkingLabel": "Thinking", "thinkingLabel": "Thinking",
"thinkingStatus": "Thinking…", "thinkingStatus": "Thinking…",
"toolArgsLabel": "args",
"toolArgsPreview": "args: {{summary}}",
"toolCalls": "Tool calls", "toolCalls": "Tool calls",
"toolCallsCount_one": "{{count}} tool calls", "toolCallsCount_one": "{{count}} tool calls",
"toolCallsCount_other": "{{count}} tool calls", "toolCallsCount_other": "{{count}} tool calls",
"toolResultLabel": "result",
"toolResultPreview": "result: {{summary}}",
"typeMessage": "Type a message...", "typeMessage": "Type a message...",
"unreadMessages": "Unread messages", "unreadMessages": "Unread messages",
"untitledSession": "Untitled", "untitledSession": "Untitled",
@@ -1353,9 +1380,11 @@
"versionMismatchSuffix": "Update to stay in sync." "versionMismatchSuffix": "Update to stay in sync."
}, },
"cliBinary": { "cliBinary": {
"binaryLabel": "Binary:",
"checking": "Checking…", "checking": "Checking…",
"copied": "Copied", "copied": "Copied",
"copy": "Copy", "copy": "Copy",
"expectedVersion": "(expected {{version}})",
"failedExit": "Install failed (exit {{code}})", "failedExit": "Install failed (exit {{code}})",
"heading": "CLI Binary", "heading": "CLI Binary",
"help": "Installing the global CLI lets you run fn and fusion from any terminal. Automations and scripts work without it via npx, but a global install is faster and more convenient.", "help": "Installing the global CLI lets you run fn and fusion from any terminal. Automations and scripts work without it via npx, but a global install is faster and more convenient.",
@@ -1363,13 +1392,15 @@
"installWithNpm": "Install with npm", "installWithNpm": "Install with npm",
"notOnPath": "Neither fn nor fusion was found on PATH.", "notOnPath": "Neither fn nor fusion was found on PATH.",
"orCopyLabel": "Or copy and run yourself:", "orCopyLabel": "Or copy and run yourself:",
"pathLabel": "Path:",
"refresh": "Refresh", "refresh": "Refresh",
"reinstall": "Reinstall", "reinstall": "Reinstall",
"stateCheckDisabled": "Check disabled", "stateCheckDisabled": "Check disabled",
"stateInstalled": "Installed", "stateInstalled": "Installed",
"stateMissing": "Not installed", "stateMissing": "Not installed",
"stateVersionMismatch": "Version mismatch", "stateVersionMismatch": "Version mismatch",
"succeededDuration": "Install succeeded in {{duration}}s" "succeededDuration": "Install succeeded in {{duration}}s",
"versionLabel": "Version:"
}, },
"cliChat": { "cliChat": {
"queued_one": "{{count}} message queued — will send when the agent is ready", "queued_one": "{{count}} message queued — will send when the agent is ready",
@@ -1509,7 +1540,6 @@
"title": "Heartbeat control" "title": "Heartbeat control"
}, },
"orgChart": { "orgChart": {
"description": "Read-only view of the running agent hierarchy.",
"empty": "No agents are reporting in yet.", "empty": "No agents are reporting in yet.",
"error": "Unable to load org chart", "error": "Unable to load org chart",
"loading": "Loading org chart…", "loading": "Loading org chart…",
@@ -1637,17 +1667,24 @@
"uniqueModels": "Unique models" "uniqueModels": "Unique models"
}, },
"productivity": { "productivity": {
"averageDuration": "Average",
"byLanguage": "Files by language", "byLanguage": "Files by language",
"commits": "Commits", "commits": "Commits",
"completedTasks": "Completed tasks",
"durationTitle": "Task duration",
"durationUnavailable": "Task duration is unavailable until completed tasks have active execution time recorded",
"hoursSaved": "Human hours saved", "hoursSaved": "Human hours saved",
"hoursSavedEstimate": "estimate from lines changed", "hoursSavedEstimate": "estimate from lines changed",
"hoursSavedUnavailable": "Estimated human hours saved is unavailable until commit diff stats exist", "hoursSavedUnavailable": "Estimated human hours saved is unavailable until commit diff stats exist",
"languagePie": "Language share", "languagePie": "Language share",
"loc": "Lines changed", "loc": "Lines changed",
"locUnavailable": "LOC is unavailable until commit diff stats are recorded", "locUnavailable": "LOC is unavailable until commit diff stats are recorded",
"medianDuration": "Median",
"modifiedFiles": "Files modified", "modifiedFiles": "Files modified",
"outcomesTitle": "Outcomes", "outcomesTitle": "Outcomes",
"p90Duration": "P90",
"pullRequests": "Pull requests", "pullRequests": "Pull requests",
"totalDuration": "Total active",
"volumeHint": "volume, not outcome", "volumeHint": "volume, not outcome",
"volumeTitle": "Volume (proxy)" "volumeTitle": "Volume (proxy)"
}, },
@@ -1694,6 +1731,7 @@
"ecosystem": "Ecosystem", "ecosystem": "Ecosystem",
"github": "GitHub", "github": "GitHub",
"missionControl": "Mission Control", "missionControl": "Mission Control",
"nodes": "Nodes",
"overview": "Overview", "overview": "Overview",
"productivity": "Productivity", "productivity": "Productivity",
"reliability": "Reliability", "reliability": "Reliability",
@@ -1910,6 +1948,8 @@
"clear": "Clear", "clear": "Clear",
"command": "Command", "command": "Command",
"configuration": "Configuration", "configuration": "Configuration",
"configurationLabel": "Dev server configuration",
"controlsHeaderLabel": "Dev server controls header",
"embedded": "Embedded", "embedded": "Embedded",
"embeddedPreviewDisabled": "Embedded preview is disabled. Open your app in a separate browser tab.", "embeddedPreviewDisabled": "Embedded preview is disabled. Open your app in a separate browser tab.",
"enterFullscreen": "Enter fullscreen logs", "enterFullscreen": "Enter fullscreen logs",
@@ -1928,6 +1968,7 @@
"loadingOlderLogs": "Loading older logs…", "loadingOlderLogs": "Loading older logs…",
"loadOlderLogs": "Load older logs", "loadOlderLogs": "Load older logs",
"logs": "Logs", "logs": "Logs",
"logsLabel": "Dev server logs",
"lostConnection": "Lost log stream connection.", "lostConnection": "Lost log stream connection.",
"manual": "Manual", "manual": "Manual",
"matchCount_one": "{{count}} match", "matchCount_one": "{{count}} match",
@@ -1946,6 +1987,7 @@
"preview": "Preview", "preview": "Preview",
"previewBlocked": "Preview blocked", "previewBlocked": "Preview blocked",
"previewFailed": "Preview failed", "previewFailed": "Preview failed",
"previewLabel": "Dev server preview",
"previewUrlOverride": "Preview URL Override", "previewUrlOverride": "Preview URL Override",
"refreshPreview": "Refresh preview", "refreshPreview": "Refresh preview",
"restart": "Restart", "restart": "Restart",
@@ -2124,14 +2166,17 @@
"noTaskDocuments": "No task documents yet.", "noTaskDocuments": "No task documents yet.",
"openTask": "Open task", "openTask": "Open task",
"plain": "Plain", "plain": "Plain",
"projectFilePreviewLabel": "Project file content preview",
"projectFiles": "project files", "projectFiles": "project files",
"projectFilesTab": "Project Files", "projectFilesTab": "Project Files",
"projectMarkdownFilesLabel": "Project markdown files",
"resultCount_one": "{{count}} result{{plural}}", "resultCount_one": "{{count}} result{{plural}}",
"resultCount_other": "{{count}} result{{plural}}", "resultCount_other": "{{count}} result{{plural}}",
"retry": "Retry", "retry": "Retry",
"retryLoading": "Retry loading documents", "retryLoading": "Retry loading documents",
"searchProjectFiles": "Search project markdown files…", "searchProjectFiles": "Search project markdown files…",
"searchTaskDocuments": "Search task documents…", "searchTaskDocuments": "Search task documents…",
"sectionsLabel": "Documents sections",
"selectFile": "Select a Markdown file to view its content.", "selectFile": "Select a Markdown file to view its content.",
"showHidden": "Show hidden project files", "showHidden": "Show hidden project files",
"showHiddenFiles": "Show hidden files", "showHiddenFiles": "Show hidden files",
@@ -2185,6 +2230,12 @@
"failedToLoadFile": "Failed to load file", "failedToLoadFile": "Failed to load file",
"failedToSaveFile": "Failed to save file" "failedToSaveFile": "Failed to save file"
}, },
"errorBoundary": {
"genericError": "Something went wrong",
"reloadPage": "Reload page",
"retry": "Retry",
"sectionError": "This section encountered an error"
},
"evals": { "evals": {
"allRuns": "All runs", "allRuns": "All runs",
"disabledTitle": "Scheduled evals are disabled", "disabledTitle": "Scheduled evals are disabled",
@@ -2223,6 +2274,8 @@
"overlapBottleneck_one": "{{status}} overlap bottleneck {{blockerId}}: {{count}} todo blocked via blockedBy (threshold {{threshold}})", "overlapBottleneck_one": "{{status}} overlap bottleneck {{blockerId}}: {{count}} todo blocked via blockedBy (threshold {{threshold}})",
"overlapBottleneck_other": "{{status}} overlap bottleneck {{blockerId}}: {{count}} todo blocked via blockedBy (threshold {{threshold}})", "overlapBottleneck_other": "{{status}} overlap bottleneck {{blockerId}}: {{count}} todo blocked via blockedBy (threshold {{threshold}})",
"overlapQueue": "Overlap queue", "overlapQueue": "Overlap queue",
"overlapSummary_one": "{{blockerId}} · {{count}} todo",
"overlapSummary_other": "{{blockerId}} · {{count}} todo",
"queued": "Queued", "queued": "Queued",
"running": "Running", "running": "Running",
"secondsAgo_one": "{{count}}s ago", "secondsAgo_one": "{{count}}s ago",
@@ -2233,7 +2286,8 @@
"stateRunning": "Running", "stateRunning": "Running",
"status": "Executor status", "status": "Executor status",
"stuck": "Stuck", "stuck": "Stuck",
"temporary": "Temporary" "temporary": "Temporary",
"todoStatus": "todo"
}, },
"fileBrowser": { "fileBrowser": {
"back": "Back to file list", "back": "Back to file list",
@@ -2640,6 +2694,7 @@
"stashDropped": "Stash dropped", "stashDropped": "Stash dropped",
"stashMessagePlaceholder": "Stash message (optional)", "stashMessagePlaceholder": "Stash message (optional)",
"stashPopped": "Stash popped", "stashPopped": "Stash popped",
"stashRef": "stash@{{index}}",
"statusLabelBranch": "Branch", "statusLabelBranch": "Branch",
"statusLabelCommit": "Commit", "statusLabelCommit": "Commit",
"statusLabelIntegrationBranch": "Integration branch", "statusLabelIntegrationBranch": "Integration branch",
@@ -2693,6 +2748,13 @@
"worktreesTotal_one": "{{count}} total", "worktreesTotal_one": "{{count}} total",
"worktreesTotal_other": "{{count}} total" "worktreesTotal_other": "{{count}} total"
}, },
"githubStarPrompt": {
"body": "If Fusion has saved you time, a GitHub star goes a long way. It helps other developers discover the project and keeps the team motivated to ship improvements.",
"dismissLabel": "Dismiss GitHub star prompt",
"regionLabel": "GitHub star prompt",
"starOnGitHub": "Star on GitHub",
"title": "Enjoying Fusion?"
},
"goals": { "goals": {
"activeCount_one": "{{count}} active goals", "activeCount_one": "{{count}} active goals",
"activeCount_other": "{{count}} active goals", "activeCount_other": "{{count}} active goals",
@@ -2729,6 +2791,9 @@
"unlinkMissionError": "Unable to unlink mission right now. Please try again.", "unlinkMissionError": "Unable to unlink mission right now. Please try again.",
"updateError": "Unable to update goal status right now. Please try again." "updateError": "Unable to update goal status right now. Please try again."
}, },
"groups": {
"prLinkLabel": "PR #{{number}} ({{state}})"
},
"groupTask": { "groupTask": {
"abandonGroup": "Abandon group", "abandonGroup": "Abandon group",
"ariaLabel": "Branch group details", "ariaLabel": "Branch group details",
@@ -2767,6 +2832,7 @@
"documentsView": "Documents view", "documentsView": "Documents view",
"engineOptions": "Engine options", "engineOptions": "Engine options",
"evalsView": "Evals", "evalsView": "Evals",
"fusionLogo": "Fusion logo",
"gitManager": "Git Manager", "gitManager": "Git Manager",
"goalsView": "Goals", "goalsView": "Goals",
"importFromGitHub": "Import from GitHub", "importFromGitHub": "Import from GitHub",
@@ -2786,7 +2852,6 @@
"moreHeaderActions": "More header actions", "moreHeaderActions": "More header actions",
"moreViews": "More views", "moreViews": "More views",
"noBaseBranch": "No base branch", "noBaseBranch": "No base branch",
"nodes": "Nodes",
"noScriptsAddOne": "No scripts — add one…", "noScriptsAddOne": "No scripts — add one…",
"noScriptsConfigured": "No scripts configured", "noScriptsConfigured": "No scripts configured",
"noWorkingBranch": "No working branch", "noWorkingBranch": "No working branch",
@@ -2927,6 +2992,7 @@
"archiveTitle": "Archive this insight", "archiveTitle": "Archive this insight",
"archiving": "Archiving \"{{title}}\"...", "archiving": "Archiving \"{{title}}\"...",
"backlogHealth": "Backlog Health", "backlogHealth": "Backlog Health",
"categoriesLabel": "Insight categories",
"configureModel": "Configure insight generation model", "configureModel": "Configure insight generation model",
"configureModelTitle": "Configure model", "configureModelTitle": "Configure model",
"createTaskLabel": "Create task from this insight", "createTaskLabel": "Create task from this insight",
@@ -3017,6 +3083,9 @@
"verificationCriteria": "Verification Criteria", "verificationCriteria": "Verification Criteria",
"yes": "Yes" "yes": "Yes"
}, },
"issues": {
"noIssuesFound": "No issues found"
},
"lane": { "lane": {
"collapse": "Collapse {{name}} lane", "collapse": "Collapse {{name}} lane",
"expand": "Expand {{name}} lane" "expand": "Expand {{name}} lane"
@@ -3129,8 +3198,7 @@
"unpauseUnavailable": "Unpause action is unavailable", "unpauseUnavailable": "Unpause action is unavailable",
"useProjectDefault": "Use project default", "useProjectDefault": "Use project default",
"viewOptions": "View options", "viewOptions": "View options",
"workflowLabel": "Workflow", "workflowLabel": "Workflow"
"workflowSelectLabel": "Select workflow"
}, },
"mailbox": { "mailbox": {
"agent": "Agent", "agent": "Agent",
@@ -3199,6 +3267,7 @@
"replyingTo": "Replying to", "replyingTo": "Replying to",
"replyingToMessage": "Replying to message", "replyingToMessage": "Replying to message",
"replyLoadFailed": "Failed to load replied message. Click to retry.", "replyLoadFailed": "Failed to load replied message. Click to retry.",
"resizeMessageListPane": "Resize message list pane",
"selectMessageToRead": "Select a message to read", "selectMessageToRead": "Select a message to read",
"system": "System", "system": "System",
"timeDaysAgo_one": "{{count}}d ago", "timeDaysAgo_one": "{{count}}d ago",
@@ -3212,6 +3281,7 @@
"to": "To", "to": "To",
"toLabel": "To:", "toLabel": "To:",
"toPrefix": "To: {{recipient}}", "toPrefix": "To: {{recipient}}",
"toRecipient": "To: {{recipient}}",
"typeAgentToAgent": "Agent ↔ Agent", "typeAgentToAgent": "Agent ↔ Agent",
"typeAgentToUser": "Agent → You", "typeAgentToUser": "Agent → You",
"typeSystem": "System", "typeSystem": "System",
@@ -3387,11 +3457,13 @@
"missions": { "missions": {
"acceptance": "Acceptance:", "acceptance": "Acceptance:",
"acceptanceCriteriaOptional": "Acceptance criteria (optional)", "acceptanceCriteriaOptional": "Acceptance criteria (optional)",
"acceptanceCriteriaPrefix": "AC:",
"actionGenerating": "Generating…", "actionGenerating": "Generating…",
"actionResume": "Resume", "actionResume": "Resume",
"actionRetry": "Retry", "actionRetry": "Retry",
"actionReview": "Review", "actionReview": "Review",
"activateSlice": "Activate slice", "activateSlice": "Activate slice",
"activityCount": "{{visible}} of {{total}}",
"activityTime": "Activity {{time}}", "activityTime": "Activity {{time}}",
"actual": "Actual: {{value}}", "actual": "Actual: {{value}}",
"addAssertion": "Add assertion", "addAssertion": "Add assertion",
@@ -3518,6 +3590,7 @@
"filterSlices": "Slice & milestone events", "filterSlices": "Slice & milestone events",
"filterStateChanges": "State changes", "filterStateChanges": "State changes",
"filterTasks": "Task events", "filterTasks": "Task events",
"fixLineageButton": "🔗 Fix",
"generatedFixFeatures": "Generated fix features:", "generatedFixFeatures": "Generated fix features:",
"generatedFixFeaturesTitle": "Generated Fix Features", "generatedFixFeaturesTitle": "Generated Fix Features",
"generatedFromFeature": "Generated from feature: {{id}}", "generatedFromFeature": "Generated from feature: {{id}}",
@@ -3545,6 +3618,8 @@
"linkButton": "Link", "linkButton": "Link",
"linkedCount_one": "{{count}} linked", "linkedCount_one": "{{count}} linked",
"linkedCount_other": "{{count}} linked", "linkedCount_other": "{{count}} linked",
"linkedCountShort_one": "({{count}} linked)",
"linkedCountShort_other": "({{count}} linked)",
"linkedFeaturesCount_one": "{{count}} linked feature", "linkedFeaturesCount_one": "{{count}} linked feature",
"linkedFeaturesCount_other": "{{count}} linked features", "linkedFeaturesCount_other": "{{count}} linked features",
"linkedFeaturesLabel": "Linked Features", "linkedFeaturesLabel": "Linked Features",
@@ -3605,6 +3680,7 @@
"planStateNeedsUpdate": "Needs update", "planStateNeedsUpdate": "Needs update",
"planStateNotPlanned": "Not planned", "planStateNotPlanned": "Not planned",
"planStatePlanned": "Planned", "planStatePlanned": "Planned",
"planTargetTitle": "Plan {{targetLabel}}: {{targetTitle}}",
"planTitle": "Plan Mission with AI", "planTitle": "Plan Mission with AI",
"prepareQuestion": "Preparing next question...", "prepareQuestion": "Preparing next question...",
"progressText_one": "Question {{count}} of ~6", "progressText_one": "Question {{count}} of ~6",
@@ -3711,6 +3787,7 @@
"updateButton": "Update", "updateButton": "Update",
"updated": "Mission updated", "updated": "Mission updated",
"validateFeature": "Validate feature", "validateFeature": "Validate feature",
"validationRoundAttempts": "impl #{{implementation}} · reviewer #{{reviewer}}",
"validationRoundsCount_one": "{{count}} round", "validationRoundsCount_one": "{{count}} round",
"validationRoundsCount_other": "{{count}} rounds", "validationRoundsCount_other": "{{count}} rounds",
"validationRoundsLabel_one": "Validation rounds ({{count}})", "validationRoundsLabel_one": "Validation rounds ({{count}})",
@@ -3775,7 +3852,6 @@
"options": { "options": {
"default": "Default", "default": "Default",
"high": "High", "high": "High",
"xhigh": "Very High",
"low": "Low", "low": "Low",
"medium": "Medium", "medium": "Medium",
"minimal": "Minimal", "minimal": "Minimal",
@@ -3827,10 +3903,12 @@
"board": "Board", "board": "Board",
"chat": "Chat", "chat": "Chat",
"chatUnreadAriaLabel": "Unread chat response", "chatUnreadAriaLabel": "Unread chat response",
"collapseSidebar": "Collapse sidebar",
"commandCenter": "Command Center", "commandCenter": "Command Center",
"devServer": "Dev Server", "devServer": "Dev Server",
"documents": "Documents", "documents": "Documents",
"evals": "Evals", "evals": "Evals",
"expandSidebar": "Expand sidebar",
"files": "Files", "files": "Files",
"gitManager": "Git Manager", "gitManager": "Git Manager",
"goals": "Goals", "goals": "Goals",
@@ -3845,16 +3923,17 @@
"missions": "Missions", "missions": "Missions",
"more": "More", "more": "More",
"moreSheetTitle": "Navigate", "moreSheetTitle": "Navigate",
"nodes": "Nodes",
"noScriptsAddOne": "No scripts — add one…", "noScriptsAddOne": "No scripts — add one…",
"planning": "Planning", "planning": "Planning",
"primaryNavAriaLabel": "Primary navigation", "primaryNavAriaLabel": "Primary navigation",
"projects": "Projects", "projects": "Projects",
"research": "Research", "research": "Research",
"resizeSidebar": "Resize sidebar",
"scriptsSubmenuAriaLabel": "Scripts submenu", "scriptsSubmenuAriaLabel": "Scripts submenu",
"secrets": "Secrets", "secrets": "Secrets",
"settings": "Settings", "settings": "Settings",
"showScriptsAriaLabel": "Show scripts", "showScriptsAriaLabel": "Show scripts",
"sidebarAriaLabel": "Sidebar navigation",
"skills": "Skills", "skills": "Skills",
"stashRecovery": "Stash Recovery", "stashRecovery": "Stash Recovery",
"tasks": "Tasks", "tasks": "Tasks",
@@ -3960,12 +4039,14 @@
"discoverBeforeAdding": "Discover remote projects before adding this node.", "discoverBeforeAdding": "Discover remote projects before adding this node.",
"discoveredCount_one": "Discovered {{count}} remote project{{plural}}", "discoveredCount_one": "Discovered {{count}} remote project{{plural}}",
"discoveredCount_other": "Discovered {{count}} remote project{{plural}}", "discoveredCount_other": "Discovered {{count}} remote project{{plural}}",
"discoveredRemoteProjectsLabel": "Discovered remote projects",
"discovering": "Discovering...", "discovering": "Discovering...",
"discoverRemoteProjects": "Discover Remote Projects", "discoverRemoteProjects": "Discover Remote Projects",
"discoveryFailed": "Failed to discover remote projects", "discoveryFailed": "Failed to discover remote projects",
"dismissError": "Dismiss error", "dismissError": "Dismiss error",
"docker": "Docker", "docker": "Docker",
"dockerBadge": "Managed Docker node", "dockerBadge": "Managed Docker node",
"dockerConfigMeta": "Config v{{version}} • Updated {{updated}}",
"dockerConfigSaveFailed": "Failed to save Docker config", "dockerConfigSaveFailed": "Failed to save Docker config",
"dockerConfigSaveSuccess": "Docker config saved", "dockerConfigSaveSuccess": "Docker config saved",
"dockerConfiguration": "Docker Configuration", "dockerConfiguration": "Docker Configuration",
@@ -4083,6 +4164,7 @@
"name": "Build Server", "name": "Build Server",
"optional": "Optional" "optional": "Optional"
}, },
"projectPathMappingsLabel": "Project path mappings",
"provideManually": "Provide key manually", "provideManually": "Provide key manually",
"pulling": "Pulling...", "pulling": "Pulling...",
"pullSettings": "Pull Settings", "pullSettings": "Pull Settings",
@@ -4281,6 +4363,9 @@
"testFailed": "Test failed — see status above.", "testFailed": "Test failed — see status above.",
"unreachable": "{{reason}}" "unreachable": "{{reason}}"
}, },
"piExtensions": {
"filterHint": "{{extensions}} ext, {{skills}} skill, {{prompts}} prompt, {{themes}} theme"
},
"piManager": { "piManager": {
"addButton": "Add", "addButton": "Add",
"discoveredDescription": "Installed extensions resolved from packages and configured paths.", "discoveredDescription": "Installed extensions resolved from packages and configured paths.",
@@ -4884,6 +4969,7 @@
"createTask": "Create Task", "createTask": "Create Task",
"createTaskButton": "Create Task", "createTaskButton": "Create Task",
"createTaskTitle": "Create task from finding", "createTaskTitle": "Create task from finding",
"currentDefaults": "Current defaults: provider {{provider}}, max sources {{maxSources}}",
"defaultFindingHeading": "Research finding", "defaultFindingHeading": "Research finding",
"descriptionLabel": "Description", "descriptionLabel": "Description",
"disabled": "Research is disabled for this project.", "disabled": "Research is disabled for this project.",
@@ -4906,6 +4992,7 @@
"noRunsYet": "No research runs yet", "noRunsYet": "No research runs yet",
"noSourcesAvailable": "No enabled research sources are available for this project.", "noSourcesAvailable": "No enabled research sources are available for this project.",
"noSummaryYet": "No summary yet.", "noSummaryYet": "No summary yet.",
"notSet": "(not set)",
"openAuthSettings": "Open Authentication Settings", "openAuthSettings": "Open Authentication Settings",
"openResearchSettings": "Open Research Settings", "openResearchSettings": "Open Research Settings",
"priorityHigh": "High", "priorityHigh": "High",
@@ -4966,6 +5053,7 @@
"intro": "View the effective execution node and control per-task node override.", "intro": "View the effective execution node and control per-task node override.",
"localNoConfiguration": "Local (no routing configured)", "localNoConfiguration": "Local (no routing configured)",
"lockedWhileActive": "Routing is locked while this task is active. Node override cannot be changed until the task is no longer active.", "lockedWhileActive": "Routing is locked while this task is active. Node override cannot be changed until the task is no longer active.",
"nodeOptionLabel": "{{name}} ({{type}}) — {{status}}",
"nodeUnavailable": "node unavailable or unknown", "nodeUnavailable": "node unavailable or unknown",
"overrideCleared": "Node override cleared", "overrideCleared": "Node override cleared",
"overrideSection": "Node Override", "overrideSection": "Node Override",
@@ -4983,6 +5071,9 @@
"unhealthy": "Unhealthy", "unhealthy": "Unhealthy",
"useProjectDefault": "Use project default" "useProjectDefault": "Use project default"
}, },
"runtimes": {
"nousResearchLogoAlt": "Nous Research"
},
"schedule": { "schedule": {
"actionAiPrompt": "AI Prompt", "actionAiPrompt": "AI Prompt",
"actionCommand": "Command", "actionCommand": "Command",
@@ -5048,6 +5139,7 @@
"cronPresetMonthly": "Every month (1st)", "cronPresetMonthly": "Every month (1st)",
"cronPresetWeekly": "Every week (Monday)", "cronPresetWeekly": "Every week (Monday)",
"cronRequired": "Cron expression is required for custom schedules", "cronRequired": "Cron expression is required for custom schedules",
"crontabGuru": "crontab.guru",
"delete": "Delete", "delete": "Delete",
"deleteError": "Failed to delete routine", "deleteError": "Failed to delete routine",
"deleteMessage": "Delete schedule {{name}}? This cannot be undone.", "deleteMessage": "Delete schedule {{name}}? This cannot be undone.",
@@ -5102,6 +5194,7 @@
"globalScope": "Global", "globalScope": "Global",
"globalScoped": "This schedule will be created at global scope.", "globalScoped": "This schedule will be created at global scope.",
"globalScopeTitle": "Global scope", "globalScopeTitle": "Global scope",
"lastLabel": "Last:",
"loadRoutinesError": "Failed to load routines", "loadRoutinesError": "Failed to load routines",
"manualTriggerInfo": "This routine will be triggered manually via the dashboard or API.", "manualTriggerInfo": "This routine will be triggered manually via the dashboard or API.",
"modeAriaLabel": "Execution mode", "modeAriaLabel": "Execution mode",
@@ -5124,6 +5217,7 @@
"newAutomation": "New Automation", "newAutomation": "New Automation",
"newRoutineHeading": "New Routine", "newRoutineHeading": "New Routine",
"newTitle": "New Schedule", "newTitle": "New Schedule",
"nextLabel": "Next:",
"noActiveProject": "No active project. Schedules will be created at global scope.", "noActiveProject": "No active project. Schedules will be created at global scope.",
"noAutomations": "No automations yet", "noAutomations": "No automations yet",
"noStepsEmpty": "No steps added yet. Add a command or AI prompt step to get started.", "noStepsEmpty": "No steps added yet. Add a command or AI prompt step to get started.",
@@ -5154,6 +5248,7 @@
"runNameNow": "Run {{name}} now", "runNameNow": "Run {{name}} now",
"running": "Running…", "running": "Running…",
"runNow": "Run now", "runNow": "Run now",
"runsLabel": "Runs:",
"saveChanges": "Save Changes", "saveChanges": "Save Changes",
"saveStep": "Save Step", "saveStep": "Save Step",
"saving": "Saving…", "saving": "Saving…",
@@ -5233,6 +5328,9 @@
"webhookSecretLabel": "Webhook Secret (optional)", "webhookSecretLabel": "Webhook Secret (optional)",
"webhookSecretPlaceholder": "Optional — leave empty for unauthenticated webhooks" "webhookSecretPlaceholder": "Optional — leave empty for unauthenticated webhooks"
}, },
"scripts": {
"title": "Scripts"
},
"scriptsModal": { "scriptsModal": {
"addScript": "Add Script", "addScript": "Add Script",
"addScriptsHint": "Add scripts to quickly run common commands from the dashboard.", "addScriptsHint": "Add scripts to quickly run common commands from the dashboard.",
@@ -5660,6 +5758,7 @@
"enabling": "Enabling…", "enabling": "Enabling…",
"notConnected": "✗ Not connected", "notConnected": "✗ Not connected",
"probing": "Probing local CLI…", "probing": "Probing local CLI…",
"providerName": "Cursor — via Cursor CLI",
"test": "Test", "test": "Test",
"testing": "Testing…" "testing": "Testing…"
}, },
@@ -5695,6 +5794,7 @@
"githubConnectionFailed": "Connection failed or timed out.", "githubConnectionFailed": "Connection failed or timed out.",
"githubOauthConnected": "GitHub OAuth is connected. You can import issues and track pull requests.", "githubOauthConnected": "GitHub OAuth is connected. You can import issues and track pull requests.",
"githubOauthNotConnected": "GitHub OAuth isn't connected yet. You can set it up in Settings → Authentication, or continue now and connect later.", "githubOauthNotConnected": "GitHub OAuth isn't connected yet. You can set it up in Settings → Authentication, or continue now and connect later.",
"githubProvider": "GitHub",
"githubSkipped": "GitHub was skipped. You can connect anytime from Settings → Authentication.", "githubSkipped": "GitHub was skipped. You can connect anytime from Settings → Authentication.",
"goBackToStep": "Go back to {{label}}", "goBackToStep": "Go back to {{label}}",
"goToDashboard": "Go to Dashboard", "goToDashboard": "Go to Dashboard",
@@ -5954,6 +6054,9 @@
"saving": "Saving…", "saving": "Saving…",
"view": "View" "view": "View"
}, },
"stash": {
"copyReference": "Copy stash reference"
},
"stashRecovery": { "stashRecovery": {
"applied": "Applied", "applied": "Applied",
"apply": "Apply", "apply": "Apply",
@@ -6710,7 +6813,6 @@
"subtaskButton": "Subtask", "subtaskButton": "Subtask",
"thinkingDefault": "Default ({{level}})", "thinkingDefault": "Default ({{level}})",
"thinkingHigh": "High", "thinkingHigh": "High",
"thinkingXhigh": "Very High",
"thinkingLabel": "Thinking", "thinkingLabel": "Thinking",
"thinkingLow": "Low", "thinkingLow": "Low",
"thinkingMedium": "Medium", "thinkingMedium": "Medium",
@@ -6971,6 +7073,7 @@
"workflowCheck": "Workflow check" "workflowCheck": "Workflow check"
}, },
"terminal": { "terminal": {
"arrowKeysLabel": "Terminal arrow keys",
"clear": "Clear", "clear": "Clear",
"clearTerminal": "Clear terminal", "clearTerminal": "Clear terminal",
"closeTab": "Close tab", "closeTab": "Close tab",
@@ -7289,6 +7392,7 @@
"foreachSequential": "Sequential", "foreachSequential": "Sequential",
"foreachShared": "Shared worktree", "foreachShared": "Shared worktree",
"foreachWorktree": "Per-step worktree", "foreachWorktree": "Per-step worktree",
"gateBadge": "gate",
"gateBlocks": "Gate (blocks)", "gateBlocks": "Gate (blocks)",
"gateMode": "Gate mode", "gateMode": "Gate mode",
"insertTemplate": "Insert template {{name}}", "insertTemplate": "Insert template {{name}}",
@@ -7345,6 +7449,7 @@
"startEntryColumn": "Entry column", "startEntryColumn": "Entry column",
"startEntryColumnAuto": "— Auto (first column)", "startEntryColumnAuto": "— Auto (first column)",
"startNote": "The start node marks where a task enters the workflow.", "startNote": "The start node marks where a task enters the workflow.",
"stepBadge": "step",
"stepExecuteLabel": "Step execute", "stepExecuteLabel": "Step execute",
"templateFilterLabel": "Filter templates", "templateFilterLabel": "Filter templates",
"templateFilterPlaceholder": "Filter templates", "templateFilterPlaceholder": "Filter templates",
@@ -7353,6 +7458,7 @@
"templatesFragments": "Fragments", "templatesFragments": "Fragments",
"templatesPluginSteps": "Plugin steps", "templatesPluginSteps": "Plugin steps",
"templatesSection": "Templates", "templatesSection": "Templates",
"timeoutMs": "{{timeout}}ms",
"trivialGraphHint": "This workflow only runs start → end. Add steps from the palette above to build it out." "trivialGraphHint": "This workflow only runs start → end. Add steps from the palette above to build it out."
}, },
"workflows": { "workflows": {
@@ -7418,14 +7524,6 @@
"templateSectionBuiltin": "Built-in workflows", "templateSectionBuiltin": "Built-in workflows",
"templateSectionYours": "Your workflows" "templateSectionYours": "Your workflows"
}, },
"workflowSwitcher": {
"countsAria": "{{todoLabel}}: {{todo}}, {{inProgressLabel}}: {{inProgress}}, {{doneLabel}}: {{done}}",
"done": "Done",
"inProgress": "In Progress",
"label": "Workflow",
"todo": "Todo",
"triggerAria": "Select workflow. Current workflow: {{name}}"
},
"workflowSelector": { "workflowSelector": {
"switchActiveMessage": "This task has an active session. Switching workflows aborts it and re-homes the card into the new workflow's entry column. Continue?", "switchActiveMessage": "This task has an active session. Switching workflows aborts it and re-homes the card into the new workflow's entry column. Continue?",
"switchActiveTitle": "Switch workflow?", "switchActiveTitle": "Switch workflow?",
@@ -7485,6 +7583,14 @@
"widget": "Widget", "widget": "Widget",
"widgetDefault": "Default" "widgetDefault": "Default"
}, },
"workflowSwitcher": {
"countsAria": "{{todoLabel}}: {{todo}}, {{inProgressLabel}}: {{inProgress}}, {{doneLabel}}: {{done}}",
"done": "Done",
"inProgress": "In Progress",
"label": "Workflow",
"todo": "Todo",
"triggerAria": "Select workflow. Current workflow: {{name}}"
},
"workspace": { "workspace": {
"projectRoot": "Project Root", "projectRoot": "Project Root",
"selectWorkspace": "Select workspace", "selectWorkspace": "Select workspace",
@@ -7500,133 +7606,5 @@
"installRequestTitle": "Worktrunk install request", "installRequestTitle": "Worktrunk install request",
"sha256": "SHA-256", "sha256": "SHA-256",
"version": "Version" "version": "Version"
},
"workflowEditor": {
"cliAgent": {
"executorOption": "CLI agent",
"adapterLabel": "CLI adapter",
"adapterPlaceholder": "— select adapter —",
"adapterNote": "Drives a CLI coding agent in an engine-owned terminal for this step.",
"tier": {
"native": "native",
"hybrid": "hybrid",
"generic": "generic"
},
"autonomyLabel": "Elevated autonomy (bypass approvals)",
"autonomyNote": "Elevated autonomy requires a per-project approval before the agent can launch. Until approved, launches with elevated posture fail.",
"notifyLabel": "Waiting-on-input notification",
"notify": {
"banner": "In-app banner",
"bannerNotify": "Banner + push notification"
},
"notifyNote": "How you are alerted when the agent pauses waiting for input on this step."
}
},
"cliTerminal": {
"replayIdle": "Session idle",
"replayEnded": "Session ended",
"readOnly": "Read-only",
"postureResolved": "Resolved posture",
"postureBaseline": "Baseline",
"adapterSettings": "Adapter settings",
"advancePrompt": "This session looks idle — advance to review?",
"advance": "Advance",
"notYet": "Not yet",
"mobileInputPlaceholder": "Type to send to the session…",
"mobileSend": "Send",
"mobileKeyEsc": "Send Escape",
"mobileKeyTab": "Send Tab",
"mobileKeyCtrlC": "Send Ctrl-C",
"mobileKeyCtrl": "Sticky Ctrl modifier",
"mobileKeyArrowUp": "Cursor up",
"mobileKeyArrowDown": "Cursor down",
"mobileKeyArrowLeft": "Cursor left",
"mobileKeyArrowRight": "Cursor right"
},
"commandCenter": {
"heading": "Command Center",
"loading": "Loading command center...",
"empty": "No usage data yet. Run some agents to populate the Command Center.",
"areaPending": "This area renders once metrics data is available.",
"tablistLabel": "Command Center sections",
"tabs": {
"overview": "Overview",
"tokens": "Tokens",
"tools": "Tools",
"activity": "Activity",
"productivity": "Productivity",
"nodes": "Nodes",
"reliability": "Reliability",
"ecosystem": "Ecosystem",
"missionControl": "Mission Control"
},
"overview": {
"tokensCost": "Tokens & cost",
"autonomy": "Autonomy ratio",
"activeNodes": "Active nodes",
"tasksDone": "Tasks done",
"uniqueModels": "Unique models",
"openSignals": "Open signals",
"liveStrip": "Live activity",
"liveStripPending": "Live Mission Control loads with active sessions."
},
"range": {
"last24h": "Last 24h",
"last7d": "Last 7 days",
"last30d": "Last 30 days",
"allTime": "All time",
"custom": "Custom range",
"dialogLabel": "Select date range",
"from": "From",
"to": "To",
"invalidRange": "Start date must be on or before end date"
},
"controls": {
"title": "Operator controls",
"orgChart": {
"title": "Agent org chart",
"description": "Read-only view of the running agent hierarchy.",
"loading": "Loading org chart…",
"empty": "No agents are reporting in yet.",
"error": "Unable to load org chart"
},
"heartbeat": {
"title": "Heartbeat control",
"description": "Pause or resume the scheduling heartbeat.",
"pause": "Pause heartbeat",
"resume": "Resume heartbeat",
"disabledByStop": "Start the AI engine before resuming the heartbeat."
},
"engine": {
"title": "AI engine",
"description": "Stopping the engine halts all AI work."
},
"concurrency": {
"title": "Concurrency",
"description": "Tune live scheduler capacity.",
"maxConcurrent": "Max concurrent tasks",
"maxTriageConcurrent": "Max triage concurrent",
"maxWorktrees": "Max worktrees",
"error": "Unable to load concurrency settings"
},
"theme": {
"title": "Theme",
"description": "Switch the dashboard theme with live color previews."
},
"status": {
"running": "Running",
"paused": "Paused",
"stopped": "Stopped",
"loading": "Loading…",
"saving": "Saving…",
"saved": "Saved",
"saveError": "Save failed",
"ready": "Ready",
"error": "Unable to load live scheduler status",
"lastActivity": "Last activity",
"maxConcurrent": "Max concurrent",
"noActivity": "No recent activity"
}
}
} }
} }

View File

@@ -31,6 +31,12 @@
"update": "Actualizar", "update": "Actualizar",
"yes": "Sí" "yes": "Sí"
}, },
"activityFeed": {
"emptyHint": "",
"eventCount_one": "",
"eventCount_other": "",
"noRecentActivity": ""
},
"activityLog": { "activityLog": {
"activeFilters": "Filtros activos:", "activeFilters": "Filtros activos:",
"allEvents": "Todos los eventos", "allEvents": "Todos los eventos",
@@ -64,6 +70,7 @@
"noActivityRecorded": "Sin actividad grabada aún", "noActivityRecorded": "Sin actividad grabada aún",
"noMatchingActivity": "Ninguna actividad coincide con los filtros actuales", "noMatchingActivity": "Ninguna actividad coincide con los filtros actuales",
"notMerged": "No fusionado", "notMerged": "No fusionado",
"projectFilterBadge": "",
"refresh": "Actualizar", "refresh": "Actualizar",
"time": { "time": {
"daysAgo_one": "", "daysAgo_one": "",
@@ -74,7 +81,8 @@
"minutesAgo_one": "", "minutesAgo_one": "",
"minutesAgo_other": "" "minutesAgo_other": ""
}, },
"title": "Registro de actividad" "title": "Registro de actividad",
"typeFilterBadge": ""
}, },
"agentError": { "agentError": {
"copied": "Copiado", "copied": "Copiado",
@@ -354,6 +362,7 @@
"bundleTitle": "Paquete", "bundleTitle": "Paquete",
"cacheHitRatio": "Tasa de caché", "cacheHitRatio": "Tasa de caché",
"cacheReadTokens": "Lectura caché", "cacheReadTokens": "Lectura caché",
"cacheWindowSummary": "",
"cacheWriteTokens": "Escritura caché", "cacheWriteTokens": "Escritura caché",
"cancel": "Cancelar", "cancel": "Cancelar",
"cancelCustomInterval": "Cancelar intervalo personalizado", "cancelCustomInterval": "Cancelar intervalo personalizado",
@@ -361,6 +370,8 @@
"chainOfCommand": "Cadena de mando", "chainOfCommand": "Cadena de mando",
"change": "Cambiar", "change": "Cambiar",
"changeRole": "Haz clic para cambiar el rol", "changeRole": "Haz clic para cambiar el rol",
"charactersCount_one": "",
"charactersCount_other": "",
"chooseFile": "Elegir archivo", "chooseFile": "Elegir archivo",
"clearAgents": "Borrar agentes", "clearAgents": "Borrar agentes",
"clearSkills": "Borrar habilidades", "clearSkills": "Borrar habilidades",
@@ -408,6 +419,7 @@
"deleteTitle": "Eliminar agente", "deleteTitle": "Eliminar agente",
"deletionNotAvailable": "La eliminación no está disponible mientras el agente está en ejecución.", "deletionNotAvailable": "La eliminación no está disponible mientras el agente está en ejecución.",
"deletionPermanent": "Esto eliminará permanentemente el agente y todos los datos asociados.", "deletionPermanent": "Esto eliminará permanentemente el agente y todos los datos asociados.",
"detailLoadingLabel": "",
"details": "Detalles", "details": "Detalles",
"dialogAriaLabel": "Crear nuevo agente", "dialogAriaLabel": "Crear nuevo agente",
"dialogTitle": "Nuevo agente", "dialogTitle": "Nuevo agente",
@@ -452,6 +464,7 @@
"from": "De", "from": "De",
"generateHint": "Describe el rol de tu agente y deja que la IA genere una especificación", "generateHint": "Describe el rol de tu agente y deja que la IA genere una especificación",
"generateWithAI": "Generar con IA", "generateWithAI": "Generar con IA",
"generateWithAiLabel": "",
"generation": { "generation": {
"collapse": "Contraer", "collapse": "Contraer",
"expand": "Expandir", "expand": "Expandir",
@@ -536,9 +549,12 @@
"importingAgentsAndSkills": "Importando {{agentCount}} agente{{agentPlural}} y {{skillCount}} habilidad{{skillPlural}}...", "importingAgentsAndSkills": "Importando {{agentCount}} agente{{agentPlural}} y {{skillCount}} habilidad{{skillPlural}}...",
"importingSkills_one": "", "importingSkills_one": "",
"importingSkills_other": "", "importingSkills_other": "",
"importReportsTo": "",
"importSkills": "",
"inbox": "Bandeja de entrada", "inbox": "Bandeja de entrada",
"inheritingProjectDefault": "Heredando el valor predeterminado del proyecto", "inheritingProjectDefault": "Heredando el valor predeterminado del proyecto",
"inheritProjectDefault": "Heredar predeterminado del proyecto", "inheritProjectDefault": "Heredar predeterminado del proyecto",
"inlineInstructions": "",
"inlineMemoryFieldHint": "Esta memoria está integrada directamente en el contexto del agente.", "inlineMemoryFieldHint": "Esta memoria está integrada directamente en el contexto del agente.",
"inlineMemoryHint": "Memoria corta inyectada en cada heartbeat.", "inlineMemoryHint": "Memoria corta inyectada en cada heartbeat.",
"inlineMemoryLabel": "Memoria en línea", "inlineMemoryLabel": "Memoria en línea",
@@ -564,6 +580,8 @@
"intentPrompt": "¿Qué desea que haga este agente?", "intentPrompt": "¿Qué desea que haga este agente?",
"interval": "Intervalo", "interval": "Intervalo",
"interviewDraftApplied": "Borrador de entrevista aplicado", "interviewDraftApplied": "Borrador de entrevista aplicado",
"kTokens_one": "",
"kTokens_other": "",
"last24h": "Últimas 24h", "last24h": "Últimas 24h",
"last7d": "Últimos 7 días", "last7d": "Últimos 7 días",
"lastHeartbeat": "Última: {{time}}", "lastHeartbeat": "Última: {{time}}",
@@ -753,6 +771,7 @@
"output": "Salida", "output": "Salida",
"outputTokens": "Tokens de salida", "outputTokens": "Tokens de salida",
"overview": "Descripción general", "overview": "Descripción general",
"overviewLabel": "",
"parsing": "Analizando…", "parsing": "Analizando…",
"pause": "Pausar", "pause": "Pausar",
"pauseAction": "Pausar", "pauseAction": "Pausar",
@@ -1037,7 +1056,6 @@
"templateCompact": "Compacto", "templateCompact": "Compacto",
"templateDefault": "Predeterminado", "templateDefault": "Predeterminado",
"thinkingHigh": "Alto", "thinkingHigh": "Alto",
"thinkingXhigh": "Muy alto",
"thinkingLevel": "Nivel de pensamiento", "thinkingLevel": "Nivel de pensamiento",
"thinkingLow": "Bajo", "thinkingLow": "Bajo",
"thinkingMedium": "Medio", "thinkingMedium": "Medio",
@@ -1045,6 +1063,7 @@
"thinkingOff": "Desactivado", "thinkingOff": "Desactivado",
"thinkingXhigh": "Muy alto", "thinkingXhigh": "Muy alto",
"throughput": "Rendimiento", "throughput": "Rendimiento",
"timeSinceLastHeartbeat": "",
"title": "Agentes", "title": "Agentes",
"titleLabel": "Título", "titleLabel": "Título",
"titlePlaceholder": "p. ej. Revisor de código senior", "titlePlaceholder": "p. ej. Revisor de código senior",
@@ -1091,6 +1110,7 @@
}, },
"testMode": "Modo de prueba — sin llamadas reales de IA" "testMode": "Modo de prueba — sin llamadas reales de IA"
}, },
"appName": "",
"approval": { "approval": {
"dismissBanner": "Descartar pancarta de notificación de aprobación", "dismissBanner": "Descartar pancarta de notificación de aprobación",
"needAttention_one": "", "needAttention_one": "",
@@ -1175,6 +1195,9 @@
"openPr": "Abrir PR", "openPr": "Abrir PR",
"unavailable": "Grupo de ramas no disponible" "unavailable": "Grupo de ramas no disponible"
}, },
"branchGroups": {
"prNumber": ""
},
"capacity": { "capacity": {
"dismiss": "Descartar advertencia de capacidad", "dismiss": "Descartar advertencia de capacidad",
"risk": "Riesgo de capacidad:", "risk": "Riesgo de capacidad:",
@@ -1322,9 +1345,13 @@
"thinking": "Pensando", "thinking": "Pensando",
"thinkingLabel": "Pensando", "thinkingLabel": "Pensando",
"thinkingStatus": "Pensando…", "thinkingStatus": "Pensando…",
"toolArgsLabel": "",
"toolArgsPreview": "",
"toolCalls": "Llamadas a herramientas", "toolCalls": "Llamadas a herramientas",
"toolCallsCount_one": "", "toolCallsCount_one": "",
"toolCallsCount_other": "", "toolCallsCount_other": "",
"toolResultLabel": "",
"toolResultPreview": "",
"typeMessage": "Escribe un mensaje...", "typeMessage": "Escribe un mensaje...",
"unreadMessages": "Mensajes no leídos", "unreadMessages": "Mensajes no leídos",
"untitledSession": "Sin título", "untitledSession": "Sin título",
@@ -1353,9 +1380,11 @@
"versionMismatchSuffix": "Actualiza para mantenerte sincronizado." "versionMismatchSuffix": "Actualiza para mantenerte sincronizado."
}, },
"cliBinary": { "cliBinary": {
"binaryLabel": "",
"checking": "Verificando…", "checking": "Verificando…",
"copied": "Copiado", "copied": "Copiado",
"copy": "Copiar", "copy": "Copiar",
"expectedVersion": "",
"failedExit": "Instalación fallida (código de salida {{code}})", "failedExit": "Instalación fallida (código de salida {{code}})",
"heading": "Binario CLI", "heading": "Binario CLI",
"help": "Instalar la CLI global le permite ejecutar fn y fusion desde cualquier terminal. Las automatizaciones y scripts funcionan sin ella a través de npx, pero una instalación global es más rápida y conveniente.", "help": "Instalar la CLI global le permite ejecutar fn y fusion desde cualquier terminal. Las automatizaciones y scripts funcionan sin ella a través de npx, pero una instalación global es más rápida y conveniente.",
@@ -1363,13 +1392,15 @@
"installWithNpm": "Instalar con npm", "installWithNpm": "Instalar con npm",
"notOnPath": "Ni fn ni fusion se encontraron en PATH.", "notOnPath": "Ni fn ni fusion se encontraron en PATH.",
"orCopyLabel": "O copie y ejecute usted mismo:", "orCopyLabel": "O copie y ejecute usted mismo:",
"pathLabel": "",
"refresh": "Actualizar", "refresh": "Actualizar",
"reinstall": "Reinstalar", "reinstall": "Reinstalar",
"stateCheckDisabled": "Verificación deshabilitada", "stateCheckDisabled": "Verificación deshabilitada",
"stateInstalled": "Instalado", "stateInstalled": "Instalado",
"stateMissing": "No instalado", "stateMissing": "No instalado",
"stateVersionMismatch": "Versión no coincide", "stateVersionMismatch": "Versión no coincide",
"succeededDuration": "Instalación exitosa en {{duration}} s" "succeededDuration": "Instalación exitosa en {{duration}} s",
"versionLabel": ""
}, },
"cliChat": { "cliChat": {
"queued_one": "", "queued_one": "",
@@ -1509,7 +1540,6 @@
"title": "" "title": ""
}, },
"orgChart": { "orgChart": {
"description": "",
"empty": "", "empty": "",
"error": "", "error": "",
"loading": "", "loading": "",
@@ -1637,17 +1667,24 @@
"uniqueModels": "" "uniqueModels": ""
}, },
"productivity": { "productivity": {
"averageDuration": "",
"byLanguage": "", "byLanguage": "",
"commits": "", "commits": "",
"completedTasks": "",
"durationTitle": "",
"durationUnavailable": "",
"hoursSaved": "", "hoursSaved": "",
"hoursSavedEstimate": "", "hoursSavedEstimate": "",
"hoursSavedUnavailable": "", "hoursSavedUnavailable": "",
"languagePie": "", "languagePie": "",
"loc": "", "loc": "",
"locUnavailable": "", "locUnavailable": "",
"medianDuration": "",
"modifiedFiles": "", "modifiedFiles": "",
"outcomesTitle": "", "outcomesTitle": "",
"p90Duration": "",
"pullRequests": "", "pullRequests": "",
"totalDuration": "",
"volumeHint": "", "volumeHint": "",
"volumeTitle": "" "volumeTitle": ""
}, },
@@ -1694,6 +1731,7 @@
"ecosystem": "", "ecosystem": "",
"github": "", "github": "",
"missionControl": "", "missionControl": "",
"nodes": "",
"overview": "", "overview": "",
"productivity": "", "productivity": "",
"reliability": "", "reliability": "",
@@ -1910,6 +1948,8 @@
"clear": "Borrar", "clear": "Borrar",
"command": "Comando", "command": "Comando",
"configuration": "Configuración", "configuration": "Configuración",
"configurationLabel": "",
"controlsHeaderLabel": "",
"embedded": "Integrado", "embedded": "Integrado",
"embeddedPreviewDisabled": "La vista previa integrada está deshabilitada. Abra su aplicación en una pestaña del navegador separada.", "embeddedPreviewDisabled": "La vista previa integrada está deshabilitada. Abra su aplicación en una pestaña del navegador separada.",
"enterFullscreen": "Entrar en registros de pantalla completa", "enterFullscreen": "Entrar en registros de pantalla completa",
@@ -1928,6 +1968,7 @@
"loadingOlderLogs": "Cargando registros más antiguos…", "loadingOlderLogs": "Cargando registros más antiguos…",
"loadOlderLogs": "Cargar registros más antiguos", "loadOlderLogs": "Cargar registros más antiguos",
"logs": "Registros", "logs": "Registros",
"logsLabel": "",
"lostConnection": "Conexión de flujo de registro perdida.", "lostConnection": "Conexión de flujo de registro perdida.",
"manual": "Manual", "manual": "Manual",
"matchCount_one": "", "matchCount_one": "",
@@ -1946,6 +1987,7 @@
"preview": "Vista previa", "preview": "Vista previa",
"previewBlocked": "Vista previa bloqueada", "previewBlocked": "Vista previa bloqueada",
"previewFailed": "Vista previa fallida", "previewFailed": "Vista previa fallida",
"previewLabel": "",
"previewUrlOverride": "Anular URL de vista previa", "previewUrlOverride": "Anular URL de vista previa",
"refreshPreview": "Actualizar vista previa", "refreshPreview": "Actualizar vista previa",
"restart": "Reiniciar", "restart": "Reiniciar",
@@ -2124,14 +2166,17 @@
"noTaskDocuments": "Sin documentos de tarea aún.", "noTaskDocuments": "Sin documentos de tarea aún.",
"openTask": "Abrir tarea", "openTask": "Abrir tarea",
"plain": "Bruto", "plain": "Bruto",
"projectFilePreviewLabel": "",
"projectFiles": "archivos del proyecto", "projectFiles": "archivos del proyecto",
"projectFilesTab": "Archivos del proyecto", "projectFilesTab": "Archivos del proyecto",
"projectMarkdownFilesLabel": "",
"resultCount_one": "", "resultCount_one": "",
"resultCount_other": "", "resultCount_other": "",
"retry": "Reintentar", "retry": "Reintentar",
"retryLoading": "Reintentar cargar documentos", "retryLoading": "Reintentar cargar documentos",
"searchProjectFiles": "Buscar archivos markdown del proyecto…", "searchProjectFiles": "Buscar archivos markdown del proyecto…",
"searchTaskDocuments": "Buscar documentos de tareas…", "searchTaskDocuments": "Buscar documentos de tareas…",
"sectionsLabel": "",
"selectFile": "Seleccione un archivo markdown para ver su contenido.", "selectFile": "Seleccione un archivo markdown para ver su contenido.",
"showHidden": "Mostrar archivos de proyecto ocultos", "showHidden": "Mostrar archivos de proyecto ocultos",
"showHiddenFiles": "Mostrar archivos ocultos", "showHiddenFiles": "Mostrar archivos ocultos",
@@ -2185,6 +2230,12 @@
"failedToLoadFile": "Error al cargar el archivo", "failedToLoadFile": "Error al cargar el archivo",
"failedToSaveFile": "Error al guardar el archivo" "failedToSaveFile": "Error al guardar el archivo"
}, },
"errorBoundary": {
"genericError": "",
"reloadPage": "",
"retry": "",
"sectionError": ""
},
"evals": { "evals": {
"allRuns": "Todas las ejecuciones", "allRuns": "Todas las ejecuciones",
"disabledTitle": "Las evaluaciones programadas están deshabilitadas", "disabledTitle": "Las evaluaciones programadas están deshabilitadas",
@@ -2223,6 +2274,8 @@
"overlapBottleneck_one": "", "overlapBottleneck_one": "",
"overlapBottleneck_other": "", "overlapBottleneck_other": "",
"overlapQueue": "Cola de superposición", "overlapQueue": "Cola de superposición",
"overlapSummary_one": "",
"overlapSummary_other": "",
"queued": "En cola", "queued": "En cola",
"running": "En ejecución", "running": "En ejecución",
"secondsAgo_one": "", "secondsAgo_one": "",
@@ -2233,7 +2286,8 @@
"stateRunning": "Ejecutando", "stateRunning": "Ejecutando",
"status": "Estado del ejecutor", "status": "Estado del ejecutor",
"stuck": "Atascado", "stuck": "Atascado",
"temporary": "Temporal" "temporary": "Temporal",
"todoStatus": ""
}, },
"fileBrowser": { "fileBrowser": {
"back": "Volver a la lista de archivos", "back": "Volver a la lista de archivos",
@@ -2640,6 +2694,7 @@
"stashDropped": "Stash eliminado", "stashDropped": "Stash eliminado",
"stashMessagePlaceholder": "Mensaje del stash (opcional)", "stashMessagePlaceholder": "Mensaje del stash (opcional)",
"stashPopped": "Stash aplicado y eliminado", "stashPopped": "Stash aplicado y eliminado",
"stashRef": "",
"statusLabelBranch": "Rama", "statusLabelBranch": "Rama",
"statusLabelCommit": "Commit", "statusLabelCommit": "Commit",
"statusLabelIntegrationBranch": "Rama de integración", "statusLabelIntegrationBranch": "Rama de integración",
@@ -2693,6 +2748,13 @@
"worktreesTotal_one": "", "worktreesTotal_one": "",
"worktreesTotal_other": "" "worktreesTotal_other": ""
}, },
"githubStarPrompt": {
"body": "",
"dismissLabel": "",
"regionLabel": "",
"starOnGitHub": "",
"title": ""
},
"goals": { "goals": {
"activeCount_one": "", "activeCount_one": "",
"activeCount_other": "", "activeCount_other": "",
@@ -2729,6 +2791,9 @@
"unlinkMissionError": "", "unlinkMissionError": "",
"updateError": "No se puede actualizar el estado del objetivo ahora. Por favor, intenta de nuevo." "updateError": "No se puede actualizar el estado del objetivo ahora. Por favor, intenta de nuevo."
}, },
"groups": {
"prLinkLabel": ""
},
"groupTask": { "groupTask": {
"abandonGroup": "", "abandonGroup": "",
"ariaLabel": "Detalles del grupo de ramas", "ariaLabel": "Detalles del grupo de ramas",
@@ -2767,6 +2832,7 @@
"documentsView": "Vista documentos", "documentsView": "Vista documentos",
"engineOptions": "Opciones del motor", "engineOptions": "Opciones del motor",
"evalsView": "Evaluaciones", "evalsView": "Evaluaciones",
"fusionLogo": "",
"gitManager": "Gestor Git", "gitManager": "Gestor Git",
"goalsView": "Objetivos", "goalsView": "Objetivos",
"importFromGitHub": "Importar desde GitHub", "importFromGitHub": "Importar desde GitHub",
@@ -2786,7 +2852,6 @@
"moreHeaderActions": "Más acciones de encabezado", "moreHeaderActions": "Más acciones de encabezado",
"moreViews": "Más vistas", "moreViews": "Más vistas",
"noBaseBranch": "Sin rama base", "noBaseBranch": "Sin rama base",
"nodes": "Nodos",
"noScriptsAddOne": "Sin scripts — agregar uno…", "noScriptsAddOne": "Sin scripts — agregar uno…",
"noScriptsConfigured": "Sin scripts configurados", "noScriptsConfigured": "Sin scripts configurados",
"noWorkingBranch": "Sin rama de trabajo", "noWorkingBranch": "Sin rama de trabajo",
@@ -2927,6 +2992,7 @@
"archiveTitle": "Archivar esta información", "archiveTitle": "Archivar esta información",
"archiving": "Archivando \"{{title}}\"...", "archiving": "Archivando \"{{title}}\"...",
"backlogHealth": "Salud del trabajo pendiente", "backlogHealth": "Salud del trabajo pendiente",
"categoriesLabel": "",
"configureModel": "Configurar el modelo de generación de información", "configureModel": "Configurar el modelo de generación de información",
"configureModelTitle": "Configurar modelo", "configureModelTitle": "Configurar modelo",
"createTaskLabel": "Crear tarea desde esta información", "createTaskLabel": "Crear tarea desde esta información",
@@ -3017,6 +3083,9 @@
"verificationCriteria": "Criterios de verificación", "verificationCriteria": "Criterios de verificación",
"yes": "Sí" "yes": "Sí"
}, },
"issues": {
"noIssuesFound": ""
},
"lane": { "lane": {
"collapse": "", "collapse": "",
"expand": "" "expand": ""
@@ -3129,8 +3198,7 @@
"unpauseUnavailable": "La acción de reanudar no está disponible", "unpauseUnavailable": "La acción de reanudar no está disponible",
"useProjectDefault": "Usar predeterminado del proyecto", "useProjectDefault": "Usar predeterminado del proyecto",
"viewOptions": "Opciones de vista", "viewOptions": "Opciones de vista",
"workflowLabel": "", "workflowLabel": ""
"workflowSelectLabel": ""
}, },
"mailbox": { "mailbox": {
"agent": "Agente", "agent": "Agente",
@@ -3199,6 +3267,7 @@
"replyingTo": "Respondiendo a {{preview}}", "replyingTo": "Respondiendo a {{preview}}",
"replyingToMessage": "Respondiendo al mensaje", "replyingToMessage": "Respondiendo al mensaje",
"replyLoadFailed": "Error al cargar el mensaje de respuesta. Haz clic para reintentar.", "replyLoadFailed": "Error al cargar el mensaje de respuesta. Haz clic para reintentar.",
"resizeMessageListPane": "",
"selectMessageToRead": "Seleccione un mensaje para leer", "selectMessageToRead": "Seleccione un mensaje para leer",
"system": "Sistema", "system": "Sistema",
"timeDaysAgo_one": "", "timeDaysAgo_one": "",
@@ -3212,6 +3281,7 @@
"to": "Para", "to": "Para",
"toLabel": "Para:", "toLabel": "Para:",
"toPrefix": "Para: {{recipient}}", "toPrefix": "Para: {{recipient}}",
"toRecipient": "",
"typeAgentToAgent": "Agente ↔ Agente", "typeAgentToAgent": "Agente ↔ Agente",
"typeAgentToUser": "Agente → Usted", "typeAgentToUser": "Agente → Usted",
"typeSystem": "Sistema", "typeSystem": "Sistema",
@@ -3387,11 +3457,13 @@
"missions": { "missions": {
"acceptance": "Criterios de aceptación:", "acceptance": "Criterios de aceptación:",
"acceptanceCriteriaOptional": "Criterios de aceptación (opcional)", "acceptanceCriteriaOptional": "Criterios de aceptación (opcional)",
"acceptanceCriteriaPrefix": "",
"actionGenerating": "Generando…", "actionGenerating": "Generando…",
"actionResume": "Reanudar", "actionResume": "Reanudar",
"actionRetry": "Reintentar", "actionRetry": "Reintentar",
"actionReview": "Revisar", "actionReview": "Revisar",
"activateSlice": "Activar el segmento", "activateSlice": "Activar el segmento",
"activityCount": "",
"activityTime": "Actividad {{time}}", "activityTime": "Actividad {{time}}",
"actual": "Actual: {{value}}", "actual": "Actual: {{value}}",
"addAssertion": "Añadir aserción", "addAssertion": "Añadir aserción",
@@ -3518,6 +3590,7 @@
"filterSlices": "Eventos de segmento e hito", "filterSlices": "Eventos de segmento e hito",
"filterStateChanges": "Cambios de estado", "filterStateChanges": "Cambios de estado",
"filterTasks": "Eventos de tarea", "filterTasks": "Eventos de tarea",
"fixLineageButton": "",
"generatedFixFeatures": "Funcionalidades de corrección generadas:", "generatedFixFeatures": "Funcionalidades de corrección generadas:",
"generatedFixFeaturesTitle": "Funcionalidades de corrección generadas", "generatedFixFeaturesTitle": "Funcionalidades de corrección generadas",
"generatedFromFeature": "Generado desde la funcionalidad: {{id}}", "generatedFromFeature": "Generado desde la funcionalidad: {{id}}",
@@ -3545,6 +3618,8 @@
"linkButton": "Vincular", "linkButton": "Vincular",
"linkedCount_one": "", "linkedCount_one": "",
"linkedCount_other": "", "linkedCount_other": "",
"linkedCountShort_one": "",
"linkedCountShort_other": "",
"linkedFeaturesCount_one": "", "linkedFeaturesCount_one": "",
"linkedFeaturesCount_other": "", "linkedFeaturesCount_other": "",
"linkedFeaturesLabel": "Funcionalidades vinculadas", "linkedFeaturesLabel": "Funcionalidades vinculadas",
@@ -3605,6 +3680,7 @@
"planStateNeedsUpdate": "Necesita actualización", "planStateNeedsUpdate": "Necesita actualización",
"planStateNotPlanned": "Sin planificar", "planStateNotPlanned": "Sin planificar",
"planStatePlanned": "Planificado", "planStatePlanned": "Planificado",
"planTargetTitle": "",
"planTitle": "Planificar una misión con IA", "planTitle": "Planificar una misión con IA",
"prepareQuestion": "Preparando la siguiente pregunta...", "prepareQuestion": "Preparando la siguiente pregunta...",
"progressText_one": "", "progressText_one": "",
@@ -3711,6 +3787,7 @@
"updateButton": "Actualizar", "updateButton": "Actualizar",
"updated": "Misión actualizada", "updated": "Misión actualizada",
"validateFeature": "Validar la funcionalidad", "validateFeature": "Validar la funcionalidad",
"validationRoundAttempts": "",
"validationRoundsCount_one": "", "validationRoundsCount_one": "",
"validationRoundsCount_other": "", "validationRoundsCount_other": "",
"validationRoundsLabel_one": "", "validationRoundsLabel_one": "",
@@ -3775,7 +3852,6 @@
"options": { "options": {
"default": "Predeterminado", "default": "Predeterminado",
"high": "Alto", "high": "Alto",
"xhigh": "Muy alto",
"low": "Bajo", "low": "Bajo",
"medium": "Medio", "medium": "Medio",
"minimal": "Mínimo", "minimal": "Mínimo",
@@ -3827,10 +3903,12 @@
"board": "Tablero", "board": "Tablero",
"chat": "Chat", "chat": "Chat",
"chatUnreadAriaLabel": "Respuesta de chat no leída", "chatUnreadAriaLabel": "Respuesta de chat no leída",
"collapseSidebar": "",
"commandCenter": "", "commandCenter": "",
"devServer": "Servidor de desarrollo", "devServer": "Servidor de desarrollo",
"documents": "Documentos", "documents": "Documentos",
"evals": "Evaluaciones", "evals": "Evaluaciones",
"expandSidebar": "",
"files": "Archivos", "files": "Archivos",
"gitManager": "Gestor Git", "gitManager": "Gestor Git",
"goals": "Objetivos", "goals": "Objetivos",
@@ -3845,16 +3923,17 @@
"missions": "Misiones", "missions": "Misiones",
"more": "Más", "more": "Más",
"moreSheetTitle": "Navegar", "moreSheetTitle": "Navegar",
"nodes": "Nodos",
"noScriptsAddOne": "Sin scripts — agregar uno…", "noScriptsAddOne": "Sin scripts — agregar uno…",
"planning": "Planificación", "planning": "Planificación",
"primaryNavAriaLabel": "Navegación principal", "primaryNavAriaLabel": "Navegación principal",
"projects": "Proyectos", "projects": "Proyectos",
"research": "Investigación", "research": "Investigación",
"resizeSidebar": "",
"scriptsSubmenuAriaLabel": "Submenú de scripts", "scriptsSubmenuAriaLabel": "Submenú de scripts",
"secrets": "Secretos", "secrets": "Secretos",
"settings": "Configuración", "settings": "Configuración",
"showScriptsAriaLabel": "Mostrar scripts", "showScriptsAriaLabel": "Mostrar scripts",
"sidebarAriaLabel": "",
"skills": "Habilidades", "skills": "Habilidades",
"stashRecovery": "Recuperación de stash", "stashRecovery": "Recuperación de stash",
"tasks": "Tareas", "tasks": "Tareas",
@@ -3960,12 +4039,14 @@
"discoverBeforeAdding": "Descubra proyectos remotos antes de agregar este nodo.", "discoverBeforeAdding": "Descubra proyectos remotos antes de agregar este nodo.",
"discoveredCount_one": "", "discoveredCount_one": "",
"discoveredCount_other": "", "discoveredCount_other": "",
"discoveredRemoteProjectsLabel": "",
"discovering": "Descubriendo...", "discovering": "Descubriendo...",
"discoverRemoteProjects": "Descubrir proyectos remotos", "discoverRemoteProjects": "Descubrir proyectos remotos",
"discoveryFailed": "No se pudieron descubrir proyectos remotos", "discoveryFailed": "No se pudieron descubrir proyectos remotos",
"dismissError": "Descartar error", "dismissError": "Descartar error",
"docker": "Docker", "docker": "Docker",
"dockerBadge": "Nodo Docker administrado", "dockerBadge": "Nodo Docker administrado",
"dockerConfigMeta": "",
"dockerConfigSaveFailed": "Error al guardar la configuración de Docker", "dockerConfigSaveFailed": "Error al guardar la configuración de Docker",
"dockerConfigSaveSuccess": "Configuración de Docker guardada", "dockerConfigSaveSuccess": "Configuración de Docker guardada",
"dockerConfiguration": "Configuración de Docker", "dockerConfiguration": "Configuración de Docker",
@@ -4083,6 +4164,7 @@
"name": "Servidor de compilación", "name": "Servidor de compilación",
"optional": "Opcional" "optional": "Opcional"
}, },
"projectPathMappingsLabel": "",
"provideManually": "Proporcionar clave manualmente", "provideManually": "Proporcionar clave manualmente",
"pulling": "Descargando…", "pulling": "Descargando…",
"pullSettings": "Descargar ajustes", "pullSettings": "Descargar ajustes",
@@ -4281,6 +4363,9 @@
"testFailed": "La prueba falló — consulta el estado anterior.", "testFailed": "La prueba falló — consulta el estado anterior.",
"unreachable": "{{reason}}" "unreachable": "{{reason}}"
}, },
"piExtensions": {
"filterHint": ""
},
"piManager": { "piManager": {
"addButton": "Añadir", "addButton": "Añadir",
"discoveredDescription": "Extensiones instaladas resueltas desde paquetes y rutas configuradas.", "discoveredDescription": "Extensiones instaladas resueltas desde paquetes y rutas configuradas.",
@@ -4884,6 +4969,7 @@
"createTask": "Crear tarea", "createTask": "Crear tarea",
"createTaskButton": "Crear tarea", "createTaskButton": "Crear tarea",
"createTaskTitle": "Crear tarea desde hallazgo", "createTaskTitle": "Crear tarea desde hallazgo",
"currentDefaults": "",
"defaultFindingHeading": "Hallazgo de investigación", "defaultFindingHeading": "Hallazgo de investigación",
"descriptionLabel": "Descripción", "descriptionLabel": "Descripción",
"disabled": "La investigación está desactivada para este proyecto.", "disabled": "La investigación está desactivada para este proyecto.",
@@ -4906,6 +4992,7 @@
"noRunsYet": "Aún no hay ejecuciones", "noRunsYet": "Aún no hay ejecuciones",
"noSourcesAvailable": "No hay fuentes de investigación habilitadas disponibles para este proyecto.", "noSourcesAvailable": "No hay fuentes de investigación habilitadas disponibles para este proyecto.",
"noSummaryYet": "Sin resumen por ahora.", "noSummaryYet": "Sin resumen por ahora.",
"notSet": "",
"openAuthSettings": "Abrir configuración de autenticación", "openAuthSettings": "Abrir configuración de autenticación",
"openResearchSettings": "Abrir configuración de investigación", "openResearchSettings": "Abrir configuración de investigación",
"priorityHigh": "Alto", "priorityHigh": "Alto",
@@ -4966,6 +5053,7 @@
"intro": "Ver el nodo de ejecución efectivo y controlar la anulación del nodo por tarea.", "intro": "Ver el nodo de ejecución efectivo y controlar la anulación del nodo por tarea.",
"localNoConfiguration": "Local (sin enrutamiento configurado)", "localNoConfiguration": "Local (sin enrutamiento configurado)",
"lockedWhileActive": "El enrutamiento está bloqueado mientras esta tarea está activa. No se puede cambiar la anulación del nodo hasta que la tarea ya no esté activa.", "lockedWhileActive": "El enrutamiento está bloqueado mientras esta tarea está activa. No se puede cambiar la anulación del nodo hasta que la tarea ya no esté activa.",
"nodeOptionLabel": "",
"nodeUnavailable": "nodo no disponible o desconocido", "nodeUnavailable": "nodo no disponible o desconocido",
"overrideCleared": "Anulación de nodo borrada", "overrideCleared": "Anulación de nodo borrada",
"overrideSection": "Anulación de nodo", "overrideSection": "Anulación de nodo",
@@ -4983,6 +5071,9 @@
"unhealthy": "No saludable", "unhealthy": "No saludable",
"useProjectDefault": "Usar predeterminado del proyecto" "useProjectDefault": "Usar predeterminado del proyecto"
}, },
"runtimes": {
"nousResearchLogoAlt": ""
},
"schedule": { "schedule": {
"actionAiPrompt": "Indicación de IA", "actionAiPrompt": "Indicación de IA",
"actionCommand": "Comando", "actionCommand": "Comando",
@@ -5048,6 +5139,7 @@
"cronPresetMonthly": "Cada mes (día 1)", "cronPresetMonthly": "Cada mes (día 1)",
"cronPresetWeekly": "Cada semana (lunes)", "cronPresetWeekly": "Cada semana (lunes)",
"cronRequired": "Se requiere expresión cron para horarios personalizados", "cronRequired": "Se requiere expresión cron para horarios personalizados",
"crontabGuru": "",
"delete": "Eliminar", "delete": "Eliminar",
"deleteError": "Error al eliminar rutina", "deleteError": "Error al eliminar rutina",
"deleteMessage": "¿Eliminar la programación {{name}}? Esta acción no se puede deshacer.", "deleteMessage": "¿Eliminar la programación {{name}}? Esta acción no se puede deshacer.",
@@ -5102,6 +5194,7 @@
"globalScope": "Automatizaciones globales (a nivel de usuario)", "globalScope": "Automatizaciones globales (a nivel de usuario)",
"globalScoped": "Este horario se creará en alcance global.", "globalScoped": "Este horario se creará en alcance global.",
"globalScopeTitle": "Alcance global", "globalScopeTitle": "Alcance global",
"lastLabel": "",
"loadRoutinesError": "Error al cargar rutinas", "loadRoutinesError": "Error al cargar rutinas",
"manualTriggerInfo": "Esta rutina se activará manualmente desde el panel o la API.", "manualTriggerInfo": "Esta rutina se activará manualmente desde el panel o la API.",
"modeAriaLabel": "Modo de ejecución", "modeAriaLabel": "Modo de ejecución",
@@ -5124,6 +5217,7 @@
"newAutomation": "Nueva automatización", "newAutomation": "Nueva automatización",
"newRoutineHeading": "Nueva rutina", "newRoutineHeading": "Nueva rutina",
"newTitle": "Nueva programación", "newTitle": "Nueva programación",
"nextLabel": "",
"noActiveProject": "Sin proyecto activo. Los horarios se crearán en alcance global.", "noActiveProject": "Sin proyecto activo. Los horarios se crearán en alcance global.",
"noAutomations": "Sin automatizaciones aún", "noAutomations": "Sin automatizaciones aún",
"noStepsEmpty": "Aún no se han añadido pasos. Agregue un comando o un paso de prompt de IA para comenzar.", "noStepsEmpty": "Aún no se han añadido pasos. Agregue un comando o un paso de prompt de IA para comenzar.",
@@ -5154,6 +5248,7 @@
"runNameNow": "Ejecutar {{name}} ahora", "runNameNow": "Ejecutar {{name}} ahora",
"running": "Ejecutando…", "running": "Ejecutando…",
"runNow": "Ejecutar ahora", "runNow": "Ejecutar ahora",
"runsLabel": "",
"saveChanges": "Guardar cambios", "saveChanges": "Guardar cambios",
"saveStep": "Guardar paso", "saveStep": "Guardar paso",
"saving": "Guardando…", "saving": "Guardando…",
@@ -5233,6 +5328,9 @@
"webhookSecretLabel": "Secreto del webhook (opcional)", "webhookSecretLabel": "Secreto del webhook (opcional)",
"webhookSecretPlaceholder": "Opcional: deja vacío para webhooks sin autenticación" "webhookSecretPlaceholder": "Opcional: deja vacío para webhooks sin autenticación"
}, },
"scripts": {
"title": ""
},
"scriptsModal": { "scriptsModal": {
"addScript": "Añadir script", "addScript": "Añadir script",
"addScriptsHint": "Agregue scripts para ejecutar rápidamente comandos comunes desde el panel de control.", "addScriptsHint": "Agregue scripts para ejecutar rápidamente comandos comunes desde el panel de control.",
@@ -5660,6 +5758,7 @@
"enabling": "Activando…", "enabling": "Activando…",
"notConnected": "✗ No conectado", "notConnected": "✗ No conectado",
"probing": "Sondeo de CLI local…", "probing": "Sondeo de CLI local…",
"providerName": "",
"test": "Probar", "test": "Probar",
"testing": "Probando…" "testing": "Probando…"
}, },
@@ -5695,6 +5794,7 @@
"githubConnectionFailed": "La conexión falló o expiró.", "githubConnectionFailed": "La conexión falló o expiró.",
"githubOauthConnected": "GitHub OAuth está conectado. Puedes importar issues y rastrear pull requests.", "githubOauthConnected": "GitHub OAuth está conectado. Puedes importar issues y rastrear pull requests.",
"githubOauthNotConnected": "GitHub OAuth no está conectado aún. Puedes configurarlo en Ajustes → Autenticación, o continuar ahora y conectarte más tarde.", "githubOauthNotConnected": "GitHub OAuth no está conectado aún. Puedes configurarlo en Ajustes → Autenticación, o continuar ahora y conectarte más tarde.",
"githubProvider": "",
"githubSkipped": "Se omitió GitHub. Puedes conectarte en cualquier momento desde Ajustes → Autenticación.", "githubSkipped": "Se omitió GitHub. Puedes conectarte en cualquier momento desde Ajustes → Autenticación.",
"goBackToStep": "Volver a {{label}}", "goBackToStep": "Volver a {{label}}",
"goToDashboard": "Ir al panel", "goToDashboard": "Ir al panel",
@@ -5954,6 +6054,9 @@
"saving": "Guardando…", "saving": "Guardando…",
"view": "Ver" "view": "Ver"
}, },
"stash": {
"copyReference": ""
},
"stashRecovery": { "stashRecovery": {
"applied": "Aplicado", "applied": "Aplicado",
"apply": "Aplicar", "apply": "Aplicar",
@@ -6710,7 +6813,6 @@
"subtaskButton": "Subtarea", "subtaskButton": "Subtarea",
"thinkingDefault": "Predeterminado ({{level}})", "thinkingDefault": "Predeterminado ({{level}})",
"thinkingHigh": "Alto", "thinkingHigh": "Alto",
"thinkingXhigh": "Muy alto",
"thinkingLabel": "Pensamiento", "thinkingLabel": "Pensamiento",
"thinkingLow": "Bajo", "thinkingLow": "Bajo",
"thinkingMedium": "Medio", "thinkingMedium": "Medio",
@@ -6971,6 +7073,7 @@
"workflowCheck": "Verificación de flujo de trabajo" "workflowCheck": "Verificación de flujo de trabajo"
}, },
"terminal": { "terminal": {
"arrowKeysLabel": "",
"clear": "Limpiar", "clear": "Limpiar",
"clearTerminal": "Limpiar terminal", "clearTerminal": "Limpiar terminal",
"closeTab": "Cerrar pestaña", "closeTab": "Cerrar pestaña",
@@ -7289,6 +7392,7 @@
"foreachSequential": "Secuencial", "foreachSequential": "Secuencial",
"foreachShared": "Árbol de trabajo compartido", "foreachShared": "Árbol de trabajo compartido",
"foreachWorktree": "Árbol de trabajo por paso", "foreachWorktree": "Árbol de trabajo por paso",
"gateBadge": "",
"gateBlocks": "Compuerta (bloquea)", "gateBlocks": "Compuerta (bloquea)",
"gateMode": "Modo de compuerta", "gateMode": "Modo de compuerta",
"insertTemplate": "Insertar plantilla {{name}}", "insertTemplate": "Insertar plantilla {{name}}",
@@ -7345,6 +7449,7 @@
"startEntryColumn": "", "startEntryColumn": "",
"startEntryColumnAuto": "", "startEntryColumnAuto": "",
"startNote": "", "startNote": "",
"stepBadge": "",
"stepExecuteLabel": "Ejecutar paso", "stepExecuteLabel": "Ejecutar paso",
"templateFilterLabel": "Filtrar plantillas", "templateFilterLabel": "Filtrar plantillas",
"templateFilterPlaceholder": "Filtrar plantillas", "templateFilterPlaceholder": "Filtrar plantillas",
@@ -7353,6 +7458,7 @@
"templatesFragments": "Fragmentos", "templatesFragments": "Fragmentos",
"templatesPluginSteps": "Pasos de plugin", "templatesPluginSteps": "Pasos de plugin",
"templatesSection": "Plantillas", "templatesSection": "Plantillas",
"timeoutMs": "",
"trivialGraphHint": "Este flujo de trabajo solo ejecuta inicio → fin. Añade pasos desde la paleta superior para construirlo." "trivialGraphHint": "Este flujo de trabajo solo ejecuta inicio → fin. Añade pasos desde la paleta superior para construirlo."
}, },
"workflows": { "workflows": {
@@ -7418,14 +7524,6 @@
"templateSectionBuiltin": "Flujos de trabajo integrados", "templateSectionBuiltin": "Flujos de trabajo integrados",
"templateSectionYours": "Tus flujos de trabajo" "templateSectionYours": "Tus flujos de trabajo"
}, },
"workflowSwitcher": {
"countsAria": "{{todoLabel}}: {{todo}}, {{inProgressLabel}}: {{inProgress}}, {{doneLabel}}: {{done}}",
"done": "Done",
"inProgress": "In Progress",
"label": "Workflow",
"todo": "Todo",
"triggerAria": "Select workflow. Current workflow: {{name}}"
},
"workflowSelector": { "workflowSelector": {
"switchActiveMessage": "", "switchActiveMessage": "",
"switchActiveTitle": "", "switchActiveTitle": "",
@@ -7485,6 +7583,14 @@
"widget": "", "widget": "",
"widgetDefault": "" "widgetDefault": ""
}, },
"workflowSwitcher": {
"countsAria": "{{todoLabel}}: {{todo}}, {{inProgressLabel}}: {{inProgress}}, {{doneLabel}}: {{done}}",
"done": "Done",
"inProgress": "In Progress",
"label": "Workflow",
"todo": "Todo",
"triggerAria": "Select workflow. Current workflow: {{name}}"
},
"workspace": { "workspace": {
"projectRoot": "Raíz del proyecto", "projectRoot": "Raíz del proyecto",
"selectWorkspace": "Seleccionar espacio de trabajo", "selectWorkspace": "Seleccionar espacio de trabajo",

View File

@@ -31,6 +31,12 @@
"update": "Mettre à jour", "update": "Mettre à jour",
"yes": "Oui" "yes": "Oui"
}, },
"activityFeed": {
"emptyHint": "",
"eventCount_one": "",
"eventCount_other": "",
"noRecentActivity": ""
},
"activityLog": { "activityLog": {
"activeFilters": "Filtres actifs :", "activeFilters": "Filtres actifs :",
"allEvents": "Tous les événements", "allEvents": "Tous les événements",
@@ -64,6 +70,7 @@
"noActivityRecorded": "Aucune activité enregistrée", "noActivityRecorded": "Aucune activité enregistrée",
"noMatchingActivity": "Aucune activité ne correspond aux filtres actuels", "noMatchingActivity": "Aucune activité ne correspond aux filtres actuels",
"notMerged": "Non fusionné", "notMerged": "Non fusionné",
"projectFilterBadge": "",
"refresh": "Actualiser", "refresh": "Actualiser",
"time": { "time": {
"daysAgo_one": "", "daysAgo_one": "",
@@ -74,7 +81,8 @@
"minutesAgo_one": "", "minutesAgo_one": "",
"minutesAgo_other": "" "minutesAgo_other": ""
}, },
"title": "Journal d'activité" "title": "Journal d'activité",
"typeFilterBadge": ""
}, },
"agentError": { "agentError": {
"copied": "Copié", "copied": "Copié",
@@ -354,6 +362,7 @@
"bundleTitle": "Bundle", "bundleTitle": "Bundle",
"cacheHitRatio": "Taux de cache", "cacheHitRatio": "Taux de cache",
"cacheReadTokens": "Lecture cache", "cacheReadTokens": "Lecture cache",
"cacheWindowSummary": "",
"cacheWriteTokens": "Écriture cache", "cacheWriteTokens": "Écriture cache",
"cancel": "Annuler", "cancel": "Annuler",
"cancelCustomInterval": "Annuler l'intervalle personnalisé", "cancelCustomInterval": "Annuler l'intervalle personnalisé",
@@ -361,6 +370,8 @@
"chainOfCommand": "Chaîne de commandement", "chainOfCommand": "Chaîne de commandement",
"change": "Modifier", "change": "Modifier",
"changeRole": "Cliquer pour changer le rôle", "changeRole": "Cliquer pour changer le rôle",
"charactersCount_one": "",
"charactersCount_other": "",
"chooseFile": "Choisir un fichier", "chooseFile": "Choisir un fichier",
"clearAgents": "Effacer les agents", "clearAgents": "Effacer les agents",
"clearSkills": "Effacer les compétences", "clearSkills": "Effacer les compétences",
@@ -408,6 +419,7 @@
"deleteTitle": "Supprimer l'agent", "deleteTitle": "Supprimer l'agent",
"deletionNotAvailable": "La suppression n'est pas disponible pendant l'exécution de l'agent.", "deletionNotAvailable": "La suppression n'est pas disponible pendant l'exécution de l'agent.",
"deletionPermanent": "Cela supprimera définitivement l'agent et toutes les données associées.", "deletionPermanent": "Cela supprimera définitivement l'agent et toutes les données associées.",
"detailLoadingLabel": "",
"details": "Détails", "details": "Détails",
"dialogAriaLabel": "Créer un nouvel agent", "dialogAriaLabel": "Créer un nouvel agent",
"dialogTitle": "Nouvel agent", "dialogTitle": "Nouvel agent",
@@ -452,6 +464,7 @@
"from": "De", "from": "De",
"generateHint": "Décrivez le rôle de votre agent et laissez l'IA générer une spécification", "generateHint": "Décrivez le rôle de votre agent et laissez l'IA générer une spécification",
"generateWithAI": "Générer avec l'IA", "generateWithAI": "Générer avec l'IA",
"generateWithAiLabel": "",
"generation": { "generation": {
"collapse": "Réduire", "collapse": "Réduire",
"expand": "Développer", "expand": "Développer",
@@ -536,9 +549,12 @@
"importingAgentsAndSkills": "Importation de {{agentCount}} agent{{agentPlural}} et {{skillCount}} compétence{{skillPlural}}...", "importingAgentsAndSkills": "Importation de {{agentCount}} agent{{agentPlural}} et {{skillCount}} compétence{{skillPlural}}...",
"importingSkills_one": "", "importingSkills_one": "",
"importingSkills_other": "", "importingSkills_other": "",
"importReportsTo": "",
"importSkills": "",
"inbox": "Boîte de réception", "inbox": "Boîte de réception",
"inheritingProjectDefault": "Héritant du défaut du projet", "inheritingProjectDefault": "Héritant du défaut du projet",
"inheritProjectDefault": "Hériter du défaut du projet", "inheritProjectDefault": "Hériter du défaut du projet",
"inlineInstructions": "",
"inlineMemoryFieldHint": "Cette mémoire est intégrée directement dans le contexte de l'agent.", "inlineMemoryFieldHint": "Cette mémoire est intégrée directement dans le contexte de l'agent.",
"inlineMemoryHint": "Mémoire courte injectée à chaque heartbeat.", "inlineMemoryHint": "Mémoire courte injectée à chaque heartbeat.",
"inlineMemoryLabel": "Mémoire inline", "inlineMemoryLabel": "Mémoire inline",
@@ -564,6 +580,8 @@
"intentPrompt": "Que voulez-vous que cet agent fasse?", "intentPrompt": "Que voulez-vous que cet agent fasse?",
"interval": "Intervalle", "interval": "Intervalle",
"interviewDraftApplied": "Brouillon d'entretien appliqué", "interviewDraftApplied": "Brouillon d'entretien appliqué",
"kTokens_one": "",
"kTokens_other": "",
"last24h": "Dernières 24h", "last24h": "Dernières 24h",
"last7d": "7 derniers jours", "last7d": "7 derniers jours",
"lastHeartbeat": "Dernière : {{time}}", "lastHeartbeat": "Dernière : {{time}}",
@@ -753,6 +771,7 @@
"output": "Sortie", "output": "Sortie",
"outputTokens": "Jetons de sortie", "outputTokens": "Jetons de sortie",
"overview": "Aperçu", "overview": "Aperçu",
"overviewLabel": "",
"parsing": "Analyse en cours…", "parsing": "Analyse en cours…",
"pause": "Pause", "pause": "Pause",
"pauseAction": "Mettre en pause", "pauseAction": "Mettre en pause",
@@ -1037,7 +1056,6 @@
"templateCompact": "Compact", "templateCompact": "Compact",
"templateDefault": "Défaut", "templateDefault": "Défaut",
"thinkingHigh": "Élevé", "thinkingHigh": "Élevé",
"thinkingXhigh": "Très élevé",
"thinkingLevel": "Niveau de réflexion", "thinkingLevel": "Niveau de réflexion",
"thinkingLow": "Faible", "thinkingLow": "Faible",
"thinkingMedium": "Moyen", "thinkingMedium": "Moyen",
@@ -1045,6 +1063,7 @@
"thinkingOff": "Désactivé", "thinkingOff": "Désactivé",
"thinkingXhigh": "Très élevé", "thinkingXhigh": "Très élevé",
"throughput": "Débit", "throughput": "Débit",
"timeSinceLastHeartbeat": "",
"title": "Agents", "title": "Agents",
"titleLabel": "Titre", "titleLabel": "Titre",
"titlePlaceholder": "ex. Relecteur de code senior", "titlePlaceholder": "ex. Relecteur de code senior",
@@ -1091,6 +1110,7 @@
}, },
"testMode": "Mode test — pas d'appels IA réels" "testMode": "Mode test — pas d'appels IA réels"
}, },
"appName": "",
"approval": { "approval": {
"dismissBanner": "Ignorer la bannière de notification d'approbation", "dismissBanner": "Ignorer la bannière de notification d'approbation",
"needAttention_one": "", "needAttention_one": "",
@@ -1175,6 +1195,9 @@
"openPr": "Ouvrir PR", "openPr": "Ouvrir PR",
"unavailable": "Groupe de branches indisponible" "unavailable": "Groupe de branches indisponible"
}, },
"branchGroups": {
"prNumber": ""
},
"capacity": { "capacity": {
"dismiss": "Ignorer l'avertissement de capacité", "dismiss": "Ignorer l'avertissement de capacité",
"risk": "Risque de capacité :", "risk": "Risque de capacité :",
@@ -1322,9 +1345,13 @@
"thinking": "Réflexion", "thinking": "Réflexion",
"thinkingLabel": "Réflexion", "thinkingLabel": "Réflexion",
"thinkingStatus": "Réflexion en cours…", "thinkingStatus": "Réflexion en cours…",
"toolArgsLabel": "",
"toolArgsPreview": "",
"toolCalls": "Appels d'outils", "toolCalls": "Appels d'outils",
"toolCallsCount_one": "", "toolCallsCount_one": "",
"toolCallsCount_other": "", "toolCallsCount_other": "",
"toolResultLabel": "",
"toolResultPreview": "",
"typeMessage": "Tapez un message…", "typeMessage": "Tapez un message…",
"unreadMessages": "Messages non lus", "unreadMessages": "Messages non lus",
"untitledSession": "Sans titre", "untitledSession": "Sans titre",
@@ -1353,9 +1380,11 @@
"versionMismatchSuffix": "Mettez à jour pour rester synchronisé." "versionMismatchSuffix": "Mettez à jour pour rester synchronisé."
}, },
"cliBinary": { "cliBinary": {
"binaryLabel": "",
"checking": "Vérification…", "checking": "Vérification…",
"copied": "Copié", "copied": "Copié",
"copy": "Copier", "copy": "Copier",
"expectedVersion": "",
"failedExit": "Installation échouée (code de sortie {{code}})", "failedExit": "Installation échouée (code de sortie {{code}})",
"heading": "Binaire CLI", "heading": "Binaire CLI",
"help": "L'installation du CLI global vous permet d'exécuter fn et fusion depuis n'importe quel terminal. Les automatisations et les scripts fonctionnent sans cela via npx, mais une installation globale est plus rapide et plus pratique.", "help": "L'installation du CLI global vous permet d'exécuter fn et fusion depuis n'importe quel terminal. Les automatisations et les scripts fonctionnent sans cela via npx, mais une installation globale est plus rapide et plus pratique.",
@@ -1363,13 +1392,15 @@
"installWithNpm": "Installer avec npm", "installWithNpm": "Installer avec npm",
"notOnPath": "Ni fn ni fusion n'ont été trouvés sur PATH.", "notOnPath": "Ni fn ni fusion n'ont été trouvés sur PATH.",
"orCopyLabel": "Ou copiez et exécutez vous-même :", "orCopyLabel": "Ou copiez et exécutez vous-même :",
"pathLabel": "",
"refresh": "Actualiser", "refresh": "Actualiser",
"reinstall": "Réinstaller", "reinstall": "Réinstaller",
"stateCheckDisabled": "Vérification désactivée", "stateCheckDisabled": "Vérification désactivée",
"stateInstalled": "Installé", "stateInstalled": "Installé",
"stateMissing": "Non installé", "stateMissing": "Non installé",
"stateVersionMismatch": "Incohérence de version", "stateVersionMismatch": "Incohérence de version",
"succeededDuration": "Installation réussie en {{duration}} s" "succeededDuration": "Installation réussie en {{duration}} s",
"versionLabel": ""
}, },
"cliChat": { "cliChat": {
"queued_one": "", "queued_one": "",
@@ -1509,7 +1540,6 @@
"title": "" "title": ""
}, },
"orgChart": { "orgChart": {
"description": "",
"empty": "", "empty": "",
"error": "", "error": "",
"loading": "", "loading": "",
@@ -1637,17 +1667,24 @@
"uniqueModels": "" "uniqueModels": ""
}, },
"productivity": { "productivity": {
"averageDuration": "",
"byLanguage": "", "byLanguage": "",
"commits": "", "commits": "",
"completedTasks": "",
"durationTitle": "",
"durationUnavailable": "",
"hoursSaved": "", "hoursSaved": "",
"hoursSavedEstimate": "", "hoursSavedEstimate": "",
"hoursSavedUnavailable": "", "hoursSavedUnavailable": "",
"languagePie": "", "languagePie": "",
"loc": "", "loc": "",
"locUnavailable": "", "locUnavailable": "",
"medianDuration": "",
"modifiedFiles": "", "modifiedFiles": "",
"outcomesTitle": "", "outcomesTitle": "",
"p90Duration": "",
"pullRequests": "", "pullRequests": "",
"totalDuration": "",
"volumeHint": "", "volumeHint": "",
"volumeTitle": "" "volumeTitle": ""
}, },
@@ -1694,6 +1731,7 @@
"ecosystem": "", "ecosystem": "",
"github": "", "github": "",
"missionControl": "", "missionControl": "",
"nodes": "",
"overview": "", "overview": "",
"productivity": "", "productivity": "",
"reliability": "", "reliability": "",
@@ -1910,6 +1948,8 @@
"clear": "Effacer", "clear": "Effacer",
"command": "Commande", "command": "Commande",
"configuration": "Configuration", "configuration": "Configuration",
"configurationLabel": "",
"controlsHeaderLabel": "",
"embedded": "Intégré", "embedded": "Intégré",
"embeddedPreviewDisabled": "L'aperçu intégré est désactivé. Ouvrez votre application dans un onglet de navigateur séparé.", "embeddedPreviewDisabled": "L'aperçu intégré est désactivé. Ouvrez votre application dans un onglet de navigateur séparé.",
"enterFullscreen": "Passer en mode plein écran pour les journaux", "enterFullscreen": "Passer en mode plein écran pour les journaux",
@@ -1928,6 +1968,7 @@
"loadingOlderLogs": "Chargement des anciens journaux…", "loadingOlderLogs": "Chargement des anciens journaux…",
"loadOlderLogs": "Charger les anciens journaux", "loadOlderLogs": "Charger les anciens journaux",
"logs": "Journaux", "logs": "Journaux",
"logsLabel": "",
"lostConnection": "Connexion au flux de journaux perdue.", "lostConnection": "Connexion au flux de journaux perdue.",
"manual": "Manuel", "manual": "Manuel",
"matchCount_one": "", "matchCount_one": "",
@@ -1946,6 +1987,7 @@
"preview": "Aperçu", "preview": "Aperçu",
"previewBlocked": "Aperçu bloqué", "previewBlocked": "Aperçu bloqué",
"previewFailed": "Aperçu échoué", "previewFailed": "Aperçu échoué",
"previewLabel": "",
"previewUrlOverride": "Remplacer l'URL d'aperçu", "previewUrlOverride": "Remplacer l'URL d'aperçu",
"refreshPreview": "Actualiser l'aperçu", "refreshPreview": "Actualiser l'aperçu",
"restart": "Redémarrer", "restart": "Redémarrer",
@@ -2124,14 +2166,17 @@
"noTaskDocuments": "Aucun document de tâche pour le moment.", "noTaskDocuments": "Aucun document de tâche pour le moment.",
"openTask": "Ouvrir la tâche", "openTask": "Ouvrir la tâche",
"plain": "Brut", "plain": "Brut",
"projectFilePreviewLabel": "",
"projectFiles": "fichiers du projet", "projectFiles": "fichiers du projet",
"projectFilesTab": "Fichiers du projet", "projectFilesTab": "Fichiers du projet",
"projectMarkdownFilesLabel": "",
"resultCount_one": "", "resultCount_one": "",
"resultCount_other": "", "resultCount_other": "",
"retry": "Réessayer", "retry": "Réessayer",
"retryLoading": "Réessayer de charger les documents", "retryLoading": "Réessayer de charger les documents",
"searchProjectFiles": "Rechercher les fichiers markdown du projet…", "searchProjectFiles": "Rechercher les fichiers markdown du projet…",
"searchTaskDocuments": "Rechercher les documents des tâches…", "searchTaskDocuments": "Rechercher les documents des tâches…",
"sectionsLabel": "",
"selectFile": "Sélectionnez un fichier markdown pour voir son contenu.", "selectFile": "Sélectionnez un fichier markdown pour voir son contenu.",
"showHidden": "Afficher les fichiers projet cachés", "showHidden": "Afficher les fichiers projet cachés",
"showHiddenFiles": "Afficher les fichiers cachés", "showHiddenFiles": "Afficher les fichiers cachés",
@@ -2185,6 +2230,12 @@
"failedToLoadFile": "Échec du chargement du fichier", "failedToLoadFile": "Échec du chargement du fichier",
"failedToSaveFile": "Échec de l'enregistrement du fichier" "failedToSaveFile": "Échec de l'enregistrement du fichier"
}, },
"errorBoundary": {
"genericError": "",
"reloadPage": "",
"retry": "",
"sectionError": ""
},
"evals": { "evals": {
"allRuns": "Toutes les exécutions", "allRuns": "Toutes les exécutions",
"disabledTitle": "Les évaluations programmées sont désactivées", "disabledTitle": "Les évaluations programmées sont désactivées",
@@ -2223,6 +2274,8 @@
"overlapBottleneck_one": "", "overlapBottleneck_one": "",
"overlapBottleneck_other": "", "overlapBottleneck_other": "",
"overlapQueue": "File de chevauchement", "overlapQueue": "File de chevauchement",
"overlapSummary_one": "",
"overlapSummary_other": "",
"queued": "En attente", "queued": "En attente",
"running": "En cours", "running": "En cours",
"secondsAgo_one": "", "secondsAgo_one": "",
@@ -2233,7 +2286,8 @@
"stateRunning": "En cours d'exécution", "stateRunning": "En cours d'exécution",
"status": "État de l'exécuteur", "status": "État de l'exécuteur",
"stuck": "Bloqué", "stuck": "Bloqué",
"temporary": "Temporaire" "temporary": "Temporaire",
"todoStatus": ""
}, },
"fileBrowser": { "fileBrowser": {
"back": "Retour à la liste des fichiers", "back": "Retour à la liste des fichiers",
@@ -2640,6 +2694,7 @@
"stashDropped": "Remise supprimée", "stashDropped": "Remise supprimée",
"stashMessagePlaceholder": "Message de remise (facultatif)", "stashMessagePlaceholder": "Message de remise (facultatif)",
"stashPopped": "Remise dépilée", "stashPopped": "Remise dépilée",
"stashRef": "",
"statusLabelBranch": "Branche", "statusLabelBranch": "Branche",
"statusLabelCommit": "Commit", "statusLabelCommit": "Commit",
"statusLabelIntegrationBranch": "Branche d'intégration", "statusLabelIntegrationBranch": "Branche d'intégration",
@@ -2693,6 +2748,13 @@
"worktreesTotal_one": "", "worktreesTotal_one": "",
"worktreesTotal_other": "" "worktreesTotal_other": ""
}, },
"githubStarPrompt": {
"body": "",
"dismissLabel": "",
"regionLabel": "",
"starOnGitHub": "",
"title": ""
},
"goals": { "goals": {
"activeCount_one": "", "activeCount_one": "",
"activeCount_other": "", "activeCount_other": "",
@@ -2729,6 +2791,9 @@
"unlinkMissionError": "", "unlinkMissionError": "",
"updateError": "Impossible de mettre à jour le statut de l'objectif pour le moment. Veuillez réessayer." "updateError": "Impossible de mettre à jour le statut de l'objectif pour le moment. Veuillez réessayer."
}, },
"groups": {
"prLinkLabel": ""
},
"groupTask": { "groupTask": {
"abandonGroup": "", "abandonGroup": "",
"ariaLabel": "Détails du groupe de branches", "ariaLabel": "Détails du groupe de branches",
@@ -2767,6 +2832,7 @@
"documentsView": "Vue documents", "documentsView": "Vue documents",
"engineOptions": "Options du moteur", "engineOptions": "Options du moteur",
"evalsView": "Évaluations", "evalsView": "Évaluations",
"fusionLogo": "",
"gitManager": "Gestionnaire Git", "gitManager": "Gestionnaire Git",
"goalsView": "Objectifs", "goalsView": "Objectifs",
"importFromGitHub": "Importer depuis GitHub", "importFromGitHub": "Importer depuis GitHub",
@@ -2786,7 +2852,6 @@
"moreHeaderActions": "Plus d'actions dans l'en-tête", "moreHeaderActions": "Plus d'actions dans l'en-tête",
"moreViews": "Plus de vues", "moreViews": "Plus de vues",
"noBaseBranch": "Aucune branche de base", "noBaseBranch": "Aucune branche de base",
"nodes": "Nœuds",
"noScriptsAddOne": "Aucun script — en ajouter un…", "noScriptsAddOne": "Aucun script — en ajouter un…",
"noScriptsConfigured": "Aucun script configuré", "noScriptsConfigured": "Aucun script configuré",
"noWorkingBranch": "Aucune branche de travail", "noWorkingBranch": "Aucune branche de travail",
@@ -2927,6 +2992,7 @@
"archiveTitle": "Archiver cet insight", "archiveTitle": "Archiver cet insight",
"archiving": "Archivage de \"{{title}}\"...", "archiving": "Archivage de \"{{title}}\"...",
"backlogHealth": "Santé du backlog", "backlogHealth": "Santé du backlog",
"categoriesLabel": "",
"configureModel": "Configurer le modèle de génération d'insights", "configureModel": "Configurer le modèle de génération d'insights",
"configureModelTitle": "Configurer le modèle", "configureModelTitle": "Configurer le modèle",
"createTaskLabel": "Créer une tâche à partir de cet insight", "createTaskLabel": "Créer une tâche à partir de cet insight",
@@ -3017,6 +3083,9 @@
"verificationCriteria": "Critères de vérification", "verificationCriteria": "Critères de vérification",
"yes": "Oui" "yes": "Oui"
}, },
"issues": {
"noIssuesFound": ""
},
"lane": { "lane": {
"collapse": "", "collapse": "",
"expand": "" "expand": ""
@@ -3129,8 +3198,7 @@
"unpauseUnavailable": "L'action Reprendre est indisponible", "unpauseUnavailable": "L'action Reprendre est indisponible",
"useProjectDefault": "Utiliser le défaut du projet", "useProjectDefault": "Utiliser le défaut du projet",
"viewOptions": "Options d'affichage", "viewOptions": "Options d'affichage",
"workflowLabel": "", "workflowLabel": ""
"workflowSelectLabel": ""
}, },
"mailbox": { "mailbox": {
"agent": "Agent", "agent": "Agent",
@@ -3199,6 +3267,7 @@
"replyingTo": "Répondre à {{preview}}", "replyingTo": "Répondre à {{preview}}",
"replyingToMessage": "Répondre au message", "replyingToMessage": "Répondre au message",
"replyLoadFailed": "Échec du chargement du message de réponse. Cliquez pour réessayer.", "replyLoadFailed": "Échec du chargement du message de réponse. Cliquez pour réessayer.",
"resizeMessageListPane": "",
"selectMessageToRead": "Sélectionnez un message à lire", "selectMessageToRead": "Sélectionnez un message à lire",
"system": "Système", "system": "Système",
"timeDaysAgo_one": "", "timeDaysAgo_one": "",
@@ -3212,6 +3281,7 @@
"to": "À", "to": "À",
"toLabel": "À :", "toLabel": "À :",
"toPrefix": "À : {{recipient}}", "toPrefix": "À : {{recipient}}",
"toRecipient": "",
"typeAgentToAgent": "Agent ↔ Agent", "typeAgentToAgent": "Agent ↔ Agent",
"typeAgentToUser": "Agent → Vous", "typeAgentToUser": "Agent → Vous",
"typeSystem": "Système", "typeSystem": "Système",
@@ -3387,11 +3457,13 @@
"missions": { "missions": {
"acceptance": "Critères d'acceptation :", "acceptance": "Critères d'acceptation :",
"acceptanceCriteriaOptional": "Critères d'acceptation (facultatifs)", "acceptanceCriteriaOptional": "Critères d'acceptation (facultatifs)",
"acceptanceCriteriaPrefix": "",
"actionGenerating": "Génération…", "actionGenerating": "Génération…",
"actionResume": "Reprendre", "actionResume": "Reprendre",
"actionRetry": "Réessayer", "actionRetry": "Réessayer",
"actionReview": "Réviser", "actionReview": "Réviser",
"activateSlice": "Activer le découpage", "activateSlice": "Activer le découpage",
"activityCount": "",
"activityTime": "Activité {{time}}", "activityTime": "Activité {{time}}",
"actual": "Réel : {{value}}", "actual": "Réel : {{value}}",
"addAssertion": "Ajouter une assertion", "addAssertion": "Ajouter une assertion",
@@ -3518,6 +3590,7 @@
"filterSlices": "Événements de découpage et jalon", "filterSlices": "Événements de découpage et jalon",
"filterStateChanges": "Changements d'état", "filterStateChanges": "Changements d'état",
"filterTasks": "Événements de tâche", "filterTasks": "Événements de tâche",
"fixLineageButton": "",
"generatedFixFeatures": "Fonctionnalités de correction générées :", "generatedFixFeatures": "Fonctionnalités de correction générées :",
"generatedFixFeaturesTitle": "Fonctionnalités de correction générées", "generatedFixFeaturesTitle": "Fonctionnalités de correction générées",
"generatedFromFeature": "Généré depuis la fonctionnalité : {{id}}", "generatedFromFeature": "Généré depuis la fonctionnalité : {{id}}",
@@ -3545,6 +3618,8 @@
"linkButton": "Lier", "linkButton": "Lier",
"linkedCount_one": "", "linkedCount_one": "",
"linkedCount_other": "", "linkedCount_other": "",
"linkedCountShort_one": "",
"linkedCountShort_other": "",
"linkedFeaturesCount_one": "", "linkedFeaturesCount_one": "",
"linkedFeaturesCount_other": "", "linkedFeaturesCount_other": "",
"linkedFeaturesLabel": "Fonctionnalités liées", "linkedFeaturesLabel": "Fonctionnalités liées",
@@ -3605,6 +3680,7 @@
"planStateNeedsUpdate": "Nécessite une mise à jour", "planStateNeedsUpdate": "Nécessite une mise à jour",
"planStateNotPlanned": "Non planifié", "planStateNotPlanned": "Non planifié",
"planStatePlanned": "Planifié", "planStatePlanned": "Planifié",
"planTargetTitle": "",
"planTitle": "Planifier une mission avec l'IA", "planTitle": "Planifier une mission avec l'IA",
"prepareQuestion": "Préparation de la prochaine question...", "prepareQuestion": "Préparation de la prochaine question...",
"progressText_one": "", "progressText_one": "",
@@ -3711,6 +3787,7 @@
"updateButton": "Mettre à jour", "updateButton": "Mettre à jour",
"updated": "Mission mise à jour", "updated": "Mission mise à jour",
"validateFeature": "Valider la fonctionnalité", "validateFeature": "Valider la fonctionnalité",
"validationRoundAttempts": "",
"validationRoundsCount_one": "", "validationRoundsCount_one": "",
"validationRoundsCount_other": "", "validationRoundsCount_other": "",
"validationRoundsLabel_one": "", "validationRoundsLabel_one": "",
@@ -3775,7 +3852,6 @@
"options": { "options": {
"default": "Défaut", "default": "Défaut",
"high": "Élevé", "high": "Élevé",
"xhigh": "Très élevé",
"low": "Faible", "low": "Faible",
"medium": "Moyen", "medium": "Moyen",
"minimal": "Minimal", "minimal": "Minimal",
@@ -3827,10 +3903,12 @@
"board": "Tableau", "board": "Tableau",
"chat": "Chat", "chat": "Chat",
"chatUnreadAriaLabel": "Réponse non lue", "chatUnreadAriaLabel": "Réponse non lue",
"collapseSidebar": "",
"commandCenter": "", "commandCenter": "",
"devServer": "Serveur de dev", "devServer": "Serveur de dev",
"documents": "Documents", "documents": "Documents",
"evals": "Évaluations", "evals": "Évaluations",
"expandSidebar": "",
"files": "Fichiers", "files": "Fichiers",
"gitManager": "Gestionnaire Git", "gitManager": "Gestionnaire Git",
"goals": "Objectifs", "goals": "Objectifs",
@@ -3845,16 +3923,17 @@
"missions": "Missions", "missions": "Missions",
"more": "Plus", "more": "Plus",
"moreSheetTitle": "Naviguer", "moreSheetTitle": "Naviguer",
"nodes": "Nœuds",
"noScriptsAddOne": "Aucun script — en ajouter un…", "noScriptsAddOne": "Aucun script — en ajouter un…",
"planning": "Planification", "planning": "Planification",
"primaryNavAriaLabel": "Navigation principale", "primaryNavAriaLabel": "Navigation principale",
"projects": "Projets", "projects": "Projets",
"research": "Recherche", "research": "Recherche",
"resizeSidebar": "",
"scriptsSubmenuAriaLabel": "Sous-menu des scripts", "scriptsSubmenuAriaLabel": "Sous-menu des scripts",
"secrets": "Secrets", "secrets": "Secrets",
"settings": "Paramètres", "settings": "Paramètres",
"showScriptsAriaLabel": "Afficher les scripts", "showScriptsAriaLabel": "Afficher les scripts",
"sidebarAriaLabel": "",
"skills": "Compétences", "skills": "Compétences",
"stashRecovery": "Récupération de stash", "stashRecovery": "Récupération de stash",
"tasks": "Tâches", "tasks": "Tâches",
@@ -3960,12 +4039,14 @@
"discoverBeforeAdding": "Découvrez les projets distants avant d'ajouter ce nœud.", "discoverBeforeAdding": "Découvrez les projets distants avant d'ajouter ce nœud.",
"discoveredCount_one": "", "discoveredCount_one": "",
"discoveredCount_other": "", "discoveredCount_other": "",
"discoveredRemoteProjectsLabel": "",
"discovering": "Découverte...", "discovering": "Découverte...",
"discoverRemoteProjects": "Découvrir les projets distants", "discoverRemoteProjects": "Découvrir les projets distants",
"discoveryFailed": "Échec de la découverte des projets distants", "discoveryFailed": "Échec de la découverte des projets distants",
"dismissError": "Ignorer l'erreur", "dismissError": "Ignorer l'erreur",
"docker": "Docker", "docker": "Docker",
"dockerBadge": "Nœud Docker géré", "dockerBadge": "Nœud Docker géré",
"dockerConfigMeta": "",
"dockerConfigSaveFailed": "Échec de l'enregistrement de la config Docker", "dockerConfigSaveFailed": "Échec de l'enregistrement de la config Docker",
"dockerConfigSaveSuccess": "Configuration Docker enregistrée", "dockerConfigSaveSuccess": "Configuration Docker enregistrée",
"dockerConfiguration": "Configuration Docker", "dockerConfiguration": "Configuration Docker",
@@ -4083,6 +4164,7 @@
"name": "Serveur de construction", "name": "Serveur de construction",
"optional": "Optionnel" "optional": "Optionnel"
}, },
"projectPathMappingsLabel": "",
"provideManually": "Fournir manuellement la clé", "provideManually": "Fournir manuellement la clé",
"pulling": "Récupération…", "pulling": "Récupération…",
"pullSettings": "Récupérer les paramètres", "pullSettings": "Récupérer les paramètres",
@@ -4281,6 +4363,9 @@
"testFailed": "Le test a échoué — voir le statut ci-dessus.", "testFailed": "Le test a échoué — voir le statut ci-dessus.",
"unreachable": "{{reason}}" "unreachable": "{{reason}}"
}, },
"piExtensions": {
"filterHint": ""
},
"piManager": { "piManager": {
"addButton": "Ajouter", "addButton": "Ajouter",
"discoveredDescription": "Extensions installées résolues à partir de paquets et de chemins configurés.", "discoveredDescription": "Extensions installées résolues à partir de paquets et de chemins configurés.",
@@ -4884,6 +4969,7 @@
"createTask": "Créer une tâche", "createTask": "Créer une tâche",
"createTaskButton": "Créer une tâche", "createTaskButton": "Créer une tâche",
"createTaskTitle": "Créer une tâche à partir du résultat", "createTaskTitle": "Créer une tâche à partir du résultat",
"currentDefaults": "",
"defaultFindingHeading": "Résultat de recherche", "defaultFindingHeading": "Résultat de recherche",
"descriptionLabel": "Description", "descriptionLabel": "Description",
"disabled": "La recherche est désactivée pour ce projet.", "disabled": "La recherche est désactivée pour ce projet.",
@@ -4906,6 +4992,7 @@
"noRunsYet": "Aucune exécution pour l'instant", "noRunsYet": "Aucune exécution pour l'instant",
"noSourcesAvailable": "Aucune source de recherche activée n'est disponible pour ce projet.", "noSourcesAvailable": "Aucune source de recherche activée n'est disponible pour ce projet.",
"noSummaryYet": "Pas de résumé pour l'instant.", "noSummaryYet": "Pas de résumé pour l'instant.",
"notSet": "",
"openAuthSettings": "Ouvrir les paramètres d'authentification", "openAuthSettings": "Ouvrir les paramètres d'authentification",
"openResearchSettings": "Ouvrir les paramètres de recherche", "openResearchSettings": "Ouvrir les paramètres de recherche",
"priorityHigh": "Élevé", "priorityHigh": "Élevé",
@@ -4966,6 +5053,7 @@
"intro": "Affichez le nœud d'exécution effectif et contrôlez la substitution de nœud par tâche.", "intro": "Affichez le nœud d'exécution effectif et contrôlez la substitution de nœud par tâche.",
"localNoConfiguration": "Local (pas de routage configuré)", "localNoConfiguration": "Local (pas de routage configuré)",
"lockedWhileActive": "Le routage est verrouillé pendant que cette tâche est active. La substitution du nœud ne peut pas être modifiée tant que la tâche reste active.", "lockedWhileActive": "Le routage est verrouillé pendant que cette tâche est active. La substitution du nœud ne peut pas être modifiée tant que la tâche reste active.",
"nodeOptionLabel": "",
"nodeUnavailable": "nœud indisponible ou inconnu", "nodeUnavailable": "nœud indisponible ou inconnu",
"overrideCleared": "Substitution du nœud effacée", "overrideCleared": "Substitution du nœud effacée",
"overrideSection": "Substitution du nœud", "overrideSection": "Substitution du nœud",
@@ -4983,6 +5071,9 @@
"unhealthy": "Défaillant", "unhealthy": "Défaillant",
"useProjectDefault": "Utiliser le défaut du projet" "useProjectDefault": "Utiliser le défaut du projet"
}, },
"runtimes": {
"nousResearchLogoAlt": ""
},
"schedule": { "schedule": {
"actionAiPrompt": "Invite IA", "actionAiPrompt": "Invite IA",
"actionCommand": "Commande", "actionCommand": "Commande",
@@ -5048,6 +5139,7 @@
"cronPresetMonthly": "Tous les mois (1er)", "cronPresetMonthly": "Tous les mois (1er)",
"cronPresetWeekly": "Toutes les semaines (lundi)", "cronPresetWeekly": "Toutes les semaines (lundi)",
"cronRequired": "L'expression cron est requise pour les calendriers personnalisés", "cronRequired": "L'expression cron est requise pour les calendriers personnalisés",
"crontabGuru": "",
"delete": "Supprimer", "delete": "Supprimer",
"deleteError": "Impossible de supprimer la routine", "deleteError": "Impossible de supprimer la routine",
"deleteMessage": "Supprimer l'horaire {{name}} ? Cette action ne peut pas être annulée.", "deleteMessage": "Supprimer l'horaire {{name}} ? Cette action ne peut pas être annulée.",
@@ -5102,6 +5194,7 @@
"globalScope": "Automatisations globales (au niveau de l'utilisateur)", "globalScope": "Automatisations globales (au niveau de l'utilisateur)",
"globalScoped": "Ce calendrier sera créé à portée mondiale.", "globalScoped": "Ce calendrier sera créé à portée mondiale.",
"globalScopeTitle": "Portée mondiale", "globalScopeTitle": "Portée mondiale",
"lastLabel": "",
"loadRoutinesError": "Impossible de charger les routines", "loadRoutinesError": "Impossible de charger les routines",
"manualTriggerInfo": "Cette routine sera déclenchée manuellement via le tableau de bord ou l'API.", "manualTriggerInfo": "Cette routine sera déclenchée manuellement via le tableau de bord ou l'API.",
"modeAriaLabel": "Mode d'exécution", "modeAriaLabel": "Mode d'exécution",
@@ -5124,6 +5217,7 @@
"newAutomation": "Nouvelle automatisation", "newAutomation": "Nouvelle automatisation",
"newRoutineHeading": "Nouvelle routine", "newRoutineHeading": "Nouvelle routine",
"newTitle": "Nouveau calendrier", "newTitle": "Nouveau calendrier",
"nextLabel": "",
"noActiveProject": "Aucun projet actif. Les calendriers seront créés à portée mondiale.", "noActiveProject": "Aucun projet actif. Les calendriers seront créés à portée mondiale.",
"noAutomations": "Pas encore d'automatisations", "noAutomations": "Pas encore d'automatisations",
"noStepsEmpty": "Aucune étape ajoutée pour l'instant. Ajoutez une commande ou une étape d'invite IA pour commencer.", "noStepsEmpty": "Aucune étape ajoutée pour l'instant. Ajoutez une commande ou une étape d'invite IA pour commencer.",
@@ -5154,6 +5248,7 @@
"runNameNow": "Exécuter {{name}} maintenant", "runNameNow": "Exécuter {{name}} maintenant",
"running": "Exécution…", "running": "Exécution…",
"runNow": "Exécuter maintenant", "runNow": "Exécuter maintenant",
"runsLabel": "",
"saveChanges": "Enregistrer les modifications", "saveChanges": "Enregistrer les modifications",
"saveStep": "Enregistrer l'étape", "saveStep": "Enregistrer l'étape",
"saving": "Enregistrement…", "saving": "Enregistrement…",
@@ -5233,6 +5328,9 @@
"webhookSecretLabel": "Secret webhook (facultatif)", "webhookSecretLabel": "Secret webhook (facultatif)",
"webhookSecretPlaceholder": "Facultatif — laisser vide pour les webhooks non authentifiés" "webhookSecretPlaceholder": "Facultatif — laisser vide pour les webhooks non authentifiés"
}, },
"scripts": {
"title": ""
},
"scriptsModal": { "scriptsModal": {
"addScript": "Ajouter un script", "addScript": "Ajouter un script",
"addScriptsHint": "Ajoutez des scripts pour exécuter rapidement les commandes courantes depuis le tableau de bord.", "addScriptsHint": "Ajoutez des scripts pour exécuter rapidement les commandes courantes depuis le tableau de bord.",
@@ -5660,6 +5758,7 @@
"enabling": "Activation…", "enabling": "Activation…",
"notConnected": "✗ Non connecté", "notConnected": "✗ Non connecté",
"probing": "Sonde CLI local…", "probing": "Sonde CLI local…",
"providerName": "",
"test": "Tester", "test": "Tester",
"testing": "Test en cours…" "testing": "Test en cours…"
}, },
@@ -5695,6 +5794,7 @@
"githubConnectionFailed": "La connexion a échoué ou expiré.", "githubConnectionFailed": "La connexion a échoué ou expiré.",
"githubOauthConnected": "GitHub OAuth est connecté. Vous pouvez importer des tickets et suivre les pull requests.", "githubOauthConnected": "GitHub OAuth est connecté. Vous pouvez importer des tickets et suivre les pull requests.",
"githubOauthNotConnected": "GitHub OAuth n'est pas encore connecté. Configurez-le dans Paramètres → Authentification, ou continuez maintenant et connectez-vous plus tard.", "githubOauthNotConnected": "GitHub OAuth n'est pas encore connecté. Configurez-le dans Paramètres → Authentification, ou continuez maintenant et connectez-vous plus tard.",
"githubProvider": "",
"githubSkipped": "GitHub a été ignoré. Vous pouvez vous connecter à tout moment depuis Paramètres → Authentification.", "githubSkipped": "GitHub a été ignoré. Vous pouvez vous connecter à tout moment depuis Paramètres → Authentification.",
"goBackToStep": "Retour à {{label}}", "goBackToStep": "Retour à {{label}}",
"goToDashboard": "Aller au tableau de bord", "goToDashboard": "Aller au tableau de bord",
@@ -5954,6 +6054,9 @@
"saving": "Enregistrement…", "saving": "Enregistrement…",
"view": "Afficher" "view": "Afficher"
}, },
"stash": {
"copyReference": ""
},
"stashRecovery": { "stashRecovery": {
"applied": "Appliqué", "applied": "Appliqué",
"apply": "Appliquer", "apply": "Appliquer",
@@ -6710,7 +6813,6 @@
"subtaskButton": "Sous-tâche", "subtaskButton": "Sous-tâche",
"thinkingDefault": "Défaut ({{level}})", "thinkingDefault": "Défaut ({{level}})",
"thinkingHigh": "Élevé", "thinkingHigh": "Élevé",
"thinkingXhigh": "Très élevé",
"thinkingLabel": "Réflexion", "thinkingLabel": "Réflexion",
"thinkingLow": "Faible", "thinkingLow": "Faible",
"thinkingMedium": "Moyen", "thinkingMedium": "Moyen",
@@ -6971,6 +7073,7 @@
"workflowCheck": "Vérification du workflow" "workflowCheck": "Vérification du workflow"
}, },
"terminal": { "terminal": {
"arrowKeysLabel": "",
"clear": "Effacer", "clear": "Effacer",
"clearTerminal": "Effacer le terminal", "clearTerminal": "Effacer le terminal",
"closeTab": "Fermer l'onglet", "closeTab": "Fermer l'onglet",
@@ -7289,6 +7392,7 @@
"foreachSequential": "Séquentiel", "foreachSequential": "Séquentiel",
"foreachShared": "Arbre de travail partagé", "foreachShared": "Arbre de travail partagé",
"foreachWorktree": "Arbre de travail par étape", "foreachWorktree": "Arbre de travail par étape",
"gateBadge": "",
"gateBlocks": "Barrière (bloque)", "gateBlocks": "Barrière (bloque)",
"gateMode": "Mode de barrière", "gateMode": "Mode de barrière",
"insertTemplate": "Insérer le modèle {{name}}", "insertTemplate": "Insérer le modèle {{name}}",
@@ -7345,6 +7449,7 @@
"startEntryColumn": "", "startEntryColumn": "",
"startEntryColumnAuto": "", "startEntryColumnAuto": "",
"startNote": "", "startNote": "",
"stepBadge": "",
"stepExecuteLabel": "Exécution de l'étape", "stepExecuteLabel": "Exécution de l'étape",
"templateFilterLabel": "Filtrer les modèles", "templateFilterLabel": "Filtrer les modèles",
"templateFilterPlaceholder": "Filtrer les modèles", "templateFilterPlaceholder": "Filtrer les modèles",
@@ -7353,6 +7458,7 @@
"templatesFragments": "Fragments", "templatesFragments": "Fragments",
"templatesPluginSteps": "Étapes de plugin", "templatesPluginSteps": "Étapes de plugin",
"templatesSection": "Modèles", "templatesSection": "Modèles",
"timeoutMs": "",
"trivialGraphHint": "Ce workflow ne fait qu'exécuter début → fin. Ajoutez des étapes depuis la palette ci-dessus pour le développer." "trivialGraphHint": "Ce workflow ne fait qu'exécuter début → fin. Ajoutez des étapes depuis la palette ci-dessus pour le développer."
}, },
"workflows": { "workflows": {
@@ -7418,14 +7524,6 @@
"templateSectionBuiltin": "Workflows intégrés", "templateSectionBuiltin": "Workflows intégrés",
"templateSectionYours": "Vos workflows" "templateSectionYours": "Vos workflows"
}, },
"workflowSwitcher": {
"countsAria": "{{todoLabel}}: {{todo}}, {{inProgressLabel}}: {{inProgress}}, {{doneLabel}}: {{done}}",
"done": "Done",
"inProgress": "In Progress",
"label": "Workflow",
"todo": "Todo",
"triggerAria": "Select workflow. Current workflow: {{name}}"
},
"workflowSelector": { "workflowSelector": {
"switchActiveMessage": "", "switchActiveMessage": "",
"switchActiveTitle": "", "switchActiveTitle": "",
@@ -7485,6 +7583,14 @@
"widget": "", "widget": "",
"widgetDefault": "" "widgetDefault": ""
}, },
"workflowSwitcher": {
"countsAria": "{{todoLabel}}: {{todo}}, {{inProgressLabel}}: {{inProgress}}, {{doneLabel}}: {{done}}",
"done": "Done",
"inProgress": "In Progress",
"label": "Workflow",
"todo": "Todo",
"triggerAria": "Select workflow. Current workflow: {{name}}"
},
"workspace": { "workspace": {
"projectRoot": "Racine du projet", "projectRoot": "Racine du projet",
"selectWorkspace": "Sélectionner l'espace de travail", "selectWorkspace": "Sélectionner l'espace de travail",

View File

@@ -31,6 +31,12 @@
"update": "업데이트", "update": "업데이트",
"yes": "예" "yes": "예"
}, },
"activityFeed": {
"emptyHint": "",
"eventCount_one": "",
"eventCount_other": "",
"noRecentActivity": ""
},
"activityLog": { "activityLog": {
"activeFilters": "활성 필터:", "activeFilters": "활성 필터:",
"allEvents": "모든 이벤트", "allEvents": "모든 이벤트",
@@ -64,6 +70,7 @@
"noActivityRecorded": "아직 기록된 활동이 없습니다", "noActivityRecorded": "아직 기록된 활동이 없습니다",
"noMatchingActivity": "현재 필터에 일치하는 활동이 없습니다", "noMatchingActivity": "현재 필터에 일치하는 활동이 없습니다",
"notMerged": "병합되지 않음", "notMerged": "병합되지 않음",
"projectFilterBadge": "",
"refresh": "새로고침", "refresh": "새로고침",
"time": { "time": {
"daysAgo_one": "", "daysAgo_one": "",
@@ -74,7 +81,8 @@
"minutesAgo_one": "", "minutesAgo_one": "",
"minutesAgo_other": "" "minutesAgo_other": ""
}, },
"title": "활동 로그" "title": "활동 로그",
"typeFilterBadge": ""
}, },
"agentError": { "agentError": {
"copied": "복사됨", "copied": "복사됨",
@@ -354,6 +362,7 @@
"bundleTitle": "번들", "bundleTitle": "번들",
"cacheHitRatio": "캐시 적중률", "cacheHitRatio": "캐시 적중률",
"cacheReadTokens": "캐시 읽기", "cacheReadTokens": "캐시 읽기",
"cacheWindowSummary": "",
"cacheWriteTokens": "캐시 쓰기", "cacheWriteTokens": "캐시 쓰기",
"cancel": "취소", "cancel": "취소",
"cancelCustomInterval": "사용자 정의 간격 취소", "cancelCustomInterval": "사용자 정의 간격 취소",
@@ -361,6 +370,8 @@
"chainOfCommand": "명령 체계", "chainOfCommand": "명령 체계",
"change": "변경", "change": "변경",
"changeRole": "클릭하여 역할 변경", "changeRole": "클릭하여 역할 변경",
"charactersCount_one": "",
"charactersCount_other": "",
"chooseFile": "파일 선택", "chooseFile": "파일 선택",
"clearAgents": "에이전트 초기화", "clearAgents": "에이전트 초기화",
"clearSkills": "스킬 초기화", "clearSkills": "스킬 초기화",
@@ -408,6 +419,7 @@
"deleteTitle": "에이전트 삭제", "deleteTitle": "에이전트 삭제",
"deletionNotAvailable": "에이전트가 실행 중일 때는 삭제할 수 없습니다.", "deletionNotAvailable": "에이전트가 실행 중일 때는 삭제할 수 없습니다.",
"deletionPermanent": "에이전트와 모든 관련 데이터가 영구적으로 삭제됩니다.", "deletionPermanent": "에이전트와 모든 관련 데이터가 영구적으로 삭제됩니다.",
"detailLoadingLabel": "",
"details": "세부 정보", "details": "세부 정보",
"dialogAriaLabel": "새 에이전트 만들기", "dialogAriaLabel": "새 에이전트 만들기",
"dialogTitle": "새 에이전트", "dialogTitle": "새 에이전트",
@@ -452,6 +464,7 @@
"from": "보낸 사람", "from": "보낸 사람",
"generateHint": "에이전트의 역할을 설명하면 AI가 사양을 생성합니다", "generateHint": "에이전트의 역할을 설명하면 AI가 사양을 생성합니다",
"generateWithAI": "AI로 생성", "generateWithAI": "AI로 생성",
"generateWithAiLabel": "",
"generation": { "generation": {
"collapse": "접기", "collapse": "접기",
"expand": "펼치기", "expand": "펼치기",
@@ -536,9 +549,12 @@
"importingAgentsAndSkills": "에이전트 {{agentCount}}개{{agentPlural}}와 스킬 {{skillCount}}개{{skillPlural}} 가져오는 중...", "importingAgentsAndSkills": "에이전트 {{agentCount}}개{{agentPlural}}와 스킬 {{skillCount}}개{{skillPlural}} 가져오는 중...",
"importingSkills_one": "", "importingSkills_one": "",
"importingSkills_other": "", "importingSkills_other": "",
"importReportsTo": "",
"importSkills": "",
"inbox": "받은 편지함", "inbox": "받은 편지함",
"inheritingProjectDefault": "프로젝트 기본값을 상속 중", "inheritingProjectDefault": "프로젝트 기본값을 상속 중",
"inheritProjectDefault": "프로젝트 기본값 상속", "inheritProjectDefault": "프로젝트 기본값 상속",
"inlineInstructions": "",
"inlineMemoryFieldHint": "이 메모리는 에이전트 컨텍스트에 직접 포함됩니다.", "inlineMemoryFieldHint": "이 메모리는 에이전트 컨텍스트에 직접 포함됩니다.",
"inlineMemoryHint": "매 하트비트마다 주입되는 단기 메모리입니다.", "inlineMemoryHint": "매 하트비트마다 주입되는 단기 메모리입니다.",
"inlineMemoryLabel": "인라인 메모리", "inlineMemoryLabel": "인라인 메모리",
@@ -564,6 +580,8 @@
"intentPrompt": "이 에이전트가 무엇을 수행하길 원하시나요?", "intentPrompt": "이 에이전트가 무엇을 수행하길 원하시나요?",
"interval": "간격", "interval": "간격",
"interviewDraftApplied": "인터뷰 초안이 적용되었습니다", "interviewDraftApplied": "인터뷰 초안이 적용되었습니다",
"kTokens_one": "",
"kTokens_other": "",
"last24h": "최근 24시간", "last24h": "최근 24시간",
"last7d": "최근 7일", "last7d": "최근 7일",
"lastHeartbeat": "마지막 하트비트", "lastHeartbeat": "마지막 하트비트",
@@ -753,6 +771,7 @@
"output": "출력", "output": "출력",
"outputTokens": "출력", "outputTokens": "출력",
"overview": "개요", "overview": "개요",
"overviewLabel": "",
"parsing": "파싱 중…", "parsing": "파싱 중…",
"pause": "일시정지", "pause": "일시정지",
"pauseAction": "일시정지", "pauseAction": "일시정지",
@@ -1037,7 +1056,6 @@
"templateCompact": "간결", "templateCompact": "간결",
"templateDefault": "기본", "templateDefault": "기본",
"thinkingHigh": "높음", "thinkingHigh": "높음",
"thinkingXhigh": "매우 높음",
"thinkingLevel": "사고 수준", "thinkingLevel": "사고 수준",
"thinkingLow": "낮음", "thinkingLow": "낮음",
"thinkingMedium": "보통", "thinkingMedium": "보통",
@@ -1045,6 +1063,7 @@
"thinkingOff": "끄기", "thinkingOff": "끄기",
"thinkingXhigh": "매우 높음", "thinkingXhigh": "매우 높음",
"throughput": "처리량", "throughput": "처리량",
"timeSinceLastHeartbeat": "",
"title": "에이전트", "title": "에이전트",
"titleLabel": "직함", "titleLabel": "직함",
"titlePlaceholder": "예) 시니어 엔지니어", "titlePlaceholder": "예) 시니어 엔지니어",
@@ -1091,6 +1110,7 @@
}, },
"testMode": "테스트 모드 — 실제 AI 호출 없음" "testMode": "테스트 모드 — 실제 AI 호출 없음"
}, },
"appName": "",
"approval": { "approval": {
"dismissBanner": "승인 알림 배너 닫기", "dismissBanner": "승인 알림 배너 닫기",
"needAttention_one": "", "needAttention_one": "",
@@ -1175,6 +1195,9 @@
"openPr": "PR 열기", "openPr": "PR 열기",
"unavailable": "브랜치 그룹을 사용할 수 없습니다" "unavailable": "브랜치 그룹을 사용할 수 없습니다"
}, },
"branchGroups": {
"prNumber": ""
},
"capacity": { "capacity": {
"dismiss": "용량 경고 닫기", "dismiss": "용량 경고 닫기",
"risk": "용량 위험:", "risk": "용량 위험:",
@@ -1322,9 +1345,13 @@
"thinking": "생각 중", "thinking": "생각 중",
"thinkingLabel": "생각 중", "thinkingLabel": "생각 중",
"thinkingStatus": "생각 중…", "thinkingStatus": "생각 중…",
"toolArgsLabel": "",
"toolArgsPreview": "",
"toolCalls": "도구 호출", "toolCalls": "도구 호출",
"toolCallsCount_one": "", "toolCallsCount_one": "",
"toolCallsCount_other": "", "toolCallsCount_other": "",
"toolResultLabel": "",
"toolResultPreview": "",
"typeMessage": "메시지를 입력하세요...", "typeMessage": "메시지를 입력하세요...",
"unreadMessages": "읽지 않은 메시지", "unreadMessages": "읽지 않은 메시지",
"untitledSession": "제목 없음", "untitledSession": "제목 없음",
@@ -1353,9 +1380,11 @@
"versionMismatchSuffix": "최신 버전으로 업데이트하여 동기화를 유지하세요." "versionMismatchSuffix": "최신 버전으로 업데이트하여 동기화를 유지하세요."
}, },
"cliBinary": { "cliBinary": {
"binaryLabel": "",
"checking": "확인 중…", "checking": "확인 중…",
"copied": "복사됨", "copied": "복사됨",
"copy": "복사", "copy": "복사",
"expectedVersion": "",
"failedExit": "설치 실패 (종료 코드: {{code}})", "failedExit": "설치 실패 (종료 코드: {{code}})",
"heading": "CLI 바이너리", "heading": "CLI 바이너리",
"help": "전역 CLI를 설치하면 어느 터미널에서나 fn 및 fusion을 실행할 수 있습니다. 자동화 및 스크립트는 npx로도 작동하지만, 전역 설치가 더 빠르고 편리합니다.", "help": "전역 CLI를 설치하면 어느 터미널에서나 fn 및 fusion을 실행할 수 있습니다. 자동화 및 스크립트는 npx로도 작동하지만, 전역 설치가 더 빠르고 편리합니다.",
@@ -1363,13 +1392,15 @@
"installWithNpm": "npm으로 설치", "installWithNpm": "npm으로 설치",
"notOnPath": "fn 또는 fusion이 PATH에서 발견되지 않았습니다.", "notOnPath": "fn 또는 fusion이 PATH에서 발견되지 않았습니다.",
"orCopyLabel": "또는 직접 복사하여 실행:", "orCopyLabel": "또는 직접 복사하여 실행:",
"pathLabel": "",
"refresh": "새로 고침", "refresh": "새로 고침",
"reinstall": "재설치", "reinstall": "재설치",
"stateCheckDisabled": "확인 비활성화됨", "stateCheckDisabled": "확인 비활성화됨",
"stateInstalled": "설치됨", "stateInstalled": "설치됨",
"stateMissing": "설치되지 않음", "stateMissing": "설치되지 않음",
"stateVersionMismatch": "버전 불일치", "stateVersionMismatch": "버전 불일치",
"succeededDuration": "{{duration}}초 만에 설치 완료" "succeededDuration": "{{duration}}초 만에 설치 완료",
"versionLabel": ""
}, },
"cliChat": { "cliChat": {
"queued_one": "", "queued_one": "",
@@ -1509,7 +1540,6 @@
"title": "" "title": ""
}, },
"orgChart": { "orgChart": {
"description": "",
"empty": "", "empty": "",
"error": "", "error": "",
"loading": "", "loading": "",
@@ -1637,17 +1667,24 @@
"uniqueModels": "" "uniqueModels": ""
}, },
"productivity": { "productivity": {
"averageDuration": "",
"byLanguage": "", "byLanguage": "",
"commits": "", "commits": "",
"completedTasks": "",
"durationTitle": "",
"durationUnavailable": "",
"hoursSaved": "", "hoursSaved": "",
"hoursSavedEstimate": "", "hoursSavedEstimate": "",
"hoursSavedUnavailable": "", "hoursSavedUnavailable": "",
"languagePie": "", "languagePie": "",
"loc": "", "loc": "",
"locUnavailable": "", "locUnavailable": "",
"medianDuration": "",
"modifiedFiles": "", "modifiedFiles": "",
"outcomesTitle": "", "outcomesTitle": "",
"p90Duration": "",
"pullRequests": "", "pullRequests": "",
"totalDuration": "",
"volumeHint": "", "volumeHint": "",
"volumeTitle": "" "volumeTitle": ""
}, },
@@ -1694,6 +1731,7 @@
"ecosystem": "", "ecosystem": "",
"github": "", "github": "",
"missionControl": "", "missionControl": "",
"nodes": "",
"overview": "", "overview": "",
"productivity": "", "productivity": "",
"reliability": "", "reliability": "",
@@ -1910,6 +1948,8 @@
"clear": "지우기", "clear": "지우기",
"command": "명령", "command": "명령",
"configuration": "설정", "configuration": "설정",
"configurationLabel": "",
"controlsHeaderLabel": "",
"embedded": "임베드됨", "embedded": "임베드됨",
"embeddedPreviewDisabled": "임베드 미리 보기가 비활성화되어 있습니다. 별도의 브라우저 탭에서 앱을 여세요.", "embeddedPreviewDisabled": "임베드 미리 보기가 비활성화되어 있습니다. 별도의 브라우저 탭에서 앱을 여세요.",
"enterFullscreen": "전체 화면 로그 보기", "enterFullscreen": "전체 화면 로그 보기",
@@ -1928,6 +1968,7 @@
"loadingOlderLogs": "이전 로그 로드 중…", "loadingOlderLogs": "이전 로그 로드 중…",
"loadOlderLogs": "이전 로그 불러오기", "loadOlderLogs": "이전 로그 불러오기",
"logs": "로그", "logs": "로그",
"logsLabel": "",
"lostConnection": "로그 스트림 연결이 끊겼습니다.", "lostConnection": "로그 스트림 연결이 끊겼습니다.",
"manual": "수동", "manual": "수동",
"matchCount_one": "", "matchCount_one": "",
@@ -1946,6 +1987,7 @@
"preview": "미리 보기", "preview": "미리 보기",
"previewBlocked": "미리 보기 차단됨", "previewBlocked": "미리 보기 차단됨",
"previewFailed": "미리 보기 실패", "previewFailed": "미리 보기 실패",
"previewLabel": "",
"previewUrlOverride": "미리 보기 URL 재정의", "previewUrlOverride": "미리 보기 URL 재정의",
"refreshPreview": "미리 보기 새로 고침", "refreshPreview": "미리 보기 새로 고침",
"restart": "재시작", "restart": "재시작",
@@ -2124,14 +2166,17 @@
"noTaskDocuments": "아직 작업 문서가 없습니다.", "noTaskDocuments": "아직 작업 문서가 없습니다.",
"openTask": "작업 열기", "openTask": "작업 열기",
"plain": "일반 텍스트", "plain": "일반 텍스트",
"projectFilePreviewLabel": "",
"projectFiles": "프로젝트 파일", "projectFiles": "프로젝트 파일",
"projectFilesTab": "프로젝트 파일", "projectFilesTab": "프로젝트 파일",
"projectMarkdownFilesLabel": "",
"resultCount_one": "", "resultCount_one": "",
"resultCount_other": "", "resultCount_other": "",
"retry": "다시 시도", "retry": "다시 시도",
"retryLoading": "문서 다시 불러오기", "retryLoading": "문서 다시 불러오기",
"searchProjectFiles": "프로젝트 마크다운 파일 검색…", "searchProjectFiles": "프로젝트 마크다운 파일 검색…",
"searchTaskDocuments": "작업 문서 검색…", "searchTaskDocuments": "작업 문서 검색…",
"sectionsLabel": "",
"selectFile": "마크다운 파일을 선택하여 내용을 확인하세요.", "selectFile": "마크다운 파일을 선택하여 내용을 확인하세요.",
"showHidden": "숨겨진 프로젝트 파일 표시", "showHidden": "숨겨진 프로젝트 파일 표시",
"showHiddenFiles": "숨김 파일 표시", "showHiddenFiles": "숨김 파일 표시",
@@ -2185,6 +2230,12 @@
"failedToLoadFile": "파일 불러오기 실패", "failedToLoadFile": "파일 불러오기 실패",
"failedToSaveFile": "파일 저장 실패" "failedToSaveFile": "파일 저장 실패"
}, },
"errorBoundary": {
"genericError": "",
"reloadPage": "",
"retry": "",
"sectionError": ""
},
"evals": { "evals": {
"allRuns": "전체 실행", "allRuns": "전체 실행",
"disabledTitle": "예약 평가가 비활성화되어 있습니다", "disabledTitle": "예약 평가가 비활성화되어 있습니다",
@@ -2223,6 +2274,8 @@
"overlapBottleneck_one": "", "overlapBottleneck_one": "",
"overlapBottleneck_other": "", "overlapBottleneck_other": "",
"overlapQueue": "중복 대기열", "overlapQueue": "중복 대기열",
"overlapSummary_one": "",
"overlapSummary_other": "",
"queued": "대기 중", "queued": "대기 중",
"running": "실행 중", "running": "실행 중",
"secondsAgo_one": "", "secondsAgo_one": "",
@@ -2233,7 +2286,8 @@
"stateRunning": "실행 중", "stateRunning": "실행 중",
"status": "실행기 상태", "status": "실행기 상태",
"stuck": "중단됨", "stuck": "중단됨",
"temporary": "임시" "temporary": "임시",
"todoStatus": ""
}, },
"fileBrowser": { "fileBrowser": {
"back": "파일 목록으로 돌아가기", "back": "파일 목록으로 돌아가기",
@@ -2640,6 +2694,7 @@
"stashDropped": "스태시 삭제됨", "stashDropped": "스태시 삭제됨",
"stashMessagePlaceholder": "스태시 메시지 (선택 사항)", "stashMessagePlaceholder": "스태시 메시지 (선택 사항)",
"stashPopped": "스태시 팝됨", "stashPopped": "스태시 팝됨",
"stashRef": "",
"statusLabelBranch": "브랜치", "statusLabelBranch": "브랜치",
"statusLabelCommit": "커밋", "statusLabelCommit": "커밋",
"statusLabelIntegrationBranch": "통합 브랜치", "statusLabelIntegrationBranch": "통합 브랜치",
@@ -2693,6 +2748,13 @@
"worktreesTotal_one": "", "worktreesTotal_one": "",
"worktreesTotal_other": "" "worktreesTotal_other": ""
}, },
"githubStarPrompt": {
"body": "",
"dismissLabel": "",
"regionLabel": "",
"starOnGitHub": "",
"title": ""
},
"goals": { "goals": {
"activeCount_one": "", "activeCount_one": "",
"activeCount_other": "", "activeCount_other": "",
@@ -2729,6 +2791,9 @@
"unlinkMissionError": "", "unlinkMissionError": "",
"updateError": "현재 목표 상태를 업데이트할 수 없습니다. 다시 시도해 주세요." "updateError": "현재 목표 상태를 업데이트할 수 없습니다. 다시 시도해 주세요."
}, },
"groups": {
"prLinkLabel": ""
},
"groupTask": { "groupTask": {
"abandonGroup": "", "abandonGroup": "",
"ariaLabel": "브랜치 그룹 세부 정보", "ariaLabel": "브랜치 그룹 세부 정보",
@@ -2767,6 +2832,7 @@
"documentsView": "문서 보기", "documentsView": "문서 보기",
"engineOptions": "엔진 옵션", "engineOptions": "엔진 옵션",
"evalsView": "평가", "evalsView": "평가",
"fusionLogo": "",
"gitManager": "Git 관리자", "gitManager": "Git 관리자",
"goalsView": "목표", "goalsView": "목표",
"importFromGitHub": "GitHub에서 가져오기", "importFromGitHub": "GitHub에서 가져오기",
@@ -2786,7 +2852,6 @@
"moreHeaderActions": "추가 헤더 작업", "moreHeaderActions": "추가 헤더 작업",
"moreViews": "더 많은 보기", "moreViews": "더 많은 보기",
"noBaseBranch": "베이스 브랜치 없음", "noBaseBranch": "베이스 브랜치 없음",
"nodes": "노드",
"noScriptsAddOne": "스크립트 없음 — 추가하세요…", "noScriptsAddOne": "스크립트 없음 — 추가하세요…",
"noScriptsConfigured": "구성된 스크립트 없음", "noScriptsConfigured": "구성된 스크립트 없음",
"noWorkingBranch": "작업 브랜치 없음", "noWorkingBranch": "작업 브랜치 없음",
@@ -2927,6 +2992,7 @@
"archiveTitle": "이 인사이트 보관", "archiveTitle": "이 인사이트 보관",
"archiving": "\"{{title}}\" 보관 중...", "archiving": "\"{{title}}\" 보관 중...",
"backlogHealth": "백로그 상태", "backlogHealth": "백로그 상태",
"categoriesLabel": "",
"configureModel": "인사이트 생성 모델 구성", "configureModel": "인사이트 생성 모델 구성",
"configureModelTitle": "모델 구성", "configureModelTitle": "모델 구성",
"createTaskLabel": "이 인사이트에서 작업 생성", "createTaskLabel": "이 인사이트에서 작업 생성",
@@ -3017,6 +3083,9 @@
"verificationCriteria": "검증 기준", "verificationCriteria": "검증 기준",
"yes": "예" "yes": "예"
}, },
"issues": {
"noIssuesFound": ""
},
"lane": { "lane": {
"collapse": "", "collapse": "",
"expand": "" "expand": ""
@@ -3129,8 +3198,7 @@
"unpauseUnavailable": "재개 작업을 사용할 수 없습니다", "unpauseUnavailable": "재개 작업을 사용할 수 없습니다",
"useProjectDefault": "프로젝트 기본값 사용", "useProjectDefault": "프로젝트 기본값 사용",
"viewOptions": "보기 옵션", "viewOptions": "보기 옵션",
"workflowLabel": "", "workflowLabel": ""
"workflowSelectLabel": ""
}, },
"mailbox": { "mailbox": {
"agent": "에이전트", "agent": "에이전트",
@@ -3199,6 +3267,7 @@
"replyingTo": "답장 대상", "replyingTo": "답장 대상",
"replyingToMessage": "메시지에 답장 중", "replyingToMessage": "메시지에 답장 중",
"replyLoadFailed": "답장한 메시지를 불러오는 데 실패했습니다. 다시 시도하려면 클릭하세요.", "replyLoadFailed": "답장한 메시지를 불러오는 데 실패했습니다. 다시 시도하려면 클릭하세요.",
"resizeMessageListPane": "",
"selectMessageToRead": "읽을 메시지를 선택하세요", "selectMessageToRead": "읽을 메시지를 선택하세요",
"system": "시스템", "system": "시스템",
"timeDaysAgo_one": "", "timeDaysAgo_one": "",
@@ -3212,6 +3281,7 @@
"to": "받는 사람", "to": "받는 사람",
"toLabel": "받는 사람:", "toLabel": "받는 사람:",
"toPrefix": "받는 사람: {{recipient}}", "toPrefix": "받는 사람: {{recipient}}",
"toRecipient": "",
"typeAgentToAgent": "에이전트 ↔ 에이전트", "typeAgentToAgent": "에이전트 ↔ 에이전트",
"typeAgentToUser": "에이전트 → 나", "typeAgentToUser": "에이전트 → 나",
"typeSystem": "시스템", "typeSystem": "시스템",
@@ -3387,11 +3457,13 @@
"missions": { "missions": {
"acceptance": "수락 기준:", "acceptance": "수락 기준:",
"acceptanceCriteriaOptional": "수락 기준 (선택 사항)", "acceptanceCriteriaOptional": "수락 기준 (선택 사항)",
"acceptanceCriteriaPrefix": "",
"actionGenerating": "생성 중…", "actionGenerating": "생성 중…",
"actionResume": "재개", "actionResume": "재개",
"actionRetry": "재시도", "actionRetry": "재시도",
"actionReview": "검토", "actionReview": "검토",
"activateSlice": "슬라이스 활성화", "activateSlice": "슬라이스 활성화",
"activityCount": "",
"activityTime": "활동 {{time}}", "activityTime": "활동 {{time}}",
"actual": "실제: {{value}}", "actual": "실제: {{value}}",
"addAssertion": "어설션 추가", "addAssertion": "어설션 추가",
@@ -3518,6 +3590,7 @@
"filterSlices": "슬라이스 및 마일스톤 이벤트", "filterSlices": "슬라이스 및 마일스톤 이벤트",
"filterStateChanges": "상태 변경", "filterStateChanges": "상태 변경",
"filterTasks": "작업 이벤트", "filterTasks": "작업 이벤트",
"fixLineageButton": "",
"generatedFixFeatures": "생성된 수정 기능:", "generatedFixFeatures": "생성된 수정 기능:",
"generatedFixFeaturesTitle": "생성된 수정 기능", "generatedFixFeaturesTitle": "생성된 수정 기능",
"generatedFromFeature": "기능에서 생성됨: {{id}}", "generatedFromFeature": "기능에서 생성됨: {{id}}",
@@ -3545,6 +3618,8 @@
"linkButton": "연결", "linkButton": "연결",
"linkedCount_one": "", "linkedCount_one": "",
"linkedCount_other": "", "linkedCount_other": "",
"linkedCountShort_one": "",
"linkedCountShort_other": "",
"linkedFeaturesCount_one": "", "linkedFeaturesCount_one": "",
"linkedFeaturesCount_other": "", "linkedFeaturesCount_other": "",
"linkedFeaturesLabel": "연결된 기능", "linkedFeaturesLabel": "연결된 기능",
@@ -3605,6 +3680,7 @@
"planStateNeedsUpdate": "업데이트 필요", "planStateNeedsUpdate": "업데이트 필요",
"planStateNotPlanned": "계획되지 않음", "planStateNotPlanned": "계획되지 않음",
"planStatePlanned": "계획됨", "planStatePlanned": "계획됨",
"planTargetTitle": "",
"planTitle": "AI로 미션 계획", "planTitle": "AI로 미션 계획",
"prepareQuestion": "다음 질문 준비 중...", "prepareQuestion": "다음 질문 준비 중...",
"progressText_one": "", "progressText_one": "",
@@ -3711,6 +3787,7 @@
"updateButton": "업데이트", "updateButton": "업데이트",
"updated": "미션이 업데이트되었습니다", "updated": "미션이 업데이트되었습니다",
"validateFeature": "기능 검증", "validateFeature": "기능 검증",
"validationRoundAttempts": "",
"validationRoundsCount_one": "", "validationRoundsCount_one": "",
"validationRoundsCount_other": "", "validationRoundsCount_other": "",
"validationRoundsLabel_one": "", "validationRoundsLabel_one": "",
@@ -3775,7 +3852,6 @@
"options": { "options": {
"default": "기본값", "default": "기본값",
"high": "높음", "high": "높음",
"xhigh": "매우 높음",
"low": "낮음", "low": "낮음",
"medium": "중간", "medium": "중간",
"minimal": "최소", "minimal": "최소",
@@ -3827,10 +3903,12 @@
"board": "보드", "board": "보드",
"chat": "채팅", "chat": "채팅",
"chatUnreadAriaLabel": "읽지 않은 채팅 응답", "chatUnreadAriaLabel": "읽지 않은 채팅 응답",
"collapseSidebar": "",
"commandCenter": "", "commandCenter": "",
"devServer": "개발 서버", "devServer": "개발 서버",
"documents": "문서", "documents": "문서",
"evals": "평가", "evals": "평가",
"expandSidebar": "",
"files": "파일", "files": "파일",
"gitManager": "Git 관리자", "gitManager": "Git 관리자",
"goals": "목표", "goals": "목표",
@@ -3845,16 +3923,17 @@
"missions": "미션", "missions": "미션",
"more": "더 보기", "more": "더 보기",
"moreSheetTitle": "탐색", "moreSheetTitle": "탐색",
"nodes": "노드",
"noScriptsAddOne": "스크립트 없음 — 추가하세요…", "noScriptsAddOne": "스크립트 없음 — 추가하세요…",
"planning": "계획", "planning": "계획",
"primaryNavAriaLabel": "기본 탐색", "primaryNavAriaLabel": "기본 탐색",
"projects": "프로젝트", "projects": "프로젝트",
"research": "연구", "research": "연구",
"resizeSidebar": "",
"scriptsSubmenuAriaLabel": "스크립트 하위 메뉴", "scriptsSubmenuAriaLabel": "스크립트 하위 메뉴",
"secrets": "시크릿", "secrets": "시크릿",
"settings": "설정", "settings": "설정",
"showScriptsAriaLabel": "스크립트 표시", "showScriptsAriaLabel": "스크립트 표시",
"sidebarAriaLabel": "",
"skills": "스킬", "skills": "스킬",
"stashRecovery": "스태시 복구", "stashRecovery": "스태시 복구",
"tasks": "작업", "tasks": "작업",
@@ -3960,12 +4039,14 @@
"discoverBeforeAdding": "이 노드를 추가하기 전에 원격 프로젝트를 검색하세요.", "discoverBeforeAdding": "이 노드를 추가하기 전에 원격 프로젝트를 검색하세요.",
"discoveredCount_one": "", "discoveredCount_one": "",
"discoveredCount_other": "", "discoveredCount_other": "",
"discoveredRemoteProjectsLabel": "",
"discovering": "검색 중...", "discovering": "검색 중...",
"discoverRemoteProjects": "원격 프로젝트 검색", "discoverRemoteProjects": "원격 프로젝트 검색",
"discoveryFailed": "원격 프로젝트 검색에 실패했습니다", "discoveryFailed": "원격 프로젝트 검색에 실패했습니다",
"dismissError": "오류 닫기", "dismissError": "오류 닫기",
"docker": "Docker", "docker": "Docker",
"dockerBadge": "관리형 Docker 노드", "dockerBadge": "관리형 Docker 노드",
"dockerConfigMeta": "",
"dockerConfigSaveFailed": "Docker 구성 저장에 실패했습니다", "dockerConfigSaveFailed": "Docker 구성 저장에 실패했습니다",
"dockerConfigSaveSuccess": "Docker 구성이 저장되었습니다", "dockerConfigSaveSuccess": "Docker 구성이 저장되었습니다",
"dockerConfiguration": "Docker 구성", "dockerConfiguration": "Docker 구성",
@@ -4083,6 +4164,7 @@
"name": "빌드 서버", "name": "빌드 서버",
"optional": "선택 사항" "optional": "선택 사항"
}, },
"projectPathMappingsLabel": "",
"provideManually": "키를 직접 입력", "provideManually": "키를 직접 입력",
"pulling": "가져오는 중...", "pulling": "가져오는 중...",
"pullSettings": "설정 가져오기", "pullSettings": "설정 가져오기",
@@ -4281,6 +4363,9 @@
"testFailed": "테스트에 실패했습니다 — 위의 상태를 확인하세요.", "testFailed": "테스트에 실패했습니다 — 위의 상태를 확인하세요.",
"unreachable": "{{reason}}" "unreachable": "{{reason}}"
}, },
"piExtensions": {
"filterHint": ""
},
"piManager": { "piManager": {
"addButton": "추가", "addButton": "추가",
"discoveredDescription": "패키지 및 구성된 경로에서 확인된 설치된 확장 프로그램.", "discoveredDescription": "패키지 및 구성된 경로에서 확인된 설치된 확장 프로그램.",
@@ -4884,6 +4969,7 @@
"createTask": "작업 생성", "createTask": "작업 생성",
"createTaskButton": "작업 생성", "createTaskButton": "작업 생성",
"createTaskTitle": "발견 항목에서 작업 생성", "createTaskTitle": "발견 항목에서 작업 생성",
"currentDefaults": "",
"defaultFindingHeading": "리서치 발견 항목", "defaultFindingHeading": "리서치 발견 항목",
"descriptionLabel": "설명", "descriptionLabel": "설명",
"disabled": "이 프로젝트에서는 리서치가 비활성화되어 있습니다.", "disabled": "이 프로젝트에서는 리서치가 비활성화되어 있습니다.",
@@ -4906,6 +4992,7 @@
"noRunsYet": "아직 리서치 실행이 없습니다", "noRunsYet": "아직 리서치 실행이 없습니다",
"noSourcesAvailable": "이 프로젝트에 사용 가능한 활성화된 리서치 소스가 없습니다.", "noSourcesAvailable": "이 프로젝트에 사용 가능한 활성화된 리서치 소스가 없습니다.",
"noSummaryYet": "아직 요약이 없습니다.", "noSummaryYet": "아직 요약이 없습니다.",
"notSet": "",
"openAuthSettings": "인증 설정 열기", "openAuthSettings": "인증 설정 열기",
"openResearchSettings": "리서치 설정 열기", "openResearchSettings": "리서치 설정 열기",
"priorityHigh": "높음", "priorityHigh": "높음",
@@ -4966,6 +5053,7 @@
"intro": "유효 실행 노드를 확인하고 작업별 노드 재정의를 제어합니다.", "intro": "유효 실행 노드를 확인하고 작업별 노드 재정의를 제어합니다.",
"localNoConfiguration": "로컬 (라우팅 미구성)", "localNoConfiguration": "로컬 (라우팅 미구성)",
"lockedWhileActive": "이 작업이 활성화된 동안에는 라우팅이 잠겨 있습니다. 작업이 더 이상 활성 상태가 아닐 때까지 노드 재정의를 변경할 수 없습니다.", "lockedWhileActive": "이 작업이 활성화된 동안에는 라우팅이 잠겨 있습니다. 작업이 더 이상 활성 상태가 아닐 때까지 노드 재정의를 변경할 수 없습니다.",
"nodeOptionLabel": "",
"nodeUnavailable": "노드를 사용할 수 없거나 알 수 없음", "nodeUnavailable": "노드를 사용할 수 없거나 알 수 없음",
"overrideCleared": "노드 재정의가 초기화되었습니다", "overrideCleared": "노드 재정의가 초기화되었습니다",
"overrideSection": "노드 재정의", "overrideSection": "노드 재정의",
@@ -4983,6 +5071,9 @@
"unhealthy": "비정상", "unhealthy": "비정상",
"useProjectDefault": "프로젝트 기본값 사용" "useProjectDefault": "프로젝트 기본값 사용"
}, },
"runtimes": {
"nousResearchLogoAlt": ""
},
"schedule": { "schedule": {
"actionAiPrompt": "AI 프롬프트", "actionAiPrompt": "AI 프롬프트",
"actionCommand": "명령어", "actionCommand": "명령어",
@@ -5048,6 +5139,7 @@
"cronPresetMonthly": "매월 (1일)", "cronPresetMonthly": "매월 (1일)",
"cronPresetWeekly": "매주 (월요일)", "cronPresetWeekly": "매주 (월요일)",
"cronRequired": "사용자 지정 스케줄에는 cron 표현식이 필요합니다", "cronRequired": "사용자 지정 스케줄에는 cron 표현식이 필요합니다",
"crontabGuru": "",
"delete": "삭제", "delete": "삭제",
"deleteError": "루틴 삭제에 실패했습니다", "deleteError": "루틴 삭제에 실패했습니다",
"deleteMessage": "스케줄 {{name}}을(를) 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", "deleteMessage": "스케줄 {{name}}을(를) 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
@@ -5102,6 +5194,7 @@
"globalScope": "전체", "globalScope": "전체",
"globalScoped": "이 스케줄은 전체 범위에서 생성됩니다.", "globalScoped": "이 스케줄은 전체 범위에서 생성됩니다.",
"globalScopeTitle": "전체 범위", "globalScopeTitle": "전체 범위",
"lastLabel": "",
"loadRoutinesError": "루틴 불러오기 실패", "loadRoutinesError": "루틴 불러오기 실패",
"manualTriggerInfo": "이 루틴은 대시보드 또는 API를 통해 수동으로 트리거됩니다.", "manualTriggerInfo": "이 루틴은 대시보드 또는 API를 통해 수동으로 트리거됩니다.",
"modeAriaLabel": "실행 모드", "modeAriaLabel": "실행 모드",
@@ -5124,6 +5217,7 @@
"newAutomation": "새 자동화", "newAutomation": "새 자동화",
"newRoutineHeading": "새 루틴", "newRoutineHeading": "새 루틴",
"newTitle": "새 스케줄", "newTitle": "새 스케줄",
"nextLabel": "",
"noActiveProject": "활성 프로젝트 없음. 스케줄은 전체 범위에서 생성됩니다.", "noActiveProject": "활성 프로젝트 없음. 스케줄은 전체 범위에서 생성됩니다.",
"noAutomations": "아직 자동화가 없습니다", "noAutomations": "아직 자동화가 없습니다",
"noStepsEmpty": "추가된 단계가 없습니다. 명령어 또는 AI 프롬프트 단계를 추가하여 시작하세요.", "noStepsEmpty": "추가된 단계가 없습니다. 명령어 또는 AI 프롬프트 단계를 추가하여 시작하세요.",
@@ -5154,6 +5248,7 @@
"runNameNow": "{{name}} 지금 실행", "runNameNow": "{{name}} 지금 실행",
"running": "실행 중…", "running": "실행 중…",
"runNow": "지금 실행", "runNow": "지금 실행",
"runsLabel": "",
"saveChanges": "변경사항 저장", "saveChanges": "변경사항 저장",
"saveStep": "단계 저장", "saveStep": "단계 저장",
"saving": "저장 중…", "saving": "저장 중…",
@@ -5233,6 +5328,9 @@
"webhookSecretLabel": "Webhook 시크릿 (선택 사항)", "webhookSecretLabel": "Webhook 시크릿 (선택 사항)",
"webhookSecretPlaceholder": "선택 사항 — 미인증 웹훅은 비워두세요" "webhookSecretPlaceholder": "선택 사항 — 미인증 웹훅은 비워두세요"
}, },
"scripts": {
"title": ""
},
"scriptsModal": { "scriptsModal": {
"addScript": "스크립트 추가", "addScript": "스크립트 추가",
"addScriptsHint": "대시보드에서 자주 사용하는 명령어를 빠르게 실행할 스크립트를 추가하세요.", "addScriptsHint": "대시보드에서 자주 사용하는 명령어를 빠르게 실행할 스크립트를 추가하세요.",
@@ -5660,6 +5758,7 @@
"enabling": "활성화 중…", "enabling": "활성화 중…",
"notConnected": "✗ 연결되지 않음", "notConnected": "✗ 연결되지 않음",
"probing": "로컬 CLI를 확인하는 중…", "probing": "로컬 CLI를 확인하는 중…",
"providerName": "",
"test": "테스트", "test": "테스트",
"testing": "테스트 중…" "testing": "테스트 중…"
}, },
@@ -5695,6 +5794,7 @@
"githubConnectionFailed": "연결에 실패하거나 시간이 초과되었습니다.", "githubConnectionFailed": "연결에 실패하거나 시간이 초과되었습니다.",
"githubOauthConnected": "GitHub OAuth가 연결되었습니다. 이슈를 가져오고 풀 리퀘스트를 추적할 수 있습니다.", "githubOauthConnected": "GitHub OAuth가 연결되었습니다. 이슈를 가져오고 풀 리퀘스트를 추적할 수 있습니다.",
"githubOauthNotConnected": "GitHub OAuth가 아직 연결되지 않았습니다. 설정 → 인증에서 설정하거나, 지금 계속하고 나중에 연결할 수 있습니다.", "githubOauthNotConnected": "GitHub OAuth가 아직 연결되지 않았습니다. 설정 → 인증에서 설정하거나, 지금 계속하고 나중에 연결할 수 있습니다.",
"githubProvider": "",
"githubSkipped": "GitHub를 건너뛰었습니다. 설정 → 인증에서 언제든지 연결할 수 있습니다.", "githubSkipped": "GitHub를 건너뛰었습니다. 설정 → 인증에서 언제든지 연결할 수 있습니다.",
"goBackToStep": "{{label}}(으)로 돌아가기", "goBackToStep": "{{label}}(으)로 돌아가기",
"goToDashboard": "대시보드로 이동", "goToDashboard": "대시보드로 이동",
@@ -5954,6 +6054,9 @@
"saving": "저장 중…", "saving": "저장 중…",
"view": "보기" "view": "보기"
}, },
"stash": {
"copyReference": ""
},
"stashRecovery": { "stashRecovery": {
"applied": "적용됨", "applied": "적용됨",
"apply": "적용", "apply": "적용",
@@ -6710,7 +6813,6 @@
"subtaskButton": "하위 작업", "subtaskButton": "하위 작업",
"thinkingDefault": "기본값 ({{level}})", "thinkingDefault": "기본값 ({{level}})",
"thinkingHigh": "높음", "thinkingHigh": "높음",
"thinkingXhigh": "매우 높음",
"thinkingLabel": "사고", "thinkingLabel": "사고",
"thinkingLow": "낮음", "thinkingLow": "낮음",
"thinkingMedium": "중간", "thinkingMedium": "중간",
@@ -6971,6 +7073,7 @@
"workflowCheck": "워크플로우 확인" "workflowCheck": "워크플로우 확인"
}, },
"terminal": { "terminal": {
"arrowKeysLabel": "",
"clear": "지우기", "clear": "지우기",
"clearTerminal": "터미널 지우기", "clearTerminal": "터미널 지우기",
"closeTab": "탭 닫기", "closeTab": "탭 닫기",
@@ -7289,6 +7392,7 @@
"foreachSequential": "순차", "foreachSequential": "순차",
"foreachShared": "공유 워크트리", "foreachShared": "공유 워크트리",
"foreachWorktree": "단계별 워크트리", "foreachWorktree": "단계별 워크트리",
"gateBadge": "",
"gateBlocks": "게이트(차단)", "gateBlocks": "게이트(차단)",
"gateMode": "게이트 모드", "gateMode": "게이트 모드",
"insertTemplate": "{{name}} 템플릿 삽입", "insertTemplate": "{{name}} 템플릿 삽입",
@@ -7345,6 +7449,7 @@
"startEntryColumn": "", "startEntryColumn": "",
"startEntryColumnAuto": "", "startEntryColumnAuto": "",
"startNote": "", "startNote": "",
"stepBadge": "",
"stepExecuteLabel": "단계 실행", "stepExecuteLabel": "단계 실행",
"templateFilterLabel": "템플릿 필터", "templateFilterLabel": "템플릿 필터",
"templateFilterPlaceholder": "템플릿 필터", "templateFilterPlaceholder": "템플릿 필터",
@@ -7353,6 +7458,7 @@
"templatesFragments": "조각", "templatesFragments": "조각",
"templatesPluginSteps": "플러그인 단계", "templatesPluginSteps": "플러그인 단계",
"templatesSection": "템플릿", "templatesSection": "템플릿",
"timeoutMs": "",
"trivialGraphHint": "이 워크플로는 시작 → 끝만 실행합니다. 위 팔레트에서 단계를 추가하여 구성하세요." "trivialGraphHint": "이 워크플로는 시작 → 끝만 실행합니다. 위 팔레트에서 단계를 추가하여 구성하세요."
}, },
"workflows": { "workflows": {
@@ -7418,14 +7524,6 @@
"templateSectionBuiltin": "기본 제공 워크플로", "templateSectionBuiltin": "기본 제공 워크플로",
"templateSectionYours": "내 워크플로" "templateSectionYours": "내 워크플로"
}, },
"workflowSwitcher": {
"countsAria": "{{todoLabel}}: {{todo}}, {{inProgressLabel}}: {{inProgress}}, {{doneLabel}}: {{done}}",
"done": "Done",
"inProgress": "In Progress",
"label": "Workflow",
"todo": "Todo",
"triggerAria": "Select workflow. Current workflow: {{name}}"
},
"workflowSelector": { "workflowSelector": {
"switchActiveMessage": "", "switchActiveMessage": "",
"switchActiveTitle": "", "switchActiveTitle": "",
@@ -7485,6 +7583,14 @@
"widget": "", "widget": "",
"widgetDefault": "" "widgetDefault": ""
}, },
"workflowSwitcher": {
"countsAria": "{{todoLabel}}: {{todo}}, {{inProgressLabel}}: {{inProgress}}, {{doneLabel}}: {{done}}",
"done": "Done",
"inProgress": "In Progress",
"label": "Workflow",
"todo": "Todo",
"triggerAria": "Select workflow. Current workflow: {{name}}"
},
"workspace": { "workspace": {
"projectRoot": "프로젝트 루트", "projectRoot": "프로젝트 루트",
"selectWorkspace": "워크스페이스 선택", "selectWorkspace": "워크스페이스 선택",

View File

@@ -31,6 +31,12 @@
"update": "更新", "update": "更新",
"yes": "是" "yes": "是"
}, },
"activityFeed": {
"emptyHint": "",
"eventCount_one": "",
"eventCount_other": "",
"noRecentActivity": ""
},
"activityLog": { "activityLog": {
"activeFilters": "活跃过滤器:", "activeFilters": "活跃过滤器:",
"allEvents": "所有事件", "allEvents": "所有事件",
@@ -64,6 +70,7 @@
"noActivityRecorded": "尚未记录活动", "noActivityRecorded": "尚未记录活动",
"noMatchingActivity": "没有活动与当前过滤器匹配", "noMatchingActivity": "没有活动与当前过滤器匹配",
"notMerged": "未合并", "notMerged": "未合并",
"projectFilterBadge": "",
"refresh": "刷新", "refresh": "刷新",
"time": { "time": {
"daysAgo_one": "", "daysAgo_one": "",
@@ -74,7 +81,8 @@
"minutesAgo_one": "", "minutesAgo_one": "",
"minutesAgo_other": "" "minutesAgo_other": ""
}, },
"title": "活动日志" "title": "活动日志",
"typeFilterBadge": ""
}, },
"agentError": { "agentError": {
"copied": "已复制", "copied": "已复制",
@@ -354,6 +362,7 @@
"bundleTitle": "代码包", "bundleTitle": "代码包",
"cacheHitRatio": "缓存命中率", "cacheHitRatio": "缓存命中率",
"cacheReadTokens": "缓存读取", "cacheReadTokens": "缓存读取",
"cacheWindowSummary": "",
"cacheWriteTokens": "缓存写入", "cacheWriteTokens": "缓存写入",
"cancel": "取消", "cancel": "取消",
"cancelCustomInterval": "取消自定义间隔", "cancelCustomInterval": "取消自定义间隔",
@@ -361,6 +370,8 @@
"chainOfCommand": "指挥链", "chainOfCommand": "指挥链",
"change": "更改", "change": "更改",
"changeRole": "点击更改角色", "changeRole": "点击更改角色",
"charactersCount_one": "",
"charactersCount_other": "",
"chooseFile": "选择文件", "chooseFile": "选择文件",
"clearAgents": "清除代理", "clearAgents": "清除代理",
"clearSkills": "清除技能", "clearSkills": "清除技能",
@@ -408,6 +419,7 @@
"deleteTitle": "删除智能体", "deleteTitle": "删除智能体",
"deletionNotAvailable": "代理运行时无法删除。", "deletionNotAvailable": "代理运行时无法删除。",
"deletionPermanent": "这将永久删除代理及其所有相关数据。", "deletionPermanent": "这将永久删除代理及其所有相关数据。",
"detailLoadingLabel": "",
"details": "详情", "details": "详情",
"dialogAriaLabel": "创建新代理", "dialogAriaLabel": "创建新代理",
"dialogTitle": "新代理", "dialogTitle": "新代理",
@@ -452,6 +464,7 @@
"from": "来自", "from": "来自",
"generateHint": "描述代理的角色,让 AI 生成规格说明", "generateHint": "描述代理的角色,让 AI 生成规格说明",
"generateWithAI": "使用 AI 生成", "generateWithAI": "使用 AI 生成",
"generateWithAiLabel": "",
"generation": { "generation": {
"collapse": "折叠", "collapse": "折叠",
"expand": "展开", "expand": "展开",
@@ -536,9 +549,12 @@
"importingAgentsAndSkills": "正在导入 {{agentCount}} 个 Agent 和 {{skillCount}} 个技能...", "importingAgentsAndSkills": "正在导入 {{agentCount}} 个 Agent 和 {{skillCount}} 个技能...",
"importingSkills_one": "", "importingSkills_one": "",
"importingSkills_other": "", "importingSkills_other": "",
"importReportsTo": "",
"importSkills": "",
"inbox": "收件箱", "inbox": "收件箱",
"inheritingProjectDefault": "继承项目默认值", "inheritingProjectDefault": "继承项目默认值",
"inheritProjectDefault": "继承项目默认", "inheritProjectDefault": "继承项目默认",
"inlineInstructions": "",
"inlineMemoryFieldHint": "此记忆直接嵌入代理的上下文中。", "inlineMemoryFieldHint": "此记忆直接嵌入代理的上下文中。",
"inlineMemoryHint": "每次心跳时注入的简短记忆。", "inlineMemoryHint": "每次心跳时注入的简短记忆。",
"inlineMemoryLabel": "内联记忆", "inlineMemoryLabel": "内联记忆",
@@ -564,6 +580,8 @@
"intentPrompt": "您希望此代理执行什么操作?", "intentPrompt": "您希望此代理执行什么操作?",
"interval": "间隔", "interval": "间隔",
"interviewDraftApplied": "访谈草稿已应用", "interviewDraftApplied": "访谈草稿已应用",
"kTokens_one": "",
"kTokens_other": "",
"last24h": "最近 24 小时", "last24h": "最近 24 小时",
"last7d": "最近 7 天", "last7d": "最近 7 天",
"lastHeartbeat": "上次:{{time}}", "lastHeartbeat": "上次:{{time}}",
@@ -753,6 +771,7 @@
"output": "输出", "output": "输出",
"outputTokens": "输出令牌", "outputTokens": "输出令牌",
"overview": "概览", "overview": "概览",
"overviewLabel": "",
"parsing": "正在解析…", "parsing": "正在解析…",
"pause": "暂停", "pause": "暂停",
"pauseAction": "暂停", "pauseAction": "暂停",
@@ -1037,7 +1056,6 @@
"templateCompact": "紧凑", "templateCompact": "紧凑",
"templateDefault": "默认", "templateDefault": "默认",
"thinkingHigh": "高", "thinkingHigh": "高",
"thinkingXhigh": "极高",
"thinkingLevel": "思考级别", "thinkingLevel": "思考级别",
"thinkingLow": "低", "thinkingLow": "低",
"thinkingMedium": "中", "thinkingMedium": "中",
@@ -1045,6 +1063,7 @@
"thinkingOff": "关闭", "thinkingOff": "关闭",
"thinkingXhigh": "极高", "thinkingXhigh": "极高",
"throughput": "吞吐量", "throughput": "吞吐量",
"timeSinceLastHeartbeat": "",
"title": "智能体", "title": "智能体",
"titleLabel": "标题", "titleLabel": "标题",
"titlePlaceholder": "例如:高级代码审查员", "titlePlaceholder": "例如:高级代码审查员",
@@ -1091,6 +1110,7 @@
}, },
"testMode": "测试模式 — 无实际 AI 调用" "testMode": "测试模式 — 无实际 AI 调用"
}, },
"appName": "",
"approval": { "approval": {
"dismissBanner": "关闭审批通知横幅", "dismissBanner": "关闭审批通知横幅",
"needAttention_one": "", "needAttention_one": "",
@@ -1175,6 +1195,9 @@
"openPr": "打开 PR", "openPr": "打开 PR",
"unavailable": "分支组不可用" "unavailable": "分支组不可用"
}, },
"branchGroups": {
"prNumber": ""
},
"capacity": { "capacity": {
"dismiss": "关闭容量警告", "dismiss": "关闭容量警告",
"risk": "容量风险:", "risk": "容量风险:",
@@ -1322,9 +1345,13 @@
"thinking": "思考中", "thinking": "思考中",
"thinkingLabel": "思考", "thinkingLabel": "思考",
"thinkingStatus": "思考中……", "thinkingStatus": "思考中……",
"toolArgsLabel": "",
"toolArgsPreview": "",
"toolCalls": "工具调用", "toolCalls": "工具调用",
"toolCallsCount_one": "", "toolCallsCount_one": "",
"toolCallsCount_other": "", "toolCallsCount_other": "",
"toolResultLabel": "",
"toolResultPreview": "",
"typeMessage": "输入消息...", "typeMessage": "输入消息...",
"unreadMessages": "未读消息", "unreadMessages": "未读消息",
"untitledSession": "无标题", "untitledSession": "无标题",
@@ -1353,9 +1380,11 @@
"versionMismatchSuffix": "更新以保持同步。" "versionMismatchSuffix": "更新以保持同步。"
}, },
"cliBinary": { "cliBinary": {
"binaryLabel": "",
"checking": "检查中…", "checking": "检查中…",
"copied": "已复制", "copied": "已复制",
"copy": "复制", "copy": "复制",
"expectedVersion": "",
"failedExit": "安装失败(退出代码 {{code}})", "failedExit": "安装失败(退出代码 {{code}})",
"heading": "CLI 二进制文件", "heading": "CLI 二进制文件",
"help": "安装全局 CLI 可以让您从任何终端运行 fn 和 fusion。自动化和脚本可以通过 npx 工作而不需要它,但全局安装更快更方便。", "help": "安装全局 CLI 可以让您从任何终端运行 fn 和 fusion。自动化和脚本可以通过 npx 工作而不需要它,但全局安装更快更方便。",
@@ -1363,13 +1392,15 @@
"installWithNpm": "使用 npm 安装", "installWithNpm": "使用 npm 安装",
"notOnPath": "在 PATH 上未找到 fn 或 fusion。", "notOnPath": "在 PATH 上未找到 fn 或 fusion。",
"orCopyLabel": "或自行复制并运行:", "orCopyLabel": "或自行复制并运行:",
"pathLabel": "",
"refresh": "刷新", "refresh": "刷新",
"reinstall": "重新安装", "reinstall": "重新安装",
"stateCheckDisabled": "检查已禁用", "stateCheckDisabled": "检查已禁用",
"stateInstalled": "已安装", "stateInstalled": "已安装",
"stateMissing": "未安装", "stateMissing": "未安装",
"stateVersionMismatch": "版本不匹配", "stateVersionMismatch": "版本不匹配",
"succeededDuration": "安装成功,耗时 {{duration}} 秒" "succeededDuration": "安装成功,耗时 {{duration}} 秒",
"versionLabel": ""
}, },
"cliChat": { "cliChat": {
"queued_one": "", "queued_one": "",
@@ -1509,7 +1540,6 @@
"title": "" "title": ""
}, },
"orgChart": { "orgChart": {
"description": "",
"empty": "", "empty": "",
"error": "", "error": "",
"loading": "", "loading": "",
@@ -1637,17 +1667,24 @@
"uniqueModels": "" "uniqueModels": ""
}, },
"productivity": { "productivity": {
"averageDuration": "",
"byLanguage": "", "byLanguage": "",
"commits": "", "commits": "",
"completedTasks": "",
"durationTitle": "",
"durationUnavailable": "",
"hoursSaved": "", "hoursSaved": "",
"hoursSavedEstimate": "", "hoursSavedEstimate": "",
"hoursSavedUnavailable": "", "hoursSavedUnavailable": "",
"languagePie": "", "languagePie": "",
"loc": "", "loc": "",
"locUnavailable": "", "locUnavailable": "",
"medianDuration": "",
"modifiedFiles": "", "modifiedFiles": "",
"outcomesTitle": "", "outcomesTitle": "",
"p90Duration": "",
"pullRequests": "", "pullRequests": "",
"totalDuration": "",
"volumeHint": "", "volumeHint": "",
"volumeTitle": "" "volumeTitle": ""
}, },
@@ -1694,6 +1731,7 @@
"ecosystem": "", "ecosystem": "",
"github": "", "github": "",
"missionControl": "", "missionControl": "",
"nodes": "",
"overview": "", "overview": "",
"productivity": "", "productivity": "",
"reliability": "", "reliability": "",
@@ -1910,6 +1948,8 @@
"clear": "清除", "clear": "清除",
"command": "命令", "command": "命令",
"configuration": "配置", "configuration": "配置",
"configurationLabel": "",
"controlsHeaderLabel": "",
"embedded": "嵌入式", "embedded": "嵌入式",
"embeddedPreviewDisabled": "嵌入式预览已禁用。在单独的浏览器标签页中打开您的应用程序。", "embeddedPreviewDisabled": "嵌入式预览已禁用。在单独的浏览器标签页中打开您的应用程序。",
"enterFullscreen": "进入日志全屏", "enterFullscreen": "进入日志全屏",
@@ -1928,6 +1968,7 @@
"loadingOlderLogs": "加载较早的日志中…", "loadingOlderLogs": "加载较早的日志中…",
"loadOlderLogs": "加载较早的日志", "loadOlderLogs": "加载较早的日志",
"logs": "日志", "logs": "日志",
"logsLabel": "",
"lostConnection": "日志流连接已断开。", "lostConnection": "日志流连接已断开。",
"manual": "手动", "manual": "手动",
"matchCount_one": "", "matchCount_one": "",
@@ -1946,6 +1987,7 @@
"preview": "预览", "preview": "预览",
"previewBlocked": "预览被阻止", "previewBlocked": "预览被阻止",
"previewFailed": "预览失败", "previewFailed": "预览失败",
"previewLabel": "",
"previewUrlOverride": "预览URL覆盖", "previewUrlOverride": "预览URL覆盖",
"refreshPreview": "刷新预览", "refreshPreview": "刷新预览",
"restart": "重启", "restart": "重启",
@@ -2124,14 +2166,17 @@
"noTaskDocuments": "还没有任务文档。", "noTaskDocuments": "还没有任务文档。",
"openTask": "打开任务", "openTask": "打开任务",
"plain": "纯文本", "plain": "纯文本",
"projectFilePreviewLabel": "",
"projectFiles": "项目文件", "projectFiles": "项目文件",
"projectFilesTab": "项目文件", "projectFilesTab": "项目文件",
"projectMarkdownFilesLabel": "",
"resultCount_one": "", "resultCount_one": "",
"resultCount_other": "", "resultCount_other": "",
"retry": "重试", "retry": "重试",
"retryLoading": "重试加载文档", "retryLoading": "重试加载文档",
"searchProjectFiles": "搜索项目Markdown文件…", "searchProjectFiles": "搜索项目Markdown文件…",
"searchTaskDocuments": "搜索任务文档…", "searchTaskDocuments": "搜索任务文档…",
"sectionsLabel": "",
"selectFile": "选择Markdown文件以查看其内容。", "selectFile": "选择Markdown文件以查看其内容。",
"showHidden": "显示隐藏的项目文件", "showHidden": "显示隐藏的项目文件",
"showHiddenFiles": "显示隐藏文件", "showHiddenFiles": "显示隐藏文件",
@@ -2185,6 +2230,12 @@
"failedToLoadFile": "加载文件失败", "failedToLoadFile": "加载文件失败",
"failedToSaveFile": "保存文件失败" "failedToSaveFile": "保存文件失败"
}, },
"errorBoundary": {
"genericError": "",
"reloadPage": "",
"retry": "",
"sectionError": ""
},
"evals": { "evals": {
"allRuns": "所有运行", "allRuns": "所有运行",
"disabledTitle": "定时评估已禁用", "disabledTitle": "定时评估已禁用",
@@ -2223,6 +2274,8 @@
"overlapBottleneck_one": "", "overlapBottleneck_one": "",
"overlapBottleneck_other": "", "overlapBottleneck_other": "",
"overlapQueue": "重叠队列", "overlapQueue": "重叠队列",
"overlapSummary_one": "",
"overlapSummary_other": "",
"queued": "已排队", "queued": "已排队",
"running": "运行中", "running": "运行中",
"secondsAgo_one": "", "secondsAgo_one": "",
@@ -2233,7 +2286,8 @@
"stateRunning": "运行中", "stateRunning": "运行中",
"status": "执行器状态", "status": "执行器状态",
"stuck": "卡顿", "stuck": "卡顿",
"temporary": "临时" "temporary": "临时",
"todoStatus": ""
}, },
"fileBrowser": { "fileBrowser": {
"back": "返回文件列表", "back": "返回文件列表",
@@ -2640,6 +2694,7 @@
"stashDropped": "储藏已丢弃", "stashDropped": "储藏已丢弃",
"stashMessagePlaceholder": "储藏信息(可选)", "stashMessagePlaceholder": "储藏信息(可选)",
"stashPopped": "已弹出储藏", "stashPopped": "已弹出储藏",
"stashRef": "",
"statusLabelBranch": "分支", "statusLabelBranch": "分支",
"statusLabelCommit": "提交", "statusLabelCommit": "提交",
"statusLabelIntegrationBranch": "集成分支", "statusLabelIntegrationBranch": "集成分支",
@@ -2693,6 +2748,13 @@
"worktreesTotal_one": "", "worktreesTotal_one": "",
"worktreesTotal_other": "" "worktreesTotal_other": ""
}, },
"githubStarPrompt": {
"body": "",
"dismissLabel": "",
"regionLabel": "",
"starOnGitHub": "",
"title": ""
},
"goals": { "goals": {
"activeCount_one": "", "activeCount_one": "",
"activeCount_other": "", "activeCount_other": "",
@@ -2729,6 +2791,9 @@
"unlinkMissionError": "", "unlinkMissionError": "",
"updateError": "现在无法更新目标状态。请重试。" "updateError": "现在无法更新目标状态。请重试。"
}, },
"groups": {
"prLinkLabel": ""
},
"groupTask": { "groupTask": {
"abandonGroup": "", "abandonGroup": "",
"ariaLabel": "分支组详情", "ariaLabel": "分支组详情",
@@ -2767,6 +2832,7 @@
"documentsView": "文档视图", "documentsView": "文档视图",
"engineOptions": "引擎选项", "engineOptions": "引擎选项",
"evalsView": "评估", "evalsView": "评估",
"fusionLogo": "",
"gitManager": "Git 管理", "gitManager": "Git 管理",
"goalsView": "目标", "goalsView": "目标",
"importFromGitHub": "从 GitHub 导入", "importFromGitHub": "从 GitHub 导入",
@@ -2786,7 +2852,6 @@
"moreHeaderActions": "更多标题栏操作", "moreHeaderActions": "更多标题栏操作",
"moreViews": "更多视图", "moreViews": "更多视图",
"noBaseBranch": "无基础分支", "noBaseBranch": "无基础分支",
"nodes": "节点",
"noScriptsAddOne": "暂无脚本,添加一个…", "noScriptsAddOne": "暂无脚本,添加一个…",
"noScriptsConfigured": "未配置脚本", "noScriptsConfigured": "未配置脚本",
"noWorkingBranch": "无工作分支", "noWorkingBranch": "无工作分支",
@@ -2927,6 +2992,7 @@
"archiveTitle": "存档此洞察", "archiveTitle": "存档此洞察",
"archiving": "正在存档\"{{title}}\"...", "archiving": "正在存档\"{{title}}\"...",
"backlogHealth": "积压健康", "backlogHealth": "积压健康",
"categoriesLabel": "",
"configureModel": "配置洞察生成模型", "configureModel": "配置洞察生成模型",
"configureModelTitle": "配置模型", "configureModelTitle": "配置模型",
"createTaskLabel": "从此洞察创建任务", "createTaskLabel": "从此洞察创建任务",
@@ -3017,6 +3083,9 @@
"verificationCriteria": "验证标准", "verificationCriteria": "验证标准",
"yes": "是" "yes": "是"
}, },
"issues": {
"noIssuesFound": ""
},
"lane": { "lane": {
"collapse": "", "collapse": "",
"expand": "" "expand": ""
@@ -3129,8 +3198,7 @@
"unpauseUnavailable": "恢复操作不可用", "unpauseUnavailable": "恢复操作不可用",
"useProjectDefault": "使用项目默认", "useProjectDefault": "使用项目默认",
"viewOptions": "视图选项", "viewOptions": "视图选项",
"workflowLabel": "", "workflowLabel": ""
"workflowSelectLabel": ""
}, },
"mailbox": { "mailbox": {
"agent": "代理", "agent": "代理",
@@ -3199,6 +3267,7 @@
"replyingTo": "回复 {{preview}}", "replyingTo": "回复 {{preview}}",
"replyingToMessage": "回复消息", "replyingToMessage": "回复消息",
"replyLoadFailed": "加载回复消息失败。点击重试。", "replyLoadFailed": "加载回复消息失败。点击重试。",
"resizeMessageListPane": "",
"selectMessageToRead": "选择要阅读的消息", "selectMessageToRead": "选择要阅读的消息",
"system": "系统", "system": "系统",
"timeDaysAgo_one": "", "timeDaysAgo_one": "",
@@ -3212,6 +3281,7 @@
"to": "至", "to": "至",
"toLabel": "至:", "toLabel": "至:",
"toPrefix": "至:{{recipient}}", "toPrefix": "至:{{recipient}}",
"toRecipient": "",
"typeAgentToAgent": "代理 ↔ 代理", "typeAgentToAgent": "代理 ↔ 代理",
"typeAgentToUser": "代理 → 你", "typeAgentToUser": "代理 → 你",
"typeSystem": "系统", "typeSystem": "系统",
@@ -3387,11 +3457,13 @@
"missions": { "missions": {
"acceptance": "验收标准:", "acceptance": "验收标准:",
"acceptanceCriteriaOptional": "验收标准(可选)", "acceptanceCriteriaOptional": "验收标准(可选)",
"acceptanceCriteriaPrefix": "",
"actionGenerating": "生成中…", "actionGenerating": "生成中…",
"actionResume": "继续", "actionResume": "继续",
"actionRetry": "重试", "actionRetry": "重试",
"actionReview": "审核", "actionReview": "审核",
"activateSlice": "激活切片", "activateSlice": "激活切片",
"activityCount": "",
"activityTime": "活动 {{time}}", "activityTime": "活动 {{time}}",
"actual": "实际:{{value}}", "actual": "实际:{{value}}",
"addAssertion": "添加断言", "addAssertion": "添加断言",
@@ -3518,6 +3590,7 @@
"filterSlices": "切片和里程碑事件", "filterSlices": "切片和里程碑事件",
"filterStateChanges": "状态变更", "filterStateChanges": "状态变更",
"filterTasks": "任务事件", "filterTasks": "任务事件",
"fixLineageButton": "",
"generatedFixFeatures": "已生成修复功能:", "generatedFixFeatures": "已生成修复功能:",
"generatedFixFeaturesTitle": "已生成修复功能", "generatedFixFeaturesTitle": "已生成修复功能",
"generatedFromFeature": "从功能生成:{{id}}", "generatedFromFeature": "从功能生成:{{id}}",
@@ -3545,6 +3618,8 @@
"linkButton": "链接", "linkButton": "链接",
"linkedCount_one": "", "linkedCount_one": "",
"linkedCount_other": "", "linkedCount_other": "",
"linkedCountShort_one": "",
"linkedCountShort_other": "",
"linkedFeaturesCount_one": "", "linkedFeaturesCount_one": "",
"linkedFeaturesCount_other": "", "linkedFeaturesCount_other": "",
"linkedFeaturesLabel": "关联功能", "linkedFeaturesLabel": "关联功能",
@@ -3605,6 +3680,7 @@
"planStateNeedsUpdate": "需要更新", "planStateNeedsUpdate": "需要更新",
"planStateNotPlanned": "未规划", "planStateNotPlanned": "未规划",
"planStatePlanned": "已规划", "planStatePlanned": "已规划",
"planTargetTitle": "",
"planTitle": "用 AI 规划任务", "planTitle": "用 AI 规划任务",
"prepareQuestion": "准备下一个问题...", "prepareQuestion": "准备下一个问题...",
"progressText_one": "", "progressText_one": "",
@@ -3711,6 +3787,7 @@
"updateButton": "更新", "updateButton": "更新",
"updated": "任务已更新", "updated": "任务已更新",
"validateFeature": "验证功能", "validateFeature": "验证功能",
"validationRoundAttempts": "",
"validationRoundsCount_one": "", "validationRoundsCount_one": "",
"validationRoundsCount_other": "", "validationRoundsCount_other": "",
"validationRoundsLabel_one": "", "validationRoundsLabel_one": "",
@@ -3775,7 +3852,6 @@
"options": { "options": {
"default": "默认值", "default": "默认值",
"high": "高", "high": "高",
"xhigh": "极高",
"low": "低", "low": "低",
"medium": "中等", "medium": "中等",
"minimal": "最小", "minimal": "最小",
@@ -3827,10 +3903,12 @@
"board": "看板", "board": "看板",
"chat": "聊天", "chat": "聊天",
"chatUnreadAriaLabel": "未读聊天回复", "chatUnreadAriaLabel": "未读聊天回复",
"collapseSidebar": "",
"commandCenter": "", "commandCenter": "",
"devServer": "开发服务器", "devServer": "开发服务器",
"documents": "文档", "documents": "文档",
"evals": "评估", "evals": "评估",
"expandSidebar": "",
"files": "文件", "files": "文件",
"gitManager": "Git 管理器", "gitManager": "Git 管理器",
"goals": "目标", "goals": "目标",
@@ -3845,16 +3923,17 @@
"missions": "任务集", "missions": "任务集",
"more": "更多", "more": "更多",
"moreSheetTitle": "导航", "moreSheetTitle": "导航",
"nodes": "节点",
"noScriptsAddOne": "无脚本 — 添加一个…", "noScriptsAddOne": "无脚本 — 添加一个…",
"planning": "规划", "planning": "规划",
"primaryNavAriaLabel": "主导航", "primaryNavAriaLabel": "主导航",
"projects": "项目", "projects": "项目",
"research": "研究", "research": "研究",
"resizeSidebar": "",
"scriptsSubmenuAriaLabel": "脚本子菜单", "scriptsSubmenuAriaLabel": "脚本子菜单",
"secrets": "密钥", "secrets": "密钥",
"settings": "设置", "settings": "设置",
"showScriptsAriaLabel": "显示脚本", "showScriptsAriaLabel": "显示脚本",
"sidebarAriaLabel": "",
"skills": "技能", "skills": "技能",
"stashRecovery": "储藏恢复", "stashRecovery": "储藏恢复",
"tasks": "任务", "tasks": "任务",
@@ -3960,12 +4039,14 @@
"discoverBeforeAdding": "在添加此节点之前发现远程项目。", "discoverBeforeAdding": "在添加此节点之前发现远程项目。",
"discoveredCount_one": "", "discoveredCount_one": "",
"discoveredCount_other": "", "discoveredCount_other": "",
"discoveredRemoteProjectsLabel": "",
"discovering": "正在发现...", "discovering": "正在发现...",
"discoverRemoteProjects": "发现远程项目", "discoverRemoteProjects": "发现远程项目",
"discoveryFailed": "无法发现远程项目", "discoveryFailed": "无法发现远程项目",
"dismissError": "关闭错误", "dismissError": "关闭错误",
"docker": "Docker", "docker": "Docker",
"dockerBadge": "托管 Docker 节点", "dockerBadge": "托管 Docker 节点",
"dockerConfigMeta": "",
"dockerConfigSaveFailed": "保存 Docker 配置失败", "dockerConfigSaveFailed": "保存 Docker 配置失败",
"dockerConfigSaveSuccess": "Docker 配置已保存", "dockerConfigSaveSuccess": "Docker 配置已保存",
"dockerConfiguration": "Docker 配置", "dockerConfiguration": "Docker 配置",
@@ -4083,6 +4164,7 @@
"name": "构建服务器", "name": "构建服务器",
"optional": "可选" "optional": "可选"
}, },
"projectPathMappingsLabel": "",
"provideManually": "手动提供密钥", "provideManually": "手动提供密钥",
"pulling": "拉取中…", "pulling": "拉取中…",
"pullSettings": "拉取设置", "pullSettings": "拉取设置",
@@ -4281,6 +4363,9 @@
"testFailed": "测试失败——查看上面的状态。", "testFailed": "测试失败——查看上面的状态。",
"unreachable": "{{reason}}" "unreachable": "{{reason}}"
}, },
"piExtensions": {
"filterHint": ""
},
"piManager": { "piManager": {
"addButton": "添加", "addButton": "添加",
"discoveredDescription": "从包和配置的路径解析的已安装扩展。", "discoveredDescription": "从包和配置的路径解析的已安装扩展。",
@@ -4884,6 +4969,7 @@
"createTask": "创建任务", "createTask": "创建任务",
"createTaskButton": "创建任务", "createTaskButton": "创建任务",
"createTaskTitle": "从发现创建任务", "createTaskTitle": "从发现创建任务",
"currentDefaults": "",
"defaultFindingHeading": "研究发现", "defaultFindingHeading": "研究发现",
"descriptionLabel": "描述", "descriptionLabel": "描述",
"disabled": "此项目的研究功能已禁用。", "disabled": "此项目的研究功能已禁用。",
@@ -4906,6 +4992,7 @@
"noRunsYet": "尚无研究运行", "noRunsYet": "尚无研究运行",
"noSourcesAvailable": "此项目没有可用的已启用研究来源。", "noSourcesAvailable": "此项目没有可用的已启用研究来源。",
"noSummaryYet": "尚无总结。", "noSummaryYet": "尚无总结。",
"notSet": "",
"openAuthSettings": "打开身份验证设置", "openAuthSettings": "打开身份验证设置",
"openResearchSettings": "打开研究设置", "openResearchSettings": "打开研究设置",
"priorityHigh": "高", "priorityHigh": "高",
@@ -4966,6 +5053,7 @@
"intro": "查看有效执行节点并控制每个任务的节点覆盖。", "intro": "查看有效执行节点并控制每个任务的节点覆盖。",
"localNoConfiguration": "本地(未配置路由)", "localNoConfiguration": "本地(未配置路由)",
"lockedWhileActive": "此任务处于活动状态时路由被锁定。在任务不再活动之前,无法更改节点覆盖。", "lockedWhileActive": "此任务处于活动状态时路由被锁定。在任务不再活动之前,无法更改节点覆盖。",
"nodeOptionLabel": "",
"nodeUnavailable": "节点不可用或未知", "nodeUnavailable": "节点不可用或未知",
"overrideCleared": "节点覆盖已清除", "overrideCleared": "节点覆盖已清除",
"overrideSection": "节点覆盖", "overrideSection": "节点覆盖",
@@ -4983,6 +5071,9 @@
"unhealthy": "不健康", "unhealthy": "不健康",
"useProjectDefault": "使用项目默认值" "useProjectDefault": "使用项目默认值"
}, },
"runtimes": {
"nousResearchLogoAlt": ""
},
"schedule": { "schedule": {
"actionAiPrompt": "AI 提示", "actionAiPrompt": "AI 提示",
"actionCommand": "命令", "actionCommand": "命令",
@@ -5048,6 +5139,7 @@
"cronPresetMonthly": "每月(1日)", "cronPresetMonthly": "每月(1日)",
"cronPresetWeekly": "每周(周一)", "cronPresetWeekly": "每周(周一)",
"cronRequired": "自定义日程需要 cron 表达式", "cronRequired": "自定义日程需要 cron 表达式",
"crontabGuru": "",
"delete": "删除", "delete": "删除",
"deleteError": "删除例程失败", "deleteError": "删除例程失败",
"deleteMessage": "删除计划 {{name}}?此操作无法撤销。", "deleteMessage": "删除计划 {{name}}?此操作无法撤销。",
@@ -5102,6 +5194,7 @@
"globalScope": "全局(用户级)自动化", "globalScope": "全局(用户级)自动化",
"globalScoped": "此日程将在全球范围内创建。", "globalScoped": "此日程将在全球范围内创建。",
"globalScopeTitle": "全球范围", "globalScopeTitle": "全球范围",
"lastLabel": "",
"loadRoutinesError": "加载例程失败", "loadRoutinesError": "加载例程失败",
"manualTriggerInfo": "此例程将通过控制台或 API 手动触发。", "manualTriggerInfo": "此例程将通过控制台或 API 手动触发。",
"modeAriaLabel": "执行模式", "modeAriaLabel": "执行模式",
@@ -5124,6 +5217,7 @@
"newAutomation": "新自动化", "newAutomation": "新自动化",
"newRoutineHeading": "新建例程", "newRoutineHeading": "新建例程",
"newTitle": "新日程", "newTitle": "新日程",
"nextLabel": "",
"noActiveProject": "没有活跃的项目。日程将在全球范围内创建。", "noActiveProject": "没有活跃的项目。日程将在全球范围内创建。",
"noAutomations": "还没有自动化", "noAutomations": "还没有自动化",
"noStepsEmpty": "尚未添加步骤。添加命令或 AI 提示步骤以开始。", "noStepsEmpty": "尚未添加步骤。添加命令或 AI 提示步骤以开始。",
@@ -5154,6 +5248,7 @@
"runNameNow": "立即运行 {{name}}", "runNameNow": "立即运行 {{name}}",
"running": "运行中…", "running": "运行中…",
"runNow": "立即运行", "runNow": "立即运行",
"runsLabel": "",
"saveChanges": "保存更改", "saveChanges": "保存更改",
"saveStep": "保存步骤", "saveStep": "保存步骤",
"saving": "保存中…", "saving": "保存中…",
@@ -5233,6 +5328,9 @@
"webhookSecretLabel": "Webhook 密钥(可选)", "webhookSecretLabel": "Webhook 密钥(可选)",
"webhookSecretPlaceholder": "可选——无需身份验证的 webhook 请留空" "webhookSecretPlaceholder": "可选——无需身份验证的 webhook 请留空"
}, },
"scripts": {
"title": ""
},
"scriptsModal": { "scriptsModal": {
"addScript": "添加脚本", "addScript": "添加脚本",
"addScriptsHint": "添加脚本可从仪表板快速运行常用命令。", "addScriptsHint": "添加脚本可从仪表板快速运行常用命令。",
@@ -5660,6 +5758,7 @@
"enabling": "启用中…", "enabling": "启用中…",
"notConnected": "✗ 未连接", "notConnected": "✗ 未连接",
"probing": "探测本地 CLI…", "probing": "探测本地 CLI…",
"providerName": "",
"test": "测试", "test": "测试",
"testing": "测试中…" "testing": "测试中…"
}, },
@@ -5695,6 +5794,7 @@
"githubConnectionFailed": "连接失败或超时。", "githubConnectionFailed": "连接失败或超时。",
"githubOauthConnected": "GitHub OAuth 已连接。您可以导入问题并跟踪拉取请求。", "githubOauthConnected": "GitHub OAuth 已连接。您可以导入问题并跟踪拉取请求。",
"githubOauthNotConnected": "GitHub OAuth 尚未连接。您可以在设置 → 身份验证中进行设置,或者现在继续,稍后再连接。", "githubOauthNotConnected": "GitHub OAuth 尚未连接。您可以在设置 → 身份验证中进行设置,或者现在继续,稍后再连接。",
"githubProvider": "",
"githubSkipped": "已跳过 GitHub。您随时可以从设置 → 身份验证进行连接。", "githubSkipped": "已跳过 GitHub。您随时可以从设置 → 身份验证进行连接。",
"goBackToStep": "返回{{label}}", "goBackToStep": "返回{{label}}",
"goToDashboard": "前往仪表板", "goToDashboard": "前往仪表板",
@@ -5954,6 +6054,9 @@
"saving": "保存中…", "saving": "保存中…",
"view": "查看" "view": "查看"
}, },
"stash": {
"copyReference": ""
},
"stashRecovery": { "stashRecovery": {
"applied": "已应用", "applied": "已应用",
"apply": "应用", "apply": "应用",
@@ -6710,7 +6813,6 @@
"subtaskButton": "子任务", "subtaskButton": "子任务",
"thinkingDefault": "默认({{level}})", "thinkingDefault": "默认({{level}})",
"thinkingHigh": "高", "thinkingHigh": "高",
"thinkingXhigh": "极高",
"thinkingLabel": "思考", "thinkingLabel": "思考",
"thinkingLow": "低", "thinkingLow": "低",
"thinkingMedium": "中", "thinkingMedium": "中",
@@ -6971,6 +7073,7 @@
"workflowCheck": "工作流检查" "workflowCheck": "工作流检查"
}, },
"terminal": { "terminal": {
"arrowKeysLabel": "",
"clear": "清空", "clear": "清空",
"clearTerminal": "清空终端", "clearTerminal": "清空终端",
"closeTab": "关闭标签页", "closeTab": "关闭标签页",
@@ -7289,6 +7392,7 @@
"foreachSequential": "顺序", "foreachSequential": "顺序",
"foreachShared": "共享工作树", "foreachShared": "共享工作树",
"foreachWorktree": "每步骤工作树", "foreachWorktree": "每步骤工作树",
"gateBadge": "",
"gateBlocks": "关卡(阻断)", "gateBlocks": "关卡(阻断)",
"gateMode": "关卡模式", "gateMode": "关卡模式",
"insertTemplate": "插入模板 {{name}}", "insertTemplate": "插入模板 {{name}}",
@@ -7345,6 +7449,7 @@
"startEntryColumn": "", "startEntryColumn": "",
"startEntryColumnAuto": "", "startEntryColumnAuto": "",
"startNote": "", "startNote": "",
"stepBadge": "",
"stepExecuteLabel": "步骤执行", "stepExecuteLabel": "步骤执行",
"templateFilterLabel": "筛选模板", "templateFilterLabel": "筛选模板",
"templateFilterPlaceholder": "筛选模板", "templateFilterPlaceholder": "筛选模板",
@@ -7353,6 +7458,7 @@
"templatesFragments": "片段", "templatesFragments": "片段",
"templatesPluginSteps": "插件步骤", "templatesPluginSteps": "插件步骤",
"templatesSection": "模板", "templatesSection": "模板",
"timeoutMs": "",
"trivialGraphHint": "此工作流仅运行开始→结束。从上方面板添加步骤以构建工作流。" "trivialGraphHint": "此工作流仅运行开始→结束。从上方面板添加步骤以构建工作流。"
}, },
"workflows": { "workflows": {
@@ -7418,14 +7524,6 @@
"templateSectionBuiltin": "内置工作流", "templateSectionBuiltin": "内置工作流",
"templateSectionYours": "我的工作流" "templateSectionYours": "我的工作流"
}, },
"workflowSwitcher": {
"countsAria": "{{todoLabel}}: {{todo}}, {{inProgressLabel}}: {{inProgress}}, {{doneLabel}}: {{done}}",
"done": "Done",
"inProgress": "In Progress",
"label": "Workflow",
"todo": "Todo",
"triggerAria": "Select workflow. Current workflow: {{name}}"
},
"workflowSelector": { "workflowSelector": {
"switchActiveMessage": "", "switchActiveMessage": "",
"switchActiveTitle": "", "switchActiveTitle": "",
@@ -7485,6 +7583,14 @@
"widget": "", "widget": "",
"widgetDefault": "" "widgetDefault": ""
}, },
"workflowSwitcher": {
"countsAria": "{{todoLabel}}: {{todo}}, {{inProgressLabel}}: {{inProgress}}, {{doneLabel}}: {{done}}",
"done": "Done",
"inProgress": "In Progress",
"label": "Workflow",
"todo": "Todo",
"triggerAria": "Select workflow. Current workflow: {{name}}"
},
"workspace": { "workspace": {
"projectRoot": "项目根目录", "projectRoot": "项目根目录",
"selectWorkspace": "选择工作区", "selectWorkspace": "选择工作区",

View File

@@ -31,6 +31,12 @@
"update": "更新", "update": "更新",
"yes": "是" "yes": "是"
}, },
"activityFeed": {
"emptyHint": "",
"eventCount_one": "",
"eventCount_other": "",
"noRecentActivity": ""
},
"activityLog": { "activityLog": {
"activeFilters": "活躍過濾器:", "activeFilters": "活躍過濾器:",
"allEvents": "所有事件", "allEvents": "所有事件",
@@ -64,6 +70,7 @@
"noActivityRecorded": "尚未記錄活動", "noActivityRecorded": "尚未記錄活動",
"noMatchingActivity": "沒有活動與目前過濾器匹配", "noMatchingActivity": "沒有活動與目前過濾器匹配",
"notMerged": "未合併", "notMerged": "未合併",
"projectFilterBadge": "",
"refresh": "重新整理", "refresh": "重新整理",
"time": { "time": {
"daysAgo_one": "", "daysAgo_one": "",
@@ -74,7 +81,8 @@
"minutesAgo_one": "", "minutesAgo_one": "",
"minutesAgo_other": "" "minutesAgo_other": ""
}, },
"title": "活動日誌" "title": "活動日誌",
"typeFilterBadge": ""
}, },
"agentError": { "agentError": {
"copied": "已複製", "copied": "已複製",
@@ -354,6 +362,7 @@
"bundleTitle": "程式碼套件", "bundleTitle": "程式碼套件",
"cacheHitRatio": "快取命中率", "cacheHitRatio": "快取命中率",
"cacheReadTokens": "快取讀取", "cacheReadTokens": "快取讀取",
"cacheWindowSummary": "",
"cacheWriteTokens": "快取寫入", "cacheWriteTokens": "快取寫入",
"cancel": "取消", "cancel": "取消",
"cancelCustomInterval": "取消自訂間隔", "cancelCustomInterval": "取消自訂間隔",
@@ -361,6 +370,8 @@
"chainOfCommand": "指揮鏈", "chainOfCommand": "指揮鏈",
"change": "變更", "change": "變更",
"changeRole": "點擊以變更角色", "changeRole": "點擊以變更角色",
"charactersCount_one": "",
"charactersCount_other": "",
"chooseFile": "選擇檔案", "chooseFile": "選擇檔案",
"clearAgents": "清除代理", "clearAgents": "清除代理",
"clearSkills": "清除技能", "clearSkills": "清除技能",
@@ -408,6 +419,7 @@
"deleteTitle": "刪除智能體", "deleteTitle": "刪除智能體",
"deletionNotAvailable": "代理執行時無法刪除。", "deletionNotAvailable": "代理執行時無法刪除。",
"deletionPermanent": "這將永久刪除代理及其所有相關資料。", "deletionPermanent": "這將永久刪除代理及其所有相關資料。",
"detailLoadingLabel": "",
"details": "詳情", "details": "詳情",
"dialogAriaLabel": "建立新代理程式", "dialogAriaLabel": "建立新代理程式",
"dialogTitle": "新代理程式", "dialogTitle": "新代理程式",
@@ -452,6 +464,7 @@
"from": "來自", "from": "來自",
"generateHint": "描述代理程式的角色,讓 AI 生成規格說明", "generateHint": "描述代理程式的角色,讓 AI 生成規格說明",
"generateWithAI": "使用 AI 生成", "generateWithAI": "使用 AI 生成",
"generateWithAiLabel": "",
"generation": { "generation": {
"collapse": "摺疊", "collapse": "摺疊",
"expand": "展開", "expand": "展開",
@@ -536,9 +549,12 @@
"importingAgentsAndSkills": "正在匯入 {{agentCount}} 個 Agent 和 {{skillCount}} 個技能...", "importingAgentsAndSkills": "正在匯入 {{agentCount}} 個 Agent 和 {{skillCount}} 個技能...",
"importingSkills_one": "", "importingSkills_one": "",
"importingSkills_other": "", "importingSkills_other": "",
"importReportsTo": "",
"importSkills": "",
"inbox": "收件匣", "inbox": "收件匣",
"inheritingProjectDefault": "繼承專案預設值", "inheritingProjectDefault": "繼承專案預設值",
"inheritProjectDefault": "繼承專案預設", "inheritProjectDefault": "繼承專案預設",
"inlineInstructions": "",
"inlineMemoryFieldHint": "此記憶直接嵌入代理的上下文中。", "inlineMemoryFieldHint": "此記憶直接嵌入代理的上下文中。",
"inlineMemoryHint": "每次心跳時注入的簡短記憶。", "inlineMemoryHint": "每次心跳時注入的簡短記憶。",
"inlineMemoryLabel": "內聯記憶", "inlineMemoryLabel": "內聯記憶",
@@ -564,6 +580,8 @@
"intentPrompt": "您希望此代理執行什麼操作?", "intentPrompt": "您希望此代理執行什麼操作?",
"interval": "間隔", "interval": "間隔",
"interviewDraftApplied": "訪談草稿已套用", "interviewDraftApplied": "訪談草稿已套用",
"kTokens_one": "",
"kTokens_other": "",
"last24h": "最近 24 小時", "last24h": "最近 24 小時",
"last7d": "最近 7 天", "last7d": "最近 7 天",
"lastHeartbeat": "上次:{{time}}", "lastHeartbeat": "上次:{{time}}",
@@ -753,6 +771,7 @@
"output": "輸出", "output": "輸出",
"outputTokens": "輸出令牌", "outputTokens": "輸出令牌",
"overview": "概覽", "overview": "概覽",
"overviewLabel": "",
"parsing": "正在解析…", "parsing": "正在解析…",
"pause": "暫停", "pause": "暫停",
"pauseAction": "暫停", "pauseAction": "暫停",
@@ -1037,7 +1056,6 @@
"templateCompact": "緊湊", "templateCompact": "緊湊",
"templateDefault": "預設", "templateDefault": "預設",
"thinkingHigh": "高", "thinkingHigh": "高",
"thinkingXhigh": "極高",
"thinkingLevel": "思考級別", "thinkingLevel": "思考級別",
"thinkingLow": "低", "thinkingLow": "低",
"thinkingMedium": "中", "thinkingMedium": "中",
@@ -1045,6 +1063,7 @@
"thinkingOff": "關閉", "thinkingOff": "關閉",
"thinkingXhigh": "極高", "thinkingXhigh": "極高",
"throughput": "吞吐量", "throughput": "吞吐量",
"timeSinceLastHeartbeat": "",
"title": "智能體", "title": "智能體",
"titleLabel": "標題", "titleLabel": "標題",
"titlePlaceholder": "例如:資深程式碼審查員", "titlePlaceholder": "例如:資深程式碼審查員",
@@ -1091,6 +1110,7 @@
}, },
"testMode": "測試模式 — 無實際 AI 呼叫" "testMode": "測試模式 — 無實際 AI 呼叫"
}, },
"appName": "",
"approval": { "approval": {
"dismissBanner": "關閉審批通知橫幅", "dismissBanner": "關閉審批通知橫幅",
"needAttention_one": "", "needAttention_one": "",
@@ -1175,6 +1195,9 @@
"openPr": "開啟 PR", "openPr": "開啟 PR",
"unavailable": "分支群組無法使用" "unavailable": "分支群組無法使用"
}, },
"branchGroups": {
"prNumber": ""
},
"capacity": { "capacity": {
"dismiss": "關閉容量警告", "dismiss": "關閉容量警告",
"risk": "容量風險:", "risk": "容量風險:",
@@ -1322,9 +1345,13 @@
"thinking": "思考中", "thinking": "思考中",
"thinkingLabel": "思考", "thinkingLabel": "思考",
"thinkingStatus": "思考中……", "thinkingStatus": "思考中……",
"toolArgsLabel": "",
"toolArgsPreview": "",
"toolCalls": "工具呼叫", "toolCalls": "工具呼叫",
"toolCallsCount_one": "", "toolCallsCount_one": "",
"toolCallsCount_other": "", "toolCallsCount_other": "",
"toolResultLabel": "",
"toolResultPreview": "",
"typeMessage": "輸入訊息...", "typeMessage": "輸入訊息...",
"unreadMessages": "未讀訊息", "unreadMessages": "未讀訊息",
"untitledSession": "未命名", "untitledSession": "未命名",
@@ -1353,9 +1380,11 @@
"versionMismatchSuffix": "更新以保持同步。" "versionMismatchSuffix": "更新以保持同步。"
}, },
"cliBinary": { "cliBinary": {
"binaryLabel": "",
"checking": "檢查中…", "checking": "檢查中…",
"copied": "已複製", "copied": "已複製",
"copy": "複製", "copy": "複製",
"expectedVersion": "",
"failedExit": "安裝失敗(結束代碼 {{code}})", "failedExit": "安裝失敗(結束代碼 {{code}})",
"heading": "CLI 二進制檔", "heading": "CLI 二進制檔",
"help": "安裝全域 CLI 可讓您從任何終端執行 fn 和 fusion。自動化和指令可以通過 npx 運作而不需要它,但全域安裝更快更方便。", "help": "安裝全域 CLI 可讓您從任何終端執行 fn 和 fusion。自動化和指令可以通過 npx 運作而不需要它,但全域安裝更快更方便。",
@@ -1363,13 +1392,15 @@
"installWithNpm": "使用 npm 安裝", "installWithNpm": "使用 npm 安裝",
"notOnPath": "在 PATH 上找不到 fn 或 fusion。", "notOnPath": "在 PATH 上找不到 fn 或 fusion。",
"orCopyLabel": "或自行複製並執行:", "orCopyLabel": "或自行複製並執行:",
"pathLabel": "",
"refresh": "重新整理", "refresh": "重新整理",
"reinstall": "重新安裝", "reinstall": "重新安裝",
"stateCheckDisabled": "檢查已停用", "stateCheckDisabled": "檢查已停用",
"stateInstalled": "已安裝", "stateInstalled": "已安裝",
"stateMissing": "未安裝", "stateMissing": "未安裝",
"stateVersionMismatch": "版本不符", "stateVersionMismatch": "版本不符",
"succeededDuration": "安裝成功,耗時 {{duration}} 秒" "succeededDuration": "安裝成功,耗時 {{duration}} 秒",
"versionLabel": ""
}, },
"cliChat": { "cliChat": {
"queued_one": "", "queued_one": "",
@@ -1509,7 +1540,6 @@
"title": "" "title": ""
}, },
"orgChart": { "orgChart": {
"description": "",
"empty": "", "empty": "",
"error": "", "error": "",
"loading": "", "loading": "",
@@ -1637,17 +1667,24 @@
"uniqueModels": "" "uniqueModels": ""
}, },
"productivity": { "productivity": {
"averageDuration": "",
"byLanguage": "", "byLanguage": "",
"commits": "", "commits": "",
"completedTasks": "",
"durationTitle": "",
"durationUnavailable": "",
"hoursSaved": "", "hoursSaved": "",
"hoursSavedEstimate": "", "hoursSavedEstimate": "",
"hoursSavedUnavailable": "", "hoursSavedUnavailable": "",
"languagePie": "", "languagePie": "",
"loc": "", "loc": "",
"locUnavailable": "", "locUnavailable": "",
"medianDuration": "",
"modifiedFiles": "", "modifiedFiles": "",
"outcomesTitle": "", "outcomesTitle": "",
"p90Duration": "",
"pullRequests": "", "pullRequests": "",
"totalDuration": "",
"volumeHint": "", "volumeHint": "",
"volumeTitle": "" "volumeTitle": ""
}, },
@@ -1694,6 +1731,7 @@
"ecosystem": "", "ecosystem": "",
"github": "", "github": "",
"missionControl": "", "missionControl": "",
"nodes": "",
"overview": "", "overview": "",
"productivity": "", "productivity": "",
"reliability": "", "reliability": "",
@@ -1910,6 +1948,8 @@
"clear": "清除", "clear": "清除",
"command": "指令", "command": "指令",
"configuration": "設定", "configuration": "設定",
"configurationLabel": "",
"controlsHeaderLabel": "",
"embedded": "嵌入式", "embedded": "嵌入式",
"embeddedPreviewDisabled": "嵌入式預覽已停用。在單獨的瀏覽器分頁中開啟您的應用程式。", "embeddedPreviewDisabled": "嵌入式預覽已停用。在單獨的瀏覽器分頁中開啟您的應用程式。",
"enterFullscreen": "進入日誌全螢幕", "enterFullscreen": "進入日誌全螢幕",
@@ -1928,6 +1968,7 @@
"loadingOlderLogs": "載入較早的日誌中…", "loadingOlderLogs": "載入較早的日誌中…",
"loadOlderLogs": "載入較早的日誌", "loadOlderLogs": "載入較早的日誌",
"logs": "日誌", "logs": "日誌",
"logsLabel": "",
"lostConnection": "日誌串流連線已斷開。", "lostConnection": "日誌串流連線已斷開。",
"manual": "手動", "manual": "手動",
"matchCount_one": "", "matchCount_one": "",
@@ -1946,6 +1987,7 @@
"preview": "預覽", "preview": "預覽",
"previewBlocked": "預覽被阻止", "previewBlocked": "預覽被阻止",
"previewFailed": "預覽失敗", "previewFailed": "預覽失敗",
"previewLabel": "",
"previewUrlOverride": "預覽URL覆蓋", "previewUrlOverride": "預覽URL覆蓋",
"refreshPreview": "重新整理預覽", "refreshPreview": "重新整理預覽",
"restart": "重新啟動", "restart": "重新啟動",
@@ -2124,14 +2166,17 @@
"noTaskDocuments": "還沒有工作文件。", "noTaskDocuments": "還沒有工作文件。",
"openTask": "開啟工作", "openTask": "開啟工作",
"plain": "純文字", "plain": "純文字",
"projectFilePreviewLabel": "",
"projectFiles": "專案檔案", "projectFiles": "專案檔案",
"projectFilesTab": "專案檔案", "projectFilesTab": "專案檔案",
"projectMarkdownFilesLabel": "",
"resultCount_one": "", "resultCount_one": "",
"resultCount_other": "", "resultCount_other": "",
"retry": "重試", "retry": "重試",
"retryLoading": "重試載入文件", "retryLoading": "重試載入文件",
"searchProjectFiles": "搜尋專案 Markdown 檔案…", "searchProjectFiles": "搜尋專案 Markdown 檔案…",
"searchTaskDocuments": "搜尋工作文件…", "searchTaskDocuments": "搜尋工作文件…",
"sectionsLabel": "",
"selectFile": "選取 Markdown 檔案以檢視其內容。", "selectFile": "選取 Markdown 檔案以檢視其內容。",
"showHidden": "顯示隱藏的專案檔案", "showHidden": "顯示隱藏的專案檔案",
"showHiddenFiles": "顯示隱藏檔案", "showHiddenFiles": "顯示隱藏檔案",
@@ -2185,6 +2230,12 @@
"failedToLoadFile": "載入檔案失敗", "failedToLoadFile": "載入檔案失敗",
"failedToSaveFile": "儲存檔案失敗" "failedToSaveFile": "儲存檔案失敗"
}, },
"errorBoundary": {
"genericError": "",
"reloadPage": "",
"retry": "",
"sectionError": ""
},
"evals": { "evals": {
"allRuns": "所有運行", "allRuns": "所有運行",
"disabledTitle": "定時評估已禁用", "disabledTitle": "定時評估已禁用",
@@ -2223,6 +2274,8 @@
"overlapBottleneck_one": "", "overlapBottleneck_one": "",
"overlapBottleneck_other": "", "overlapBottleneck_other": "",
"overlapQueue": "重疊隊列", "overlapQueue": "重疊隊列",
"overlapSummary_one": "",
"overlapSummary_other": "",
"queued": "已排隊", "queued": "已排隊",
"running": "執行中", "running": "執行中",
"secondsAgo_one": "", "secondsAgo_one": "",
@@ -2233,7 +2286,8 @@
"stateRunning": "執行中", "stateRunning": "執行中",
"status": "執行器狀態", "status": "執行器狀態",
"stuck": "卡住", "stuck": "卡住",
"temporary": "暫時" "temporary": "暫時",
"todoStatus": ""
}, },
"fileBrowser": { "fileBrowser": {
"back": "返回檔案清單", "back": "返回檔案清單",
@@ -2640,6 +2694,7 @@
"stashDropped": "儲藏已丟棄", "stashDropped": "儲藏已丟棄",
"stashMessagePlaceholder": "儲藏訊息(可選)", "stashMessagePlaceholder": "儲藏訊息(可選)",
"stashPopped": "已彈出儲藏", "stashPopped": "已彈出儲藏",
"stashRef": "",
"statusLabelBranch": "分支", "statusLabelBranch": "分支",
"statusLabelCommit": "提交", "statusLabelCommit": "提交",
"statusLabelIntegrationBranch": "整合分支", "statusLabelIntegrationBranch": "整合分支",
@@ -2693,6 +2748,13 @@
"worktreesTotal_one": "", "worktreesTotal_one": "",
"worktreesTotal_other": "" "worktreesTotal_other": ""
}, },
"githubStarPrompt": {
"body": "",
"dismissLabel": "",
"regionLabel": "",
"starOnGitHub": "",
"title": ""
},
"goals": { "goals": {
"activeCount_one": "", "activeCount_one": "",
"activeCount_other": "", "activeCount_other": "",
@@ -2729,6 +2791,9 @@
"unlinkMissionError": "", "unlinkMissionError": "",
"updateError": "現在無法更新目標狀態。請重試。" "updateError": "現在無法更新目標狀態。請重試。"
}, },
"groups": {
"prLinkLabel": ""
},
"groupTask": { "groupTask": {
"abandonGroup": "", "abandonGroup": "",
"ariaLabel": "分支群組詳情", "ariaLabel": "分支群組詳情",
@@ -2767,6 +2832,7 @@
"documentsView": "文件檢視", "documentsView": "文件檢視",
"engineOptions": "引擎選項", "engineOptions": "引擎選項",
"evalsView": "評估", "evalsView": "評估",
"fusionLogo": "",
"gitManager": "Git 管理員", "gitManager": "Git 管理員",
"goalsView": "目標", "goalsView": "目標",
"importFromGitHub": "從 GitHub 匯入", "importFromGitHub": "從 GitHub 匯入",
@@ -2786,7 +2852,6 @@
"moreHeaderActions": "更多頁首動作", "moreHeaderActions": "更多頁首動作",
"moreViews": "更多檢視", "moreViews": "更多檢視",
"noBaseBranch": "無基礎分支", "noBaseBranch": "無基礎分支",
"nodes": "節點",
"noScriptsAddOne": "尚無指令碼,請新增…", "noScriptsAddOne": "尚無指令碼,請新增…",
"noScriptsConfigured": "未設定指令碼", "noScriptsConfigured": "未設定指令碼",
"noWorkingBranch": "無工作分支", "noWorkingBranch": "無工作分支",
@@ -2927,6 +2992,7 @@
"archiveTitle": "存檔此洞察", "archiveTitle": "存檔此洞察",
"archiving": "正在存檔\"{{title}}\"...", "archiving": "正在存檔\"{{title}}\"...",
"backlogHealth": "待辦事項健康狀況", "backlogHealth": "待辦事項健康狀況",
"categoriesLabel": "",
"configureModel": "設定洞察生成模型", "configureModel": "設定洞察生成模型",
"configureModelTitle": "設定模型", "configureModelTitle": "設定模型",
"createTaskLabel": "從此洞察建立任務", "createTaskLabel": "從此洞察建立任務",
@@ -3017,6 +3083,9 @@
"verificationCriteria": "驗證標準", "verificationCriteria": "驗證標準",
"yes": "是" "yes": "是"
}, },
"issues": {
"noIssuesFound": ""
},
"lane": { "lane": {
"collapse": "", "collapse": "",
"expand": "" "expand": ""
@@ -3129,8 +3198,7 @@
"unpauseUnavailable": "恢復操作無法使用", "unpauseUnavailable": "恢復操作無法使用",
"useProjectDefault": "使用專案預設", "useProjectDefault": "使用專案預設",
"viewOptions": "檢視選項", "viewOptions": "檢視選項",
"workflowLabel": "", "workflowLabel": ""
"workflowSelectLabel": ""
}, },
"mailbox": { "mailbox": {
"agent": "代理", "agent": "代理",
@@ -3199,6 +3267,7 @@
"replyingTo": "回復 {{preview}}", "replyingTo": "回復 {{preview}}",
"replyingToMessage": "回覆訊息", "replyingToMessage": "回覆訊息",
"replyLoadFailed": "載入回覆訊息失敗。點擊重試。", "replyLoadFailed": "載入回覆訊息失敗。點擊重試。",
"resizeMessageListPane": "",
"selectMessageToRead": "選擇要閱讀的訊息", "selectMessageToRead": "選擇要閱讀的訊息",
"system": "系統", "system": "系統",
"timeDaysAgo_one": "", "timeDaysAgo_one": "",
@@ -3212,6 +3281,7 @@
"to": "至", "to": "至",
"toLabel": "至:", "toLabel": "至:",
"toPrefix": "至:{{recipient}}", "toPrefix": "至:{{recipient}}",
"toRecipient": "",
"typeAgentToAgent": "代理 ↔ 代理", "typeAgentToAgent": "代理 ↔ 代理",
"typeAgentToUser": "代理 → 你", "typeAgentToUser": "代理 → 你",
"typeSystem": "系統", "typeSystem": "系統",
@@ -3387,11 +3457,13 @@
"missions": { "missions": {
"acceptance": "驗收標準:", "acceptance": "驗收標準:",
"acceptanceCriteriaOptional": "驗收標準(選填)", "acceptanceCriteriaOptional": "驗收標準(選填)",
"acceptanceCriteriaPrefix": "",
"actionGenerating": "生成中…", "actionGenerating": "生成中…",
"actionResume": "繼續", "actionResume": "繼續",
"actionRetry": "重試", "actionRetry": "重試",
"actionReview": "審核", "actionReview": "審核",
"activateSlice": "啟動切片", "activateSlice": "啟動切片",
"activityCount": "",
"activityTime": "活動 {{time}}", "activityTime": "活動 {{time}}",
"actual": "實際:{{value}}", "actual": "實際:{{value}}",
"addAssertion": "新增斷言", "addAssertion": "新增斷言",
@@ -3518,6 +3590,7 @@
"filterSlices": "切片和里程碑事件", "filterSlices": "切片和里程碑事件",
"filterStateChanges": "狀態變更", "filterStateChanges": "狀態變更",
"filterTasks": "任務事件", "filterTasks": "任務事件",
"fixLineageButton": "",
"generatedFixFeatures": "已生成修復功能:", "generatedFixFeatures": "已生成修復功能:",
"generatedFixFeaturesTitle": "已生成修復功能", "generatedFixFeaturesTitle": "已生成修復功能",
"generatedFromFeature": "從功能生成:{{id}}", "generatedFromFeature": "從功能生成:{{id}}",
@@ -3545,6 +3618,8 @@
"linkButton": "連結", "linkButton": "連結",
"linkedCount_one": "", "linkedCount_one": "",
"linkedCount_other": "", "linkedCount_other": "",
"linkedCountShort_one": "",
"linkedCountShort_other": "",
"linkedFeaturesCount_one": "", "linkedFeaturesCount_one": "",
"linkedFeaturesCount_other": "", "linkedFeaturesCount_other": "",
"linkedFeaturesLabel": "關聯功能", "linkedFeaturesLabel": "關聯功能",
@@ -3605,6 +3680,7 @@
"planStateNeedsUpdate": "需要更新", "planStateNeedsUpdate": "需要更新",
"planStateNotPlanned": "未規劃", "planStateNotPlanned": "未規劃",
"planStatePlanned": "已規劃", "planStatePlanned": "已規劃",
"planTargetTitle": "",
"planTitle": "用 AI 規劃任務", "planTitle": "用 AI 規劃任務",
"prepareQuestion": "準備下一個問題...", "prepareQuestion": "準備下一個問題...",
"progressText_one": "", "progressText_one": "",
@@ -3711,6 +3787,7 @@
"updateButton": "更新", "updateButton": "更新",
"updated": "任務已更新", "updated": "任務已更新",
"validateFeature": "驗證功能", "validateFeature": "驗證功能",
"validationRoundAttempts": "",
"validationRoundsCount_one": "", "validationRoundsCount_one": "",
"validationRoundsCount_other": "", "validationRoundsCount_other": "",
"validationRoundsLabel_one": "", "validationRoundsLabel_one": "",
@@ -3775,7 +3852,6 @@
"options": { "options": {
"default": "預設值", "default": "預設值",
"high": "高", "high": "高",
"xhigh": "極高",
"low": "低", "low": "低",
"medium": "中等", "medium": "中等",
"minimal": "最小", "minimal": "最小",
@@ -3827,10 +3903,12 @@
"board": "看板", "board": "看板",
"chat": "聊天", "chat": "聊天",
"chatUnreadAriaLabel": "未讀聊天回覆", "chatUnreadAriaLabel": "未讀聊天回覆",
"collapseSidebar": "",
"commandCenter": "", "commandCenter": "",
"devServer": "開發伺服器", "devServer": "開發伺服器",
"documents": "文件", "documents": "文件",
"evals": "評估", "evals": "評估",
"expandSidebar": "",
"files": "檔案", "files": "檔案",
"gitManager": "Git 管理員", "gitManager": "Git 管理員",
"goals": "目標", "goals": "目標",
@@ -3845,16 +3923,17 @@
"missions": "任務集", "missions": "任務集",
"more": "更多", "more": "更多",
"moreSheetTitle": "導覽", "moreSheetTitle": "導覽",
"nodes": "節點",
"noScriptsAddOne": "無腳本 — 新增一個…", "noScriptsAddOne": "無腳本 — 新增一個…",
"planning": "規劃", "planning": "規劃",
"primaryNavAriaLabel": "主導覽", "primaryNavAriaLabel": "主導覽",
"projects": "專案", "projects": "專案",
"research": "研究", "research": "研究",
"resizeSidebar": "",
"scriptsSubmenuAriaLabel": "腳本子選單", "scriptsSubmenuAriaLabel": "腳本子選單",
"secrets": "密鑰", "secrets": "密鑰",
"settings": "設定", "settings": "設定",
"showScriptsAriaLabel": "顯示腳本", "showScriptsAriaLabel": "顯示腳本",
"sidebarAriaLabel": "",
"skills": "技能", "skills": "技能",
"stashRecovery": "暫存恢復", "stashRecovery": "暫存恢復",
"tasks": "任務", "tasks": "任務",
@@ -3960,12 +4039,14 @@
"discoverBeforeAdding": "在新增此節點之前探索遠端專案。", "discoverBeforeAdding": "在新增此節點之前探索遠端專案。",
"discoveredCount_one": "", "discoveredCount_one": "",
"discoveredCount_other": "", "discoveredCount_other": "",
"discoveredRemoteProjectsLabel": "",
"discovering": "正在探索...", "discovering": "正在探索...",
"discoverRemoteProjects": "探索遠端專案", "discoverRemoteProjects": "探索遠端專案",
"discoveryFailed": "無法探索遠端專案", "discoveryFailed": "無法探索遠端專案",
"dismissError": "關閉錯誤", "dismissError": "關閉錯誤",
"docker": "Docker", "docker": "Docker",
"dockerBadge": "受管 Docker 節點", "dockerBadge": "受管 Docker 節點",
"dockerConfigMeta": "",
"dockerConfigSaveFailed": "儲存 Docker 設定失敗", "dockerConfigSaveFailed": "儲存 Docker 設定失敗",
"dockerConfigSaveSuccess": "Docker 設定已儲存", "dockerConfigSaveSuccess": "Docker 設定已儲存",
"dockerConfiguration": "Docker 設定", "dockerConfiguration": "Docker 設定",
@@ -4083,6 +4164,7 @@
"name": "建置伺服器", "name": "建置伺服器",
"optional": "選用" "optional": "選用"
}, },
"projectPathMappingsLabel": "",
"provideManually": "手動提供金鑰", "provideManually": "手動提供金鑰",
"pulling": "拉取中…", "pulling": "拉取中…",
"pullSettings": "拉取設定", "pullSettings": "拉取設定",
@@ -4281,6 +4363,9 @@
"testFailed": "測試失敗——查看上面的狀態。", "testFailed": "測試失敗——查看上面的狀態。",
"unreachable": "{{reason}}" "unreachable": "{{reason}}"
}, },
"piExtensions": {
"filterHint": ""
},
"piManager": { "piManager": {
"addButton": "新增", "addButton": "新增",
"discoveredDescription": "從套件和設定的路徑解析的已安裝擴充功能。", "discoveredDescription": "從套件和設定的路徑解析的已安裝擴充功能。",
@@ -4884,6 +4969,7 @@
"createTask": "建立工作", "createTask": "建立工作",
"createTaskButton": "建立任務", "createTaskButton": "建立任務",
"createTaskTitle": "從發現建立任務", "createTaskTitle": "從發現建立任務",
"currentDefaults": "",
"defaultFindingHeading": "研究發現", "defaultFindingHeading": "研究發現",
"descriptionLabel": "描述", "descriptionLabel": "描述",
"disabled": "此專案的研究功能已停用。", "disabled": "此專案的研究功能已停用。",
@@ -4906,6 +4992,7 @@
"noRunsYet": "尚無研究執行", "noRunsYet": "尚無研究執行",
"noSourcesAvailable": "此專案沒有可用的已啟用研究來源。", "noSourcesAvailable": "此專案沒有可用的已啟用研究來源。",
"noSummaryYet": "尚無摘要。", "noSummaryYet": "尚無摘要。",
"notSet": "",
"openAuthSettings": "開啟驗證設定", "openAuthSettings": "開啟驗證設定",
"openResearchSettings": "開啟研究設定", "openResearchSettings": "開啟研究設定",
"priorityHigh": "高", "priorityHigh": "高",
@@ -4966,6 +5053,7 @@
"intro": "檢視有效執行節點並控制每個工作的節點覆寫。", "intro": "檢視有效執行節點並控制每個工作的節點覆寫。",
"localNoConfiguration": "本機(未設定路由)", "localNoConfiguration": "本機(未設定路由)",
"lockedWhileActive": "此工作為作用中時路由被鎖定。在工作不再作用中之前,無法更改節點覆寫。", "lockedWhileActive": "此工作為作用中時路由被鎖定。在工作不再作用中之前,無法更改節點覆寫。",
"nodeOptionLabel": "",
"nodeUnavailable": "節點不可用或不明", "nodeUnavailable": "節點不可用或不明",
"overrideCleared": "節點覆寫已清除", "overrideCleared": "節點覆寫已清除",
"overrideSection": "節點覆寫", "overrideSection": "節點覆寫",
@@ -4983,6 +5071,9 @@
"unhealthy": "不健康", "unhealthy": "不健康",
"useProjectDefault": "使用專案預設值" "useProjectDefault": "使用專案預設值"
}, },
"runtimes": {
"nousResearchLogoAlt": ""
},
"schedule": { "schedule": {
"actionAiPrompt": "AI 提示", "actionAiPrompt": "AI 提示",
"actionCommand": "命令", "actionCommand": "命令",
@@ -5048,6 +5139,7 @@
"cronPresetMonthly": "每月(1日)", "cronPresetMonthly": "每月(1日)",
"cronPresetWeekly": "每週(週一)", "cronPresetWeekly": "每週(週一)",
"cronRequired": "自訂排程需要 cron 表達式", "cronRequired": "自訂排程需要 cron 表達式",
"crontabGuru": "",
"delete": "刪除", "delete": "刪除",
"deleteError": "刪除例行程序失敗", "deleteError": "刪除例行程序失敗",
"deleteMessage": "刪除排程 {{name}}?此操作無法復原。", "deleteMessage": "刪除排程 {{name}}?此操作無法復原。",
@@ -5102,6 +5194,7 @@
"globalScope": "全域(使用者級)自動化", "globalScope": "全域(使用者級)自動化",
"globalScoped": "此排程將在全域範圍內建立。", "globalScoped": "此排程將在全域範圍內建立。",
"globalScopeTitle": "全域範圍", "globalScopeTitle": "全域範圍",
"lastLabel": "",
"loadRoutinesError": "載入例行程序失敗", "loadRoutinesError": "載入例行程序失敗",
"manualTriggerInfo": "此例行程序將透過控制台或 API 手動觸發。", "manualTriggerInfo": "此例行程序將透過控制台或 API 手動觸發。",
"modeAriaLabel": "執行模式", "modeAriaLabel": "執行模式",
@@ -5124,6 +5217,7 @@
"newAutomation": "新自動化", "newAutomation": "新自動化",
"newRoutineHeading": "新增例行程序", "newRoutineHeading": "新增例行程序",
"newTitle": "新排程", "newTitle": "新排程",
"nextLabel": "",
"noActiveProject": "沒有活躍的專案。排程將在全域範圍內建立。", "noActiveProject": "沒有活躍的專案。排程將在全域範圍內建立。",
"noAutomations": "還沒有自動化", "noAutomations": "還沒有自動化",
"noStepsEmpty": "尚未新增步驟。新增命令或 AI 提示步驟以開始。", "noStepsEmpty": "尚未新增步驟。新增命令或 AI 提示步驟以開始。",
@@ -5154,6 +5248,7 @@
"runNameNow": "立即執行 {{name}}", "runNameNow": "立即執行 {{name}}",
"running": "執行中…", "running": "執行中…",
"runNow": "立即執行", "runNow": "立即執行",
"runsLabel": "",
"saveChanges": "儲存變更", "saveChanges": "儲存變更",
"saveStep": "保存步驟", "saveStep": "保存步驟",
"saving": "儲存中…", "saving": "儲存中…",
@@ -5233,6 +5328,9 @@
"webhookSecretLabel": "Webhook 密鑰(可選)", "webhookSecretLabel": "Webhook 密鑰(可選)",
"webhookSecretPlaceholder": "可選——無需驗證的 webhook 請留空" "webhookSecretPlaceholder": "可選——無需驗證的 webhook 請留空"
}, },
"scripts": {
"title": ""
},
"scriptsModal": { "scriptsModal": {
"addScript": "新增指令碼", "addScript": "新增指令碼",
"addScriptsHint": "新增指令碼可從儀表板快速執行常用命令。", "addScriptsHint": "新增指令碼可從儀表板快速執行常用命令。",
@@ -5660,6 +5758,7 @@
"enabling": "啟用中…", "enabling": "啟用中…",
"notConnected": "✗ 未連接", "notConnected": "✗ 未連接",
"probing": "探測本地 CLI…", "probing": "探測本地 CLI…",
"providerName": "",
"test": "測試", "test": "測試",
"testing": "測試中…" "testing": "測試中…"
}, },
@@ -5695,6 +5794,7 @@
"githubConnectionFailed": "連接失敗或逾時。", "githubConnectionFailed": "連接失敗或逾時。",
"githubOauthConnected": "GitHub OAuth 已連接。您可以匯入問題並追蹤拉取請求。", "githubOauthConnected": "GitHub OAuth 已連接。您可以匯入問題並追蹤拉取請求。",
"githubOauthNotConnected": "GitHub OAuth 尚未連接。您可以在設定 → 驗證中進行設定,或者現在繼續,稍後再連接。", "githubOauthNotConnected": "GitHub OAuth 尚未連接。您可以在設定 → 驗證中進行設定,或者現在繼續,稍後再連接。",
"githubProvider": "",
"githubSkipped": "已略過 GitHub。您隨時可以從設定 → 驗證進行連接。", "githubSkipped": "已略過 GitHub。您隨時可以從設定 → 驗證進行連接。",
"goBackToStep": "返回{{label}}", "goBackToStep": "返回{{label}}",
"goToDashboard": "前往儀表板", "goToDashboard": "前往儀表板",
@@ -5954,6 +6054,9 @@
"saving": "儲存中…", "saving": "儲存中…",
"view": "檢視" "view": "檢視"
}, },
"stash": {
"copyReference": ""
},
"stashRecovery": { "stashRecovery": {
"applied": "已套用", "applied": "已套用",
"apply": "應用", "apply": "應用",
@@ -6710,7 +6813,6 @@
"subtaskButton": "子任務", "subtaskButton": "子任務",
"thinkingDefault": "預設({{level}})", "thinkingDefault": "預設({{level}})",
"thinkingHigh": "高", "thinkingHigh": "高",
"thinkingXhigh": "極高",
"thinkingLabel": "思考", "thinkingLabel": "思考",
"thinkingLow": "低", "thinkingLow": "低",
"thinkingMedium": "中", "thinkingMedium": "中",
@@ -6971,6 +7073,7 @@
"workflowCheck": "工作流程檢查" "workflowCheck": "工作流程檢查"
}, },
"terminal": { "terminal": {
"arrowKeysLabel": "",
"clear": "清空", "clear": "清空",
"clearTerminal": "清空終端", "clearTerminal": "清空終端",
"closeTab": "關閉分頁", "closeTab": "關閉分頁",
@@ -7289,6 +7392,7 @@
"foreachSequential": "循序", "foreachSequential": "循序",
"foreachShared": "共用工作樹", "foreachShared": "共用工作樹",
"foreachWorktree": "每步驟工作樹", "foreachWorktree": "每步驟工作樹",
"gateBadge": "",
"gateBlocks": "關卡(阻擋)", "gateBlocks": "關卡(阻擋)",
"gateMode": "關卡模式", "gateMode": "關卡模式",
"insertTemplate": "插入範本 {{name}}", "insertTemplate": "插入範本 {{name}}",
@@ -7345,6 +7449,7 @@
"startEntryColumn": "", "startEntryColumn": "",
"startEntryColumnAuto": "", "startEntryColumnAuto": "",
"startNote": "", "startNote": "",
"stepBadge": "",
"stepExecuteLabel": "執行步驟", "stepExecuteLabel": "執行步驟",
"templateFilterLabel": "篩選範本", "templateFilterLabel": "篩選範本",
"templateFilterPlaceholder": "篩選範本", "templateFilterPlaceholder": "篩選範本",
@@ -7353,6 +7458,7 @@
"templatesFragments": "片段", "templatesFragments": "片段",
"templatesPluginSteps": "外掛步驟", "templatesPluginSteps": "外掛步驟",
"templatesSection": "範本", "templatesSection": "範本",
"timeoutMs": "",
"trivialGraphHint": "這個工作流程只會執行 start → end。請從上方的選盤新增步驟來建構它。" "trivialGraphHint": "這個工作流程只會執行 start → end。請從上方的選盤新增步驟來建構它。"
}, },
"workflows": { "workflows": {
@@ -7418,14 +7524,6 @@
"templateSectionBuiltin": "內建工作流程", "templateSectionBuiltin": "內建工作流程",
"templateSectionYours": "你的工作流程" "templateSectionYours": "你的工作流程"
}, },
"workflowSwitcher": {
"countsAria": "{{todoLabel}}: {{todo}}, {{inProgressLabel}}: {{inProgress}}, {{doneLabel}}: {{done}}",
"done": "Done",
"inProgress": "In Progress",
"label": "Workflow",
"todo": "Todo",
"triggerAria": "Select workflow. Current workflow: {{name}}"
},
"workflowSelector": { "workflowSelector": {
"switchActiveMessage": "", "switchActiveMessage": "",
"switchActiveTitle": "", "switchActiveTitle": "",
@@ -7485,6 +7583,14 @@
"widget": "", "widget": "",
"widgetDefault": "" "widgetDefault": ""
}, },
"workflowSwitcher": {
"countsAria": "{{todoLabel}}: {{todo}}, {{inProgressLabel}}: {{inProgress}}, {{doneLabel}}: {{done}}",
"done": "Done",
"inProgress": "In Progress",
"label": "Workflow",
"todo": "Todo",
"triggerAria": "Select workflow. Current workflow: {{name}}"
},
"workspace": { "workspace": {
"projectRoot": "項目根目錄", "projectRoot": "項目根目錄",
"selectWorkspace": "選擇工作區", "selectWorkspace": "選擇工作區",

View File

@@ -33,6 +33,12 @@ export default interface Resources {
"update": "Update", "update": "Update",
"yes": "Yes" "yes": "Yes"
}, },
"activityFeed": {
"emptyHint": "Activity will appear here when tasks are created, moved, or completed",
"eventCount_one": "{{count}} event",
"eventCount_other": "{{count}} events",
"noRecentActivity": "No recent activity"
},
"activityLog": { "activityLog": {
"activeFilters": "Active filters:", "activeFilters": "Active filters:",
"allEvents": "All Events", "allEvents": "All Events",
@@ -66,6 +72,7 @@ export default interface Resources {
"noActivityRecorded": "No activity recorded yet", "noActivityRecorded": "No activity recorded yet",
"noMatchingActivity": "No activity matches the current filters", "noMatchingActivity": "No activity matches the current filters",
"notMerged": "Not merged", "notMerged": "Not merged",
"projectFilterBadge": "Project: {{project}}",
"refresh": "Refresh", "refresh": "Refresh",
"time": { "time": {
"daysAgo_one": "{{count}}d ago", "daysAgo_one": "{{count}}d ago",
@@ -76,7 +83,8 @@ export default interface Resources {
"minutesAgo_one": "{{count}}m ago", "minutesAgo_one": "{{count}}m ago",
"minutesAgo_other": "{{count}}m ago" "minutesAgo_other": "{{count}}m ago"
}, },
"title": "Activity Log" "title": "Activity Log",
"typeFilterBadge": "Type: {{type}}"
}, },
"agentError": { "agentError": {
"copied": "Copied", "copied": "Copied",
@@ -356,6 +364,7 @@ export default interface Resources {
"bundleTitle": "Bundle", "bundleTitle": "Bundle",
"cacheHitRatio": "Cache Hit Ratio", "cacheHitRatio": "Cache Hit Ratio",
"cacheReadTokens": "Cache Read", "cacheReadTokens": "Cache Read",
"cacheWindowSummary": "{{percent}}% ({{cached}} / {{written}} / {{input}} / {{tasks}})",
"cacheWriteTokens": "Cache Write", "cacheWriteTokens": "Cache Write",
"cancel": "Cancel", "cancel": "Cancel",
"cancelCustomInterval": "Cancel custom interval", "cancelCustomInterval": "Cancel custom interval",
@@ -363,6 +372,8 @@ export default interface Resources {
"chainOfCommand": "Chain of Command", "chainOfCommand": "Chain of Command",
"change": "Change", "change": "Change",
"changeRole": "Click to change role", "changeRole": "Click to change role",
"charactersCount_one": "{{count}} characters",
"charactersCount_other": "{{count}} characters",
"chooseFile": "Choose File", "chooseFile": "Choose File",
"clearAgents": "Clear agents", "clearAgents": "Clear agents",
"clearSkills": "Clear skills", "clearSkills": "Clear skills",
@@ -410,6 +421,7 @@ export default interface Resources {
"deleted": "Agent deleted", "deleted": "Agent deleted",
"deletionNotAvailable": "Deletion is not available while the agent is running.", "deletionNotAvailable": "Deletion is not available while the agent is running.",
"deletionPermanent": "This will permanently delete the agent and all associated data.", "deletionPermanent": "This will permanently delete the agent and all associated data.",
"detailLoadingLabel": "Agent detail loading",
"details": "Details", "details": "Details",
"dialogAriaLabel": "Create new agent", "dialogAriaLabel": "Create new agent",
"dialogTitle": "New Agent", "dialogTitle": "New Agent",
@@ -454,6 +466,7 @@ export default interface Resources {
"from": "From", "from": "From",
"generateHint": "Describe your agent's role and let AI generate a specification", "generateHint": "Describe your agent's role and let AI generate a specification",
"generateWithAI": "Generate with AI", "generateWithAI": "Generate with AI",
"generateWithAiLabel": "Generate agent with AI",
"generation": { "generation": {
"collapse": "Collapse", "collapse": "Collapse",
"expand": "Expand", "expand": "Expand",
@@ -533,6 +546,8 @@ export default interface Resources {
"importButton": "Import {{label}}", "importButton": "Import {{label}}",
"importComplete": "Import Complete", "importComplete": "Import Complete",
"importDescription": "Import agents from an Agent Companies package. Browse the companies.sh catalog to discover published agents, upload an AGENTS.md file, select a directory, or paste manifest content.", "importDescription": "Import agents from an Agent Companies package. Browse the companies.sh catalog to discover published agents, upload an AGENTS.md file, select a directory, or paste manifest content.",
"importReportsTo": " · reports to {{agent}}",
"importSkills": " · skills: {{skills}}",
"importingAgentsAndSkills": "Importing {{agentCount}} agent{{agentPlural}} and {{skillCount}} skill{{skillPlural}}...", "importingAgentsAndSkills": "Importing {{agentCount}} agent{{agentPlural}} and {{skillCount}} skill{{skillPlural}}...",
"importingAgents_one": "Importing {{count}} agent{{plural}}...", "importingAgents_one": "Importing {{count}} agent{{plural}}...",
"importingAgents_other": "Importing {{count}} agent{{plural}}...", "importingAgents_other": "Importing {{count}} agent{{plural}}...",
@@ -542,6 +557,7 @@ export default interface Resources {
"inbox": "Inbox", "inbox": "Inbox",
"inheritProjectDefault": "Inherit project default", "inheritProjectDefault": "Inherit project default",
"inheritingProjectDefault": "Inheriting project default", "inheritingProjectDefault": "Inheriting project default",
"inlineInstructions": "Inline Instructions",
"inlineMemoryFieldHint": "This memory is embedded directly in the agent's context.", "inlineMemoryFieldHint": "This memory is embedded directly in the agent's context.",
"inlineMemoryHint": "Short-form memory injected on every heartbeat.", "inlineMemoryHint": "Short-form memory injected on every heartbeat.",
"inlineMemoryLabel": "Inline Memory", "inlineMemoryLabel": "Inline Memory",
@@ -566,6 +582,8 @@ export default interface Resources {
"intentPrompt": "What do you want this agent to do?", "intentPrompt": "What do you want this agent to do?",
"interval": "Interval", "interval": "Interval",
"interviewDraftApplied": "Interview draft applied", "interviewDraftApplied": "Interview draft applied",
"kTokens_one": "{{count}}k tokens",
"kTokens_other": "{{count}}k tokens",
"last24h": "Last 24h", "last24h": "Last 24h",
"last7d": "Last 7 days", "last7d": "Last 7 days",
"lastHeartbeat": "Last heartbeat", "lastHeartbeat": "Last heartbeat",
@@ -736,7 +754,7 @@ export default interface Resources {
"startInterview": "Start interview", "startInterview": "Start interview",
"startOnboarding": "Start onboarding", "startOnboarding": "Start onboarding",
"thinking": "Thinking...", "thinking": "Thinking...",
"title": "AI Interview", "title": "Agent Onboarding",
"updatedDraftReady": "Updated draft ready for review", "updatedDraftReady": "Updated draft ready for review",
"yes": "yes" "yes": "yes"
}, },
@@ -755,6 +773,7 @@ export default interface Resources {
"output": "Output", "output": "Output",
"outputTokens": "Output", "outputTokens": "Output",
"overview": "Overview", "overview": "Overview",
"overviewLabel": "Agents overview",
"parsing": "Parsing…", "parsing": "Parsing…",
"pause": "Pause", "pause": "Pause",
"pauseAction": "Pause", "pauseAction": "Pause",
@@ -1046,6 +1065,7 @@ export default interface Resources {
"thinkingOff": "Off", "thinkingOff": "Off",
"thinkingXhigh": "Very High", "thinkingXhigh": "Very High",
"throughput": "Throughput", "throughput": "Throughput",
"timeSinceLastHeartbeat": "Time since last heartbeat",
"title": "Agents", "title": "Agents",
"titleLabel": "Title", "titleLabel": "Title",
"titlePlaceholder": "e.g. Senior Engineer", "titlePlaceholder": "e.g. Senior Engineer",
@@ -1092,6 +1112,7 @@ export default interface Resources {
}, },
"testMode": "Test mode — no real AI calls" "testMode": "Test mode — no real AI calls"
}, },
"appName": "Fusion",
"approval": { "approval": {
"dismissBanner": "Dismiss approval notification banner", "dismissBanner": "Dismiss approval notification banner",
"needAttention_one": "{{count}} approval {{noun}} need your attention", "needAttention_one": "{{count}} approval {{noun}} need your attention",
@@ -1176,6 +1197,9 @@ export default interface Resources {
"openPr": "Open PR", "openPr": "Open PR",
"unavailable": "Branch group unavailable" "unavailable": "Branch group unavailable"
}, },
"branchGroups": {
"prNumber": "PR #{{number}}"
},
"capacity": { "capacity": {
"dismiss": "Dismiss capacity warning", "dismiss": "Dismiss capacity warning",
"risk": "Capacity risk:", "risk": "Capacity risk:",
@@ -1323,9 +1347,13 @@ export default interface Resources {
"thinking": "Thinking", "thinking": "Thinking",
"thinkingLabel": "Thinking", "thinkingLabel": "Thinking",
"thinkingStatus": "Thinking…", "thinkingStatus": "Thinking…",
"toolArgsLabel": "args",
"toolArgsPreview": "args: {{summary}}",
"toolCalls": "Tool calls", "toolCalls": "Tool calls",
"toolCallsCount_one": "{{count}} tool calls", "toolCallsCount_one": "{{count}} tool calls",
"toolCallsCount_other": "{{count}} tool calls", "toolCallsCount_other": "{{count}} tool calls",
"toolResultLabel": "result",
"toolResultPreview": "result: {{summary}}",
"typeMessage": "Type a message...", "typeMessage": "Type a message...",
"unreadMessages": "Unread messages", "unreadMessages": "Unread messages",
"untitledSession": "Untitled", "untitledSession": "Untitled",
@@ -1354,9 +1382,11 @@ export default interface Resources {
"versionMismatchSuffix": "Update to stay in sync." "versionMismatchSuffix": "Update to stay in sync."
}, },
"cliBinary": { "cliBinary": {
"binaryLabel": "Binary:",
"checking": "Checking…", "checking": "Checking…",
"copied": "Copied", "copied": "Copied",
"copy": "Copy", "copy": "Copy",
"expectedVersion": "(expected {{version}})",
"failedExit": "Install failed (exit {{code}})", "failedExit": "Install failed (exit {{code}})",
"heading": "CLI Binary", "heading": "CLI Binary",
"help": "Installing the global CLI lets you run fn and fusion from any terminal. Automations and scripts work without it via npx, but a global install is faster and more convenient.", "help": "Installing the global CLI lets you run fn and fusion from any terminal. Automations and scripts work without it via npx, but a global install is faster and more convenient.",
@@ -1364,13 +1394,15 @@ export default interface Resources {
"installing": "Installing…", "installing": "Installing…",
"notOnPath": "Neither fn nor fusion was found on PATH.", "notOnPath": "Neither fn nor fusion was found on PATH.",
"orCopyLabel": "Or copy and run yourself:", "orCopyLabel": "Or copy and run yourself:",
"pathLabel": "Path:",
"refresh": "Refresh", "refresh": "Refresh",
"reinstall": "Reinstall", "reinstall": "Reinstall",
"stateCheckDisabled": "Check disabled", "stateCheckDisabled": "Check disabled",
"stateInstalled": "Installed", "stateInstalled": "Installed",
"stateMissing": "Not installed", "stateMissing": "Not installed",
"stateVersionMismatch": "Version mismatch", "stateVersionMismatch": "Version mismatch",
"succeededDuration": "Install succeeded in {{duration}}s" "succeededDuration": "Install succeeded in {{duration}}s",
"versionLabel": "Version:"
}, },
"cliChat": { "cliChat": {
"queued_one": "{{count}} message queued — will send when the agent is ready", "queued_one": "{{count}} message queued — will send when the agent is ready",
@@ -1463,6 +1495,31 @@ export default interface Resources {
"stoppedTasks_other": "Stopped {{count}} task{{plural}}" "stoppedTasks_other": "Stopped {{count}} task{{plural}}"
}, },
"commandCenter": { "commandCenter": {
"activity": {
"activeAgents": "Active agents",
"activeNodes": "Active nodes",
"agentRunOutcomeShare": "Agent run outcome share",
"agentRuns": "Agent runs",
"agentRunsActive": "Active",
"agentRunsCompleted": "Completed",
"agentRunsFailed": "Failed",
"agentRunsPerDay": "Agent runs / day",
"agentsPerDay": "Active agents / day",
"messages": "Messages",
"messagesPerDay": "Messages / day",
"nodesPerDay": "Active nodes / day",
"rechartsLine": "Activity trend",
"sessions": "Sessions",
"stickiness": "Stickiness",
"stickinessHint": "DAU / MAU",
"summaryTitle": "Summary",
"throughput": "Throughput",
"throughputPerDay": "Throughput / day"
},
"area": {
"empty": "No data for the selected range.",
"loading": "Loading…"
},
"areaPending": "This area renders once metrics data is available.", "areaPending": "This area renders once metrics data is available.",
"controls": { "controls": {
"concurrency": { "concurrency": {
@@ -1485,7 +1542,6 @@ export default interface Resources {
"title": "Heartbeat control" "title": "Heartbeat control"
}, },
"orgChart": { "orgChart": {
"description": "Read-only view of the running agent hierarchy.",
"empty": "No agents are reporting in yet.", "empty": "No agents are reporting in yet.",
"error": "Unable to load org chart", "error": "Unable to load org chart",
"loading": "Loading org chart…", "loading": "Loading org chart…",
@@ -1511,40 +1567,238 @@ export default interface Resources {
}, },
"title": "Operator controls" "title": "Operator controls"
}, },
"ecosystem": {
"breadthTitle": "Ecosystem breadth",
"empty": "No models or plugins active in the selected range.",
"modelShareTitle": "Task share by model",
"perModelTitle": "Tasks per model",
"plugins": "Plugin activations",
"pluginsUnavailable": "Plugin-activation metrics are not yet recorded",
"taskTrendSeries": "Tasks",
"tokenTrendSeries": "Tokens",
"trendTitle": "Ecosystem trend",
"uniqueModels": "Active models"
},
"empty": "No usage data yet. Run some agents to populate the Command Center.", "empty": "No usage data yet. Run some agents to populate the Command Center.",
"funnel": {
"ariaLabel": "Tasks per workflow stage",
"completionRate": "Completion rate",
"completionRateAria": "Completion rate for in-range triage entrants",
"completionRateHint": "Done ÷ entered (in range)",
"doneInRange": "Reached done",
"empty": "No task transitions in the selected range.",
"enteredInRange": "Entered triage",
"rangeDays_one": "{{count}} day range",
"rangeDays_other": "{{count}} day range",
"stage": {
"done": "Done",
"inProgress": "In progress",
"inReview": "In review",
"other": "Other",
"todo": "Todo",
"triage": "Triage"
},
"throughputPerDay": "Tasks done / day",
"throughputTitle": "Throughput",
"title": "SDLC funnel"
},
"github": {
"backfillBusy": "Backfilling close times…",
"backfillButton": "Backfill exact close times",
"backfillFailed": "Failed to backfill GitHub source issue close times",
"backfillMaxBatches": "Backfill stopped after the safety limit; rerun after checking server logs.",
"backfillNothing": "Nothing to backfill. Scanned {{scanned}}, filled {{filled}}, skipped {{skipped}}, errors {{errors}}.",
"backfillPending": "Backfill is running in paginated batches.",
"backfillResult": "Backfill complete. Scanned {{scanned}}, filled {{filled}}, skipped {{skipped}}, errors {{errors}}.",
"byRepo": "By repository",
"dailyLine": "Filed vs fixed line",
"dailyTrend": "Filed vs fixed trend",
"empty": "No GitHub issue activity in the selected range.",
"filed": "Filed by Fusion",
"filedTrend": "Filed",
"fixed": "Fixed by Fusion",
"fixedApproximation": "Uses done tasks updated in range",
"fixedTrend": "Fixed",
"issueFlowShare": "Filed vs fixed share",
"net": "Net",
"repoValue": "{{filed}} filed / {{fixed}} fixed",
"totalsTitle": "GitHub issue flow"
},
"heading": "Command Center", "heading": "Command Center",
"loading": "Loading command center...", "loading": "Loading command center...",
"missionControl": {
"activeNodes": "Active nodes",
"activeRuns": "Active runs",
"activeSessions": "Active sessions",
"funnelTitle": "SDLC funnel (live)",
"idle": "No active sessions. Live updates resume when work starts.",
"inactive": "inactive",
"loading": "Loading live activity…",
"noNodes": "No active nodes.",
"noSessions": "No active sessions.",
"nodesTitle": "Nodes",
"sessionCount_one": "{{count}} session",
"sessionCount_other": "{{count}} session",
"sessionsTitle": "Sessions"
},
"overview": { "overview": {
"activeNodes": "Active nodes", "activeNodes": "Active nodes",
"agentRuns": "Agent runs",
"agentsWorking": "agents working",
"autonomy": "Autonomy ratio", "autonomy": "Autonomy ratio",
"dailyActivity": "Daily activity trend",
"dailyActivityAria": "Daily activity trend",
"dailyActivityHint": "Messages plus active agents per day",
"dailyActivityLine": "Daily activity line",
"dailyActivityLineHint": "Messages, agents, and runs by day",
"liveStrip": "Live activity", "liveStrip": "Live activity",
"liveStripPending": "Live Mission Control loads with active sessions.", "liveTokens": "tokens",
"openSignals": "Open signals", "openSignals": "Open signals",
"sessions": "Sessions",
"tasksDone": "Tasks done", "tasksDone": "Tasks done",
"tasksInProgress": "tasks in progress",
"throughputTrend": "throughput trend",
"throughputTrendAria": "Recent activity throughput trend",
"tokensByModel": "Tokens by model",
"tokensByModelHint": "Top model token consumers in this range",
"tokensByModelPie": "Token share by model",
"tokensByModelPieHint": "Top model token share in this range",
"tokensCost": "Tokens & cost", "tokensCost": "Tokens & cost",
"toolCategories": "Tool categories",
"toolCategoriesHint": "Autonomous work grouped by tool family",
"uniqueModels": "Unique models" "uniqueModels": "Unique models"
}, },
"productivity": {
"averageDuration": "Average",
"byLanguage": "Files by language",
"commits": "Commits",
"completedTasks": "Completed tasks",
"durationTitle": "Task duration",
"durationUnavailable": "Task duration is unavailable until completed tasks have active execution time recorded",
"hoursSaved": "Human hours saved",
"hoursSavedEstimate": "estimate from lines changed",
"hoursSavedUnavailable": "Estimated human hours saved is unavailable until commit diff stats exist",
"languagePie": "Language share",
"loc": "Lines changed",
"locUnavailable": "LOC is unavailable until commit diff stats are recorded",
"medianDuration": "Median",
"modifiedFiles": "Files modified",
"outcomesTitle": "Outcomes",
"p90Duration": "P90",
"pullRequests": "Pull requests",
"totalDuration": "Total active",
"volumeHint": "volume, not outcome",
"volumeTitle": "Volume (proxy)"
},
"range": { "range": {
"allTime": "All time",
"custom": "Custom range", "custom": "Custom range",
"dialogLabel": "Select date range", "dialogLabel": "Select date range",
"from": "From", "from": "From",
"invalidRange": "Start date must be on or before end date", "invalidRange": "Start date must be on or before end date",
"last24h": "Last 24h",
"last30d": "Last 30 days",
"last7d": "Last 7 days",
"to": "To" "to": "To"
}, },
"signals": {
"bySeverity": "By severity",
"bySource": "By source",
"empty": "No external signals yet. Connect a signal source (Sentry, Datadog, PagerDuty, webhook) to see incident metrics here.",
"mttr": "MTTR",
"mttrUnavailable": "MTTR is unavailable until incident data is recorded",
"mttrValue": "{{min}} min",
"open": "Open",
"resolved": "Resolved",
"statusShare": "Signal status share",
"summaryTitle": "Summary",
"total": "Total signals"
},
"system": {
"cpuGauge": "App CPU usage",
"cpuSeries": "CPU",
"cpuTrend": "CPU over time",
"detailsTitle": "Runtime details",
"healthTitle": "Live system health",
"heapGauge": "Heap used",
"heapSeries": "Heap",
"heapTrend": "Heap over time",
"memoryGauge": "System memory used",
"memorySeries": "Memory",
"memoryTrend": "Memory over time",
"resourceTrend": "Resource trend",
"taskShare": "Task distribution",
"trendsTitle": "Live trends",
"workloadTitle": "Workload"
},
"tablistLabel": "Command Center sections", "tablistLabel": "Command Center sections",
"tabs": { "tabs": {
"activity": "Activity", "activity": "Activity",
"ecosystem": "Ecosystem", "ecosystem": "Ecosystem",
"github": "GitHub",
"missionControl": "Mission Control", "missionControl": "Mission Control",
"nodes": "Nodes",
"overview": "Overview", "overview": "Overview",
"productivity": "Productivity", "productivity": "Productivity",
"reliability": "Reliability", "reliability": "Reliability",
"signals": "Signals",
"system": "System",
"team": "Team",
"tokens": "Tokens", "tokens": "Tokens",
"tools": "Tools" "tools": "Tools"
},
"team": {
"agent": "Agent",
"completedByAgent": "Tasks done by agent",
"cost": "Cost",
"done": "Tasks done",
"empty": "No agents have reported team analytics yet.",
"files": "Files changed",
"filesChanged": "Files changed",
"inProgress": "In progress",
"noChartData": "No non-zero values for this chart yet.",
"spread": "Team spread",
"state": "Agent state: {{state}}",
"tableTitle": "Per-agent breakdown",
"tasksCompleted": "Tasks done",
"tokenShareByAgent": "Token share by agent",
"tokens": "Tokens",
"tokensByAgent": "Tokens by agent",
"totalCost": "Estimated cost",
"totalTokens": "Total tokens",
"totalsTitle": "Team totals",
"unknownAgent": "(unknown agent)",
"unknownRole": "Unknown role",
"unknownState": "unknown"
},
"tokens": {
"byModelChart": "Tokens by model",
"cached": "Cached",
"cost": "Estimated cost",
"costCol": "Cost",
"costUnavailable": "No pricing for this model",
"granularity": "Token chart granularity",
"input": "Input",
"model": "Model",
"output": "Output",
"overTimeChart": "Tokens over time",
"pieChart": "Token share by model",
"rechartsLine": "Tokens trend",
"stalePricing": "pricing may be stale",
"tableTitle": "Per-model breakdown",
"tasks": "Tasks",
"total": "Total",
"totalTokens": "Total tokens",
"totalsTitle": "Totals",
"unknownModel": "(unknown)"
},
"tools": {
"autonomyHint": "tool calls per human intervention",
"autonomyRatio": "Autonomy ratio",
"categoriesTitle": "Tool categories",
"interventionBreakdown": "{{approvals}} approvals · {{steers}} steers",
"interventions": "Interventions",
"pieChart": "Tool category share",
"ratioAutonomous": "{{ratio}} calls/session (fully autonomous)",
"sessions": "Sessions",
"summaryTitle": "Summary",
"toolCalls": "Tool calls"
} }
}, },
"comments": { "comments": {
@@ -1655,6 +1909,7 @@ export default interface Resources {
"title": "Create room" "title": "Create room"
}, },
"dashboard": { "dashboard": {
"brandName": "Fusion",
"initializingDashboard": "Initializing dashboard...", "initializingDashboard": "Initializing dashboard...",
"loadingMessage": "Loading Fusion dashboard", "loadingMessage": "Loading Fusion dashboard",
"loadingProgress": "Dashboard loading progress", "loadingProgress": "Dashboard loading progress",
@@ -1695,6 +1950,8 @@ export default interface Resources {
"clear": "Clear", "clear": "Clear",
"command": "Command", "command": "Command",
"configuration": "Configuration", "configuration": "Configuration",
"configurationLabel": "Dev server configuration",
"controlsHeaderLabel": "Dev server controls header",
"embedded": "Embedded", "embedded": "Embedded",
"embeddedPreviewDisabled": "Embedded preview is disabled. Open your app in a separate browser tab.", "embeddedPreviewDisabled": "Embedded preview is disabled. Open your app in a separate browser tab.",
"enterFullscreen": "Enter fullscreen logs", "enterFullscreen": "Enter fullscreen logs",
@@ -1713,6 +1970,7 @@ export default interface Resources {
"loadingLogs": "Loading logs…", "loadingLogs": "Loading logs…",
"loadingOlderLogs": "Loading older logs…", "loadingOlderLogs": "Loading older logs…",
"logs": "Logs", "logs": "Logs",
"logsLabel": "Dev server logs",
"lostConnection": "Lost log stream connection.", "lostConnection": "Lost log stream connection.",
"manual": "Manual", "manual": "Manual",
"matchCount_one": "{{count}} match", "matchCount_one": "{{count}} match",
@@ -1731,6 +1989,7 @@ export default interface Resources {
"preview": "Preview", "preview": "Preview",
"previewBlocked": "Preview blocked", "previewBlocked": "Preview blocked",
"previewFailed": "Preview failed", "previewFailed": "Preview failed",
"previewLabel": "Dev server preview",
"previewUrlOverride": "Preview URL Override", "previewUrlOverride": "Preview URL Override",
"refreshPreview": "Refresh preview", "refreshPreview": "Refresh preview",
"restart": "Restart", "restart": "Restart",
@@ -1909,14 +2168,17 @@ export default interface Resources {
"noTaskDocuments": "No task documents yet.", "noTaskDocuments": "No task documents yet.",
"openTask": "Open task", "openTask": "Open task",
"plain": "Plain", "plain": "Plain",
"projectFilePreviewLabel": "Project file content preview",
"projectFiles": "project files", "projectFiles": "project files",
"projectFilesTab": "Project Files", "projectFilesTab": "Project Files",
"projectMarkdownFilesLabel": "Project markdown files",
"resultCount_one": "{{count}} result{{plural}}", "resultCount_one": "{{count}} result{{plural}}",
"resultCount_other": "{{count}} result{{plural}}", "resultCount_other": "{{count}} result{{plural}}",
"retry": "Retry", "retry": "Retry",
"retryLoading": "Retry loading documents", "retryLoading": "Retry loading documents",
"searchProjectFiles": "Search project markdown files…", "searchProjectFiles": "Search project markdown files…",
"searchTaskDocuments": "Search task documents…", "searchTaskDocuments": "Search task documents…",
"sectionsLabel": "Documents sections",
"selectFile": "Select a Markdown file to view its content.", "selectFile": "Select a Markdown file to view its content.",
"showHidden": "Show hidden project files", "showHidden": "Show hidden project files",
"showHiddenFiles": "Show hidden files", "showHiddenFiles": "Show hidden files",
@@ -1970,6 +2232,12 @@ export default interface Resources {
"failedToLoadFile": "Failed to load file", "failedToLoadFile": "Failed to load file",
"failedToSaveFile": "Failed to save file" "failedToSaveFile": "Failed to save file"
}, },
"errorBoundary": {
"genericError": "Something went wrong",
"reloadPage": "Reload page",
"retry": "Retry",
"sectionError": "This section encountered an error"
},
"evals": { "evals": {
"allRuns": "All runs", "allRuns": "All runs",
"disabledTitle": "Scheduled evals are disabled", "disabledTitle": "Scheduled evals are disabled",
@@ -2008,6 +2276,8 @@ export default interface Resources {
"overlapBottleneck_one": "{{status}} overlap bottleneck {{blockerId}}: {{count}} todo blocked via blockedBy (threshold {{threshold}})", "overlapBottleneck_one": "{{status}} overlap bottleneck {{blockerId}}: {{count}} todo blocked via blockedBy (threshold {{threshold}})",
"overlapBottleneck_other": "{{status}} overlap bottleneck {{blockerId}}: {{count}} todo blocked via blockedBy (threshold {{threshold}})", "overlapBottleneck_other": "{{status}} overlap bottleneck {{blockerId}}: {{count}} todo blocked via blockedBy (threshold {{threshold}})",
"overlapQueue": "Overlap queue", "overlapQueue": "Overlap queue",
"overlapSummary_one": "{{blockerId}} · {{count}} todo",
"overlapSummary_other": "{{blockerId}} · {{count}} todo",
"queued": "Queued", "queued": "Queued",
"running": "Running", "running": "Running",
"secondsAgo_one": "{{count}}s ago", "secondsAgo_one": "{{count}}s ago",
@@ -2018,7 +2288,8 @@ export default interface Resources {
"stateRunning": "Running", "stateRunning": "Running",
"status": "Executor status", "status": "Executor status",
"stuck": "Stuck", "stuck": "Stuck",
"temporary": "Temporary" "temporary": "Temporary",
"todoStatus": "todo"
}, },
"fileBrowser": { "fileBrowser": {
"back": "Back to file list", "back": "Back to file list",
@@ -2425,6 +2696,7 @@ export default interface Resources {
"stashDropped": "Stash dropped", "stashDropped": "Stash dropped",
"stashMessagePlaceholder": "Stash message (optional)", "stashMessagePlaceholder": "Stash message (optional)",
"stashPopped": "Stash popped", "stashPopped": "Stash popped",
"stashRef": "stash@{{index}}",
"statusLabelBranch": "Branch", "statusLabelBranch": "Branch",
"statusLabelCommit": "Commit", "statusLabelCommit": "Commit",
"statusLabelIntegrationBranch": "Integration branch", "statusLabelIntegrationBranch": "Integration branch",
@@ -2478,6 +2750,13 @@ export default interface Resources {
"worktreesTotal_one": "{{count}} total", "worktreesTotal_one": "{{count}} total",
"worktreesTotal_other": "{{count}} total" "worktreesTotal_other": "{{count}} total"
}, },
"githubStarPrompt": {
"body": "If Fusion has saved you time, a GitHub star goes a long way. It helps other developers discover the project and keeps the team motivated to ship improvements.",
"dismissLabel": "Dismiss GitHub star prompt",
"regionLabel": "GitHub star prompt",
"starOnGitHub": "Star on GitHub",
"title": "Enjoying Fusion?"
},
"goals": { "goals": {
"activeCount_one": "{{count}} active goals", "activeCount_one": "{{count}} active goals",
"activeCount_other": "{{count}} active goals", "activeCount_other": "{{count}} active goals",
@@ -2532,6 +2811,9 @@ export default interface Resources {
"title": "Branch Group {{id}}", "title": "Branch Group {{id}}",
"unavailable": "Branch group unavailable" "unavailable": "Branch group unavailable"
}, },
"groups": {
"prLinkLabel": "PR #{{number}} ({{state}})"
},
"header": { "header": {
"activePlanningSessions_one": "{{count}} active planning session", "activePlanningSessions_one": "{{count}} active planning session",
"activePlanningSessions_other": "{{count}} active planning sessions", "activePlanningSessions_other": "{{count}} active planning sessions",
@@ -2552,6 +2834,7 @@ export default interface Resources {
"documentsView": "Documents view", "documentsView": "Documents view",
"engineOptions": "Engine options", "engineOptions": "Engine options",
"evalsView": "Evals", "evalsView": "Evals",
"fusionLogo": "Fusion logo",
"gitManager": "Git Manager", "gitManager": "Git Manager",
"goalsView": "Goals", "goalsView": "Goals",
"importFromGitHub": "Import from GitHub", "importFromGitHub": "Import from GitHub",
@@ -2574,7 +2857,6 @@ export default interface Resources {
"noScriptsAddOne": "No scripts — add one…", "noScriptsAddOne": "No scripts — add one…",
"noScriptsConfigured": "No scripts configured", "noScriptsConfigured": "No scripts configured",
"noWorkingBranch": "No working branch", "noWorkingBranch": "No working branch",
"nodes": "Nodes",
"openSearch": "Open search", "openSearch": "Open search",
"openTerminal": "Open Terminal", "openTerminal": "Open Terminal",
"pauseTriage": "Pause triage", "pauseTriage": "Pause triage",
@@ -2712,6 +2994,7 @@ export default interface Resources {
"archivedMsg": "Insight archived: {{title}}", "archivedMsg": "Insight archived: {{title}}",
"archiving": "Archiving \"{{title}}\"...", "archiving": "Archiving \"{{title}}\"...",
"backlogHealth": "Backlog Health", "backlogHealth": "Backlog Health",
"categoriesLabel": "Insight categories",
"configureModel": "Configure insight generation model", "configureModel": "Configure insight generation model",
"configureModelTitle": "Configure model", "configureModelTitle": "Configure model",
"createTaskLabel": "Create task from this insight", "createTaskLabel": "Create task from this insight",
@@ -2802,6 +3085,9 @@ export default interface Resources {
"verificationCriteria": "Verification Criteria", "verificationCriteria": "Verification Criteria",
"yes": "Yes" "yes": "Yes"
}, },
"issues": {
"noIssuesFound": "No issues found"
},
"lane": { "lane": {
"collapse": "Collapse {{name}} lane", "collapse": "Collapse {{name}} lane",
"expand": "Expand {{name}} lane" "expand": "Expand {{name}} lane"
@@ -2914,8 +3200,7 @@ export default interface Resources {
"unpauseUnavailable": "Unpause action is unavailable", "unpauseUnavailable": "Unpause action is unavailable",
"useProjectDefault": "Use project default", "useProjectDefault": "Use project default",
"viewOptions": "View options", "viewOptions": "View options",
"workflowLabel": "Workflow", "workflowLabel": "Workflow"
"workflowSelectLabel": "Select workflow"
}, },
"mailbox": { "mailbox": {
"agent": "Agent", "agent": "Agent",
@@ -2984,6 +3269,7 @@ export default interface Resources {
"replyLoadFailed": "Failed to load replied message. Click to retry.", "replyLoadFailed": "Failed to load replied message. Click to retry.",
"replyingTo": "Replying to", "replyingTo": "Replying to",
"replyingToMessage": "Replying to message", "replyingToMessage": "Replying to message",
"resizeMessageListPane": "Resize message list pane",
"selectMessageToRead": "Select a message to read", "selectMessageToRead": "Select a message to read",
"system": "System", "system": "System",
"timeDaysAgo_one": "{{count}}d ago", "timeDaysAgo_one": "{{count}}d ago",
@@ -2997,6 +3283,7 @@ export default interface Resources {
"to": "To", "to": "To",
"toLabel": "To:", "toLabel": "To:",
"toPrefix": "To: {{recipient}}", "toPrefix": "To: {{recipient}}",
"toRecipient": "To: {{recipient}}",
"typeAgentToAgent": "Agent ↔ Agent", "typeAgentToAgent": "Agent ↔ Agent",
"typeAgentToUser": "Agent → You", "typeAgentToUser": "Agent → You",
"typeSystem": "System", "typeSystem": "System",
@@ -3172,11 +3459,13 @@ export default interface Resources {
"missions": { "missions": {
"acceptance": "Acceptance:", "acceptance": "Acceptance:",
"acceptanceCriteriaOptional": "Acceptance criteria (optional)", "acceptanceCriteriaOptional": "Acceptance criteria (optional)",
"acceptanceCriteriaPrefix": "AC:",
"actionGenerating": "Generating…", "actionGenerating": "Generating…",
"actionResume": "Resume", "actionResume": "Resume",
"actionRetry": "Retry", "actionRetry": "Retry",
"actionReview": "Review", "actionReview": "Review",
"activateSlice": "Activate slice", "activateSlice": "Activate slice",
"activityCount": "{{visible}} of {{total}}",
"activityTime": "Activity {{time}}", "activityTime": "Activity {{time}}",
"actual": "Actual: {{value}}", "actual": "Actual: {{value}}",
"addAssertion": "Add assertion", "addAssertion": "Add assertion",
@@ -3303,6 +3592,7 @@ export default interface Resources {
"filterSlices": "Slice & milestone events", "filterSlices": "Slice & milestone events",
"filterStateChanges": "State changes", "filterStateChanges": "State changes",
"filterTasks": "Task events", "filterTasks": "Task events",
"fixLineageButton": "🔗 Fix",
"generatedFixFeatures": "Generated fix features:", "generatedFixFeatures": "Generated fix features:",
"generatedFixFeaturesTitle": "Generated Fix Features", "generatedFixFeaturesTitle": "Generated Fix Features",
"generatedFromFeature": "Generated from feature: {{id}}", "generatedFromFeature": "Generated from feature: {{id}}",
@@ -3332,6 +3622,8 @@ export default interface Resources {
"linkFeatureToTask": "Link feature to task:", "linkFeatureToTask": "Link feature to task:",
"linkGoal": "Link goal", "linkGoal": "Link goal",
"linkToTask": "Link to task", "linkToTask": "Link to task",
"linkedCountShort_one": "({{count}} linked)",
"linkedCountShort_other": "({{count}} linked)",
"linkedCount_one": "{{count}} linked", "linkedCount_one": "{{count}} linked",
"linkedCount_other": "{{count}} linked", "linkedCount_other": "{{count}} linked",
"linkedFeaturesCount_one": "{{count}} linked feature", "linkedFeaturesCount_one": "{{count}} linked feature",
@@ -3389,6 +3681,7 @@ export default interface Resources {
"planStateNeedsUpdate": "Needs update", "planStateNeedsUpdate": "Needs update",
"planStateNotPlanned": "Not planned", "planStateNotPlanned": "Not planned",
"planStatePlanned": "Planned", "planStatePlanned": "Planned",
"planTargetTitle": "Plan {{targetLabel}}: {{targetTitle}}",
"planTitle": "Plan Mission with AI", "planTitle": "Plan Mission with AI",
"planningModel": "Planning Model", "planningModel": "Planning Model",
"prepareQuestion": "Preparing next question...", "prepareQuestion": "Preparing next question...",
@@ -3496,6 +3789,7 @@ export default interface Resources {
"updateButton": "Update", "updateButton": "Update",
"updated": "Mission updated", "updated": "Mission updated",
"validateFeature": "Validate feature", "validateFeature": "Validate feature",
"validationRoundAttempts": "impl #{{implementation}} · reviewer #{{reviewer}}",
"validationRoundsCount_one": "{{count}} round", "validationRoundsCount_one": "{{count}} round",
"validationRoundsCount_other": "{{count}} rounds", "validationRoundsCount_other": "{{count}} rounds",
"validationRoundsLabel_one": "Validation rounds ({{count}})", "validationRoundsLabel_one": "Validation rounds ({{count}})",
@@ -3608,17 +3902,21 @@ export default interface Resources {
"activityLog": "Activity Log", "activityLog": "Activity Log",
"agents": "Agents", "agents": "Agents",
"automation": "Automation", "automation": "Automation",
"board": "Board",
"chat": "Chat", "chat": "Chat",
"chatUnreadAriaLabel": "Unread chat response", "chatUnreadAriaLabel": "Unread chat response",
"collapseSidebar": "Collapse sidebar",
"commandCenter": "Command Center", "commandCenter": "Command Center",
"devServer": "Dev Server", "devServer": "Dev Server",
"documents": "Documents", "documents": "Documents",
"evals": "Evals", "evals": "Evals",
"expandSidebar": "Expand sidebar",
"files": "Files", "files": "Files",
"gitManager": "Git Manager", "gitManager": "Git Manager",
"goals": "Goals", "goals": "Goals",
"importFromGitHub": "Import from GitHub", "importFromGitHub": "Import from GitHub",
"insights": "Insights", "insights": "Insights",
"list": "List",
"loadingScripts": "Loading scripts…", "loadingScripts": "Loading scripts…",
"mailbox": "Mailbox", "mailbox": "Mailbox",
"mailboxPendingAriaLabel": "Pending approvals", "mailboxPendingAriaLabel": "Pending approvals",
@@ -3628,15 +3926,16 @@ export default interface Resources {
"more": "More", "more": "More",
"moreSheetTitle": "Navigate", "moreSheetTitle": "Navigate",
"noScriptsAddOne": "No scripts — add one…", "noScriptsAddOne": "No scripts — add one…",
"nodes": "Nodes",
"planning": "Planning", "planning": "Planning",
"primaryNavAriaLabel": "Primary navigation", "primaryNavAriaLabel": "Primary navigation",
"projects": "Projects", "projects": "Projects",
"research": "Research", "research": "Research",
"resizeSidebar": "Resize sidebar",
"scriptsSubmenuAriaLabel": "Scripts submenu", "scriptsSubmenuAriaLabel": "Scripts submenu",
"secrets": "Secrets", "secrets": "Secrets",
"settings": "Settings", "settings": "Settings",
"showScriptsAriaLabel": "Show scripts", "showScriptsAriaLabel": "Show scripts",
"sidebarAriaLabel": "Sidebar navigation",
"skills": "Skills", "skills": "Skills",
"stashRecovery": "Stash Recovery", "stashRecovery": "Stash Recovery",
"tasks": "Tasks", "tasks": "Tasks",
@@ -3755,11 +4054,13 @@ export default interface Resources {
"discoverRemoteProjects": "Discover Remote Projects", "discoverRemoteProjects": "Discover Remote Projects",
"discoveredCount_one": "Discovered {{count}} remote project{{plural}}", "discoveredCount_one": "Discovered {{count}} remote project{{plural}}",
"discoveredCount_other": "Discovered {{count}} remote project{{plural}}", "discoveredCount_other": "Discovered {{count}} remote project{{plural}}",
"discoveredRemoteProjectsLabel": "Discovered remote projects",
"discovering": "Discovering...", "discovering": "Discovering...",
"discoveryFailed": "Failed to discover remote projects", "discoveryFailed": "Failed to discover remote projects",
"dismissError": "Dismiss error", "dismissError": "Dismiss error",
"docker": "Docker", "docker": "Docker",
"dockerBadge": "Managed Docker node", "dockerBadge": "Managed Docker node",
"dockerConfigMeta": "Config v{{version}} • Updated {{updated}}",
"dockerConfigSaveFailed": "Failed to save Docker config", "dockerConfigSaveFailed": "Failed to save Docker config",
"dockerConfigSaveSuccess": "Docker config saved", "dockerConfigSaveSuccess": "Docker config saved",
"dockerConfiguration": "Docker Configuration", "dockerConfiguration": "Docker Configuration",
@@ -3877,6 +4178,7 @@ export default interface Resources {
"name": "Build Server", "name": "Build Server",
"optional": "Optional" "optional": "Optional"
}, },
"projectPathMappingsLabel": "Project path mappings",
"provideManually": "Provide key manually", "provideManually": "Provide key manually",
"pullSettings": "Pull Settings", "pullSettings": "Pull Settings",
"pullSettingsFailed": "Pull settings failed", "pullSettingsFailed": "Pull settings failed",
@@ -4063,6 +4365,9 @@ export default interface Resources {
"testFailed": "Test failed — see status above.", "testFailed": "Test failed — see status above.",
"unreachable": "{{reason}}" "unreachable": "{{reason}}"
}, },
"piExtensions": {
"filterHint": "{{extensions}} ext, {{skills}} skill, {{prompts}} prompt, {{themes}} theme"
},
"piManager": { "piManager": {
"addButton": "Add", "addButton": "Add",
"discoveredDescription": "Installed extensions resolved from packages and configured paths.", "discoveredDescription": "Installed extensions resolved from packages and configured paths.",
@@ -4666,6 +4971,7 @@ export default interface Resources {
"createTask": "Create Task", "createTask": "Create Task",
"createTaskButton": "Create Task", "createTaskButton": "Create Task",
"createTaskTitle": "Create task from finding", "createTaskTitle": "Create task from finding",
"currentDefaults": "Current defaults: provider {{provider}}, max sources {{maxSources}}",
"defaultFindingHeading": "Research finding", "defaultFindingHeading": "Research finding",
"descriptionLabel": "Description", "descriptionLabel": "Description",
"disabled": "Research is disabled for this project.", "disabled": "Research is disabled for this project.",
@@ -4688,6 +4994,7 @@ export default interface Resources {
"noRunsYet": "No research runs yet", "noRunsYet": "No research runs yet",
"noSourcesAvailable": "No enabled research sources are available for this project.", "noSourcesAvailable": "No enabled research sources are available for this project.",
"noSummaryYet": "No summary yet.", "noSummaryYet": "No summary yet.",
"notSet": "(not set)",
"openAuthSettings": "Open Authentication Settings", "openAuthSettings": "Open Authentication Settings",
"openResearchSettings": "Open Research Settings", "openResearchSettings": "Open Research Settings",
"priorityHigh": "High", "priorityHigh": "High",
@@ -4748,6 +5055,7 @@ export default interface Resources {
"intro": "View the effective execution node and control per-task node override.", "intro": "View the effective execution node and control per-task node override.",
"localNoConfiguration": "Local (no routing configured)", "localNoConfiguration": "Local (no routing configured)",
"lockedWhileActive": "Routing is locked while this task is active. Node override cannot be changed until the task is no longer active.", "lockedWhileActive": "Routing is locked while this task is active. Node override cannot be changed until the task is no longer active.",
"nodeOptionLabel": "{{name}} ({{type}}) — {{status}}",
"nodeUnavailable": "node unavailable or unknown", "nodeUnavailable": "node unavailable or unknown",
"overrideCleared": "Node override cleared", "overrideCleared": "Node override cleared",
"overrideSection": "Node Override", "overrideSection": "Node Override",
@@ -4765,6 +5073,9 @@ export default interface Resources {
"unhealthy": "Unhealthy", "unhealthy": "Unhealthy",
"useProjectDefault": "Use project default" "useProjectDefault": "Use project default"
}, },
"runtimes": {
"nousResearchLogoAlt": "Nous Research"
},
"schedule": { "schedule": {
"actionAiPrompt": "AI Prompt", "actionAiPrompt": "AI Prompt",
"actionCommand": "Command", "actionCommand": "Command",
@@ -4830,6 +5141,7 @@ export default interface Resources {
"cronPresetMonthly": "Every month (1st)", "cronPresetMonthly": "Every month (1st)",
"cronPresetWeekly": "Every week (Monday)", "cronPresetWeekly": "Every week (Monday)",
"cronRequired": "Cron expression is required for custom schedules", "cronRequired": "Cron expression is required for custom schedules",
"crontabGuru": "crontab.guru",
"delete": "Delete", "delete": "Delete",
"deleteError": "Failed to delete routine", "deleteError": "Failed to delete routine",
"deleteMessage": "Delete schedule {{name}}? This cannot be undone.", "deleteMessage": "Delete schedule {{name}}? This cannot be undone.",
@@ -4884,6 +5196,7 @@ export default interface Resources {
"globalScope": "Global", "globalScope": "Global",
"globalScopeTitle": "Global scope", "globalScopeTitle": "Global scope",
"globalScoped": "This schedule will be created at global scope.", "globalScoped": "This schedule will be created at global scope.",
"lastLabel": "Last:",
"loadRoutinesError": "Failed to load routines", "loadRoutinesError": "Failed to load routines",
"manualTriggerInfo": "This routine will be triggered manually via the dashboard or API.", "manualTriggerInfo": "This routine will be triggered manually via the dashboard or API.",
"modeAriaLabel": "Execution mode", "modeAriaLabel": "Execution mode",
@@ -4906,6 +5219,7 @@ export default interface Resources {
"newAutomation": "New Automation", "newAutomation": "New Automation",
"newRoutineHeading": "New Routine", "newRoutineHeading": "New Routine",
"newTitle": "New Schedule", "newTitle": "New Schedule",
"nextLabel": "Next:",
"noActiveProject": "No active project. Schedules will be created at global scope.", "noActiveProject": "No active project. Schedules will be created at global scope.",
"noAutomations": "No automations yet", "noAutomations": "No automations yet",
"noStepsEmpty": "No steps added yet. Add a command or AI prompt step to get started.", "noStepsEmpty": "No steps added yet. Add a command or AI prompt step to get started.",
@@ -4936,6 +5250,7 @@ export default interface Resources {
"runNameNow": "Run {{name}} now", "runNameNow": "Run {{name}} now",
"runNow": "Run now", "runNow": "Run now",
"running": "Running…", "running": "Running…",
"runsLabel": "Runs:",
"saveChanges": "Save Changes", "saveChanges": "Save Changes",
"saveStep": "Save Step", "saveStep": "Save Step",
"saving": "Saving…", "saving": "Saving…",
@@ -5015,6 +5330,9 @@ export default interface Resources {
"webhookSecretLabel": "Webhook Secret (optional)", "webhookSecretLabel": "Webhook Secret (optional)",
"webhookSecretPlaceholder": "Optional — leave empty for unauthenticated webhooks" "webhookSecretPlaceholder": "Optional — leave empty for unauthenticated webhooks"
}, },
"scripts": {
"title": "Scripts"
},
"scriptsModal": { "scriptsModal": {
"addScript": "Add Script", "addScript": "Add Script",
"addScriptsHint": "Add scripts to quickly run common commands from the dashboard.", "addScriptsHint": "Add scripts to quickly run common commands from the dashboard.",
@@ -5442,6 +5760,7 @@ export default interface Resources {
"enabling": "Enabling…", "enabling": "Enabling…",
"notConnected": "✗ Not connected", "notConnected": "✗ Not connected",
"probing": "Probing local CLI…", "probing": "Probing local CLI…",
"providerName": "Cursor — via Cursor CLI",
"test": "Test", "test": "Test",
"testing": "Testing…" "testing": "Testing…"
}, },
@@ -5477,6 +5796,7 @@ export default interface Resources {
"githubConnectionFailed": "Connection failed or timed out.", "githubConnectionFailed": "Connection failed or timed out.",
"githubOauthConnected": "GitHub OAuth is connected. You can import issues and track pull requests.", "githubOauthConnected": "GitHub OAuth is connected. You can import issues and track pull requests.",
"githubOauthNotConnected": "GitHub OAuth isn't connected yet. You can set it up in Settings → Authentication, or continue now and connect later.", "githubOauthNotConnected": "GitHub OAuth isn't connected yet. You can set it up in Settings → Authentication, or continue now and connect later.",
"githubProvider": "GitHub",
"githubSkipped": "GitHub was skipped. You can connect anytime from Settings → Authentication.", "githubSkipped": "GitHub was skipped. You can connect anytime from Settings → Authentication.",
"goBackToStep": "Go back to {{label}}", "goBackToStep": "Go back to {{label}}",
"goToDashboard": "Go to Dashboard", "goToDashboard": "Go to Dashboard",
@@ -5736,6 +6056,9 @@ export default interface Resources {
"saving": "Saving…", "saving": "Saving…",
"view": "View" "view": "View"
}, },
"stash": {
"copyReference": "Copy stash reference"
},
"stashRecovery": { "stashRecovery": {
"applied": "Applied", "applied": "Applied",
"apply": "Apply", "apply": "Apply",
@@ -6752,6 +7075,7 @@ export default interface Resources {
"workflowCheck": "Workflow check" "workflowCheck": "Workflow check"
}, },
"terminal": { "terminal": {
"arrowKeysLabel": "Terminal arrow keys",
"clear": "Clear", "clear": "Clear",
"clearTerminal": "Clear terminal", "clearTerminal": "Clear terminal",
"closeTab": "Close tab", "closeTab": "Close tab",
@@ -6999,13 +7323,11 @@ export default interface Resources {
"bannerNotify": "Banner + push notification" "bannerNotify": "Banner + push notification"
}, },
"notifyLabel": "Waiting-on-input notification", "notifyLabel": "Waiting-on-input notification",
"notifyNote": "How you are alerted when the agent pauses waiting for input on this step.", "notifyNote": "How you are alerted when the agent pauses waiting for input on this step."
"tier": { },
"generic": "generic", "collapsePrompt": "Collapse prompt editor",
"hybrid": "hybrid", "editingPrompt": "Editing Prompt",
"native": "native" "expandPrompt": "Expand prompt editor"
}
}
}, },
"workflowFields": { "workflowFields": {
"add": "Add field", "add": "Add field",
@@ -7072,6 +7394,7 @@ export default interface Resources {
"foreachSequential": "Sequential", "foreachSequential": "Sequential",
"foreachShared": "Shared worktree", "foreachShared": "Shared worktree",
"foreachWorktree": "Per-step worktree", "foreachWorktree": "Per-step worktree",
"gateBadge": "gate",
"gateBlocks": "Gate (blocks)", "gateBlocks": "Gate (blocks)",
"gateMode": "Gate mode", "gateMode": "Gate mode",
"insertTemplate": "Insert template {{name}}", "insertTemplate": "Insert template {{name}}",
@@ -7128,6 +7451,7 @@ export default interface Resources {
"startEntryColumn": "Entry column", "startEntryColumn": "Entry column",
"startEntryColumnAuto": "— Auto (first column)", "startEntryColumnAuto": "— Auto (first column)",
"startNote": "The start node marks where a task enters the workflow.", "startNote": "The start node marks where a task enters the workflow.",
"stepBadge": "step",
"stepExecuteLabel": "Step execute", "stepExecuteLabel": "Step execute",
"templateFilterLabel": "Filter templates", "templateFilterLabel": "Filter templates",
"templateFilterPlaceholder": "Filter templates", "templateFilterPlaceholder": "Filter templates",
@@ -7136,6 +7460,7 @@ export default interface Resources {
"templatesFragments": "Fragments", "templatesFragments": "Fragments",
"templatesPluginSteps": "Plugin steps", "templatesPluginSteps": "Plugin steps",
"templatesSection": "Templates", "templatesSection": "Templates",
"timeoutMs": "{{timeout}}ms",
"trivialGraphHint": "This workflow only runs start → end. Add steps from the palette above to build it out." "trivialGraphHint": "This workflow only runs start → end. Add steps from the palette above to build it out."
}, },
"workflowSelector": { "workflowSelector": {
@@ -7197,6 +7522,14 @@ export default interface Resources {
"widget": "Widget", "widget": "Widget",
"widgetDefault": "Default" "widgetDefault": "Default"
}, },
"workflowSwitcher": {
"countsAria": "{{todoLabel}}: {{todo}}, {{inProgressLabel}}: {{inProgress}}, {{doneLabel}}: {{done}}",
"done": "Done",
"inProgress": "In Progress",
"label": "Workflow",
"todo": "Todo",
"triggerAria": "Select workflow. Current workflow: {{name}}"
},
"workflows": { "workflows": {
"aiEdit": "Design with AI", "aiEdit": "Design with AI",
"aiFailed": "Failed to design workflow", "aiFailed": "Failed to design workflow",