@object-ui/i18n 16.1.0 → 17.2.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.
- package/CHANGELOG.md +1197 -0
- package/dist/locales/ar.d.ts +841 -2
- package/dist/locales/ar.js +846 -5
- package/dist/locales/de.d.ts +839 -2
- package/dist/locales/de.js +844 -5
- package/dist/locales/en.d.ts +396 -6
- package/dist/locales/en.js +413 -8
- package/dist/locales/es.d.ts +839 -2
- package/dist/locales/es.js +844 -5
- package/dist/locales/fr.d.ts +841 -2
- package/dist/locales/fr.js +846 -5
- package/dist/locales/index.d.ts +7433 -27
- package/dist/locales/ja.d.ts +839 -2
- package/dist/locales/ja.js +844 -5
- package/dist/locales/ko.d.ts +839 -2
- package/dist/locales/ko.js +844 -5
- package/dist/locales/pt.d.ts +841 -2
- package/dist/locales/pt.js +846 -5
- package/dist/locales/ru.d.ts +841 -2
- package/dist/locales/ru.js +846 -5
- package/dist/locales/zh.d.ts +317 -5
- package/dist/locales/zh.js +319 -5
- package/dist/useObjectLabel.d.ts +24 -12
- package/dist/useObjectLabel.js +71 -45
- package/dist/useSafeTranslation.d.ts +2 -0
- package/dist/useSafeTranslation.js +7 -2
- package/package.json +3 -3
package/dist/locales/en.js
CHANGED
|
@@ -89,6 +89,10 @@ const en = {
|
|
|
89
89
|
package: 'Package',
|
|
90
90
|
},
|
|
91
91
|
actions: {
|
|
92
|
+
decisionOutput: {
|
|
93
|
+
help: 'Handed to the flow as a decision output.',
|
|
94
|
+
helpMultiValue: 'Handed to the flow as a decision output. Comma-separate multiple values.',
|
|
95
|
+
},
|
|
92
96
|
resultDialog: {
|
|
93
97
|
defaultTitle: 'Save this value now',
|
|
94
98
|
acknowledge: 'I have saved this',
|
|
@@ -109,6 +113,8 @@ const en = {
|
|
|
109
113
|
type: '{{field}} must be a valid {{type}}',
|
|
110
114
|
},
|
|
111
115
|
form: {
|
|
116
|
+
noPermissionToSave: "You don't have permission to save this record.",
|
|
117
|
+
submitFailed: 'Could not save. Please try again.',
|
|
112
118
|
addItem: 'Add item',
|
|
113
119
|
removeItem: 'Remove item',
|
|
114
120
|
fieldRequired: 'This field is required',
|
|
@@ -120,11 +126,13 @@ const en = {
|
|
|
120
126
|
discardMessage: 'You have unsaved changes. If you close this form now, your edits will be lost.',
|
|
121
127
|
keepEditing: 'Keep editing',
|
|
122
128
|
discard: 'Discard',
|
|
129
|
+
conflictTitle: 'Save conflict',
|
|
130
|
+
conflictMessage: 'This record was changed by someone else while you were editing. Overwriting will replace their changes with yours.',
|
|
131
|
+
conflictLatestVersion: 'Their save: {{time}}',
|
|
132
|
+
conflictOverwrite: 'Overwrite',
|
|
123
133
|
stepOf: 'Step {{current}} of {{total}}',
|
|
124
134
|
createTitle: 'Create {{object}}',
|
|
125
135
|
editTitle: 'Edit {{object}}',
|
|
126
|
-
createDescription: 'Add a new {{object}} to your database.',
|
|
127
|
-
editDescription: 'Update details for {{object}}',
|
|
128
136
|
saveRecord: 'Save',
|
|
129
137
|
create: 'Create',
|
|
130
138
|
update: 'Update',
|
|
@@ -136,11 +144,67 @@ const en = {
|
|
|
136
144
|
relativeDate: {
|
|
137
145
|
overdue: 'Overdue {{count}}d',
|
|
138
146
|
},
|
|
147
|
+
file: {
|
|
148
|
+
dragDropHere: 'Drag & drop files here',
|
|
149
|
+
dropFilesHere: 'Drop files here',
|
|
150
|
+
browseHint: 'or click to browse',
|
|
151
|
+
browseHintCamera: 'or click to browse • use the camera button below',
|
|
152
|
+
takePhoto: 'Take photo',
|
|
153
|
+
takeSelfie: 'Take selfie',
|
|
154
|
+
cameraCapture: 'Camera capture',
|
|
155
|
+
uploading: 'Uploading…',
|
|
156
|
+
uploadingPct: 'Uploading… ({{pct}}%)',
|
|
157
|
+
fileFallback: 'File',
|
|
158
|
+
upload: 'Upload',
|
|
159
|
+
remove: 'Remove {{name}}',
|
|
160
|
+
exceedsMaxSize: '"{{name}}" exceeds max size ({{max}} MB)',
|
|
161
|
+
uploadFailed: 'Failed to upload "{{name}}": {{error}}',
|
|
162
|
+
},
|
|
163
|
+
image: {
|
|
164
|
+
upload: 'Upload image',
|
|
165
|
+
addMore: 'Add more images',
|
|
166
|
+
uploading: 'Uploading…',
|
|
167
|
+
imageAlt: 'Image {{index}}',
|
|
168
|
+
crop: 'Crop image {{index}}',
|
|
169
|
+
remove: 'Remove image {{index}}',
|
|
170
|
+
enlarge: 'Enlarge {{name}}',
|
|
171
|
+
preview: 'Image preview',
|
|
172
|
+
previous: 'Previous image',
|
|
173
|
+
next: 'Next image',
|
|
174
|
+
counter: '{{current}} / {{total}}',
|
|
175
|
+
},
|
|
139
176
|
richText: {
|
|
140
177
|
format: 'Format: {{format}}',
|
|
141
178
|
basicEditorHint: 'Rich text editor (basic)',
|
|
142
179
|
placeholder: 'Enter text...',
|
|
143
180
|
},
|
|
181
|
+
objectRef: {
|
|
182
|
+
loading: 'Loading objects…',
|
|
183
|
+
placeholder: 'Select an object',
|
|
184
|
+
search: 'Search objects…',
|
|
185
|
+
empty: 'No objects found',
|
|
186
|
+
},
|
|
187
|
+
recipient: {
|
|
188
|
+
selectTypeFirst: 'Select a recipient type first.',
|
|
189
|
+
loading: 'Loading…',
|
|
190
|
+
search: 'Search…',
|
|
191
|
+
empty: 'No matches',
|
|
192
|
+
select: 'Select a recipient',
|
|
193
|
+
selectUser: 'Select a user',
|
|
194
|
+
selectTeam: 'Select a team',
|
|
195
|
+
selectBusinessUnit: 'Select a business unit',
|
|
196
|
+
selectPosition: 'Select a position',
|
|
197
|
+
selectUnitAndSubordinates: 'Select a business unit',
|
|
198
|
+
},
|
|
199
|
+
filterCondition: {
|
|
200
|
+
selectObjectFirst: 'Select an object first.',
|
|
201
|
+
noCriteria: 'No criteria — this rule shares nothing',
|
|
202
|
+
criteriaRequired: 'Add at least one condition. A rule with no criteria would share every record, so it cannot be saved.',
|
|
203
|
+
invalidJson: 'Invalid JSON — the rule will match no records until fixed.',
|
|
204
|
+
jsonOnly: 'This criteria can only be edited as JSON',
|
|
205
|
+
editAsJson: 'Edit as JSON',
|
|
206
|
+
useVisualBuilder: 'Use visual builder',
|
|
207
|
+
},
|
|
144
208
|
},
|
|
145
209
|
table: {
|
|
146
210
|
rowsPerPage: 'Rows per page',
|
|
@@ -215,9 +279,12 @@ const en = {
|
|
|
215
279
|
previewDescription: 'Review data before importing.',
|
|
216
280
|
dragDrop: 'Drag & drop a CSV or Excel file here, or click to browse',
|
|
217
281
|
browseFiles: 'Browse Files',
|
|
282
|
+
downloadTemplate: 'Download template',
|
|
283
|
+
downloadTemplateHint: 'Get a CSV with the right columns (required fields marked *).',
|
|
284
|
+
templateFileName: '{{object}}-import-template',
|
|
218
285
|
parsing: 'Parsing…',
|
|
219
286
|
pasteHint: 'or paste (Ctrl/⌘+V) rows copied from Excel or Google Sheets',
|
|
220
|
-
legacyXls:
|
|
287
|
+
legacyXls: 'Legacy .xls files aren\'t supported — please re-save as .xlsx.',
|
|
221
288
|
unsupportedFile: 'Unsupported file type. Use CSV, TSV, or Excel (.xlsx).',
|
|
222
289
|
parseFailed: 'Could not read this file. Please check the format and try again.',
|
|
223
290
|
fileNeedsHeader: 'File must contain a header row and at least one data row.',
|
|
@@ -238,6 +305,13 @@ const en = {
|
|
|
238
305
|
csvColumn: 'Column',
|
|
239
306
|
mapsTo: 'Maps To',
|
|
240
307
|
typeMismatch: 'Looks like {{type}}',
|
|
308
|
+
autoMatched: 'Auto-matched',
|
|
309
|
+
autoMatchedSummary: 'Auto-matched {{count}} column(s) — review and adjust below.',
|
|
310
|
+
confidence: {
|
|
311
|
+
high: 'High confidence',
|
|
312
|
+
medium: 'Medium confidence',
|
|
313
|
+
low: 'Low confidence',
|
|
314
|
+
},
|
|
241
315
|
type: {
|
|
242
316
|
number: 'Number',
|
|
243
317
|
boolean: 'Boolean',
|
|
@@ -255,25 +329,96 @@ const en = {
|
|
|
255
329
|
clickToFix: '— click a highlighted cell to fix it inline.',
|
|
256
330
|
showingRows: 'Showing {{shown}} of {{total}} rows',
|
|
257
331
|
importing: 'Importing… {{progress}}%',
|
|
332
|
+
asyncQueued: 'Queued — preparing to import…',
|
|
333
|
+
asyncProcessing: 'Importing {{processed}} of {{total}} rows… {{progress}}%',
|
|
334
|
+
asyncLargeHint: 'This file is large, so it will be imported in the background.',
|
|
335
|
+
largeSampleNotice: 'Previewing the first {{shown}} of {{total}} rows.',
|
|
336
|
+
cancelImport: 'Cancel import',
|
|
337
|
+
importCancelled: 'Import cancelled',
|
|
338
|
+
resultsTruncated: 'Showing the first {{count}} row results (of {{total}}).',
|
|
258
339
|
importComplete: 'Import Complete',
|
|
259
340
|
imported: '{{count}} imported',
|
|
341
|
+
createdCount: '{{count}} created',
|
|
342
|
+
updatedCount: '{{count}} updated',
|
|
260
343
|
skippedCount: '{{count}} skipped',
|
|
261
344
|
moreErrors: '…and {{count}} more errors',
|
|
345
|
+
downloadFailed: 'Download failed rows',
|
|
346
|
+
options: 'Import options',
|
|
347
|
+
writeMode: 'When a row matches an existing record',
|
|
348
|
+
writeModeOpt: {
|
|
349
|
+
insert: 'Always create new',
|
|
350
|
+
update: 'Update existing (skip if no match)',
|
|
351
|
+
upsert: 'Update if matched, else create',
|
|
352
|
+
},
|
|
353
|
+
matchFields: 'Match on',
|
|
354
|
+
matchFieldsPlaceholder: 'Choose match field(s)…',
|
|
355
|
+
matchFieldsHint: 'Rows are matched to existing records by these field(s).',
|
|
356
|
+
needMatchFields: 'Select at least one field to match on.',
|
|
357
|
+
matchOnlyField: '(match only)',
|
|
358
|
+
optCreateOptions: 'Keep unknown option values',
|
|
359
|
+
optRunAutomations: 'Run automations & triggers',
|
|
360
|
+
optTreatHistorical: 'Import as historical data',
|
|
361
|
+
optTreatHistoricalHint: '(import completed records as-is — skip state-machine checks and keep their original timestamps & author instead of stamping now)',
|
|
362
|
+
optSkipBlankKey: 'Skip rows with a blank match value',
|
|
363
|
+
optBackground: 'Import in the background',
|
|
364
|
+
optBackgroundHint: '(runs as an undoable job)',
|
|
365
|
+
validate: 'Validate data',
|
|
366
|
+
validating: 'Validating…',
|
|
367
|
+
validateHint: 'Check every row against the server before importing.',
|
|
368
|
+
validatePassed: 'All {{ok}} rows are valid.',
|
|
369
|
+
validateFailed: '{{ok}} valid, {{errors}} with errors.',
|
|
370
|
+
errorRowPrefix: 'Row {{row}}: ',
|
|
371
|
+
referenceNotFound: 'No matching record for "{{value}}"',
|
|
372
|
+
referenceAmbiguous: '"{{value}}" matches more than one record — use a unique value or the record id',
|
|
373
|
+
invalidBoolean: '"{{value}}" is not a valid true/false value',
|
|
374
|
+
invalidNumber: '"{{value}}" is not a valid number',
|
|
375
|
+
invalidDate: '"{{value}}" is not a valid date',
|
|
376
|
+
invalidOption: '"{{value}}" is not one of the allowed options',
|
|
377
|
+
requiredValue: 'This field is required',
|
|
378
|
+
matchAmbiguous: 'Matches more than one existing record — use a unique value or the record id',
|
|
379
|
+
history: 'History',
|
|
380
|
+
historyBack: 'Back to import',
|
|
381
|
+
historyDescription: 'Recent imports for this object.',
|
|
382
|
+
historyHint: 'Background import jobs, newest first.',
|
|
383
|
+
historyRefresh: 'Refresh',
|
|
384
|
+
historyLoading: 'Loading…',
|
|
385
|
+
historyEmpty: 'No imports yet.',
|
|
386
|
+
historyUnsupported: 'Import history isn’t available for this data source.',
|
|
387
|
+
historyColStatus: 'Status',
|
|
388
|
+
historyColRows: 'Rows',
|
|
389
|
+
historyColResult: 'Result',
|
|
390
|
+
historyColTime: 'When',
|
|
391
|
+
errorCount: '{{count}} errors',
|
|
392
|
+
undoImport: 'Undo import',
|
|
393
|
+
undoing: 'Undoing…',
|
|
394
|
+
undoConfirm: 'Undo this import? Records it created will be deleted and records it updated will be restored to their previous values.',
|
|
395
|
+
reverted: 'Undone',
|
|
396
|
+
jobStatus: {
|
|
397
|
+
pending: 'Pending',
|
|
398
|
+
running: 'Running',
|
|
399
|
+
succeeded: 'Succeeded',
|
|
400
|
+
failed: 'Failed',
|
|
401
|
+
cancelled: 'Cancelled',
|
|
402
|
+
},
|
|
262
403
|
cancel: 'Cancel',
|
|
263
404
|
back: 'Back',
|
|
264
405
|
next: 'Next',
|
|
265
406
|
close: 'Close',
|
|
266
407
|
importNRows: 'Import {{count}} Rows',
|
|
267
408
|
importingProgress: 'Importing…',
|
|
268
|
-
requiredMark: '*',
|
|
269
409
|
required: 'Required',
|
|
270
410
|
invalidType: 'Invalid {{type}}',
|
|
271
|
-
legacyReferenceBlocked: 'Import blocked: {{fields}} are relation fields that need the server import route to resolve names into record IDs, and this connection doesn
|
|
411
|
+
legacyReferenceBlocked: 'Import blocked: {{fields}} are relation fields that need the server import route to resolve names into record IDs, and this connection doesn’t support it. Importing them as plain text would corrupt the data. Upgrade the backend/client, or unmap these columns and import them separately.',
|
|
412
|
+
missingRequiredHint: 'Can’t continue — required field(s) not mapped: {{fields}}. Add a matching column to your file, or go back and upload one that includes it.',
|
|
413
|
+
legacyFallbackNotice: 'Imported via a compatibility fallback: this connection doesn’t support the server import route, so values were saved as text without server-side type coercion. Upgrade the backend/client for full import support (type coercion and relation lookups).',
|
|
414
|
+
notAllowed: 'This object is not open for import.',
|
|
415
|
+
requiredMark: '*',
|
|
272
416
|
},
|
|
273
417
|
bulk: {
|
|
274
418
|
confirmDefault: 'This will apply to {{count}} record(s).',
|
|
275
419
|
overLimit: 'Selection ({{count}}) exceeds the action limit ({{limit}}). Reduce the selection to proceed.',
|
|
276
420
|
affectedRecords: 'Affected records ({{count}}):',
|
|
421
|
+
skippedIneligible: '{{count}} selected record(s) are not eligible for this action and will be skipped.',
|
|
277
422
|
rowFallback: 'Row {{index}}',
|
|
278
423
|
andMore: '\u2026 and {{count}} more',
|
|
279
424
|
processed: '{{count}} / {{total}} processed',
|
|
@@ -318,6 +463,8 @@ const en = {
|
|
|
318
463
|
filterRecords: 'Filter Records',
|
|
319
464
|
sort: 'Sort',
|
|
320
465
|
sortRecords: 'Sort Records',
|
|
466
|
+
sortByIdSuffix: '(by ID)',
|
|
467
|
+
sortRelationalHint: 'Columns that link to another record are not listed: they can only be sorted by the stored ID, not by the name shown in the cell. To sort by that name, add a formula field holding it.',
|
|
321
468
|
group: 'Group',
|
|
322
469
|
groupBy: 'Group By',
|
|
323
470
|
export: 'Export',
|
|
@@ -336,6 +483,12 @@ const en = {
|
|
|
336
483
|
noMatchesMessage: 'No records match your current filters or search. Try adjusting or clearing them.',
|
|
337
484
|
loadErrorTitle: 'Couldn\u2019t load records',
|
|
338
485
|
loadErrorMessage: 'Something went wrong while loading this data. Check your connection and try again.',
|
|
486
|
+
loadErrorForbiddenTitle: 'You don\u2019t have access',
|
|
487
|
+
loadErrorForbiddenMessage: 'You don\u2019t have permission to view these records. Contact your administrator if you think you should have access.',
|
|
488
|
+
loadErrorUnauthorizedTitle: 'Sign in required',
|
|
489
|
+
loadErrorUnauthorizedMessage: 'Your session has expired or you are signed out. Sign in again to view these records.',
|
|
490
|
+
loadErrorRejectedTitle: 'This view’s query was rejected',
|
|
491
|
+
loadErrorRejectedMessage: 'The server could not process this view’s filter or query options. Clearing the filters usually fixes it; if the view is saved this way, an administrator needs to correct it.',
|
|
339
492
|
retry: 'Retry',
|
|
340
493
|
managedBy: {
|
|
341
494
|
system: {
|
|
@@ -411,6 +564,7 @@ const en = {
|
|
|
411
564
|
deleteColumn: 'Delete column',
|
|
412
565
|
noCards: 'No cards',
|
|
413
566
|
cardTitlePlaceholder: 'Enter card title...',
|
|
567
|
+
uncategorized: 'Uncategorized',
|
|
414
568
|
},
|
|
415
569
|
timeline: {
|
|
416
570
|
bucket: {
|
|
@@ -562,9 +716,18 @@ const en = {
|
|
|
562
716
|
editInlineHint: 'Double-click to edit',
|
|
563
717
|
lockedByApproval: 'Locked for approval',
|
|
564
718
|
lockedTooltip: 'This record has a pending approval request; editing is locked',
|
|
719
|
+
writeStrippedTitle: 'Some fields were not saved',
|
|
720
|
+
writeStrippedReadonly: 'Read-only, so it was not saved: {{fields}}',
|
|
721
|
+
writeStrippedByState: "Not editable in this record's current state, so it was not saved: {{fields}}",
|
|
722
|
+
approvalPendingEditable: 'In approval · editable',
|
|
723
|
+
approvalPendingTooltip: 'This record has a pending approval request; this step still allows editing',
|
|
724
|
+
approvalProgress: 'Approvals — {{got}} of {{need}}',
|
|
725
|
+
approvalProgressGroups: 'Sign-off — {{got}} of {{need}} groups',
|
|
726
|
+
approvalProgressLabel: 'Approval progress',
|
|
565
727
|
cancelApproval: 'Recall approval',
|
|
566
728
|
cancelApprovalInFlight: 'Recalling…',
|
|
567
729
|
cancelApprovalTooltip: 'Recall the pending approval request to unlock this record',
|
|
730
|
+
cancelApprovalTooltipUnlocked: 'Recall the pending approval request',
|
|
568
731
|
cancelApprovalFailed: 'Failed to recall approval',
|
|
569
732
|
cancelApprovalUnavailable: 'Recalling approvals is not supported on this data source',
|
|
570
733
|
linkCopied: 'Link copied to clipboard',
|
|
@@ -651,6 +814,18 @@ const en = {
|
|
|
651
814
|
attachmentCount: '{{count}} attachment',
|
|
652
815
|
attachmentCountPlural: '{{count}} attachments',
|
|
653
816
|
removeAttachment: 'Remove attachment',
|
|
817
|
+
// Record Attachments panel (enable.files, objectstack#4358)
|
|
818
|
+
attachments: 'Attachments',
|
|
819
|
+
uploadAttachment: 'Upload',
|
|
820
|
+
loadingAttachments: 'Loading attachments…',
|
|
821
|
+
noAttachments: 'No attachments yet. Upload a file to get started.',
|
|
822
|
+
downloadAttachment: 'Download',
|
|
823
|
+
deleteAttachment: 'Delete attachment',
|
|
824
|
+
attachmentDeleteDenied: 'Only the uploader or someone who can edit this record may delete this attachment.',
|
|
825
|
+
attachmentParentAccessDenied: "You don't have access to attach files to this record.",
|
|
826
|
+
attachmentDownloadDenied: "You don't have access to download this attachment.",
|
|
827
|
+
attachmentAuthRequired: 'Please sign in to download this attachment.',
|
|
828
|
+
attachmentPermissionDenied: "You don't have permission to do that.",
|
|
654
829
|
// Diff
|
|
655
830
|
unifiedDiff: 'Unified diff',
|
|
656
831
|
sideBySideDiff: 'Side-by-side diff',
|
|
@@ -1074,6 +1249,7 @@ const en = {
|
|
|
1074
1249
|
navTypeGroup: 'Group',
|
|
1075
1250
|
navTypeSeparator: 'Separator',
|
|
1076
1251
|
navTypeAction: 'Action',
|
|
1252
|
+
navTypeComponent: 'Component',
|
|
1077
1253
|
navEditIcon: 'Edit icon',
|
|
1078
1254
|
navToggleVisible: 'Toggle visibility',
|
|
1079
1255
|
navHidden: 'Hidden',
|
|
@@ -1190,6 +1366,24 @@ const en = {
|
|
|
1190
1366
|
dragToReorder: 'Drag to reorder',
|
|
1191
1367
|
favorites: 'Favorites',
|
|
1192
1368
|
},
|
|
1369
|
+
settingsHub: {
|
|
1370
|
+
title: 'Settings',
|
|
1371
|
+
subtitle: 'Configure your workspace, integrations, and feature flags.',
|
|
1372
|
+
loadError: 'Failed to load settings',
|
|
1373
|
+
empty: 'No settings registered. Plugins can register settings manifests via the SettingsService.',
|
|
1374
|
+
settingsCount: '{{n}} settings',
|
|
1375
|
+
beta: 'Beta',
|
|
1376
|
+
// Section headers, keyed by the manifest `category` value. Unknown
|
|
1377
|
+
// (plugin-authored) categories fall back to the literal category string.
|
|
1378
|
+
categories: {
|
|
1379
|
+
Workspace: 'Workspace',
|
|
1380
|
+
Communication: 'Communication',
|
|
1381
|
+
Security: 'Security',
|
|
1382
|
+
Infrastructure: 'Infrastructure',
|
|
1383
|
+
Beta: 'Beta',
|
|
1384
|
+
Other: 'Other',
|
|
1385
|
+
},
|
|
1386
|
+
},
|
|
1193
1387
|
loadingSteps: {
|
|
1194
1388
|
connecting: 'Connecting to data source',
|
|
1195
1389
|
loadingConfig: 'Loading configuration',
|
|
@@ -1348,6 +1542,26 @@ const en = {
|
|
|
1348
1542
|
planApproveMessage: 'Looks good — build it as proposed.',
|
|
1349
1543
|
planApproveDefaultsMessage: 'Build it with your best assumptions; use sensible defaults for the open questions.',
|
|
1350
1544
|
planAnswerMessage: 'For "{{question}}", go with: {{option}}.',
|
|
1545
|
+
changesTitle: 'Confirm changes',
|
|
1546
|
+
changesConfirmed: 'Confirmed',
|
|
1547
|
+
changesConfirm: 'Confirm',
|
|
1548
|
+
changesConfirmHint: 'Reply to confirm or adjust this change.',
|
|
1549
|
+
// Wording is load-bearing: this is SENT to the agent and must satisfy the
|
|
1550
|
+
// cloud confirm gate's English clause `apply (this|the) change`
|
|
1551
|
+
// (service-ai-studio confirm-gate.ts APPROVAL_RE). "apply what you just
|
|
1552
|
+
// proposed" did NOT match, so the button was inert. Singular "the change"
|
|
1553
|
+
// so it still matches if the gate ever adds a word boundary.
|
|
1554
|
+
changesConfirmMessage: 'Confirm — apply the change you just proposed.',
|
|
1555
|
+
changeVerb: {
|
|
1556
|
+
createObject: 'Create object',
|
|
1557
|
+
addField: 'Add field',
|
|
1558
|
+
modifyField: 'Modify field',
|
|
1559
|
+
deleteField: 'Delete field',
|
|
1560
|
+
createMetadata: 'Create',
|
|
1561
|
+
updateMetadata: 'Modify',
|
|
1562
|
+
createSeed: 'Generate sample data',
|
|
1563
|
+
createPackage: 'Create app package',
|
|
1564
|
+
},
|
|
1351
1565
|
justNow: 'just now',
|
|
1352
1566
|
minutesAgo: '{{count}}m ago',
|
|
1353
1567
|
hoursAgo: '{{count}}h ago',
|
|
@@ -1786,6 +2000,59 @@ const en = {
|
|
|
1786
2000
|
shell: {
|
|
1787
2001
|
tenantHostHint: 'You are signing in to this workspace',
|
|
1788
2002
|
},
|
|
2003
|
+
// These were previously supplied only as inline `defaultValue:` args at the
|
|
2004
|
+
// SetPasswordPage call sites, so `zh` was the only pack that could carry a
|
|
2005
|
+
// translation. Owning them here makes the page translatable everywhere.
|
|
2006
|
+
setPassword: {
|
|
2007
|
+
title: 'Set a recovery password',
|
|
2008
|
+
description: 'You signed in via single sign-on. Set a local password so you can still sign in to this environment directly if SSO ever becomes unavailable.',
|
|
2009
|
+
email: 'Email',
|
|
2010
|
+
newPassword: 'New password',
|
|
2011
|
+
confirmPassword: 'Confirm password',
|
|
2012
|
+
submit: 'Set password',
|
|
2013
|
+
submitting: 'Saving…',
|
|
2014
|
+
success: 'Local password set',
|
|
2015
|
+
failed: 'Could not set password',
|
|
2016
|
+
passwordsMismatch: 'Passwords do not match',
|
|
2017
|
+
noSession: 'Your session has expired.',
|
|
2018
|
+
backToSignIn: 'Sign in again',
|
|
2019
|
+
},
|
|
2020
|
+
layout: {
|
|
2021
|
+
headline: 'Build powerful business applications, faster.',
|
|
2022
|
+
subhead: 'The universal platform for enterprise data management, workflows, and analytics.',
|
|
2023
|
+
},
|
|
2024
|
+
// ADR-0069 full-screen remediation gate. A user hitting this cannot reach
|
|
2025
|
+
// the rest of the app until they finish, so it must read in their language.
|
|
2026
|
+
remediation: {
|
|
2027
|
+
signOut: 'Sign out instead',
|
|
2028
|
+
password: {
|
|
2029
|
+
title: 'Your password has expired',
|
|
2030
|
+
fallbackMessage: 'Please set a new password to continue.',
|
|
2031
|
+
current: 'Current password',
|
|
2032
|
+
next: 'New password',
|
|
2033
|
+
confirm: 'Confirm new password',
|
|
2034
|
+
submit: 'Change password & continue',
|
|
2035
|
+
submitting: 'Updating…',
|
|
2036
|
+
mismatch: 'New passwords do not match.',
|
|
2037
|
+
failed: 'Could not change password.',
|
|
2038
|
+
},
|
|
2039
|
+
mfa: {
|
|
2040
|
+
title: 'Set up two-factor authentication',
|
|
2041
|
+
fallbackMessage: 'Your organization requires an authenticator app to continue.',
|
|
2042
|
+
confirmPassword: 'Confirm your password',
|
|
2043
|
+
continue: 'Continue',
|
|
2044
|
+
preparing: 'Preparing…',
|
|
2045
|
+
enrollFailed: 'Could not start enrollment.',
|
|
2046
|
+
scanTitle: 'Scan with your authenticator',
|
|
2047
|
+
scanBody: 'Scan this QR code with Google Authenticator, 1Password, Authy, etc., then enter the 6-digit code.',
|
|
2048
|
+
backupTitle: 'Save your backup codes',
|
|
2049
|
+
backupBody: 'Store these somewhere safe — each can be used once if you lose your device.',
|
|
2050
|
+
codeLabel: '6-digit code',
|
|
2051
|
+
verify: 'Verify & continue',
|
|
2052
|
+
verifying: 'Verifying…',
|
|
2053
|
+
invalidCode: 'Invalid code. Try again.',
|
|
2054
|
+
},
|
|
2055
|
+
},
|
|
1789
2056
|
},
|
|
1790
2057
|
profile: {
|
|
1791
2058
|
title: 'Profile',
|
|
@@ -1881,6 +2148,7 @@ const en = {
|
|
|
1881
2148
|
offline: 'Offline',
|
|
1882
2149
|
usersOnline: 'Users currently online',
|
|
1883
2150
|
switchView: 'Switch view',
|
|
2151
|
+
switchObject: 'Switch Object',
|
|
1884
2152
|
connection: {
|
|
1885
2153
|
connected: 'Connected',
|
|
1886
2154
|
connecting: 'Connecting...',
|
|
@@ -1900,6 +2168,14 @@ const en = {
|
|
|
1900
2168
|
subtitle: 'Your workspace dashboard',
|
|
1901
2169
|
nav: 'Home',
|
|
1902
2170
|
allApps: 'All Applications',
|
|
2171
|
+
yourApps: 'Your apps',
|
|
2172
|
+
showMoreApps: 'More',
|
|
2173
|
+
showLess: 'Show less',
|
|
2174
|
+
continueEmpty: 'Items you open will show up here.',
|
|
2175
|
+
actionCenter: {
|
|
2176
|
+
title: 'Needs your attention',
|
|
2177
|
+
empty: "You're all caught up",
|
|
2178
|
+
},
|
|
1903
2179
|
greetingMorning: 'Good morning',
|
|
1904
2180
|
greetingAfternoon: 'Good afternoon',
|
|
1905
2181
|
greetingEvening: 'Good evening',
|
|
@@ -2119,8 +2395,8 @@ const en = {
|
|
|
2119
2395
|
description: 'Please provide the required information to continue.',
|
|
2120
2396
|
selectPlaceholder: 'Select {{label}}',
|
|
2121
2397
|
requiredError: '{{label}} is required',
|
|
2122
|
-
lookupPlaceholder: '
|
|
2123
|
-
lookupHelpText: '
|
|
2398
|
+
lookupPlaceholder: 'Record id for {{label}}',
|
|
2399
|
+
lookupHelpText: 'No reference object is configured for this parameter, so the record picker is unavailable. Enter a record id, or ask an administrator to fix the action parameter.',
|
|
2124
2400
|
cancel: 'Cancel',
|
|
2125
2401
|
confirm: 'Confirm',
|
|
2126
2402
|
uploading: 'Uploading…',
|
|
@@ -2208,6 +2484,10 @@ const en = {
|
|
|
2208
2484
|
filterAll: 'All',
|
|
2209
2485
|
markAllRead: 'Mark all read',
|
|
2210
2486
|
viewAll: 'View all notifications',
|
|
2487
|
+
groupCount: '{{count}} notifications',
|
|
2488
|
+
groupUnread: '{{count}} unread',
|
|
2489
|
+
groupMarkRead: 'Mark read',
|
|
2490
|
+
groupMarkReadTitle: 'Mark all of this type read',
|
|
2211
2491
|
approvalsPending: '{{count}} pending approvals',
|
|
2212
2492
|
viewApprovals: 'View approvals',
|
|
2213
2493
|
noPendingApprovals: 'No pending approvals',
|
|
@@ -2320,6 +2600,108 @@ const en = {
|
|
|
2320
2600
|
done: 'Done — hide it',
|
|
2321
2601
|
},
|
|
2322
2602
|
},
|
|
2603
|
+
excelImport: {
|
|
2604
|
+
noImportableFields: 'That object has no importable fields.',
|
|
2605
|
+
schemaReadFailed: 'Could not read the object schema.',
|
|
2606
|
+
imported: 'Imported {{count}} row(s) into {{object}}.',
|
|
2607
|
+
importFrom: 'Import the real rows from',
|
|
2608
|
+
into: 'into',
|
|
2609
|
+
opening: 'Opening…',
|
|
2610
|
+
importAction: 'Import',
|
|
2611
|
+
dismiss: 'Dismiss',
|
|
2612
|
+
},
|
|
2613
|
+
cloudOnboarding: {
|
|
2614
|
+
hintCreate: 'Spin up your first environment — a private workspace with its own URL, database, and plan. Building happens inside it.',
|
|
2615
|
+
hintReady: 'Your production environment is ready. Open it to build and run your apps — that all happens inside the environment.',
|
|
2616
|
+
createEnvironment: 'Create your environment',
|
|
2617
|
+
openProduction: 'Open Production',
|
|
2618
|
+
manageEnvironments: 'Manage environments',
|
|
2619
|
+
},
|
|
2620
|
+
aiModelStatus: {
|
|
2621
|
+
summary: 'Build / Ask uses {{conversational}} ({{conversationalSource}}); structured uses {{structured}} ({{structuredSource}}).',
|
|
2622
|
+
summaryRouting: 'Routing policy: free plans → {{free}}, paid plans → {{paid}}.',
|
|
2623
|
+
modelUnknown: 'unknown',
|
|
2624
|
+
sourceUnknown: 'not reported by the adapter',
|
|
2625
|
+
rowConversational: 'Build / Ask model',
|
|
2626
|
+
rowStructured: 'Structured (blueprint / seed)',
|
|
2627
|
+
rowReasoning: 'Reasoning effort',
|
|
2628
|
+
readFailed: 'Couldn\'t read the effective AI model. This environment may not run an AI service, or you may lack the ai:read permission.',
|
|
2629
|
+
readFailedWithStatus: 'Couldn\'t read the effective AI model (HTTP {{status}}). This environment may not run an AI service, or you may lack the ai:read permission.',
|
|
2630
|
+
overridesInEffect: 'Overrides in effect: ',
|
|
2631
|
+
noOverrides: 'none — running the deployed code defaults.',
|
|
2632
|
+
adapter: 'Adapter: ',
|
|
2633
|
+
sourceCodeDefault: 'code default (no env override)',
|
|
2634
|
+
sourceInherits: 'same as build/ask',
|
|
2635
|
+
sourcePinned: 'pinned by {{source}}',
|
|
2636
|
+
},
|
|
2637
|
+
chatbotError: {
|
|
2638
|
+
title: 'Response failed',
|
|
2639
|
+
fallbackDetail: 'Something went wrong. Please try again.',
|
|
2640
|
+
details: 'Details',
|
|
2641
|
+
hide: 'Hide',
|
|
2642
|
+
retry: 'Retry',
|
|
2643
|
+
},
|
|
2644
|
+
chatbotQuota: {
|
|
2645
|
+
title: 'Upgrade needed',
|
|
2646
|
+
fallbackMessage: 'You have reached your AI quota.',
|
|
2647
|
+
buyCredits: 'Buy a credit pack',
|
|
2648
|
+
upgradePlan: 'Upgrade plan',
|
|
2649
|
+
},
|
|
2650
|
+
environment: {
|
|
2651
|
+
addEnvironment: 'Add environment',
|
|
2652
|
+
setUpProduction: 'Set up your production environment',
|
|
2653
|
+
addDevelopment: 'Add development environment',
|
|
2654
|
+
// Plan/capacity dialog (EnvironmentEntitlementDialog). Shown on a paid
|
|
2655
|
+
// conversion path, so it must read in the user's language — cloud#959.
|
|
2656
|
+
entitlement: {
|
|
2657
|
+
productionLimitTitle: 'You already have your production environment',
|
|
2658
|
+
productionLimitBody: 'Each organization includes exactly one production environment. Create a separate organization for another, or contact us about an Enterprise arrangement.',
|
|
2659
|
+
planLockedTitle: 'Development environments are a paid feature',
|
|
2660
|
+
planLockedBody: 'Your {{plan}} includes one production environment. Upgrade to add development environments — build in dev, then publish to production.',
|
|
2661
|
+
limitTitle: 'Development environment limit reached',
|
|
2662
|
+
limitBody: 'Capacity scales with AI seats. Add an AI seat, or archive an unused development environment to free one up.',
|
|
2663
|
+
limitBodyWithCount: 'You are using {{used}} of {{limit}} development environments. Capacity scales with AI seats — add an AI seat, or archive an unused development environment to free one up.',
|
|
2664
|
+
freePlan: 'free plan',
|
|
2665
|
+
namedPlan: '{{plan}} plan',
|
|
2666
|
+
upgradeCta: 'Upgrade plan',
|
|
2667
|
+
contactSalesCta: 'Contact sales',
|
|
2668
|
+
},
|
|
2669
|
+
},
|
|
2670
|
+
cloudConnection: {
|
|
2671
|
+
checking: 'Checking connection…',
|
|
2672
|
+
retry: 'Try again',
|
|
2673
|
+
errors: {
|
|
2674
|
+
expired: 'The request expired before it was approved. Start again.',
|
|
2675
|
+
bindFailed: 'Binding failed.',
|
|
2676
|
+
deviceCodeFailed: 'Device code request failed.',
|
|
2677
|
+
},
|
|
2678
|
+
waiting: {
|
|
2679
|
+
popupOpened: 'Approve the connection in the window that just opened — this page updates by itself.',
|
|
2680
|
+
polling: 'Waiting for approval in the cloud console…',
|
|
2681
|
+
openApproval: 'Open the approval page',
|
|
2682
|
+
copy: 'Copy',
|
|
2683
|
+
copied: 'Copied',
|
|
2684
|
+
codePrefilled: 'The code is pre-filled on the approval page.',
|
|
2685
|
+
openItHere: 'Window did not appear? Open it here',
|
|
2686
|
+
cancel: 'Cancel',
|
|
2687
|
+
},
|
|
2688
|
+
bound: {
|
|
2689
|
+
title: 'Connected to ObjectStack Cloud',
|
|
2690
|
+
runtime: 'Runtime',
|
|
2691
|
+
organization: 'Organization',
|
|
2692
|
+
approvedBy: 'Approved by',
|
|
2693
|
+
runtimeId: 'Runtime ID',
|
|
2694
|
+
environment: 'Environment',
|
|
2695
|
+
since: 'Since',
|
|
2696
|
+
privatePackages: 'Your organization\'s private packages now appear in the Marketplace under “Your organization”.',
|
|
2697
|
+
disconnect: 'Disconnect',
|
|
2698
|
+
},
|
|
2699
|
+
unbound: {
|
|
2700
|
+
title: 'Not connected',
|
|
2701
|
+
body: 'Connect this runtime to an ObjectStack control plane to browse your organization\'s private packages and install them here. Approval is a single click in your cloud account — no ids or credentials are typed into this page.',
|
|
2702
|
+
connect: 'Connect',
|
|
2703
|
+
},
|
|
2704
|
+
},
|
|
2323
2705
|
marketplace: {
|
|
2324
2706
|
title: 'App Marketplace',
|
|
2325
2707
|
subtitle: 'Browse approved apps published to the ObjectStack catalog. Click an app to view details and install it into one of your environments.',
|
|
@@ -2455,6 +2837,14 @@ const en = {
|
|
|
2455
2837
|
yearsAgo: '{{count}}y ago',
|
|
2456
2838
|
},
|
|
2457
2839
|
},
|
|
2840
|
+
approvals: {
|
|
2841
|
+
approve: 'Approve',
|
|
2842
|
+
reject: 'Reject',
|
|
2843
|
+
comment: 'Comment (optional)',
|
|
2844
|
+
approveSuccess: 'Approved',
|
|
2845
|
+
rejectSuccess: 'Rejected',
|
|
2846
|
+
rejectConfirm: 'Reject this approval request?',
|
|
2847
|
+
},
|
|
2458
2848
|
approvalsInbox: {
|
|
2459
2849
|
loadMore: 'Load more',
|
|
2460
2850
|
loadingMore: 'Loading…',
|
|
@@ -2479,13 +2869,28 @@ const en = {
|
|
|
2479
2869
|
slaRemaining: 'SLA {{dur}} left',
|
|
2480
2870
|
slaOverdue: 'SLA overdue {{dur}}',
|
|
2481
2871
|
actReassign: 'Reassigned',
|
|
2872
|
+
reassignFromTo: 'from {{from}} to {{to}}',
|
|
2482
2873
|
actRemind: 'Reminder sent',
|
|
2483
2874
|
actRequestInfo: 'Requested more info',
|
|
2484
2875
|
actComment: 'Commented',
|
|
2485
2876
|
stepProgress: 'Approval steps',
|
|
2486
2877
|
prevRequest: 'Previous',
|
|
2487
2878
|
nextRequest: 'Next',
|
|
2488
|
-
positionOf: '{{index}} of {{total}}',
|
|
2879
|
+
positionOf: 'Request {{index}} of {{total}}',
|
|
2880
|
+
progressApprovals: 'Approvals — {{got}} of {{need}}',
|
|
2881
|
+
progressGroups: 'Sign-off progress — {{got}} of {{need}} groups',
|
|
2882
|
+
progressEligible: '{{count}} eligible approver(s)',
|
|
2883
|
+
progressBar: 'Decision progress',
|
|
2884
|
+
declaredActions: 'Actions',
|
|
2885
|
+
attachmentChip: 'Attachment',
|
|
2886
|
+
attachmentOpenFailed: 'Could not open the attachment — please try again',
|
|
2887
|
+
approveOneTitle: 'Approve "{{title}}"?',
|
|
2888
|
+
approveOneBody: 'This approves the request with your identity. To add a comment or attachment, open the request instead.',
|
|
2889
|
+
flowOrigin: 'Flow-initiated',
|
|
2890
|
+
sortBy: 'Sort',
|
|
2891
|
+
sortRecent: 'Newest first',
|
|
2892
|
+
sortOldest: 'Oldest first',
|
|
2893
|
+
sortAmount: 'Amount (high→low)',
|
|
2489
2894
|
quickPhrase1: 'Approved — meets requirements.',
|
|
2490
2895
|
quickPhrase2: 'Approved with conditions — please monitor execution.',
|
|
2491
2896
|
quickPhrase3: 'Please add supporting material and resubmit.',
|