Repository navigation
14 个文件手搓 startsWith('zh') 判断绕开语言包,其余 8 种语言硬回退英文且无法翻译 #2871
Description
Activity
分类调研完成,7 个真 bug 已全部修完
原 issue 说"14 个文件手搓 zh 判断",逐个读过之后:只有 7 个是真 bug,其余 7 个要么是合法的语言检测,要么根因不在这些文件里。
已修(2 个 PR)
#2887(part 1)
文件 处理 components/custom/RecordTitleChip.tsx删私有词表,0 条新翻译——4 个键在 10 个语言包里早就有了 environment/EnvironmentListToolbar.tsx3 条 → 新 environment.*studio-design/StudioAiCopilot.tsx1 条 → Studio 词表 metadata-admin/StudioHomePage.tsxrelativeTime改用Intl.RelativeTimeFormat,0 条新键换来全部 10 语 + 正确复数#2893(part 2) — 删掉 4 份完全相同的
pick()克隆及其I18n类型别名,28 条文案迁入语言包(excelImport8 /cloudOnboarding5 /aiModelStatus11 /chatbotQuota4),全部 10 语。判定为「不要动」的(附理由)
文件 为什么不是 bug chrome/LoadingScreen.tsx选的是真语言包( zhLocale.console)不是内联文案;而且是 i18next 初始化之前的启动画面,用 hook 会导致白屏。唯一缺陷是只判断了 zh,ja/ko/de 启动瞬间看到英文——建议改成按两字母前缀索引builtInLocales,4 行的事console/ai/conversationLanguage.ts判断的是对话本身的语言(喂给 agent 决定回复语言,见 cloud#772),不是 UI 文案。文件里 0 条界面字符串 renderers/layout/containers.tsxKNOWN_LABEL_DICT规范化的是作者写在 schema 里的数据(把硬编码的"Details"映射到当前语言),不是组件自己的文案;:185的'与'是真实的 CJK 排版规则。但这里有个独立缺陷::451/:637用useObjectTranslation().language,而translateLabel内部又自己去读document.documentElement.lang,两个语言源可能不同步metadata-admin/i18n.ts见下 ObjectFieldInspector/ObjectFormCanvas组件本身没问题( ObjectFormCanvas1360 行里 0 个中文字面量),isZh只是在读previews/field-types.ts的labelZh。根因是那个数据目录,修它能一次消掉两个文件的isZh关于
metadata-admin/i18n.ts,我要更正一个早先的判断我一开始看到它的头注释写着"until the platform's
setup.translation.tsships zh-CN coverage",就去 framework 侧核实,确认 zh-CN 元数据类型标签确实已经发了,于是判断"可以退休一半"。这个结论下早了。 完整数据:该文件 1375 个键、~1255 个调用点分布在 74 个文件,全是 Studio 管理端词汇(
engine.studio.*412、engine.inspector.*213…),与主语言包几乎零重叠。TYPE_LABELS只占很小一块。更关键的是
t(key, locale)是纯函数,locale 作为 prop 穿过 inspector/preview 的注册表契约,还有 3 个非组件模块(package-schema.ts、flow-sim-validate.ts、flow-ref-check.ts)在调用——它们没法用 hook。合并意味着改 1255 个调用点 + props 契约,是数周级重构。结论:保留,不合并。 建议三件小事代替:①更新那段过期的头注释;②补 en↔zh parity 测试(白名单 44 个刻意只有 zh 的
flowNode.*键);③补一个 ADR,免得这个文件反复被人重新讨论。顺带发现,已单独开 issue
- ChatbotEnhanced 约 20 处无条件中文,英文用户直接看到中文;其中一处还作为消息发给 agent #2884 —
ChatbotEnhanced约 20 处无条件中文(英文用户直接看到中文),其中:2348还把中文当作发给 agent 的消息 - ObjectFieldInspector 草稿字段选项无条件拼接中文「(草稿)」 #2885 —
ObjectFieldInspector:1512无条件拼接(草稿) - CloudAiModelStatus 直接渲染服务端 report.summary,该文案未本地化 #2886 —
CloudAiModelStatus:149服务端report.summary未本地化
还剩
field-types.ts数据目录(46 个labelZh+ 9 个分类)→ 消掉 完善设计器的每一个细节 #9/[WIP] Enhance every detail of the designer #10 的isZhcontainers.tsx的双语言源不同步LoadingScreen的两语言塌缩
要不要把这三条也做掉、还是留给后续?
Generated by Claude Code
- ChatbotEnhanced 约 20 处无条件中文,英文用户直接看到中文;其中一处还作为消息发给 agent #2884 —
- added a commit that references this issue
on Jul 28, 2026 收尾:三个 PR 已全部合并,建议关闭
命中文件从 14 个降到 4 个,剩下的 4 个都是先前定性过的有意保留项,不是漏改。
阶段 PR 内容 part 1 #2887 4 处手搓 zh/en 分支退役 part 2 #2893 4 个 pick({en,zh})克隆删除part 3 #2898 最后三处(见下) part 3 的三处各需不同解法
LoadingScreen— 启动闪屏本来就在选真语言包,但走的是lang.startsWith('zh') ? zh : en,把 10 种语言压成 2 种。改为按两字母前缀索引builtInLocales。逐字段回退en是关键:console.*正是 语言包 key 缺口:8 个语言各缺 357–359 键,74 键只存在于 zh.ts,且没有任何 parity 测试 #2872 (a) 里落后的命名空间之一,整对象替换会在闪屏上渲染出undefined而不是英文。console.loadingHint8 个语言包都缺,一并补上。containers.tsx— 调用点从useObjectTranslation()拿language,而translateLabel内部又自己detectLocale()读 DOM。两者独立更新,应用内切语言后标签和周围 chrome 可能不同语言。现在把language传进去,删掉detectLocale。field-types.ts—FieldTypeMeta的labelZh列从结构上就把字段类型选择器锁死在中英文。46 个类型名 + 9 个分类名迁入 Studio 词表(engine.fieldType.<id>/engine.fieldCategory.<cat>,由现有值生成,没有任何措辞变动),同时移除了ObjectFieldInspector和ObjectFormCanvas两处isZh。顺带修掉一个搜索过滤器 bug:它只匹配id/ 英文 label /labelZh,日语德语搜索必然无结果。
剩余 4 个
zh分支 —— 均为有意保留文件 为什么保留 console/ai/conversationLanguage.ts判断的是对话内容的语言(用户对 AI 说了什么),不是 UI 语言 metadata-admin/i18n.tsStudio 自有词表。1375 个 key、约 1255 个调用点、74 个文件、3 个非 hook 模块——保留,不并入语言包(我此前判断有误,已更正) containers.tsxbase === 'zh'是zh-CN基语言回退;'与'vs' & '是连接词本地化,不是双语分支plugin-chatbot/ChatbotEnhanced.tsx服务端下发 {message, messageEn}二元组,客户端只能二选一。横幅自身的文案已改走语言包,剩下的要在服务端改第 3 步(防复发)已落地
eslint-rules/no-try-catch-around-hook.js之外,startsWith('zh')式分支的防线通过各语言包的 parity 测试建立:新增命名空间若只补 en/zh 会直接红。所有新命名空间(cloudConnection、auth.remediation、auth.layout、environment、excelImport、cloudOnboarding、aiModelStatus、chatbotQuota)都是一次补齐 10 个语言包,没有扩大 #2872 (a) 的缺口。7 个真实缺陷已全部修复,建议关闭本 issue。翻译内容本身的缺口(8 个语言包约 357 个 key)在 #2872 (a) 跟踪,那个需要先定翻译策略。
Generated by Claude Code
- added a commit that references this issue
on Jul 28, 2026
问题
仓库里有 14 个文件各自手搓了一套"中文 or 英文"的私有解析器,完全绕开
@object-ui/i18n与语言包。典型形态:后果有两层,第二层更麻烦:
zh这是本仓库近期已经修过两次的同一类缺陷(静默回退到英文、看起来"只是没翻完")再下沉一层。
命中文件(实测 14 个)
已确认携带
{en, zh}内联文案 + 私有pick()的:packages/app-shell/src/console/diagnostics/CloudAiModelStatus.tsx:50{en,zh};:59,61,63,137,153,158,163,170,172,179packages/app-shell/src/console/home/CloudOnboardingNext.tsx:66:149,153,171,176,181packages/app-shell/src/.../ExcelImportBar.tsx:43另有
startsWith('zh')/=== 'zh'形态的同类判断散布在 metadata-admin / studio-design 一族:packages/app-shell/src/views/studio-design/StudioAiCopilot.tsx:130packages/app-shell/src/views/metadata-admin/previews/ObjectFormCanvas.tsx:80packages/app-shell/src/views/metadata-admin/i18n.ts:2895packages/app-shell/src/views/metadata-admin/StudioHomePage.tsx:115packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx:61,165完整清单:
grep -rln "startsWith('zh')\|startsWith(\"zh\")\|=== 'zh'" packages/*/src apps/console/src→ 14 个文件。建议做法
packages/i18n/src/locales/*.ts,组件改用useObjectTranslation();10 个语言包一次补齐startsWith('zh')式的语言分支(仓库已有eslint-rules/目录,可放这里)第 3 步是关键——否则这个模式会继续被复制。
发现来源
objectstack#3589 收尾时的全仓库 i18n 覆盖排查。相关:objectui#2870(P0 全屏拦截层未国际化)、语言包 key 缺口 issue。