From 6dc61bb7654651ef083cad70b37e25da782c4452 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 11 Oct 2026 15:08:23 +0000 Subject: [PATCH 1/3] fix(i18n,a11y): read 26 accessible names through each package's translation hook (objectui#12145) The card's enumerated aria-label sites read their names from the locale packs instead of English literals. Eight keys are added to all ten packs; every other name reuses an existing key (one key per name). Claude-Session: https://claude.ai/code/session_016djJF12Qt14ejKR5Vjt4sK Co-authored-by: Claude --- apps/console/src/pages/AppDocsIndex.tsx | 4 +++- apps/console/src/pages/BookPage.tsx | 4 +++- apps/console/src/pages/DocPage.tsx | 2 +- apps/console/src/pages/DocsIndex.tsx | 4 +++- apps/console/src/pages/DocsSlug.tsx | 4 +++- .../app-shell/src/views/RecordFormPage.tsx | 2 +- packages/components/src/custom/spinner.tsx | 16 ++++++++++++++- .../src/renderers/basic/pagination.tsx | 20 +++++++++++++++++++ .../src/renderers/complex/data-table.tsx | 4 +++- .../fields/src/widgets/ImageCropperDialog.tsx | 4 +++- packages/fields/src/widgets/PercentField.tsx | 4 +++- .../fields/src/widgets/RecordPickerDialog.tsx | 2 +- .../fields/src/widgets/useFieldTranslation.ts | 7 +++++++ packages/i18n/src/locales/ar.ts | 10 ++++++++++ packages/i18n/src/locales/de.ts | 10 ++++++++++ packages/i18n/src/locales/en.ts | 10 ++++++++++ packages/i18n/src/locales/es.ts | 10 ++++++++++ packages/i18n/src/locales/fr.ts | 10 ++++++++++ packages/i18n/src/locales/ja.ts | 10 ++++++++++ packages/i18n/src/locales/ko.ts | 10 ++++++++++ packages/i18n/src/locales/pt.ts | 10 ++++++++++ packages/i18n/src/locales/ru.ts | 10 ++++++++++ packages/i18n/src/locales/zh.ts | 10 ++++++++++ .../plugin-chatbot/src/ChatbotEnhanced.tsx | 12 ++++++++--- .../src/elements/prompt-input.tsx | 11 +++++++++- .../src/components/HistoryPanel.tsx | 6 ++++-- .../src/components/Minimap.tsx | 4 +++- .../src/components/VersionHistory.tsx | 4 +++- .../src/hooks/useDesignerTranslation.ts | 9 +++++++++ .../src/pages/DashboardDesignPage.tsx | 4 +++- .../src/renderers/record-alert.tsx | 7 +++++-- .../src/renderers/record-path.tsx | 4 ++-- .../src/components/BulkActionBar.tsx | 2 +- .../plugin-list/src/components/TabBar.tsx | 9 ++++++--- 34 files changed, 221 insertions(+), 28 deletions(-) diff --git a/apps/console/src/pages/AppDocsIndex.tsx b/apps/console/src/pages/AppDocsIndex.tsx index 7ad73c045c..8f1164d795 100644 --- a/apps/console/src/pages/AppDocsIndex.tsx +++ b/apps/console/src/pages/AppDocsIndex.tsx @@ -9,6 +9,7 @@ import { useMemo } from 'react'; import { Link, Navigate, useParams } from 'react-router-dom'; import { BookOpen, Loader2 } from 'lucide-react'; +import { useObjectTranslation } from '@object-ui/i18n'; import { DocShell } from './DocShell'; import { useBookData } from './use-book-data'; import { buildBookCards, pkgOfBook, type Book } from './book-nav'; @@ -26,6 +27,7 @@ import { buildBookCards, pkgOfBook, type Book } from './book-nav'; */ export default function AppDocsIndex() { const { appName } = useParams<{ appName?: string }>(); + const { t } = useObjectTranslation(); const { books, docs, state } = useBookData(); const myBooks = useMemo( @@ -37,7 +39,7 @@ export default function AppDocsIndex() { if (state === 'loading') { return (
- +
); } diff --git a/apps/console/src/pages/BookPage.tsx b/apps/console/src/pages/BookPage.tsx index 3941899b31..8a864653d5 100644 --- a/apps/console/src/pages/BookPage.tsx +++ b/apps/console/src/pages/BookPage.tsx @@ -9,6 +9,7 @@ import { useMemo } from 'react'; import { Navigate, useParams } from 'react-router-dom'; import { BookOpen, FileQuestion, Loader2, Lock } from 'lucide-react'; +import { useObjectTranslation } from '@object-ui/i18n'; import { DocShell } from './DocShell'; import { useBookData } from './use-book-data'; import { resolveBookTree, bookSlug, firstDoc } from './book-nav'; @@ -43,6 +44,7 @@ export function DocRefusal({ name, message }: { name?: string; message?: string */ export default function BookPage() { const { slug, appName } = useParams<{ slug: string; appName?: string }>(); + const { t } = useObjectTranslation(); const { books, docs, state } = useBookData(); const found = useMemo(() => books.find((b) => bookSlug(b) === slug), [books, slug]); @@ -54,7 +56,7 @@ export default function BookPage() { if (state === 'loading') { return (
- +
); } diff --git a/apps/console/src/pages/DocPage.tsx b/apps/console/src/pages/DocPage.tsx index 27ac4e46f5..49dd12df2a 100644 --- a/apps/console/src/pages/DocPage.tsx +++ b/apps/console/src/pages/DocPage.tsx @@ -174,7 +174,7 @@ export default function DocPage() { if (state === 'loading') { return (
- +
); } diff --git a/apps/console/src/pages/DocsIndex.tsx b/apps/console/src/pages/DocsIndex.tsx index 40900c7b35..aec89be5c2 100644 --- a/apps/console/src/pages/DocsIndex.tsx +++ b/apps/console/src/pages/DocsIndex.tsx @@ -9,6 +9,7 @@ import { useMemo } from 'react'; import { Link } from 'react-router-dom'; import { AlertCircle, BookOpen, Loader2 } from 'lucide-react'; +import { useObjectTranslation } from '@object-ui/i18n'; import { DocShell } from './DocShell'; import { useBookData } from './use-book-data'; import { buildBookCards } from './book-nav'; @@ -23,6 +24,7 @@ import { buildBookCards } from './book-nav'; * reader lives at `/docs//`. */ export default function DocsIndex() { + const { t } = useObjectTranslation(); const { books, docs, state, error } = useBookData(); // Cards carry the book's url slug so links match the `/docs/:slug` route. @@ -31,7 +33,7 @@ export default function DocsIndex() { if (state === 'loading') { return (
- +
); } diff --git a/apps/console/src/pages/DocsSlug.tsx b/apps/console/src/pages/DocsSlug.tsx index 420116a423..cb207c789f 100644 --- a/apps/console/src/pages/DocsSlug.tsx +++ b/apps/console/src/pages/DocsSlug.tsx @@ -9,6 +9,7 @@ import { useEffect, useState } from 'react'; import { Navigate, useParams } from 'react-router-dom'; import { FileQuestion, Loader2 } from 'lucide-react'; +import { useObjectTranslation } from '@object-ui/i18n'; import { useAdapter } from '@object-ui/app-shell'; import { DocShell } from './DocShell'; import BookPage, { DocRefusal } from './BookPage'; @@ -70,6 +71,7 @@ async function refusalFor( */ export default function DocsSlug() { const { slug, appName } = useParams<{ slug: string; appName?: string }>(); + const { t } = useObjectTranslation(); const { books, docs, state } = useBookData(); const adapter = useAdapter(); @@ -97,7 +99,7 @@ export default function DocsSlug() { if (state === 'loading' || (unanswered && !!adapter && answer?.slug !== slug)) { return (
- +
); } diff --git a/packages/app-shell/src/views/RecordFormPage.tsx b/packages/app-shell/src/views/RecordFormPage.tsx index 7bc9876aa5..1363f4d78f 100644 --- a/packages/app-shell/src/views/RecordFormPage.tsx +++ b/packages/app-shell/src/views/RecordFormPage.tsx @@ -329,7 +329,7 @@ export function RecordFormPage({ mode }: RecordFormPageProps) { > -