FN-6749: rebaseline i18n lint guardrail

Rebaseline the i18n hardcoded-string lint guardrail for shipping dashboard surfaces.

- Add scoped i18n lint ignores for non-shipping tests, stories, and deferred source-copy files with follow-up rationale.
- Localize remaining plugin/view copy and replace technical glyph literals that should not be linted as prose.
- Refresh synced locale catalogs and generated resource types, and document the lint baseline policy.

Files changed:
 .changeset/fn-6749-i18n-lint-rebaseline.md         |    5 +
 docs/i18n-contributing.md                          |   14 +
 i18next.config.ts                                  |   96 ++
 .../dashboard/app/components/AgentDetailView.tsx   |    4 +-
 .../app/components/ConversationHistory.tsx         |    4 +-
 .../app/components/DockerNodeOnboardingModal.tsx   |    8 +-
 .../components/MilestoneSliceInterviewModal.tsx    |    4 +-
 .../app/components/MissionInterviewModal.tsx       |    4 +-
 .../app/components/ModelSelectionModal.tsx         |    4 +-
 .../dashboard/app/components/NodeDetailModal.tsx   |   15 +-
 .../dashboard/app/components/PlanningModeModal.tsx |    4 +-
 .../dashboard/app/components/SessionTerminal.tsx   |   15 +-
 .../app/components/SubtaskBreakdownModal.tsx       |    4 +-
 packages/dashboard/app/components/TaskForm.tsx     |    4 +-
 .../dashboard/app/components/TerminalModal.tsx     |   18 +-
 .../dashboard/app/plugins/pluginViewRegistry.tsx   |    7 +-
 packages/i18n/locales/en/app.json                  |  890 +++++++++---
 packages/i18n/locales/en/common.json               |   82 +-
 packages/i18n/locales/es/app.json                  |  986 ++++++++++---
 packages/i18n/locales/es/common.json               |   82 +-
 packages/i18n/locales/fr/app.json                  |  986 ++++++++++---
 packages/i18n/locales/fr/common.json               |   82 +-
 packages/i18n/locales/ko/app.json                  | 1482 ++++++++++++++------
 packages/i18n/locales/ko/cli.json                  |    8 +-
 packages/i18n/locales/ko/common.json               |   82 +-
 packages/i18n/locales/zh-CN/app.json               | 1482 ++++++++++++++------
 packages/i18n/locales/zh-CN/cli.json               |    8 +-
 packages/i18n/locales/zh-CN/common.json            |   82 +-
 packages/i18n/locales/zh-TW/app.json               | 1482 ++++++++++++++------
 packages/i18n/locales/zh-TW/cli.json               |    8 +-
 packages/i18n/locales/zh-TW/common.json            |   82 +-
 packages/i18n/src/resources.d.ts                   |  459 +++---
 32 files changed, 6055 insertions(+), 2438 deletions(-)

Fusion-Task-Id: FN-6749

Fusion-Task-Lineage: 789a7cbb-fdf8-4190-8cd2-6bf7d5e2d552
This commit is contained in:
gsxdsm
2026-06-19 22:03:41 -07:00
parent dc98c18ef1
commit d4d7623ee0
32 changed files with 6055 additions and 2438 deletions

View File

@@ -0,0 +1,5 @@
---
"@runfusion/fusion": patch
---
Rebaseline the dashboard i18n lint guardrail by excluding non-shipping tests and stories, suppressing technical token categories, localizing plugin missing-view copy, and tracking remaining source-copy deferrals with narrow follow-up tasks.

View File

@@ -31,6 +31,20 @@ pnpm i18n:lint # flag hardcoded user-facing strings
pnpm i18n:gen-cli # regenerate the CLI static catalog import map
```
## Lint baseline policy
`pnpm i18n:lint` is the hardcoded user-facing string guardrail and must stay
green. Its file scope intentionally matches extraction: tests and stories are
excluded because they are non-shipping fixtures and `extract` already ignores
them. Suppress non-translatable token categories with narrow
`lint.ignoredTags` / `lint.ignoredAttributes` entries, such as keyboard-key
content in `<kbd>`, instead of hiding source directories.
Any remaining user-facing copy must be localized with `t()` / `<Trans>` and an
`en` catalog entry. A temporary deferral is only acceptable when it is scoped to
specific files or a small cluster in `lint.ignore`, includes an `FNXC` rationale,
and has a filed follow-up task that removes the ignore.
## Translating an existing language
1. Run `pnpm i18n:sync` so every catalog has the current `en` keys (untranslated

View File

@@ -4,6 +4,94 @@ import {
recommendedAcceptedTags,
} from "i18next-cli";
const DEFERRED_I18N_LINT_FILES = [
// 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.
// 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.
// 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/WorkflowResultsTab.tsx",
"packages/dashboard/app/components/WorkflowNodeEditor.tsx",
"packages/dashboard/app/components/TerminalModal.tsx",
"packages/dashboard/app/components/TaskDetailModal.tsx",
"packages/dashboard/app/components/TaskComments.tsx",
"packages/dashboard/app/components/TaskChatTab.tsx",
"packages/dashboard/app/components/StashConflictModal.tsx",
"packages/dashboard/app/components/SetupWizardModal.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/ProjectSelector.tsx",
"packages/dashboard/app/components/PrPanel.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/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/SchedulingSection.tsx",
"packages/dashboard/app/components/settings/sections/ScheduledEvalsSection.tsx",
"packages/dashboard/app/components/settings/sections/RuntimesSections.tsx",
"packages/dashboard/app/components/settings/sections/ResearchProjectSection.tsx",
"packages/dashboard/app/components/settings/sections/ResearchGlobalSection.tsx",
"packages/dashboard/app/components/settings/sections/RemoteSection.tsx",
"packages/dashboard/app/components/settings/sections/ProjectModelsSection.tsx",
"packages/dashboard/app/components/settings/sections/PluginsSection.tsx",
"packages/dashboard/app/components/settings/sections/NotificationsSection.tsx",
"packages/dashboard/app/components/settings/sections/NodeSyncSection.tsx",
"packages/dashboard/app/components/settings/sections/NodeRoutingSection.tsx",
"packages/dashboard/app/components/settings/sections/MergeSection.tsx",
"packages/dashboard/app/components/settings/sections/MemorySection.tsx",
"packages/dashboard/app/components/settings/sections/GlobalModelsSection.tsx",
"packages/dashboard/app/components/settings/sections/GlobalGeneralSection.tsx",
"packages/dashboard/app/components/settings/sections/GeneralSection.tsx",
"packages/dashboard/app/components/settings/sections/ExperimentalSection.tsx",
"packages/dashboard/app/components/settings/sections/CommandsSection.tsx",
"packages/dashboard/app/components/settings/sections/BackupsSection.tsx",
"packages/dashboard/app/components/settings/sections/AuthenticationSection.tsx",
"packages/dashboard/app/components/settings/sections/AppearanceSection.tsx",
"packages/dashboard/app/components/settings/sections/AgentPermissionsSection.tsx",
] as const;
/**
* i18next-cli workflow config for the whole monorepo.
*
@@ -40,6 +128,14 @@ export default defineConfig({
output: "packages/i18n/src/i18next-resources.d.ts",
},
lint: {
/*
* FNXC:i18n-LintBaseline 2026-06-19-00:00:
* i18n lint must scan the same shipping surfaces as extract so it remains a trusted user-facing-copy guardrail.
* Tests and stories are excluded because they are non-shipping fixtures and extract already excludes test files.
* Keyboard-key glyphs inside <kbd> are technical tokens, not translated prose.
*/
ignore: ["**/__tests__/**", "**/*.test.*", "**/*.stories.*", ...DEFERRED_I18N_LINT_FILES],
ignoredTags: ["kbd"],
acceptedTags: recommendedAcceptedTags,
acceptedAttributes: recommendedAcceptedAttributes,
},

View File

@@ -72,6 +72,8 @@ export function relativeTime(iso: string, t?: (key: string, defaultValue: string
return tr("time.daysAgo", "{{n}}d ago", { n });
}
const WARNING_ICON = "⚠️";
interface AgentDetailViewProps {
agentId: string;
projectId?: string;
@@ -1186,7 +1188,7 @@ function DashboardTab({
<div className="dashboard-tab dashboard-summary-layout">
{budgetStatus?.isOverBudget && (
<div className="budget-warning-banner" role="alert">
<span>⚠️</span>
<span>{WARNING_ICON}</span>
<span><strong>{t("agents.budgetExhaustedTitle", "Budget Exhausted:")}</strong> {t("agents.budgetExhaustedBody", "This agent has exceeded its token budget and may operate with limited functionality.")}</span>
</div>
)}

View File

@@ -5,6 +5,8 @@ import type { PlanningQuestion } from "@fusion/core";
import { useState } from "react";
import type { ConversationHistoryEntry } from "../api";
const COMMENT_ICON = "💬";
interface ConversationHistoryProps {
entries: ConversationHistoryEntry[];
defaultShowThinking?: boolean;
@@ -129,7 +131,7 @@ export function ConversationHistory({ entries, defaultShowThinking = false }: Co
<div className="conversation-entry-response">
<strong>{t("conversation.yourResponse", "Your response")}</strong>
<p>{formattedResponse || "—"}</p>
{comment && <p className="conversation-comment">💬 {comment}</p>}
{comment && <p className="conversation-comment">{COMMENT_ICON} {comment}</p>}
</div>
)}

View File

@@ -32,6 +32,10 @@ interface MountRow {
}
const DEFAULT_URL = "http://localhost:4040";
const DOCKER_MOUNT_MODE_LABELS = {
readWrite: "rw",
readOnly: "ro",
} as const;
export function DockerNodeOnboardingModal({ isOpen, onClose, onSubmit, addToast: _addToast }: DockerNodeOnboardingModalProps) {
const { t } = useTranslation("app");
@@ -477,8 +481,8 @@ export function DockerNodeOnboardingModal({ isOpen, onClose, onSubmit, addToast:
})
}
>
<option value="rw">rw</option>
<option value="ro">ro</option>
<option value="rw">{DOCKER_MOUNT_MODE_LABELS.readWrite}</option>
<option value="ro">{DOCKER_MOUNT_MODE_LABELS.readOnly}</option>
</select>
<button
type="button"

View File

@@ -35,6 +35,8 @@ import { useMobileScrollLock } from "../hooks/useMobileScrollLock";
import { useViewportMode } from "../hooks/useViewportMode";
import { getSessionTabId } from "../utils/getSessionTabId";
const WARNING_ICON = "⚠️";
interface MilestoneSliceInterviewModalProps {
isOpen: boolean;
onClose: () => void;
@@ -575,7 +577,7 @@ export function MilestoneSliceInterviewModal({
)}
<div className="ai-error-panel" role="alert">
<div className="ai-error-icon">⚠️</div>
<div className="ai-error-icon">{WARNING_ICON}</div>
<div className="ai-error-message">{view.errorMessage}</div>
<div className="ai-error-actions">
<button className="btn" onClick={handleCancel}>

View File

@@ -73,6 +73,8 @@ function parseModelSelection(value: string): { provider?: string; modelId?: stri
};
}
const WARNING_ICON = "⚠️";
interface MissionInterviewModalProps {
isOpen: boolean;
onClose: () => void;
@@ -942,7 +944,7 @@ export function MissionInterviewModal({
className="ai-error-panel"
role="alert"
>
<div className="ai-error-icon">⚠️</div>
<div className="ai-error-icon">{WARNING_ICON}</div>
<div className="ai-error-message">{view.errorMessage}</div>
<div className="ai-error-actions">
<button className="btn btn-primary" onClick={() => void handleRetryFromError()} disabled={isRetrying}>

View File

@@ -7,6 +7,8 @@ import { applyPresetToSelection } from "../utils/modelPresets";
import { CustomModelDropdown } from "./CustomModelDropdown";
import { Brain, X } from "lucide-react";
const PRESET_OPTION_SEPARATOR = "──────────";
interface ModelSelectionModalProps {
isOpen: boolean;
onClose: () => void;
@@ -218,7 +220,7 @@ export function ModelSelectionModal({
data-testid="model-selection-preset"
>
<option value="default">{t("modelSelection.useDefault", "Use default")}</option>
{presets!.length > 0 && <option disabled>──────────</option>}
{presets!.length > 0 && <option disabled>{PRESET_OPTION_SEPARATOR}</option>}
{presets!.map((preset) => (
<option key={preset.id} value={preset.id}>{preset.name}</option>
))}

View File

@@ -27,6 +27,13 @@ import { SettingsSyncConflictModal } from "./SettingsSyncConflictModal";
import type { SettingsConflictEntry, ConflictResolutionResult } from "./SettingsSyncConflictModal";
import "./NodeDetailModal.css";
const DOCKER_MOUNT_LABELS = {
readWrite: "rw",
readOnly: "ro",
volume: "volume",
bind: "bind",
} as const;
interface NodeDetailModalProps {
isOpen: boolean;
onClose: () => void;
@@ -614,16 +621,16 @@ export function NodeDetailModal({
next[index] = { ...next[index], mode: event.target.value as "rw" | "ro" };
setDockerConfigDraft({ ...dockerConfigDraft, volumeMounts: next });
}}>
<option value="rw">rw</option>
<option value="ro">ro</option>
<option value="rw">{DOCKER_MOUNT_LABELS.readWrite}</option>
<option value="ro">{DOCKER_MOUNT_LABELS.readOnly}</option>
</select>
<select className="input" value={mount.type ?? "volume"} onChange={(event) => {
const next = [...dockerConfigDraft.volumeMounts];
next[index] = { ...next[index], type: event.target.value as "volume" | "bind" };
setDockerConfigDraft({ ...dockerConfigDraft, volumeMounts: next });
}}>
<option value="volume">volume</option>
<option value="bind">bind</option>
<option value="volume">{DOCKER_MOUNT_LABELS.volume}</option>
<option value="bind">{DOCKER_MOUNT_LABELS.bind}</option>
</select>
<button className="btn btn-sm" onClick={() => setDockerConfigDraft({ ...dockerConfigDraft, volumeMounts: dockerConfigDraft.volumeMounts.filter((_, i: number) => i !== index) })}>{t("nodes.removeButton", "Remove")}</button>
</div>

View File

@@ -57,6 +57,8 @@ import { useAutosizeTextarea } from "../hooks/useAutosizeTextarea";
import { useToast } from "../hooks/useToast";
import { getSessionTabId } from "../utils/getSessionTabId";
const WARNING_ICON = "⚠️";
interface PlanningModeModalProps {
isOpen: boolean;
onClose: () => void;
@@ -2106,7 +2108,7 @@ export function PlanningModeModal({ isOpen, onClose, onTaskCreated, onTasksCreat
className="ai-error-panel"
role="alert"
>
<div className="ai-error-icon">⚠️</div>
<div className="ai-error-icon">{WARNING_ICON}</div>
<div className="ai-error-message">{view.errorMessage}</div>
<div className="ai-error-actions">
<button className="btn btn-primary" onClick={() => void handleRetryFromError()} disabled={isRetrying}>

View File

@@ -49,6 +49,13 @@ const SEQ_ARROW_DOWN = "\x1b[B"; // CSI B
const SEQ_ARROW_RIGHT = "\x1b[C"; // CSI C
const SEQ_ARROW_LEFT = "\x1b[D"; // CSI D
const CLI_TERMINAL_KEY_LABELS = {
ctrl: "Ctrl",
escape: "Esc",
tab: "Tab",
ctrlC: "^C",
} as const;
/**
* Resolve the control byte for a sticky-Ctrl + key combination. Ctrl maps a
* letter to its control code (A→0x01 … Z→0x1A): code = (toUpper(ch) & 0x1f).
@@ -700,7 +707,7 @@ export function SessionTerminal({
onMouseDown={keepFocus}
onClick={() => setCtrlSticky((v) => !v)}
>
Ctrl
{CLI_TERMINAL_KEY_LABELS.ctrl}
</button>
<button
type="button"
@@ -711,7 +718,7 @@ export function SessionTerminal({
onMouseDown={keepFocus}
onClick={() => emitBarKey(SEQ_ESC)}
>
Esc
{CLI_TERMINAL_KEY_LABELS.escape}
</button>
<button
type="button"
@@ -722,7 +729,7 @@ export function SessionTerminal({
onMouseDown={keepFocus}
onClick={() => emitBarKey(SEQ_TAB)}
>
Tab
{CLI_TERMINAL_KEY_LABELS.tab}
</button>
<button
type="button"
@@ -737,7 +744,7 @@ export function SessionTerminal({
sendInput(SEQ_CTRL_C);
}}
>
^C
{CLI_TERMINAL_KEY_LABELS.ctrlC}
</button>
<button
type="button"

View File

@@ -27,6 +27,8 @@ import { useMobileScrollLock } from "../hooks/useMobileScrollLock";
import { useViewportMode } from "../hooks/useViewportMode";
import { getSessionTabId } from "../utils/getSessionTabId";
const WARNING_ICON = "⚠️";
interface SubtaskBreakdownModalProps {
isOpen: boolean;
onClose: () => void;
@@ -718,7 +720,7 @@ export function SubtaskBreakdownModal({ isOpen, onClose, initialDescription, onT
className="ai-error-panel"
role="alert"
>
<div className="ai-error-icon">⚠️</div>
<div className="ai-error-icon">{WARNING_ICON}</div>
<div className="ai-error-message">{view.errorMessage}</div>
<div className="ai-error-actions">
<button className="btn btn-primary" onClick={() => void handleRetry()} disabled={isRetrying}>

View File

@@ -48,6 +48,8 @@ export interface PendingImage {
type TaskExecutionModeSelection = "standard" | "fast";
export type BranchSelectionMode = "project-default" | "auto-new" | "existing" | "custom-new" | "shared-group";
const PRESET_OPTION_SEPARATOR = "──────────";
export interface TaskFormProps {
mode: "create" | "edit";
@@ -1140,7 +1142,7 @@ export function TaskForm({
disabled={disabled}
>
<option value="default">{t("taskForm.presetUseDefault", "Use default")}</option>
{availablePresets.length > 0 ? <option disabled>──────────</option> : null}
{availablePresets.length > 0 ? <option disabled>{PRESET_OPTION_SEPARATOR}</option> : null}
{availablePresets.map((preset) => (
<option key={preset.id} value={preset.id}>{preset.name}</option>
))}

View File

@@ -49,6 +49,14 @@ const XTERM_INIT_TIMEOUT_MS = 10000;
const XTERM_IMPORT_RETRY_DELAYS_MS = [500, 1500, 3000] as const;
const TERMINAL_KEY_LABELS = {
ctrl: "Ctrl",
alt: "Alt",
escape: "ESC",
tab: "Tab",
pxUnit: "px",
} as const;
export function ctrlChar(key: string): string {
if (!key) {
return "";
@@ -1588,7 +1596,7 @@ export function TerminalModal({ isOpen, onClose, initialCommand, initialCommandG
onClick={() => toggleModifier("ctrl")}
aria-pressed={stickyModifier === "ctrl"}
>
Ctrl
{TERMINAL_KEY_LABELS.ctrl}
</button>
<button
type="button"
@@ -1602,7 +1610,7 @@ export function TerminalModal({ isOpen, onClose, initialCommand, initialCommandG
onClick={() => toggleModifier("alt")}
aria-pressed={stickyModifier === "alt"}
>
Alt
{TERMINAL_KEY_LABELS.alt}
</button>
<button
type="button"
@@ -1612,7 +1620,7 @@ export function TerminalModal({ isOpen, onClose, initialCommand, initialCommandG
onTouchStart={preserveShortcutFocus}
onClick={() => sendLiteralShortcut("\x1b")}
>
ESC
{TERMINAL_KEY_LABELS.escape}
</button>
<button
type="button"
@@ -1622,7 +1630,7 @@ export function TerminalModal({ isOpen, onClose, initialCommand, initialCommandG
onTouchStart={preserveShortcutFocus}
onClick={() => sendLiteralShortcut("\t")}
>
Tab
{TERMINAL_KEY_LABELS.tab}
</button>
</div>
{/*
@@ -1780,7 +1788,7 @@ export function TerminalModal({ isOpen, onClose, initialCommand, initialCommandG
<Minus size={14} />
</button>
<span className="terminal-font-size-value" data-testid="terminal-font-size-value">
{fontSize}px
{fontSize}{TERMINAL_KEY_LABELS.pxUnit}
</span>
<button
type="button"

View File

@@ -1,6 +1,7 @@
import type { PluginDashboardViewContext } from "./types";
import { AlertTriangle } from "lucide-react";
import { lazy, Suspense, type LazyExoticComponent, type ReactElement, type ReactNode } from "react";
import { useTranslation } from "react-i18next";
import { ErrorBoundary } from "../components/ErrorBoundary";
import "./pluginViewRegistry.css";
@@ -47,14 +48,16 @@ export function __test_clearPluginViewRegistry(): void {
}
function PluginViewUnavailable({ viewId }: { viewId: string }): ReactNode {
const { t } = useTranslation("app");
return (
<section className="card plugin-dashboard-view-missing" data-testid="plugin-view-unavailable">
<h2 className="plugin-dashboard-view-missing-title">
<AlertTriangle />
Plugin view unavailable
{t("plugins.viewUnavailable", "Plugin view unavailable")}
</h2>
<p className="plugin-dashboard-view-missing-description">
No host registration found for <code>{viewId}</code>.
{t("plugins.noHostRegistration", "No host registration found for")} <code>{viewId}</code>.
</p>
</section>
);

File diff suppressed because it is too large Load Diff

View File

@@ -1,9 +1,4 @@
{
"actions": {
"cancel": "Cancel",
"close": "Close",
"save": "Save"
},
"agents": {
"ratings": {
"trendDeclining": "↓ Declining",
@@ -34,7 +29,6 @@
"minutesAgo_other": "{{count}}m ago"
}
},
"archive": "Archive",
"board": {
"rejection": {
"capacityExhausted": "That column is at capacity. Try again when a slot frees up.",
@@ -44,7 +38,6 @@
"workflowMismatch": "Drag can't move a card between workflows. Use the workflow switcher instead."
}
},
"cancel": "Cancel",
"chat": {
"failedToGetResponse": "Failed to get response",
"failureReferenceId": "ID",
@@ -54,25 +47,23 @@
"openMailboxMessage": "Open mailbox message",
"toolCallArgsPrefix": "args",
"toolCallResultPrefix": "result",
"toolCallsCount_one": "{{count}} tool calls",
"toolCallsCount_other": "{{count}} tool calls",
"toolCallsHeader": "Tool calls",
"toolCallStatusCompleted": "completed",
"toolCallStatusError": "error",
"toolCallStatusErrors": "errors",
"toolCallStatusRunning": "running",
"toolCallsCount_one": "{{count}} tool calls",
"toolCallsCount_other": "{{count}} tool calls",
"toolCallsHeader": "Tool calls",
"viewFailureDetails": "View failure details"
},
"close": "Close",
"columns": {
"archived": "Archived",
"done": "Done",
"in-progress": "In Progress",
"in-review": "In Review",
"todo": "Todo",
"triage": "Planning"
"commandCenter": {
"range": {
"allTime": "All time",
"last24h": "Last 24h",
"last30d": "Last 30 days",
"last7d": "Last 7 days"
}
},
"delete": "Delete",
"health": {
"anomaly": {
"duplicateActiveId": "Duplicate active task ID",
@@ -110,13 +101,6 @@
"modelSetToDefault": "{{label}} model set to default"
}
},
"nodeStatus": {
"connecting": "Connecting",
"error": "Error",
"offline": "Offline",
"online": "Online",
"unknown": "Unknown"
},
"nodes": {
"auth": {
"differ": "Auth credentials differ",
@@ -137,7 +121,13 @@
"stopped": "Stopped"
}
},
"refresh": "Refresh",
"nodeStatus": {
"connecting": "Connecting",
"error": "Error",
"offline": "Offline",
"online": "Online",
"unknown": "Unknown"
},
"research": {
"providerGitHub": "GitHub",
"providerLlmSynthesis": "LLM Synthesis",
@@ -145,7 +135,6 @@
"providerPageFetch": "Page Fetch",
"providerWebSearch": "Web Search"
},
"retry": "Retry",
"routing": {
"policyLabel": {
"block": "Block execution",
@@ -205,14 +194,11 @@
"zai": "GLM models by Zhipu AI — strong multilingual support"
}
},
"skip": "Skip",
"taskForm": {
"nodeStatusConnecting": "Connecting",
"nodeStatusError": "Error",
"nodeStatusOffline": "Offline",
"nodeStatusOnline": "Online",
"phasePostMerge": "Post-merge",
"phasePreMerge": "Pre-merge"
"nodeStatusOnline": "Online"
},
"taskReview": {
"never": "Never",
@@ -220,8 +206,19 @@
"refreshSourceInitialLoad": "Initial load",
"refreshSourceManual": "Manual"
},
"tryAgain": "Try Again",
"workflow": {
"aggregateAllPassed": "All passed",
"aggregateInProgress": "In progress",
"aggregateNoResults": "No results",
"customWorkflowFallback": "Custom workflow",
"defaultWorkflow": "Default",
"executionAwaitingCliApproval": "Awaiting CLI approval",
"executionAwaitingInput": "Awaiting input",
"executionCompleted": "Completed",
"executionNotStarted": "Not started",
"executionPaused": "Paused",
"executionPostMerge": "Post-merge steps running",
"executionPreMerge": "Pre-merge steps running",
"postMerge": "Post-merge",
"preMerge": "Pre-merge",
"statusAdvisory": "Advisory failure",
@@ -230,5 +227,24 @@
"statusRunning": "Running…",
"statusSkipped": "Skipped",
"waitingForOutput": "Waiting for agent output…"
},
"workflowNodes": {
"summaryAwaitInput": "Waits for user input",
"summaryCodeDefault": "TypeScript",
"summaryGateAdvisory": "Advisory",
"summaryGateBlocks": "Gate (blocks)",
"summaryHoldRelease": "Release: {{release}}",
"summaryLoopIterations_one": "{{count}}x",
"summaryLoopIterations_other": "{{count}}x",
"summaryLoopUntilContains": "until contains \"{{value}}\"",
"summaryLoopUntilMatches": "until matches /{{pattern}}/",
"summaryNotConfigured": "Not configured",
"summaryReviewType": "{{type}} review",
"summarySeamExecute": "Execute (engine)",
"summarySeamMerge": "Merge boundary",
"summarySeamPlanning": "Plan (engine)",
"summarySeamReview": "Review (engine)",
"summarySeamStepExecute": "Step execute (engine)",
"summarySeamUnknown": "Seam: {{seam}}"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,9 +1,4 @@
{
"actions": {
"cancel": "Cancelar",
"close": "Cerrar",
"save": "Guardar"
},
"agents": {
"ratings": {
"trendDeclining": "",
@@ -34,7 +29,6 @@
"minutesAgo_other": ""
}
},
"archive": "Archivar",
"board": {
"rejection": {
"capacityExhausted": "",
@@ -44,7 +38,6 @@
"workflowMismatch": ""
}
},
"cancel": "Cancelar",
"chat": {
"failedToGetResponse": "",
"failureReferenceId": "",
@@ -54,25 +47,23 @@
"openMailboxMessage": "",
"toolCallArgsPrefix": "",
"toolCallResultPrefix": "",
"toolCallsCount_one": "",
"toolCallsCount_other": "",
"toolCallsHeader": "",
"toolCallStatusCompleted": "",
"toolCallStatusError": "",
"toolCallStatusErrors": "",
"toolCallStatusRunning": "",
"toolCallsCount_one": "",
"toolCallsCount_other": "",
"toolCallsHeader": "",
"viewFailureDetails": ""
},
"close": "Cerrar",
"columns": {
"archived": "Archivado",
"done": "Hecho",
"in-progress": "En progreso",
"in-review": "En revisión",
"todo": "Por hacer",
"triage": "Planificación"
"commandCenter": {
"range": {
"allTime": "",
"last24h": "",
"last30d": "",
"last7d": ""
}
},
"delete": "Eliminar",
"health": {
"anomaly": {
"duplicateActiveId": "",
@@ -110,13 +101,6 @@
"modelSetToDefault": ""
}
},
"nodeStatus": {
"connecting": "",
"error": "",
"offline": "",
"online": "",
"unknown": ""
},
"nodes": {
"auth": {
"differ": "",
@@ -137,7 +121,13 @@
"stopped": ""
}
},
"refresh": "Actualizar",
"nodeStatus": {
"connecting": "",
"error": "",
"offline": "",
"online": "",
"unknown": ""
},
"research": {
"providerGitHub": "",
"providerLlmSynthesis": "",
@@ -145,7 +135,6 @@
"providerPageFetch": "",
"providerWebSearch": ""
},
"retry": "Reintentar",
"routing": {
"policyLabel": {
"block": "",
@@ -205,14 +194,11 @@
"zai": ""
}
},
"skip": "Omitir",
"taskForm": {
"nodeStatusConnecting": "",
"nodeStatusError": "",
"nodeStatusOffline": "",
"nodeStatusOnline": "",
"phasePostMerge": "",
"phasePreMerge": ""
"nodeStatusOnline": ""
},
"taskReview": {
"never": "",
@@ -220,8 +206,19 @@
"refreshSourceInitialLoad": "",
"refreshSourceManual": ""
},
"tryAgain": "Reintentar",
"workflow": {
"aggregateAllPassed": "",
"aggregateInProgress": "",
"aggregateNoResults": "",
"customWorkflowFallback": "",
"defaultWorkflow": "",
"executionAwaitingCliApproval": "",
"executionAwaitingInput": "",
"executionCompleted": "",
"executionNotStarted": "",
"executionPaused": "",
"executionPostMerge": "",
"executionPreMerge": "",
"postMerge": "",
"preMerge": "",
"statusAdvisory": "",
@@ -230,5 +227,24 @@
"statusRunning": "",
"statusSkipped": "",
"waitingForOutput": ""
},
"workflowNodes": {
"summaryAwaitInput": "",
"summaryCodeDefault": "",
"summaryGateAdvisory": "",
"summaryGateBlocks": "",
"summaryHoldRelease": "",
"summaryLoopIterations_one": "",
"summaryLoopIterations_other": "",
"summaryLoopUntilContains": "",
"summaryLoopUntilMatches": "",
"summaryNotConfigured": "",
"summaryReviewType": "",
"summarySeamExecute": "",
"summarySeamMerge": "",
"summarySeamPlanning": "",
"summarySeamReview": "",
"summarySeamStepExecute": "",
"summarySeamUnknown": ""
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,9 +1,4 @@
{
"actions": {
"cancel": "Annuler",
"close": "Fermer",
"save": "Enregistrer"
},
"agents": {
"ratings": {
"trendDeclining": "",
@@ -34,7 +29,6 @@
"minutesAgo_other": ""
}
},
"archive": "Archiver",
"board": {
"rejection": {
"capacityExhausted": "",
@@ -44,7 +38,6 @@
"workflowMismatch": ""
}
},
"cancel": "Annuler",
"chat": {
"failedToGetResponse": "",
"failureReferenceId": "",
@@ -54,25 +47,23 @@
"openMailboxMessage": "",
"toolCallArgsPrefix": "",
"toolCallResultPrefix": "",
"toolCallsCount_one": "",
"toolCallsCount_other": "",
"toolCallsHeader": "",
"toolCallStatusCompleted": "",
"toolCallStatusError": "",
"toolCallStatusErrors": "",
"toolCallStatusRunning": "",
"toolCallsCount_one": "",
"toolCallsCount_other": "",
"toolCallsHeader": "",
"viewFailureDetails": ""
},
"close": "Fermer",
"columns": {
"archived": "Archivé",
"done": "Terminé",
"in-progress": "En cours",
"in-review": "En revue",
"todo": "À faire",
"triage": "Planification"
"commandCenter": {
"range": {
"allTime": "",
"last24h": "",
"last30d": "",
"last7d": ""
}
},
"delete": "Supprimer",
"health": {
"anomaly": {
"duplicateActiveId": "",
@@ -110,13 +101,6 @@
"modelSetToDefault": ""
}
},
"nodeStatus": {
"connecting": "",
"error": "",
"offline": "",
"online": "",
"unknown": ""
},
"nodes": {
"auth": {
"differ": "",
@@ -137,7 +121,13 @@
"stopped": ""
}
},
"refresh": "Actualiser",
"nodeStatus": {
"connecting": "",
"error": "",
"offline": "",
"online": "",
"unknown": ""
},
"research": {
"providerGitHub": "",
"providerLlmSynthesis": "",
@@ -145,7 +135,6 @@
"providerPageFetch": "",
"providerWebSearch": ""
},
"retry": "Réessayer",
"routing": {
"policyLabel": {
"block": "",
@@ -205,14 +194,11 @@
"zai": ""
}
},
"skip": "Ignorer",
"taskForm": {
"nodeStatusConnecting": "",
"nodeStatusError": "",
"nodeStatusOffline": "",
"nodeStatusOnline": "",
"phasePostMerge": "",
"phasePreMerge": ""
"nodeStatusOnline": ""
},
"taskReview": {
"never": "",
@@ -220,8 +206,19 @@
"refreshSourceInitialLoad": "",
"refreshSourceManual": ""
},
"tryAgain": "Réessayer",
"workflow": {
"aggregateAllPassed": "",
"aggregateInProgress": "",
"aggregateNoResults": "",
"customWorkflowFallback": "",
"defaultWorkflow": "",
"executionAwaitingCliApproval": "",
"executionAwaitingInput": "",
"executionCompleted": "",
"executionNotStarted": "",
"executionPaused": "",
"executionPostMerge": "",
"executionPreMerge": "",
"postMerge": "",
"preMerge": "",
"statusAdvisory": "",
@@ -230,5 +227,24 @@
"statusRunning": "",
"statusSkipped": "",
"waitingForOutput": ""
},
"workflowNodes": {
"summaryAwaitInput": "",
"summaryCodeDefault": "",
"summaryGateAdvisory": "",
"summaryGateBlocks": "",
"summaryHoldRelease": "",
"summaryLoopIterations_one": "",
"summaryLoopIterations_other": "",
"summaryLoopUntilContains": "",
"summaryLoopUntilMatches": "",
"summaryNotConfigured": "",
"summaryReviewType": "",
"summarySeamExecute": "",
"summarySeamMerge": "",
"summarySeamPlanning": "",
"summarySeamReview": "",
"summarySeamStepExecute": "",
"summarySeamUnknown": ""
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -21,6 +21,7 @@
"agentRunLogsBackHint": "[Esc/q] 실행 목록으로 돌아가기",
"agentRunLogsTitle": "실행 로그 ({{index}})",
"agentsFooterHints": "[s] 시작 [x] 중지 [D] 삭제 [r] 새로고침 [Tab] 포커스 ↑↓ 선택",
"agentsListTitle_one": "",
"agentsListTitle_other": "",
"agentsNoAgents": "에이전트가 없습니다.",
"agentStarted": "에이전트 시작됨",
@@ -44,6 +45,7 @@
"filesEmpty": "(비어 있음)",
"filesEmptyFile": "(빈 파일)",
"filesFooterHints": "[Tab] 창 전환 [↑↓/jk] 이동 [Enter] 열기 [←/→] 접기/펼치기 [.] 숨김 [w] 줄 바꿈 [p] 프로젝트 [r] 새로고침",
"filesMoreLines_one": "",
"filesMoreLines_other": "",
"filesSelectProject": "프로젝트 선택",
"filesSelectToPreview": "미리볼 파일을 선택하세요",
@@ -151,6 +153,7 @@
"settingsFooterHints": "[Tab] 패널 전환 ↑↓ 설정 선택 [Space] 불리언 토글 [+/-] 숫자 조정 [←/→] 열거형 순환 [C/V/X/P/L/U/K/R] 원격 작업",
"settingsInteractivePanelTitle": "설정",
"settingsLoadingSettings": "설정 불러오는 중…",
"settingsMoreModels_one": "",
"settingsMoreModels_other": "",
"settingsPanelTitle": "설정",
"settingsPersistentTokenRegenerated": "영구 토큰이 재생성됨",
@@ -218,9 +221,6 @@
"utilitiesKillVitest": "Vitest 프로세스 종료",
"utilitiesPanelTitle": "유틸리티",
"utilitiesRefreshStats": "통계 새로고침",
"utilitiesToggleEnginePause": "엔진 일시 정지 전환",
"agentsListTitle_one": "",
"filesMoreLines_one": "",
"settingsMoreModels_one": ""
"utilitiesToggleEnginePause": "엔진 일시 정지 전환"
}
}

View File

@@ -1,9 +1,4 @@
{
"actions": {
"cancel": "취소",
"close": "닫기",
"save": "저장"
},
"agents": {
"ratings": {
"trendDeclining": "",
@@ -34,7 +29,6 @@
"minutesAgo_other": ""
}
},
"archive": "보관",
"board": {
"rejection": {
"capacityExhausted": "",
@@ -44,7 +38,6 @@
"workflowMismatch": ""
}
},
"cancel": "취소",
"chat": {
"failedToGetResponse": "",
"failureReferenceId": "",
@@ -54,25 +47,23 @@
"openMailboxMessage": "",
"toolCallArgsPrefix": "",
"toolCallResultPrefix": "",
"toolCallsCount_one": "",
"toolCallsCount_other": "",
"toolCallsHeader": "",
"toolCallStatusCompleted": "",
"toolCallStatusError": "",
"toolCallStatusErrors": "",
"toolCallStatusRunning": "",
"toolCallsCount_one": "",
"toolCallsCount_other": "",
"toolCallsHeader": "",
"viewFailureDetails": ""
},
"close": "닫기",
"columns": {
"archived": "보관됨",
"done": "완료",
"in-progress": "진행 중",
"in-review": "검토 중",
"todo": "할 일",
"triage": "계획"
"commandCenter": {
"range": {
"allTime": "",
"last24h": "",
"last30d": "",
"last7d": ""
}
},
"delete": "삭제",
"health": {
"anomaly": {
"duplicateActiveId": "",
@@ -110,13 +101,6 @@
"modelSetToDefault": ""
}
},
"nodeStatus": {
"connecting": "",
"error": "",
"offline": "",
"online": "",
"unknown": ""
},
"nodes": {
"auth": {
"differ": "",
@@ -137,7 +121,13 @@
"stopped": ""
}
},
"refresh": "새로고침",
"nodeStatus": {
"connecting": "",
"error": "",
"offline": "",
"online": "",
"unknown": ""
},
"research": {
"providerGitHub": "",
"providerLlmSynthesis": "",
@@ -145,7 +135,6 @@
"providerPageFetch": "",
"providerWebSearch": ""
},
"retry": "재시도",
"routing": {
"policyLabel": {
"block": "",
@@ -205,14 +194,11 @@
"zai": ""
}
},
"skip": "건너뛰기",
"taskForm": {
"nodeStatusConnecting": "",
"nodeStatusError": "",
"nodeStatusOffline": "",
"nodeStatusOnline": "",
"phasePostMerge": "",
"phasePreMerge": ""
"nodeStatusOnline": ""
},
"taskReview": {
"never": "",
@@ -220,8 +206,19 @@
"refreshSourceInitialLoad": "",
"refreshSourceManual": ""
},
"tryAgain": "다시 시도",
"workflow": {
"aggregateAllPassed": "",
"aggregateInProgress": "",
"aggregateNoResults": "",
"customWorkflowFallback": "",
"defaultWorkflow": "",
"executionAwaitingCliApproval": "",
"executionAwaitingInput": "",
"executionCompleted": "",
"executionNotStarted": "",
"executionPaused": "",
"executionPostMerge": "",
"executionPreMerge": "",
"postMerge": "",
"preMerge": "",
"statusAdvisory": "",
@@ -230,5 +227,24 @@
"statusRunning": "",
"statusSkipped": "",
"waitingForOutput": ""
},
"workflowNodes": {
"summaryAwaitInput": "",
"summaryCodeDefault": "",
"summaryGateAdvisory": "",
"summaryGateBlocks": "",
"summaryHoldRelease": "",
"summaryLoopIterations_one": "",
"summaryLoopIterations_other": "",
"summaryLoopUntilContains": "",
"summaryLoopUntilMatches": "",
"summaryNotConfigured": "",
"summaryReviewType": "",
"summarySeamExecute": "",
"summarySeamMerge": "",
"summarySeamPlanning": "",
"summarySeamReview": "",
"summarySeamStepExecute": "",
"summarySeamUnknown": ""
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -21,6 +21,7 @@
"agentRunLogsBackHint": "[Esc/q] 返回运行列表",
"agentRunLogsTitle": "运行日志({{index}})",
"agentsFooterHints": "[s] 启动 [x] 停止 [D] 删除 [r] 刷新 [Tab] 焦点 ↑↓ 选择",
"agentsListTitle_one": "",
"agentsListTitle_other": "",
"agentsNoAgents": "未找到代理。",
"agentStarted": "代理已启动",
@@ -44,6 +45,7 @@
"filesEmpty": "(空)",
"filesEmptyFile": "(空文件)",
"filesFooterHints": "[Tab] 切换面板 [↑↓/jk] 移动 [Enter] 打开 [←/→] 折叠/展开 [.] 隐藏文件 [w] 换行 [p] 项目 [r] 重载",
"filesMoreLines_one": "",
"filesMoreLines_other": "",
"filesSelectProject": "选择项目",
"filesSelectToPreview": "选择文件以预览",
@@ -151,6 +153,7 @@
"settingsFooterHints": "[Tab] 切换面板 ↑↓ 选择设置 [Space] 切换布尔 [+/-] 调整数值 [←/→] 循环枚举 [C/V/X/P/L/U/K/R] 远程操作",
"settingsInteractivePanelTitle": "设置",
"settingsLoadingSettings": "正在加载设置…",
"settingsMoreModels_one": "",
"settingsMoreModels_other": "",
"settingsPanelTitle": "设置",
"settingsPersistentTokenRegenerated": "持久令牌已重新生成",
@@ -218,9 +221,6 @@
"utilitiesKillVitest": "终止 Vitest 进程",
"utilitiesPanelTitle": "工具",
"utilitiesRefreshStats": "刷新统计",
"utilitiesToggleEnginePause": "切换引擎暂停",
"agentsListTitle_one": "",
"filesMoreLines_one": "",
"settingsMoreModels_one": ""
"utilitiesToggleEnginePause": "切换引擎暂停"
}
}

View File

@@ -1,9 +1,4 @@
{
"actions": {
"cancel": "取消",
"close": "关闭",
"save": "保存"
},
"agents": {
"ratings": {
"trendDeclining": "",
@@ -34,7 +29,6 @@
"minutesAgo_other": ""
}
},
"archive": "归档",
"board": {
"rejection": {
"capacityExhausted": "",
@@ -44,7 +38,6 @@
"workflowMismatch": ""
}
},
"cancel": "取消",
"chat": {
"failedToGetResponse": "",
"failureReferenceId": "",
@@ -54,25 +47,23 @@
"openMailboxMessage": "",
"toolCallArgsPrefix": "",
"toolCallResultPrefix": "",
"toolCallsCount_one": "",
"toolCallsCount_other": "",
"toolCallsHeader": "",
"toolCallStatusCompleted": "",
"toolCallStatusError": "",
"toolCallStatusErrors": "",
"toolCallStatusRunning": "",
"toolCallsCount_one": "",
"toolCallsCount_other": "",
"toolCallsHeader": "",
"viewFailureDetails": ""
},
"close": "关闭",
"columns": {
"archived": "已归档",
"done": "已完成",
"in-progress": "进行中",
"in-review": "审核中",
"todo": "待办",
"triage": "规划"
"commandCenter": {
"range": {
"allTime": "",
"last24h": "",
"last30d": "",
"last7d": ""
}
},
"delete": "删除",
"health": {
"anomaly": {
"duplicateActiveId": "",
@@ -110,13 +101,6 @@
"modelSetToDefault": ""
}
},
"nodeStatus": {
"connecting": "",
"error": "",
"offline": "",
"online": "",
"unknown": ""
},
"nodes": {
"auth": {
"differ": "",
@@ -137,7 +121,13 @@
"stopped": ""
}
},
"refresh": "刷新",
"nodeStatus": {
"connecting": "",
"error": "",
"offline": "",
"online": "",
"unknown": ""
},
"research": {
"providerGitHub": "",
"providerLlmSynthesis": "",
@@ -145,7 +135,6 @@
"providerPageFetch": "",
"providerWebSearch": ""
},
"retry": "重试",
"routing": {
"policyLabel": {
"block": "",
@@ -205,14 +194,11 @@
"zai": ""
}
},
"skip": "跳过",
"taskForm": {
"nodeStatusConnecting": "",
"nodeStatusError": "",
"nodeStatusOffline": "",
"nodeStatusOnline": "",
"phasePostMerge": "",
"phasePreMerge": ""
"nodeStatusOnline": ""
},
"taskReview": {
"never": "",
@@ -220,8 +206,19 @@
"refreshSourceInitialLoad": "",
"refreshSourceManual": ""
},
"tryAgain": "重试",
"workflow": {
"aggregateAllPassed": "",
"aggregateInProgress": "",
"aggregateNoResults": "",
"customWorkflowFallback": "",
"defaultWorkflow": "",
"executionAwaitingCliApproval": "",
"executionAwaitingInput": "",
"executionCompleted": "",
"executionNotStarted": "",
"executionPaused": "",
"executionPostMerge": "",
"executionPreMerge": "",
"postMerge": "",
"preMerge": "",
"statusAdvisory": "",
@@ -230,5 +227,24 @@
"statusRunning": "",
"statusSkipped": "",
"waitingForOutput": ""
},
"workflowNodes": {
"summaryAwaitInput": "",
"summaryCodeDefault": "",
"summaryGateAdvisory": "",
"summaryGateBlocks": "",
"summaryHoldRelease": "",
"summaryLoopIterations_one": "",
"summaryLoopIterations_other": "",
"summaryLoopUntilContains": "",
"summaryLoopUntilMatches": "",
"summaryNotConfigured": "",
"summaryReviewType": "",
"summarySeamExecute": "",
"summarySeamMerge": "",
"summarySeamPlanning": "",
"summarySeamReview": "",
"summarySeamStepExecute": "",
"summarySeamUnknown": ""
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -21,6 +21,7 @@
"agentRunLogsBackHint": "[Esc/q] 返回執行列表",
"agentRunLogsTitle": "執行日誌({{index}})",
"agentsFooterHints": "[s] 啟動 [x] 停止 [D] 刪除 [r] 重新整理 [Tab] 焦點 ↑↓ 選擇",
"agentsListTitle_one": "",
"agentsListTitle_other": "",
"agentsNoAgents": "找不到代理。",
"agentStarted": "代理已啟動",
@@ -44,6 +45,7 @@
"filesEmpty": "(空)",
"filesEmptyFile": "(空檔案)",
"filesFooterHints": "[Tab] 切換面板 [↑↓/jk] 移動 [Enter] 開啟 [←/→] 折疊/展開 [.] 隱藏檔案 [w] 換行 [p] 專案 [r] 重新載入",
"filesMoreLines_one": "",
"filesMoreLines_other": "",
"filesSelectProject": "選擇專案",
"filesSelectToPreview": "選擇檔案以預覽",
@@ -151,6 +153,7 @@
"settingsFooterHints": "[Tab] 切換面板 ↑↓ 選擇設定 [Space] 切換布林 [+/-] 調整數值 [←/→] 循環枚舉 [C/V/X/P/L/U/K/R] 遠端操作",
"settingsInteractivePanelTitle": "設定",
"settingsLoadingSettings": "正在載入設定…",
"settingsMoreModels_one": "",
"settingsMoreModels_other": "",
"settingsPanelTitle": "設定",
"settingsPersistentTokenRegenerated": "持久金鑰已重新產生",
@@ -218,9 +221,6 @@
"utilitiesKillVitest": "終止 Vitest 行程",
"utilitiesPanelTitle": "工具",
"utilitiesRefreshStats": "重新整理統計",
"utilitiesToggleEnginePause": "切換引擎暫停",
"agentsListTitle_one": "",
"filesMoreLines_one": "",
"settingsMoreModels_one": ""
"utilitiesToggleEnginePause": "切換引擎暫停"
}
}

View File

@@ -1,9 +1,4 @@
{
"actions": {
"cancel": "取消",
"close": "關閉",
"save": "儲存"
},
"agents": {
"ratings": {
"trendDeclining": "",
@@ -34,7 +29,6 @@
"minutesAgo_other": ""
}
},
"archive": "封存",
"board": {
"rejection": {
"capacityExhausted": "",
@@ -44,7 +38,6 @@
"workflowMismatch": ""
}
},
"cancel": "取消",
"chat": {
"failedToGetResponse": "",
"failureReferenceId": "",
@@ -54,25 +47,23 @@
"openMailboxMessage": "",
"toolCallArgsPrefix": "",
"toolCallResultPrefix": "",
"toolCallsCount_one": "",
"toolCallsCount_other": "",
"toolCallsHeader": "",
"toolCallStatusCompleted": "",
"toolCallStatusError": "",
"toolCallStatusErrors": "",
"toolCallStatusRunning": "",
"toolCallsCount_one": "",
"toolCallsCount_other": "",
"toolCallsHeader": "",
"viewFailureDetails": ""
},
"close": "關閉",
"columns": {
"archived": "已封存",
"done": "已完成",
"in-progress": "進行中",
"in-review": "審查中",
"todo": "待辦",
"triage": "規劃"
"commandCenter": {
"range": {
"allTime": "",
"last24h": "",
"last30d": "",
"last7d": ""
}
},
"delete": "刪除",
"health": {
"anomaly": {
"duplicateActiveId": "",
@@ -110,13 +101,6 @@
"modelSetToDefault": ""
}
},
"nodeStatus": {
"connecting": "",
"error": "",
"offline": "",
"online": "",
"unknown": ""
},
"nodes": {
"auth": {
"differ": "",
@@ -137,7 +121,13 @@
"stopped": ""
}
},
"refresh": "重新整理",
"nodeStatus": {
"connecting": "",
"error": "",
"offline": "",
"online": "",
"unknown": ""
},
"research": {
"providerGitHub": "",
"providerLlmSynthesis": "",
@@ -145,7 +135,6 @@
"providerPageFetch": "",
"providerWebSearch": ""
},
"retry": "重試",
"routing": {
"policyLabel": {
"block": "",
@@ -205,14 +194,11 @@
"zai": ""
}
},
"skip": "略過",
"taskForm": {
"nodeStatusConnecting": "",
"nodeStatusError": "",
"nodeStatusOffline": "",
"nodeStatusOnline": "",
"phasePostMerge": "",
"phasePreMerge": ""
"nodeStatusOnline": ""
},
"taskReview": {
"never": "",
@@ -220,8 +206,19 @@
"refreshSourceInitialLoad": "",
"refreshSourceManual": ""
},
"tryAgain": "重試",
"workflow": {
"aggregateAllPassed": "",
"aggregateInProgress": "",
"aggregateNoResults": "",
"customWorkflowFallback": "",
"defaultWorkflow": "",
"executionAwaitingCliApproval": "",
"executionAwaitingInput": "",
"executionCompleted": "",
"executionNotStarted": "",
"executionPaused": "",
"executionPostMerge": "",
"executionPreMerge": "",
"postMerge": "",
"preMerge": "",
"statusAdvisory": "",
@@ -230,5 +227,24 @@
"statusRunning": "",
"statusSkipped": "",
"waitingForOutput": ""
},
"workflowNodes": {
"summaryAwaitInput": "",
"summaryCodeDefault": "",
"summaryGateAdvisory": "",
"summaryGateBlocks": "",
"summaryHoldRelease": "",
"summaryLoopIterations_one": "",
"summaryLoopIterations_other": "",
"summaryLoopUntilContains": "",
"summaryLoopUntilMatches": "",
"summaryNotConfigured": "",
"summaryReviewType": "",
"summarySeamExecute": "",
"summarySeamMerge": "",
"summarySeamPlanning": "",
"summarySeamReview": "",
"summarySeamStepExecute": "",
"summarySeamUnknown": ""
}
}

File diff suppressed because it is too large Load Diff