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
79 lines
2.5 KiB
TypeScript
79 lines
2.5 KiB
TypeScript
import type { ReactNode } from "react";
|
|
import { useTranslation } from "react-i18next";
|
|
import type { IssueMentionItem } from "../api";
|
|
import "./IssueMentionPopup.css";
|
|
|
|
export interface IssueMentionPopupProps {
|
|
visible: boolean;
|
|
position: { top: number; left: number };
|
|
issues: IssueMentionItem[];
|
|
selectedIndex: number;
|
|
onSelect: (issue: IssueMentionItem) => void;
|
|
loading: boolean;
|
|
}
|
|
|
|
export function IssueMentionPopup({
|
|
visible,
|
|
position,
|
|
issues,
|
|
selectedIndex,
|
|
onSelect,
|
|
loading,
|
|
}: IssueMentionPopupProps): ReactNode | null {
|
|
const { t } = useTranslation("app");
|
|
|
|
if (!visible) return null;
|
|
|
|
return (
|
|
<div
|
|
className="issue-mention-popup"
|
|
style={{ top: position.top, left: position.left }}
|
|
data-testid="issue-mention-popup"
|
|
onMouseDown={(event) => {
|
|
event.preventDefault();
|
|
}}
|
|
>
|
|
{loading && (
|
|
<div className="issue-mention-popup-loading" data-testid="issue-mention-loading">
|
|
<span className="spinner" />
|
|
</div>
|
|
)}
|
|
|
|
{!loading && issues.length === 0 && (
|
|
<div className="issue-mention-popup-empty" data-testid="issue-mention-empty">
|
|
{t("issues.noIssuesFound", "No issues found")}
|
|
</div>
|
|
)}
|
|
|
|
{!loading && issues.length > 0 && (
|
|
<ul className="issue-mention-popup-list" role="listbox">
|
|
{issues.map((issue, index) => (
|
|
<li
|
|
key={`${issue.repository}#${issue.number}`}
|
|
className={`issue-mention-popup-item${index === selectedIndex ? " issue-mention-popup-item--selected" : ""}`}
|
|
role="option"
|
|
aria-selected={index === selectedIndex}
|
|
onClick={() => onSelect(issue)}
|
|
data-testid={`issue-mention-item-${index}`}
|
|
>
|
|
<div className="issue-mention-popup-item-main">
|
|
<span className="issue-mention-popup-number">#{issue.number}</span>
|
|
<span className="issue-mention-popup-title">{issue.title}</span>
|
|
</div>
|
|
<div className="issue-mention-popup-meta">
|
|
<span
|
|
className="status-dot"
|
|
style={{
|
|
backgroundColor: issue.state === "open" ? "var(--color-success)" : "var(--color-muted)",
|
|
}}
|
|
/>
|
|
<span className="issue-mention-popup-repository">{issue.repository}</span>
|
|
</div>
|
|
</li>
|
|
))}
|
|
</ul>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|