Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions .changeset/10586-inspector-strings-i18n.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
'@object-ui/app-shell': patch
---

fix(app-shell): three designer inspectors read their words in the designer's locale (objectui#10586)

`DatasetDefaultInspector`, `FlowReferenceField` (with the `ReferenceCombobox` it
wraps) and `ConditionBuilder` rendered their section titles, field labels,
placeholders, hints, option labels and accessible names as English literals, so a
zh-CN author read an English form inside an otherwise Chinese designer.

Those strings now come from the designer's own string catalogue, under
`engine.inspector.dataset.*`, `engine.inspector.reference.*` and
`engine.inspector.condition.*`, plus the existing `engine.form.add` and
`engine.form.searchFields`, each with an en and a zh row. The dataset inspector
reads the `locale` its host already passes; the other two follow the active
language through `useMetadataLocale()`. The en-US text is unchanged. Stored
values, the `≥` / `≤` operator symbols, currency codes and decimal digits are not
words and stay as they were.
236 changes: 236 additions & 0 deletions packages/app-shell/src/views/metadata-admin/i18n.ts
Original file line number Diff line number Diff line change
Expand Up @@ -528,6 +528,22 @@ const ENGINE_STRINGS_EN: Record<string, string> = {
// ConditionBuilder raw-expression mode (CEL editor, #1582)
'engine.condition.celLabel': 'CEL expression',
'engine.condition.advancedHint': 'Advanced expression — Builder only supports simple AND/OR conditions.',
// ConditionBuilder row mode (objectui#10586). `≥` / `≤` stay symbols.
'engine.inspector.condition.builder': 'Builder',
'engine.inspector.condition.expression': 'Expression',
'engine.inspector.condition.always': 'Always — no condition.',
'engine.inspector.condition.and': 'AND',
'engine.inspector.condition.or': 'OR',
'engine.inspector.condition.subjectPlaceholder': 'field / context',
'engine.inspector.condition.remove': 'Remove condition',
'engine.inspector.condition.valuePlaceholder': 'value',
'engine.inspector.condition.add': 'Add condition',
'engine.inspector.condition.op.equals': 'equals',
'engine.inspector.condition.op.notEquals': 'not equals',
'engine.inspector.condition.op.greaterThan': 'greater than',
'engine.inspector.condition.op.lessThan': 'less than',
'engine.inspector.condition.op.truthy': 'is set / true',
'engine.inspector.condition.op.falsy': 'is empty / false',
'engine.inspector.view.type.grid': 'Table / List',
'engine.inspector.view.type.kanban': 'Kanban',
'engine.inspector.view.type.calendar': 'Calendar',
Expand Down Expand Up @@ -787,6 +803,108 @@ const ENGINE_STRINGS_EN: Record<string, string> = {
'engine.inspector.dashboard.widgetsEmpty': 'No widgets yet. Add one below.',
'engine.inspector.dashboard.removeWidget': 'Remove widget',
'engine.inspector.dashboard.noSchema': 'Spec schema unavailable — basic properties only.',
// Dataset default (home) inspector (objectui#10586). Option labels are keyed
// by the stored value; `{…}` tokens in a sentence are slots the inspector
// fills with a node (a code span, a count).
'engine.inspector.dataset.kind': 'Dataset',
'engine.inspector.dataset.aggregate.count': 'count',
'engine.inspector.dataset.aggregate.sum': 'sum',
'engine.inspector.dataset.aggregate.avg': 'avg',
'engine.inspector.dataset.aggregate.min': 'min',
'engine.inspector.dataset.aggregate.max': 'max',
'engine.inspector.dataset.aggregate.count_distinct': 'count distinct',
'engine.inspector.dataset.dimType.string': 'string',
'engine.inspector.dataset.dimType.number': 'number',
'engine.inspector.dataset.dimType.date': 'date',
'engine.inspector.dataset.dimType.boolean': 'boolean',
'engine.inspector.dataset.dimType.lookup': 'lookup',
'engine.inspector.dataset.granularity.none': '— none —',
'engine.inspector.dataset.granularity.day': 'day',
'engine.inspector.dataset.granularity.week': 'week',
'engine.inspector.dataset.granularity.month': 'month',
'engine.inspector.dataset.granularity.quarter': 'quarter',
'engine.inspector.dataset.granularity.year': 'year',
'engine.inspector.dataset.derivedOp.ratio': 'ratio (a ÷ b)',
'engine.inspector.dataset.derivedOp.sum': 'sum (a + b)',
'engine.inspector.dataset.derivedOp.difference': 'difference (a − b)',
'engine.inspector.dataset.derivedOp.product': 'product (a × b)',
'engine.inspector.dataset.formatKind.raw': 'Raw number',
'engine.inspector.dataset.formatKind.number': 'Number — 1,234.5',
'engine.inspector.dataset.formatKind.currency': 'Currency — $1,234.50',
'engine.inspector.dataset.formatKind.percent': 'Percent — 12.3%',
'engine.inspector.dataset.usage.bound': 'Bound by {reports} · {dashboards} — changes affect them.',
'engine.inspector.dataset.usage.reportsOne': '{count} report',
'engine.inspector.dataset.usage.reportsOther': '{count} reports',
'engine.inspector.dataset.usage.dashboardsOne': '{count} dashboard',
'engine.inspector.dataset.usage.dashboardsOther': '{count} dashboards',
'engine.inspector.dataset.usage.unbound': 'Not yet bound by any report or dashboard.',
'engine.inspector.dataset.name': 'Name',
'engine.inspector.dataset.namePlaceholder': 'snake_case identifier',
'engine.inspector.dataset.label': 'Label',
'engine.inspector.dataset.description': 'Description',
'engine.inspector.dataset.baseObject': 'Base object',
'engine.inspector.dataset.baseObjectPlaceholder': 'Select an object…',
'engine.inspector.dataset.searchObjects': 'Search objects…',
'engine.inspector.dataset.baseObjectChangeHint': 'Changing the base object clears its dimensions, measures, joins & filters.',
'engine.inspector.dataset.includedRelationships': 'Included relationships',
'engine.inspector.dataset.noJoins': 'No joins. Add a relationship (a lookup field on {object}) to use {path} dimensions/measures.',
'engine.inspector.dataset.baseObjectFallback': 'the base object',
'engine.inspector.dataset.includedRelationship': 'Included relationship',
'engine.inspector.dataset.relationshipPlaceholder': 'Select a relationship…',
'engine.inspector.dataset.searchRelationships': 'Search relationships…',
'engine.inspector.dataset.removeRelationship': 'Remove relationship',
'engine.inspector.dataset.scopeFilter': 'Scope filter',
'engine.inspector.dataset.scopeFilterHelp': 'Intrinsic scope, ANDed into every query (e.g. exclude soft-deleted records).',
'engine.inspector.dataset.dimensions': 'Dimensions',
'engine.inspector.dataset.addDimension': 'Add dimension',
'engine.inspector.dataset.dimensionN': 'Dimension {index}',
'engine.inspector.dataset.removeDimension': 'Remove dimension',
'engine.inspector.dataset.dimensionNamePlaceholder': 'e.g. region',
'engine.inspector.dataset.field': 'Field',
'engine.inspector.dataset.dimensionFieldPlaceholder': 'field or relationship.field',
'engine.inspector.dataset.type': 'Type',
'engine.inspector.dataset.labelOptional': 'Label (optional)',
'engine.inspector.dataset.displayLabel': 'Display label',
'engine.inspector.dataset.dateBucket': 'Date bucket',
'engine.inspector.dataset.measures': 'Measures',
'engine.inspector.dataset.addMeasure': 'Add measure',
'engine.inspector.dataset.measureN': 'Measure {index}',
'engine.inspector.dataset.removeMeasure': 'Remove measure',
'engine.inspector.dataset.measureNamePlaceholder': 'e.g. revenue',
'engine.inspector.dataset.aggregate': 'Aggregate',
'engine.inspector.dataset.measureFieldPlaceholder': 'field (optional for count)',
'engine.inspector.dataset.measureFilter': 'Filter (measure-scoped)',
'engine.inspector.dataset.measureFilterHelp': 'Only rows matching this filter feed this measure (e.g. won_amount = sum(amount) where stage = won).',
'engine.inspector.dataset.derived': 'Derived — computed from other measures',
'engine.inspector.dataset.operation': 'Operation',
'engine.inspector.dataset.operands': 'Operands (other measures)',
'engine.inspector.dataset.derivedNeedTwo': 'Select exactly 2 measures for {op}.',
'engine.inspector.dataset.derivedNeedOne': 'Select at least 1 measure for {op}.',
'engine.inspector.dataset.addOtherMeasuresFirst': 'Add other measures first.',
'engine.inspector.dataset.advanced': 'Advanced',
'engine.inspector.dataset.displayFormat': 'Display format',
'engine.inspector.dataset.decimals': 'Decimals',
'engine.inspector.dataset.currency': 'Currency',
'engine.inspector.dataset.sample': 'Sample: {sample}',
'engine.inspector.dataset.relWarning': "Relationship {rel} isn't in Included relationships.",
'engine.inspector.dataset.relWarningAdd': 'Add it',
'engine.inspector.dataset.filterAdvanced': 'Advanced filter (nested / OR) — edit it in the {source} tab.',
'engine.inspector.dataset.sourceTab': 'Source',
'engine.inspector.dataset.filterConditionsOne': '{count} condition',
'engine.inspector.dataset.filterConditionsOther': '{count} conditions',
'engine.inspector.dataset.addFilter': '+ Add filter…',
'engine.inspector.dataset.filterNeedsObject': 'Pick a base object to add filter conditions.',
// Flow reference picker — ReferenceCombobox / FlowReferenceField (objectui#10586)
'engine.inspector.reference.pickFromRecords': 'Pick from records',
'engine.inspector.reference.enterManually': 'Enter value manually',
'engine.inspector.reference.managerPlaceholder': 'Resolved automatically',
'engine.inspector.reference.managerHint': "Resolved at runtime from the submitter's manager — no value needed.",
'engine.inspector.reference.queueUnsupported': 'Queue approvers are not supported by the runtime yet — this slot resolves to nobody.',
'engine.inspector.reference.fieldsOf': 'Fields of {object}.',
'engine.inspector.reference.setTriggerObject': 'Set the flow’s trigger object (on the Start node) to list fields.',
'engine.inspector.reference.actionsOf': 'Actions of {connector}.',
'engine.inspector.reference.chooseConnector': 'Choose a Connector above to list its actions.',
'engine.inspector.reference.declarative': 'declarative',
// Add affordances (used by OutlineStrip + custom previews)
'engine.inspector.add.widget': 'Add widget',
'engine.inspector.add.block': 'Add block',
Expand Down Expand Up @@ -2513,6 +2631,23 @@ const ENGINE_STRINGS_ZH: Record<string, string> = {
// ConditionBuilder 裸表达式模式(CEL 编辑器,#1582)
'engine.condition.celLabel': 'CEL 表达式',
'engine.condition.advancedHint': '高级表达式 —— 搭建器仅支持简单的 AND/OR 条件。',
// ConditionBuilder row mode (objectui#10586). The join words follow the
// packs' own `filterBuilder.and` / `filterBuilder.or`.
'engine.inspector.condition.builder': '搭建器',
'engine.inspector.condition.expression': '表达式',
'engine.inspector.condition.always': '始终生效 —— 无条件。',
'engine.inspector.condition.and': '且',
'engine.inspector.condition.or': '或',
'engine.inspector.condition.subjectPlaceholder': '字段 / 上下文',
'engine.inspector.condition.remove': '移除条件',
'engine.inspector.condition.valuePlaceholder': '值',
'engine.inspector.condition.add': '添加条件',
'engine.inspector.condition.op.equals': '等于',
'engine.inspector.condition.op.notEquals': '不等于',
'engine.inspector.condition.op.greaterThan': '大于',
'engine.inspector.condition.op.lessThan': '小于',
'engine.inspector.condition.op.truthy': '已设置 / 为真',
'engine.inspector.condition.op.falsy': '为空 / 为假',
'engine.inspector.view.type.grid': '表格 / 列表',
'engine.inspector.view.type.kanban': '看板',
'engine.inspector.view.type.calendar': '日历',
Expand Down Expand Up @@ -2748,6 +2883,107 @@ const ENGINE_STRINGS_ZH: Record<string, string> = {
'engine.inspector.dashboard.widgetsEmpty': '还没有组件。在下方添加。',
'engine.inspector.dashboard.removeWidget': '删除组件',
'engine.inspector.dashboard.noSchema': '规格 schema 不可用 —— 仅显示基础属性。',
// Dataset default (home) inspector (objectui#10586). zh has one plural form,
// so each `…One` / `…Other` pair carries the same row.
'engine.inspector.dataset.kind': '数据集',
'engine.inspector.dataset.aggregate.count': '计数',
'engine.inspector.dataset.aggregate.sum': '求和',
'engine.inspector.dataset.aggregate.avg': '平均值',
'engine.inspector.dataset.aggregate.min': '最小值',
'engine.inspector.dataset.aggregate.max': '最大值',
'engine.inspector.dataset.aggregate.count_distinct': '去重计数',
'engine.inspector.dataset.dimType.string': '字符串',
'engine.inspector.dataset.dimType.number': '数字',
'engine.inspector.dataset.dimType.date': '日期',
'engine.inspector.dataset.dimType.boolean': '布尔值',
'engine.inspector.dataset.dimType.lookup': '查找关系',
'engine.inspector.dataset.granularity.none': '— 无 —',
'engine.inspector.dataset.granularity.day': '日',
'engine.inspector.dataset.granularity.week': '周',
'engine.inspector.dataset.granularity.month': '月',
'engine.inspector.dataset.granularity.quarter': '季度',
'engine.inspector.dataset.granularity.year': '年',
'engine.inspector.dataset.derivedOp.ratio': '比率(a ÷ b)',
'engine.inspector.dataset.derivedOp.sum': '求和(a + b)',
'engine.inspector.dataset.derivedOp.difference': '差值(a − b)',
'engine.inspector.dataset.derivedOp.product': '乘积(a × b)',
'engine.inspector.dataset.formatKind.raw': '原始数值',
'engine.inspector.dataset.formatKind.number': '数字 —— 1,234.5',
'engine.inspector.dataset.formatKind.currency': '货币 —— $1,234.50',
'engine.inspector.dataset.formatKind.percent': '百分比 —— 12.3%',
'engine.inspector.dataset.usage.bound': '已被 {reports} · {dashboards} 绑定 —— 修改会影响它们。',
'engine.inspector.dataset.usage.reportsOne': '{count} 个报表',
'engine.inspector.dataset.usage.reportsOther': '{count} 个报表',
'engine.inspector.dataset.usage.dashboardsOne': '{count} 个仪表盘',
'engine.inspector.dataset.usage.dashboardsOther': '{count} 个仪表盘',
'engine.inspector.dataset.usage.unbound': '尚未被任何报表或仪表盘绑定。',
'engine.inspector.dataset.name': '名称',
'engine.inspector.dataset.namePlaceholder': 'snake_case 标识符',
'engine.inspector.dataset.label': '显示名',
'engine.inspector.dataset.description': '描述',
'engine.inspector.dataset.baseObject': '基础对象',
'engine.inspector.dataset.baseObjectPlaceholder': '选择对象…',
'engine.inspector.dataset.searchObjects': '搜索对象…',
'engine.inspector.dataset.baseObjectChangeHint': '更改基础对象会清空其维度、度量、关联与筛选。',
'engine.inspector.dataset.includedRelationships': '包含的关联',
'engine.inspector.dataset.noJoins': '暂无关联。添加一个关联({object} 上的查找字段),即可使用 {path} 形式的维度 / 度量。',
'engine.inspector.dataset.baseObjectFallback': '基础对象',
'engine.inspector.dataset.includedRelationship': '包含的关联',
'engine.inspector.dataset.relationshipPlaceholder': '选择关联…',
'engine.inspector.dataset.searchRelationships': '搜索关联…',
'engine.inspector.dataset.removeRelationship': '移除关联',
'engine.inspector.dataset.scopeFilter': '范围筛选',
'engine.inspector.dataset.scopeFilterHelp': '固有范围,以 AND 并入每一次查询(例如排除已软删除的记录)。',
'engine.inspector.dataset.dimensions': '维度',
'engine.inspector.dataset.addDimension': '添加维度',
'engine.inspector.dataset.dimensionN': '维度 {index}',
'engine.inspector.dataset.removeDimension': '移除维度',
'engine.inspector.dataset.dimensionNamePlaceholder': '例如:region',
'engine.inspector.dataset.field': '字段',
'engine.inspector.dataset.dimensionFieldPlaceholder': '字段 或 关联.字段',
'engine.inspector.dataset.type': '类型',
'engine.inspector.dataset.labelOptional': '显示名(可选)',
'engine.inspector.dataset.displayLabel': '显示名',
'engine.inspector.dataset.dateBucket': '日期分桶',
'engine.inspector.dataset.measures': '度量',
'engine.inspector.dataset.addMeasure': '添加度量',
'engine.inspector.dataset.measureN': '度量 {index}',
'engine.inspector.dataset.removeMeasure': '移除度量',
'engine.inspector.dataset.measureNamePlaceholder': '例如:revenue',
'engine.inspector.dataset.aggregate': '聚合方式',
'engine.inspector.dataset.measureFieldPlaceholder': '字段(count 时可选)',
'engine.inspector.dataset.measureFilter': '筛选(度量级)',
'engine.inspector.dataset.measureFilterHelp': '只有满足此筛选的行才计入该度量(例如 won_amount = sum(amount) where stage = won)。',
'engine.inspector.dataset.derived': '派生 —— 由其他度量计算',
'engine.inspector.dataset.operation': '运算',
'engine.inspector.dataset.operands': '操作数(其他度量)',
'engine.inspector.dataset.derivedNeedTwo': '{op} 需要恰好选择 2 个度量。',
'engine.inspector.dataset.derivedNeedOne': '{op} 至少需要选择 1 个度量。',
'engine.inspector.dataset.addOtherMeasuresFirst': '请先添加其他度量。',
'engine.inspector.dataset.advanced': '高级',
'engine.inspector.dataset.displayFormat': '显示格式',
'engine.inspector.dataset.decimals': '小数位数',
'engine.inspector.dataset.currency': '货币',
'engine.inspector.dataset.sample': '示例:{sample}',
'engine.inspector.dataset.relWarning': '关联 {rel} 不在「包含的关联」中。',
'engine.inspector.dataset.relWarningAdd': '添加它',
'engine.inspector.dataset.filterAdvanced': '高级筛选(嵌套 / OR)—— 请在「{source}」标签页中编辑。',
'engine.inspector.dataset.sourceTab': '源码',
'engine.inspector.dataset.filterConditionsOne': '{count} 个条件',
'engine.inspector.dataset.filterConditionsOther': '{count} 个条件',
'engine.inspector.dataset.addFilter': '+ 添加筛选…',
'engine.inspector.dataset.filterNeedsObject': '先选择基础对象,才能添加筛选条件。',
// Flow reference picker — ReferenceCombobox / FlowReferenceField (objectui#10586)
'engine.inspector.reference.pickFromRecords': '从记录中选择',
'engine.inspector.reference.enterManually': '手动输入值',
'engine.inspector.reference.managerPlaceholder': '自动解析',
'engine.inspector.reference.managerHint': '运行时根据提交人的上级自动解析 —— 无需填写。',
'engine.inspector.reference.queueUnsupported': '运行时暂不支持队列审批人 —— 该位置不会解析到任何人。',
'engine.inspector.reference.fieldsOf': '{object} 的字段。',
'engine.inspector.reference.setTriggerObject': '请先在开始节点上设置流程的触发对象,才能列出字段。',
'engine.inspector.reference.actionsOf': '{connector} 的动作。',
'engine.inspector.reference.chooseConnector': '请先在上方选择连接器,才能列出其动作。',
'engine.inspector.reference.declarative': '声明式',
// Add affordances
'engine.inspector.add.widget': '添加组件',
'engine.inspector.add.block': '添加区块',
Expand Down
Loading
Loading