From 348aadef5195263148942b174374a4750ca28987 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Thu, 7 May 2026 14:51:17 +0100 Subject: [PATCH 1/2] fix(admin): translate long-tail i18n leaks in admin UI Wrap remaining user-facing English strings across settings panels, marketplace, sandboxed-plugin host, auth flows (Signup, Login, Passkey, DeviceAuthorize, SetupWizard), taxonomy/menu management, content editor remnants, and lib/api module-level functions. For lib/api fallback messages, uses the i18n._(msg``) pattern since module-level code can't call useLingui(). MenuList item count uses plural() which fixed an existing grammar bug (1 items -> 1 item; test regex updated). --- .changeset/public-women-behave.md | 5 ++ .../src/components/BlockKitFieldWidget.tsx | 6 +- .../admin/src/components/ContentEditor.tsx | 2 +- .../src/components/DeviceAuthorizePage.tsx | 2 +- packages/admin/src/components/FieldEditor.tsx | 2 +- .../src/components/MarketplaceBrowse.tsx | 15 ++--- .../admin/src/components/MediaLibrary.tsx | 8 +-- .../admin/src/components/MediaPickerModal.tsx | 13 +++-- packages/admin/src/components/MenuList.tsx | 7 ++- packages/admin/src/components/Redirects.tsx | 6 +- .../src/components/SandboxedPluginPage.tsx | 8 ++- .../src/components/SandboxedPluginWidget.tsx | 8 ++- .../admin/src/components/SectionEditor.tsx | 2 +- packages/admin/src/components/Sections.tsx | 18 +++--- packages/admin/src/components/SetupWizard.tsx | 57 +++++++------------ packages/admin/src/components/SignupPage.tsx | 2 +- .../admin/src/components/TaxonomyManager.tsx | 4 +- .../admin/src/components/TaxonomySidebar.tsx | 13 +++-- .../admin/src/components/WelcomeModal.tsx | 6 +- .../admin/src/components/WordPressImport.tsx | 24 ++++---- .../src/components/auth/PasskeyLogin.tsx | 6 +- .../components/auth/PasskeyRegistration.tsx | 6 +- .../admin/src/components/editor/BlockMenu.tsx | 11 ++-- .../components/editor/DragHandleWrapper.tsx | 4 +- packages/admin/src/lib/api/api-tokens.ts | 5 +- packages/admin/src/lib/api/bylines.ts | 5 +- packages/admin/src/lib/api/client.ts | 4 +- packages/admin/src/lib/api/comments.ts | 5 +- packages/admin/src/lib/api/content.ts | 21 ++++--- packages/admin/src/lib/api/import.ts | 5 +- packages/admin/src/lib/api/marketplace.ts | 9 ++- packages/admin/src/lib/api/media.ts | 9 ++- packages/admin/src/lib/api/menus.ts | 7 ++- packages/admin/src/lib/api/plugins.ts | 10 +++- packages/admin/src/lib/api/redirects.ts | 5 +- packages/admin/src/lib/api/schema.ts | 13 +++-- packages/admin/src/lib/api/sections.ts | 5 +- packages/admin/src/lib/api/taxonomies.ts | 5 +- packages/admin/src/lib/api/users.ts | 21 ++++--- packages/admin/src/lib/api/widgets.ts | 9 ++- .../admin/tests/components/MenuList.test.tsx | 2 +- 41 files changed, 225 insertions(+), 150 deletions(-) create mode 100644 .changeset/public-women-behave.md diff --git a/.changeset/public-women-behave.md b/.changeset/public-women-behave.md new file mode 100644 index 000000000..d8888928b --- /dev/null +++ b/.changeset/public-women-behave.md @@ -0,0 +1,5 @@ +--- +"@emdash-cms/admin": patch +--- + +Fixes the long tail of untranslated English strings in the admin UI: settings panels, marketplace, sandboxed-plugin host, auth flows, taxonomy/menu management, and lib/api fallback messages. After this PR, EmDash admin UI is fully localizable across all known surfaces. diff --git a/packages/admin/src/components/BlockKitFieldWidget.tsx b/packages/admin/src/components/BlockKitFieldWidget.tsx index b869eafde..519312652 100644 --- a/packages/admin/src/components/BlockKitFieldWidget.tsx +++ b/packages/admin/src/components/BlockKitFieldWidget.tsx @@ -1,5 +1,6 @@ import { Input, Switch } from "@cloudflare/kumo"; import type { Element } from "@emdash-cms/blocks"; +import { useLingui } from "@lingui/react/macro"; import * as React from "react"; import { BlockKitMediaPickerField } from "./BlockKitMediaPickerField"; @@ -65,6 +66,7 @@ function BlockKitFieldElement({ value: unknown; onChange: (actionId: string, value: unknown) => void; }) { + const { t } = useLingui(); switch (element.type) { case "text_input": return ( @@ -105,7 +107,7 @@ function BlockKitFieldElement({ value={typeof value === "string" ? value : ""} onChange={(e) => onChange(element.action_id, e.target.value)} > - + {options.map((opt) => (