Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

form.tsx 仍有一批用户可见的硬编码英文(全屏文本编辑对话框、Submit/Cancel 默认值、required aria-label) #3272

Closed

Description

@xuyushun441-sys

在实现 objectui#3263(PR objectui#3271)时发现,未在该 PR 内修改 —— #3263 的 scope 只包含内建 select 分支那一句 'No options available'。

现象

packages/components/src/renderers/form/form.tsx 顶部已有 useSafeFormTranslation(createSafeTranslation + defaults map),表单的校验消息、门控提示、选项空态都走了 i18n。但同一文件里仍有几处用户可见的英文字面量没有 key,zh/ja/ar 会话下会直接读到英文:

  1. 全屏文本编辑对话框(FullscreenTextarea,移动端 mobile_fullscreen)—— 这是一整块对话框 UI,不是一个词:
    • {label ?? 'Edit text'}(对话框标题,约 L346)
    • Edit the full text value, then save or cancel your changes.(sr-only 描述,约 L348)
    • 底部两个按钮 Cancel / Done(约 L363、L366)
  2. submitLabel = 'Submit' / cancelLabel = 'Cancel' 的默认值(约 L382-383)—— schema 没写 label 时提交/取消按钮就渲染这两个英文词。注意这两个是元数据默认值,不只是展示文案:改成 i18n key 会让「默认值」和「作者显式写的值」的边界变得需要设计(比如默认值改为 undefined + 渲染时 t() 回落),属于需要维护者拍板的取舍,不宜顺手改。
  3. aria-label="required"(约 L1347)—— 必填星号的无障碍标签,屏幕阅读器在任何语言下都念英文。
  4. placeholder={placeholder || 'Select an option'}(约 L1897,内建 select 分支)—— 目前是够不到的兜底:唯一调用点已经传了 placeholder: … ?? t('common.selectOption'),所以这一句在当前代码路径下永远不会渲染。删掉或换成 t('common.selectOption') 都行,但它是死分支,单独修价值很低,列在这里只是为了让下一个读这个文件的人不必再判断一次。

为什么单独开一条

fields.options.empty / fields.options.selectFirst 这两句(#3231、#3263)是「同一句话在两条渲染路径上各有一份拷贝」的问题,修法是共享 key。上面这几处不是拷贝问题,是从来没接过 i18n,而且第 2 条牵涉 schema 默认值语义 —— 需要先定方向再动手,和 #3263 混在一起会把一个 3 行的改动变成一次没有边界的清扫。

建议范围

  • 第 1、3 条:直接补 key(form.fullscreen.*、form.requiredAria)+ 十个语言包,与 fields.options.* 同样的做法。
  • 第 2 条:先定「默认按钮文案是元数据默认值还是渲染时回落」,再实现。
  • 第 4 条:随手删掉死兜底,或留到第 1 条一起。

关联:objectui#3231、objectui#3263、PR objectui#3271。

Activity

  1. self-assigned this
    on Aug 5, 2026
  2. yinlianghui commented on Aug 5, 2026

    @yinlianghui
    Contributor

    认领:objectui 分片 PM 滚动补位第 11 单(bug 优先)
    会话:session_01GTRjn8xBqp75dk7kFupVRt
    分支:claude/issue-3272-form-hardcoded-english
    Worktree:objectui-issue-3272
    域:objectui 分片(components form + i18n locales)
    文件面:packages/components/src/renderers/form/form.tsx、packages/i18n/src/locales/*.ts + 相应测试 + .changeset/*.md(越界即停)。当前在飞 0;⚠️ #3303 同碰 form.tsx,串行本单之后。

    第 2 项方向裁定(PM,否决窗口):submitLabel/cancelLabel 默认值改为 undefined + 渲染时 t() 回落(form.submit/form.cancel 类 key)—— 作者显式写的值逐字优先并用测试钉住;不改 spec 契约面,只改组件侧 prop 默认语义。理由:元数据默认值里埋英文字面量 = 「不写 label 的作者被静默锁定英文」,渲染时回落让默认按钮随语言环境正确,而显式声明照旧强制。第 1/3 项补 key 十包齐;第 4 项死兜底随第 1 项一并清理。


    Generated by Claude Code

  3. yinlianghui commented on Aug 5, 2026

    @yinlianghui
    Contributor

    PM 验收:ACCEPT → PR #3392 已转 ready + auto-merge(CI 全绿),跟到 MERGED。

    逐项结论:① 全屏对话框接 form.fullscreen.* 十包齐(Cancel 复用 common.cancel 不造孪生);② 按裁定改渲染时回落,复用既有 common.submit/common.cancel,不改 spec(FormSchema.submitLabel 本就 optional),显式值逐字优先已钉;③ 前提已失效 —— aria-label="required" 已被 #3290 移出无障碍树,照实报未改;④ 比 issue 描述更严重 —— 不是死兜底:作者显式写空 placeholder 时 || 判空串 falsy,英文字面量会覆盖显式声明,已删并以「honours an authored EMPTY placeholder」钉住(本 PR 唯一可反向验证处,实测红)。反向验证 6 红 8 绿逐条吻合预判,8 绿各有说明非漏网。

    衍生分诊:#3393(FullscreenTextarea 的 label prop 恒 undefined —— 对话框标题恒为通用词、多长文本字段的展开按钮读屏无法区分,标准 bug)已入队;⚠️ 与 #3303 落同一行(case 'textarea' 解构),#3303 → #3393 严格串行,已记排程。#3394(组件注册 defaultProps 里的英文默认值,全仓 ~30 renderer 统一写法,需先裁方向)finding 留分诊轮。

    objectui 分片 PM session_01GTRjn8xBqp75dk7kFupVRt


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions