Part of #6761(维护者 2026-08-08 裁决 B:内联 locale map 由服务端解析成字符串下发,解析器放共享位而非某个服务内部)。按 shared-contract 规则(packages/spec 恒归 spec 座位)contract-first 拆分:spec 半边先行,services 半边(#6761)Blocked-by 本单。
裁决口径(不再重开)
spec 侧要做的(API 形状由 spec 座位定夺)
在 packages/spec 放一个 I18nLabel → string 解析器,与 ui/i18n.zod.ts / system/i18n-resolver.ts 同侧。候选签名仅供起点,不构成约束:
resolveI18nLabel(label: I18nLabel | undefined, locale: string, fallback?: string): string | undefined
验收关键(这条比 API 形状重要):它必须与 objectui 的 pickLocalized 同规则 —— 回落链、大小写/区域变体处理(zh-CN vs zh)、以及「都不命中时返回什么」三处必须一致。两端对同一个 map 给出不同答案,就是本仓反复付学费的那类分叉:同一份 metadata,服务端渲染的表头与客户端渲染的表头不一样,而且没有任何一端会报错。请以 objectui 的实现为准对齐,并把这条一致性钉成测试(同一批 map 输入,两端同答案),而不是写在注释里。
消费预告(services 半边,#6761,⛔ 不在本单实现)
AnalyticsService.queryDataset 的两处富化(measures / dimensions)与 dataset-compiler.ts:374/406 改调它;后者今天的 typeof d.label === 'string' ? d.label : d.name 会把 map 替换成机器名,使 /analytics/meta 把 owner 当展示标题发布,这一处必须一并盖掉。
为什么现在需要它(实测,非断言)
dataset 声明 label: { en:'Owner', 'zh-CN':'负责人' } 时,两个策略下发的 fields[] 完全没有 label(实测见 #6761),而三个渲染端(DatasetWidget / DatasetPreview / DatasetReportRenderer)都把 fields[].label 排在第一顺位。内联 map 自 #5728 起被 I18nLabelSchema 授权,平台自己的三个已发布页面就有 31 处在用 —— 中文部署照规范写,拿到的是没有标签。
来源座位:services(会话 session_01USNUyHEr7uaU6MoEWXitei);domain:spec 归 spec 座位派发,本单不认领。
Refs:#6761(裁决与全部测量)、#5199(出处,已关闭)、#5728(内联 map 的授权)、#5141 / #5076(相邻但不同机制)。
Part of #6761(维护者 2026-08-08 裁决 B:内联 locale map 由服务端解析成字符串下发,解析器放共享位而非某个服务内部)。按 shared-contract 规则(
packages/spec恒归 spec 座位)contract-first 拆分:spec 半边先行,services 半边(#6761)Blocked-by本单。裁决口径(不再重开)
service-analytics内部写一份pickLocalized孪生)被否:后端今天零个内联 map 解析器([决策] dataset 的 dimension/measure 声明成内联 locale map 的label被生产端整个丢弃 —— 三个渲染端在等,而 schema 授权的形状发不出去 #6761 已全仓核实),第一个若以私有分叉的形式诞生,下一个生产者就抄这份复制品(PD#12);AnalyticsResult.fields[].label拓宽成I18nLabel,交客户端解析)被否:为一致性付出两个仓的线型变更,而服务端解析已能拿到同样结果;label?: string,详见 [决策] dataset 的 dimension/measure 声明成内联 locale map 的label被生产端整个丢弃 —— 三个渲染端在等,而 schema 授权的形状发不出去 #6761 的实测)。spec 侧要做的(API 形状由 spec 座位定夺)
在
packages/spec放一个I18nLabel → string解析器,与ui/i18n.zod.ts/system/i18n-resolver.ts同侧。候选签名仅供起点,不构成约束:验收关键(这条比 API 形状重要):它必须与 objectui 的
pickLocalized同规则 —— 回落链、大小写/区域变体处理(zh-CNvszh)、以及「都不命中时返回什么」三处必须一致。两端对同一个 map 给出不同答案,就是本仓反复付学费的那类分叉:同一份 metadata,服务端渲染的表头与客户端渲染的表头不一样,而且没有任何一端会报错。请以 objectui 的实现为准对齐,并把这条一致性钉成测试(同一批 map 输入,两端同答案),而不是写在注释里。消费预告(services 半边,#6761,⛔ 不在本单实现)
AnalyticsService.queryDataset的两处富化(measures / dimensions)与dataset-compiler.ts:374/406改调它;后者今天的typeof d.label === 'string' ? d.label : d.name会把 map 替换成机器名,使/analytics/meta把owner当展示标题发布,这一处必须一并盖掉。为什么现在需要它(实测,非断言)
dataset 声明
label: { en:'Owner', 'zh-CN':'负责人' }时,两个策略下发的fields[]完全没有label(实测见 #6761),而三个渲染端(DatasetWidget/DatasetPreview/DatasetReportRenderer)都把fields[].label排在第一顺位。内联 map 自 #5728 起被I18nLabelSchema授权,平台自己的三个已发布页面就有 31 处在用 —— 中文部署照规范写,拿到的是没有标签。来源座位:services(会话
session_01USNUyHEr7uaU6MoEWXitei);domain:spec归 spec 座位派发,本单不认领。Refs:#6761(裁决与全部测量)、#5199(出处,已关闭)、#5728(内联 map 的授权)、#5141 / #5076(相邻但不同机制)。