diff --git a/packages/plugin-view/src/ManageViewsDialog.tsx b/packages/plugin-view/src/ManageViewsDialog.tsx index 08d55f1d6..1f3ead292 100644 --- a/packages/plugin-view/src/ManageViewsDialog.tsx +++ b/packages/plugin-view/src/ManageViewsDialog.tsx @@ -71,9 +71,11 @@ import type { ViewTabItem } from './ViewTabBar'; function useViewLabel() { try { const { t } = useObjectTranslation(); - return (key: string, fallback: string, vars?: Record) => { + return (key: string, fallback: string, vars?: Record): string => { const v = t(key, vars as any); - return !v || v === key ? fallback : v; + // i18next's `t()` is typed `string | object`; coerce so render sites and + // aria-labels always receive a string (an object child white-screens React). + return !v || v === key ? fallback : String(v); }; } catch { return (_k: string, fallback: string) => fallback; diff --git a/packages/plugin-view/src/ViewTabBar.tsx b/packages/plugin-view/src/ViewTabBar.tsx index 1e05ceab8..302b7888b 100644 --- a/packages/plugin-view/src/ViewTabBar.tsx +++ b/packages/plugin-view/src/ViewTabBar.tsx @@ -92,9 +92,11 @@ import { useObjectTranslation } from '@object-ui/react'; function useViewTabLabel() { try { const { t } = useObjectTranslation(); - return (key: string, fallback: string, vars?: Record) => { + return (key: string, fallback: string, vars?: Record): string => { const v = t(key, vars as any); - return !v || v === key ? fallback : v; + // i18next's `t()` is typed `string | object`; coerce so render sites and + // aria-labels always receive a string (an object child white-screens React). + return !v || v === key ? fallback : String(v); }; } catch { return (_k: string, fallback: string) => fallback;