@object-ui/i18n 13.2.0 → 14.0.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 CHANGED
@@ -1,5 +1,56 @@
1
1
  # @object-ui/i18n
2
2
 
3
+ ## 14.0.0
4
+
5
+ ### Patch Changes
6
+
7
+ - c70bca7: fix(console-ai): Live Canvas is a full-screen, opt-in preview on mobile — not a broken split (#2481)
8
+
9
+ On a phone the beside-chat Live Canvas split overflowed the viewport (the chat
10
+ column's fixed min-width plus the preview exceeded the screen, and the resize
11
+ handle is desktop-only, so it was stuck clipped). Under `md` the canvas is now:
12
+
13
+ - **Full-width chat, no split** — the build streams in the chat as before.
14
+ - **Opt-in + full-screen** — when the preview is available a floating "Preview
15
+ app" pill appears; tapping it (or a Preview button on a draft card) takes the
16
+ canvas full-screen over the chat. Closing returns to the chat with the
17
+ preview one tap away. The auto-drafted canvas never covers the streaming
18
+ chat unprompted.
19
+
20
+ Desktop is unchanged (the resizable beside-chat split). Adds the
21
+ `console.ai.previewApp` string (en/zh).
22
+
23
+ - 05e56ca: 导出/导入模板的下载文件名与内容本地化。
24
+
25
+ **导出文件名**:CSV/Excel/JSON 导出下载不再是 `<对象名>.<扩展名>`(如 `contracts.csv`),改为「对象显示名-视图名-时间戳.扩展名」(如 `任务-In Progress-20260714-153045.xlsx`);`exportOptions.fileNamePrefix` 配置仍优先(且作为完整前缀,不再追加视图名)。视图名与对象名重复时自动省略;`@object-ui/core` 新增 `buildExportFileName(ext, { prefix, label, objectName, viewLabel }, now?)` 与 `sanitizeFileNameBase(raw)`,ObjectGrid 与 ListView 的所有导出路径(服务端流式与前端兜底)统一走它。app-shell/plugin-view 的 ObjectView 现将当前视图的显示标签写进传给 ListView 的 schema(`label`),使导出文件名能区分同一对象的不同保存视图。
26
+
27
+ **导入模板**:「下载模板」修复两处英文漏出——示例行的 select/多选取值改为优先取选项**显示标签**(如 `准备中`)而非 ASCII slug(`prepare`,服务端导入两者都接受);模板文件名本地化为 `{{object}}-导入模板.csv`(新增 i18n key `grid.import.templateFileName`,英文回退 `{{object}}-import-template.csv`)。
28
+
29
+ - 5971cc4: i18n: translate the Profile page, honor inline i18n label objects under bare
30
+ base-language codes, and localize managed-by badges / record quick actions.
31
+
32
+ - `pickLocalized` now upgrades a bare base language (`zh`) to any
33
+ region-qualified key sharing the base (`zh-CN`) — runtime language is
34
+ normalized to the base code while metadata authors write full BCP-47 tags,
35
+ so inline `{ en, 'zh-CN', ... }` label objects previously fell back to
36
+ English.
37
+ - ProfilePage (`account:profile_card` / `/system/profile`): every hardcoded
38
+ string — page title/subtitle, avatar Upload/Replace/Remove, Personal
39
+ Information card, Change/Set Password card — now goes through
40
+ `useObjectTranslation()` with `profile.*` keys (new namespace in all ten
41
+ locale bundles); the lazy-load fallback reuses `common.loading`.
42
+ - `ManagedByBadge` chips/tooltips (Config/System/Append-only/Identity) now
43
+ resolve through new `managedByBadge.*` keys with `{{provider}}`
44
+ interpolation.
45
+ - `record:quick_actions` resolves action labels via the
46
+ `objects.{object}._actions.{action}.label` convention plus `pickLocalized`,
47
+ so object action buttons (Change Password, Enable 2FA, …) localize.
48
+ - `record:details` / `record:related_list` / `record:alert` / `ObjectTree`
49
+ pass inline label objects through `pickLocalized`.
50
+ - Locale bundles: added `managedByBadge` namespace to all ten locales and
51
+ backfilled `list.inlineEditShort` / `inlineEditLabel` /
52
+ `recordEditingTitle` for ja/es/ko/de/fr/pt/ru/ar.
53
+
3
54
  ## 13.2.0
4
55
 
5
56
  ### Patch Changes
@@ -280,6 +280,31 @@ declare const ar: {
280
280
  addGroup: string;
281
281
  collapsedByDefault: string;
282
282
  removeGroup: string;
283
+ inlineEditShort: string;
284
+ inlineEditLabel: string;
285
+ recordEditingTitle: string;
286
+ };
287
+ managedByBadge: {
288
+ config: {
289
+ short: string;
290
+ title: string;
291
+ body: string;
292
+ };
293
+ system: {
294
+ short: string;
295
+ title: string;
296
+ body: string;
297
+ };
298
+ appendOnly: {
299
+ short: string;
300
+ title: string;
301
+ body: string;
302
+ };
303
+ betterAuth: {
304
+ short: string;
305
+ title: string;
306
+ body: string;
307
+ };
283
308
  };
284
309
  kanban: {
285
310
  addCard: string;
@@ -1222,6 +1247,43 @@ declare const ar: {
1222
1247
  tenantHostHint: string;
1223
1248
  };
1224
1249
  };
1250
+ profile: {
1251
+ title: string;
1252
+ subtitle: string;
1253
+ saving: string;
1254
+ avatar: {
1255
+ upload: string;
1256
+ replace: string;
1257
+ remove: string;
1258
+ };
1259
+ info: {
1260
+ title: string;
1261
+ description: string;
1262
+ saved: string;
1263
+ name: string;
1264
+ email: string;
1265
+ emailImmutable: string;
1266
+ role: string;
1267
+ save: string;
1268
+ };
1269
+ password: {
1270
+ changeTitle: string;
1271
+ setTitle: string;
1272
+ changeDescription: string;
1273
+ setDescription: string;
1274
+ current: string;
1275
+ new: string;
1276
+ password: string;
1277
+ confirm: string;
1278
+ tooShort: string;
1279
+ mismatch: string;
1280
+ enterCurrent: string;
1281
+ changed: string;
1282
+ localSet: string;
1283
+ changeAction: string;
1284
+ setAction: string;
1285
+ };
1286
+ };
1225
1287
  errors: {
1226
1288
  networkError: string;
1227
1289
  serverError: string;
@@ -280,6 +280,31 @@ const ar = {
280
280
  addGroup: "إضافة حقل مجموعة",
281
281
  collapsedByDefault: "مطوي افتراضياً",
282
282
  removeGroup: "إزالة",
283
+ inlineEditShort: "تحرير مضمّن",
284
+ inlineEditLabel: "حرّر السجلات مباشرة (انقر خلية للتحرير)",
285
+ recordEditingTitle: "تحرير السجلات",
286
+ },
287
+ managedByBadge: {
288
+ config: {
289
+ short: "إعدادات المسؤول",
290
+ title: "تكوين المسؤول",
291
+ body: "تحدد هذه الصفوف سلوك المنصة أثناء التشغيل. أنشئها هنا؛ وتُخزَّن بيانات التشغيل الناتجة في جدول منفصل.",
292
+ },
293
+ system: {
294
+ short: "يديره النظام",
295
+ title: "تديره المنصة",
296
+ body: "تُنشأ الصفوف تلقائيًا عند تشغيل الإجراءات على السجل المصدر. القائمة أدناه واجهة مراقبة للقراءة فقط — وتوجد إجراءات مستوى الصف (اعتماد، استرجاع، إعادة إرسال، …) على كل صف.",
297
+ },
298
+ appendOnly: {
299
+ short: "للقراءة فقط · سجل التدقيق",
300
+ title: "سجل تاريخي للقراءة فقط",
301
+ body: "سجل تدقيق غير قابل للتغيير. لا يمكن إنشاء الصفوف أو تعديلها أو حذفها من الواجهة — تكتبها المنصة عند وقوع الأحداث. استخدم التصدير للتنزيل لمراجعة الامتثال.",
302
+ },
303
+ betterAuth: {
304
+ short: "الهوية",
305
+ title: "يديره مزوّد الهوية",
306
+ body: "مخطط هذا الكائن مملوك لـ {{provider}}. التعديلات المباشرة تتجاوز تجزئة كلمات المرور والتحقق من الجلسات وفحوصات المصادقة الثنائية وخطافات التدقيق. أدر هذه السجلات عبر تدفقات تسجيل الدخول والدعوة والأمان لدى مزوّد المصادقة.",
307
+ },
283
308
  },
284
309
  kanban: {
285
310
  addCard: "إضافة بطاقة",
@@ -1222,6 +1247,43 @@ const ar = {
1222
1247
  tenantHostHint: "تسجل الدخول إلى مساحة العمل هذه",
1223
1248
  },
1224
1249
  },
1250
+ profile: {
1251
+ title: "الملف الشخصي",
1252
+ subtitle: "إدارة إعدادات حسابك",
1253
+ saving: "جارٍ الحفظ…",
1254
+ avatar: {
1255
+ upload: "رفع",
1256
+ replace: "استبدال",
1257
+ remove: "إزالة",
1258
+ },
1259
+ info: {
1260
+ title: "المعلومات الشخصية",
1261
+ description: "قم بتحديث اسمك وعرض تفاصيل حسابك",
1262
+ saved: "تم تحديث الملف الشخصي بنجاح.",
1263
+ name: "الاسم",
1264
+ email: "البريد الإلكتروني",
1265
+ emailImmutable: "لا يمكن تغيير البريد الإلكتروني.",
1266
+ role: "الدور",
1267
+ save: "حفظ التغييرات",
1268
+ },
1269
+ password: {
1270
+ changeTitle: "تغيير كلمة المرور",
1271
+ setTitle: "تعيين كلمة مرور محلية",
1272
+ changeDescription: "قم بتحديث كلمة المرور التي تستخدمها لتسجيل الدخول إلى هذه البيئة.",
1273
+ setDescription: "لقد سجّلت الدخول عبر تسجيل الدخول الموحّد. عيّن كلمة مرور محلية لتتمكن أيضاً من تسجيل الدخول بالبريد الإلكتروني وكلمة المرور في هذه البيئة.",
1274
+ current: "كلمة المرور الحالية",
1275
+ new: "كلمة المرور الجديدة",
1276
+ password: "كلمة المرور",
1277
+ confirm: "تأكيد كلمة المرور",
1278
+ tooShort: "يجب أن تتكون كلمة المرور من 8 أحرف على الأقل",
1279
+ mismatch: "كلمتا المرور غير متطابقتين",
1280
+ enterCurrent: "أدخل كلمة المرور الحالية",
1281
+ changed: "تم تغيير كلمة المرور.",
1282
+ localSet: "تم تعيين كلمة المرور المحلية. يمكنك الآن تسجيل الدخول بالبريد الإلكتروني وكلمة المرور في هذه البيئة.",
1283
+ changeAction: "تغيير كلمة المرور",
1284
+ setAction: "تعيين كلمة المرور",
1285
+ },
1286
+ },
1225
1287
  errors: {
1226
1288
  networkError: "خطأ في الشبكة. يرجى التحقق من اتصالك.",
1227
1289
  serverError: "خطأ في الخادم. يرجى المحاولة مرة أخرى لاحقاً.",
@@ -280,6 +280,31 @@ declare const de: {
280
280
  addGroup: string;
281
281
  collapsedByDefault: string;
282
282
  removeGroup: string;
283
+ inlineEditShort: string;
284
+ inlineEditLabel: string;
285
+ recordEditingTitle: string;
286
+ };
287
+ managedByBadge: {
288
+ config: {
289
+ short: string;
290
+ title: string;
291
+ body: string;
292
+ };
293
+ system: {
294
+ short: string;
295
+ title: string;
296
+ body: string;
297
+ };
298
+ appendOnly: {
299
+ short: string;
300
+ title: string;
301
+ body: string;
302
+ };
303
+ betterAuth: {
304
+ short: string;
305
+ title: string;
306
+ body: string;
307
+ };
283
308
  };
284
309
  kanban: {
285
310
  addCard: string;
@@ -1222,6 +1247,43 @@ declare const de: {
1222
1247
  tenantHostHint: string;
1223
1248
  };
1224
1249
  };
1250
+ profile: {
1251
+ title: string;
1252
+ subtitle: string;
1253
+ saving: string;
1254
+ avatar: {
1255
+ upload: string;
1256
+ replace: string;
1257
+ remove: string;
1258
+ };
1259
+ info: {
1260
+ title: string;
1261
+ description: string;
1262
+ saved: string;
1263
+ name: string;
1264
+ email: string;
1265
+ emailImmutable: string;
1266
+ role: string;
1267
+ save: string;
1268
+ };
1269
+ password: {
1270
+ changeTitle: string;
1271
+ setTitle: string;
1272
+ changeDescription: string;
1273
+ setDescription: string;
1274
+ current: string;
1275
+ new: string;
1276
+ password: string;
1277
+ confirm: string;
1278
+ tooShort: string;
1279
+ mismatch: string;
1280
+ enterCurrent: string;
1281
+ changed: string;
1282
+ localSet: string;
1283
+ changeAction: string;
1284
+ setAction: string;
1285
+ };
1286
+ };
1225
1287
  errors: {
1226
1288
  networkError: string;
1227
1289
  serverError: string;
@@ -280,6 +280,31 @@ const de = {
280
280
  addGroup: "Gruppenfeld hinzufügen",
281
281
  collapsedByDefault: "Standardmäßig eingeklappt",
282
282
  removeGroup: "Entfernen",
283
+ inlineEditShort: "Inline bearbeiten",
284
+ inlineEditLabel: "Datensätze inline bearbeiten (Zelle anklicken zum Bearbeiten)",
285
+ recordEditingTitle: "Datensatzbearbeitung",
286
+ },
287
+ managedByBadge: {
288
+ config: {
289
+ short: "Admin-Konfiguration",
290
+ title: "Administrator-Konfiguration",
291
+ body: "Diese Zeilen definieren das Laufzeitverhalten der Plattform. Erstellen Sie sie hier; die erzeugten Laufzeitdaten liegen in einer separaten Tabelle.",
292
+ },
293
+ system: {
294
+ short: "Systemverwaltet",
295
+ title: "Von der Plattform verwaltet",
296
+ body: "Zeilen werden automatisch erstellt, wenn Aktionen auf dem Quelldatensatz ausgeführt werden. Die Liste ist eine schreibgeschützte Überwachungsansicht – Aktionen auf Zeilenebene (Genehmigen, Zurückrufen, Erneut senden, …) befinden sich an jeder Zeile.",
297
+ },
298
+ appendOnly: {
299
+ short: "Schreibgeschützt · Audit-Log",
300
+ title: "Schreibgeschützter Verlauf",
301
+ body: "Unveränderliches Audit-Log. Zeilen können in der UI nicht erstellt, bearbeitet oder gelöscht werden – die Plattform schreibt sie bei Ereignissen. Nutzen Sie Export für Compliance-Prüfungen.",
302
+ },
303
+ betterAuth: {
304
+ short: "Identität",
305
+ title: "Vom Identitätsanbieter verwaltet",
306
+ body: "Das Schema dieses Objekts gehört {{provider}}. Direkte Änderungen umgehen Passwort-Hashing, Sitzungsvalidierung, Zwei-Faktor-Prüfungen und Audit-Hooks. Verwalten Sie diese Datensätze über die Anmelde-, Einladungs- und Sicherheitsabläufe Ihres Authentifizierungsanbieters.",
307
+ },
283
308
  },
284
309
  kanban: {
285
310
  addCard: "Karte hinzufügen",
@@ -1222,6 +1247,43 @@ const de = {
1222
1247
  tenantHostHint: "Sie melden sich bei diesem Arbeitsbereich an",
1223
1248
  },
1224
1249
  },
1250
+ profile: {
1251
+ title: "Profil",
1252
+ subtitle: "Verwalten Sie Ihre Kontoeinstellungen",
1253
+ saving: "Speichern…",
1254
+ avatar: {
1255
+ upload: "Hochladen",
1256
+ replace: "Ersetzen",
1257
+ remove: "Entfernen",
1258
+ },
1259
+ info: {
1260
+ title: "Persönliche Informationen",
1261
+ description: "Aktualisieren Sie Ihren Namen und sehen Sie Ihre Kontodetails ein",
1262
+ saved: "Profil erfolgreich aktualisiert.",
1263
+ name: "Name",
1264
+ email: "E-Mail",
1265
+ emailImmutable: "Die E-Mail-Adresse kann nicht geändert werden.",
1266
+ role: "Rolle",
1267
+ save: "Änderungen speichern",
1268
+ },
1269
+ password: {
1270
+ changeTitle: "Passwort ändern",
1271
+ setTitle: "Lokales Passwort festlegen",
1272
+ changeDescription: "Aktualisieren Sie das Passwort, mit dem Sie sich in dieser Umgebung anmelden.",
1273
+ setDescription: "Sie haben sich per Single Sign-On angemeldet. Legen Sie ein lokales Passwort fest, um sich in dieser Umgebung auch mit E-Mail und Passwort anmelden zu können.",
1274
+ current: "Aktuelles Passwort",
1275
+ new: "Neues Passwort",
1276
+ password: "Passwort",
1277
+ confirm: "Passwort bestätigen",
1278
+ tooShort: "Das Passwort muss mindestens 8 Zeichen lang sein",
1279
+ mismatch: "Die Passwörter stimmen nicht überein",
1280
+ enterCurrent: "Geben Sie Ihr aktuelles Passwort ein",
1281
+ changed: "Passwort geändert.",
1282
+ localSet: "Lokales Passwort festgelegt. Sie können sich in dieser Umgebung jetzt auch mit E-Mail und Passwort anmelden.",
1283
+ changeAction: "Passwort ändern",
1284
+ setAction: "Passwort festlegen",
1285
+ },
1286
+ },
1225
1287
  errors: {
1226
1288
  networkError: "Netzwerkfehler. Bitte überprüfen Sie Ihre Verbindung.",
1227
1289
  serverError: "Serverfehler. Bitte versuchen Sie es später erneut.",
@@ -351,6 +351,28 @@ declare const en: {
351
351
  readonly inlineEditLabel: "Edit records inline (click a cell to edit)";
352
352
  readonly recordEditingTitle: "Record editing";
353
353
  };
354
+ readonly managedByBadge: {
355
+ readonly config: {
356
+ readonly short: "Admin config";
357
+ readonly title: "Administrator configuration";
358
+ readonly body: "These rows define how the platform behaves at runtime. Author them here; the runtime data they produce lives in a separate table.";
359
+ };
360
+ readonly system: {
361
+ readonly short: "System-managed";
362
+ readonly title: "Managed by the platform";
363
+ readonly body: "Rows here are created automatically when actions run on the source record. The list below is a read-only monitoring surface — row-level actions (Approve, Recall, Resend, …) live on each row.";
364
+ };
365
+ readonly appendOnly: {
366
+ readonly short: "Read-only · Audit log";
367
+ readonly title: "Read-only historical record";
368
+ readonly body: "Immutable audit log. Rows cannot be created, edited, or deleted from the UI — they're written by the platform when events occur. Use Export to download for compliance review.";
369
+ };
370
+ readonly betterAuth: {
371
+ readonly short: "Identity";
372
+ readonly title: "Managed by the identity provider";
373
+ readonly body: "This object's schema is owned by {{provider}}. Direct edits bypass password hashing, session validation, two-factor checks, and audit hooks. Manage these records through your authentication provider's sign-in, invitation, and security flows instead.";
374
+ };
375
+ };
354
376
  readonly kanban: {
355
377
  readonly addCard: "Add card";
356
378
  readonly addColumn: "Add column";
@@ -410,7 +432,7 @@ declare const en: {
410
432
  readonly row: {
411
433
  readonly expand: "Expand";
412
434
  readonly collapse: "Collapse";
413
- readonly locate: "Locate on timeline";
435
+ readonly open: "Open details";
414
436
  };
415
437
  readonly aria: {
416
438
  readonly taskList: "Task list";
@@ -426,6 +448,25 @@ declare const en: {
426
448
  readonly addSuccessor: "Add successor…";
427
449
  readonly removeDependency: "Remove dependency";
428
450
  readonly noCandidates: "No available tasks";
451
+ readonly searchTasks: "Search tasks…";
452
+ readonly qrcode: "Mobile QR code";
453
+ };
454
+ readonly qr: {
455
+ readonly title: "Open on mobile";
456
+ readonly hint: "Scan with a phone to open the details";
457
+ readonly copy: "Copy link";
458
+ readonly copied: "Copied";
459
+ readonly close: "Close";
460
+ };
461
+ readonly delete: {
462
+ readonly title: "Delete this task?";
463
+ readonly body: "\"{{title}}\" will be permanently removed. This action cannot be undone.";
464
+ readonly cancel: "Cancel";
465
+ readonly confirm: "Delete";
466
+ readonly deleting: "Deleting…";
467
+ };
468
+ readonly drawer: {
469
+ readonly fallbackTitle: "Task Details";
429
470
  };
430
471
  readonly linkType: {
431
472
  readonly fs: "Finish → Start";
@@ -447,6 +488,8 @@ declare const en: {
447
488
  };
448
489
  readonly readOnly: "Read-only";
449
490
  readonly readOnlyHint: "Editing is disabled for this view.";
491
+ readonly lockedHint: "No edit permission";
492
+ readonly writeFailed: "Save failed — the change was rolled back";
450
493
  };
451
494
  readonly view: {
452
495
  readonly editViewConfig: "Edit view config";
@@ -1199,6 +1242,7 @@ declare const en: {
1199
1242
  readonly seedWarn: "Published, but some sample data failed to load.";
1200
1243
  readonly openBuiltApp: "Open app";
1201
1244
  readonly previewDraft: "Preview";
1245
+ readonly previewApp: "Preview app";
1202
1246
  readonly resizeSplit: "Resize chat and preview";
1203
1247
  readonly hideChats: "Hide chats";
1204
1248
  readonly showChats: "Show chats";
@@ -1507,6 +1551,7 @@ declare const en: {
1507
1551
  readonly errors: {
1508
1552
  readonly invalidCredentials: "Invalid email or password. Please try again.";
1509
1553
  readonly emailNotVerified: "Please verify your email address before signing in.";
1554
+ readonly oauthCallbackFailed: "Single sign-on could not be completed — the sign-in link expired or was already used. Please try again.";
1510
1555
  };
1511
1556
  };
1512
1557
  readonly register: {
@@ -1631,6 +1676,43 @@ declare const en: {
1631
1676
  readonly tenantHostHint: "You are signing in to this workspace";
1632
1677
  };
1633
1678
  };
1679
+ readonly profile: {
1680
+ readonly title: "Profile";
1681
+ readonly subtitle: "Manage your account settings";
1682
+ readonly saving: "Saving…";
1683
+ readonly avatar: {
1684
+ readonly upload: "Upload";
1685
+ readonly replace: "Replace";
1686
+ readonly remove: "Remove";
1687
+ };
1688
+ readonly info: {
1689
+ readonly title: "Personal Information";
1690
+ readonly description: "Update your name and view account details";
1691
+ readonly saved: "Profile updated successfully.";
1692
+ readonly name: "Name";
1693
+ readonly email: "Email";
1694
+ readonly emailImmutable: "Email cannot be changed.";
1695
+ readonly role: "Role";
1696
+ readonly save: "Save Changes";
1697
+ };
1698
+ readonly password: {
1699
+ readonly changeTitle: "Change Password";
1700
+ readonly setTitle: "Set Local Password";
1701
+ readonly changeDescription: "Update the password you use to sign in to this environment.";
1702
+ readonly setDescription: "You signed in via single sign-on. Set a local password to also sign in with email and password on this environment.";
1703
+ readonly current: "Current password";
1704
+ readonly new: "New password";
1705
+ readonly password: "Password";
1706
+ readonly confirm: "Confirm password";
1707
+ readonly tooShort: "Password must be at least 8 characters";
1708
+ readonly mismatch: "Passwords do not match";
1709
+ readonly enterCurrent: "Enter your current password";
1710
+ readonly changed: "Password changed.";
1711
+ readonly localSet: "Local password set. You can now sign in with email and password on this environment.";
1712
+ readonly changeAction: "Change password";
1713
+ readonly setAction: "Set password";
1714
+ };
1715
+ };
1634
1716
  readonly errors: {
1635
1717
  readonly networkError: "Network error. Please check your connection.";
1636
1718
  readonly serverError: "Server error. Please try again later.";
@@ -1956,6 +2038,8 @@ declare const en: {
1956
2038
  readonly deleteFailed: "Failed to delete {{label}}";
1957
2039
  readonly noRecordId: "No record ID provided";
1958
2040
  readonly deleteConfirm: "Are you sure you want to delete this record?";
2041
+ readonly resetPackageSetConfirm: string;
2042
+ readonly resetPackageSetSuccess: "Permission set reset to its shipped baseline";
1959
2043
  readonly bulkDeleteSuccess: "Deleted {{count}} {{label}} records";
1960
2044
  readonly bulkDeletePartial: "{{succeeded}} deleted, {{failed}} failed";
1961
2045
  };
@@ -351,6 +351,28 @@ const en = {
351
351
  inlineEditLabel: 'Edit records inline (click a cell to edit)',
352
352
  recordEditingTitle: 'Record editing',
353
353
  },
354
+ managedByBadge: {
355
+ config: {
356
+ short: 'Admin config',
357
+ title: 'Administrator configuration',
358
+ body: 'These rows define how the platform behaves at runtime. Author them here; the runtime data they produce lives in a separate table.',
359
+ },
360
+ system: {
361
+ short: 'System-managed',
362
+ title: 'Managed by the platform',
363
+ body: 'Rows here are created automatically when actions run on the source record. The list below is a read-only monitoring surface — row-level actions (Approve, Recall, Resend, …) live on each row.',
364
+ },
365
+ appendOnly: {
366
+ short: 'Read-only · Audit log',
367
+ title: 'Read-only historical record',
368
+ body: "Immutable audit log. Rows cannot be created, edited, or deleted from the UI — they're written by the platform when events occur. Use Export to download for compliance review.",
369
+ },
370
+ betterAuth: {
371
+ short: 'Identity',
372
+ title: 'Managed by the identity provider',
373
+ body: "This object's schema is owned by {{provider}}. Direct edits bypass password hashing, session validation, two-factor checks, and audit hooks. Manage these records through your authentication provider's sign-in, invitation, and security flows instead.",
374
+ },
375
+ },
354
376
  kanban: {
355
377
  addCard: 'Add card',
356
378
  addColumn: 'Add column',
@@ -410,7 +432,7 @@ const en = {
410
432
  row: {
411
433
  expand: 'Expand',
412
434
  collapse: 'Collapse',
413
- locate: 'Locate on timeline',
435
+ open: 'Open details',
414
436
  },
415
437
  aria: {
416
438
  taskList: 'Task list',
@@ -426,6 +448,25 @@ const en = {
426
448
  addSuccessor: 'Add successor…',
427
449
  removeDependency: 'Remove dependency',
428
450
  noCandidates: 'No available tasks',
451
+ searchTasks: 'Search tasks…',
452
+ qrcode: 'Mobile QR code',
453
+ },
454
+ qr: {
455
+ title: 'Open on mobile',
456
+ hint: 'Scan with a phone to open the details',
457
+ copy: 'Copy link',
458
+ copied: 'Copied',
459
+ close: 'Close',
460
+ },
461
+ delete: {
462
+ title: 'Delete this task?',
463
+ body: '"{{title}}" will be permanently removed. This action cannot be undone.',
464
+ cancel: 'Cancel',
465
+ confirm: 'Delete',
466
+ deleting: 'Deleting…',
467
+ },
468
+ drawer: {
469
+ fallbackTitle: 'Task Details',
429
470
  },
430
471
  linkType: {
431
472
  fs: 'Finish → Start',
@@ -447,6 +488,8 @@ const en = {
447
488
  },
448
489
  readOnly: 'Read-only',
449
490
  readOnlyHint: 'Editing is disabled for this view.',
491
+ lockedHint: 'No edit permission',
492
+ writeFailed: 'Save failed — the change was rolled back',
450
493
  },
451
494
  view: {
452
495
  editViewConfig: 'Edit view config',
@@ -1214,6 +1257,7 @@ const en = {
1214
1257
  seedWarn: 'Published, but some sample data failed to load.',
1215
1258
  openBuiltApp: 'Open app',
1216
1259
  previewDraft: 'Preview',
1260
+ previewApp: 'Preview app',
1217
1261
  resizeSplit: 'Resize chat and preview',
1218
1262
  hideChats: 'Hide chats',
1219
1263
  showChats: 'Show chats',
@@ -1523,6 +1567,7 @@ const en = {
1523
1567
  errors: {
1524
1568
  invalidCredentials: 'Invalid email or password. Please try again.',
1525
1569
  emailNotVerified: 'Please verify your email address before signing in.',
1570
+ oauthCallbackFailed: 'Single sign-on could not be completed — the sign-in link expired or was already used. Please try again.',
1526
1571
  },
1527
1572
  },
1528
1573
  register: {
@@ -1647,6 +1692,43 @@ const en = {
1647
1692
  tenantHostHint: 'You are signing in to this workspace',
1648
1693
  },
1649
1694
  },
1695
+ profile: {
1696
+ title: 'Profile',
1697
+ subtitle: 'Manage your account settings',
1698
+ saving: 'Saving…',
1699
+ avatar: {
1700
+ upload: 'Upload',
1701
+ replace: 'Replace',
1702
+ remove: 'Remove',
1703
+ },
1704
+ info: {
1705
+ title: 'Personal Information',
1706
+ description: 'Update your name and view account details',
1707
+ saved: 'Profile updated successfully.',
1708
+ name: 'Name',
1709
+ email: 'Email',
1710
+ emailImmutable: 'Email cannot be changed.',
1711
+ role: 'Role',
1712
+ save: 'Save Changes',
1713
+ },
1714
+ password: {
1715
+ changeTitle: 'Change Password',
1716
+ setTitle: 'Set Local Password',
1717
+ changeDescription: 'Update the password you use to sign in to this environment.',
1718
+ setDescription: 'You signed in via single sign-on. Set a local password to also sign in with email and password on this environment.',
1719
+ current: 'Current password',
1720
+ new: 'New password',
1721
+ password: 'Password',
1722
+ confirm: 'Confirm password',
1723
+ tooShort: 'Password must be at least 8 characters',
1724
+ mismatch: 'Passwords do not match',
1725
+ enterCurrent: 'Enter your current password',
1726
+ changed: 'Password changed.',
1727
+ localSet: 'Local password set. You can now sign in with email and password on this environment.',
1728
+ changeAction: 'Change password',
1729
+ setAction: 'Set password',
1730
+ },
1731
+ },
1650
1732
  errors: {
1651
1733
  networkError: 'Network error. Please check your connection.',
1652
1734
  serverError: 'Server error. Please try again later.',
@@ -1976,6 +2058,9 @@ const en = {
1976
2058
  deleteFailed: 'Failed to delete {{label}}',
1977
2059
  noRecordId: 'No record ID provided',
1978
2060
  deleteConfirm: 'Are you sure you want to delete this record?',
2061
+ resetPackageSetConfirm: 'This permission set ships with an installed package and cannot be removed. ' +
2062
+ 'Deleting resets it to the shipped baseline and discards your environment customization. Continue?',
2063
+ resetPackageSetSuccess: 'Permission set reset to its shipped baseline',
1979
2064
  bulkDeleteSuccess: 'Deleted {{count}} {{label}} records',
1980
2065
  bulkDeletePartial: '{{succeeded}} deleted, {{failed}} failed',
1981
2066
  },