diff --git a/apps/app/src/hooks/use-translate.ts b/apps/app/src/hooks/use-translate.ts deleted file mode 100644 index 502ba7ffb..000000000 --- a/apps/app/src/hooks/use-translate.ts +++ /dev/null @@ -1,12 +0,0 @@ -import * as React from "react"; -import { t } from "@/i18n"; - -export function useTranslate() { - const tr = React.useCallback((key: string) => t(key), []); - const tx = React.useCallback( - (key: string, params?: Record) => t(key, params), - [], - ); - - return React.useMemo(() => ({ tr, tx }), [tr, tx]); -} diff --git a/apps/app/src/react-app/domains/settings/cloud/cloud-account-section.tsx b/apps/app/src/react-app/domains/settings/cloud/cloud-account-section.tsx index 09c4f4408..cb6feba72 100644 --- a/apps/app/src/react-app/domains/settings/cloud/cloud-account-section.tsx +++ b/apps/app/src/react-app/domains/settings/cloud/cloud-account-section.tsx @@ -16,7 +16,7 @@ import { SettingsNotice, SettingsSectionHeaderDescription, } from "../settings-section"; -import { useTranslate } from "@/hooks/use-translate"; +import { t } from "@/i18n"; export interface CloudAccountSectionProps { activeOrgId: string; @@ -43,10 +43,9 @@ export function CloudAccountSection({ onRefreshOrgs, onSignOut, }: CloudAccountSectionProps) { - const { tr } = useTranslate(); const activeOrgOptions = orgs.map((org) => ({ value: org.id, - label: `${org.name} ${org.role === "owner" ? tr("den.org_owner_suffix") : tr("den.org_member_suffix")}`, + label: `${org.name} ${org.role === "owner" ? t("den.org_owner_suffix") : t("den.org_member_suffix")}`, })); const handleActiveOrgChange = (orgId: string | null) => { if (orgId === null) { @@ -59,8 +58,8 @@ export function CloudAccountSection({ return (
-
{tr("den.cloud_account_title")}
- {tr("den.cloud_account_hint")} +
{t("den.cloud_account_title")}
+ {t("den.cloud_account_hint")}
@@ -79,14 +78,14 @@ export function CloudAccountSection({ disabled={[authBusy, sessionBusy].some(Boolean)} > - {authBusy ? tr("den.signing_out") : tr("den.sign_out")} + {authBusy ? t("den.signing_out") : t("den.sign_out")}
-
{tr("den.active_org_title")}
-
{tr("den.active_org_hint")}
+
{t("den.active_org_title")}
+
{t("den.active_org_hint")}
@@ -98,9 +97,9 @@ export function CloudAccountSection({ > - + @@ -118,7 +117,7 @@ export function CloudAccountSection({ disabled={orgsBusy} onRefresh={onRefreshOrgs} > - {tr("den.refresh")} + {t("den.refresh")}
diff --git a/apps/app/src/react-app/domains/settings/cloud/dev-mode.tsx b/apps/app/src/react-app/domains/settings/cloud/dev-mode.tsx index dfddde2b6..2471803fa 100644 --- a/apps/app/src/react-app/domains/settings/cloud/dev-mode.tsx +++ b/apps/app/src/react-app/domains/settings/cloud/dev-mode.tsx @@ -4,7 +4,7 @@ import { ArrowUpRight } from "lucide-react"; import { DEFAULT_DEN_BASE_URL } from "../../../../app/lib/den"; import { Button } from "../../../design-system/button"; import { TextInput } from "../../../design-system/text-input"; -import { useTranslate } from "@/hooks/use-translate"; +import { t } from "@/i18n"; type CloudDevModeProps = { authBusy: boolean; @@ -17,17 +17,16 @@ type CloudDevModeProps = { }; export function CloudDevMode(props: CloudDevModeProps) { - const { tr } = useTranslate(); const controlsDisabled = [props.authBusy, props.sessionBusy].some(Boolean); return (
props.onBaseUrlDraftChange(event.currentTarget.value)} placeholder={DEFAULT_DEN_BASE_URL} - hint={tr("den.cloud_control_plane_url_hint")} + hint={t("den.cloud_control_plane_url_hint")} disabled={controlsDisabled} />
@@ -37,7 +36,7 @@ export function CloudDevMode(props: CloudDevModeProps) { onClick={props.onResetBaseUrl} disabled={controlsDisabled} > - {tr("den.cloud_control_plane_reset")} + {t("den.cloud_control_plane_reset")}
diff --git a/apps/app/src/react-app/domains/settings/cloud/sections.tsx b/apps/app/src/react-app/domains/settings/cloud/sections.tsx index bf5a86c3c..049fa66b0 100644 --- a/apps/app/src/react-app/domains/settings/cloud/sections.tsx +++ b/apps/app/src/react-app/domains/settings/cloud/sections.tsx @@ -36,7 +36,7 @@ import { SettingsListItemTitle, SettingsListSearchInput, } from "../settings-list"; -import { useTranslate } from "@/hooks/use-translate"; +import { t } from "@/i18n"; type ResourceActionKind = "import" | "remove" | "sync"; @@ -121,23 +121,23 @@ function workerStatusValue(status: string) { return status.trim().toLowerCase() || "unknown"; } -function workerStatusMeta(status: string, tr: (key: string) => string) { +function workerStatusMeta(status: string) { const normalized = workerStatusValue(status); switch (normalized) { case "healthy": - return { label: tr("dashboard.worker_status_ready"), tone: "ready" as const, canOpen: true }; + return { label: t("dashboard.worker_status_ready"), tone: "ready" as const, canOpen: true }; case "provisioning": - return { label: tr("dashboard.worker_status_starting"), tone: "warning" as const, canOpen: false }; + return { label: t("dashboard.worker_status_starting"), tone: "warning" as const, canOpen: false }; case "failed": - return { label: tr("dashboard.worker_status_attention"), tone: "error" as const, canOpen: false }; + return { label: t("dashboard.worker_status_attention"), tone: "error" as const, canOpen: false }; case "stopped": - return { label: tr("dashboard.worker_status_stopped"), tone: "neutral" as const, canOpen: false }; + return { label: t("dashboard.worker_status_stopped"), tone: "neutral" as const, canOpen: false }; default: return { label: normalized ? `${normalized.slice(0, 1).toUpperCase()}${normalized.slice(1)}` - : tr("dashboard.worker_status_unknown"), + : t("dashboard.worker_status_unknown"), tone: "neutral" as const, canOpen: normalized === "ready", }; @@ -177,43 +177,42 @@ function CloudSkillListItem({ onRemoveSkill, onSyncSkill, }: CloudSkillListItemProps) { - const { tr, tx } = useTranslate(); const actionBusy = actionId === row.cloudSkillId; const actionLabel = !actionBusy ? null : actionKind === "import" - ? tr("den.importing") + ? t("den.importing") : actionKind === "sync" - ? tr("den.syncing") - : tr("den.removing"); + ? t("den.syncing") + : t("den.removing"); return ( {row.title} - {row.skill?.hubName ? {tx("skills.cloud_hub_label", { name: row.skill.hubName })} : null} - {row.skill?.shared === "public" ? {tr("skills.cloud_shared_public")} : null} - {row.skill?.shared === null && !row.skill?.hubName ? {tr("den.private_badge")} : null} - {row.installedName ? {tx("den.installed_name_badge", { name: row.installedName })} : null} + {row.skill?.hubName ? {t("skills.cloud_hub_label", { name: row.skill.hubName })} : null} + {row.skill?.shared === "public" ? {t("skills.cloud_shared_public")} : null} + {row.skill?.shared === null && !row.skill?.hubName ? {t("den.private_badge")} : null} + {row.installedName ? {t("den.installed_name_badge", { name: row.installedName })} : null} {row.status !== "available" ? ( {row.status === "installed" - ? tr("den.imported_badge") + ? t("den.imported_badge") : row.status === "out_of_sync" - ? tr("den.out_of_sync_badge") - : tr("den.removed_from_cloud_badge")} + ? t("den.out_of_sync_badge") + : t("den.removed_from_cloud_badge")} ) : null} {row.status === "available" - ? tx("den.cloud_skill_detail", { title: row.title }) + ? t("den.cloud_skill_detail", { title: row.title }) : row.status === "installed" - ? tx("den.cloud_skill_imported_detail", { name: row.installedName ?? row.title }) + ? t("den.cloud_skill_imported_detail", { name: row.installedName ?? row.title }) : row.status === "out_of_sync" - ? tx("den.cloud_skill_sync_detail", { name: row.installedName ?? row.title }) - : tx("den.cloud_skill_removed_detail", { name: row.installedName ?? row.title })} + ? t("den.cloud_skill_sync_detail", { name: row.installedName ?? row.title }) + : t("den.cloud_skill_removed_detail", { name: row.installedName ?? row.title })} @@ -224,7 +223,7 @@ function CloudSkillListItem({ onClick={() => void onSyncSkill(row.cloudSkillId, row.title)} disabled={actionId !== null} > - {actionBusy && actionKind === "sync" ? tr("den.syncing") : tr("den.sync")} + {actionBusy && actionKind === "sync" ? t("den.syncing") : t("den.sync")} ) : null} {row.status === "available" && row.skill ? ( @@ -234,7 +233,7 @@ function CloudSkillListItem({ onClick={() => void onImportSkill(row.cloudSkillId, row.title)} disabled={actionId !== null} > - {actionBusy ? actionLabel : tr("den.import_skill")} + {actionBusy ? actionLabel : t("den.import_skill")} ) : null} {row.status !== "available" ? ( @@ -244,7 +243,7 @@ function CloudSkillListItem({ onClick={() => void onRemoveSkill(row.cloudSkillId, row.title)} disabled={actionId !== null} > - {actionBusy ? actionLabel : tr("den.uninstall")} + {actionBusy ? actionLabel : t("den.uninstall")} ) : null} @@ -263,7 +262,6 @@ function MarketplacePluginListItem({ row, onImportPlugin, }: MarketplacePluginListItemProps) { - const { tr } = useTranslate(); const actionBusy = actionId === row.plugin.id; const counts = Object.entries(row.plugin.componentCounts) .filter(([, count]) => count > 0) @@ -276,7 +274,7 @@ function MarketplacePluginListItem({ {row.plugin.name} {row.status !== "available" ? ( - {row.status === "imported" ? tr("den.imported_badge") : tr("den.out_of_sync_badge")} + {row.status === "imported" ? t("den.imported_badge") : t("den.out_of_sync_badge")} ) : null} {counts.map((label) => ( @@ -298,7 +296,7 @@ function MarketplacePluginListItem({ onClick={() => void onImportPlugin(row.marketplaceId, row.plugin)} disabled={actionId !== null} > - {actionBusy ? tr("den.importing") : row.status === "available" ? tr("den.import_provider") : tr("den.sync")} + {actionBusy ? t("den.importing") : row.status === "available" ? t("den.import_provider") : t("den.sync")} ); @@ -311,8 +309,7 @@ interface CloudWorkerListItemProps { } function CloudWorkerListItem({ openingWorkerId, worker, onOpenWorker }: CloudWorkerListItemProps) { - const { tr, tx } = useTranslate(); - const status = workerStatusMeta(worker.status, tr); + const status = workerStatusMeta(worker.status); return ( @@ -325,8 +322,8 @@ function CloudWorkerListItem({ openingWorkerId, worker, onOpenWorker }: CloudWor {[ - worker.isMine ? tr("den.worker_mine_badge") : null, - worker.provider ? tx("den.worker_provider_label", { provider: worker.provider }) : tr("den.worker_secondary_cloud"), + worker.isMine ? t("den.worker_mine_badge") : null, + worker.provider ? t("den.worker_provider_label", { provider: worker.provider }) : t("den.worker_secondary_cloud"), worker.instanceUrl, ].filter(Boolean).join(" ยท ")} @@ -336,9 +333,9 @@ function CloudWorkerListItem({ openingWorkerId, worker, onOpenWorker }: CloudWor size="sm" onClick={() => void onOpenWorker(worker.workerId, worker.workerName)} disabled={[openingWorkerId !== null, !status.canOpen].some(Boolean)} - title={!status.canOpen ? tr("den.worker_not_ready_title") : undefined} + title={!status.canOpen ? t("den.worker_not_ready_title") : undefined} > - {openingWorkerId === worker.workerId ? tr("den.opening") : tr("den.open")} + {openingWorkerId === worker.workerId ? t("den.opening") : t("den.open")} ); @@ -354,15 +351,14 @@ interface SkillHubListItemProps { } function SkillHubListItem({ actionId, actionKind, row, onImport, onRemove, onSync }: SkillHubListItemProps) { - const { tr, tx } = useTranslate(); const actionBusy = actionId === row.hubId; const actionLabel = !actionBusy ? null : actionKind === "import" - ? tr("den.importing") + ? t("den.importing") : actionKind === "sync" - ? tr("den.syncing") - : tr("den.removing"); + ? t("den.syncing") + : t("den.removing"); return ( @@ -370,31 +366,31 @@ function SkillHubListItem({ actionId, actionKind, row, onImport, onRemove, onSyn {row.name} - {tx("den.skill_hub_skills_badge", { + {t("den.skill_hub_skills_badge", { count: row.hub?.skills.length ?? row.importedSkillCount, })} {row.status !== "available" ? ( {row.status === "imported" - ? tr("den.imported_badge") + ? t("den.imported_badge") : row.status === "out_of_sync" - ? tr("den.out_of_sync_badge") - : tr("den.removed_from_cloud_badge")} + ? t("den.out_of_sync_badge") + : t("den.removed_from_cloud_badge")} ) : null} {row.status === "available" - ? tx("den.skill_hub_detail", { count: row.liveSkillCount }) + ? t("den.skill_hub_detail", { count: row.liveSkillCount }) : row.status === "imported" - ? tx("den.skill_hub_imported_detail", { count: row.importedSkillCount }) + ? t("den.skill_hub_imported_detail", { count: row.importedSkillCount }) : row.status === "out_of_sync" - ? tx("den.skill_hub_sync_detail", { + ? t("den.skill_hub_sync_detail", { liveCount: row.liveSkillCount, importedCount: row.importedSkillCount, }) - : tx("den.skill_hub_removed_detail", { importedCount: row.importedSkillCount })} + : t("den.skill_hub_removed_detail", { importedCount: row.importedSkillCount })} @@ -405,7 +401,7 @@ function SkillHubListItem({ actionId, actionKind, row, onImport, onRemove, onSyn onClick={() => void onSync(row.hubId)} disabled={actionId !== null} > - {actionBusy && actionKind === "sync" ? tr("den.syncing") : tr("den.sync")} + {actionBusy && actionKind === "sync" ? t("den.syncing") : t("den.sync")} ) : null} {row.status === "available" && row.hub ? ( @@ -415,7 +411,7 @@ function SkillHubListItem({ actionId, actionKind, row, onImport, onRemove, onSyn onClick={() => void onImport(row.hubId)} disabled={actionId !== null} > - {actionBusy ? actionLabel : tr("den.import_all")} + {actionBusy ? actionLabel : t("den.import_all")} ) : null} {row.status !== "available" ? ( @@ -425,7 +421,7 @@ function SkillHubListItem({ actionId, actionKind, row, onImport, onRemove, onSyn onClick={() => void onRemove(row.hubId)} disabled={actionId !== null} > - {actionBusy ? actionLabel : row.status === "removed_from_cloud" ? tr("den.uninstall") : tr("common.remove")} + {actionBusy ? actionLabel : row.status === "removed_from_cloud" ? t("den.uninstall") : t("common.remove")} ) : null} @@ -443,15 +439,14 @@ interface CloudProviderListItemProps { } function CloudProviderListItem({ actionId, actionKind, row, onImport, onRemove, onSync }: CloudProviderListItemProps) { - const { tr, tx } = useTranslate(); const actionBusy = actionId === row.cloudProviderId; const actionLabel = !actionBusy ? null : actionKind === "import" - ? tr("den.importing") + ? t("den.importing") : actionKind === "sync" - ? tr("den.syncing") - : tr("den.removing"); + ? t("den.syncing") + : t("den.removing"); return ( @@ -461,27 +456,27 @@ function CloudProviderListItem({ actionId, actionKind, row, onImport, onRemove, {row.status !== "available" ? ( {row.status === "imported" - ? tr("den.imported_badge") + ? t("den.imported_badge") : row.status === "out_of_sync" - ? tr("den.out_of_sync_badge") - : tr("den.removed_from_cloud_badge")} + ? t("den.out_of_sync_badge") + : t("den.removed_from_cloud_badge")} ) : null} {[ row.provider?.providerId ?? row.imported?.providerId, - row.provider?.hasApiKey ? tr("den.credentials_ready_badge") : null, + row.provider?.hasApiKey ? t("den.credentials_ready_badge") : null, row.status === "removed_from_cloud" - ? tx("den.cloud_provider_removed_detail", { + ? t("den.cloud_provider_removed_detail", { providerId: row.imported?.providerId ?? row.name, }) : row.status === "out_of_sync" - ? tx("den.cloud_provider_sync_detail", { + ? t("den.cloud_provider_sync_detail", { count: row.provider?.models.length ?? 0, source: row.provider?.source === "custom" ? "custom" : "managed", }) - : tx("den.cloud_provider_detail", { + : t("den.cloud_provider_detail", { count: row.provider?.models.length ?? 0, source: row.provider?.source === "custom" ? "custom" : "managed", }), @@ -496,7 +491,7 @@ function CloudProviderListItem({ actionId, actionKind, row, onImport, onRemove, onClick={() => void onSync(row.cloudProviderId, row.name)} disabled={actionId !== null} > - {actionBusy && actionKind === "sync" ? tr("den.syncing") : tr("den.sync")} + {actionBusy && actionKind === "sync" ? t("den.syncing") : t("den.sync")} ) : null} {row.status === "available" && row.provider ? ( @@ -506,7 +501,7 @@ function CloudProviderListItem({ actionId, actionKind, row, onImport, onRemove, onClick={() => void onImport(row.cloudProviderId, row.name)} disabled={actionId !== null} > - {actionBusy ? actionLabel : tr("den.import_provider")} + {actionBusy ? actionLabel : t("den.import_provider")} ) : null} {row.status !== "available" ? ( @@ -516,7 +511,7 @@ function CloudProviderListItem({ actionId, actionKind, row, onImport, onRemove, onClick={() => void onRemove(row.cloudProviderId, row.name)} disabled={actionId !== null} > - {actionBusy ? actionLabel : row.status === "removed_from_cloud" ? tr("den.uninstall") : tr("common.remove")} + {actionBusy ? actionLabel : row.status === "removed_from_cloud" ? t("den.uninstall") : t("common.remove")} ) : null} @@ -552,14 +547,13 @@ export function CloudSkillsSection({ onRemoveSkill, onSyncSkill, }: CloudSkillsSectionProps) { - const { tr } = useTranslate(); const [searchQuery, setSearchQuery] = React.useState(""); const visibleRows = useSearch({ items: rows, keys: skillSearchKeys, query: searchQuery }); const skillGroups = [ { value: "available", label: "Available", rows: visibleRows.filter((row) => row.status === "available") }, - { value: "out_of_sync", label: tr("den.out_of_sync_badge"), rows: visibleRows.filter((row) => row.status === "out_of_sync") }, - { value: "installed", label: tr("skills.cloud_status_installed"), rows: visibleRows.filter((row) => row.status === "installed") }, - { value: "removed_from_cloud", label: tr("den.removed_from_cloud_badge"), rows: visibleRows.filter((row) => row.status === "removed_from_cloud") }, + { value: "out_of_sync", label: t("den.out_of_sync_badge"), rows: visibleRows.filter((row) => row.status === "out_of_sync") }, + { value: "installed", label: t("skills.cloud_status_installed"), rows: visibleRows.filter((row) => row.status === "installed") }, + { value: "removed_from_cloud", label: t("den.removed_from_cloud_badge"), rows: visibleRows.filter((row) => row.status === "removed_from_cloud") }, ].filter((group) => group.rows.length > 0); return ( @@ -567,9 +561,9 @@ export function CloudSkillsSection({ - {tr("den.cloud_skills_title")} + {t("den.cloud_skills_title")} - {tr("den.cloud_skills_hint")} + {t("den.cloud_skills_hint")} - {tr("den.refresh")} + {t("den.refresh")} @@ -588,7 +582,7 @@ export function CloudSkillsSection({ {!busy && rows.length === 0 ? ( - {hasActiveOrg ? tr("den.no_cloud_skills") : tr("den.choose_org_for_skills")} + {hasActiveOrg ? t("den.no_cloud_skills") : t("den.choose_org_for_skills")} ) : null} @@ -669,7 +663,6 @@ export function MarketplacePluginsSection({ onRefresh, onSelectMarketplace, }: MarketplacePluginsSectionProps) { - const { tr } = useTranslate(); const [searchQuery, setSearchQuery] = React.useState(""); const selectedMarketplace = marketplaces.find((entry) => entry.marketplace.id === activeMarketplaceId) ?? marketplaces[0] ?? null; @@ -677,8 +670,8 @@ export function MarketplacePluginsSection({ const visibleRows = useSearch({ items: selectedRows, keys: pluginSearchKeys, query: searchQuery }); const pluginGroups = [ { value: "available", label: "Available", rows: visibleRows.filter((row) => row.status === "available") }, - { value: "out_of_sync", label: tr("den.out_of_sync_badge"), rows: visibleRows.filter((row) => row.status === "out_of_sync") }, - { value: "imported", label: tr("den.imported_badge"), rows: visibleRows.filter((row) => row.status === "imported") }, + { value: "out_of_sync", label: t("den.out_of_sync_badge"), rows: visibleRows.filter((row) => row.status === "out_of_sync") }, + { value: "imported", label: t("den.imported_badge"), rows: visibleRows.filter((row) => row.status === "imported") }, ].filter((group) => group.rows.length > 0); return ( @@ -698,7 +691,7 @@ export function MarketplacePluginsSection({ disabled={[busy, !hasActiveOrg].some(Boolean)} onRefresh={onRefresh} > - {tr("den.refresh")} + {t("den.refresh")} @@ -803,7 +796,6 @@ export function CloudWorkersSection({ onOpenWorker, onRefreshWorkers, }: CloudWorkersSectionProps) { - const { tr } = useTranslate(); const [searchQuery, setSearchQuery] = React.useState(""); const visibleWorkers = useSearch({ items: workers, keys: workerSearchKeys, query: searchQuery }); const workerGroups: { value: string; label: string; rows: CloudWorker[] }[] = []; @@ -815,7 +807,7 @@ export function CloudWorkersSection({ if (group) { group.rows.push(worker); } else { - workerGroups.push({ value, label: workerStatusMeta(worker.status, tr).label, rows: [worker] }); + workerGroups.push({ value, label: workerStatusMeta(worker.status).label, rows: [worker] }); } } @@ -826,9 +818,9 @@ export function CloudWorkersSection({ - {tr("den.cloud_workers_title")} + {t("den.cloud_workers_title")} - {tr("den.cloud_workers_hint")} + {t("den.cloud_workers_hint")} - {tr("den.refresh")} + {t("den.refresh")} @@ -844,7 +836,7 @@ export function CloudWorkersSection({ {workersError ? {workersError} : null} {!workersBusy && workers.length === 0 ? ( - {tr("den.no_cloud_workers")} + {t("den.no_cloud_workers")} ) : null} {workers.length > 0 ? ( @@ -921,14 +913,13 @@ export function SkillHubsSection({ onRemove, onSync, }: SkillHubsSectionProps) { - const { tr } = useTranslate(); const [searchQuery, setSearchQuery] = React.useState(""); const visibleRows = useSearch({ items: rows, keys: nameSearchKeys, query: searchQuery }); const skillHubGroups = [ { value: "available", label: "Available", rows: visibleRows.filter((row) => row.status === "available") }, - { value: "out_of_sync", label: tr("den.out_of_sync_badge"), rows: visibleRows.filter((row) => row.status === "out_of_sync") }, - { value: "imported", label: tr("den.imported_badge"), rows: visibleRows.filter((row) => row.status === "imported") }, - { value: "removed_from_cloud", label: tr("den.removed_from_cloud_badge"), rows: visibleRows.filter((row) => row.status === "removed_from_cloud") }, + { value: "out_of_sync", label: t("den.out_of_sync_badge"), rows: visibleRows.filter((row) => row.status === "out_of_sync") }, + { value: "imported", label: t("den.imported_badge"), rows: visibleRows.filter((row) => row.status === "imported") }, + { value: "removed_from_cloud", label: t("den.removed_from_cloud_badge"), rows: visibleRows.filter((row) => row.status === "removed_from_cloud") }, ].filter((group) => group.rows.length > 0); return ( @@ -936,9 +927,9 @@ export function SkillHubsSection({ - {tr("den.skill_hubs_title")} + {t("den.skill_hubs_title")} - {tr("den.skill_hubs_hint")} + {t("den.skill_hubs_hint")} - {tr("den.refresh")} + {t("den.refresh")} @@ -957,7 +948,7 @@ export function SkillHubsSection({ {!busy && rows.length === 0 ? ( - {hasActiveOrg ? tr("den.no_skill_hubs") : tr("den.choose_org_for_skill_hubs")} + {hasActiveOrg ? t("den.no_skill_hubs") : t("den.choose_org_for_skill_hubs")} ) : null} @@ -1036,14 +1027,13 @@ export function CloudProvidersSection({ onRemove, onSync, }: CloudProvidersSectionProps) { - const { tr } = useTranslate(); const [searchQuery, setSearchQuery] = React.useState(""); const visibleRows = useSearch({ items: rows, keys: nameSearchKeys, query: searchQuery }); const providerGroups = [ { value: "available", label: "Available", rows: visibleRows.filter((row) => row.status === "available") }, - { value: "out_of_sync", label: tr("den.out_of_sync_badge"), rows: visibleRows.filter((row) => row.status === "out_of_sync") }, - { value: "imported", label: tr("den.imported_badge"), rows: visibleRows.filter((row) => row.status === "imported") }, - { value: "removed_from_cloud", label: tr("den.removed_from_cloud_badge"), rows: visibleRows.filter((row) => row.status === "removed_from_cloud") }, + { value: "out_of_sync", label: t("den.out_of_sync_badge"), rows: visibleRows.filter((row) => row.status === "out_of_sync") }, + { value: "imported", label: t("den.imported_badge"), rows: visibleRows.filter((row) => row.status === "imported") }, + { value: "removed_from_cloud", label: t("den.removed_from_cloud_badge"), rows: visibleRows.filter((row) => row.status === "removed_from_cloud") }, ].filter((group) => group.rows.length > 0); return ( @@ -1051,9 +1041,9 @@ export function CloudProvidersSection({ - {tr("den.cloud_providers_title")} + {t("den.cloud_providers_title")} - {tr("den.cloud_providers_hint")} + {t("den.cloud_providers_hint")} - {tr("den.refresh")} + {t("den.refresh")} @@ -1070,7 +1060,7 @@ export function CloudProvidersSection({ {!busy && rows.length === 0 ? ( - {hasActiveOrg ? tr("den.no_cloud_providers") : tr("den.choose_org_for_providers")} + {hasActiveOrg ? t("den.no_cloud_providers") : t("den.choose_org_for_providers")} ) : null} diff --git a/apps/app/src/react-app/domains/settings/panels/den-settings-panel.tsx b/apps/app/src/react-app/domains/settings/panels/den-settings-panel.tsx index 2b0ab3001..0868dfcfe 100644 --- a/apps/app/src/react-app/domains/settings/panels/den-settings-panel.tsx +++ b/apps/app/src/react-app/domains/settings/panels/den-settings-panel.tsx @@ -61,7 +61,7 @@ import { SettingsStatusBadge, } from "../settings-section"; import { useStatusToasts } from "../../shell-feedback/status-toasts"; -import { useTranslate } from "@/hooks/use-translate"; +import { t } from "@/i18n"; type AsyncResult = { ok: boolean; message: string }; @@ -154,7 +154,6 @@ function DenSignedOutPanel({ onSubmitManualAuth, sessionBusy, }: DenSignedOutPanelProps) { - const { tr } = useTranslate(); const [manualAuthOpen, setManualAuthOpen] = React.useState(false); const [manualAuthInput, setManualAuthInput] = React.useState(""); const controlsDisabled = [authBusy, sessionBusy].some(Boolean); @@ -170,9 +169,9 @@ function DenSignedOutPanel({ - {tr("den.signin_title")} + {t("den.signin_title")} - {tr("den.cloud_sleep_hint")} + {t("den.cloud_sleep_hint")} @@ -180,11 +179,11 @@ function DenSignedOutPanel({
@@ -201,27 +200,27 @@ function DenSignedOutPanel({ } > - {manualAuthOpen ? tr("den.hide_signin_code") : tr("den.paste_signin_code")} + {manualAuthOpen ? t("den.hide_signin_code") : t("den.paste_signin_code")} - {tr("den.signin_link_label")} + {t("den.signin_link_label")} setManualAuthInput(event.currentTarget.value)} - placeholder={tr("den.signin_link_placeholder")} + placeholder={t("den.signin_link_placeholder")} disabled={controlsDisabled} /> - {tr("den.signin_link_hint")} + {t("den.signin_link_hint")}
@@ -232,14 +231,13 @@ function DenSignedOutPanel({ {authError ? {authError} : null} - {tr("den.auto_reconnect_hint")} + {t("den.auto_reconnect_hint")} ); } export function DenSettingsPanel(props: DenSettingsPanelProps) { - const { tr, tx } = useTranslate(); const { showToast } = useStatusToasts(); const initial = React.useMemo(() => readDenSettings(), []); @@ -273,7 +271,7 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { () => orgs.find((org) => org.id === activeOrgId) ?? null, [activeOrgId, orgs], ); - const activeOrgName = activeOrg?.name || tr("den.no_org_selected"); + const activeOrgName = activeOrg?.name || t("den.no_org_selected"); // Workers const [workersBusy, setWorkersBusy] = React.useState(false); @@ -521,11 +519,11 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { ]); const summaryLabel = React.useMemo(() => { - if (authError) return tr("den.needs_attention"); - if (sessionBusy) return tr("den.checking_session"); - if (isSignedIn) return tr("dashboard.connected"); - return tr("den.signed_out"); - }, [authError, isSignedIn, sessionBusy, tr]); + if (authError) return t("den.needs_attention"); + if (sessionBusy) return t("den.checking_session"); + if (isSignedIn) return t("dashboard.connected"); + return t("den.signed_out"); + }, [authError, isSignedIn, sessionBusy]); // Shared reset helpers const clearSessionState = React.useCallback(() => { @@ -580,18 +578,18 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { props.openLink(buildDenAuthUrl(baseUrl, mode)); setStatusMessage( mode === "sign-up" - ? tr("den.status_browser_signup") - : tr("den.status_browser_signin"), + ? t("den.status_browser_signup") + : t("den.status_browser_signin"), ); setAuthError(null); }, - [baseUrl, props, tr], + [baseUrl, props], ); const applyBaseUrl = React.useCallback(() => { const normalized = normalizeDenBaseUrl(baseUrlDraft); if (!normalized) { - setBaseUrlError(tr("den.error_base_url")); + setBaseUrlError(t("den.error_base_url")); return; } @@ -604,8 +602,8 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { setBaseUrl(resolved.baseUrl); setBaseUrlDraft(resolved.baseUrl); - clearSignedInState(tr("den.status_base_url_updated")); - }, [baseUrl, baseUrlDraft, clearSignedInState, tr]); + clearSignedInState(t("den.status_base_url_updated")); + }, [baseUrl, baseUrlDraft, clearSignedInState]); // Auth session query candidate: user, sessionBusy, authError React.useEffect(() => { @@ -626,7 +624,7 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { .then((nextUser) => { if (cancelled) return; setUser(nextUser); - setStatusMessage(tx("den.status_signed_in_as", { email: nextUser.email })); + setStatusMessage(t("den.status_signed_in_as", { email: nextUser.email })); }) .catch((error) => { if (cancelled) return; @@ -635,7 +633,7 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { } else { clearSessionState(); } - setAuthError(error instanceof Error ? error.message : tr("den.error_no_session")); + setAuthError(error instanceof Error ? error.message : t("den.error_no_session")); }) .finally(() => { if (!cancelled) setSessionBusy(false); @@ -644,7 +642,7 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { return () => { cancelled = true; }; - }, [authToken, baseUrl, clearSessionState, clearSignedInState, tr, tx]); + }, [authToken, baseUrl, clearSessionState, clearSignedInState]); // Organizations query candidate: orgs, orgsBusy, orgsError const refreshOrgs = React.useCallback( @@ -684,19 +682,19 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { } if (!quiet && response.orgs.length > 0) { showToast({ - title: tx("den.status_loaded_orgs", { + title: t("den.status_loaded_orgs", { count: response.orgs.length, }), tone: "info", }); } } catch (error) { - setOrgsError(error instanceof Error ? error.message : tr("den.error_load_orgs")); + setOrgsError(error instanceof Error ? error.message : t("den.error_load_orgs")); } finally { setOrgsBusy(false); } }, - [activeOrgId, authToken, baseUrl, client, showToast, tr, tx], + [activeOrgId, authToken, baseUrl, client, showToast], ); React.useEffect(() => { @@ -722,23 +720,23 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { if (!quiet) { showToast({ title: nextWorkers.length > 0 - ? tx("den.status_loaded_workers", { + ? t("den.status_loaded_workers", { count: nextWorkers.length, - name: activeOrg?.name ?? tr("den.active_org_title"), + name: activeOrg?.name ?? t("den.active_org_title"), }) - : tx("den.status_no_workers", { - name: activeOrg?.name ?? tr("den.active_org_title"), + : t("den.status_no_workers", { + name: activeOrg?.name ?? t("den.active_org_title"), }), tone: "info", }); } } catch (error) { - setWorkersError(error instanceof Error ? error.message : tr("den.error_load_workers")); + setWorkersError(error instanceof Error ? error.message : t("den.error_load_workers")); } finally { setWorkersBusy(false); } }, - [activeOrg, activeOrgId, authToken, client, showToast, tr, tx], + [activeOrg, activeOrgId, authToken, client, showToast], ); React.useEffect(() => { @@ -762,8 +760,8 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { const count = props.extensions.cloudOrgSkillHubs().length; showToast({ title: count > 0 - ? `Loaded ${count} cloud skill hub${count === 1 ? "" : "s"} for ${activeOrg?.name ?? tr("den.active_org_title")}.` - : `No cloud skill hubs are available for ${activeOrg?.name ?? tr("den.active_org_title")}.`, + ? `Loaded ${count} cloud skill hub${count === 1 ? "" : "s"} for ${activeOrg?.name ?? t("den.active_org_title")}.` + : `No cloud skill hubs are available for ${activeOrg?.name ?? t("den.active_org_title")}.`, tone: "info", }); } @@ -777,7 +775,7 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { setSkillHubsBusy(false); } }, - [activeOrg, activeOrgId, authToken, props.extensions, syncCurrentDenSettings, tr], + [activeOrg, activeOrgId, authToken, props.extensions, syncCurrentDenSettings], ); React.useEffect(() => { @@ -801,25 +799,25 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { const count = props.extensions.cloudOrgSkills().length; showToast({ title: count > 0 - ? tx("den.status_loaded_skills", { + ? t("den.status_loaded_skills", { count, - name: activeOrg?.name ?? tr("den.active_org_title"), + name: activeOrg?.name ?? t("den.active_org_title"), }) - : tx("den.status_no_skills", { - name: activeOrg?.name ?? tr("den.active_org_title"), + : t("den.status_no_skills", { + name: activeOrg?.name ?? t("den.active_org_title"), }), tone: "info", }); } } catch (error) { if (!quiet) { - setSkillActionError(error instanceof Error ? error.message : tr("den.error_load_skills")); + setSkillActionError(error instanceof Error ? error.message : t("den.error_load_skills")); } } finally { setSkillsBusy(false); } }, - [activeOrg, activeOrgId, authToken, props.extensions, syncCurrentDenSettings, tr, tx], + [activeOrg, activeOrgId, authToken, props.extensions, syncCurrentDenSettings], ); React.useEffect(() => { @@ -842,8 +840,8 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { const count = props.extensions.cloudOrgMarketplaces().length; showToast({ title: count > 0 - ? `Loaded ${count} marketplace${count === 1 ? "" : "s"} for ${activeOrg?.name ?? tr("den.active_org_title")}.` - : `No marketplaces are available for ${activeOrg?.name ?? tr("den.active_org_title")}.`, + ? `Loaded ${count} marketplace${count === 1 ? "" : "s"} for ${activeOrg?.name ?? t("den.active_org_title")}.` + : `No marketplaces are available for ${activeOrg?.name ?? t("den.active_org_title")}.`, tone: "info", }); } @@ -855,7 +853,7 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { setMarketplacesBusy(false); } }, - [activeOrg, activeOrgId, authToken, props.extensions, showToast, tr], + [activeOrg, activeOrgId, authToken, props.extensions, showToast], ); React.useEffect(() => { @@ -878,8 +876,8 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { if (!quiet) { showToast({ title: items.length > 0 - ? `Loaded ${items.length} cloud provider${items.length === 1 ? "" : "s"} for ${activeOrg?.name ?? tr("den.active_org_title")}.` - : `No cloud providers are available for ${activeOrg?.name ?? tr("den.active_org_title")}.`, + ? `Loaded ${items.length} cloud provider${items.length === 1 ? "" : "s"} for ${activeOrg?.name ?? t("den.active_org_title")}.` + : `No cloud providers are available for ${activeOrg?.name ?? t("den.active_org_title")}.`, tone: "info", }); } @@ -893,7 +891,7 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { setProvidersBusy(false); } }, - [activeOrg, activeOrgId, authToken, props, syncCurrentDenSettings, tr], + [activeOrg, activeOrgId, authToken, props, syncCurrentDenSettings], ); React.useEffect(() => { @@ -923,35 +921,35 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { setSessionBusy(false); setStatusMessage( customEvent.detail.email?.trim() - ? tx("den.status_cloud_signed_in_as", { email: customEvent.detail.email.trim() }) - : tr("den.status_cloud_signin_done"), + ? t("den.status_cloud_signed_in_as", { email: customEvent.detail.email.trim() }) + : t("den.status_cloud_signin_done"), ); } else if (customEvent.detail?.status === "error") { - setAuthError(customEvent.detail.message?.trim() || tr("den.error_signin_failed")); + setAuthError(customEvent.detail.message?.trim() || t("den.error_signin_failed")); } }; window.addEventListener(denSessionUpdatedEvent, handler as EventListener); return () => window.removeEventListener(denSessionUpdatedEvent, handler as EventListener); - }, [clearSessionState, tr, tx]); + }, [clearSessionState]); // Auth mutations: manual sign-in and sign-out const submitManualAuth = React.useCallback(async (input: string) => { const parsed = parseManualAuthInput(input); if (!parsed || authBusy) { - if (!parsed) setAuthError(tr("den.error_paste_valid_code")); + if (!parsed) setAuthError(t("den.error_paste_valid_code")); return false; } const nextBaseUrl = parsed.baseUrl ?? baseUrl; setAuthBusy(true); setAuthError(null); - setStatusMessage(tr("den.signing_in")); + setStatusMessage(t("den.signing_in")); try { const result = await createDenClient({ baseUrl: nextBaseUrl }).exchangeDesktopHandoff(parsed.grant); if (!result.token) { - throw new Error(tr("den.error_no_token")); + throw new Error(t("den.error_no_token")); } if (props.developerMode) { @@ -978,13 +976,13 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { } catch (error) { dispatchDenSessionUpdated({ status: "error", - message: error instanceof Error ? error.message : tr("den.error_signin_failed"), + message: error instanceof Error ? error.message : t("den.error_signin_failed"), }); return false; } finally { setAuthBusy(false); } - }, [authBusy, baseUrl, props.developerMode, tr]); + }, [authBusy, baseUrl, props.developerMode]); const signOut = React.useCallback(async () => { if (authBusy) return; @@ -1000,8 +998,8 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { setAuthBusy(false); } - clearSignedInState(tr("den.status_signed_out")); - }, [authBusy, authToken, clearSignedInState, client, tr]); + clearSignedInState(t("den.status_signed_out")); + }, [authBusy, authToken, clearSignedInState, client]); // Organization mutation: active org switch const handleActiveOrgChange = React.useCallback( @@ -1022,11 +1020,11 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { }).catch(() => null); } showToast({ - title: tx("den.org_switched", { name: nextOrg?.name ?? tr("den.active_org_title") }), + title: t("den.org_switched", { name: nextOrg?.name ?? t("den.active_org_title") }), tone: "success", }); }, - [authToken, baseUrl, orgs, showToast, tr, tx], + [authToken, baseUrl, orgs, showToast], ); // Worker mutation: open remote workspace @@ -1034,7 +1032,7 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { async (workerId: string, workerName: string) => { const orgId = activeOrgId.trim(); if (!orgId) { - setWorkersError(tr("den.error_choose_org")); + setWorkersError(t("den.error_choose_org")); return; } @@ -1046,7 +1044,7 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { const openworkUrl = tokens.openworkUrl?.trim() ?? ""; const accessToken = tokens.ownerToken?.trim() || tokens.clientToken?.trim() || ""; if (!openworkUrl || !accessToken) { - throw new Error(tr("den.error_worker_not_ready")); + throw new Error(t("den.error_worker_not_ready")); } const ok = await props.connectRemoteWorkspace({ @@ -1056,24 +1054,24 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { displayName: workerName, }); if (!ok) { - throw new Error(tx("den.error_open_worker", { name: workerName })); + throw new Error(t("den.error_open_worker", { name: workerName })); } showToast({ - title: tx("den.status_opened_worker", { name: workerName }), + title: t("den.status_opened_worker", { name: workerName }), tone: "success", }); } catch (error) { setWorkersError( error instanceof Error ? error.message - : tx("den.error_open_worker_fallback", { name: workerName }), + : t("den.error_open_worker_fallback", { name: workerName }), ); } finally { setOpeningWorkerId(null); } }, - [activeOrgId, client, props, showToast, tr, tx], + [activeOrgId, client, props, showToast], ); // Skill hub mutations @@ -1089,7 +1087,7 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { try { const result = await props.extensions.importCloudOrgSkillHub(hub); if (!result.ok) throw new Error(result.message); - showToast({ title: `${result.message} ${tr("den.reload_workspace")}`, tone: "success" }); + showToast({ title: `${result.message} ${t("den.reload_workspace")}`, tone: "success" }); } catch (error) { setSkillHubActionError(error instanceof Error ? error.message : `Failed to import ${hub.name}.`); } finally { @@ -1097,7 +1095,7 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { setSkillHubActionKind(null); } }, - [props.extensions, showToast, skillHubActionId, tr], + [props.extensions, showToast, skillHubActionId], ); const handleRemoveSkillHub = React.useCallback( @@ -1112,7 +1110,7 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { try { const result = await props.extensions.removeCloudOrgSkillHub(hubId); if (!result.ok) throw new Error(result.message); - showToast({ title: `${result.message} ${tr("den.reload_workspace")}`, tone: "success" }); + showToast({ title: `${result.message} ${t("den.reload_workspace")}`, tone: "success" }); } catch (error) { setSkillHubActionError(error instanceof Error ? error.message : `Failed to remove ${imported.name}.`); } finally { @@ -1120,7 +1118,7 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { setSkillHubActionKind(null); } }, - [props.extensions, showToast, skillHubActionId, tr], + [props.extensions, showToast, skillHubActionId], ); const handleSyncSkillHub = React.useCallback( @@ -1135,7 +1133,7 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { try { const result = await props.extensions.syncCloudOrgSkillHub(hub); if (!result.ok) throw new Error(result.message); - showToast({ title: `${result.message} ${tr("den.reload_workspace")}`, tone: "success" }); + showToast({ title: `${result.message} ${t("den.reload_workspace")}`, tone: "success" }); } catch (error) { setSkillHubActionError(error instanceof Error ? error.message : `Failed to sync ${hub.name}.`); } finally { @@ -1143,7 +1141,7 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { setSkillHubActionKind(null); } }, - [props.extensions, showToast, skillHubActionId, tr], + [props.extensions, showToast, skillHubActionId], ); // Skill mutations @@ -1159,17 +1157,17 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { try { const result = await props.extensions.installCloudOrgSkill(skill); if (!result.ok) throw new Error(result.message); - showToast({ title: `${result.message} ${tr("den.reload_workspace")}`, tone: "success" }); + showToast({ title: `${result.message} ${t("den.reload_workspace")}`, tone: "success" }); } catch (error) { setSkillActionError( - error instanceof Error ? error.message : tx("den.import_skill_failed", { name: title }), + error instanceof Error ? error.message : t("den.import_skill_failed", { name: title }), ); } finally { setSkillActionId(null); setSkillActionKind(null); } }, - [props.extensions, showToast, skillActionId, tr, tx], + [props.extensions, showToast, skillActionId], ); const handleRemoveSkill = React.useCallback( @@ -1183,17 +1181,17 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { try { const result = await props.extensions.removeCloudOrgSkill(cloudSkillId); if (!result.ok) throw new Error(result.message); - showToast({ title: `${result.message} ${tr("den.reload_workspace")}`, tone: "success" }); + showToast({ title: `${result.message} ${t("den.reload_workspace")}`, tone: "success" }); } catch (error) { setSkillActionError( - error instanceof Error ? error.message : tx("den.remove_skill_failed", { name: title }), + error instanceof Error ? error.message : t("den.remove_skill_failed", { name: title }), ); } finally { setSkillActionId(null); setSkillActionKind(null); } }, - [props.extensions, showToast, skillActionId, tr, tx], + [props.extensions, showToast, skillActionId], ); const handleSyncSkill = React.useCallback( @@ -1208,17 +1206,17 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { try { const result = await props.extensions.syncCloudOrgSkill(skill); if (!result.ok) throw new Error(result.message); - showToast({ title: `${result.message} ${tr("den.reload_workspace")}`, tone: "success" }); + showToast({ title: `${result.message} ${t("den.reload_workspace")}`, tone: "success" }); } catch (error) { setSkillActionError( - error instanceof Error ? error.message : tx("den.sync_skill_failed", { name: title }), + error instanceof Error ? error.message : t("den.sync_skill_failed", { name: title }), ); } finally { setSkillActionId(null); setSkillActionKind(null); } }, - [props.extensions, showToast, skillActionId, tr, tx], + [props.extensions, showToast, skillActionId], ); // Marketplace plugin mutations @@ -1232,14 +1230,14 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { try { const result = await props.extensions.importCloudOrgPlugin(marketplaceId, plugin); if (!result.ok) throw new Error(result.message); - showToast({ title: `${result.message} ${tr("den.reload_workspace")}`, tone: "success" }); + showToast({ title: `${result.message} ${t("den.reload_workspace")}`, tone: "success" }); } catch (error) { setPluginActionError(error instanceof Error ? error.message : `Failed to import ${plugin.name}.`); } finally { setPluginActionId(null); } }, - [pluginActionId, props.extensions, showToast, tr], + [pluginActionId, props.extensions, showToast], ); // Provider mutations @@ -1254,19 +1252,19 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { try { const message = await props.connectCloudProvider(cloudProviderId); showToast({ - title: `${message || tx("den.imported_provider", { name: providerName })} ${tr("den.reload_workspace")}`, + title: `${message || t("den.imported_provider", { name: providerName })} ${t("den.reload_workspace")}`, tone: "success", }); } catch (error) { setProviderActionError( - error instanceof Error ? error.message : tx("den.import_provider_failed", { name: providerName }), + error instanceof Error ? error.message : t("den.import_provider_failed", { name: providerName }), ); } finally { setProviderActionId(null); setProviderActionKind(null); } }, - [props, providerActionId, showToast, tr, tx], + [props, providerActionId, showToast], ); const handleRemoveProvider = React.useCallback( @@ -1280,19 +1278,19 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { try { const message = await props.removeCloudProvider(cloudProviderId); showToast({ - title: `${message || tx("den.removed_provider", { name: providerName })} ${tr("den.reload_workspace")}`, + title: `${message || t("den.removed_provider", { name: providerName })} ${t("den.reload_workspace")}`, tone: "success", }); } catch (error) { setProviderActionError( - error instanceof Error ? error.message : tx("den.remove_provider_failed", { name: providerName }), + error instanceof Error ? error.message : t("den.remove_provider_failed", { name: providerName }), ); } finally { setProviderActionId(null); setProviderActionKind(null); } }, - [props, providerActionId, showToast, tr, tx], + [props, providerActionId, showToast], ); const handleSyncProvider = React.useCallback( @@ -1306,19 +1304,19 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { try { await props.connectCloudProvider(cloudProviderId); showToast({ - title: `${tx("den.synced_provider", { name: providerName })} ${tr("den.reload_workspace")}`, + title: `${t("den.synced_provider", { name: providerName })} ${t("den.reload_workspace")}`, tone: "success", }); } catch (error) { setProviderActionError( - error instanceof Error ? error.message : tx("den.sync_provider_failed", { name: providerName }), + error instanceof Error ? error.message : t("den.sync_provider_failed", { name: providerName }), ); } finally { setProviderActionId(null); setProviderActionKind(null); } }, - [props, providerActionId, showToast, tr, tx], + [props, providerActionId, showToast], ); return ( @@ -1328,17 +1326,17 @@ export function DenSettingsPanel(props: DenSettingsPanelProps) { - {tr("den.cloud_section_title")} + {t("den.cloud_section_title")} - {tr(isSignedIn ? "den.cloud_signed_in_desc" : "den.cloud_section_desc")} + {t(isSignedIn ? "den.cloud_signed_in_desc" : "den.cloud_section_desc")} {!isSignedIn ? ( - {tr("den.cloud_sleep_hint")} + {t("den.cloud_sleep_hint")} ) : null}