Skip to content

Commit 167c33e

Browse files
johnnyshieldsclaude
andcommitted
feat(i18n): second pass — extract remaining hardcoded strings
Fix missed strings not covered by reference diff: - automations: schedule_required, prompt_required, prompt_empty, server_unavailable in deleteScheduledJob, failed_to_load in local block, provider_id_required (2 missed instances in store.ts) - mcp-auth-modal: request_timed_out - question-modal: Submit/Next button labels (common.submit, common.next) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 7d1f056 commit 167c33e

File tree

5 files changed

+14
-10
lines changed

5 files changed

+14
-10
lines changed

apps/app/src/app/components/mcp-auth-modal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ export default function McpAuthModal(props: McpAuthModalProps) {
168168
statusPoll = window.setInterval(async () => {
169169
if (Date.now() - startedAt >= MCP_AUTH_TIMEOUT_MS) {
170170
stopStatusPolling();
171-
setError("Request timed out.");
171+
setError(translate("mcp.auth.request_timed_out"));
172172
return;
173173
}
174174

apps/app/src/app/components/question-modal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ export default function QuestionModal(props: QuestionModalProps) {
218218
<div class="flex gap-2">
219219
<Show when={currentQuestion()?.multiple || currentQuestion()?.custom}>
220220
<Button onClick={handleNext} disabled={!canProceed() || props.busy} class="!px-6">
221-
{isLastQuestion() ? "Submit" : "Next"}
221+
{isLastQuestion() ? t("common.submit") : t("common.next")}
222222
<Show when={!isLastQuestion()}>
223223
<ChevronRight size={16} class="ml-1 -mr-1 opacity-60" />
224224
</Show>

apps/app/src/app/context/automations.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ const buildCreateAutomationPrompt = (
3434
const schedule = input.schedule.trim();
3535
const prompt = normalizeSentence(input.prompt);
3636
if (!schedule) {
37-
return { ok: false, error: "Schedule is required." };
37+
return { ok: false, error: t("automations.schedule_required") };
3838
}
3939
if (!prompt) {
40-
return { ok: false, error: "Prompt is required." };
40+
return { ok: false, error: t("automations.prompt_required") };
4141
}
4242
const workdir = (input.workdir ?? "").trim();
4343
const nameSegment = name ? ` named \"${name}\"` : "";
@@ -59,7 +59,7 @@ const buildRunAutomationPrompt = (
5959
if (job.run?.prompt || job.prompt) {
6060
const promptBody = (job.run?.prompt ?? job.prompt ?? "").trim();
6161
if (!promptBody) {
62-
return { ok: false, error: "Automation prompt is empty." };
62+
return { ok: false, error: t("automations.prompt_empty") };
6363
}
6464
return {
6565
ok: true,
@@ -182,7 +182,7 @@ export function createAutomationsStore(options: {
182182
} catch (error) {
183183
if (scheduledJobsContextKey() !== requestContextKey) return "skipped";
184184
const message = error instanceof Error ? error.message : String(error);
185-
setScheduledJobsStatus(message || "Failed to load scheduled tasks.");
185+
setScheduledJobsStatus(message || t("automations.failed_to_load"));
186186
return "error";
187187
} finally {
188188
setScheduledJobsBusy(false);
@@ -194,15 +194,15 @@ export function createAutomationsStore(options: {
194194
const client = options.openworkServerClient();
195195
const workspaceId = (options.runtimeWorkspaceId() ?? "").trim();
196196
if (!client || !workspaceId) {
197-
throw new Error("OpenWork server unavailable. Connect to sync scheduled tasks.");
197+
throw new Error(t("automations.server_unavailable"));
198198
}
199199
const response = await client.deleteScheduledJob(workspaceId, name);
200200
setScheduledJobs((current) => current.filter((entry) => entry.slug !== response.job.slug));
201201
return;
202202
}
203203

204204
if (!isTauriRuntime()) {
205-
throw new Error("Scheduled tasks require the desktop app.");
205+
throw new Error(t("automations.desktop_required"));
206206
}
207207
const root = options.selectedWorkspaceRoot().trim();
208208
const job = await schedulerDeleteJob(name, root || undefined);

apps/app/src/app/context/providers/store.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ export function createProvidersStore(options: CreateProvidersStoreOptions) {
315315

316316
const resolved = providerId?.trim();
317317
if (!resolved) {
318-
throw new Error("Provider ID is required");
318+
throw new Error(t("providers.provider_id_required"));
319319
}
320320

321321
if (!Number.isInteger(methodIndex) || methodIndex < 0) {
@@ -414,7 +414,7 @@ export function createProvidersStore(options: CreateProvidersStoreOptions) {
414414

415415
const resolved = providerId.trim();
416416
if (!resolved) {
417-
throw new Error("Provider ID is required");
417+
throw new Error(t("providers.provider_id_required"));
418418
}
419419

420420
const provider = options.providers().find((entry) => entry.id === resolved) as

apps/app/src/i18n/locales/en.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,9 @@ export default {
869869
"automations.server_not_ready": "OpenWork server not ready.",
870870
"automations.failed_to_load": "Failed to load scheduled tasks.",
871871
"automations.desktop_required": "Scheduled tasks require the desktop app.",
872+
"automations.schedule_required": "Schedule is required.",
873+
"automations.prompt_required": "Prompt is required.",
874+
"automations.prompt_empty": "Automation prompt is empty.",
872875

873876
// ==================== Question Modal ====================
874877
"question_modal.question_counter": "Question {current} of {total}",
@@ -934,4 +937,5 @@ export default {
934937
"mcp.auth.authorization_link": "Authorization link",
935938
"mcp.auth.copied": "Copied",
936939
"mcp.auth.copy_link": "Copy link",
940+
"mcp.auth.request_timed_out": "Request timed out.",
937941
} as const;

0 commit comments

Comments
 (0)