From d29520276875236402a159467595ec8fb75454e9 Mon Sep 17 00:00:00 2001 From: Fusion Agent Date: Tue, 18 Aug 2026 20:26:07 +0000 Subject: [PATCH] FN-013: establish i18n lint baseline and localize dashboard copy Add a production i18n lint baseline while replacing dashboard copy with translation keys. - Localize task, board, mailbox, report, graph, settings, and shared dashboard surfaces. - Regenerate locale catalogs and resource types for the migration keys. - Add the i18n lint-baseline regression test and contributor guidance. Files changed: .changeset/fn-013-i18n-lint-baseline.md | 7 + docs/i18n-contributing.md | 11 + .../dashboard/app/components/ActiveAgentsPanel.tsx | 2 +- .../dashboard/app/components/AgentDetailView.tsx | 2 +- packages/dashboard/app/components/Board.tsx | 19 +- packages/dashboard/app/components/ChatView.tsx | 2 +- .../dashboard/app/components/ComposeChatPanel.tsx | 14 +- packages/dashboard/app/components/DockTaskList.tsx | 16 +- .../dashboard/app/components/FloatingWindow.tsx | 6 +- .../dashboard/app/components/GitHubImportModal.tsx | 4 +- .../dashboard/app/components/KnowledgeGraphPanel.tsx | 21 +- packages/dashboard/app/components/ListView.tsx | 2 +- .../app/components/MailboxArtifactAttachment.tsx | 16 +- packages/dashboard/app/components/MailboxModal.tsx | 12 +- .../app/components/MailboxStructuralItem.tsx | 13 +- .../app/components/MailboxTaskProposal.tsx | 10 +- .../app/components/MailboxTaskRecommendations.tsx | 12 +- packages/dashboard/app/components/MailboxView.tsx | 14 +- packages/dashboard/app/components/MermaidDiagram.tsx | 4 +- packages/dashboard/app/components/MeshTopology.tsx | 6 +- .../dashboard/app/components/MessageComposer.tsx | 24 +- .../app/components/NativeStructurePreview.tsx | 14 +- packages/dashboard/app/components/ProviderLoginDialog.tsx | 24 +- packages/dashboard/app/components/ReportActionMenu.tsx | 6 +- packages/dashboard/app/components/ReportModal.tsx | 26 +- packages/dashboard/app/components/TaskChatTab.tsx | 10 +- packages/dashboard/app/components/TaskDetailModal.tsx | 28 +- .../app/components/TaskVerificationStatus.tsx | 10 +- .../dashboard/app/components/WhatsAppChatPairingPanel.tsx | 38 +- .../components/command-center/CommandCenter.tsx | 4 +- .../components/command-center/IdeationPanel.tsx | 12 +- .../components/settings/sections/McpServersCard.tsx | 2 +- .../components/settings/sections/MemorySection.tsx | 4 +- .../app/task-modal-touch-resize-e2e-fixture.tsx | 28 +- packages/i18n/locales/en/app.json | 247 +++++++- packages/i18n/locales/es/app.json | 256 +++++++- packages/i18n/locales/fr/app.json | 256 +++++++- packages/i18n/locales/ko/app.json | 256 +++++++- packages/i18n/locales/pt-BR/app.json | 705 ++++++++++++++++++++ packages/i18n/locales/zh-CN/app.json | 256 +++++++- packages/i18n/locales/zh-TW/app.json | 256 +++++++- .../i18n/src/__tests__/i18n-lint-baseline.test.ts | 31 + packages/i18n/src/resources.d.ts | 229 ++++++- 43 files changed, 2627 insertions(+), 288 deletions(-) Fusion-Task-Id: FN-013 Fusion-Task-Lineage: 846ac221-c7c3-4ff0-a30d-69479b614765 Co-authored-by: Fusion --- .changeset/fn-013-i18n-lint-baseline.md | 7 + docs/i18n-contributing.md | 11 + .../app/components/ActiveAgentsPanel.tsx | 2 +- .../app/components/AgentDetailView.tsx | 2 +- packages/dashboard/app/components/Board.tsx | 19 +- .../dashboard/app/components/ChatView.tsx | 2 +- .../app/components/ComposeChatPanel.tsx | 14 +- .../dashboard/app/components/DockTaskList.tsx | 16 +- .../app/components/FloatingWindow.tsx | 6 +- .../app/components/GitHubImportModal.tsx | 4 +- .../app/components/KnowledgeGraphPanel.tsx | 21 +- .../dashboard/app/components/ListView.tsx | 2 +- .../components/MailboxArtifactAttachment.tsx | 16 +- .../dashboard/app/components/MailboxModal.tsx | 12 +- .../app/components/MailboxStructuralItem.tsx | 13 +- .../app/components/MailboxTaskProposal.tsx | 10 +- .../components/MailboxTaskRecommendations.tsx | 12 +- .../dashboard/app/components/MailboxView.tsx | 14 +- .../app/components/MermaidDiagram.tsx | 4 +- .../dashboard/app/components/MeshTopology.tsx | 6 +- .../app/components/MessageComposer.tsx | 24 +- .../app/components/NativeStructurePreview.tsx | 14 +- .../app/components/ProviderLoginDialog.tsx | 24 +- .../app/components/ReportActionMenu.tsx | 6 +- .../dashboard/app/components/ReportModal.tsx | 26 +- .../dashboard/app/components/TaskChatTab.tsx | 10 +- .../app/components/TaskDetailModal.tsx | 28 +- .../app/components/TaskVerificationStatus.tsx | 10 +- .../components/WhatsAppChatPairingPanel.tsx | 38 +- .../command-center/CommandCenter.tsx | 4 +- .../command-center/IdeationPanel.tsx | 12 +- .../settings/sections/McpServersCard.tsx | 2 +- .../settings/sections/MemorySection.tsx | 4 +- .../task-modal-touch-resize-e2e-fixture.tsx | 28 +- packages/i18n/locales/en/app.json | 247 +++++- packages/i18n/locales/es/app.json | 256 +++++- packages/i18n/locales/fr/app.json | 256 +++++- packages/i18n/locales/ko/app.json | 256 +++++- packages/i18n/locales/pt-BR/app.json | 755 +++++++++++++++++- packages/i18n/locales/zh-CN/app.json | 256 +++++- packages/i18n/locales/zh-TW/app.json | 256 +++++- .../src/__tests__/i18n-lint-baseline.test.ts | 31 + packages/i18n/src/resources.d.ts | 229 +++++- 43 files changed, 2652 insertions(+), 313 deletions(-) create mode 100644 .changeset/fn-013-i18n-lint-baseline.md create mode 100644 packages/i18n/src/__tests__/i18n-lint-baseline.test.ts diff --git a/.changeset/fn-013-i18n-lint-baseline.md b/.changeset/fn-013-i18n-lint-baseline.md new file mode 100644 index 0000000000..32f1ee84a2 --- /dev/null +++ b/.changeset/fn-013-i18n-lint-baseline.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: Restore the production i18n catalog lint guardrail. +category: fix +dev: Adds a runLinter regression test and keeps all supported app catalogs structurally synchronized. diff --git a/docs/i18n-contributing.md b/docs/i18n-contributing.md index d9e82f03a1..7ba75f7a21 100644 --- a/docs/i18n-contributing.md +++ b/docs/i18n-contributing.md @@ -54,6 +54,17 @@ Any remaining user-facing copy must be localized with `t()` / `` and an specific files or a small cluster in `lint.ignore`, includes an `FNXC` rationale, and has a filed follow-up task that removes the ignore. The settings sections cluster is no longer deferred as of FN-6771; keep those files covered by lint. +The production catalog currently has a clean lint baseline: `pnpm i18n:lint` +must finish with `No issues found.`. Keep the executable regression alongside the +catalog tests so future shipping copy cannot reintroduce debt: + +```bash +pnpm --filter @fusion/i18n exec vitest run src/__tests__/i18n-lint-baseline.test.ts src/__tests__/i18n-gate-coverage.test.ts --silent=passed-only --reporter=dot +``` + +`i18n-lint-baseline.test.ts` imports the root `i18next.config.ts` and calls the +installed `runLinter` API directly. It therefore checks the same production +inputs as the CLI rather than relying on a mocked catalog or a source-text count. The `@fusion/i18n` regression tests also assert the lint-ignore scope and live catalog key parity so those guardrails cannot silently drift. diff --git a/packages/dashboard/app/components/ActiveAgentsPanel.tsx b/packages/dashboard/app/components/ActiveAgentsPanel.tsx index 5928f7e3a4..395d3eb0dd 100644 --- a/packages/dashboard/app/components/ActiveAgentsPanel.tsx +++ b/packages/dashboard/app/components/ActiveAgentsPanel.tsx @@ -164,7 +164,7 @@ function LiveAgentCard({ agent, projectId, onSelect, onOpenTaskLogs, activity }: {(activity?.summary || lastCompletedStep) && (
{activity?.summary &&
{activity.summary}
} - {lastCompletedStep &&
Last completed Step {lastCompletedStep.index}: {lastCompletedStep.step.name}
} + {lastCompletedStep &&
{t("agents.lastCompletedStep", "Last completed Step {{index}}: {{name}}", { index: lastCompletedStep.index, name: lastCompletedStep.step.name })}
}
)}
diff --git a/packages/dashboard/app/components/AgentDetailView.tsx b/packages/dashboard/app/components/AgentDetailView.tsx index 134585f265..748b179e33 100644 --- a/packages/dashboard/app/components/AgentDetailView.tsx +++ b/packages/dashboard/app/components/AgentDetailView.tsx @@ -1337,7 +1337,7 @@ export function AgentDetailView({ agentId, projectId, onClose, addToast, onChild ); if (inline) { - return
{detailContent}
; + return
{detailContent}
; } return ( diff --git a/packages/dashboard/app/components/Board.tsx b/packages/dashboard/app/components/Board.tsx index f81db38c7c..9dbe5a15d9 100644 --- a/packages/dashboard/app/components/Board.tsx +++ b/packages/dashboard/app/components/Board.tsx @@ -5,6 +5,8 @@ import "./Lane.css"; import "./Board.css"; import type { ToastType } from "../hooks/useToast"; import { useState, useMemo, useEffect, useCallback, useRef } from "react"; +import { useTranslation } from "react-i18next"; +import type { TFunction } from "i18next"; import { createPortal } from "react-dom"; import { promoteTask, type ModelInfo, type BoardWorkflowsPayload, type BoardWorkflowColumn, type RevertTaskOptions, type RevertTaskResult } from "../api"; import { useBlockerFanout, type BlockerFanoutColumnFlags } from "../hooks/useBlockerFanout"; @@ -146,9 +148,9 @@ export { ALL_WORKFLOWS_BOARD_VIEW_ID } from "../utils/boardWorkflowSelection"; type AggregateBoardColumn = BoardWorkflowColumn & { sourceWorkflowIds: string[] }; type AggregateQuickCreateTarget = { columnId: string; workflowId: string }; -function BoardWorkflowSkeleton({ empty = false }: { empty?: boolean }) { +function BoardWorkflowSkeleton({ empty = false, t }: { empty?: boolean; t: TFunction<"app"> }) { return ( -
+
{[0, 1, 2].map((index) => (