From 808dbf8972ad645c6f00a1a97753f4a99231a6d2 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 5 Nov 2026 03:44:34 +0000 Subject: [PATCH] fix(app-shell): zh-CN view panel reads the empty filter prompt and description hint in Chinese Claude-Session: https://claude.ai/code/session_01WGufzgWrZ7dEo8uwMCqevS Co-authored-by: Claude --- .../30039-view-panel-zh-filter-prompt.md | 11 ++++++++ .../metadata-admin/metadata-form-i18n.test.ts | 4 +++ .../metadata-admin/metadata-form-zh-cn.ts | 8 ++++-- ...idgets.filterBuilderHeldRow-26738.test.tsx | 26 +++++++++++++++++++ .../src/views/metadata-admin/widgets.tsx | 2 +- 5 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 .changeset/30039-view-panel-zh-filter-prompt.md diff --git a/.changeset/30039-view-panel-zh-filter-prompt.md b/.changeset/30039-view-panel-zh-filter-prompt.md new file mode 100644 index 00000000000..72f451078a3 --- /dev/null +++ b/.changeset/30039-view-panel-zh-filter-prompt.md @@ -0,0 +1,11 @@ +--- +'@object-ui/app-shell': patch +--- + +fix(app-shell): on a zh-CN console the view properties panel's empty filter button reads 「+ 添加筛选…」 and the description row's hint reads in Chinese + +Clause-②: no +Metadata-protocol: none + +- The `filter-builder` widget's empty trigger was an English literal (`+ Add filter…`); it now reads the Studio string the dataset scope filter already uses, so it follows the designer locale. +- The zh-CN view form overlay gains the `description` row's help text, which showed the schema's English description. diff --git a/ui/packages/app-shell/src/views/metadata-admin/metadata-form-i18n.test.ts b/ui/packages/app-shell/src/views/metadata-admin/metadata-form-i18n.test.ts index d8a6289daf3..4cc55a4ca01 100644 --- a/ui/packages/app-shell/src/views/metadata-admin/metadata-form-i18n.test.ts +++ b/ui/packages/app-shell/src/views/metadata-admin/metadata-form-i18n.test.ts @@ -202,6 +202,9 @@ describe('every form type Studio renders reads in zh-CN (objectstack#30039)', () expect(sections(zh).find((s) => s.label === '基础信息')?.description).toBe('标识与主显示形态'); expect(fieldByName(zh, 'searchableFields')?.label).toBe('可搜索字段'); expect(fieldByName(zh, 'description')?.label).toBe('描述'); + // The description row's hint: without the overlay leaf it showed the + // schema's English `.describe()` text. + expect(fieldByName(zh, 'description')?.helpText).toBe('视图说明,用于文档与悬停提示'); }); it('an English console reads the spec English, the same object every time — the control', () => { @@ -209,6 +212,7 @@ describe('every form type Studio renders reads in zh-CN (objectstack#30039)', () expect(en).toBe(getViewForm('en')); expect(sections(en).map((s) => s.label)).toContain('Basics'); expect(fieldByName(en, 'searchableFields')?.label).toBeUndefined(); + expect(fieldByName(en, 'description')?.helpText).toBeUndefined(); }); it('the page and report panels read in Chinese too', () => { diff --git a/ui/packages/app-shell/src/views/metadata-admin/metadata-form-zh-cn.ts b/ui/packages/app-shell/src/views/metadata-admin/metadata-form-zh-cn.ts index 8449b57ad3e..ffefa543ff5 100644 --- a/ui/packages/app-shell/src/views/metadata-admin/metadata-form-zh-cn.ts +++ b/ui/packages/app-shell/src/views/metadata-admin/metadata-form-zh-cn.ts @@ -14,7 +14,9 @@ * these forms with), so a form reads the same words whether the server * localized it or this console did. A leaf the platform has not translated * (still the English source) is left out: the overlay then returns the spec's - * own English for it, as it does for every type it does not name. + * own English for it, as it does for every type it does not name. The one + * exception is a leaf a curated inspector SHOWS that the platform has no zh + * for; it is hand-worded here and marked so at its row. * * ## Two depths, by who renders the form * @@ -375,7 +377,9 @@ export const ZH_CN_SPEC_FORMS: NonNullable = { fields: { name: { label: '名称', helpText: 'snake_case,环境内唯一' }, label: { label: '显示名称' }, - description: { label: '描述' }, + // Hand-worded: the platform bundle has no zh leaf for this help, and the + // view inspector shows it (the schema's own `.describe()` text). + description: { label: '描述', helpText: '视图说明,用于文档与悬停提示' }, type: { label: '类型', helpText: '主要的视图形态' }, data: { label: '数据', helpText: '数据源——如:{"provider":"object","object":"task"}' }, columns: { label: '列', helpText: '要展示的列(来自所选对象的字段名)' }, diff --git a/ui/packages/app-shell/src/views/metadata-admin/widgets.filterBuilderHeldRow-26738.test.tsx b/ui/packages/app-shell/src/views/metadata-admin/widgets.filterBuilderHeldRow-26738.test.tsx index 96347cbf6c2..28ba5e69ae5 100644 --- a/ui/packages/app-shell/src/views/metadata-admin/widgets.filterBuilderHeldRow-26738.test.tsx +++ b/ui/packages/app-shell/src/views/metadata-admin/widgets.filterBuilderHeldRow-26738.test.tsx @@ -25,9 +25,14 @@ import '@testing-library/jest-dom/vitest'; import * as React from 'react'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { cleanup, fireEvent, render, screen } from '@testing-library/react'; +import { I18nProvider } from '@object-ui/i18n'; +import { loadStudioCatalogue } from '@object-ui/i18n/namespaces/studio'; import { WIDGETS } from './widgets'; import { loaded } from './loadState'; +// The studio namespace fetches zh on demand; load it before any zh render. +await loadStudioCatalogue('zh'); + // The builder lives inside a Radix popover, which does not open in jsdom. // Rendering the popover parts inline is this directory's existing way of // reaching it (`WidgetContext.catalogUnion.test.tsx`); the rest of the barrel @@ -147,3 +152,24 @@ describe('the filter-builder widget holds a row until it is complete (objectstac expect(writes).toEqual([]); }); }); + +describe('the empty filter trigger reads in the designer locale (objectstack#30039)', () => { + const renderIn = (lang: 'en' | 'zh') => + render( + + + , + ); + + it('a zh-CN console reads the Chinese prompt, not the English literal', () => { + renderIn('zh'); + const trigger = screen.getByTestId('filter-builder-trigger'); + expect(trigger).toHaveTextContent('+ 添加筛选…'); + expect(trigger).not.toHaveTextContent('Add filter'); + }); + + it('CONTROL: an English console keeps the English prompt', () => { + renderIn('en'); + expect(screen.getByTestId('filter-builder-trigger')).toHaveTextContent('+ Add filter…'); + }); +}); diff --git a/ui/packages/app-shell/src/views/metadata-admin/widgets.tsx b/ui/packages/app-shell/src/views/metadata-admin/widgets.tsx index 705370d5dba..1bee4a07623 100644 --- a/ui/packages/app-shell/src/views/metadata-admin/widgets.tsx +++ b/ui/packages/app-shell/src/views/metadata-admin/widgets.tsx @@ -2875,7 +2875,7 @@ export function FilterBuilderField({ value, onChange, fields, readOnly, id, aria