在实现 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 会话下会直接读到英文:
- 全屏文本编辑对话框(
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)
submitLabel = 'Submit' / cancelLabel = 'Cancel' 的默认值(约 L382-383)—— schema 没写 label 时提交/取消按钮就渲染这两个英文词。注意这两个是元数据默认值,不只是展示文案:改成 i18n key 会让「默认值」和「作者显式写的值」的边界变得需要设计(比如默认值改为 undefined + 渲染时 t() 回落),属于需要维护者拍板的取舍,不宜顺手改。
aria-label="required"(约 L1347)—— 必填星号的无障碍标签,屏幕阅读器在任何语言下都念英文。
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。
在实现 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 会话下会直接读到英文: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)submitLabel = 'Submit'/cancelLabel = 'Cancel'的默认值(约 L382-383)—— schema 没写 label 时提交/取消按钮就渲染这两个英文词。注意这两个是元数据默认值,不只是展示文案:改成 i18n key 会让「默认值」和「作者显式写的值」的边界变得需要设计(比如默认值改为undefined+ 渲染时t()回落),属于需要维护者拍板的取舍,不宜顺手改。aria-label="required"(约 L1347)—— 必填星号的无障碍标签,屏幕阅读器在任何语言下都念英文。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 行的改动变成一次没有边界的清扫。建议范围
form.fullscreen.*、form.requiredAria)+ 十个语言包,与fields.options.*同样的做法。关联:objectui#3231、objectui#3263、PR objectui#3271。