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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .changeset/28789-i18n-retire-packaged-flows-keys.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
'@object-ui/i18n': patch
---

refactor(i18n)!: the Packaged automation flows keys and Home's Manage Objects keys leave every pack

Clause-②: yes (narrowing)
Metadata-protocol: none

<!-- adr-0087: not-required (runtime-interface-only ui/packages/i18n/src/locales/en.ts#TranslationKeys) the key type of the console's own translation catalogue: no Zod schema, no spec declaration and no stored metadata reads it, so the compiler is the channel that reaches every caller -->

Setup's Packaged automation flows page and Home's Manage Objects entry are retired: packaged flows are switched on and off, and copied, in Studio's Automations pillar, and objects are managed in Studio. The strings those screens read stayed in `@object-ui/i18n` with no reader. They now leave all ten packs (ar, de, en, es, fr, ja, ko, pt, ru, zh).

**BREAKING** (`@object-ui/i18n`, TypeScript only): the exported `TranslationKeys` (`typeof en`) loses 28 keys. A `t()` call that names one still compiles, since its key is a `string`, and reads the key back. Nothing replaces them; the fix is to delete the reference.

| Removed key | Replacement |
|:---|:---|
| `packagedAutomation.title`, `.subtitle`, `.flowsHeading`, `.colFlow`, `.colActions`, `.toggleLabel`, `.notRunning`, `.notRunningDeploymentPolicy`, `.reasonDetails`, `.emptyTitle`, `.emptyBody`, `.loadFailed` | none: the flows list is retired; a packaged flow's switch lives in Studio |
| `packagedAutomation.clone`, `.cloneTitle`, `.cloneBody`, `.cloneName`, `.cloneLabel`, `.cloneCopyLabel`, `.cloneConfirm`, `.cloneCreated`, `.cloneSwitchSourceOff`, `.cloneSourceOff`, `.cloneOpen`, `.cloneFailed`, `.cloneFailedHttp` | none: the clone dialog is retired; Studio's New similar copies a flow |
| `home.quickActions.manageObjects`, `home.quickActions.manageObjectsDesc`, `layout.systemNav.objectManager` | none: Home's Manage Objects entry is retired |

The keys Setup's Packaged actions page reads (`packagedAutomation.actionsHeading`, `.refresh`, `.colActivation`, `.on`, `.off`, `.cancel`, `.toggleFailed`, `.toggleFailedHttp` and the `actions*` / `switched*` / `actionOff*` family) are unchanged.
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
* service, no entry).
*
* The page body is the console's `automation:connector-credentials` component
* (`@object-ui/app-shell`), the way Setup's packaged-automation entry names
* `automation:packaged`. It reads `GET /api/v1/automation/connectors/credential-refs`
* (`@object-ui/app-shell`), the way Setup's packaged-actions entry names
* `automation:packaged-actions`. It reads `GET /api/v1/automation/connectors/credential-refs`
* and writes through `PUT` / `DELETE …/credential-refs/:ref`; ⛔ no value ever
* reaches it, since none of the three routes answers one.
*
Expand Down
11 changes: 8 additions & 3 deletions ui/packages/i18n/src/__tests__/de-quote-pairing-3876.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,10 @@ describe('objectui#3876 — de pack closes „ with “ and not with a straight
// 104 once objectstack-ai/objectstack#28382 added `form.requiredForAction`,
// the edit form's note that names the update action a field is required
// for („{{action}}“) — one interpolated span, runtime data.
expect(okSpans, 'correctly paired spans').toBe(104);
// 103 once objectstack-ai/objectstack#28789 retired
// `packagedAutomation.cloneCreated` with the Packaged automation flows page
// it named a clone on — one interpolated span fewer.
expect(okSpans, 'correctly paired spans').toBe(103);
});

it('keeps the count identity that replaces the card’s count(„) === count(“)', () => {
Expand Down Expand Up @@ -452,8 +455,10 @@ describe('objectui#3876 — de pack closes „ with “ and not with a straight
// more matched pair. 103 / 103 / 0 after objectstack-ai/objectstack#27520
// added `console.serverAction.fillRequiredThenRetry`, one more matched pair.
// 104 / 104 / 0 after objectstack-ai/objectstack#28382 added
// `form.requiredForAction`, one more matched pair.
expect({ open, close, rdq }).toEqual({ open: 104, close: 104, rdq: 0 });
// `form.requiredForAction`, one more matched pair. 103 / 103 / 0 after
// objectstack-ai/objectstack#28789 retired `packagedAutomation.cloneCreated`,
// one matched pair fewer.
expect({ open, close, rdq }).toEqual({ open: 103, close: 103, rdq: 0 });
// The durable shape: every „ closed by a “, every surplus “ an English
// opener answered by a ”. Survived translating the two English values.
expect(close).toBe(open + rdq);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,15 +120,13 @@ const SURVIVING = [
'calendar.moreEvents',
'calendar.allDay',
'home.quickActions.title',
'home.quickActions.manageObjects',
'home.quickActions.systemSettings',
'actionDialog.title',
'actionDialog.description',
'actionDialog.cancel',
'actionDialog.confirm',
'layout.systemNav.applications',
'layout.systemNav.systemSettings',
'layout.systemNav.objectManager',
'chart.nullCategory',
'grid.bulk.confirmDefault',
'grid.bulk.affectedRecords',
Expand Down
28 changes: 0 additions & 28 deletions ui/packages/i18n/src/locales/ar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3386,8 +3386,6 @@ const ar = {
browseMarketplace: "تصفح متجر التطبيقات",
quickActions: {
title: "إجراءات سريعة",
manageObjects: "إدارة الكائنات",
manageObjectsDesc: "تكوين نماذج البيانات",
systemSettings: "إعدادات النظام",
systemSettingsDesc: "تكوين النظام",
},
Expand Down Expand Up @@ -3440,7 +3438,6 @@ const ar = {
systemSettings: "إعدادات النظام",
applications: "التطبيقات",
appMarketplace: "سوق التطبيقات",
objectManager: "مدير الكائنات",
users: "المستخدمون",
organizations: "المؤسسات",
roles: "الأدوار",
Expand Down Expand Up @@ -5249,39 +5246,14 @@ const ar = {
// وعلامات الاقتباس «…». ⛔ لا توجد صياغة عن الأصل أو الانحراف في هذه
// المجموعة (§9).
packagedAutomation: {
title: "أتمتة الحزم",
subtitle: "تدفقات وإجراءات تأتي مع الحزم المثبّتة. يمكنك إيقاف أي منها في هذا النشر، أو استنساخ تدفق باسم جديد لتخصيصه. التحرير يتم في Studio.",
refresh: "تحديث",
flowsHeading: "تدفقات الحزم",
actionsHeading: "إجراءات الحزم",
colFlow: "التدفق",
colActivation: "التفعيل",
colActions: "إجراءات",
toggleLabel: "تفعيل {{label}}",
on: "مفعل",
off: "إيقاف",
notRunning: "لا يعمل هنا",
notRunningDeploymentPolicy: "مفعل، لكن هذا النشر لا يشغّل المهام المجدولة",
clone: "استنساخ",
cloneTitle: "استنساخ تدفق الحزمة",
cloneBody: "تحتفظ النسخة بالتعريف كاملاً وتتطلب اسم آلة وتسمية جديدين. حرّر النسخة في Studio.",
cloneName: "اسم آلة جديد",
cloneLabel: "تسمية جديدة",
cloneCopyLabel: "{{label}} (نسخة)",
cancel: "إلغاء",
cloneConfirm: "إنشاء نسخة",
cloneCreated: "تم إنشاء التدفق «{{name}}».",
cloneSwitchSourceOff: "إيقاف «{{label}}»",
cloneSourceOff: "التدفق المضمّن «{{label}}» متوقف.",
cloneOpen: "فتح النسخة في Studio",
emptyTitle: "لا توجد تدفقات من الحزم",
emptyBody: "لا توجد حزمة مثبّتة توفّر تدفق أتمتة في هذا النشر. التدفقات التي تنشئها بنفسك موجودة في Studio.",
loadFailed: "تعذّر تحميل أتمتة الحزم.",
toggleFailedHttp: "تعذّر تغيير التفعيل (HTTP {{status}}).",
toggleFailed: "تعذّر تغيير التفعيل.",
cloneFailedHttp: "تعذّر استنساخ هذا التدفق (HTTP {{status}}).",
cloneFailed: "تعذّر استنساخ هذا التدفق.",
reasonDetails: "التفاصيل",
actionsSubtitle: "إجراءات تأتي مع الحزم المثبّتة. أوقف أحدها في هذا النشر فيتوقف عن العمل في كل مكان يُعرض فيه. ويبقى بإمكانك إنشاء إجراء خاص بك إلى جانبه في Studio.",
colAction: "الإجراء",
colObject: "الكائن",
Expand Down
28 changes: 0 additions & 28 deletions ui/packages/i18n/src/locales/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3136,8 +3136,6 @@ const de = {
browseMarketplace: "App-Marktplatz durchsuchen",
quickActions: {
title: "Schnellaktionen",
manageObjects: "Objekte verwalten",
manageObjectsDesc: "Datenmodelle konfigurieren",
systemSettings: "Systemeinstellungen",
systemSettingsDesc: "Konfigurieren Sie Ihr System",
},
Expand Down Expand Up @@ -3186,7 +3184,6 @@ const de = {
systemSettings: "Systemeinstellungen",
applications: "Anwendungen",
appMarketplace: "App-Marktplatz",
objectManager: "Objekt-Manager",
users: "Benutzer",
organizations: "Organisationen",
roles: "Rollen",
Expand Down Expand Up @@ -4755,39 +4752,14 @@ const de = {
// Flow, Anführungszeichen „…“. ⛔ Keine Herkunfts- oder Drift-Formulierungen
// in dieser Gruppe (§9).
packagedAutomation: {
title: "Paketautomatisierung",
subtitle: "Flows und Aktionen aus installierten Paketen. Schalten Sie eines für diese Installation ab oder klonen Sie einen Flow unter einem neuen Namen, um ihn anzupassen. Bearbeitet wird im Studio.",
refresh: "Aktualisieren",
flowsHeading: "Paket-Flows",
actionsHeading: "Paket-Aktionen",
colFlow: "Flow",
colActivation: "Aktivierung",
colActions: "Aktionen",
toggleLabel: "Aktivierung für {{label}}",
on: "An",
off: "Aus",
notRunning: "Läuft hier nicht",
notRunningDeploymentPolicy: "An, aber diese Installation führt keine geplanten Aufgaben aus",
clone: "Klonen",
cloneTitle: "Paket-Flow klonen",
cloneBody: "Die Kopie übernimmt die gesamte Definition und benötigt einen neuen Maschinennamen und ein neues Label. Bearbeiten Sie die Kopie im Studio.",
cloneName: "Neuer Maschinenname",
cloneLabel: "Neues Label",
cloneCopyLabel: "{{label}} (Kopie)",
cancel: "Abbrechen",
cloneConfirm: "Klon erstellen",
cloneCreated: "Flow „{{name}}“ erstellt.",
cloneSwitchSourceOff: "{{label}} ausschalten",
cloneSourceOff: "Der paketierte Flow {{label}} ist ausgeschaltet.",
cloneOpen: "Kopie in Studio öffnen",
emptyTitle: "Keine Paket-Flows",
emptyBody: "In dieser Installation liefert kein installiertes Paket einen Automatisierungs-Flow. Selbst erstellte Flows finden Sie im Studio.",
loadFailed: "Paketautomatisierung konnte nicht geladen werden.",
toggleFailedHttp: "Aktivierung konnte nicht geändert werden (HTTP {{status}}).",
toggleFailed: "Aktivierung konnte nicht geändert werden.",
cloneFailedHttp: "Dieser Flow konnte nicht geklont werden (HTTP {{status}}).",
cloneFailed: "Dieser Flow konnte nicht geklont werden.",
reasonDetails: "Details",
actionsSubtitle: "Aktionen aus installierten Paketen. Schalten Sie eine für diese Installation ab, und sie läuft überall dort nicht mehr, wo sie angeboten wird. Eine eigene Aktion daneben zu erstellen, bleibt Ihnen im Studio offen.",
colAction: "Aktion",
colObject: "Objekt",
Expand Down
73 changes: 9 additions & 64 deletions ui/packages/i18n/src/locales/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3749,8 +3749,6 @@ const en = {
browseMarketplace: 'Browse App Marketplace',
quickActions: {
title: 'Quick Actions',
manageObjects: 'Manage Objects',
manageObjectsDesc: 'Configure data models',
systemSettings: 'System Settings',
systemSettingsDesc: 'Configure your system',
},
Expand Down Expand Up @@ -3794,7 +3792,6 @@ const en = {
systemSettings: 'System Settings',
applications: 'Applications',
appMarketplace: 'App Marketplace',
objectManager: 'Object Manager',
users: 'Users',
organizations: 'Organizations',
roles: 'Roles',
Expand Down Expand Up @@ -5518,85 +5515,33 @@ const en = {
bulkOperationFailed: 'Bulk operation failed: {{reason}}',
},
},
// objectui#6301 — Setup › Packaged automation (ADR-0126 §7.4): the
// operational surface for the flows an installed package ships. Authoring
// objectui#6301 — Setup › Packaged actions (ADR-0126 §7.4, §8 item 2): the
// operational surface for the actions an installed package ships. Authoring
// stays in Studio, so this group has no editing vocabulary at all; it is
// on/off, clone, and the states those two produce.
// on/off and the states that produces. The flows half of the page (its list
// and its clone dialog) retired into Studio's Automations pillar (ADR-0146
// D11), and its keys left every pack with it.
//
// ⛔ No drift or ancestry wording anywhere in this group (ADR-0126 §9). There
// is deliberately no "customized", no "based on v3", no "out of date" — the
// platform does not track that lineage, and a translatable string for it is
// the cheapest way for the surface to grow one.
//
// ⛔ Server refusals are NOT in this group either. The posture gate, the
// subflow guard and the clone name conflict all arrive as server-authored
// prose and are rendered verbatim; the four `*Failed*` keys below are the
// last-resort fallbacks for a response that carried no message at all.
// ⛔ Server refusals are NOT in this group either. They arrive as
// server-authored prose and are rendered verbatim; the `*Failed*` keys below
// are the last-resort fallbacks for a response that carried no message at all.
packagedAutomation: {
title: 'Packaged automation',
// Covers BOTH sections since ADR-0126 §8 item 2 put packaged actions on
// this page: only flows can be cloned, so the clone clause names them.
subtitle:
'Flows and actions shipped by installed packages. Turn one off for this deployment, or clone a flow under a new name to customize it. Editing happens in Studio.',
refresh: 'Refresh',
// Section headings — the page carries two tables.
flowsHeading: 'Packaged flows',
actionsHeading: 'Packaged actions',
colFlow: 'Flow',
colActivation: 'Activation',
colActions: 'Actions',
// The switch's accessible name — the only place a row's label is spoken.
toggleLabel: 'Activation for {{label}}',
on: 'On',
off: 'Off',
// The Activation badge on a flow whose switch is ON but whose trigger the
// engine has not armed on this deployment (objectui#13159): the switch
// keeps the flag, this says the flow does not run. The same words as
// Studio's rail for the same state (`engine.studio.auto.notRunning`).
notRunning: 'Not running here',
// The same row when the engine's cause is `deployment_policy` (objectstack#27378):
// package-authored scheduled work is off on this deployment. Plain words for the
// admin; the platform's sentence, which names the operator switch, stays behind
// the Details chip.
notRunningDeploymentPolicy: 'On, but this deployment does not run scheduled work',
clone: 'Clone',
cloneTitle: 'Clone packaged flow',
cloneBody:
'The copy carries the whole definition and takes a new machine name and label. Edit the copy in Studio.',
cloneName: 'New machine name',
cloneLabel: 'New label',
// The Clone dialog's prefilled label (objectui#13344): the source flow's
// label, or its machine name when it has none, marked as the copy.
cloneCopyLabel: '{{label}} (copy)',
cancel: 'Cancel',
cloneConfirm: 'Create clone',
cloneCreated: 'Created flow "{{name}}".',
// The clone result's next steps (objectui#13270): switch the flow the
// admin cloned from off through its own toggle, or open the clone where
// it is edited. The sharing-rule clone's words for the same offer.
cloneSwitchSourceOff: 'Switch "{{label}}" off',
cloneSourceOff: 'The packaged flow "{{label}}" is switched off.',
cloneOpen: 'Open the clone in Studio',
emptyTitle: 'No packaged flows',
emptyBody:
'No installed package ships an automation flow on this deployment. Flows you author yourself live in Studio.',
loadFailed: 'Could not load packaged automation.',
// Two keys per action, not one: the response arm has an HTTP status to
// name and the transport-exception arm does not, and a single key cannot
// carry a hole only half its call sites can fill.
// Artifact-neutral by wording, and shared by BOTH sections' toggles: the
// sentence says nothing about flows, so the actions half reuses it rather
// than defining a second key with the same English in ten packs.
toggleFailedHttp: 'Could not change activation (HTTP {{status}}).',
toggleFailed: 'Could not change activation.',
cloneFailedHttp: 'Could not clone this flow (HTTP {{status}}).',
cloneFailed: 'Could not clone this flow.',
// The chip an unarmed flow row's platform sentence opens from
// (objectui#12609). ⛔ Generic on purpose: the same word on every row that
// carries a sentence, whatever the sentence says. The sentence itself is
// the server's and is never kept in a pack; a label naming its cause would
// be the console classifying a field the contract says not to parse.
reasonDetails: 'Details',

// ── Packaged ACTIONS section (ADR-0126 §8 item 2, ruling 3) ────────────
// ⛔ No clone key here on purpose: the action-clone half is unchartered,
Expand All @@ -5612,7 +5557,7 @@ const en = {
actionsEmptyBody:
'No installed package declares an action on this deployment. Actions you author yourself live in Studio.',
actionsLoadFailed: 'Could not load packaged actions.',
// The toast after a switch the server accepted, in both sections, and
// The toast after a switch the server accepted, and
// the confirm a packaged action's switch-off asks first (objectstack#27521).
switchedOn: '"{{label}}" is switched on.',
switchedOff: '"{{label}}" is switched off for this deployment.',
Expand Down
Loading
Loading