From ade036e215b506476cd1f128ccb95f9761876fbb Mon Sep 17 00:00:00 2001 From: johnnyshields <27655+johnnyshields@users.noreply.github.com> Date: Fri, 10 Apr 2026 14:11:14 +0900 Subject: [PATCH 1/5] Cleanup usage of I18n function --- .../app-settings/authorized-folders-panel.tsx | 4 +- apps/app/src/app/app.tsx | 26 +- .../app/bundles/skill-destination-modal.tsx | 53 ++-- apps/app/src/app/bundles/store.ts | 2 +- apps/app/src/app/components/add-mcp-modal.tsx | 44 ++- .../components/control-chrome-setup-modal.tsx | 37 ++- .../src/app/components/den-settings-panel.tsx | 273 +++++++++--------- .../app/src/app/components/mcp-auth-modal.tsx | 173 ++++++----- .../src/app/components/model-picker-modal.tsx | 23 +- .../app/src/app/components/question-modal.tsx | 2 +- .../app/components/rename-session-modal.tsx | 15 +- .../app/components/rename-workspace-modal.tsx | 15 +- apps/app/src/app/components/reset-modal.tsx | 21 +- .../src/app/components/session/composer.tsx | 2 +- .../app/components/session/message-list.tsx | 22 +- .../session/workspace-session-list.tsx | 2 +- apps/app/src/app/components/status-bar.tsx | 6 +- .../app/connections/openwork-server-store.ts | 8 +- apps/app/src/app/connections/store.ts | 33 +-- apps/app/src/app/context/extensions.ts | 145 +++++----- apps/app/src/app/context/global-sync.tsx | 4 +- apps/app/src/app/context/model-config.ts | 18 +- apps/app/src/app/context/providers/store.ts | 6 +- apps/app/src/app/context/session.ts | 16 +- apps/app/src/app/context/workspace.ts | 56 ++-- apps/app/src/app/lib/model-behavior.ts | 2 +- apps/app/src/app/pages/automations.tsx | 24 +- apps/app/src/app/pages/extensions.tsx | 4 +- apps/app/src/app/pages/identities.tsx | 18 +- apps/app/src/app/pages/mcp.tsx | 103 ++++--- apps/app/src/app/pages/session.tsx | 26 +- apps/app/src/app/pages/settings.tsx | 118 ++++---- apps/app/src/app/pages/skills.tsx | 241 ++++++++-------- apps/app/src/app/session/actions-store.ts | 26 +- apps/app/src/app/session/share-workspace.ts | 2 +- apps/app/src/app/shell/deep-links.ts | 12 +- apps/app/src/app/shell/settings-shell.tsx | 10 +- apps/app/src/app/utils/index.ts | 6 +- .../create-remote-workspace-modal.tsx | 13 +- .../app/workspace/create-workspace-modal.tsx | 89 +++--- apps/app/src/i18n/index.ts | 7 +- .../react/session/session-surface.react.tsx | 2 +- apps/app/src/react/session/session-sync.ts | 2 +- apps/app/src/react/session/usechat-adapter.ts | 2 +- 44 files changed, 845 insertions(+), 868 deletions(-) diff --git a/apps/app/src/app/app-settings/authorized-folders-panel.tsx b/apps/app/src/app/app-settings/authorized-folders-panel.tsx index 66b1554fa..6c840d9d5 100644 --- a/apps/app/src/app/app-settings/authorized-folders-panel.tsx +++ b/apps/app/src/app/app-settings/authorized-folders-panel.tsx @@ -89,7 +89,7 @@ const buildAuthorizedFoldersStatus = (preservedCount: number, action?: string) = preservedCount > 0 ? preservedCount === 1 ? t("context_panel.preserving_entry") - : t("context_panel.preserving_entries", undefined, { count: preservedCount }) + : t("context_panel.preserving_entries", { count: preservedCount }) : null; if (action && preservedLabel) return `${action} ${preservedLabel}`; return action ?? preservedLabel; @@ -406,7 +406,7 @@ export default function AuthorizedFoldersPanel(props: AuthorizedFoldersPanelProp authorizedFoldersSaving() || !canWriteConfig() } - aria-label={t("context_panel.remove_folder", undefined, { name: folderName })} + aria-label={t("context_panel.remove_folder", { name: folderName })} > diff --git a/apps/app/src/app/app.tsx b/apps/app/src/app/app.tsx index 7a8a459a9..ded567c79 100644 --- a/apps/app/src/app/app.tsx +++ b/apps/app/src/app/app.tsx @@ -1985,16 +1985,16 @@ export default function App() { }); const headerStatus = createMemo(() => { - if (!client() || !headerConnectedVersion()) return t("status.disconnected", currentLocale()); - const bits = [`${t("status.connected", currentLocale())} · ${headerConnectedVersion()}`]; - if (sseConnected()) bits.push(t("status.live", currentLocale())); + if (!client() || !headerConnectedVersion()) return t("status.disconnected"); + const bits = [`${t("status.connected")} · ${headerConnectedVersion()}`]; + if (sseConnected()) bits.push(t("status.live")); return bits.join(" · "); }); const busyHint = createMemo(() => { if (!busy() || !busyLabel()) return null; const seconds = busySeconds(); - const label = t(busyLabel()!, currentLocale()); + const label = t(busyLabel()!); return seconds > 0 ? `${label} · ${seconds}s` : label; }); @@ -2572,17 +2572,17 @@ export default function App() { return !doctor?.ready; })()} workerDisabledReason={(() => { - if (!isTauriRuntime()) return t("app.error.tauri_required", currentLocale()); + if (!isTauriRuntime()) return t("app.error.tauri_required"); if (workspaceStore.sandboxDoctorBusy?.()) { - return t("dashboard.sandbox_checking_docker", currentLocale()); + return t("dashboard.sandbox_checking_docker"); } const doctor = workspaceStore.sandboxDoctorResult?.(); if (!doctor || doctor.ready) return null; const message = doctor?.error?.trim(); - return message || t("dashboard.sandbox_get_ready_desc", currentLocale()); + return message || t("dashboard.sandbox_get_ready_desc"); })()} - workerCtaLabel={t("dashboard.sandbox_get_ready_action", currentLocale())} - workerCtaDescription={t("dashboard.sandbox_get_ready_desc", currentLocale())} + workerCtaLabel={t("dashboard.sandbox_get_ready_action")} + workerCtaDescription={t("dashboard.sandbox_get_ready_desc")} onWorkerCta={async () => { const url = "https://www.docker.com/products/docker-desktop/"; if (isTauriRuntime()) { @@ -2592,7 +2592,7 @@ export default function App() { window.open(url, "_blank", "noopener,noreferrer"); } }} - workerRetryLabel={t("common.retry", currentLocale())} + workerRetryLabel={t("common.retry")} workerDebugLines={(() => { const doctor = workspaceStore.sandboxDoctorResult?.(); const lines: string[] = []; @@ -2718,9 +2718,9 @@ export default function App() { initialValues={workspaceStore.editRemoteWorkspaceDefaults() ?? undefined} submitting={busy() && busyLabel() === "status.connecting"} error={workspaceStore.editRemoteWorkspaceError()} - title={t("dashboard.edit_remote_workspace_title", currentLocale())} - subtitle={t("dashboard.edit_remote_workspace_subtitle", currentLocale())} - confirmLabel={t("dashboard.edit_remote_workspace_confirm", currentLocale())} + title={t("dashboard.edit_remote_workspace_title")} + subtitle={t("dashboard.edit_remote_workspace_subtitle")} + confirmLabel={t("dashboard.edit_remote_workspace_confirm")} /> diff --git a/apps/app/src/app/bundles/skill-destination-modal.tsx b/apps/app/src/app/bundles/skill-destination-modal.tsx index b68526f12..1600bbefa 100644 --- a/apps/app/src/app/bundles/skill-destination-modal.tsx +++ b/apps/app/src/app/bundles/skill-destination-modal.tsx @@ -2,7 +2,7 @@ import { For, Show, createEffect, createMemo, createSignal } from "solid-js"; import { CheckCircle2, Folder, FolderPlus, Globe, Loader2, Sparkles, X } from "lucide-solid"; import type { WorkspaceInfo } from "../lib/tauri"; -import { t, currentLocale } from "../../i18n"; +import { t } from "../../i18n"; import Button from "../components/button"; @@ -23,7 +23,6 @@ export default function SkillDestinationModal(props: { onCreateWorker?: () => void; onConnectRemote?: () => void; }) { - const translate = (key: string) => t(key, currentLocale()); const [selectedWorkspaceId, setSelectedWorkspaceId] = createSignal(null); const displayName = (workspace: WorkspaceInfo) => @@ -37,14 +36,14 @@ export default function SkillDestinationModal(props: { const subtitle = (workspace: WorkspaceInfo) => { if (workspace.workspaceType === "local") { - return workspace.path?.trim() || translate("share_skill_destination.local_badge"); + return workspace.path?.trim() || t("share_skill_destination.local_badge"); } return ( workspace.directory?.trim() || workspace.openworkHostUrl?.trim() || workspace.baseUrl?.trim() || workspace.path?.trim() || - translate("share_skill_destination.remote_badge") + t("share_skill_destination.remote_badge") ); }; @@ -55,12 +54,12 @@ export default function SkillDestinationModal(props: { Boolean(workspace.sandboxRunId?.trim()) || Boolean(workspace.sandboxContainerName?.trim())) ) { - return translate("share_skill_destination.sandbox_badge"); + return t("share_skill_destination.sandbox_badge"); } if (workspace.workspaceType === "remote") { - return translate("share_skill_destination.remote_badge"); + return t("share_skill_destination.remote_badge"); } - return translate("share_skill_destination.local_badge"); + return t("share_skill_destination.local_badge"); }; const footerBusy = () => Boolean(props.busyWorkspaceId?.trim()); @@ -106,7 +105,7 @@ export default function SkillDestinationModal(props: {
- {translate("share_skill_destination.skill_label")} + {t("share_skill_destination.skill_label")}
@@ -115,17 +114,17 @@ export default function SkillDestinationModal(props: {
- {translate("share_skill_destination.skill_label")} + {t("share_skill_destination.skill_label")}

- {props.skill?.name ?? translate("share_skill_destination.fallback_skill_name")} + {props.skill?.name ?? t("share_skill_destination.fallback_skill_name")}

{props.skill?.description?.trim()}

- {translate("share_skill_destination.trigger_label")} + {t("share_skill_destination.trigger_label")} {props.skill?.trigger?.trim()}
@@ -133,8 +132,8 @@ export default function SkillDestinationModal(props: {
-

{translate("share_skill_destination.title")}

-

{translate("share_skill_destination.subtitle")}

+

{t("share_skill_destination.title")}

+

{t("share_skill_destination.subtitle")}

@@ -142,7 +141,7 @@ export default function SkillDestinationModal(props: { onClick={props.onClose} disabled={footerBusy()} class={`rounded-full p-2 text-gray-9 transition hover:bg-gray-2 hover:text-gray-12 ${footerBusy() ? "cursor-not-allowed opacity-50" : ""}`.trim()} - aria-label={translate("common.close")} + aria-label={t("common.close")} > @@ -152,7 +151,7 @@ export default function SkillDestinationModal(props: {
-
{translate("share_skill_destination.existing_workers")}
+
{t("share_skill_destination.existing_workers")}
0}> {props.workspaces.length} @@ -162,7 +161,7 @@ export default function SkillDestinationModal(props: { when={props.workspaces.length > 0} fallback={
- {translate("share_skill_destination.no_workers")} + {t("share_skill_destination.no_workers")}
} > @@ -196,7 +195,7 @@ export default function SkillDestinationModal(props: {
{displayName(workspace)}
- {translate("share_skill_destination.current_badge")} + {t("share_skill_destination.current_badge")} @@ -204,14 +203,14 @@ export default function SkillDestinationModal(props: { - {translate("share_skill_destination.selected_badge")} + {t("share_skill_destination.selected_badge")}
{subtitle(workspace)}
-
{translate("share_skill_destination.selected_hint")}
+
{t("share_skill_destination.selected_hint")}
@@ -231,7 +230,7 @@ export default function SkillDestinationModal(props: {
-
{translate("share_skill_destination.more_options")}
+
{t("share_skill_destination.more_options")}
-
{translate("share_skill_destination.create_worker")}
-
{translate("share_skill_destination.create_worker_hint")}
+
{t("share_skill_destination.create_worker")}
+
{t("share_skill_destination.create_worker_hint")}
@@ -264,8 +263,8 @@ export default function SkillDestinationModal(props: {
-
{translate("share_skill_destination.connect_remote")}
-
{translate("share_skill_destination.connect_remote_hint")}
+
{t("share_skill_destination.connect_remote")}
+
{t("share_skill_destination.connect_remote_hint")}
@@ -289,13 +288,13 @@ export default function SkillDestinationModal(props: {
diff --git a/apps/app/src/app/bundles/store.ts b/apps/app/src/app/bundles/store.ts index 0d8a451fa..77afba2c8 100644 --- a/apps/app/src/app/bundles/store.ts +++ b/apps/app/src/app/bundles/store.ts @@ -639,7 +639,7 @@ export function createBundlesStore(options: { b.path?.trim() || b.baseUrl?.trim() || ""; - return aLabel.localeCompare(bLabel, undefined, { sensitivity: "base" }); + return aLabel.localeCompare(bLabel, { sensitivity: "base" }); }); }); diff --git a/apps/app/src/app/components/add-mcp-modal.tsx b/apps/app/src/app/components/add-mcp-modal.tsx index 9301c0e8e..318c37f8e 100644 --- a/apps/app/src/app/components/add-mcp-modal.tsx +++ b/apps/app/src/app/components/add-mcp-modal.tsx @@ -15,8 +15,6 @@ export type AddMcpModalProps = { }; export default function AddMcpModal(props: AddMcpModalProps) { - const tr = (key: string) => t(key, props.language); - const [name, setName] = createSignal(""); const [serverType, setServerType] = createSignal<"remote" | "local">("remote"); const [url, setUrl] = createSignal(""); @@ -46,7 +44,7 @@ export default function AddMcpModal(props: AddMcpModalProps) { const trimmedName = name().trim(); if (!trimmedName) { - setError(tr("mcp.name_required")); + setError(t("mcp.name_required")); return; } @@ -55,7 +53,7 @@ export default function AddMcpModal(props: AddMcpModalProps) { if (serverType() === "remote") { const trimmedUrl = url().trim(); if (!trimmedUrl) { - setError(tr("mcp.url_or_command_required")); + setError(t("mcp.url_or_command_required")); setSubmitting(false); return; } @@ -74,7 +72,7 @@ export default function AddMcpModal(props: AddMcpModalProps) { } else { const trimmedCommand = command().trim(); if (!trimmedCommand) { - setError(tr("mcp.url_or_command_required")); + setError(t("mcp.url_or_command_required")); setSubmitting(false); return; } @@ -111,9 +109,9 @@ export default function AddMcpModal(props: AddMcpModalProps) {

- {tr("mcp.add_modal_title")} + {t("mcp.add_modal_title")}

-

{tr("mcp.add_modal_subtitle")}

+

{t("mcp.add_modal_subtitle")}

-
{tr("mcp.remote_workspace_url_hint")}
+
{t("mcp.remote_workspace_url_hint")}
setUrl(e.currentTarget.value)} />
-
{tr("mcp.sign_in_section_label")}
+
{t("mcp.sign_in_section_label")}
@@ -197,9 +195,9 @@ export default function AddMcpModal(props: AddMcpModalProps) { setCommand(e.currentTarget.value)} /> @@ -215,13 +213,13 @@ export default function AddMcpModal(props: AddMcpModalProps) { {/* Footer */}
diff --git a/apps/app/src/app/components/control-chrome-setup-modal.tsx b/apps/app/src/app/components/control-chrome-setup-modal.tsx index d8674014b..88aae7ab8 100644 --- a/apps/app/src/app/components/control-chrome-setup-modal.tsx +++ b/apps/app/src/app/components/control-chrome-setup-modal.tsx @@ -14,7 +14,6 @@ export type ControlChromeSetupModalProps = { }; export default function ControlChromeSetupModal(props: ControlChromeSetupModalProps) { - const tr = (key: string) => t(key, props.language); const [useExistingProfile, setUseExistingProfile] = createSignal(props.initialUseExistingProfile); createEffect(() => { @@ -37,10 +36,10 @@ export default function ControlChromeSetupModal(props: ControlChromeSetupModalPr

- {tr("mcp.control_chrome_setup_title")} + {t("mcp.control_chrome_setup_title")}

- {tr("mcp.control_chrome_setup_subtitle")} + {t("mcp.control_chrome_setup_subtitle")}

@@ -48,7 +47,7 @@ export default function ControlChromeSetupModal(props: ControlChromeSetupModalPr type="button" class="rounded-xl p-2 text-gray-11 transition-colors hover:bg-gray-4 hover:text-gray-12" onClick={props.onClose} - aria-label={tr("common.cancel")} + aria-label={t("common.cancel")} > @@ -63,15 +62,15 @@ export default function ControlChromeSetupModal(props: ControlChromeSetupModalPr

- {tr("mcp.control_chrome_browser_title")} + {t("mcp.control_chrome_browser_title")}

- {tr("mcp.control_chrome_browser_hint")} + {t("mcp.control_chrome_browser_hint")}

    -
  1. 1. {tr("mcp.control_chrome_browser_step_one")}
  2. -
  3. 2. {tr("mcp.control_chrome_browser_step_two")}
  4. -
  5. 3. {tr("mcp.control_chrome_browser_step_three")}
  6. +
  7. 1. {t("mcp.control_chrome_browser_step_one")}
  8. +
  9. 2. {t("mcp.control_chrome_browser_step_two")}
  10. +
  11. 3. {t("mcp.control_chrome_browser_step_three")}
- {tr("mcp.control_chrome_docs")} + {t("mcp.control_chrome_docs")}
@@ -93,10 +92,10 @@ export default function ControlChromeSetupModal(props: ControlChromeSetupModalPr

- {tr("mcp.control_chrome_profile_title")} + {t("mcp.control_chrome_profile_title")}

- {tr("mcp.control_chrome_profile_hint")} + {t("mcp.control_chrome_profile_hint")}

@@ -132,13 +131,13 @@ export default function ControlChromeSetupModal(props: ControlChromeSetupModalPr
diff --git a/apps/app/src/app/components/den-settings-panel.tsx b/apps/app/src/app/components/den-settings-panel.tsx index 5527443a3..29087e629 100644 --- a/apps/app/src/app/components/den-settings-panel.tsx +++ b/apps/app/src/app/components/den-settings-panel.tsx @@ -3,7 +3,7 @@ import { ArrowUpRight, Boxes, Brain, Cloud, KeyRound, LogOut, RefreshCcw, Server import Button from "./button"; import TextInput from "./text-input"; -import { currentLocale, t } from "../../i18n"; +import { t } from "../../i18n"; import { buildDenAuthUrl, clearDenSession, @@ -95,18 +95,18 @@ function workerStatusMeta(status: string, tr: (key: string) => string) { const normalized = status.trim().toLowerCase(); 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", }; @@ -116,7 +116,6 @@ function workerStatusMeta(status: string, tr: (key: string) => string) { export default function DenSettingsPanel(props: DenSettingsPanelProps) { const platform = usePlatform(); const extensions = useExtensions(); - const tr = (key: string) => t(key, currentLocale()); const initial = readDenSettings(); const initialBaseUrl = initial.baseUrl || DEFAULT_DEN_BASE_URL; @@ -171,7 +170,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { createDenClient({ baseUrl: baseUrl(), token: authToken() }), ); const isSignedIn = createMemo(() => Boolean(user() && authToken().trim())); - const activeOrgName = createMemo(() => activeOrg()?.name || tr("den.no_org_selected")); + const activeOrgName = createMemo(() => activeOrg()?.name || t("den.no_org_selected")); const templateCacheSnapshot = createMemo(() => readDenTemplateCacheSnapshot({ baseUrl: baseUrl(), @@ -270,10 +269,10 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { }); const summaryLabel = createMemo(() => { - if (authError()) return tr("den.needs_attention"); - if (sessionBusy()) return tr("den.checking_session"); - if (isSignedIn()) return t("dashboard.connected", currentLocale()); - return tr("den.signed_out"); + 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"); }); createEffect(() => { @@ -294,8 +293,8 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { platform.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); }; @@ -331,7 +330,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { const parsed = parseManualAuthInput(manualAuthInput()); if (!parsed || authBusy()) { if (!parsed) { - setAuthError(tr("den.error_paste_valid_code")); + setAuthError(t("den.error_paste_valid_code")); } return; } @@ -340,12 +339,12 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { 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) { @@ -376,7 +375,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { message: error instanceof Error ? error.message - : tr("den.error_signin_failed"), + : t("den.error_signin_failed"), }); } finally { setAuthBusy(false); @@ -420,7 +419,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { const applyBaseUrl = () => { const normalized = normalizeDenBaseUrl(baseUrlDraft()); if (!normalized) { - setBaseUrlError(tr("den.error_base_url")); + setBaseUrlError(t("den.error_base_url")); return; } @@ -433,7 +432,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { setBaseUrl(resolved.baseUrl); setBaseUrlDraft(resolved.baseUrl); - clearSignedInState(tr("den.status_base_url_updated")); + clearSignedInState(t("den.status_base_url_updated")); }; const refreshOrgs = async (quiet = false) => { @@ -463,11 +462,11 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { }); if (!quiet && response.orgs.length > 0) { setStatusMessage( - t("den.status_loaded_orgs", currentLocale(), { count: response.orgs.length, plural: response.orgs.length === 1 ? "" : "s" }), + t("den.status_loaded_orgs", { count: response.orgs.length, plural: response.orgs.length === 1 ? "" : "s" }), ); } } 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); } @@ -489,12 +488,12 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { if (!quiet) { setStatusMessage( nextWorkers.length > 0 - ? t("den.status_loaded_workers", currentLocale(), { count: nextWorkers.length, plural: nextWorkers.length === 1 ? "" : "s", name: activeOrg()?.name ?? tr("den.active_org_title") }) - : t("den.status_no_workers", currentLocale(), { name: activeOrg()?.name ?? tr("den.active_org_title") }), + ? t("den.status_loaded_workers", { count: nextWorkers.length, plural: nextWorkers.length === 1 ? "" : "s", name: activeOrg()?.name ?? t("den.active_org_title") }) + : t("den.status_no_workers", { name: activeOrg()?.name ?? t("den.active_org_title") }), ); } } 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); } @@ -520,13 +519,13 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { if (!quiet) { setStatusMessage( nextTemplates.length > 0 - ? t("den.status_loaded_templates", currentLocale(), { count: nextTemplates.length, plural: nextTemplates.length === 1 ? "" : "s", name: activeOrg()?.name ?? tr("den.active_org_title") }) - : t("den.status_no_templates", currentLocale(), { name: activeOrg()?.name ?? tr("den.active_org_title") }), + ? t("den.status_loaded_templates", { count: nextTemplates.length, plural: nextTemplates.length === 1 ? "" : "s", name: activeOrg()?.name ?? t("den.active_org_title") }) + : t("den.status_no_templates", { name: activeOrg()?.name ?? t("den.active_org_title") }), ); } } catch (error) { if (!quiet) { - setTemplateActionError(error instanceof Error ? error.message : tr("den.error_load_templates")); + setTemplateActionError(error instanceof Error ? error.message : t("den.error_load_templates")); } } }; @@ -546,8 +545,8 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { const count = extensions.cloudOrgSkillHubs().length; setStatusMessage( 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")}.`, ); } } catch (error) { @@ -575,8 +574,8 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { if (!quiet) { setStatusMessage( 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")}.`, ); } } catch (error) { @@ -610,7 +609,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { .then((nextUser) => { if (cancelled) return; setUser(nextUser); - setStatusMessage(t("den.status_signed_in_as", currentLocale(), { email: nextUser.email })); + setStatusMessage(t("den.status_signed_in_as", { email: nextUser.email })); }) .catch((error) => { if (cancelled) return; @@ -620,7 +619,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { clearSessionState(); } setAuthError( - error instanceof Error ? error.message : tr("den.error_no_session"), + error instanceof Error ? error.message : t("den.error_no_session"), ); }) .finally(() => { @@ -682,13 +681,13 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { setSessionBusy(false); setStatusMessage( customEvent.detail.email?.trim() - ? t("den.status_cloud_signed_in_as", currentLocale(), { 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"), + t("den.error_signin_failed"), ); } }; @@ -718,13 +717,13 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { setAuthBusy(false); } - clearSignedInState(tr("den.status_signed_out")); + clearSignedInState(t("den.status_signed_out")); }; const handleOpenWorker = async (workerId: string, workerName: string) => { const orgId = activeOrgId().trim(); if (!orgId) { - setWorkersError(tr("den.error_choose_org")); + setWorkersError(t("den.error_choose_org")); return; } @@ -737,7 +736,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { 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({ @@ -747,13 +746,13 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { displayName: workerName, }); if (!ok) { - throw new Error(t("den.error_open_worker", currentLocale(), { name: workerName })); + throw new Error(t("den.error_open_worker", { name: workerName })); } - setStatusMessage(t("den.status_opened_worker", currentLocale(), { name: workerName })); + setStatusMessage(t("den.status_opened_worker", { name: workerName })); } catch (error) { setWorkersError( - error instanceof Error ? error.message : t("den.error_open_worker_fallback", currentLocale(), { name: workerName }), + error instanceof Error ? error.message : t("den.error_open_worker_fallback", { name: workerName }), ); } finally { setOpeningWorkerId(null); @@ -776,11 +775,11 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { const orgName = activeOrg()?.name; setStatusMessage( orgName - ? t("den.status_opened_template", currentLocale(), { name: template.name, org: orgName }) - : t("den.status_opened_template_fallback", currentLocale(), { name: template.name }), + ? t("den.status_opened_template", { name: template.name, org: orgName }) + : t("den.status_opened_template_fallback", { name: template.name }), ); } catch (error) { - setTemplateActionError(error instanceof Error ? error.message : t("den.error_open_template", currentLocale(), { name: template.name })); + setTemplateActionError(error instanceof Error ? error.message : t("den.error_open_template", { name: template.name })); } finally { setOpeningTemplateId(null); } @@ -861,9 +860,9 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { try { const message = await props.connectCloudProvider(cloudProviderId); - setStatusMessage(`${message || t("den.imported_provider", undefined, { name: providerName })} ${t("den.reload_workspace")}`); + setStatusMessage(`${message || t("den.imported_provider", { name: providerName })} ${t("den.reload_workspace")}`); } catch (error) { - setProviderActionError(error instanceof Error ? error.message : t("den.import_provider_failed", undefined, { name: providerName })); + setProviderActionError(error instanceof Error ? error.message : t("den.import_provider_failed", { name: providerName })); } finally { setProviderActionId(null); setProviderActionKind(null); @@ -879,9 +878,9 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { try { const message = await props.removeCloudProvider(cloudProviderId); - setStatusMessage(`${message || t("den.removed_provider", undefined, { name: providerName })} ${t("den.reload_workspace")}`); + setStatusMessage(`${message || t("den.removed_provider", { name: providerName })} ${t("den.reload_workspace")}`); } catch (error) { - setProviderActionError(error instanceof Error ? error.message : t("den.remove_provider_failed", undefined, { name: providerName })); + setProviderActionError(error instanceof Error ? error.message : t("den.remove_provider_failed", { name: providerName })); } finally { setProviderActionId(null); setProviderActionKind(null); @@ -897,9 +896,9 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { try { await props.connectCloudProvider(cloudProviderId); - setStatusMessage(`${t("den.synced_provider", undefined, { name: providerName })} ${t("den.reload_workspace")}`); + setStatusMessage(`${t("den.synced_provider", { name: providerName })} ${t("den.reload_workspace")}`); } catch (error) { - setProviderActionError(error instanceof Error ? error.message : t("den.sync_provider_failed", undefined, { name: providerName })); + setProviderActionError(error instanceof Error ? error.message : t("den.sync_provider_failed", { name: providerName })); } finally { setProviderActionId(null); setProviderActionKind(null); @@ -907,9 +906,9 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { }; const formatTemplateTimestamp = (value: string | null) => { - if (!value) return tr("dashboard.recently_updated"); + if (!value) return t("dashboard.recently_updated"); const date = new Date(value); - if (Number.isNaN(date.getTime())) return tr("dashboard.recently_updated"); + if (Number.isNaN(date.getTime())) return t("dashboard.recently_updated"); return new Intl.DateTimeFormat(undefined, { month: "short", day: "numeric", @@ -919,8 +918,8 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { const templateCreatorLabel = (template: DenTemplate) => { const creator = template.creator; - if (!creator) return tr("dashboard.unknown_creator"); - return creator.name?.trim() || creator.email?.trim() || tr("dashboard.unknown_creator"); + if (!creator) return t("dashboard.unknown_creator"); + return creator.name?.trim() || creator.email?.trim() || t("dashboard.unknown_creator"); }; const settingsPanelClass = @@ -945,14 +944,14 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
- {tr("den.cloud_section_title")} + {t("den.cloud_section_title")}
- {tr("den.cloud_section_desc")} + {t("den.cloud_section_desc")}
- {tr("den.cloud_sleep_hint")} + {t("den.cloud_sleep_hint")}
@@ -967,11 +966,11 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
setBaseUrlDraft(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={authBusy() || sessionBusy()} />
@@ -981,7 +980,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { onClick={() => setBaseUrlDraft(baseUrl())} disabled={authBusy() || sessionBusy()} > - {tr("den.cloud_control_plane_reset")} + {t("den.cloud_control_plane_reset")}
@@ -1024,16 +1023,16 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
- {tr("den.signin_title")} + {t("den.signin_title")}
- {tr("den.cloud_sleep_hint")} + {t("den.cloud_sleep_hint")}
setManualAuthInput(event.currentTarget.value)} - placeholder={tr("den.signin_link_placeholder")} + placeholder={t("den.signin_link_placeholder")} disabled={authBusy() || sessionBusy()} - hint={tr("den.signin_link_hint")} + hint={t("den.signin_link_hint")} />
- {tr("den.signin_code_note")} + {t("den.signin_code_note")}
@@ -1092,7 +1091,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
- {tr("den.auto_reconnect_hint")} + {t("den.auto_reconnect_hint")}
@@ -1101,9 +1100,9 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
-
{tr("den.cloud_account_title")}
+
{t("den.cloud_account_title")}
- {tr("den.cloud_account_hint")} + {t("den.cloud_account_hint")}
@@ -1124,15 +1123,15 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { disabled={authBusy() || sessionBusy()} > - {authBusy() ? tr("den.signing_out") : tr("den.sign_out")} + {authBusy() ? t("den.signing_out") : t("den.sign_out")}
-
{tr("den.active_org_title")}
+
{t("den.active_org_title")}
- {tr("den.active_org_hint")} + {t("den.active_org_hint")}
@@ -1151,7 +1150,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { activeOrgName: nextOrg?.name ?? null, }); setStatusMessage( - t("den.org_switched", currentLocale(), { name: nextOrg?.name ?? tr("den.active_org_title") }), + t("den.org_switched", { name: nextOrg?.name ?? t("den.active_org_title") }), ); }} disabled={orgsBusy() || orgs().length === 0} @@ -1159,7 +1158,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { {(org) => ( )} @@ -1190,10 +1189,10 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
- {tr("den.cloud_workers_title")} + {t("den.cloud_workers_title")}
- {tr("den.cloud_workers_hint")} + {t("den.cloud_workers_hint")}
@@ -1208,7 +1207,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { disabled={workersBusy() || !activeOrgId().trim()} > - {tr("den.refresh")} + {t("den.refresh")}
@@ -1223,7 +1222,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
- {tr("den.no_cloud_workers")} + {t("den.no_cloud_workers")}
@@ -1245,12 +1244,12 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { - {tr("den.worker_mine_badge")} + {t("den.worker_mine_badge")}
- {worker.provider ? t("den.worker_provider_label", currentLocale(), { provider: worker.provider }) : tr("den.worker_secondary_cloud")} + {worker.provider ? t("den.worker_provider_label", { provider: worker.provider }) : t("den.worker_secondary_cloud")} {(value) => · {value()}} @@ -1263,9 +1262,9 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { void handleOpenWorker(worker.workerId, worker.workerName) } disabled={openingWorkerId() !== null || !status().canOpen} - 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")}
); @@ -1279,10 +1278,10 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
- {tr("den.team_templates_title")} + {t("den.team_templates_title")}
- {tr("den.team_templates_hint")} + {t("den.team_templates_hint")}
@@ -1297,7 +1296,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { disabled={templatesBusy() || !activeOrg()?.slug?.trim()} > - {tr("den.refresh")} + {t("den.refresh")}
@@ -1314,9 +1313,9 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
- {tr("den.no_team_templates")} + {t("den.no_team_templates")}
@@ -1334,11 +1333,11 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { {template.name} - {tr("den.team_template_badge")} + {t("den.team_template_badge")} - {tr("den.worker_mine_badge")} + {t("den.worker_mine_badge")}
@@ -1352,7 +1351,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { onClick={() => void handleOpenTemplate(template)} disabled={openingTemplateId() !== null} > - {opening() ? tr("den.opening") : tr("den.open")} + {opening() ? t("den.opening") : t("den.open")}
); @@ -1366,10 +1365,10 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
- {tr("den.skill_hubs_title")} + {t("den.skill_hubs_title")}
- {tr("den.skill_hubs_hint")} + {t("den.skill_hubs_hint")}
@@ -1384,7 +1383,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { disabled={skillHubsBusy() || !activeOrgId().trim()} > - {tr("den.refresh")} + {t("den.refresh")}
@@ -1399,8 +1398,8 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
- - {tr("den.no_skill_hubs")} + + {t("den.no_skill_hubs")}
@@ -1413,11 +1412,11 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { if (!actionBusy()) return null; switch (skillHubActionKind()) { case "import": - return tr("den.importing"); + return t("den.importing"); case "sync": - return tr("den.syncing"); + return t("den.syncing"); default: - return tr("den.removing"); + return t("den.removing"); } }); return ( @@ -1426,33 +1425,33 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
{row.name} - {t("den.skill_hub_skills_badge", currentLocale(), { + {t("den.skill_hub_skills_badge", { count: row.hub?.skills.length ?? row.importedSkillCount, })} {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")}
{row.status === "available" - ? t("den.skill_hub_detail", currentLocale(), { count: row.liveSkillCount }) + ? t("den.skill_hub_detail", { count: row.liveSkillCount }) : row.status === "imported" - ? t("den.skill_hub_imported_detail", currentLocale(), { + ? t("den.skill_hub_imported_detail", { count: row.importedSkillCount, }) : row.status === "out_of_sync" - ? t("den.skill_hub_sync_detail", currentLocale(), { + ? t("den.skill_hub_sync_detail", { liveCount: row.liveSkillCount, importedCount: row.importedSkillCount, }) - : t("den.skill_hub_removed_detail", currentLocale(), { + : t("den.skill_hub_removed_detail", { importedCount: row.importedSkillCount, })}
@@ -1465,7 +1464,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { onClick={() => void handleSyncSkillHub(row.hubId)} disabled={skillHubActionId() !== null} > - {actionBusy() && skillHubActionKind() === "sync" ? tr("den.syncing") : tr("den.sync")} + {actionBusy() && skillHubActionKind() === "sync" ? t("den.syncing") : t("den.sync")}
@@ -1531,8 +1530,8 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
- - {tr("den.no_cloud_providers")} + + {t("den.no_cloud_providers")}
@@ -1545,11 +1544,11 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { if (!actionBusy()) return null; switch (providerActionKind()) { case "import": - return tr("den.importing"); + return t("den.importing"); case "sync": - return tr("den.syncing"); + return t("den.syncing"); default: - return tr("den.removing"); + return t("den.removing"); } }); return ( @@ -1562,29 +1561,29 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { {row.provider?.providerId ?? row.imported?.providerId} - {tr("den.credentials_ready_badge")} + {t("den.credentials_ready_badge")} {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")}
{row.status === "removed_from_cloud" - ? t("den.cloud_provider_removed_detail", currentLocale(), { + ? t("den.cloud_provider_removed_detail", { providerId: row.imported?.providerId ?? row.name, }) : row.status === "out_of_sync" - ? t("den.cloud_provider_sync_detail", currentLocale(), { + ? t("den.cloud_provider_sync_detail", { count: row.provider?.models.length ?? 0, source: row.provider?.source === "custom" ? "custom" : "managed", }) - : t("den.cloud_provider_detail", currentLocale(), { + : t("den.cloud_provider_detail", { count: row.provider?.models.length ?? 0, source: row.provider?.source === "custom" ? "custom" : "managed", })} @@ -1598,7 +1597,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) { onClick={() => void handleSyncProvider(row.cloudProviderId, row.name)} disabled={providerActionId() !== null} > - {actionBusy() && providerActionKind() === "sync" ? tr("den.syncing") : tr("den.sync")} + {actionBusy() && providerActionKind() === "sync" ? t("den.syncing") : t("den.sync")}
diff --git a/apps/app/src/app/components/mcp-auth-modal.tsx b/apps/app/src/app/components/mcp-auth-modal.tsx index 8d0b04a1b..7f103fda6 100644 --- a/apps/app/src/app/components/mcp-auth-modal.tsx +++ b/apps/app/src/app/components/mcp-auth-modal.tsx @@ -31,15 +31,6 @@ export type McpAuthModalProps = { }; export default function McpAuthModal(props: McpAuthModalProps) { - const translate = (key: string, replacements?: Record) => { - let result = t(key, props.language); - if (replacements) { - Object.entries(replacements).forEach(([placeholder, value]) => { - result = result.replace(`{${placeholder}}`, value); - }); - } - return result; - }; const [loading, setLoading] = createSignal(false); const [error, setError] = createSignal(null); @@ -168,7 +159,7 @@ export default function McpAuthModal(props: McpAuthModalProps) { statusPoll = window.setInterval(async () => { if (Date.now() - startedAt >= MCP_AUTH_TIMEOUT_MS) { stopStatusPolling(); - setError(translate("mcp.auth.request_timed_out")); + setError(t("mcp.auth.request_timed_out")); return; } @@ -193,7 +184,7 @@ export default function McpAuthModal(props: McpAuthModalProps) { try { slug = resolveSlug(entry.name); } catch (err) { - const message = err instanceof Error ? err.message : translate("mcp.auth.failed_to_start_oauth"); + const message = err instanceof Error ? err.message : t("mcp.auth.failed_to_start_oauth"); setError(message); setLoading(false); setAuthInProgress(false); @@ -217,7 +208,7 @@ export default function McpAuthModal(props: McpAuthModalProps) { try { const directory = await resolveDirectory(); if (!directory) { - setError(translate("mcp.pick_workspace_first")); + setError(t("mcp.pick_workspace_first")); return; } @@ -226,8 +217,8 @@ export default function McpAuthModal(props: McpAuthModalProps) { setNeedsReload(true); setReloadNotice( props.reloadBlocked - ? translate("mcp.auth.reload_blocked") - : translate("mcp.auth.reload_notice") + ? t("mcp.auth.reload_blocked") + : t("mcp.auth.reload_notice") ); return; } @@ -251,13 +242,13 @@ export default function McpAuthModal(props: McpAuthModalProps) { } if (status.status === "needs_client_registration") { - setError(status.error ?? translate("mcp.auth.client_registration_required")); + setError(status.error ?? t("mcp.auth.client_registration_required")); } else if (status.status === "disabled") { - setError(translate("mcp.auth.server_disabled")); + setError(t("mcp.auth.server_disabled")); } else if (status.status === "failed") { - setError(status.error ?? translate("mcp.auth.oauth_failed")); + setError(status.error ?? t("mcp.auth.oauth_failed")); } else { - setError(translate("mcp.auth.authorization_still_required")); + setError(t("mcp.auth.authorization_still_required")); } return; } @@ -277,7 +268,7 @@ export default function McpAuthModal(props: McpAuthModalProps) { await openAuthorizationUrl(auth.authorizationUrl); startStatusPolling(slug); } catch (err) { - const message = err instanceof Error ? err.message : translate("mcp.auth.failed_to_start_oauth"); + const message = err instanceof Error ? err.message : t("mcp.auth.failed_to_start_oauth"); if (message.toLowerCase().includes("does not support oauth")) { const serverSlug = props.entry?.name.toLowerCase().replace(/[^a-z0-9]+/g, "-") ?? "server"; @@ -293,18 +284,18 @@ export default function McpAuthModal(props: McpAuthModalProps) { if (props.reloadRequired && !reloadSatisfied()) { setReloadNotice( props.reloadBlocked - ? translate("mcp.auth.reload_blocked") - : translate("mcp.auth.reload_notice") + ? t("mcp.auth.reload_blocked") + : t("mcp.auth.reload_notice") ); } else { setError( - `${message}\n\n` + translate("mcp.auth.oauth_not_supported_hint", { server: serverSlug }) + `${message}\n\n` + t("mcp.auth.oauth_not_supported_hint", { server: serverSlug }) ); } setNeedsReload(true); } else if (message.toLowerCase().includes("not found") || message.toLowerCase().includes("unknown")) { setNeedsReload(true); - setError(translate("mcp.auth.try_reload_engine", { message })); + setError(t("mcp.auth.try_reload_engine", { message })); } else { setError(message); } @@ -339,12 +330,12 @@ export default function McpAuthModal(props: McpAuthModalProps) { if (result.ok) { setError(null); setNeedsReload(true); - setReloadNotice(translate("mcp.auth.oauth_completed_reload")); + setReloadNotice(t("mcp.auth.oauth_completed_reload")); } else { - setCliAuthResult(result.stderr || result.stdout || translate("mcp.auth.reauth_failed")); + setCliAuthResult(result.stderr || result.stdout || t("mcp.auth.reauth_failed")); } } catch (err) { - const message = err instanceof Error ? err.message : translate("mcp.auth.reauth_failed"); + const message = err instanceof Error ? err.message : t("mcp.auth.reauth_failed"); setCliAuthResult(message); } finally { setCliAuthBusy(false); @@ -396,8 +387,8 @@ export default function McpAuthModal(props: McpAuthModalProps) { setNeedsReload(true); setReloadNotice( props.reloadBlocked - ? translate("mcp.auth.reload_blocked") - : translate("mcp.auth.reload_notice") + ? t("mcp.auth.reload_blocked") + : t("mcp.auth.reload_notice") ); return; } @@ -405,7 +396,7 @@ export default function McpAuthModal(props: McpAuthModalProps) { setAwaitingReload(false); startAuth(false, false); } catch (err) { - const message = err instanceof Error ? err.message : translate("mcp.auth.reload_failed"); + const message = err instanceof Error ? err.message : t("mcp.auth.reload_failed"); setAwaitingReload(false); setNeedsReload(true); setError(message); @@ -426,7 +417,7 @@ export default function McpAuthModal(props: McpAuthModalProps) { const handleReloadAndRetry = async () => { if (!props.onReloadEngine) return; if (props.isRemoteWorkspace && typeof window !== "undefined") { - const proceed = window.confirm(translate("mcp.auth.reload_remote_confirm")); + const proceed = window.confirm(t("mcp.auth.reload_remote_confirm")); if (!proceed) return; } await props.onReloadEngine(); @@ -497,14 +488,14 @@ export default function McpAuthModal(props: McpAuthModalProps) { const safeName = validateMcpServerName(entry.name); slug = safeName.toLowerCase().replace(/[^a-z0-9]+/g, "-"); } catch (err) { - const message = err instanceof Error ? err.message : translate("mcp.auth.failed_to_start_oauth"); + const message = err instanceof Error ? err.message : t("mcp.auth.failed_to_start_oauth"); setError(message); return; } const code = parseAuthCode(callbackInput()); if (!code) { - setError(translate("mcp.auth.callback_invalid")); + setError(t("mcp.auth.callback_invalid")); return; } @@ -515,7 +506,7 @@ export default function McpAuthModal(props: McpAuthModalProps) { try { const directory = await resolveDirectory(); if (!directory) { - setError(translate("mcp.pick_workspace_first")); + setError(t("mcp.pick_workspace_first")); return; } @@ -533,16 +524,16 @@ export default function McpAuthModal(props: McpAuthModalProps) { } if (status.status === "needs_client_registration") { - setError(status.error ?? translate("mcp.auth.client_registration_required")); + setError(status.error ?? t("mcp.auth.client_registration_required")); } else if (status.status === "disabled") { - setError(translate("mcp.auth.server_disabled")); + setError(t("mcp.auth.server_disabled")); } else if (status.status === "failed") { - setError(status.error ?? translate("mcp.auth.oauth_failed")); + setError(status.error ?? t("mcp.auth.oauth_failed")); } else { - setError(translate("mcp.auth.authorization_still_required")); + setError(t("mcp.auth.authorization_still_required")); } } catch (err) { - const message = err instanceof Error ? err.message : translate("mcp.auth.oauth_failed"); + const message = err instanceof Error ? err.message : t("mcp.auth.oauth_failed"); setError(message); } finally { setManualAuthBusy(false); @@ -562,7 +553,7 @@ export default function McpAuthModal(props: McpAuthModalProps) { const safeName = validateMcpServerName(entry.name); slug = safeName.toLowerCase().replace(/[^a-z0-9]+/g, "-"); } catch (err) { - const message = err instanceof Error ? err.message : translate("mcp.auth.failed_to_start_oauth"); + const message = err instanceof Error ? err.message : t("mcp.auth.failed_to_start_oauth"); setError(message); setStatusChecking(false); return; @@ -577,13 +568,13 @@ export default function McpAuthModal(props: McpAuthModalProps) { } if (statusEntry?.status === "needs_client_registration") { - setError(statusEntry.error ?? translate("mcp.auth.client_registration_required")); + setError(statusEntry.error ?? t("mcp.auth.client_registration_required")); } else if (statusEntry?.status === "disabled") { - setError(translate("mcp.auth.server_disabled")); + setError(t("mcp.auth.server_disabled")); } else if (statusEntry?.status === "failed") { - setError(statusEntry.error ?? translate("mcp.auth.oauth_failed")); + setError(statusEntry.error ?? t("mcp.auth.oauth_failed")); } else { - setError(translate("mcp.auth.authorization_still_required")); + setError(t("mcp.auth.authorization_still_required")); } setStatusChecking(false); @@ -606,9 +597,9 @@ export default function McpAuthModal(props: McpAuthModalProps) {

- {translate("mcp.auth.connect_server", { server: serverName() })} + {t("mcp.auth.connect_server", { server: serverName() })}

-

{translate("mcp.auth.open_browser_signin")}

+

{t("mcp.auth.open_browser_signin")}

@@ -652,13 +643,13 @@ export default function McpAuthModal(props: McpAuthModalProps) {

{props.reloadBlocked - ? translate("mcp.auth.waiting_for_conversation_title") - : translate("mcp.auth.applying_changes_title")} + ? t("mcp.auth.waiting_for_conversation_title") + : t("mcp.auth.applying_changes_title")}

{props.reloadBlocked - ? translate("mcp.auth.waiting_for_conversation_body") - : translate("mcp.auth.applying_changes_body")} + ? t("mcp.auth.waiting_for_conversation_body") + : t("mcp.auth.applying_changes_body")}

0}> @@ -667,7 +658,7 @@ export default function McpAuthModal(props: McpAuthModalProps) { {(session) => (
- {translate("mcp.auth.waiting_for_session", { session: session.title })} + {t("mcp.auth.waiting_for_session", { session: session.title })}
)} @@ -694,14 +685,14 @@ export default function McpAuthModal(props: McpAuthModalProps) {
-

{translate("mcp.auth.already_connected")}

+

{t("mcp.auth.already_connected")}

- {translate("mcp.auth.already_connected_description", { server: serverName() })} + {t("mcp.auth.already_connected_description", { server: serverName() })}

- {translate("mcp.auth.configured_previously")} + {t("mcp.auth.configured_previously")}

@@ -716,14 +707,14 @@ export default function McpAuthModal(props: McpAuthModalProps) { variant="secondary" onClick={handleReloadAndRetry} disabled={props.reloadBlocked} - title={props.reloadBlocked ? translate("mcp.reload_banner_blocked_hint") : undefined} + title={props.reloadBlocked ? t("mcp.reload_banner_blocked_hint") : undefined} > - {translate("mcp.auth.reload_engine_retry")} + {t("mcp.auth.reload_engine_retry")} @@ -740,14 +731,14 @@ export default function McpAuthModal(props: McpAuthModalProps) { variant="secondary" onClick={handleReloadAndRetry} disabled={props.reloadBlocked} - title={props.reloadBlocked ? translate("mcp.reload_banner_blocked_hint") : undefined} + title={props.reloadBlocked ? t("mcp.reload_banner_blocked_hint") : undefined} > - {translate("mcp.auth.reload_engine_retry")} + {t("mcp.auth.reload_engine_retry")} @@ -755,35 +746,35 @@ export default function McpAuthModal(props: McpAuthModalProps) {
-

{translate("mcp.auth.invalid_refresh_token")}

+

{t("mcp.auth.invalid_refresh_token")}

- {translate("mcp.auth.reauth_cli_hint", { server: serverName() })} + {t("mcp.auth.reauth_cli_hint", { server: serverName() })}
- {translate("mcp.auth.reauth_remote_hint")} + {t("mcp.auth.reauth_remote_hint")}
@@ -797,14 +788,14 @@ export default function McpAuthModal(props: McpAuthModalProps) {
- {translate("mcp.auth.manual_finish_title")} + {t("mcp.auth.manual_finish_title")}
- {translate("mcp.auth.manual_finish_hint")} + {t("mcp.auth.manual_finish_hint")}
-
{translate("mcp.auth.authorization_link")}
+
{t("mcp.auth.authorization_link")}
{authorizationUrl()}
@@ -814,17 +805,17 @@ export default function McpAuthModal(props: McpAuthModalProps) { class="text-xs" onClick={handleCopyAuthorizationUrl} > - {authUrlCopied() ? translate("mcp.auth.copied") : translate("mcp.auth.copy_link")} + {authUrlCopied() ? t("mcp.auth.copied") : t("mcp.auth.copy_link")}
setCallbackInput(event.currentTarget.value)} />
- {translate("mcp.auth.port_forward_hint")} + {t("mcp.auth.port_forward_hint")}
@@ -851,9 +842,9 @@ export default function McpAuthModal(props: McpAuthModalProps) { 1
-

{translate("mcp.auth.step1_title")}

+

{t("mcp.auth.step1_title")}

- {translate("mcp.auth.step1_description", { server: serverName() })} + {t("mcp.auth.step1_description", { server: serverName() })}

@@ -863,9 +854,9 @@ export default function McpAuthModal(props: McpAuthModalProps) { 2
-

{translate("mcp.auth.step2_title")}

+

{t("mcp.auth.step2_title")}

- {translate("mcp.auth.step2_description")} + {t("mcp.auth.step2_description")}

@@ -875,9 +866,9 @@ export default function McpAuthModal(props: McpAuthModalProps) { 3
-

{translate("mcp.auth.step3_title")}

+

{t("mcp.auth.step3_title")}

- {translate("mcp.auth.step3_description")} + {t("mcp.auth.step3_description")}

@@ -885,16 +876,16 @@ export default function McpAuthModal(props: McpAuthModalProps) {
-

{translate("mcp.auth.waiting_authorization")}

+

{t("mcp.auth.waiting_authorization")}

- {translate("mcp.auth.follow_browser_steps")} + {t("mcp.auth.follow_browser_steps")}

@@ -906,16 +897,16 @@ export default function McpAuthModal(props: McpAuthModalProps) { diff --git a/apps/app/src/app/components/model-picker-modal.tsx b/apps/app/src/app/components/model-picker-modal.tsx index f63caa9b7..8f0be71b7 100644 --- a/apps/app/src/app/components/model-picker-modal.tsx +++ b/apps/app/src/app/components/model-picker-modal.tsx @@ -24,7 +24,6 @@ export type ModelPickerModalProps = { export default function ModelPickerModal(props: ModelPickerModalProps) { let searchInputRef: HTMLInputElement | undefined; - const translate = (key: string, params?: Record) => t(key, undefined, params); type RenderedItem = | { kind: "model"; opt: ModelOption } @@ -306,9 +305,9 @@ export default function ModelPickerModal(props: ModelPickerModalProps) { {provider.title}
- {translate("model_picker.connect_provider_hint")} + {t("model_picker.connect_provider_hint")} - {translate(provider.matchCount === 1 ? "model_picker.model_count_one" : "model_picker.model_count", { count: provider.matchCount })} + {t(provider.matchCount === 1 ? "model_picker.model_count_one" : "model_picker.model_count", { count: provider.matchCount })}
@@ -324,10 +323,10 @@ export default function ModelPickerModal(props: ModelPickerModalProps) {

- {translate(props.target === "default" ? "model_picker.default_model_title" : "model_picker.chat_model_title")} + {t(props.target === "default" ? "model_picker.default_model_title" : "model_picker.chat_model_title")}

- {translate(props.target === "default" + {t(props.target === "default" ? "model_picker.default_model_desc" : "model_picker.chat_model_desc")}

@@ -349,13 +348,13 @@ export default function ModelPickerModal(props: ModelPickerModalProps) { type="text" value={props.query} onInput={(e) => props.setQuery(e.currentTarget.value)} - placeholder={translate("settings.search_models")} + placeholder={t("settings.search_models")} class="w-full bg-dls-surface border border-dls-border rounded-xl py-2.5 pl-9 pr-3 text-sm text-dls-text placeholder:text-dls-secondary focus:outline-none focus:ring-1 focus:ring-[rgba(var(--dls-accent-rgb),0.2)] focus:border-dls-accent" />
- {translate("settings.showing_models", { count: props.filteredOptions.length, total: props.options.length })} + {t("settings.showing_models", { count: props.filteredOptions.length, total: props.options.length })}
@@ -364,7 +363,7 @@ export default function ModelPickerModal(props: ModelPickerModalProps) { 0}>
- {translate("model_picker.recommended")} + {t("model_picker.recommended")}
{({ opt, index }) => renderOption(opt, index)}
@@ -373,7 +372,7 @@ export default function ModelPickerModal(props: ModelPickerModalProps) { 0}>
- {translate("model_picker.other_connected_models")} + {t("model_picker.other_connected_models")}
{({ opt, index }) => renderOption(opt, index)}
@@ -382,7 +381,7 @@ export default function ModelPickerModal(props: ModelPickerModalProps) { 0}>
- {translate("model_picker.more_providers")} + {t("model_picker.more_providers")}
{(provider) => renderProviderLink(provider, provider.index)} @@ -392,14 +391,14 @@ export default function ModelPickerModal(props: ModelPickerModalProps) {
- {translate("model_picker.no_results")} + {t("model_picker.no_results")}
diff --git a/apps/app/src/app/components/question-modal.tsx b/apps/app/src/app/components/question-modal.tsx index e77b06420..bdb16c22f 100644 --- a/apps/app/src/app/components/question-modal.tsx +++ b/apps/app/src/app/components/question-modal.tsx @@ -141,7 +141,7 @@ export default function QuestionModal(props: QuestionModalProps) { {currentQuestion()!.header || t("common.question")}
- {t("question_modal.question_counter", undefined, { current: currentIndex() + 1, total: props.questions.length })} + {t("question_modal.question_counter", { current: currentIndex() + 1, total: props.questions.length })}
diff --git a/apps/app/src/app/components/rename-session-modal.tsx b/apps/app/src/app/components/rename-session-modal.tsx index 9bdcde386..d8c3a4c34 100644 --- a/apps/app/src/app/components/rename-session-modal.tsx +++ b/apps/app/src/app/components/rename-session-modal.tsx @@ -1,6 +1,6 @@ import { Show, createEffect } from "solid-js"; import { X } from "lucide-solid"; -import { t, currentLocale } from "../../i18n"; +import { t } from "../../i18n"; import Button from "./button"; import TextInput from "./text-input"; @@ -17,7 +17,6 @@ export type RenameSessionModalProps = { export default function RenameSessionModal(props: RenameSessionModalProps) { let inputRef: HTMLInputElement | undefined; - const translate = (key: string) => t(key, currentLocale()); createEffect(() => { if (props.open) { @@ -37,8 +36,8 @@ export default function RenameSessionModal(props: RenameSessionModalProps) {
-

{translate("session.rename_title")}

-

{translate("session.rename_description")}

+

{t("session.rename_title")}

+

{t("session.rename_description")}

diff --git a/apps/app/src/app/components/rename-workspace-modal.tsx b/apps/app/src/app/components/rename-workspace-modal.tsx index 3e44e846d..0f37d3f17 100644 --- a/apps/app/src/app/components/rename-workspace-modal.tsx +++ b/apps/app/src/app/components/rename-workspace-modal.tsx @@ -1,6 +1,6 @@ import { Show, createEffect } from "solid-js"; import { X } from "lucide-solid"; -import { t, currentLocale } from "../../i18n"; +import { t } from "../../i18n"; import Button from "./button"; import TextInput from "./text-input"; @@ -17,7 +17,6 @@ export type RenameWorkspaceModalProps = { export default function RenameWorkspaceModal(props: RenameWorkspaceModalProps) { let inputRef: HTMLInputElement | undefined; - const translate = (key: string) => t(key, currentLocale()); createEffect(() => { if (props.open) { @@ -37,8 +36,8 @@ export default function RenameWorkspaceModal(props: RenameWorkspaceModalProps) {
-

{translate("workspace.rename_title")}

-

{translate("workspace.rename_description")}

+

{t("workspace.rename_title")}

+

{t("workspace.rename_description")}

diff --git a/apps/app/src/app/components/reset-modal.tsx b/apps/app/src/app/components/reset-modal.tsx index 8dbf05f03..e3533a21f 100644 --- a/apps/app/src/app/components/reset-modal.tsx +++ b/apps/app/src/app/components/reset-modal.tsx @@ -23,9 +23,8 @@ export type ResetModalProps = { }; export default function ResetModal(props: ResetModalProps) { - const translate = (key: string) => t(key, props.language); const resetConfirmationHint = () => { - const template = translate("settings.reset_confirmation_hint"); + const template = t("settings.reset_confirmation_hint"); const parts = template.split(RESET_CONFIRM_PLACEHOLDER); if (parts.length === 1) return template; @@ -46,8 +45,8 @@ export default function ResetModal(props: ResetModalProps) {

- {translate("settings.reset_onboarding_title")} - {translate("settings.reset_app_data_title")} + {t("settings.reset_onboarding_title")} + {t("settings.reset_app_data_title")}

{resetConfirmationHint()}

@@ -66,19 +65,19 @@ export default function ResetModal(props: ResetModalProps) {
- {translate("settings.reset_onboarding_warning")} + {t("settings.reset_onboarding_warning")} - {translate("settings.reset_app_data_warning")} + {t("settings.reset_app_data_warning")}
-
{translate("settings.reset_stop_active_runs")}
+
{t("settings.reset_stop_active_runs")}
props.onTextChange(e.currentTarget.value)} disabled={props.busy} @@ -87,10 +86,10 @@ export default function ResetModal(props: ResetModalProps) {
diff --git a/apps/app/src/app/components/session/composer.tsx b/apps/app/src/app/components/session/composer.tsx index 4381dae2d..158f49c5b 100644 --- a/apps/app/src/app/components/session/composer.tsx +++ b/apps/app/src/app/components/session/composer.tsx @@ -1309,7 +1309,7 @@ export default function Composer(props: ComposerProps) { for (const file of supportedFiles) { if (file.size > MAX_ATTACHMENT_BYTES) { props.onNotice({ - title: t("composer.file_exceeds_limit", undefined, { + title: t("composer.file_exceeds_limit", { name: file.name, }), tone: "warning", diff --git a/apps/app/src/app/components/session/message-list.tsx b/apps/app/src/app/components/session/message-list.tsx index 0644c97cd..1073ea762 100644 --- a/apps/app/src/app/components/session/message-list.tsx +++ b/apps/app/src/app/components/session/message-list.tsx @@ -229,39 +229,39 @@ function toolHeadline(part: Part) { const description = pick("description"); if (description) return compactText(description); const command = pick("command", "cmd"); - return command ? compactText(t("message_list.tool_run_command", undefined, { command }), 48) : t("message_list.tool_run_command_fallback"); + return command ? compactText(t("message_list.tool_run_command", { command }), 48) : t("message_list.tool_run_command_fallback"); } if (tool === "read") { const file = target("filePath", "path", "file"); - return file ? t("message_list.tool_reviewed_file", undefined, { file }) : t("message_list.tool_reviewed_file_fallback"); + return file ? t("message_list.tool_reviewed_file", { file }) : t("message_list.tool_reviewed_file_fallback"); } if (tool === "edit") { const file = target("filePath", "path", "file"); - return file ? t("message_list.tool_updated_file", undefined, { file }) : t("message_list.tool_updated_file_fallback"); + return file ? t("message_list.tool_updated_file", { file }) : t("message_list.tool_updated_file_fallback"); } if (tool === "write" || tool === "apply_patch") { const file = target("filePath", "path", "file"); - return file ? t("message_list.tool_update_file", undefined, { file }) : t("message_list.tool_update_file_fallback"); + return file ? t("message_list.tool_update_file", { file }) : t("message_list.tool_update_file_fallback"); } if (tool === "grep" || tool === "glob" || tool === "search") { const pattern = pick("pattern", "query"); - return pattern ? t("message_list.tool_searched_pattern", undefined, { pattern: compactText(pattern, 36) }) : t("message_list.tool_searched_code_fallback"); + return pattern ? t("message_list.tool_searched_pattern", { pattern: compactText(pattern, 36) }) : t("message_list.tool_searched_code_fallback"); } if (tool === "list" || tool === "list_files") { const path = target("path"); - return path ? t("message_list.tool_reviewed_path", undefined, { path }) : t("message_list.tool_reviewed_files_fallback"); + return path ? t("message_list.tool_reviewed_path", { path }) : t("message_list.tool_reviewed_files_fallback"); } if (tool === "task") { const description = pick("description"); if (description) return compactText(description); const agent = pick("subagent_type"); - return agent ? t("message_list.tool_delegate_agent", undefined, { agent }) : t("message_list.tool_delegate_task_fallback"); + return agent ? t("message_list.tool_delegate_agent", { agent }) : t("message_list.tool_delegate_task_fallback"); } if (tool === "todowrite") { @@ -274,12 +274,12 @@ function toolHeadline(part: Part) { if (tool === "webfetch") { const url = pick("url"); - return url ? t("message_list.tool_checked_url", undefined, { url: compactText(url, 36) }) : t("message_list.tool_checked_web_fallback"); + return url ? t("message_list.tool_checked_url", { url: compactText(url, 36) }) : t("message_list.tool_checked_web_fallback"); } if (tool === "skill") { const name = pick("name"); - return name ? t("message_list.tool_load_skill_named", undefined, { name }) : t("message_list.tool_load_skill_fallback"); + return name ? t("message_list.tool_load_skill_named", { name }) : t("message_list.tool_load_skill_fallback"); } const fallback = tool @@ -696,7 +696,7 @@ export default function MessageList(props: MessageListProps) { const title = session()?.title?.trim(); if (title) return title; if (task().description) return task().description!; - if (task().agentType) return t("message_list.subagent_type_task", undefined, { agentType: task().agentType! }); + if (task().agentType) return t("message_list.subagent_type_task", { agentType: task().agentType! }); return t("message_list.subagent_session_fallback"); }); const statusLabel = createMemo(() => { @@ -704,7 +704,7 @@ export default function MessageList(props: MessageListProps) { if (streaming()) return t("message_list.subagent_running"); if (childMessages().length > 0) { const count = childMessages().length; - return t("message_list.subagent_message_count", undefined, { count, plural: count === 1 ? "" : "s" }); + return t("message_list.subagent_message_count", { count, plural: count === 1 ? "" : "s" }); } return t("message_list.subagent_waiting_transcript"); }); diff --git a/apps/app/src/app/components/session/workspace-session-list.tsx b/apps/app/src/app/components/session/workspace-session-list.tsx index f79e7576c..6c2e35c87 100644 --- a/apps/app/src/app/components/session/workspace-session-list.tsx +++ b/apps/app/src/app/components/session/workspace-session-list.tsx @@ -283,7 +283,7 @@ export default function WorkspaceSessionList(props: Props) { const showMoreLabel = (workspaceId: string, totalRoots: number) => { const remaining = Math.max(0, totalRoots - previewCount(workspaceId)); const nextCount = Math.min(MAX_SESSIONS_PREVIEW, remaining); - return nextCount > 0 ? t("workspace_list.show_more", undefined, { count: nextCount }) : t("workspace_list.show_more_fallback"); + return nextCount > 0 ? t("workspace_list.show_more", { count: nextCount }) : t("workspace_list.show_more_fallback"); }; createEffect(() => { diff --git a/apps/app/src/app/components/status-bar.tsx b/apps/app/src/app/components/status-bar.tsx index bc556cf86..d4234ed61 100644 --- a/apps/app/src/app/components/status-bar.tsx +++ b/apps/app/src/app/components/status-bar.tsx @@ -45,10 +45,10 @@ export default function StatusBar(props: StatusBarProps) { if (props.clientConnected) { const detailBits: string[] = []; if (providers > 0) { - detailBits.push(t("status.providers_connected", undefined, { count: providers, plural: providers === 1 ? "" : "s" })); + detailBits.push(t("status.providers_connected", { count: providers, plural: providers === 1 ? "" : "s" })); } if (mcp > 0) { - detailBits.push(t("status.mcp_connected", undefined, { count: mcp })); + detailBits.push(t("status.mcp_connected", { count: mcp })); } if (!detailBits.length) { detailBits.push(t("status.ready_for_tasks")); @@ -70,7 +70,7 @@ export default function StatusBar(props: StatusBarProps) { label: t("status.limited_mode"), detail: mcp > 0 - ? t("status.limited_mcp_hint", undefined, { count: mcp }) + ? t("status.limited_mcp_hint", { count: mcp }) : t("status.limited_hint"), dotClass: "bg-amber-9", pingClass: "bg-amber-9/35", diff --git a/apps/app/src/app/connections/openwork-server-store.ts b/apps/app/src/app/connections/openwork-server-store.ts index 539d113fd..83bbb7c18 100644 --- a/apps/app/src/app/connections/openwork-server-store.ts +++ b/apps/app/src/app/connections/openwork-server-store.ts @@ -1,6 +1,6 @@ import { createEffect, createMemo, createSignal, onCleanup, type Accessor } from "solid-js"; -import { t, currentLocale } from "../../i18n"; +import { t } from "../../i18n"; import type { StartupPreference, WorkspaceDisplay } from "../types"; import { isTauriRuntime } from "../utils"; import { @@ -470,7 +470,7 @@ export function createOpenworkServerStore(options: { if (!active) return; setOpenworkAuditEntries([]); setOpenworkAuditStatus("error"); - setOpenworkAuditError(error instanceof Error ? error.message : t("app.error_audit_load", currentLocale())); + setOpenworkAuditError(error instanceof Error ? error.message : t("app.error_audit_load")); } finally { busy = false; } @@ -620,7 +620,7 @@ export function createOpenworkServerStore(options: { if (isTauriRuntime() && options.selectedWorkspaceDisplay().workspaceType === "local") { const restarted = await options.restartLocalServer(); if (!restarted) { - throw new Error(t("app.error_restart_local_worker", currentLocale())); + throw new Error(t("app.error_restart_local_worker")); } await reconnectOpenworkServer(); } @@ -629,7 +629,7 @@ export function createOpenworkServerStore(options: { setShareRemoteAccessError( error instanceof Error ? error.message - : t("app.error_remote_access", currentLocale()), + : t("app.error_remote_access"), ); return; } finally { diff --git a/apps/app/src/app/connections/store.ts b/apps/app/src/app/connections/store.ts index de49b3386..009bceba2 100644 --- a/apps/app/src/app/connections/store.ts +++ b/apps/app/src/app/connections/store.ts @@ -3,7 +3,7 @@ import { createEffect, createSignal } from "solid-js"; import { homeDir } from "@tauri-apps/api/path"; import { parse } from "jsonc-parser"; -import { currentLocale, t } from "../../i18n"; +import { t } from "../../i18n"; import { CHROME_DEVTOOLS_MCP_ID, MCP_QUICK_CONNECT, type McpDirectoryInfo } from "../constants"; import { createClient, unwrap } from "../lib/opencode"; import { finishPerf, perfNow, recordPerfLog } from "../lib/perf-log"; @@ -36,7 +36,6 @@ export function createConnectionsStore(options: { developerMode: () => boolean; markReloadRequired?: (reason: ReloadReason, trigger?: ReloadTrigger) => void; }) { - const translate = (key: string) => t(key, currentLocale()); const [mcpServers, setMcpServers] = createSignal([]); const [mcpStatus, setMcpStatus] = createSignal(null); @@ -94,7 +93,7 @@ export function createConnectionsStore(options: { return null; } - activeClient = createClient(`${openworkBaseUrl.replace(/\/+$/, "")}/opencode`, undefined, { + activeClient = createClient(`${openworkBaseUrl.replace(/\/+$/, "")}/opencode`, { token, mode: "openwork", }); @@ -303,7 +302,7 @@ export function createConnectionsStore(options: { } if (!canUseOpenworkServer && !isTauriRuntime()) { - setMcpStatus(translate("mcp.desktop_required")); + setMcpStatus(t("mcp.desktop_required")); finishPerf(options.developerMode(), "mcp.connect", "blocked", startedAt, { reason: "desktop-required", }); @@ -311,7 +310,7 @@ export function createConnectionsStore(options: { } if (!isRemoteWorkspace && !projectDir) { - setMcpStatus(translate("mcp.pick_workspace_first")); + setMcpStatus(t("mcp.pick_workspace_first")); finishPerf(options.developerMode(), "mcp.connect", "blocked", startedAt, { reason: "missing-workspace", }); @@ -320,7 +319,7 @@ export function createConnectionsStore(options: { const activeClient = await ensureActiveClient(); if (!activeClient) { - setMcpStatus(translate("mcp.connect_server_first")); + setMcpStatus(t("mcp.connect_server_first")); finishPerf(options.developerMode(), "mcp.connect", "blocked", startedAt, { reason: "no-active-client", }); @@ -329,7 +328,7 @@ export function createConnectionsStore(options: { const resolvedProjectDir = await resolveProjectDir(activeClient, projectDir); if (!resolvedProjectDir) { - setMcpStatus(translate("mcp.pick_workspace_first")); + setMcpStatus(t("mcp.pick_workspace_first")); finishPerf(options.developerMode(), "mcp.connect", "blocked", startedAt, { reason: "missing-workspace-after-discovery", }); @@ -449,7 +448,7 @@ export function createConnectionsStore(options: { setMcpAuthNeedsReload(true); setMcpAuthModalOpen(true); } else { - setMcpStatus(translate("mcp.connected")); + setMcpStatus(t("mcp.connected")); } await refreshMcpServers(); @@ -459,7 +458,7 @@ export function createConnectionsStore(options: { slug, }); } catch (e) { - setMcpStatus(e instanceof Error ? e.message : translate("mcp.connect_failed")); + setMcpStatus(e instanceof Error ? e.message : t("mcp.connect_failed")); finishPerf(options.developerMode(), "mcp.connect", "error", startedAt, { name: entry.name, type: entryType, @@ -472,7 +471,7 @@ export function createConnectionsStore(options: { function authorizeMcp(entry: McpServerEntry) { if (entry.config.type !== "remote" || entry.config.oauth === false) { - setMcpStatus(translate("mcp.login_unavailable")); + setMcpStatus(t("mcp.login_unavailable")); return; } @@ -508,19 +507,19 @@ export function createConnectionsStore(options: { } if (!canUseOpenworkServer && !isTauriRuntime()) { - setMcpStatus(translate("mcp.desktop_required")); + setMcpStatus(t("mcp.desktop_required")); return; } const activeClient = await ensureActiveClient(); if (!activeClient) { - setMcpStatus(translate("mcp.connect_server_first")); + setMcpStatus(t("mcp.connect_server_first")); return; } const resolvedProjectDir = await resolveProjectDir(activeClient, projectDir); if (!resolvedProjectDir) { - setMcpStatus(translate("mcp.pick_workspace_first")); + setMcpStatus(t("mcp.pick_workspace_first")); return; } @@ -547,9 +546,9 @@ export function createConnectionsStore(options: { } await refreshMcpServers(); - setMcpStatus(translate("mcp.logout_success").replace("{server}", safeName)); + setMcpStatus(t("mcp.logout_success").replace("{server}", safeName)); } catch (e) { - setMcpStatus(e instanceof Error ? e.message : translate("mcp.logout_failed")); + setMcpStatus(e instanceof Error ? e.message : t("mcp.logout_failed")); } } @@ -570,7 +569,7 @@ export function createConnectionsStore(options: { } else { const projectDir = options.projectDir().trim(); if (!projectDir) { - setMcpStatus(translate("mcp.pick_workspace_first")); + setMcpStatus(t("mcp.pick_workspace_first")); return; } await removeMcpFromConfig(projectDir, name); @@ -583,7 +582,7 @@ export function createConnectionsStore(options: { } setMcpStatus(null); } catch (e) { - setMcpStatus(e instanceof Error ? e.message : translate("mcp.remove_failed")); + setMcpStatus(e instanceof Error ? e.message : t("mcp.remove_failed")); } } diff --git a/apps/app/src/app/context/extensions.ts b/apps/app/src/app/context/extensions.ts index de69ad8e9..6b06f7a91 100644 --- a/apps/app/src/app/context/extensions.ts +++ b/apps/app/src/app/context/extensions.ts @@ -2,7 +2,7 @@ import { createEffect, createMemo, createSignal } from "solid-js"; import { applyEdits, modify } from "jsonc-parser"; import { join } from "@tauri-apps/api/path"; -import { currentLocale, t } from "../../i18n"; +import { t } from "../../i18n"; import type { Client, DenOrgSkillCard, HubSkillCard, HubSkillRepo, PluginScope, ReloadReason, ReloadTrigger, SkillCard } from "../types"; import { addOpencodeCacheHint, isTauriRuntime } from "../utils"; @@ -96,7 +96,6 @@ export function createExtensionsStore(options: { markReloadRequired?: (reason: ReloadReason, trigger?: ReloadTrigger) => void; }) { // Translation helper that uses current language from i18n - const translate = (key: string) => t(key, currentLocale()); // ── Workspace context tracking ────────────────────── const workspaceContextKey = createWorkspaceContextKey({ @@ -335,18 +334,18 @@ export function createExtensionsStore(options: { } if (!isTauriRuntime()) { - throw new Error(translate("skills.desktop_required")); + throw new Error(t("skills.desktop_required")); } if (!isLocalWorkspace || !root) { - throw new Error(translate("skills.pick_workspace_first")); + throw new Error(t("skills.pick_workspace_first")); } const result = await installSkillTemplate(root, name, content, { overwrite: optionsOverride?.overwrite ?? false, }); if (!result.ok) { - throw new Error(result.stderr || result.stdout || translate("skills.install_failed")); + throw new Error(result.stderr || result.stdout || t("skills.install_failed")); } }; @@ -428,16 +427,16 @@ export function createExtensionsStore(options: { } if (!isTauriRuntime()) { - throw new Error(translate("skills.desktop_required")); + throw new Error(t("skills.desktop_required")); } if (!isLocalWorkspace || !root) { - throw new Error(translate("skills.pick_workspace_first")); + throw new Error(t("skills.pick_workspace_first")); } const result = await uninstallSkillCommand(root, name); if (!result.ok) { - throw new Error(result.stderr || result.stdout || translate("skills.uninstall_failed")); + throw new Error(result.stderr || result.stdout || t("skills.uninstall_failed")); } }; @@ -666,7 +665,7 @@ export function createExtensionsStore(options: { if (refreshCloudOrgSkillsAborted) return; setCloudOrgSkills(catalog); if (!catalog.length) { - setCloudOrgSkillsStatus(translate("skills.cloud_org_empty")); + setCloudOrgSkillsStatus(t("skills.cloud_org_empty")); } cloudOrgSkillsLoaded = true; cloudOrgSkillsLoadKey = loadKey; @@ -674,7 +673,7 @@ export function createExtensionsStore(options: { } catch (e) { if (refreshCloudOrgSkillsAborted) return; setCloudOrgSkills([]); - setCloudOrgSkillsStatus(e instanceof Error ? e.message : translate("skills.cloud_org_load_failed")); + setCloudOrgSkillsStatus(e instanceof Error ? e.message : t("skills.cloud_org_load_failed")); } finally { refreshCloudOrgSkillsInFlight = false; } @@ -771,7 +770,7 @@ export function createExtensionsStore(options: { importedNames, }; } catch (e) { - const message = e instanceof Error ? e.message : translate("skills.unknown_error"); + const message = e instanceof Error ? e.message : t("skills.unknown_error"); options.setError(addOpencodeCacheHint(message)); return { ok: false, message, importedNames }; } finally { @@ -818,7 +817,7 @@ export function createExtensionsStore(options: { importedNames: applied.nextSkillNames, }; } catch (e) { - const message = e instanceof Error ? e.message : translate("skills.unknown_error"); + const message = e instanceof Error ? e.message : t("skills.unknown_error"); options.setError(addOpencodeCacheHint(message)); return { ok: false, message, importedNames: [] }; } finally { @@ -860,7 +859,7 @@ export function createExtensionsStore(options: { removedNames: imported.skillNames, }; } catch (e) { - const message = e instanceof Error ? e.message : translate("skills.unknown_error"); + const message = e instanceof Error ? e.message : t("skills.unknown_error"); options.setError(addOpencodeCacheHint(message)); return { ok: false, message, removedNames: [] }; } finally { @@ -914,7 +913,7 @@ export function createExtensionsStore(options: { } return { ok: true, message: `Installed ${trimmed}.` }; } catch (e) { - const message = e instanceof Error ? e.message : translate("skills.unknown_error"); + const message = e instanceof Error ? e.message : t("skills.unknown_error"); options.setError(addOpencodeCacheHint(message)); return { ok: false, message }; } finally { @@ -944,9 +943,9 @@ export function createExtensionsStore(options: { }); await refreshSkills({ force: true }); await refreshCloudOrgSkills({ force: true }); - return { ok: true, message: t("skills.cloud_installed", currentLocale(), { name: installName }) }; + return { ok: true, message: t("skills.cloud_installed", { name: installName }) }; } catch (e) { - const message = e instanceof Error ? e.message : translate("skills.unknown_error"); + const message = e instanceof Error ? e.message : t("skills.unknown_error"); options.setError(addOpencodeCacheHint(message)); return { ok: false, message }; } finally { @@ -976,7 +975,7 @@ export function createExtensionsStore(options: { if (!root) { setSkills([]); - setSkillsStatus(translate("skills.pick_workspace_first")); + setSkillsStatus(t("skills.pick_workspace_first")); return; } @@ -1013,7 +1012,7 @@ export function createExtensionsStore(options: { : []; setSkills(next); if (!next.length) { - setSkillsStatus(translate("skills.no_skills_found")); + setSkillsStatus(t("skills.no_skills_found")); } skillsLoaded = true; skillsRoot = root; @@ -1021,7 +1020,7 @@ export function createExtensionsStore(options: { } catch (e) { if (refreshSkillsAborted) return; setSkills([]); - setSkillsStatus(e instanceof Error ? e.message : translate("skills.failed_to_load")); + setSkillsStatus(e instanceof Error ? e.message : t("skills.failed_to_load")); } finally { refreshSkillsInFlight = false; } @@ -1063,7 +1062,7 @@ export function createExtensionsStore(options: { setSkills(next); if (!next.length) { - setSkillsStatus(translate("skills.no_skills_found")); + setSkillsStatus(t("skills.no_skills_found")); } skillsLoaded = true; skillsRoot = root; @@ -1071,7 +1070,7 @@ export function createExtensionsStore(options: { } catch (e) { if (refreshSkillsAborted) return; setSkills([]); - setSkillsStatus(e instanceof Error ? e.message : translate("skills.failed_to_load")); + setSkillsStatus(e instanceof Error ? e.message : t("skills.failed_to_load")); } finally { refreshSkillsInFlight = false; } @@ -1115,7 +1114,7 @@ export function createExtensionsStore(options: { if (result?.data === undefined) { const err = result?.error; const message = - err instanceof Error ? err.message : typeof err === "string" ? err : translate("skills.failed_to_load"); + err instanceof Error ? err.message : typeof err === "string" ? err : t("skills.failed_to_load"); throw new Error(message); } const data = result.data as Array<{ @@ -1136,7 +1135,7 @@ export function createExtensionsStore(options: { setSkills(next); if (!next.length) { - setSkillsStatus(translate("skills.no_skills_found")); + setSkillsStatus(t("skills.no_skills_found")); } skillsLoaded = true; skillsRoot = root; @@ -1144,7 +1143,7 @@ export function createExtensionsStore(options: { } catch (e) { if (refreshSkillsAborted) return; setSkills([]); - setSkillsStatus(e instanceof Error ? e.message : translate("skills.failed_to_load")); + setSkillsStatus(e instanceof Error ? e.message : t("skills.failed_to_load")); } finally { refreshSkillsInFlight = false; } @@ -1218,9 +1217,9 @@ export function createExtensionsStore(options: { } if (!isTauriRuntime()) { - setPluginStatus(translate("skills.plugin_management_host_only")); + setPluginStatus(t("skills.plugin_management_host_only")); setPluginList([]); - setSidebarPluginStatus(translate("skills.plugins_host_only")); + setSidebarPluginStatus(t("skills.plugins_host_only")); setSidebarPluginList([]); refreshPluginsInFlight = false; return; @@ -1236,9 +1235,9 @@ export function createExtensionsStore(options: { } if (scope === "project" && !targetDir) { - setPluginStatus(translate("skills.pick_project_for_plugins")); + setPluginStatus(t("skills.pick_project_for_plugins")); setPluginList([]); - setSidebarPluginStatus(translate("skills.pick_project_for_active")); + setSidebarPluginStatus(t("skills.pick_project_for_active")); setSidebarPluginList([]); refreshPluginsInFlight = false; return; @@ -1259,9 +1258,9 @@ export function createExtensionsStore(options: { if (!config.exists) { setPluginList([]); - setPluginStatus(translate("skills.no_opencode_found")); + setPluginStatus(t("skills.no_opencode_found")); setSidebarPluginList([]); - setSidebarPluginStatus(translate("skills.no_opencode_workspace")); + setSidebarPluginStatus(t("skills.no_opencode_workspace")); return; } @@ -1270,7 +1269,7 @@ export function createExtensionsStore(options: { setSidebarPluginList(next); } catch { setSidebarPluginList([]); - setSidebarPluginStatus(translate("skills.failed_parse_opencode")); + setSidebarPluginStatus(t("skills.failed_parse_opencode")); } loadPluginsFromConfig(config); @@ -1280,8 +1279,8 @@ export function createExtensionsStore(options: { setPluginConfig(null); setPluginConfigPath(null); setPluginList([]); - setPluginStatus(e instanceof Error ? e.message : translate("skills.failed_load_opencode")); - setSidebarPluginStatus(translate("skills.failed_load_active")); + setPluginStatus(e instanceof Error ? e.message : t("skills.failed_load_opencode")); + setSidebarPluginStatus(t("skills.failed_load_active")); setSidebarPluginList([]); } finally { refreshPluginsInFlight = false; @@ -1306,7 +1305,7 @@ export function createExtensionsStore(options: { if (!pluginName) { if (isManualInput) { - setPluginStatus(translate("skills.enter_plugin_name")); + setPluginStatus(t("skills.enter_plugin_name")); } return; } @@ -1332,7 +1331,7 @@ export function createExtensionsStore(options: { } if (!isTauriRuntime()) { - setPluginStatus(translate("skills.plugin_management_host_only")); + setPluginStatus(t("skills.plugin_management_host_only")); return; } @@ -1345,7 +1344,7 @@ export function createExtensionsStore(options: { const targetDir = options.projectDir().trim(); if (scope === "project" && !targetDir) { - setPluginStatus(translate("skills.pick_project_for_plugins")); + setPluginStatus(t("skills.pick_project_for_plugins")); return; } @@ -1372,7 +1371,7 @@ export function createExtensionsStore(options: { const desired = stripPluginVersion(pluginName).toLowerCase(); if (plugins.some((entry) => stripPluginVersion(entry).toLowerCase() === desired)) { - setPluginStatus(translate("skills.plugin_already_listed")); + setPluginStatus(t("skills.plugin_already_listed")); return; } @@ -1389,7 +1388,7 @@ export function createExtensionsStore(options: { } await refreshPlugins(scope); } catch (e) { - setPluginStatus(e instanceof Error ? e.message : translate("skills.failed_update_opencode")); + setPluginStatus(e instanceof Error ? e.message : t("skills.failed_update_opencode")); } } @@ -1427,7 +1426,7 @@ export function createExtensionsStore(options: { } if (!isTauriRuntime()) { - setPluginStatus(translate("skills.plugin_management_host_only")); + setPluginStatus(t("skills.plugin_management_host_only")); return; } @@ -1440,7 +1439,7 @@ export function createExtensionsStore(options: { const targetDir = options.projectDir().trim(); if (scope === "project" && !targetDir) { - setPluginStatus(translate("skills.pick_project_for_plugins")); + setPluginStatus(t("skills.pick_project_for_plugins")); return; } @@ -1469,7 +1468,7 @@ export function createExtensionsStore(options: { options.markReloadRequired?.("plugins", { type: "plugin", name: triggerName, action: "removed" }); await refreshPlugins(scope); } catch (e) { - setPluginStatus(e instanceof Error ? e.message : translate("skills.failed_update_opencode")); + setPluginStatus(e instanceof Error ? e.message : t("skills.failed_update_opencode")); } } @@ -1477,7 +1476,7 @@ export function createExtensionsStore(options: { const isLocalWorkspace = options.workspaceType() === "local"; if (!isTauriRuntime()) { - options.setError(translate("skills.desktop_required")); + options.setError(t("skills.desktop_required")); return; } @@ -1488,7 +1487,7 @@ export function createExtensionsStore(options: { const targetDir = options.projectDir().trim(); if (!targetDir) { - options.setError(translate("skills.pick_project_first")); + options.setError(t("skills.pick_project_first")); return; } @@ -1497,7 +1496,7 @@ export function createExtensionsStore(options: { setSkillsStatus(null); try { - const selection = await pickDirectory({ title: translate("skills.select_skill_folder") }); + const selection = await pickDirectory({ title: t("skills.select_skill_folder") }); const sourceDir = typeof selection === "string" ? selection : Array.isArray(selection) ? selection[0] : null; if (!sourceDir) { @@ -1507,9 +1506,9 @@ export function createExtensionsStore(options: { const inferredName = sourceDir.split(/[\\/]/).filter(Boolean).pop(); const result = await importSkill(targetDir, sourceDir, { overwrite: false }); if (!result.ok) { - setSkillsStatus(result.stderr || result.stdout || translate("skills.import_failed").replace("{status}", String(result.status))); + setSkillsStatus(result.stderr || result.stdout || t("skills.import_failed").replace("{status}", String(result.status))); } else { - setSkillsStatus(result.stdout || translate("skills.imported")); + setSkillsStatus(result.stdout || t("skills.imported")); options.markReloadRequired?.("skills", { type: "skill", name: inferredName, @@ -1519,7 +1518,7 @@ export function createExtensionsStore(options: { await refreshSkills({ force: true }); } catch (e) { - const message = e instanceof Error ? e.message : translate("skills.unknown_error"); + const message = e instanceof Error ? e.message : t("skills.unknown_error"); options.setError(addOpencodeCacheHint(message)); } finally { options.setBusy(false); @@ -1542,20 +1541,20 @@ export function createExtensionsStore(options: { if (canUseOpenworkServer) { options.setBusy(true); options.setError(null); - setSkillsStatus(translate("skills.installing_skill_creator")); + setSkillsStatus(t("skills.installing_skill_creator")); try { await openworkClient.upsertSkill(openworkWorkspaceId, { name: "skill-creator", content: skillCreatorTemplate, }); - const message = translate("skills.skill_creator_installed"); + const message = t("skills.skill_creator_installed"); setSkillsStatus(message); options.markReloadRequired?.("skills", { type: "skill", name: "skill-creator", action: "added" }); await refreshSkills({ force: true }); return { ok: true, message }; } catch (e) { - const raw = e instanceof Error ? e.message : translate("skills.unknown_error"); + const raw = e instanceof Error ? e.message : t("skills.unknown_error"); const message = addOpencodeCacheHint(raw); // Ensure we show feedback on the Skills page (not just the global error banner). setSkillsStatus(message); @@ -1574,7 +1573,7 @@ export function createExtensionsStore(options: { } if (!isTauriRuntime()) { - const message = translate("skills.desktop_required"); + const message = t("skills.desktop_required"); setSkillsStatus(message); return { ok: false, message }; } @@ -1588,37 +1587,37 @@ export function createExtensionsStore(options: { const targetDir = options.selectedWorkspaceRoot().trim(); if (!targetDir) { - const message = translate("skills.pick_workspace_first"); + const message = t("skills.pick_workspace_first"); setSkillsStatus(message); return { ok: false, message }; } options.setBusy(true); options.setError(null); - setSkillsStatus(translate("skills.installing_skill_creator")); + setSkillsStatus(t("skills.installing_skill_creator")); try { const result = await installSkillTemplate(targetDir, "skill-creator", skillCreatorTemplate, { overwrite: false }); if (!result.ok && /already exists/i.test(result.stderr)) { - const message = translate("skills.skill_creator_already_installed"); + const message = t("skills.skill_creator_already_installed"); setSkillsStatus(message); await refreshSkills({ force: true }); return { ok: true, message }; } else if (!result.ok) { - const message = result.stderr || result.stdout || translate("skills.install_failed"); + const message = result.stderr || result.stdout || t("skills.install_failed"); setSkillsStatus(message); await refreshSkills({ force: true }); return { ok: false, message }; } else { - const message = result.stdout || translate("skills.skill_creator_installed"); + const message = result.stdout || t("skills.skill_creator_installed"); setSkillsStatus(message); options.markReloadRequired?.("skills", { type: "skill", name: "skill-creator", action: "added" }); await refreshSkills({ force: true }); return { ok: true, message }; } } catch (e) { - const raw = e instanceof Error ? e.message : translate("skills.unknown_error"); + const raw = e instanceof Error ? e.message : t("skills.unknown_error"); const message = addOpencodeCacheHint(raw); setSkillsStatus(message); options.setError(message); @@ -1628,18 +1627,18 @@ export function createExtensionsStore(options: { } // Should be unreachable, but keep TS happy. - return { ok: false, message: translate("skills.install_failed") }; + return { ok: false, message: t("skills.install_failed") }; } async function revealSkillsFolder() { if (!isTauriRuntime()) { - setSkillsStatus(translate("skills.desktop_required")); + setSkillsStatus(t("skills.desktop_required")); return; } const root = options.selectedWorkspaceRoot().trim(); if (!root) { - setSkillsStatus(translate("skills.pick_workspace_first")); + setSkillsStatus(t("skills.pick_workspace_first")); return; } @@ -1664,14 +1663,14 @@ export function createExtensionsStore(options: { if (await tryOpen(legacySkills)) return; await revealItemInDir(opencodeSkills); } catch (e) { - setSkillsStatus(e instanceof Error ? e.message : translate("skills.reveal_failed")); + setSkillsStatus(e instanceof Error ? e.message : t("skills.reveal_failed")); } } async function uninstallSkill(name: string) { const root = options.selectedWorkspaceRoot().trim(); if (!root) { - setSkillsStatus(translate("skills.pick_workspace_first")); + setSkillsStatus(t("skills.pick_workspace_first")); return; } @@ -1686,11 +1685,11 @@ export function createExtensionsStore(options: { try { await deleteWorkspaceSkill(trimmed); - setSkillsStatus(translate("skills.uninstalled")); + setSkillsStatus(t("skills.uninstalled")); options.markReloadRequired?.("skills", { type: "skill", name: trimmed, action: "removed" }); await refreshSkills({ force: true }); } catch (e) { - const message = e instanceof Error ? e.message : translate("skills.unknown_error"); + const message = e instanceof Error ? e.message : t("skills.unknown_error"); setSkillsStatus(message); options.setError(addOpencodeCacheHint(message)); } finally { @@ -1704,7 +1703,7 @@ export function createExtensionsStore(options: { const root = options.selectedWorkspaceRoot().trim(); if (!root) { - setSkillsStatus(translate("skills.pick_workspace_first")); + setSkillsStatus(t("skills.pick_workspace_first")); return null; } @@ -1734,7 +1733,7 @@ export function createExtensionsStore(options: { content: result.content, }; } catch (e) { - setSkillsStatus(e instanceof Error ? e.message : translate("skills.failed_to_load")); + setSkillsStatus(e instanceof Error ? e.message : t("skills.failed_to_load")); return null; } } @@ -1745,7 +1744,7 @@ export function createExtensionsStore(options: { } if (!isTauriRuntime()) { - setSkillsStatus(translate("skills.desktop_required")); + setSkillsStatus(t("skills.desktop_required")); return null; } @@ -1759,7 +1758,7 @@ export function createExtensionsStore(options: { const result = await readLocalSkill(root, trimmed); return { name: trimmed, path: result.path, content: result.content }; } catch (e) { - setSkillsStatus(e instanceof Error ? e.message : translate("skills.failed_to_load")); + setSkillsStatus(e instanceof Error ? e.message : t("skills.failed_to_load")); return null; } } @@ -1770,7 +1769,7 @@ export function createExtensionsStore(options: { const root = options.selectedWorkspaceRoot().trim(); if (!root) { - setSkillsStatus(translate("skills.pick_workspace_first")); + setSkillsStatus(t("skills.pick_workspace_first")); return; } @@ -1799,7 +1798,7 @@ export function createExtensionsStore(options: { await refreshSkills({ force: true }); setSkillsStatus("Saved."); } catch (e) { - const message = e instanceof Error ? e.message : translate("skills.unknown_error"); + const message = e instanceof Error ? e.message : t("skills.unknown_error"); options.setError(addOpencodeCacheHint(message)); } finally { options.setBusy(false); @@ -1813,7 +1812,7 @@ export function createExtensionsStore(options: { } if (!isTauriRuntime()) { - setSkillsStatus(translate("skills.desktop_required")); + setSkillsStatus(t("skills.desktop_required")); return; } @@ -1828,14 +1827,14 @@ export function createExtensionsStore(options: { try { const result = await writeLocalSkill(root, trimmed, input.content); if (!result.ok) { - setSkillsStatus(result.stderr || result.stdout || translate("skills.unknown_error")); + setSkillsStatus(result.stderr || result.stdout || t("skills.unknown_error")); } else { setSkillsStatus(result.stdout || "Saved."); options.markReloadRequired?.("skills", { type: "skill", name: trimmed, action: "updated" }); } await refreshSkills({ force: true }); } catch (e) { - const message = e instanceof Error ? e.message : translate("skills.unknown_error"); + const message = e instanceof Error ? e.message : t("skills.unknown_error"); options.setError(addOpencodeCacheHint(message)); } finally { options.setBusy(false); diff --git a/apps/app/src/app/context/global-sync.tsx b/apps/app/src/app/context/global-sync.tsx index 4b73134bb..17638a2b7 100644 --- a/apps/app/src/app/context/global-sync.tsx +++ b/apps/app/src/app/context/global-sync.tsx @@ -1,6 +1,6 @@ import { createContext, createEffect, useContext, type ParentProps } from "solid-js"; -import { t, currentLocale } from "../../i18n"; +import { t } from "../../i18n"; import { createStore, type SetStoreFunction, type Store } from "solid-js/store"; import type { @@ -96,7 +96,7 @@ export function GlobalSyncProvider(props: ParentProps) { const setError = (error: unknown) => { const message = error instanceof Error ? error.message : safeStringify(error); - setGlobalStore("error", message || t("app.unknown_error", currentLocale())); + setGlobalStore("error", message || t("app.unknown_error")); }; const setProjectMeta = (projects: Project[]) => { diff --git a/apps/app/src/app/context/model-config.ts b/apps/app/src/app/context/model-config.ts index 4e1d73ed5..26e0729f0 100644 --- a/apps/app/src/app/context/model-config.ts +++ b/apps/app/src/app/context/model-config.ts @@ -2,7 +2,7 @@ import { createEffect, createMemo, createSignal, onCleanup, type Accessor } from import { parse } from "jsonc-parser"; -import { currentLocale, t } from "../../i18n"; +import { t } from "../../i18n"; import { DEFAULT_MODEL, MODEL_PREF_KEY, SESSION_MODEL_PREF_KEY, VARIANT_PREF_KEY } from "../constants"; import { readOpencodeConfig, writeOpencodeConfig } from "../lib/tauri"; import { @@ -551,9 +551,9 @@ export function createModelConfigStore(options: { const modelInfo = findProviderModel(ref); if (!modelInfo) { return { - title: t("app.model_behavior_title", currentLocale()), + title: t("app.model_behavior_title"), label: formatGenericBehaviorLabel(value), - description: t("app.model_behavior_desc", currentLocale()), + description: t("app.model_behavior_desc"), options: [], }; } @@ -597,7 +597,7 @@ export function createModelConfigStore(options: { modelID: DEFAULT_MODEL.modelID, title: DEFAULT_MODEL.modelID, description: DEFAULT_MODEL.providerID, - footer: t("settings.model_fallback", currentLocale()), + footer: t("settings.model_fallback"), behaviorTitle: behavior.title, behaviorLabel: behavior.label, behaviorDescription: behavior.description, @@ -637,9 +637,9 @@ export function createModelConfigStore(options: { const behaviorValue = sanitizeModelBehaviorValue(provider.id, model, activeVariant); const footerBits: string[] = []; if (defaultModelID === model.id || isDefault) { - footerBits.push(t("settings.model_default", currentLocale())); + footerBits.push(t("settings.model_default")); } - if (model.reasoning) footerBits.push(t("settings.model_reasoning", currentLocale())); + if (model.reasoning) footerBits.push(t("settings.model_reasoning")); next.push({ providerID: provider.id, @@ -1070,7 +1070,7 @@ export function createModelConfigStore(options: { const content = formatConfigWithDefaultModel(configFile.content, nextModel); const result = await writeOpencodeConfig("project", root, content); if (!result.ok) { - throw new Error(result.stderr || result.stdout || t("app.error_update_opencode_json", currentLocale())); + throw new Error(result.stderr || result.stdout || t("app.error_update_opencode_json")); } options.setLastKnownConfigSnapshot(getConfigSnapshot(content)); if (workspaceId) { @@ -1201,7 +1201,7 @@ export function createModelConfigStore(options: { if (workspace.workspaceType !== "local" || !root || !isTauriRuntime()) { throw new Error( - t("app.error_auto_compact_scope", currentLocale()), + t("app.error_auto_compact_scope"), ); } @@ -1211,7 +1211,7 @@ export function createModelConfigStore(options: { const content = formatConfigWithAutoCompactContext(configFile.content, nextValue); const result = await writeOpencodeConfig("project", root, content); if (!result.ok) { - throw new Error(result.stderr || result.stdout || t("app.error_update_opencode_json", currentLocale())); + throw new Error(result.stderr || result.stdout || t("app.error_update_opencode_json")); } options.setLastKnownConfigSnapshot(getConfigSnapshot(content)); options.markOpencodeConfigReloadRequired(); diff --git a/apps/app/src/app/context/providers/store.ts b/apps/app/src/app/context/providers/store.ts index a6dab2fc7..a44891fc5 100644 --- a/apps/app/src/app/context/providers/store.ts +++ b/apps/app/src/app/context/providers/store.ts @@ -368,7 +368,7 @@ export function createProvidersStore(options: CreateProvidersStoreOptions) { if (previousProviderId && previousProviderId !== provider.providerId) { updated = removeCloudProviderComment(updated, previousProviderId); - const previousEdits = modify(updated, ["provider", previousProviderId], undefined, { + const previousEdits = modify(updated, ["provider", previousProviderId], { formattingOptions: { insertSpaces: true, tabSize: 2 }, }); updated = applyEdits(updated, previousEdits); @@ -396,7 +396,7 @@ export function createProvidersStore(options: CreateProvidersStoreOptions) { const formatConfigWithoutCloudProvider = (raw: string, providerId: string) => { let updated = raw.trim() ? raw : '{\n "$schema": "https://opencode.ai/config.json"\n}\n'; updated = removeCloudProviderComment(updated, providerId); - const providerEdits = modify(updated, ["provider", providerId], undefined, { + const providerEdits = modify(updated, ["provider", providerId], { formattingOptions: { insertSpaces: true, tabSize: 2 }, }); updated = applyEdits(updated, providerEdits); @@ -670,7 +670,7 @@ export function createProvidersStore(options: CreateProvidersStoreOptions) { const heading = (() => { if (status === 401 || status === 403) return t("providers.auth_failed"); if (status === 429) return t("providers.rate_limit_exceeded"); - if (provider) return t("providers.provider_error", undefined, { provider }); + if (provider) return t("providers.provider_error", { provider }); return fallback; })(); diff --git a/apps/app/src/app/context/session.ts b/apps/app/src/app/context/session.ts index 120ab6f9a..607b9cc96 100644 --- a/apps/app/src/app/context/session.ts +++ b/apps/app/src/app/context/session.ts @@ -1,6 +1,6 @@ import { batch, createEffect, createMemo, createSignal, onCleanup } from "solid-js"; -import { t, currentLocale } from "../../i18n"; +import { t } from "../../i18n"; import { createStore, produce, reconcile } from "solid-js/store"; import type { Message, Part, Session } from "@opencode-ai/sdk/v2/client"; @@ -532,7 +532,7 @@ export function createSessionStore(options: { }); }; - const addError = (error: unknown, fallback = t("app.unknown_error", currentLocale())) => { + const addError = (error: unknown, fallback = t("app.unknown_error")) => { const message = error instanceof Error ? error.message : fallback; if (!message) return; options.setError(addOpencodeCacheHint(message)); @@ -701,14 +701,14 @@ export function createSessionStore(options: { const heading = (() => { if (errorName === "ProviderAuthError") return `Provider auth error${providerID ? ` (${providerID})` : ""}`; if (errorName === "APIError") { - if (effectiveStatus === 401 || effectiveStatus === 403) return t("app.error_auth_failed", currentLocale()); + if (effectiveStatus === 401 || effectiveStatus === 403) return t("app.error_auth_failed"); if (effectiveStatus === 413) return "Context too large"; - if (effectiveStatus === 429) return t("app.error_rate_limit", currentLocale()); + if (effectiveStatus === 429) return t("app.error_rate_limit"); return `API error${effectiveStatus ? ` (${effectiveStatus})` : ""}`; } - if (effectiveStatus === 401 || effectiveStatus === 403) return t("app.error_auth_failed", currentLocale()); + if (effectiveStatus === 401 || effectiveStatus === 403) return t("app.error_auth_failed"); if (effectiveStatus === 413) return "Context too large"; - if (effectiveStatus === 429) return t("app.error_rate_limit", currentLocale()); + if (effectiveStatus === 429) return t("app.error_rate_limit"); if (errorName === "MessageOutputLengthError") return "Output length limit exceeded"; return errorName.replace(/([a-z])([A-Z])/g, "$1 $2"); })(); @@ -1047,7 +1047,7 @@ export function createSessionStore(options: { if (!c) return; const trimmed = title.trim(); if (!trimmed) { - throw new Error(t("app.error_session_name_required", currentLocale())); + throw new Error(t("app.error_session_name_required")); } const next = unwrap(await c.session.update({ sessionID, title: trimmed })); rememberSession(next); @@ -1225,7 +1225,7 @@ export function createSessionStore(options: { mark("health FAILED", { error: error instanceof Error ? error.message : safeStringify(error), }); - throw new Error(t("app.connection_lost", currentLocale())); + throw new Error(t("app.connection_lost")); } } if (abortIfStale("selection changed after health")) return; diff --git a/apps/app/src/app/context/workspace.ts b/apps/app/src/app/context/workspace.ts index a3806fee2..1066b072c 100644 --- a/apps/app/src/app/context/workspace.ts +++ b/apps/app/src/app/context/workspace.ts @@ -69,7 +69,7 @@ import { import type { BootPhase, StartupBranch } from "../lib/startup-boot"; import { waitForHealthy, createClient, type OpencodeAuth } from "../lib/opencode"; import type { OpencodeConnectStatus, ProviderListItem } from "../types"; -import { t, currentLocale } from "../../i18n"; +import { t } from "../../i18n"; import { filterProviderList, mapConfigProvidersToList } from "../utils/providers"; import { buildDefaultWorkspaceBlueprint, normalizeWorkspaceOpenworkConfig } from "../lib/workspace-blueprints"; import type { OpenworkServerStore } from "../connections/openwork-server-store"; @@ -1551,7 +1551,7 @@ export function createWorkspaceStore(options: { } if (!resolvedBaseUrl) { - options.setError(t("app.error.remote_base_url_required", currentLocale())); + options.setError(t("app.error.remote_base_url_required")); updateWorkspaceConnectionState(id, { status: "error", message: "Remote base URL is required.", @@ -1583,7 +1583,7 @@ export function createWorkspaceStore(options: { } if (!baseUrl) { - options.setError(t("app.error.remote_base_url_required", currentLocale())); + options.setError(t("app.error.remote_base_url_required")); updateWorkspaceConnectionState(id, { status: "error", message: "Remote base URL is required.", @@ -2171,12 +2171,12 @@ export function createWorkspaceStore(options: { async function createWorkspaceFlow(preset: WorkspacePreset, folder: string | null): Promise { if (!isTauriRuntime()) { - options.setError(t("app.error.tauri_required", currentLocale())); + options.setError(t("app.error.tauri_required")); return false; } if (!folder) { - options.setError(t("app.error.choose_folder", currentLocale())); + options.setError(t("app.error.choose_folder")); return false; } @@ -2190,7 +2190,7 @@ export function createWorkspaceStore(options: { try { const resolvedFolder = await resolveWorkspacePath(folder); if (!resolvedFolder) { - options.setError(t("app.error.choose_folder", currentLocale())); + options.setError(t("app.error.choose_folder")); return false; } @@ -2275,12 +2275,12 @@ export function createWorkspaceStore(options: { input?: { onReady?: () => Promise | void }, ): Promise { if (!isTauriRuntime()) { - options.setError(t("app.error.tauri_required", currentLocale())); + options.setError(t("app.error.tauri_required")); return false; } if (!folder) { - options.setError(t("app.error.choose_folder", currentLocale())); + options.setError(t("app.error.choose_folder")); return false; } @@ -2346,7 +2346,7 @@ export function createWorkspaceStore(options: { try { const resolvedFolder = await resolveWorkspacePath(folder); if (!resolvedFolder) { - options.setError(t("app.error.choose_folder", currentLocale())); + options.setError(t("app.error.choose_folder")); setSandboxStep("workspace", { status: "error", detail: "No folder selected" }); setSandboxError("No folder selected"); return false; @@ -2559,7 +2559,7 @@ export function createWorkspaceStore(options: { const displayName = input.displayName?.trim() || null; if (!hostUrl) { - options.setError(t("app.error.remote_base_url_required", currentLocale())); + options.setError(t("app.error.remote_base_url_required")); return false; } @@ -2632,7 +2632,7 @@ export function createWorkspaceStore(options: { } if (!resolvedBaseUrl) { - options.setError(t("app.error.remote_base_url_required", currentLocale())); + options.setError(t("app.error.remote_base_url_required")); return false; } @@ -2798,7 +2798,7 @@ export function createWorkspaceStore(options: { const displayName = input.displayName?.trim() || null; if (!hostUrl) { - options.setError(t("app.error.remote_base_url_required", currentLocale())); + options.setError(t("app.error.remote_base_url_required")); return false; } @@ -2840,7 +2840,7 @@ export function createWorkspaceStore(options: { } if (!resolvedBaseUrl) { - options.setError(t("app.error.remote_base_url_required", currentLocale())); + options.setError(t("app.error.remote_base_url_required")); return false; } @@ -2928,7 +2928,7 @@ export function createWorkspaceStore(options: { async function forgetWorkspace(workspaceId: string) { if (!isTauriRuntime()) { - options.setError(t("app.error.tauri_required", currentLocale())); + options.setError(t("app.error.tauri_required")); return; } @@ -3018,10 +3018,10 @@ export function createWorkspaceStore(options: { } if (!isTauriRuntime()) { - options.setError(t("app.error.tauri_required", currentLocale())); + options.setError(t("app.error.tauri_required")); updateWorkspaceConnectionState(id, { status: "error", - message: t("app.error.tauri_required", currentLocale()), + message: t("app.error.tauri_required"), }); return false; } @@ -3106,12 +3106,12 @@ export function createWorkspaceStore(options: { async function pickWorkspaceFolder() { if (!isTauriRuntime()) { - options.setError(t("app.error.tauri_required", currentLocale())); + options.setError(t("app.error.tauri_required")); return null; } try { - const selection = await pickDirectory({ title: t("onboarding.choose_workspace_folder", currentLocale()) }); + const selection = await pickDirectory({ title: t("onboarding.choose_workspace_folder") }); const folder = typeof selection === "string" ? selection : Array.isArray(selection) ? selection[0] : null; @@ -3142,7 +3142,7 @@ export function createWorkspaceStore(options: { async function exportWorkspaceConfig(workspaceId?: string) { if (exportingWorkspaceConfig()) return; if (!isTauriRuntime()) { - options.setError(t("app.error.tauri_required", currentLocale())); + options.setError(t("app.error.tauri_required")); return; } @@ -3200,7 +3200,7 @@ export function createWorkspaceStore(options: { async function importWorkspaceConfig() { if (importingWorkspaceConfig()) return; if (!isTauriRuntime()) { - options.setError(t("app.error.tauri_required", currentLocale())); + options.setError(t("app.error.tauri_required")); return; } @@ -3225,7 +3225,7 @@ export function createWorkspaceStore(options: { const resolvedFolder = await resolveWorkspacePath(folder); if (!resolvedFolder) { - options.setError(t("app.error.choose_folder", currentLocale())); + options.setError(t("app.error.choose_folder")); return; } @@ -3254,19 +3254,19 @@ export function createWorkspaceStore(options: { async function startHost(optionsOverride?: { workspacePath?: string; navigate?: boolean }) { if (!isTauriRuntime()) { - options.setError(t("app.error.tauri_required", currentLocale())); + options.setError(t("app.error.tauri_required")); return false; } const overrideWorkspacePath = optionsOverride?.workspacePath?.trim() ?? ""; if (selectedWorkspaceInfo()?.workspaceType === "remote" && !overrideWorkspacePath) { - options.setError(t("app.error.host_requires_local", currentLocale())); + options.setError(t("app.error.host_requires_local")); return false; } const dir = (overrideWorkspacePath || selectedWorkspacePath() || projectDir()).trim(); if (!dir) { - options.setError(t("app.error.pick_workspace_folder", currentLocale())); + options.setError(t("app.error.pick_workspace_folder")); return false; } @@ -3477,10 +3477,10 @@ export function createWorkspaceStore(options: { closeWorkspaceConnectionSettings(); return; } - setEditRemoteWorkspaceError(t("app.error_connection_failed_url", currentLocale())); + setEditRemoteWorkspaceError(t("app.error_connection_failed_url")); options.setError(null); } catch (e) { - const message = e instanceof Error ? e.message : t("app.error_connection_failed", currentLocale()); + const message = e instanceof Error ? e.message : t("app.error_connection_failed"); setEditRemoteWorkspaceError(message); options.setError(null); } @@ -3657,7 +3657,7 @@ export function createWorkspaceStore(options: { setEngineInstallLogs(combined || null); if (!result.ok) { - options.setError(result.stderr.trim() || t("app.error.install_failed", currentLocale())); + options.setError(result.stderr.trim() || t("app.error.install_failed")); } await refreshEngineDoctor(); @@ -3750,7 +3750,7 @@ export function createWorkspaceStore(options: { if (selectedWorkspaceInfo()?.workspaceType === "remote") return; try { - const selection = await pickDirectory({ title: t("onboarding.authorize_folder", currentLocale()) }); + const selection = await pickDirectory({ title: t("onboarding.authorize_folder") }); const folder = typeof selection === "string" ? selection : Array.isArray(selection) ? selection[0] : null; if (!folder) return; diff --git a/apps/app/src/app/lib/model-behavior.ts b/apps/app/src/app/lib/model-behavior.ts index 287deb3c8..1bceea053 100644 --- a/apps/app/src/app/lib/model-behavior.ts +++ b/apps/app/src/app/lib/model-behavior.ts @@ -116,7 +116,7 @@ const getVariantDescription = (providerID: string, key: string, label: string) = if (key === "xhigh" || key === "max") return providerID === "anthropic" ? t("model_behavior.desc_max_anthropic") : t("model_behavior.desc_max"); - return t("model_behavior.desc_generic", undefined, { label: label.toLowerCase() }); + return t("model_behavior.desc_generic", { label: label.toLowerCase() }); }; export const getModelBehaviorOptions = ( diff --git a/apps/app/src/app/pages/automations.tsx b/apps/app/src/app/pages/automations.tsx index 4ceb54393..7e220525a 100644 --- a/apps/app/src/app/pages/automations.tsx +++ b/apps/app/src/app/pages/automations.tsx @@ -193,7 +193,7 @@ const humanizeCron = (cron: string) => { ) { const interval = Number.parseInt(hourRaw.slice(2), 10); if (Number.isFinite(interval) && interval > 0) { - return interval === 1 ? t("scheduled.every_hour") : t("scheduled.every_n_hours", undefined, { interval }); + return interval === 1 ? t("scheduled.every_hour") : t("scheduled.every_n_hours", { interval }); } } @@ -205,7 +205,7 @@ const humanizeCron = (cron: string) => { const timeLabel = `${pad2(hour)}:${pad2(minute)}`; if (dowRaw === "*") { - return t("scheduled.every_day_at", undefined, { time: timeLabel }); + return t("scheduled.every_day_at", { time: timeLabel }); } const days = parseCronNumbers(dowRaw); @@ -214,18 +214,18 @@ const humanizeCron = (cron: string) => { const weekdayDays = [1, 2, 3, 4, 5]; const weekendDays = [0, 6]; - if (allDays.every((d) => normalized.has(d))) return t("scheduled.every_day_at", undefined, { time: timeLabel }); + if (allDays.every((d) => normalized.has(d))) return t("scheduled.every_day_at", { time: timeLabel }); if ( weekdayDays.every((d) => normalized.has(d)) && !weekendDays.some((d) => normalized.has(d)) ) { - return t("scheduled.weekdays_at", undefined, { time: timeLabel }); + return t("scheduled.weekdays_at", { time: timeLabel }); } if ( weekendDays.every((d) => normalized.has(d)) && !weekdayDays.some((d) => normalized.has(d)) ) { - return t("scheduled.weekends_at", undefined, { time: timeLabel }); + return t("scheduled.weekends_at", { time: timeLabel }); } const labels: Record = { @@ -244,7 +244,7 @@ const humanizeCron = (cron: string) => { .map((d) => labels[d] ?? String(d)) .join(", "); - return list ? t("scheduled.days_at", undefined, { days: list, time: timeLabel }) : t("scheduled.at_time", undefined, { time: timeLabel }); + return list ? t("scheduled.days_at", { days: list, time: timeLabel }) : t("scheduled.at_time", { time: timeLabel }); }; const buildCronFromDaily = (timeValue: string, days: string[]) => { @@ -290,7 +290,7 @@ const toRelative = (value?: string | null) => { const templateScheduleLabel = (template: AutomationTemplate) => { if (template.scheduleMode === "interval") { const interval = template.intervalHours ?? DEFAULT_INTERVAL_HOURS; - return interval === 1 ? t("scheduled.every_hour") : t("scheduled.every_n_hours", undefined, { interval }); + return interval === 1 ? t("scheduled.every_hour") : t("scheduled.every_n_hours", { interval }); } return humanizeCron( buildCronFromDaily( @@ -610,7 +610,7 @@ export default function AutomationsView(props: AutomationsViewProps) { return; } await Promise.resolve(props.createSessionAndOpen(plan.prompt)); - showToast(t("scheduled.prepared_job_in_chat", undefined, { name: job.name }), "success"); + showToast(t("scheduled.prepared_job_in_chat", { name: job.name }), "success"); }; const confirmDelete = async () => { @@ -621,7 +621,7 @@ export default function AutomationsView(props: AutomationsViewProps) { try { await automations.remove(target.slug); setDeleteTarget(null); - showToast(t("scheduled.removed_job", undefined, { name: target.name }), "success"); + showToast(t("scheduled.removed_job", { name: target.name }), "success"); } catch (error) { const message = error instanceof Error ? error.message : String(error); setDeleteError(message || t("scheduled.delete_error_fallback")); @@ -648,7 +648,7 @@ export default function AutomationsView(props: AutomationsViewProps) { const jobsEmptyMessage = createMemo(() => { const query = searchQuery().trim(); - if (query) return t("scheduled.no_automations_match", undefined, { query }); + if (query) return t("scheduled.no_automations_match", { query }); if (schedulerGateActive()) return t("scheduled.install_scheduler_hint"); return t("scheduled.empty_hint"); }); @@ -829,7 +829,7 @@ export default function AutomationsView(props: AutomationsViewProps) { {t("scheduled.quick_start_templates_desc")}

-
{t("scheduled.template_count", undefined, { count: filteredTemplates().length })}
+
{t("scheduled.template_count", { count: filteredTemplates().length })}

{t("scheduled.delete_confirm_title")}

- {t("scheduled.delete_confirm_desc", undefined, { source: sourceLabel().toLowerCase() })} + {t("scheduled.delete_confirm_desc", { source: sourceLabel().toLowerCase() })}

diff --git a/apps/app/src/app/pages/extensions.tsx b/apps/app/src/app/pages/extensions.tsx index cc61c3306..4b4da367b 100644 --- a/apps/app/src/app/pages/extensions.tsx +++ b/apps/app/src/app/pages/extensions.tsx @@ -75,7 +75,7 @@ export default function ExtensionsView(props: ExtensionsViewProps) {
- {t(connectedAppsCount() === 1 ? "extensions.app_count_one" : "extensions.app_count_many", undefined, { count: connectedAppsCount() })} + {t(connectedAppsCount() === 1 ? "extensions.app_count_one" : "extensions.app_count_many", { count: connectedAppsCount() })}
@@ -83,7 +83,7 @@ export default function ExtensionsView(props: ExtensionsViewProps) {
- {t(pluginCount() === 1 ? "extensions.plugin_count_one" : "extensions.plugin_count_many", undefined, { count: pluginCount() })} + {t(pluginCount() === 1 ? "extensions.plugin_count_one" : "extensions.plugin_count_many", { count: pluginCount() })}
diff --git a/apps/app/src/app/pages/identities.tsx b/apps/app/src/app/pages/identities.tsx index f4ae04872..9e19a26d0 100644 --- a/apps/app/src/app/pages/identities.tsx +++ b/apps/app/src/app/pages/identities.tsx @@ -270,11 +270,11 @@ export default function IdentitiesView(props: IdentitiesViewProps) { const elapsedMs = Math.max(0, Date.now() - ts); if (elapsedMs < 60_000) return t("identities.just_now"); const minutes = Math.floor(elapsedMs / 60_000); - if (minutes < 60) return t("identities.minutes_ago", undefined, { minutes }); + if (minutes < 60) return t("identities.minutes_ago", { minutes }); const hours = Math.floor(minutes / 60); - if (hours < 24) return t("identities.hours_ago", undefined, { hours }); + if (hours < 24) return t("identities.hours_ago", { hours }); const days = Math.floor(hours / 24); - return t("identities.days_ago", undefined, { days }); + return t("identities.days_ago", { days }); }); const workspaceAgentStatus = createMemo(() => { @@ -416,7 +416,7 @@ export default function IdentitiesView(props: IdentitiesViewProps) { ...(sendAutoBind() ? { autoBind: true } : {}), }); setSendResult(result); - const base = t("identities.dispatched_messages", undefined, { sent: result.sent, attempted: result.attempted }); + const base = t("identities.dispatched_messages", { sent: result.sent, attempted: result.attempted }); setSendStatus(result.reason?.trim() ? `${base} ${result.reason.trim()}` : base); } catch (error) { setSendError(formatRequestError(error)); @@ -493,7 +493,7 @@ export default function IdentitiesView(props: IdentitiesViewProps) { const message = (healthRes.json && typeof (healthRes.json as any).message === "string") ? String((healthRes.json as any).message) - : t("identities.health_unavailable_status", undefined, { status: healthRes.status }); + : t("identities.health_unavailable_status", { status: healthRes.status }); setHealthError(message); } setMessagingRestartRequired(true); @@ -666,7 +666,7 @@ export default function IdentitiesView(props: IdentitiesViewProps) { const pairingCode = typeof result.telegram?.pairingCode === "string" ? result.telegram.pairingCode.trim() : ""; if (access === "private" && pairingCode) { setTelegramPairingCode(pairingCode); - setTelegramStatus(t("identities.telegram_private_saved_pair", undefined, { code: pairingCode })); + setTelegramStatus(t("identities.telegram_private_saved_pair", { code: pairingCode })); } else { setTelegramPairingCode(null); } @@ -675,7 +675,7 @@ export default function IdentitiesView(props: IdentitiesViewProps) { const normalized = String(username).trim().replace(/^@+/, ""); setTelegramBotUsername(normalized || null); if (access !== "private" || !pairingCode) { - setTelegramStatus(t("identities.telegram_saved_username", undefined, { username: normalized || String(username) })); + setTelegramStatus(t("identities.telegram_saved_username", { username: normalized || String(username) })); } } else { if (access !== "private" || !pairingCode) { @@ -1290,7 +1290,7 @@ export default function IdentitiesView(props: IdentitiesViewProps) { class="inline-flex items-center gap-2 rounded-lg border border-gray-4 bg-gray-2/50 px-3 py-2 text-[12px] font-medium text-gray-11 hover:bg-gray-2" > - {t("identities.open_bot_link", undefined, { username: telegramBotUsername() ?? "" })} + {t("identities.open_bot_link", { username: telegramBotUsername() ?? "" })} )} @@ -1546,7 +1546,7 @@ export default function IdentitiesView(props: IdentitiesViewProps) { {(value) => (
- {t("identities.agent_scope_status", undefined, { status: value().loaded ? t("identities.agent_status_loaded") : t("identities.agent_status_missing"), agent: value().selected || t("identities.agent_none") })} + {t("identities.agent_scope_status", { status: value().loaded ? t("identities.agent_status_loaded") : t("identities.agent_status_missing"), agent: value().selected || t("identities.agent_none") })}
)}
diff --git a/apps/app/src/app/pages/mcp.tsx b/apps/app/src/app/pages/mcp.tsx index 02e5b53d9..cbcb5c195 100644 --- a/apps/app/src/app/pages/mcp.tsx +++ b/apps/app/src/app/pages/mcp.tsx @@ -133,7 +133,6 @@ const serviceIconBg = (name: string) => { export default function McpView(props: McpViewProps) { const locale = () => currentLocale(); - const tr = (key: string) => t(key, locale()); const showHeader = () => props.showHeader !== false; const [logoutOpen, setLogoutOpen] = createSignal(false); @@ -189,7 +188,7 @@ export default function McpView(props: McpViewProps) { if (nextId !== configRequestId) return; setProjectConfig(null); setGlobalConfig(null); - setConfigError(e instanceof Error ? e.message : tr("mcp.config_load_failed")); + setConfigError(e instanceof Error ? e.message : t("mcp.config_load_failed")); } })(); }); @@ -199,7 +198,7 @@ export default function McpView(props: McpViewProps) { ); const revealLabel = () => - isWindowsPlatform() ? tr("mcp.open_file") : tr("mcp.reveal_in_finder"); + isWindowsPlatform() ? t("mcp.open_file") : t("mcp.reveal_in_finder"); const canRevealConfig = () => { if (!isTauriRuntime() || revealBusy()) return false; @@ -212,7 +211,7 @@ export default function McpView(props: McpViewProps) { const root = props.selectedWorkspaceRoot.trim(); if (configScope() === "project" && !root) { - setConfigError(tr("mcp.pick_workspace_error")); + setConfigError(t("mcp.pick_workspace_error")); return; } @@ -223,7 +222,7 @@ export default function McpView(props: McpViewProps) { ? await props.readConfigFile(configScope()) : await readOpencodeConfig(configScope(), root); if (!resolved) { - throw new Error(tr("mcp.config_load_failed")); + throw new Error(t("mcp.config_load_failed")); } const { openPath, revealItemInDir } = await import("@tauri-apps/plugin-opener"); if (isWindowsPlatform()) { @@ -232,7 +231,7 @@ export default function McpView(props: McpViewProps) { await revealItemInDir(resolved.path); } } catch (e) { - setConfigError(e instanceof Error ? e.message : tr("mcp.reveal_config_failed")); + setConfigError(e instanceof Error ? e.message : t("mcp.reveal_config_failed")); } finally { setRevealBusy(false); } @@ -308,15 +307,15 @@ export default function McpView(props: McpViewProps) { {/* ── Header ───────────────────────────────────── */}
-

{tr("mcp.apps_title")}

+

{t("mcp.apps_title")}

- {tr("mcp.apps_subtitle")} + {t("mcp.apps_subtitle")}

0}>
- {connectedCount()} {connectedCount() === 1 ? tr("mcp.app_connected") : tr("mcp.apps_connected")} + {connectedCount()} {connectedCount() === 1 ? t("mcp.app_connected") : t("mcp.apps_connected")}
@@ -333,12 +332,12 @@ export default function McpView(props: McpViewProps) {
-
{tr("mcp.add_modal_title")}
-
{tr("mcp.custom_app_cta_hint")}
+
{t("mcp.add_modal_title")}
+
{t("mcp.custom_app_cta_hint")}
@@ -347,9 +346,9 @@ export default function McpView(props: McpViewProps) {

- {tr("mcp.available_apps")} + {t("mcp.available_apps")}

- {tr("mcp.one_click_connect")} + {t("mcp.one_click_connect")}
@@ -366,7 +365,7 @@ export default function McpView(props: McpViewProps) {
@@ -449,11 +448,11 @@ export default function McpView(props: McpViewProps) {

- {tr("mcp.your_apps")} + {t("mcp.your_apps")}

- {tr("mcp.last_synced")} {formatRelativeTime(props.mcpLastUpdatedAt ?? Date.now())} + {t("mcp.last_synced")} {formatRelativeTime(props.mcpLastUpdatedAt ?? Date.now())}
@@ -463,8 +462,8 @@ export default function McpView(props: McpViewProps) { fallback={
-
{tr("mcp.no_apps_yet")}
-
{tr("mcp.no_apps_hint")}
+
{t("mcp.no_apps_yet")}
+
{t("mcp.no_apps_hint")}
} > @@ -477,7 +476,7 @@ export default function McpView(props: McpViewProps) { const errorInfo = () => { const resolved = props.mcpStatuses[entry.name]; if (!resolved || resolved.status !== "failed") return null; - return "error" in resolved ? resolved.error : tr("mcp.connection_failed"); + return "error" in resolved ? resolved.error : t("mcp.connection_failed"); }; return ( @@ -518,20 +517,20 @@ export default function McpView(props: McpViewProps) {
{/* Connection type */}
- {tr("mcp.connection_type")} + {t("mcp.connection_type")} - {entry.config.type === "remote" ? tr("mcp.type_cloud") : tr("mcp.type_local")} + {entry.config.type === "remote" ? t("mcp.type_cloud") : t("mcp.type_local")}
{/* Capabilities */}
- {tr("mcp.cap_tools")} + {t("mcp.cap_tools")} - {tr("mcp.cap_signin")} + {t("mcp.cap_signin")}
@@ -549,7 +548,7 @@ export default function McpView(props: McpViewProps) {
- {tr("mcp.technical_details")} + {t("mcp.technical_details")}
@@ -562,7 +561,7 @@ export default function McpView(props: McpViewProps) {
- {tr("mcp.logout_label")} + {t("mcp.logout_label")}
- {tr("mcp.login_hint")} + {t("mcp.login_hint")}
- {tr("mcp.logout_label")} + {t("mcp.logout_label")}
- {tr("mcp.logout_hint")} + {t("mcp.logout_hint")}
@@ -605,7 +604,7 @@ export default function McpView(props: McpViewProps) { onClick={() => openControlChromeModal("edit", entry)} > - {tr("mcp.control_chrome_edit")} + {t("mcp.control_chrome_edit")}
@@ -632,10 +631,10 @@ export default function McpView(props: McpViewProps) { { if (logoutBusy()) return; @@ -649,10 +648,10 @@ export default function McpView(props: McpViewProps) { { setRemoveOpen(false); @@ -676,8 +675,8 @@ export default function McpView(props: McpViewProps) {
-
{tr("mcp.advanced_settings")}
-
{tr("mcp.advanced_settings_hint")}
+
{t("mcp.advanced_settings")}
+
{t("mcp.advanced_settings_hint")}
@@ -697,7 +696,7 @@ export default function McpView(props: McpViewProps) { }`} onClick={() => setConfigScope("project")} > - {tr("mcp.scope_project")} + {t("mcp.scope_project")}
{/* Config path */}
-
{tr("mcp.config_file")}
+
{t("mcp.config_file")}
- {activeConfig()?.path ?? tr("mcp.config_not_loaded")} + {activeConfig()?.path ?? t("mcp.config_not_loaded")}
@@ -728,7 +727,7 @@ export default function McpView(props: McpViewProps) { fallback={<> {revealLabel()}} > - {tr("mcp.opening_label")} + {t("mcp.opening_label")} - {tr("mcp.docs_link")} + {t("mcp.docs_link")}
-
{tr("mcp.file_not_found")}
+
{t("mcp.file_not_found")}
diff --git a/apps/app/src/app/pages/session.tsx b/apps/app/src/app/pages/session.tsx index 2fd8251ec..231794535 100644 --- a/apps/app/src/app/pages/session.tsx +++ b/apps/app/src/app/pages/session.tsx @@ -627,7 +627,7 @@ export default function SessionView(props: SessionViewProps) { const size = hits.length; const raw = activeSearchHitIndex(); const index = ((raw % size) + size) % size; - return t("session.search_position", undefined, { current: index + 1, total: size }); + return t("session.search_position", { current: index + 1, total: size }); }); const searchActive = createMemo( @@ -1057,7 +1057,7 @@ export default function SessionView(props: SessionViewProps) { const todoLabel = createMemo(() => { const total = todoCount(); if (!total) return ""; - return t("session.todo_progress", undefined, { completed: todoCompletedCount(), total }); + return t("session.todo_progress", { completed: todoCompletedCount(), total }); }); const shareWorkspaceState = createShareWorkspaceState({ workspaces: () => props.workspaces, @@ -2509,7 +2509,7 @@ export default function SessionView(props: SessionViewProps) { files.length === 1 ? (files[0]?.name ?? "file") : `${files.length} files`; if (notify) { showComposerNotice({ - title: t("session.uploading_to_shared_folder", undefined, { label }), + title: t("session.uploading_to_shared_folder", { label }), tone: "info", }); } @@ -2528,7 +2528,7 @@ export default function SessionView(props: SessionViewProps) { .join(", "); showComposerNotice({ title: summary - ? t("session.uploaded_with_summary", undefined, { summary }) + ? t("session.uploaded_with_summary", { summary }) : t("session.uploaded_to_shared_folder"), tone: "success", }); @@ -2636,7 +2636,7 @@ export default function SessionView(props: SessionViewProps) { { id: "sessions", title: t("session.cmd_sessions_title"), - detail: t("session.cmd_sessions_detail", undefined, { count: totalSessionCount().toLocaleString() }), + detail: t("session.cmd_sessions_detail", { count: totalSessionCount().toLocaleString() }), meta: t("session.cmd_sessions_meta"), action: () => { setCommandPaletteMode("sessions"); @@ -2648,7 +2648,7 @@ export default function SessionView(props: SessionViewProps) { { id: "model", title: t("session.cmd_model_title"), - detail: t("session.cmd_model_detail", undefined, { model: modelControls.selectedSessionModelLabel() || t("session.cmd_model_fallback"), variant: modelControls.sessionModelVariantLabel() }), + detail: t("session.cmd_model_detail", { model: modelControls.selectedSessionModelLabel() || t("session.cmd_model_fallback"), variant: modelControls.sessionModelVariantLabel() }), meta: t("session.cmd_model_meta"), action: () => { closeCommandPalette(); @@ -2770,7 +2770,7 @@ export default function SessionView(props: SessionViewProps) { } if (state === "downloading") { const percent = updateDownloadPercent(); - return percent == null ? t("session.downloading") : t("session.downloading_percent", undefined, { percent }); + return percent == null ? t("session.downloading") : t("session.downloading_percent", { percent }); } return t("session.update_available"); }); @@ -2830,11 +2830,11 @@ export default function SessionView(props: SessionViewProps) { const state = props.updateStatus?.state; if (state === "ready") { return props.anyActiveRuns - ? t("session.update_ready_stop_runs_title", undefined, { version }) - : t("session.restart_update_title", undefined, { version }); + ? t("session.update_ready_stop_runs_title", { version }) + : t("session.restart_update_title", { version }); } - if (state === "downloading") return t("session.downloading_update_title", undefined, { version }); - return t("session.update_available_title", undefined, { version }); + if (state === "downloading") return t("session.downloading_update_title", { version }); + return t("session.update_available_title", { version }); }); const handleUpdatePillClick = () => { @@ -3400,7 +3400,7 @@ export default function SessionView(props: SessionViewProps) { {props.loadingEarlierMessages ? t("session.loading_earlier") : hiddenMessageCount() > 0 - ? t("session.show_earlier", undefined, { count: nextRevealCount().toLocaleString(), plural: nextRevealCount() === 1 ? "" : "s" }) + ? t("session.show_earlier", { count: nextRevealCount().toLocaleString(), plural: nextRevealCount() === 1 ? "" : "s" }) : t("session.load_earlier")}
@@ -3780,7 +3780,7 @@ export default function SessionView(props: SessionViewProps) { title={t("session.delete_session_title")} message={ sessionTitleForId(deleteSessionId()).trim() - ? t("session.delete_named_session_message", undefined, { title: sessionTitleForId(deleteSessionId()).trim() }) + ? t("session.delete_named_session_message", { title: sessionTitleForId(deleteSessionId()).trim() }) : t("session.delete_session_generic") } confirmLabel={deleteSessionBusy() ? t("session.deleting") : t("session.delete")} diff --git a/apps/app/src/app/pages/settings.tsx b/apps/app/src/app/pages/settings.tsx index ea68b5f77..6ca58d4e6 100644 --- a/apps/app/src/app/pages/settings.tsx +++ b/apps/app/src/app/pages/settings.tsx @@ -344,10 +344,10 @@ export default function SettingsView(props: SettingsViewProps) { const percent = updateDownloadPercent(); if (total != null && percent != null) { - return t("settings.downloading_progress", undefined, { downloaded: formatBytes(downloaded), total: formatBytes(total), percent: String(percent) }) + (version ? ` · v${version}` : ""); + return t("settings.downloading_progress", { downloaded: formatBytes(downloaded), total: formatBytes(total), percent: String(percent) }) + (version ? ` · v${version}` : ""); } - return t("settings.downloading_bytes", undefined, { downloaded: formatBytes(downloaded) }) + (version ? ` · v${version}` : ""); + return t("settings.downloading_bytes", { downloaded: formatBytes(downloaded) }) + (version ? ` · v${version}` : ""); }); const updateToolbarActionLabel = createMemo(() => { @@ -439,7 +439,7 @@ export default function SettingsView(props: SettingsViewProps) { const providerStatusLabel = createMemo(() => { if (!providerAvailableCount()) return t("config.unavailable"); if (!providerConnectedCount()) return t("config.status_not_connected"); - return t("settings.connected_count", undefined, { count: providerConnectedCount() }); + return t("settings.connected_count", { count: providerConnectedCount() }); }); const providerStatusStyle = createMemo(() => { if (!providerAvailableCount()) @@ -453,8 +453,8 @@ export default function SettingsView(props: SettingsViewProps) { return t("settings.connect_opencode_hint"); const connected = providerConnectedCount(); const available = providerAvailableCount(); - if (!connected) return t("settings.available_count", undefined, { count: available }); - return `${t("settings.connected_count", undefined, { count: connected })} · ${t("settings.available_count", undefined, { count: available })}`; + if (!connected) return t("settings.available_count", { count: available }); + return `${t("settings.connected_count", { count: connected })} · ${t("settings.available_count", { count: available })}`; }); const handleOpenProviderAuth = async () => { @@ -2284,13 +2284,13 @@ export default function SettingsView(props: SettingsViewProps) { {t("settings.update_checking")} - {t("settings.update_available_version", undefined, { version: updateVersion() ?? "" })} + {t("settings.update_available_version", { version: updateVersion() ?? "" })} {t("settings.update_downloading")} - {t("settings.update_ready_version", undefined, { version: updateVersion() ?? "" })} + {t("settings.update_ready_version", { version: updateVersion() ?? "" })} {t("settings.update_check_failed")} @@ -2305,7 +2305,7 @@ export default function SettingsView(props: SettingsViewProps) { } >
- {t("settings.update_last_checked", undefined, { time: formatRelativeTime(updateLastCheckedAt() as number) })} + {t("settings.update_last_checked", { time: formatRelativeTime(updateLastCheckedAt() as number) })}
- {t("settings.update_published", undefined, { date: updateDate() ?? "" })} + {t("settings.update_published", { date: updateDate() ?? "" })}
@@ -2563,12 +2563,12 @@ export default function SettingsView(props: SettingsViewProps) {
-
{t("settings.debug_desktop_app", undefined, { version: appVersionLabel() })}
-
{t("settings.debug_commit", undefined, { commit: appCommitLabel() })}
-
{t("settings.debug_orchestrator_version", undefined, { version: orchestratorVersionLabel() })}
-
{t("settings.debug_opencode_version", undefined, { version: opencodeVersionLabel() })}
-
{t("settings.debug_openwork_server_version", undefined, { version: openworkServerVersionLabel() })}
-
{t("settings.debug_opencode_router_version", undefined, { version: opencodeRouterVersionLabel() })}
+
{t("settings.debug_desktop_app", { version: appVersionLabel() })}
+
{t("settings.debug_commit", { commit: appCommitLabel() })}
+
{t("settings.debug_orchestrator_version", { version: orchestratorVersionLabel() })}
+
{t("settings.debug_opencode_version", { version: opencodeVersionLabel() })}
+
{t("settings.debug_openwork_server_version", { version: openworkServerVersionLabel() })}
+
{t("settings.debug_opencode_router_version", { version: opencodeRouterVersionLabel() })}
                     {runtimeDebugReportJson()}
@@ -2665,9 +2665,9 @@ export default function SettingsView(props: SettingsViewProps) {
                     {(result) => (
                       
- {t("settings.sandbox_run_id", undefined, { id: result().runId ?? "—" })} + {t("settings.sandbox_run_id", { id: result().runId ?? "—" })}
-
{t("settings.sandbox_result", undefined, { status: result().ready ? t("settings.sandbox_ready") : t("settings.sandbox_error") })}
+
{t("settings.sandbox_result", { status: result().ready ? t("settings.sandbox_ready") : t("settings.sandbox_error") })}
{(err) =>
{err()}
}
@@ -3066,22 +3066,22 @@ export default function SettingsView(props: SettingsViewProps) {
- {t("settings.debug_desktop_app", undefined, { version: appVersionLabel() })} + {t("settings.debug_desktop_app", { version: appVersionLabel() })}
- {t("settings.debug_commit", undefined, { commit: appCommitLabel() })} + {t("settings.debug_commit", { commit: appCommitLabel() })}
- {t("settings.debug_orchestrator_version", undefined, { version: orchestratorVersionLabel() })} + {t("settings.debug_orchestrator_version", { version: orchestratorVersionLabel() })}
- {t("settings.debug_opencode_version", undefined, { version: opencodeVersionLabel() })} + {t("settings.debug_opencode_version", { version: opencodeVersionLabel() })}
- {t("settings.debug_openwork_server_version", undefined, { version: openworkServerVersionLabel() })} + {t("settings.debug_openwork_server_version", { version: openworkServerVersionLabel() })}
- {t("settings.debug_opencode_router_version", undefined, { version: opencodeRouterVersionLabel() })} + {t("settings.debug_opencode_router_version", { version: opencodeRouterVersionLabel() })}
@@ -3111,7 +3111,7 @@ export default function SettingsView(props: SettingsViewProps) { t("settings.no_project_directory")}
- {t("settings.diag_pid", undefined, { pid: String(props.engineInfo?.pid ?? "—") })} + {t("settings.diag_pid", { pid: String(props.engineInfo?.pid ?? "—") })}
@@ -3156,25 +3156,25 @@ export default function SettingsView(props: SettingsViewProps) { t("settings.data_dir_unavailable")}
- {t("settings.diag_daemon_url", undefined, { url: props.orchestratorStatus?.daemon?.baseUrl ?? "—" })} + {t("settings.diag_daemon_url", { url: props.orchestratorStatus?.daemon?.baseUrl ?? "—" })}
- {t("settings.diag_opencode_url", undefined, { url: props.orchestratorStatus?.opencode?.baseUrl ?? "—" })} + {t("settings.diag_opencode_url", { url: props.orchestratorStatus?.opencode?.baseUrl ?? "—" })}
- {t("settings.diag_version", undefined, { version: props.orchestratorStatus?.cliVersion ?? "—" })} + {t("settings.diag_version", { version: props.orchestratorStatus?.cliVersion ?? "—" })}
- {t("settings.diag_sidecar", undefined, { info: orchestratorSidecarSummary() })} + {t("settings.diag_sidecar", { info: orchestratorSidecarSummary() })}
- {t("settings.diag_opencode_binary", undefined, { binary: formatOrchestratorBinary(props.orchestratorStatus?.binaries?.opencode ?? null) })} + {t("settings.diag_opencode_binary", { binary: formatOrchestratorBinary(props.orchestratorStatus?.binaries?.opencode ?? null) })}
- {t("settings.diag_runtime_workspace", undefined, { id: props.orchestratorStatus?.activeId ?? "—" })} + {t("settings.diag_runtime_workspace", { id: props.orchestratorStatus?.activeId ?? "—" })}
@@ -3215,11 +3215,11 @@ export default function SettingsView(props: SettingsViewProps) { t("settings.no_worker_directory")}
- {t("settings.diag_last_attempt", undefined, { time: opencodeConnectTimestamp() ?? "—" })} + {t("settings.diag_last_attempt", { time: opencodeConnectTimestamp() ?? "—" })}
- {t("settings.diag_reason", undefined, { reason: props.opencodeConnectStatus?.reason ?? "" })} + {t("settings.diag_reason", { reason: props.opencodeConnectStatus?.reason ?? "" })}
@@ -3227,29 +3227,29 @@ export default function SettingsView(props: SettingsViewProps) {
- {t("settings.diag_healthy_ms", undefined, { ms: String(Math.round(metrics().healthyMs as number)) })} + {t("settings.diag_healthy_ms", { ms: String(Math.round(metrics().healthyMs as number)) })}
- {t("settings.diag_load_sessions_ms", undefined, { ms: String(Math.round(metrics().loadSessionsMs as number)) })} + {t("settings.diag_load_sessions_ms", { ms: String(Math.round(metrics().loadSessionsMs as number)) })}
- {t("settings.diag_pending_permissions_ms", undefined, { ms: String(Math.round(metrics().pendingPermissionsMs as number)) })} + {t("settings.diag_pending_permissions_ms", { ms: String(Math.round(metrics().pendingPermissionsMs as number)) })}
- {t("settings.diag_providers_ms", undefined, { ms: String(Math.round(metrics().providersMs as number)) })} + {t("settings.diag_providers_ms", { ms: String(Math.round(metrics().providersMs as number)) })}
- {t("settings.diag_total_ms", undefined, { ms: String(Math.round(metrics().totalMs as number)) })} + {t("settings.diag_total_ms", { ms: String(Math.round(metrics().totalMs as number)) })}
@@ -3291,7 +3291,7 @@ export default function SettingsView(props: SettingsViewProps) { t("settings.base_url_unavailable")}
- {t("settings.diag_pid", undefined, { pid: String(props.openworkServerHostInfo?.pid ?? "—") })} + {t("settings.diag_pid", { pid: String(props.openworkServerHostInfo?.pid ?? "—") })}
@@ -3340,10 +3340,10 @@ export default function SettingsView(props: SettingsViewProps) { t("settings.no_worker_directory")}
- {t("settings.diag_health_port", undefined, { port: String(props.opencodeRouterInfo?.healthPort ?? "—") })} + {t("settings.diag_health_port", { port: String(props.opencodeRouterInfo?.healthPort ?? "—") })}
- {t("settings.diag_pid", undefined, { pid: String(props.opencodeRouterInfo?.pid ?? "—") })} + {t("settings.diag_pid", { pid: String(props.opencodeRouterInfo?.pid ?? "—") })}
@@ -3418,26 +3418,26 @@ export default function SettingsView(props: SettingsViewProps) { > {(diag) => (
-
{t("settings.diag_started", undefined, { time: formatUptime(diag().uptimeMs) })}
+
{t("settings.diag_started", { time: formatUptime(diag().uptimeMs) })}
- {t("settings.diag_read_only", undefined, { value: diag().readOnly ? "true" : "false" })} + {t("settings.diag_read_only", { value: diag().readOnly ? "true" : "false" })}
- {t("settings.diag_approval", undefined, { mode: diag().approval.mode, ms: String(diag().approval.timeoutMs) })} + {t("settings.diag_approval", { mode: diag().approval.mode, ms: String(diag().approval.timeoutMs) })}
-
{t("settings.diag_workspaces", undefined, { count: String(diag().workspaceCount) })}
+
{t("settings.diag_workspaces", { count: String(diag().workspaceCount) })}
- {t("settings.diag_selected_workspace", undefined, { id: diag().selectedWorkspaceId ?? "—" })} + {t("settings.diag_selected_workspace", { id: diag().selectedWorkspaceId ?? "—" })}
- {t("settings.diag_runtime_workspace", undefined, { id: diag().activeWorkspaceId ?? "—" })} + {t("settings.diag_runtime_workspace", { id: diag().activeWorkspaceId ?? "—" })}
- {t("settings.diag_config_path", undefined, { path: diag().server.configPath ?? t("settings.diag_default") })} + {t("settings.diag_config_path", { path: diag().server.configPath ?? t("settings.diag_default") })}
-
{t("settings.diag_token_source", undefined, { source: diag().tokenSource.client })}
+
{t("settings.diag_token_source", { source: diag().tokenSource.client })}
- {t("settings.diag_host_token_source", undefined, { source: diag().tokenSource.host })} + {t("settings.diag_host_token_source", { source: diag().tokenSource.host })}
)} @@ -3451,7 +3451,7 @@ export default function SettingsView(props: SettingsViewProps) {
{props.runtimeWorkspaceId - ? t("settings.worker_id_label", undefined, { id: props.runtimeWorkspaceId }) + ? t("settings.worker_id_label", { id: props.runtimeWorkspaceId }) : t("settings.worker_unresolved")}
@@ -3465,20 +3465,20 @@ export default function SettingsView(props: SettingsViewProps) { > {(caps) => (
-
{t("settings.cap_skills", undefined, { value: formatCapability(caps().skills) })}
-
{t("settings.cap_plugins", undefined, { value: formatCapability(caps().plugins) })}
-
{t("settings.cap_mcp", undefined, { value: formatCapability(caps().mcp) })}
-
{t("settings.cap_commands", undefined, { value: formatCapability(caps().commands) })}
-
{t("settings.cap_config", undefined, { value: formatCapability(caps().config) })}
+
{t("settings.cap_skills", { value: formatCapability(caps().skills) })}
+
{t("settings.cap_plugins", { value: formatCapability(caps().plugins) })}
+
{t("settings.cap_mcp", { value: formatCapability(caps().mcp) })}
+
{t("settings.cap_commands", { value: formatCapability(caps().commands) })}
+
{t("settings.cap_config", { value: formatCapability(caps().config) })}
- {t("settings.cap_proxy", undefined, { + {t("settings.cap_proxy", { value: caps().proxy?.opencodeRouter ? t("settings.enabled") : t("settings.disabled") })}
- {t("settings.cap_browser_tools", undefined, { + {t("settings.cap_browser_tools", { value: (() => { const browser = caps().toolProviders?.browser; if (!browser?.enabled) return t("settings.disabled"); @@ -3487,7 +3487,7 @@ export default function SettingsView(props: SettingsViewProps) { })}
- {t("settings.cap_file_tools", undefined, { + {t("settings.cap_file_tools", { value: (() => { const files = caps().toolProviders?.files; if (!files) return t("config.unavailable"); @@ -3500,7 +3500,7 @@ export default function SettingsView(props: SettingsViewProps) { })}
- {t("settings.cap_sandbox", undefined, { + {t("settings.cap_sandbox", { value: (() => { const sandbox = caps().sandbox; return sandbox diff --git a/apps/app/src/app/pages/skills.tsx b/apps/app/src/app/pages/skills.tsx index 9c2b68aa4..ffef12598 100644 --- a/apps/app/src/app/pages/skills.tsx +++ b/apps/app/src/app/pages/skills.tsx @@ -27,7 +27,7 @@ import { Users, X, } from "lucide-solid"; -import { currentLocale, t } from "../../i18n"; +import { t } from "../../i18n"; import { DEFAULT_OPENWORK_PUBLISHER_BASE_URL, publishOpenworkBundleJson } from "../lib/publisher"; import { buildDenAuthUrl, createDenClient, DEFAULT_DEN_BASE_URL, readDenSettings, type DenOrgSkillHubSummary } from "../lib/den"; import { useStatusToasts, type AppStatusToastTone } from "../shell/status-toasts"; @@ -88,7 +88,6 @@ export default function SkillsView(props: SkillsViewProps) { const platform = usePlatform(); const statusToasts = useStatusToasts(); // Translation helper that uses current language from i18n - const translate = (key: string) => t(key, currentLocale()); const skillCreatorInstalled = createMemo(() => extensions.skills().some((skill) => skill.name === "skill-creator") @@ -150,14 +149,14 @@ export default function SkillsView(props: SkillsViewProps) { const shareTeamOrgLabel = createMemo(() => { cloudSessionNonce(); const name = readDenSettings().activeOrgName?.trim(); - return name || translate("skills.share_team_org_fallback"); + return name || t("skills.share_team_org_fallback"); }); const shareTeamDisabledReason = createMemo(() => { if (!shareCloudSignedIn()) return null; const settings = readDenSettings(); if (!settings.activeOrgId?.trim() && !settings.activeOrgSlug?.trim()) { - return translate("skills.share_team_choose_org"); + return t("skills.share_team_choose_org"); } return null; }); @@ -165,17 +164,17 @@ export default function SkillsView(props: SkillsViewProps) { const shareModalSubtitle = createMemo(() => { switch (shareSubView()) { case "public": - return translate("skills.share_subtitle_public"); + return t("skills.share_subtitle_public"); case "team": - return translate("skills.share_subtitle_team"); + return t("skills.share_subtitle_team"); default: - return translate("skills.share_chooser_subtitle"); + return t("skills.share_chooser_subtitle"); } }); const shareHubSelectOptions = createMemo( (): SelectMenuOption[] => [ - { value: "", label: translate("skills.share_team_hub_none") }, + { value: "", label: t("skills.share_team_hub_none") }, ...shareManageableHubs().map((h) => ({ value: h.id, label: h.name })), ], ); @@ -216,7 +215,7 @@ export default function SkillsView(props: SkillsViewProps) { orgId = res.orgs[0]?.id ?? ""; } if (!orgId) { - throw new Error(translate("skills.share_team_choose_org")); + throw new Error(t("skills.share_team_choose_org")); } const hubs = await client.listOrgSkillHubSummaries(orgId); @@ -237,7 +236,7 @@ export default function SkillsView(props: SkillsViewProps) { }); }); - const maskError = (value: unknown) => (value instanceof Error ? value.message : translate("common.something_went_wrong")); + const maskError = (value: unknown) => (value instanceof Error ? value.message : t("common.something_went_wrong")); const showToast = (title: string, tone: AppStatusToastTone = "info") => { statusToasts.showToast({ title, tone }); }; @@ -245,7 +244,7 @@ export default function SkillsView(props: SkillsViewProps) { const hubRepoKey = (repo: HubSkillRepo) => `${repo.owner}/${repo.repo}@${repo.ref}`; const defaultHubRepoKey = "different-ai/openwork-hub@main"; - const activeHubRepoLabel = createMemo(() => (extensions.hubRepo() ? hubRepoKey(extensions.hubRepo()!) : translate("skills.no_hub_repo_label"))); + const activeHubRepoLabel = createMemo(() => (extensions.hubRepo() ? hubRepoKey(extensions.hubRepo()!) : t("skills.no_hub_repo_label"))); const hasDefaultHubRepo = createMemo(() => extensions.hubRepos().some((repo) => hubRepoKey(repo) === defaultHubRepoKey)); @@ -273,7 +272,7 @@ export default function SkillsView(props: SkillsViewProps) { const repo = customRepoName().trim(); const ref = customRepoRef().trim() || "main"; if (!owner || !repo) { - setCustomRepoError(translate("skills.owner_repo_required")); + setCustomRepoError(t("skills.owner_repo_required")); return; } extensions.addHubRepo({ owner, repo, ref }); @@ -333,7 +332,7 @@ export default function SkillsView(props: SkillsViewProps) { denUiTick(); const name = readDenSettings().activeOrgName?.trim(); if (name) return name; - return translate("skills.cloud_org_fallback"); + return t("skills.cloud_org_fallback"); }); const cloudSessionReady = createMemo(() => { @@ -350,16 +349,16 @@ export default function SkillsView(props: SkillsViewProps) { const installSkillCreator = async () => { if (props.busy || installingSkillCreator()) return; if (!props.canInstallSkillCreator) { - showToast(props.accessHint ?? translate("skills.host_only_error"), "warning"); + showToast(props.accessHint ?? t("skills.host_only_error"), "warning"); return; } setInstallingSkillCreator(true); - showToast(translate("skills.installing_skill_creator")); + showToast(t("skills.installing_skill_creator")); try { const result = await extensions.installSkillCreator(); showToast(result.message, "success"); } catch (e) { - showToast(e instanceof Error ? e.message : translate("skills.install_failed"), "error"); + showToast(e instanceof Error ? e.message : t("skills.install_failed"), "error"); } finally { setInstallingSkillCreator(false); } @@ -368,12 +367,12 @@ export default function SkillsView(props: SkillsViewProps) { const installFromCloud = async (skill: DenOrgSkillCard) => { if (props.busy || installingCloudSkillId()) return; setInstallingCloudSkillId(skill.id); - showToast(t("skills.cloud_installing", currentLocale(), { title: skill.title })); + showToast(t("skills.cloud_installing", { title: skill.title })); try { const result = await extensions.installCloudOrgSkill(skill); showToast(result.message, result.ok ? "success" : "error"); } catch (e) { - showToast(e instanceof Error ? e.message : translate("skills.install_failed"), "error"); + showToast(e instanceof Error ? e.message : t("skills.install_failed"), "error"); } finally { setInstallingCloudSkillId(null); } @@ -387,12 +386,12 @@ export default function SkillsView(props: SkillsViewProps) { const installFromHub = async (skill: HubSkillCard) => { if (props.busy || installingHubSkill()) return; setInstallingHubSkill(skill.name); - showToast(`${translate("skills.installing_prefix")} ${skill.name}…`); + showToast(`${t("skills.installing_prefix")} ${skill.name}…`); try { const result = await extensions.installHubSkill(skill.name); showToast(result.message, "success"); } catch (e) { - showToast(e instanceof Error ? e.message : translate("skills.install_failed"), "error"); + showToast(e instanceof Error ? e.message : t("skills.install_failed"), "error"); } finally { setInstallingHubSkill(null); } @@ -466,7 +465,7 @@ export default function SkillsView(props: SkillsViewProps) { skillText: skill.content, skillHubId: hubId || null, }); - setShareTeamSuccess(t("skills.share_team_success", currentLocale(), { org: orgName })); + setShareTeamSuccess(t("skills.share_team_success", { org: orgName })); window.dispatchEvent( new CustomEvent<{ orgId: string }>("openwork-den-org-skills-changed", { detail: { orgId } }), ); @@ -488,7 +487,7 @@ export default function SkillsView(props: SkillsViewProps) { try { const skill = await extensions.readSkill(target.name); - if (!skill) throw new Error(translate("skills.skill_load_failed")); + if (!skill) throw new Error(t("skills.skill_load_failed")); const payload: SkillBundleV1 = { schemaVersion: 1, @@ -508,7 +507,7 @@ export default function SkillsView(props: SkillsViewProps) { setShareUrl(result.url); try { await navigator.clipboard.writeText(result.url); - showToast(translate("skills.link_copied"), "success"); + showToast(t("skills.link_copied"), "success"); } catch { // ignore } @@ -524,9 +523,9 @@ export default function SkillsView(props: SkillsViewProps) { if (!url) return; try { await navigator.clipboard.writeText(url); - showToast(translate("skills.link_copied"), "success"); + showToast(t("skills.link_copied"), "success"); } catch { - setShareError(translate("skills.copy_link_failed")); + setShareError(t("skills.copy_link_failed")); } }; @@ -540,12 +539,12 @@ export default function SkillsView(props: SkillsViewProps) { try { const result = await extensions.readSkill(skill.name); if (!result) { - setSelectedError(translate("skills.skill_load_failed")); + setSelectedError(t("skills.skill_load_failed")); return; } setSelectedContent(result.content); } catch (e) { - setSelectedError(e instanceof Error ? e.message : translate("skills.skill_load_failed")); + setSelectedError(e instanceof Error ? e.message : t("skills.skill_load_failed")); } finally { setSelectedLoading(false); } @@ -574,7 +573,7 @@ export default function SkillsView(props: SkillsViewProps) { ); setSelectedDirty(false); } catch (e) { - setSelectedError(e instanceof Error ? e.message : translate("skills.save_failed")); + setSelectedError(e instanceof Error ? e.message : t("skills.save_failed")); } }; @@ -597,7 +596,7 @@ export default function SkillsView(props: SkillsViewProps) { const runDesktopAction = (action: () => void | Promise) => { if (props.busy) return; if (!props.canUseDesktopTools) { - showToast(translate("skills.desktop_required"), "warning"); + showToast(t("skills.desktop_required"), "warning"); return; } void Promise.resolve(action()); @@ -616,10 +615,10 @@ export default function SkillsView(props: SkillsViewProps) {
-

{translate("skills.title")}

+

{t("skills.title")}

- {translate("skills.worker_profile_desc")} + {t("skills.worker_profile_desc")}

@@ -631,7 +630,7 @@ export default function SkillsView(props: SkillsViewProps) { class={pillSecondaryClass} > - {translate("skills.import_local_skill")} + {t("skills.import_local_skill")}
@@ -661,7 +660,7 @@ export default function SkillsView(props: SkillsViewProps) { type="text" value={searchQuery()} onInput={(event) => setSearchQuery(event.currentTarget.value)} - placeholder={translate("skills.catalog_search_placeholder")} + placeholder={t("skills.catalog_search_placeholder")} class="w-full rounded-xl border border-dls-border bg-dls-surface py-3 pl-11 pr-4 text-[14px] text-dls-text focus:outline-none focus:ring-2 focus:ring-[rgba(var(--dls-accent-rgb),0.12)]" />
@@ -675,12 +674,12 @@ export default function SkillsView(props: SkillsViewProps) { class={activeFilter() === filter ? pillPrimaryClass : pillGhostClass} > {filter === "all" - ? translate("skills.filter_all") + ? t("skills.filter_all") : filter === "installed" - ? translate("skills.filter_installed") + ? t("skills.filter_installed") : filter === "cloud" - ? translate("skills.filter_cloud") - : translate("skills.filter_hub")} + ? t("skills.filter_cloud") + : t("skills.filter_hub")} )} @@ -691,7 +690,7 @@ export default function SkillsView(props: SkillsViewProps) { class={pillSecondaryClass} > - {translate("common.refresh")} + {t("common.refresh")} @@ -706,7 +705,7 @@ export default function SkillsView(props: SkillsViewProps) { when={!props.accessHint && !props.canInstallSkillCreator && !props.canUseDesktopTools} >
- {translate("skills.host_mode_only")} + {t("skills.host_mode_only")}
@@ -720,19 +719,19 @@ export default function SkillsView(props: SkillsViewProps) {
-

{translate("skills.installed")}

+

{t("skills.installed")}

- {translate("skills.installed_desc")} + {t("skills.installed_desc")}

-
{t("skills.shown_count", currentLocale(), { count: filteredSkills().length })}
+
{t("skills.shown_count", { count: filteredSkills().length })}
- {translate("skills.no_skills")} + {t("skills.no_skills")}
} > @@ -764,7 +763,7 @@ export default function SkillsView(props: SkillsViewProps) { OpenWork
- {translate("skills.no_description")}

}> + {t("skills.no_description")}

}>

{skill.description}

@@ -773,7 +772,7 @@ export default function SkillsView(props: SkillsViewProps) {
- {translate("skills.installed_status")} + {t("skills.installed_status")}
@@ -837,9 +836,9 @@ export default function SkillsView(props: SkillsViewProps) {

{cloudOrgLabel()}

-

{translate("skills.cloud_section_title")}

+

{t("skills.cloud_section_title")}

- {translate("skills.cloud_section_subtitle")} + {t("skills.cloud_section_subtitle")}

@@ -850,7 +849,7 @@ export default function SkillsView(props: SkillsViewProps) { class={pillSecondaryClass} > - {translate("skills.cloud_refresh")} + {t("skills.cloud_refresh")}
@@ -861,15 +860,15 @@ export default function SkillsView(props: SkillsViewProps) { when={cloudNeedsSignIn()} fallback={
-

{translate("skills.cloud_choose_org_hint")}

-

{translate("skills.cloud_choose_org_detail")}

+

{t("skills.cloud_choose_org_hint")}

+

{t("skills.cloud_choose_org_detail")}

} >
-

{translate("skills.cloud_sign_in_hint")}

+

{t("skills.cloud_sign_in_hint")}

@@ -888,8 +887,8 @@ export default function SkillsView(props: SkillsViewProps) { fallback={
{extensions.cloudOrgSkills().length === 0 - ? translate("skills.cloud_org_empty") - : translate("skills.cloud_no_search_matches")} + ? t("skills.cloud_org_empty") + : t("skills.cloud_no_search_matches")}
} > @@ -912,21 +911,21 @@ export default function SkillsView(props: SkillsViewProps) {
- {t("skills.cloud_hub_label", currentLocale(), { name: skill.hubName ?? "" })} + {t("skills.cloud_hub_label", { name: skill.hubName ?? "" })} - {translate("skills.cloud_shared_org")} + {t("skills.cloud_shared_org")} - {translate("skills.cloud_shared_public")} + {t("skills.cloud_shared_public")}
- {translate("skills.cloud_footer_label")} + {t("skills.cloud_footer_label")}
@@ -961,9 +960,9 @@ export default function SkillsView(props: SkillsViewProps) {
-

{translate("skills.available_from_hub")}

+

{t("skills.available_from_hub")}

- {translate("skills.hub_desc")} + {t("skills.hub_desc")}

@@ -977,34 +976,34 @@ export default function SkillsView(props: SkillsViewProps) { disabled={props.busy || hasDefaultHubRepo()} > - {translate("skills.add_openwork_hub")} + {t("skills.add_openwork_hub")}
- {translate("skills.source_label")}: {activeHubRepoLabel()} + {t("skills.source_label")}: {activeHubRepoLabel()}
@@ -1031,7 +1030,7 @@ export default function SkillsView(props: SkillsViewProps) { void extensions.refreshHubSkills({ force: true }); }} disabled={props.busy} - title={translate("skills.remove_saved_repo")} + title={t("skills.remove_saved_repo")} > × @@ -1052,7 +1051,7 @@ export default function SkillsView(props: SkillsViewProps) { when={filteredHubSkills().length} fallback={
- {extensions.hubRepo() ? translate("skills.no_hub_skills") : translate("skills.no_hub_repo_selected")} + {extensions.hubRepo() ? t("skills.no_hub_skills") : t("skills.no_hub_repo_selected")}
} > @@ -1069,7 +1068,7 @@ export default function SkillsView(props: SkillsViewProps) {

{skill.name}

{t("skills.from_repo", currentLocale(), { owner: skill.source.owner, repo: skill.source.repo })}

} + fallback={

{t("skills.from_repo", { owner: skill.source.owner, repo: skill.source.repo })}

} >

{skill.description}

@@ -1078,8 +1077,8 @@ export default function SkillsView(props: SkillsViewProps) { {skill.source.owner}/{skill.source.repo} - - {t("skills.trigger_label", currentLocale(), { trigger: skill.trigger ?? "" })} + + {t("skills.trigger_label", { trigger: skill.trigger ?? "" })}
@@ -1087,7 +1086,7 @@ export default function SkillsView(props: SkillsViewProps) {
- {translate("skills.hub_label")} + {t("skills.hub_label")}
@@ -1135,14 +1134,14 @@ export default function SkillsView(props: SkillsViewProps) { disabled={!selectedDirty() || props.busy} onClick={() => void saveSelectedSkill()} > - {translate("common.save")} + {t("common.save")} @@ -1155,7 +1154,7 @@ export default function SkillsView(props: SkillsViewProps) {
{translate("skills.loading")}} + fallback={
{t("skills.loading")}
} >