在 objectui#3231 / PR objectui#3262 期间发现,该单已按 scope fence 明确不修(内建分支是另一条独立活路径,PM 要求不要顺手统一)。
现象
packages/components/src/renderers/form/form.tsx 的内建(未注册)select 分支:
if(!options||options.length===0){return(<divclassName="text-sm text-muted-foreground">{emptyHint||'No options available'}</div>);}'No options available' 是硬编码英文字面量,而同一个组件里 const { t } = useSafeFormTranslation(); 早已可用(form.tsx 顶部的 createSafeTranslation 工厂)。
为什么现在才值得单独处理
objectui#3231 刚把四个已注册选项 widget 的同一句文案接到了 i18n 上,并新增了共享 key:
fields.options.empty = No options availablefields.options.selectFirst = Select {{fields}} first
两个 key 已经补齐十个语言包,并且 fields.options.selectFirst 已被 form.tsx 的门控提示(gatedHint)使用 —— 也就是说这个文件里已经有一半走了 i18n,另一半没有。内建分支的这句 'No options available' 是同一个文件里唯一剩下的硬编码副本。
建议
把它改成 t('fields.options.empty'),并在 useSafeFormTranslation 的 defaults map 里补上同名英文默认值(与 fields.options.selectFirst 的做法一致,这样无 provider 时行为不变)。
预期风险很低:createSafeTranslation 在没有翻译时回落到 defaults map,英文渲染结果与现状逐字相同,现有断言(如 form-cascading-select.test.tsx)不受影响。需要补一条测试钉住 zh locale 下渲染中文。
注意
这条不要顺手把内建分支和 OptionsEmptyState(packages/fields)统一 —— 两者是不同包、不同渲染路径,共享的应当只是 i18n key,不是组件。
关联:objectui#3231、PR objectui#3262。
在 objectui#3231 / PR objectui#3262 期间发现,该单已按 scope fence 明确不修(内建分支是另一条独立活路径,PM 要求不要顺手统一)。
现象
packages/components/src/renderers/form/form.tsx的内建(未注册)select分支:'No options available'是硬编码英文字面量,而同一个组件里const { t } = useSafeFormTranslation();早已可用(form.tsx顶部的createSafeTranslation工厂)。为什么现在才值得单独处理
objectui#3231 刚把四个已注册选项 widget 的同一句文案接到了 i18n 上,并新增了共享 key:
fields.options.empty=No options availablefields.options.selectFirst=Select {{fields}} first两个 key 已经补齐十个语言包,并且
fields.options.selectFirst已被form.tsx的门控提示(gatedHint)使用 —— 也就是说这个文件里已经有一半走了 i18n,另一半没有。内建分支的这句'No options available'是同一个文件里唯一剩下的硬编码副本。建议
把它改成
t('fields.options.empty'),并在useSafeFormTranslation的 defaults map 里补上同名英文默认值(与fields.options.selectFirst的做法一致,这样无 provider 时行为不变)。预期风险很低:
createSafeTranslation在没有翻译时回落到 defaults map,英文渲染结果与现状逐字相同,现有断言(如form-cascading-select.test.tsx)不受影响。需要补一条测试钉住 zh locale 下渲染中文。注意
这条不要顺手把内建分支和
OptionsEmptyState(packages/fields)统一 —— 两者是不同包、不同渲染路径,共享的应当只是 i18n key,不是组件。关联:objectui#3231、PR objectui#3262。