From ae1798f6f4eda54cb50ab5ca5ead892be0789683 Mon Sep 17 00:00:00 2001 From: Maofeng Date: Thu, 30 Jul 2026 14:47:51 +0800 Subject: [PATCH] feat(ui): add framework-neutral localization support - add a lightweight UI i18n provider with translation and locale contexts\n- localize accessibility labels across breadcrumb, carousel, dialog, pagination, sheet, sidebar, spinner, and toast components\n- integrate calendar locale data without coupling UI components to Lingui\n- publish tree-shakeable catalogs for eight common locales --- packages/ui/package.json | 2 + packages/ui/src/components/breadcrumb.tsx | 22 +-- packages/ui/src/components/calendar.tsx | 34 +++-- packages/ui/src/components/carousel.tsx | 13 +- packages/ui/src/components/dialog.tsx | 14 +- packages/ui/src/components/i18n.tsx | 156 ++++++++++++++++++++++ packages/ui/src/components/pagination.tsx | 44 ++++-- packages/ui/src/components/sheet.tsx | 5 +- packages/ui/src/components/sidebar.tsx | 37 +++-- packages/ui/src/components/spinner.tsx | 11 +- packages/ui/src/components/toast.tsx | 67 +++++----- packages/ui/src/i18n/catalogs.ts | 33 +++++ packages/ui/src/i18n/locales/de.ts | 25 ++++ packages/ui/src/i18n/locales/en.ts | 25 ++++ packages/ui/src/i18n/locales/es.ts | 25 ++++ packages/ui/src/i18n/locales/fr.ts | 25 ++++ packages/ui/src/i18n/locales/ja.ts | 25 ++++ packages/ui/src/i18n/locales/ko.ts | 25 ++++ packages/ui/src/i18n/locales/zh-Hans.ts | 25 ++++ packages/ui/src/i18n/locales/zh-Hant.ts | 25 ++++ 20 files changed, 551 insertions(+), 87 deletions(-) create mode 100644 packages/ui/src/components/i18n.tsx create mode 100644 packages/ui/src/i18n/catalogs.ts create mode 100644 packages/ui/src/i18n/locales/de.ts create mode 100644 packages/ui/src/i18n/locales/en.ts create mode 100644 packages/ui/src/i18n/locales/es.ts create mode 100644 packages/ui/src/i18n/locales/fr.ts create mode 100644 packages/ui/src/i18n/locales/ja.ts create mode 100644 packages/ui/src/i18n/locales/ko.ts create mode 100644 packages/ui/src/i18n/locales/zh-Hans.ts create mode 100644 packages/ui/src/i18n/locales/zh-Hant.ts diff --git a/packages/ui/package.json b/packages/ui/package.json index 6ed1418..96f7c41 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -40,6 +40,8 @@ }, "exports": { "./globals.css": "./src/styles/globals.css", + "./locales": "./src/i18n/catalogs.ts", + "./locales/*": "./src/i18n/locales/*.ts", "./lib/*": "./src/lib/*.ts", "./components/*": "./src/components/*.tsx", "./hooks/*": "./src/hooks/*.ts" diff --git a/packages/ui/src/components/breadcrumb.tsx b/packages/ui/src/components/breadcrumb.tsx index 8925952..2ad885f 100644 --- a/packages/ui/src/components/breadcrumb.tsx +++ b/packages/ui/src/components/breadcrumb.tsx @@ -4,11 +4,18 @@ import { useRender } from "@base-ui/react/use-render" import { cn } from "@workspace/ui/lib/utils" import { ChevronRightIcon, MoreHorizontalIcon } from "lucide-react" +import { LocalizedText, uiMessages, useMessage } from "./i18n" + +function Breadcrumb({ + "aria-label": ariaLabel, + className, + ...props +}: React.ComponentProps<"nav">) { + const defaultLabel = useMessage(uiMessages.breadcrumb) -function Breadcrumb({ className, ...props }: React.ComponentProps<"nav">) { return (