@object-ui/i18n 17.5.0 → 17.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -94,6 +94,15 @@ const en = {
94
94
  common: {
95
95
  loading: 'Loading…',
96
96
  save: 'Save',
97
+ // The SHARED "throw away the unsaved draft" verb, read by
98
+ // `@object-ui/components`' `ConfigPanelRenderer` footer (objectui#4750).
99
+ // The three older spellings stay where they are because each belongs to one
100
+ // surface's wording: `form.discard` is the confirm button of plugin-form's
101
+ // "Discard changes?" alert dialog, `console.settingsView.discard` and
102
+ // `console.objectView.discard` are two console view footers — and the last
103
+ // of those already disagrees with the other two in zh/ko/fr. This one is
104
+ // the shared component's, and its ten values are the majority spelling.
105
+ discard: 'Discard',
97
106
  cancel: 'Cancel',
98
107
  delete: 'Delete',
99
108
  edit: 'Edit',
@@ -291,6 +300,30 @@ const en = {
291
300
  tags: {
292
301
  placeholder: 'Type and press Enter to add…',
293
302
  },
303
+ // objectui#4028 — `AddressField`'s five sub-labels, previously English
304
+ // string literals with no key at all: on a Chinese console every address
305
+ // field showed five English words in the middle of an otherwise fully
306
+ // translated form, and an app had NO way to reach them. The parts are not
307
+ // fields on the object (`billing_address` is a single `address` column),
308
+ // so there was nothing for a translation bundle to key on and no
309
+ // `subLabels` property to declare — the only workaround left was to stop
310
+ // using `Field.address()` and author five text fields, losing the
311
+ // structured value, geocoding and map view.
312
+ //
313
+ // Values are byte-identical to the literals they replace, so English and
314
+ // provider-less rendering are unchanged (`FIELD_DEFAULTS` in
315
+ // `packages/fields/src/widgets/useFieldTranslation.ts` carries the same
316
+ // five, which is what a host with no `I18nProvider` renders).
317
+ //
318
+ // The five INPUT PLACEHOLDERS that sat next to these labels are gone
319
+ // rather than keyed — see the widget for that measurement.
320
+ address: {
321
+ street: 'Street Address',
322
+ city: 'City',
323
+ state: 'State / Province',
324
+ postalCode: 'ZIP / Postal Code',
325
+ country: 'Country',
326
+ },
294
327
  // objectui#3406 — the accessible sentence of the textarea character
295
328
  // counter, rendered only when the field declares `maxLength`. The visible
296
329
  // text is `{count}/{max}` digits and needs no locale. ONE interpolated key
@@ -890,6 +923,8 @@ const en = {
890
923
  writeStrippedTitle: 'Saved — but some fields did not take effect',
891
924
  writeStrippedReadonly: 'Read-only, so it did not take effect: {{fields}}',
892
925
  writeStrippedByState: "Not editable in this record's current state, so it did not take effect: {{fields}}",
926
+ writeStrippedPrimaryKey: "The record's identifier cannot be changed by a save, so it did not take effect: {{fields}}",
927
+ writeStrippedUnknownReason: 'Not applied by the server: {{fields}}',
893
928
  approvalPendingEditable: 'In approval · editable',
894
929
  approvalPendingTooltip: 'This record has a pending approval request; this step still allows editing',
895
930
  approvalProgress: 'Approvals — {{got}} of {{need}}',
@@ -902,6 +937,18 @@ const en = {
902
937
  cancelApprovalTooltipUnlocked: 'Recall the pending approval request',
903
938
  cancelApprovalFailed: 'Failed to recall approval',
904
939
  cancelApprovalUnavailable: 'Recalling approvals is not supported on this data source',
940
+ // objectui#5916 — `record:path` stage state in the ACCESSIBLE NAME.
941
+ // Each stage is a `role="listitem"`, which is name-from-AUTHOR only, so
942
+ // visually-hidden text inside it computes to an EMPTY name; these compose
943
+ // the stage's own (already picklist-localized) label with its state into the
944
+ // `aria-label`. The ✓/✗ glyphs stay `aria-hidden` decoration.
945
+ pathLabel: 'Record path',
946
+ pathStageCompleted: '{{stage}}, completed',
947
+ pathStageCurrent: '{{stage}}, current stage',
948
+ pathStageUpcoming: '{{stage}}, upcoming',
949
+ pathStageLostCurrent: '{{stage}}, closed lost, current stage',
950
+ pathStageLostUpcoming: '{{stage}}, closed lost, not reached',
951
+ pathStageWonUpcoming: '{{stage}}, goal stage, not reached',
905
952
  linkCopied: 'Link copied to clipboard',
906
953
  linkCopyFailed: 'Failed to copy link',
907
954
  cancel: 'Cancel',
@@ -1024,6 +1071,10 @@ const en = {
1024
1071
  attachmentDownloadDenied: "You don't have access to download this attachment.",
1025
1072
  attachmentAuthRequired: 'Please sign in to download this attachment.',
1026
1073
  attachmentPermissionDenied: "You don't have permission to do that.",
1074
+ attachmentsAccessDenied: "You don't have access to these attachments.",
1075
+ attachmentsLoadFailed: "We couldn't load the attachments for this record.",
1076
+ attachmentsApiUnavailable: 'The attachments list is not available on this object.',
1077
+ retryLoadAttachments: 'Retry',
1027
1078
  // Diff
1028
1079
  unifiedDiff: 'Unified diff',
1029
1080
  sideBySideDiff: 'Side-by-side diff',
@@ -1145,66 +1196,6 @@ const en = {
1145
1196
  invalidCoordinates: '{{count}} record with missing or invalid coordinates excluded from the map.',
1146
1197
  invalidCoordinatesPlural: '{{count}} records with missing or invalid coordinates excluded from the map.',
1147
1198
  },
1148
- workflow: {
1149
- draft: 'Draft',
1150
- active: 'Active',
1151
- paused: 'Paused',
1152
- completed: 'Completed',
1153
- cancelled: 'Cancelled',
1154
- save: 'Save',
1155
- publish: 'Publish',
1156
- addNode: 'Add Node',
1157
- workflowFlow: 'Workflow Flow',
1158
- properties: 'Properties',
1159
- connections: 'Connections',
1160
- quickConnect: 'Quick Connect',
1161
- fromPlaceholder: 'From…',
1162
- toPlaceholder: 'To…',
1163
- connect: 'Connect',
1164
- label: 'Label',
1165
- type: 'Type',
1166
- description: 'Description',
1167
- assignee: 'Assignee',
1168
- assigneeType: 'Assignee Type',
1169
- user: 'User',
1170
- role: 'Role',
1171
- group: 'Group',
1172
- expression: 'Expression',
1173
- timeoutMinutes: 'Timeout (minutes)',
1174
- selectNodeToEdit: 'Select a node to edit its properties',
1175
- workflowTitle: 'Workflow Title',
1176
- newWorkflow: 'New Workflow',
1177
- outConnections: '{{count}} out',
1178
- start: 'Start',
1179
- end: 'End',
1180
- task: 'Task',
1181
- userTask: 'User Task',
1182
- serviceTask: 'Service Task',
1183
- scriptTask: 'Script Task',
1184
- approval: 'Approval',
1185
- condition: 'Condition',
1186
- parallelGateway: 'Parallel Gateway',
1187
- joinGateway: 'Join Gateway',
1188
- boundaryEvent: 'Boundary Event',
1189
- delay: 'Delay',
1190
- notification: 'Notification',
1191
- webhook: 'Webhook',
1192
- allowConcurrency: 'Allow (run concurrently)',
1193
- forbidConcurrency: 'Forbid (skip new)',
1194
- replaceConcurrency: 'Replace (cancel existing)',
1195
- queueConcurrency: 'Queue (run after current)',
1196
- conditionEvent: 'Condition',
1197
- manualEvent: 'Manual',
1198
- webhookEvent: 'Webhook',
1199
- timerEvent: 'Timer',
1200
- signalEvent: 'Signal',
1201
- versionHistory: 'Version History',
1202
- importBpmn: 'Import BPMN',
1203
- exportBpmn: 'Export BPMN',
1204
- undo: 'Undo',
1205
- redo: 'Redo',
1206
- resetZoom: 'Reset zoom',
1207
- },
1208
1199
  designer: {
1209
1200
  undo: 'Undo',
1210
1201
  redo: 'Redo',
@@ -1225,6 +1216,105 @@ const en = {
1225
1216
  details: 'Details',
1226
1217
  exportCsv: 'Export CSV',
1227
1218
  openInList: 'Open in list',
1219
+ config: {
1220
+ breadcrumb: {
1221
+ dashboard: 'Dashboard',
1222
+ configuration: 'Configuration',
1223
+ widget: 'Widget',
1224
+ chart: 'Chart',
1225
+ table: 'Table',
1226
+ pivotTable: 'Pivot table',
1227
+ },
1228
+ section: {
1229
+ general: 'General',
1230
+ layout: 'Layout',
1231
+ data: 'Data',
1232
+ dataBinding: 'Data Binding',
1233
+ appearance: 'Appearance',
1234
+ },
1235
+ field: {
1236
+ title: 'Title',
1237
+ description: 'Description',
1238
+ columns: 'Columns',
1239
+ gap: 'Gap',
1240
+ rowHeight: 'Row height (px)',
1241
+ autoRefresh: 'Auto refresh',
1242
+ showDescription: 'Show description',
1243
+ theme: 'Theme',
1244
+ widgetType: 'Widget type',
1245
+ colorVariant: 'Color variant',
1246
+ dataset: 'Dataset',
1247
+ dimensions: 'Dimensions',
1248
+ values: 'Values',
1249
+ width: 'Width (columns)',
1250
+ height: 'Height (rows)',
1251
+ },
1252
+ placeholder: {
1253
+ dashboardTitle: 'Dashboard title',
1254
+ dashboardDescription: 'Short summary shown under the title',
1255
+ widgetTitle: 'Widget title',
1256
+ widgetDescription: 'Widget description',
1257
+ datasetName: 'Dataset name',
1258
+ selectDataset: 'Select dataset…',
1259
+ searchDatasets: 'Search datasets…',
1260
+ addDimension: 'Add dimension…',
1261
+ addMeasure: 'Add measure…',
1262
+ searchMembers: 'Search…',
1263
+ },
1264
+ empty: {
1265
+ datasets: 'No datasets found.',
1266
+ dimensions: 'No dimensions selected.',
1267
+ measures: 'No measures selected.',
1268
+ nothingToAdd: 'Nothing left to add.',
1269
+ },
1270
+ help: {
1271
+ dataset: 'The semantic-layer dataset this widget binds to (ADR-0021).',
1272
+ dimensions: 'Group/split the values by these dataset dimensions.',
1273
+ dimensionsPivot: 'Group/split fields. The last dimension spreads across as columns.',
1274
+ values: 'Measure(s) from the dataset to display (at least one).',
1275
+ },
1276
+ action: {
1277
+ add: 'Add',
1278
+ remove: 'Remove {{name}}',
1279
+ },
1280
+ refresh: {
1281
+ off: 'Off',
1282
+ every30s: 'Every 30s',
1283
+ every1m: 'Every 1 min',
1284
+ every5m: 'Every 5 min',
1285
+ every15m: 'Every 15 min',
1286
+ every30m: 'Every 30 min',
1287
+ every1h: 'Every 1 hour',
1288
+ },
1289
+ themeOption: {
1290
+ light: 'Light',
1291
+ dark: 'Dark',
1292
+ auto: 'Auto',
1293
+ },
1294
+ widgetType: {
1295
+ metric: 'Metric',
1296
+ bar: 'Bar Chart',
1297
+ horizontalBar: 'Horizontal Bar',
1298
+ line: 'Line Chart',
1299
+ pie: 'Pie Chart',
1300
+ donut: 'Donut Chart',
1301
+ area: 'Area Chart',
1302
+ scatter: 'Scatter Plot',
1303
+ funnel: 'Funnel',
1304
+ table: 'Table',
1305
+ pivot: 'Pivot Table',
1306
+ },
1307
+ color: {
1308
+ default: 'Default',
1309
+ blue: 'Blue',
1310
+ teal: 'Teal',
1311
+ orange: 'Orange',
1312
+ purple: 'Purple',
1313
+ success: 'Success',
1314
+ warning: 'Warning',
1315
+ danger: 'Danger',
1316
+ },
1317
+ },
1228
1318
  trend: {
1229
1319
  vsLastQuarter: 'vs last quarter',
1230
1320
  vsLastMonth: 'vs last month',
@@ -1257,24 +1347,6 @@ const en = {
1257
1347
  },
1258
1348
  },
1259
1349
  },
1260
- configPanel: {
1261
- save: 'Save',
1262
- discard: 'Discard',
1263
- close: 'Close',
1264
- layout: 'Layout',
1265
- columns: 'Columns',
1266
- gap: 'Gap',
1267
- rowHeight: 'Row height',
1268
- data: 'Data',
1269
- refreshInterval: 'Refresh interval',
1270
- appearance: 'Appearance',
1271
- title: 'Title',
1272
- showDescription: 'Show description',
1273
- theme: 'Theme',
1274
- configuration: 'Configuration',
1275
- general: 'General',
1276
- advanced: 'Advanced',
1277
- },
1278
1350
  appDesigner: {
1279
1351
  createApp: 'Create Application',
1280
1352
  editApp: 'Edit Application',
@@ -1325,8 +1397,6 @@ const en = {
1325
1397
  showSort: 'Show Sort',
1326
1398
  appearance: 'Appearance',
1327
1399
  rowHeight: 'Row Height',
1328
- stripedRows: 'Striped Rows',
1329
- bordered: 'Bordered',
1330
1400
  livePreview: 'Live Preview',
1331
1401
  stepBasicDesc: 'Name, title, and layout',
1332
1402
  stepObjectsDesc: 'Select business objects',
@@ -1440,7 +1510,6 @@ const en = {
1440
1510
  unique: 'Unique',
1441
1511
  readOnly: 'Read Only',
1442
1512
  hidden: 'Hidden',
1443
- indexed: 'Indexed',
1444
1513
  externalId: 'External ID',
1445
1514
  trackHistory: 'Track History',
1446
1515
  defaultValue: 'Default Value',
@@ -1624,6 +1693,13 @@ const en = {
1624
1693
  createApp: 'Create New App',
1625
1694
  },
1626
1695
  ai: {
1696
+ pendingDrafts: {
1697
+ count: '{{count}} change(s) are not published yet — users cannot see them.',
1698
+ publish: 'Publish',
1699
+ published: 'All pending changes are live.',
1700
+ failed: 'Publish failed.',
1701
+ publishedWithFindings: 'Published, but the runtime probes reported problems: {{detail}}',
1702
+ },
1627
1703
  usage: {
1628
1704
  title: 'AI usage',
1629
1705
  meterBuild: 'Build',
@@ -1729,6 +1805,11 @@ const en = {
1729
1805
  changesConfirmed: 'Confirmed',
1730
1806
  changesConfirm: 'Confirm',
1731
1807
  changesConfirmHint: 'Reply to confirm or adjust this change.',
1808
+ changesApplying: 'Applying…',
1809
+ changesApplied: 'Applied',
1810
+ changesDrafted: 'Saved as draft',
1811
+ changesFailed: 'Not applied',
1812
+ discussing: 'Discussing: {{target}}',
1732
1813
  // Wording is load-bearing: this is SENT to the agent and must satisfy the
1733
1814
  // cloud confirm gate's English clause `apply (this|the) change`
1734
1815
  // (service-ai-studio confirm-gate.ts APPROVAL_RE). "apply what you just
@@ -1893,64 +1974,18 @@ const en = {
1893
1974
  cannotDeleteMetaView: 'This view is built in and defined in code — it cannot be deleted.',
1894
1975
  expandToPage: 'Open as full page',
1895
1976
  allRecords: 'All Records',
1896
- exitDesignMode: 'Exit Design Mode',
1897
- enterDesignMode: 'Enter Design Mode',
1898
- metadataInspector: 'Metadata Inspector',
1899
- editView: 'Edit View',
1900
- addView: 'Add View',
1901
- designTools: 'Design tools',
1902
1977
  new: 'New',
1903
1978
  import: 'Import',
1904
1979
  importTitle: 'Import from CSV',
1905
1980
  importedToast: 'Imported {{count}} row(s).',
1906
1981
  importedWithSkipped: 'Imported {{ok}} row(s); skipped {{skipped}}.',
1907
1982
  configureView: 'Configure View',
1908
- closePanel: 'Close panel',
1909
- showAdvancedSettings: 'Show advanced settings',
1910
- showFewerSettings: 'Show fewer settings',
1911
- page: 'Page',
1912
- pageConfigHint: 'Toolbar, navigation & view shell settings',
1913
- listConfigHint: 'Data rendering, columns & appearance for this list type',
1914
- general: 'General',
1915
- generalHint: 'View title, description, and type',
1916
1983
  toolbar: 'Toolbar',
1917
- toolbarHint: 'Search, filter, sort, group, and density toggles',
1918
1984
  toolbarEnabledCount: '{{count}} of {{total}} enabled',
1919
- navigationSection: 'Navigation',
1920
- navigationHint: 'Row click behavior and detail view settings',
1921
- records: 'Records',
1922
- recordsHint: 'Selection mode, add record, and inline editing',
1923
- exportPrint: 'Export & Print',
1924
- exportPrintHint: 'Export formats, printing, and record count display',
1925
- showAllFields: 'Show All',
1926
- hideAllFields: 'Hide All',
1927
1985
  searchFields: 'Search fields…',
1928
1986
  title: 'Title',
1929
- description: 'Description',
1930
- data: 'Data',
1931
- source: 'Source',
1932
- columns: 'Columns',
1933
- filterBy: 'Filter by',
1934
- sortBy: 'Sort by',
1935
- appearance: 'Appearance',
1936
- showDescription: 'Show description',
1937
1987
  viewType: 'View type',
1938
- userFilters: 'User filters',
1939
- enableSearch: 'Enable search',
1940
- enableFilter: 'Enable filter',
1941
- enableSort: 'Enable sort',
1942
- enableHideFields: 'Enable hide fields',
1943
- enableGroup: 'Enable group',
1944
- enableColor: 'Enable color',
1945
- enableDensity: 'Enable density',
1946
- userActions: 'User actions',
1947
- addRecordViaForm: 'Add records through a form',
1948
- advanced: 'Advanced',
1949
- allowExport: 'Allow export',
1950
1988
  recordCount: '{{count}} records',
1951
- noDescription: 'No description',
1952
- none: 'None',
1953
- columnsConfigured: '{{count}} columns',
1954
1989
  save: 'Save',
1955
1990
  discard: 'Discard',
1956
1991
  createView: 'Create View',
@@ -1987,7 +2022,6 @@ const en = {
1987
2022
  viewNameHelp: 'Machine key (snake_case). Auto-filled from the title — edit if you like.',
1988
2023
  viewNameRequired: 'Enter a key (lowercase letters, numbers, underscore). Not auto-filled for non-Latin titles.',
1989
2024
  viewNameInvalid: 'Use lowercase letters, numbers and underscores; start with a letter or underscore.',
1990
- typeOptions: 'Type Options',
1991
2025
  groupByField: 'Group by field',
1992
2026
  groupByFieldHelp: 'The kanban groups records into columns by this field\'s values.',
1993
2027
  startDateField: 'Start date field',
@@ -2002,7 +2036,6 @@ const en = {
2002
2036
  longitudeFieldHelp: 'Field providing the longitude coordinate (geo fields only).',
2003
2037
  imageField: 'Image field',
2004
2038
  imageFieldHelp: 'The gallery cover comes from this image or attachment field.',
2005
- dateField: 'Date field',
2006
2039
  selectField: 'Select field…',
2007
2040
  selectOption: 'Select…',
2008
2041
  noEligibleFieldForType: 'No eligible field of this type. Add one to the object first.',
@@ -2019,82 +2052,11 @@ const en = {
2019
2052
  xAxisFieldHelp: 'The categorical or time dimension.',
2020
2053
  yAxisField: 'Y-axis field',
2021
2054
  yAxisFieldHelp: 'The numeric field to aggregate.',
2022
- gridOptionsHint: 'Grid view uses the columns configured above.',
2023
2055
  groupBy: 'Group by',
2024
- prefixField: 'Prefix field',
2025
- fields: 'Fields',
2026
- fieldsVisible: '{{count}} visible',
2027
- sortsCount: '{{count}} sorts',
2028
- filtersCount: '{{count}} filters',
2029
2056
  endDateField: 'End date field',
2030
- color: 'Color',
2031
- fieldTextColor: 'Field text color',
2032
- rowHeight: 'Row height',
2033
- wrapHeaders: 'Wrap headers',
2034
- showFieldDescriptions: 'Show field descriptions',
2035
- collapseAllByDefault: 'Collapse all by default',
2036
- striped: 'Striped rows',
2037
- bordered: 'Bordered cells',
2038
- inlineEdit: 'Edit records inline',
2039
- addDeleteRecordsInline: 'Add/delete records inline',
2040
- clickIntoRecordDetails: 'Click into record details',
2041
- navigationMode: 'Navigation mode',
2042
- navigationWidth: 'Navigation width',
2043
- navigationWidthHint: 'Available for drawer, modal, and split navigation modes',
2044
- openNewTab: 'Open in new tab',
2045
- openNewTabHint: 'Available for page and new window navigation modes',
2046
- selectionMode: 'Selection mode',
2047
- selectionNone: 'None',
2048
- selectionSingle: 'Single',
2049
- selectionMultiple: 'Multiple',
2050
- pageSize: 'Page size',
2051
- pageSizeOptions: 'Page size options',
2052
- exportFormats: 'Export formats',
2053
- exportMaxRecords: 'Max records',
2054
- exportIncludeHeaders: 'Include headers',
2055
- exportFileNamePrefix: 'File name prefix',
2056
- searchableFields: 'Searchable fields',
2057
- filterableFields: 'Filterable fields',
2058
- resizableColumns: 'Resizable columns',
2059
- densityCompact: 'Compact',
2060
- densityComfortable: 'Comfortable',
2061
- densitySpacious: 'Spacious',
2062
- densityMode: 'Density mode',
2063
- hiddenFields: 'Hidden fields',
2064
- rowActions: 'Row actions',
2065
- bulkActions: 'Bulk actions',
2066
- sharing: 'Sharing',
2067
- sharingEnabled: 'Enable sharing',
2068
- sharingVisibility: 'Visibility',
2069
- addRecordEnabled: 'Enable add record',
2070
- addRecordPosition: 'Position',
2071
- addRecordMode: 'Mode',
2072
- addRecordFormView: 'Form view',
2073
- conditionalFormatting: 'Conditional formatting',
2074
- addRule: 'Add rule',
2075
- quickFilters: 'Quick filters',
2076
- addQuickFilter: 'Add quick filter',
2077
- ufElements: 'Elements',
2078
- ufDropdown: 'Dropdown',
2079
2057
  ufTabs: 'Tabs',
2080
- ufToggle: 'Toggle',
2081
2058
  ufAddField: '+ Add filter field…',
2082
- ufNoFields: 'No fields available',
2083
- ufAddTab: '+ Add tab',
2084
- ufTabLabel: 'Label',
2085
2059
  ufShowAllRecords: 'Show "All records" tab',
2086
- ufAllowAddTab: 'Allow adding tabs',
2087
- showRecordCount: 'Show record count',
2088
- allowPrinting: 'Allow printing',
2089
- virtualScroll: 'Virtual scroll',
2090
- emptyStateTitle: 'Empty state title',
2091
- emptyStateMessage: 'Empty state message',
2092
- emptyStateIcon: 'Empty state icon',
2093
- ariaLabel: 'ARIA label',
2094
- ariaDescribedBy: 'ARIA described by',
2095
- ariaLive: 'ARIA live',
2096
- accessibility: 'Accessibility',
2097
- viewTabs: 'View Tabs',
2098
2060
  },
2099
2061
  localeSwitcher: {
2100
2062
  label: 'Language',
@@ -2177,7 +2139,7 @@ const en = {
2177
2139
  submitButton: 'Send Reset Link',
2178
2140
  submittingButton: 'Sending…',
2179
2141
  successTitle: 'Check your email',
2180
- successDescription: "We've sent a password reset link to {{email}}. Please check your inbox.",
2142
+ successDescription: "We've sent a password reset link to {email}. Please check your inbox.",
2181
2143
  backToSignInText: 'Back to sign in',
2182
2144
  rememberPasswordText: 'Remember your password?',
2183
2145
  signInText: 'Sign in',
@@ -2500,10 +2462,12 @@ const en = {
2500
2462
  build: {
2501
2463
  title: 'Build an app',
2502
2464
  subtitle: 'Start from scratch — design objects, forms, automations and interfaces.',
2465
+ noCapability: 'Building apps isn\'t available in this workspace — it requires the “Manage Metadata” permission, which your account doesn\'t have.',
2503
2466
  },
2504
2467
  template: {
2505
2468
  title: 'Start with a template',
2506
2469
  subtitle: 'Install a template app from the marketplace and customize it.',
2470
+ marketplaceDisabled: 'This runtime has no app marketplace configured, so there are no templates to install here.',
2507
2471
  },
2508
2472
  open: 'Open',
2509
2473
  stats: {
@@ -2707,6 +2671,11 @@ const en = {
2707
2671
  detailChangedKeys: 'Also changed:',
2708
2672
  confirmNote: 'Publishing releases all {{count}} pending drafts of this package atomically.',
2709
2673
  publishConfirm: 'Publish all',
2674
+ // [objectui#5418] Pre-publish security-posture findings, shown next to
2675
+ // the confirm button so a refusal the door would issue is read BEFORE
2676
+ // the click rather than as a toast after the batch rolled back.
2677
+ securityBlockTitle: 'Publishing will be refused — {{count}} item(s) need a decision first',
2678
+ securityBlockWhere: 'Fix it on the object under Settings → Record sharing, then publish again.',
2710
2679
  },
2711
2680
  // ADR-0045 — the materialized-but-unlisted app banner
2712
2681
  // (UnpublishedAppBar.tsx), sibling of draftBar above.
@@ -2742,21 +2711,6 @@ const en = {
2742
2711
  revertUnavailable: 'Commit store temporarily unreachable — the revert may not have been applied. Reopen this history to check before retrying.',
2743
2712
  },
2744
2713
  },
2745
- renderer: {
2746
- noPageSchema: 'No page schema provided',
2747
- noFormSchema: 'No form schema provided',
2748
- noDashboardSchema: 'No dashboard schema provided',
2749
- pageRendering: 'Page rendering: {{name}}',
2750
- dashboardRendering: 'Dashboard rendering: {{name}}',
2751
- formRenderingMode: 'Form rendering in {{mode}} mode',
2752
- formRenderingFor: 'for record {{id}}',
2753
- createRecord: 'Create Record',
2754
- editRecord: 'Edit Record',
2755
- page: 'Page',
2756
- dashboard: 'Dashboard',
2757
- save: 'Save',
2758
- cancel: 'Cancel',
2759
- },
2760
2714
  actionDialog: {
2761
2715
  title: 'Action Parameters',
2762
2716
  description: 'Please provide the required information to continue.',
@@ -2979,6 +2933,9 @@ const en = {
2979
2933
  declined: 'Invitation declined',
2980
2934
  declineFailed: 'Failed to decline invitation',
2981
2935
  },
2936
+ current: {
2937
+ label: 'Current organization',
2938
+ },
2982
2939
  switcher: {
2983
2940
  label: 'Switch organization',
2984
2941
  groupLabel: 'Working organization',
@@ -3029,52 +2986,6 @@ const en = {
3029
2986
  consentRequired: 'Please accept the privacy policy to continue.',
3030
2987
  rateLimited: 'Please take a moment to review your answers before submitting.',
3031
2988
  redirectBlocked: 'Submission accepted, but the redirect URL was blocked for security.',
3032
- demo: {
3033
- contactTitle: 'Contact us',
3034
- contactDescription: 'Tell us about your project and a sales representative will get back to you within one business day.',
3035
- supportTitle: 'Submit a support request',
3036
- supportDescription: 'Tell us what is going wrong — our team responds within one business day.',
3037
- thankYouSalesTitle: 'Thanks — we received your message!',
3038
- thankYouSalesMessage: 'A sales representative will be in touch within one business day.',
3039
- thankYouSupportTitle: 'Got it — your request is in the queue.',
3040
- thankYouSupportMessage: 'A support engineer will follow up shortly. Save this page if you have more screenshots to add.',
3041
- field: {
3042
- firstName: 'First name',
3043
- lastName: 'Last name',
3044
- email: 'Work email',
3045
- phone: 'Phone',
3046
- jobTitle: 'Job title',
3047
- company: 'Company',
3048
- website: 'Website',
3049
- industry: 'Industry',
3050
- companySize: 'Company size',
3051
- howCanWeHelp: 'How can we help?',
3052
- subject: 'Subject',
3053
- description: 'Description',
3054
- issueType: 'Issue type',
3055
- priority: 'Priority',
3056
- },
3057
- industry: {
3058
- technology: 'Technology',
3059
- software: 'Software / SaaS',
3060
- finance: 'Finance',
3061
- healthcare: 'Healthcare',
3062
- retail: 'Retail',
3063
- other: 'Other',
3064
- },
3065
- issueType: {
3066
- question: 'Question',
3067
- problem: 'Problem',
3068
- bug: 'Bug',
3069
- feature_request: 'Feature request',
3070
- },
3071
- priority: {
3072
- low: 'Low',
3073
- medium: 'Medium',
3074
- high: 'High',
3075
- critical: 'Critical',
3076
- },
3077
- },
3078
2989
  },
3079
2990
  connectAgent: {
3080
2991
  disabled: {
@@ -3188,6 +3099,7 @@ const en = {
3188
3099
  retry: 'Try again',
3189
3100
  errors: {
3190
3101
  expired: 'The request expired before it was approved. Start again.',
3102
+ accessDenied: 'The connection request was denied. Start again.',
3191
3103
  bindFailed: 'Binding failed.',
3192
3104
  deviceCodeFailed: 'Device code request failed.',
3193
3105
  },
@@ -3244,10 +3156,16 @@ const en = {
3244
3156
  installedBadge: 'Installed v{{version}}',
3245
3157
  load: {
3246
3158
  failed: 'Failed to load marketplace',
3247
- failedHint: 'By default this runtime points at the public ObjectStack cloud. Check the runtime is online, or override <code>OS_CLOUD_URL</code> to point at a self-hosted control plane.',
3159
+ failedHintConfigured: 'This runtime reaches the marketplace through the control plane at {{url}}. Check that it is online and reachable from here.',
3160
+ failedHintSameOrigin: 'This runtime serves the marketplace catalog itself. Check that the runtime is online.',
3248
3161
  packageFailed: 'Failed to load package',
3249
3162
  notFound: 'Not found.',
3250
3163
  },
3164
+ disabled: {
3165
+ title: 'App Marketplace is turned off',
3166
+ description: 'This runtime has no marketplace configured, so there is nothing to browse or install from here.',
3167
+ hint: 'That is the expected state when the runtime is started with <code>OS_CLOUD_URL=off</code> (or <code>none</code>, <code>local</code>, <code>disabled</code>). To turn the marketplace on, point <code>OS_CLOUD_URL</code> at a control plane and restart the runtime.',
3168
+ },
3251
3169
  detail: {
3252
3170
  homepage: 'Homepage',
3253
3171
  installedV: 'Installed · v{{version}}',
@@ -3499,12 +3417,19 @@ const en = {
3499
3417
  submittedAgo: 'Submitted {{when}}',
3500
3418
  completedAt: 'Completed {{when}}',
3501
3419
  waitingOn: 'Waiting on',
3420
+ approverNameSeparator: ', ',
3421
+ approverUnstaffed: '{{seat}} (no current holder)',
3502
3422
  history: 'Activity',
3503
3423
  noActions: 'No actions yet.',
3504
3424
  actSubmit: 'Submitted',
3505
3425
  actApprove: 'Approved',
3506
3426
  actReject: 'Rejected',
3507
3427
  actRecall: 'Recalled',
3428
+ overrideActionLabel: 'Override {{action}}',
3429
+ overrideNotice: 'You hold no approver slot on this step. Continuing uses your admin override: it finalises the step immediately, bypassing any approver who has not acted. The decision is recorded as an admin override.',
3430
+ overrideNoticeWho: 'You hold no approver slot on this step. Continuing uses your admin override: it finalises the step immediately and bypasses the approvers who have not acted — {{who}}. The decision is recorded as an admin override.',
3431
+ viaOverrideChip: 'Admin override',
3432
+ viaOverrideHint: 'The actor held no approver slot on this step — admitted by the admin-override path.',
3508
3433
  rawData: 'Raw data (JSON)',
3509
3434
  copy: 'Copy',
3510
3435
  copied: 'Copied',
@@ -3573,10 +3498,15 @@ const en = {
3573
3498
  noResults: 'No results',
3574
3499
  searchField: 'Search {{label}}…',
3575
3500
  enterId: 'Enter {{label}} id',
3501
+ addValue: 'Type a value, press Enter',
3502
+ removeValue: 'Remove {{value}}',
3503
+ rangeStart: 'From',
3504
+ rangeEnd: 'To',
3576
3505
  operators: {
3577
3506
  equals: 'Equals',
3578
3507
  notEquals: 'Does not equal',
3579
3508
  contains: 'Contains',
3509
+ containsCaseInsensitive: 'Contains (ignore case)',
3580
3510
  notContains: 'Does not contain',
3581
3511
  isEmpty: 'Is empty',
3582
3512
  isNotEmpty: 'Is not empty',
@@ -3589,6 +3519,12 @@ const en = {
3589
3519
  between: 'Between',
3590
3520
  in: 'In',
3591
3521
  notIn: 'Not in',
3522
+ startsWith: 'Starts with',
3523
+ endsWith: 'Ends with',
3524
+ isNull: 'Is null',
3525
+ isNotNull: 'Is not null',
3526
+ exists: 'Is set',
3527
+ notExists: 'Is not set',
3592
3528
  },
3593
3529
  },
3594
3530
  sortBuilder: {
@@ -3682,6 +3618,30 @@ const en = {
3682
3618
  wizard: {
3683
3619
  missingRequired: 'Please complete the required fields: {{fields}}',
3684
3620
  },
3621
+ // The screen-flow runner dialog (`app-shell/views/FlowRunner`) — the modal a
3622
+ // `type: 'flow'` action opens when its run pauses at a `screen` node.
3623
+ //
3624
+ // What is deliberately NOT here: the sentence a refused resume shows. That is
3625
+ // the ADR-0112 envelope's own `error.message`, prose the automation engine
3626
+ // composed for a human ("Node 'create_quote' failed: … at most 2 decimal
3627
+ // places"), so it has no fixed catalogue to key against and is passed through
3628
+ // untranslated — the same division `appManagement` states above. The runner
3629
+ // borrows `common.{loading,cancel,close,submit}` for its chrome and
3630
+ // `wizard.missingRequired` for the pre-submit check, which is the same
3631
+ // sentence `plugin-form`'s WizardForm raises.
3632
+ flowRunner: {
3633
+ // Fallback dialog title, used only when the `screen` node declares none.
3634
+ title: 'Input',
3635
+ submitting: 'Submitting…',
3636
+ // The submit label of an `object-form` step: it saves a record AND advances
3637
+ // the run, so it is not the plain `common.submit`.
3638
+ saveAndContinue: 'Save & Continue',
3639
+ // A multi-screen wizard advanced to the next step (not the end of the run).
3640
+ nextStep: 'Saved — next step',
3641
+ // Terminal success, used only when the flow declares no `successMessage`
3642
+ // of its own.
3643
+ completed: 'Flow "{{flow}}" completed',
3644
+ },
3685
3645
  // Console › System › Applications (objectui#4307). The page's OWN chrome —
3686
3646
  // headings, controls, badges and the frames of its toasts.
3687
3647
  //