Skip to content

Commit 30d2e13

Browse files
committed
More translations, improve audit script
1 parent bf7d0b2 commit 30d2e13

File tree

12 files changed

+576
-212
lines changed

12 files changed

+576
-212
lines changed

apps/app/src/app/components/den-settings-panel.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -799,7 +799,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
799799
if (!result.ok) {
800800
throw new Error(result.message);
801801
}
802-
setStatusMessage(`${result.message} ${t("reload.toast_description", currentLocale())}`);
802+
setStatusMessage(`${result.message} ${t("den.reload_workspace")}`);
803803
} catch (error) {
804804
setSkillHubActionError(error instanceof Error ? error.message : `Failed to import ${hub.name}.`);
805805
} finally {
@@ -821,7 +821,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
821821
if (!result.ok) {
822822
throw new Error(result.message);
823823
}
824-
setStatusMessage(`${result.message} ${t("reload.toast_description", currentLocale())}`);
824+
setStatusMessage(`${result.message} ${t("den.reload_workspace")}`);
825825
} catch (error) {
826826
setSkillHubActionError(error instanceof Error ? error.message : `Failed to remove ${imported.name}.`);
827827
} finally {
@@ -843,7 +843,7 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
843843
if (!result.ok) {
844844
throw new Error(result.message);
845845
}
846-
setStatusMessage(`${result.message} ${t("reload.toast_description", currentLocale())}`);
846+
setStatusMessage(`${result.message} ${t("den.reload_workspace")}`);
847847
} catch (error) {
848848
setSkillHubActionError(error instanceof Error ? error.message : `Failed to sync ${hub.name}.`);
849849
} finally {
@@ -861,9 +861,9 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
861861

862862
try {
863863
const message = await props.connectCloudProvider(cloudProviderId);
864-
setStatusMessage(`${message || `Imported ${providerName}.`} ${t("reload.toast_description", currentLocale())}`);
864+
setStatusMessage(`${message || t("den.imported_provider", undefined, { name: providerName })} ${t("den.reload_workspace")}`);
865865
} catch (error) {
866-
setProviderActionError(error instanceof Error ? error.message : `Failed to import ${providerName}.`);
866+
setProviderActionError(error instanceof Error ? error.message : t("den.import_provider_failed", undefined, { name: providerName }));
867867
} finally {
868868
setProviderActionId(null);
869869
setProviderActionKind(null);
@@ -879,9 +879,9 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
879879

880880
try {
881881
const message = await props.removeCloudProvider(cloudProviderId);
882-
setStatusMessage(`${message || `Removed ${providerName}.`} ${t("reload.toast_description", currentLocale())}`);
882+
setStatusMessage(`${message || t("den.removed_provider", undefined, { name: providerName })} ${t("den.reload_workspace")}`);
883883
} catch (error) {
884-
setProviderActionError(error instanceof Error ? error.message : `Failed to remove ${providerName}.`);
884+
setProviderActionError(error instanceof Error ? error.message : t("den.remove_provider_failed", undefined, { name: providerName }));
885885
} finally {
886886
setProviderActionId(null);
887887
setProviderActionKind(null);
@@ -897,9 +897,9 @@ export default function DenSettingsPanel(props: DenSettingsPanelProps) {
897897

898898
try {
899899
await props.connectCloudProvider(cloudProviderId);
900-
setStatusMessage(`Synced ${providerName}. ${t("reload.toast_description", currentLocale())}`);
900+
setStatusMessage(`${t("den.synced_provider", undefined, { name: providerName })} ${t("den.reload_workspace")}`);
901901
} catch (error) {
902-
setProviderActionError(error instanceof Error ? error.message : `Failed to sync ${providerName}.`);
902+
setProviderActionError(error instanceof Error ? error.message : t("den.sync_provider_failed", undefined, { name: providerName }));
903903
} finally {
904904
setProviderActionId(null);
905905
setProviderActionKind(null);

apps/app/src/app/constants.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,44 +38,44 @@ export const CHROME_DEVTOOLS_MCP_COMMAND = ["npx", "-y", "chrome-devtools-mcp@la
3838

3939
export const MCP_QUICK_CONNECT: McpDirectoryInfo[] = [
4040
{
41-
name: "Notion",
42-
description: "Pages, databases, and project docs in sync.",
41+
get name() { return t("mcp.quick_connect_notion_title"); },
42+
get description() { return t("mcp.quick_connect_notion_desc"); },
4343
url: "https://mcp.notion.com/mcp",
4444
type: "remote",
4545
oauth: true,
4646
},
4747
{
48-
name: "Linear",
49-
description: "Plan sprints and ship tickets faster.",
48+
get name() { return t("mcp.quick_connect_linear_title"); },
49+
get description() { return t("mcp.quick_connect_linear_desc"); },
5050
url: "https://mcp.linear.app/mcp",
5151
type: "remote",
5252
oauth: true,
5353
},
5454
{
55-
name: "Sentry",
56-
description: "Track releases and resolve production errors.",
55+
get name() { return t("mcp.quick_connect_sentry_title"); },
56+
get description() { return t("mcp.quick_connect_sentry_desc"); },
5757
url: "https://mcp.sentry.dev/mcp",
5858
type: "remote",
5959
oauth: true,
6060
},
6161
{
62-
name: "Stripe",
63-
description: "Inspect payments, invoices, and subscriptions.",
62+
get name() { return t("mcp.quick_connect_stripe_title"); },
63+
get description() { return t("mcp.quick_connect_stripe_desc"); },
6464
url: "https://mcp.stripe.com",
6565
type: "remote",
6666
oauth: true,
6767
},
6868
{
69-
name: "Context7",
70-
description: "Search product docs with richer context.",
69+
get name() { return t("mcp.quick_connect_context7_title"); },
70+
get description() { return t("mcp.quick_connect_context7_desc"); },
7171
url: "https://mcp.context7.com/mcp",
7272
type: "remote",
7373
oauth: false,
7474
},
7575
{
7676
id: CHROME_DEVTOOLS_MCP_ID,
77-
name: "Control Chrome",
78-
description: "Drive Chrome tabs with browser automation.",
77+
get name() { return t("mcp.quick_connect_chrome_title"); },
78+
get description() { return t("mcp.quick_connect_chrome_desc"); },
7979
type: "local",
8080
command: [...CHROME_DEVTOOLS_MCP_COMMAND],
8181
oauth: false,

apps/app/src/app/lib/model-behavior.ts

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -72,28 +72,28 @@ const sortVariantKeys = (keys: string[]) =>
7272

7373
const getBehaviorTitle = (providerID: string, model: ProviderModel, variantKeys: string[]) => {
7474
if (variantKeys.length > 0) {
75-
if (providerID === "anthropic") return "Extended thinking";
76-
if (providerID === "google") return "Reasoning budget";
75+
if (providerID === "anthropic") return t("model_behavior.title_extended_thinking");
76+
if (providerID === "google") return t("model_behavior.title_reasoning_budget");
7777
if (
7878
providerID === "openai" ||
7979
providerID === "opencode" ||
8080
variantKeys.some((key) => ["none", "minimal", "low", "medium", "high", "xhigh"].includes(key))
8181
) {
82-
return "Reasoning effort";
82+
return t("model_behavior.title_reasoning_effort");
8383
}
84-
return t("app.model_behavior_title", currentLocale());
84+
return t("app.model_behavior_title");
8585
}
86-
if (model.reasoning) return "Built-in reasoning";
87-
return "Standard generation";
86+
if (model.reasoning) return t("model_behavior.title_builtin_reasoning");
87+
return t("model_behavior.title_standard_generation");
8888
};
8989

9090
const getVariantLabel = (providerID: string, key: string) => {
91-
if (key === "none") return "Fast";
92-
if (key === "minimal") return "Quick";
93-
if (key === "low") return "Light";
94-
if (key === "medium") return "Balanced";
95-
if (key === "high") return providerID === "anthropic" ? "Extended" : "Deep";
96-
if (key === "xhigh" || key === "max") return "Maximum";
91+
if (key === "none") return t("model_behavior.label_fast");
92+
if (key === "minimal") return t("model_behavior.label_quick");
93+
if (key === "low") return t("model_behavior.label_light");
94+
if (key === "medium") return t("model_behavior.label_balanced");
95+
if (key === "high") return providerID === "anthropic" ? t("model_behavior.label_extended") : t("model_behavior.label_deep");
96+
if (key === "xhigh" || key === "max") return t("model_behavior.label_maximum");
9797
return humanize(key);
9898
};
9999

@@ -104,19 +104,19 @@ export const formatGenericBehaviorLabel = (value: string | null) => {
104104
};
105105

106106
const getVariantDescription = (providerID: string, key: string, label: string) => {
107-
if (key === "none") return "Favor speed with the lightest reasoning path.";
108-
if (key === "minimal") return "Use a very small amount of reasoning.";
107+
if (key === "none") return t("model_behavior.desc_none");
108+
if (key === "minimal") return t("model_behavior.desc_minimal");
109109
if (key === "low") return providerID === "google"
110-
? "Use a lighter reasoning budget for quicker responses."
111-
: "Use a lighter reasoning pass before answering.";
112-
if (key === "medium") return "Balance speed and reasoning depth.";
110+
? t("model_behavior.desc_low_google")
111+
: t("model_behavior.desc_low");
112+
if (key === "medium") return t("model_behavior.desc_medium");
113113
if (key === "high") return providerID === "anthropic"
114-
? "Use the standard extended-thinking budget."
115-
: "Spend more time reasoning before answering.";
114+
? t("model_behavior.desc_high_anthropic")
115+
: t("model_behavior.desc_high");
116116
if (key === "xhigh" || key === "max") return providerID === "anthropic"
117-
? "Use the largest extended-thinking budget available."
118-
: "Use the provider's deepest reasoning profile.";
119-
return `Use the ${label.toLowerCase()} profile.`;
117+
? t("model_behavior.desc_max_anthropic")
118+
: t("model_behavior.desc_max");
119+
return t("model_behavior.desc_generic", undefined, { label: label.toLowerCase() });
120120
};
121121

122122
export const getModelBehaviorOptions = (
@@ -172,16 +172,16 @@ export const getModelBehaviorSummary = (
172172
if (model.reasoning) {
173173
return {
174174
title,
175-
label: "Built in",
176-
description: "This model decides its own reasoning path and does not expose profiles here.",
175+
label: t("model_behavior.label_builtin"),
176+
description: t("model_behavior.desc_builtin"),
177177
options,
178178
};
179179
}
180180

181181
return {
182182
title,
183-
label: "Standard",
184-
description: "This model does not expose extra reasoning controls.",
183+
label: t("model_behavior.label_standard"),
184+
description: t("model_behavior.desc_standard"),
185185
options,
186186
};
187187
};

apps/app/src/app/pages/settings.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,24 +1160,24 @@ export default function SettingsView(props: SettingsViewProps) {
11601160

11611161
const copyDeveloperLog = async () => {
11621162
if (typeof navigator === "undefined" || !navigator.clipboard?.writeText) {
1163-
setDevLogStatus("Clipboard is unavailable in this environment.");
1163+
setDevLogStatus(t("settings.devlog_clipboard_unavailable"));
11641164
return;
11651165
}
11661166
try {
11671167
await navigator.clipboard.writeText(developerLogText());
1168-
setDevLogStatus("Copied developer log output.");
1168+
setDevLogStatus(t("settings.devlog_copied"));
11691169
} catch (error) {
11701170
setDevLogStatus(
11711171
error instanceof Error
11721172
? error.message
1173-
: "Failed to copy developer log output.",
1173+
: t("settings.devlog_copy_failed"),
11741174
);
11751175
}
11761176
};
11771177

11781178
const exportDeveloperLog = () => {
11791179
if (typeof window === "undefined" || typeof document === "undefined") {
1180-
setDevLogStatus("Export is unavailable in this environment.");
1180+
setDevLogStatus(t("settings.devlog_export_unavailable"));
11811181
return;
11821182
}
11831183
try {
@@ -1194,19 +1194,19 @@ export default function SettingsView(props: SettingsViewProps) {
11941194
anchor.download = `openwork-dev-log-${stamp}.log`;
11951195
anchor.click();
11961196
window.URL.revokeObjectURL(url);
1197-
setDevLogStatus("Exported developer log output.");
1197+
setDevLogStatus(t("settings.devlog_exported"));
11981198
} catch (error) {
11991199
setDevLogStatus(
12001200
error instanceof Error
12011201
? error.message
1202-
: "Failed to export developer log output.",
1202+
: t("settings.devlog_export_failed"),
12031203
);
12041204
}
12051205
};
12061206

12071207
const clearDeveloperLog = () => {
12081208
clearDevLogs();
1209-
setDevLogStatus("Cleared developer log output.");
1209+
setDevLogStatus(t("settings.devlog_cleared"));
12101210
};
12111211

12121212
const revealWorkspaceConfig = async () => {

0 commit comments

Comments
 (0)