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
20 changes: 20 additions & 0 deletions .changeset/lifecycle-panel-ja-es-renderings.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
'@objectstack/platform-objects': patch
---

Author the object form's data-lifecycle panel (ADR-0057) and the email-template
variables sample in `ja-JP` and `es-ES`.

Thirty-three `en` leaves — sixteen labels and sixteen helpTexts under
`object.fields.lifecycle.*`, plus `email_template.fields.variables.helpText` —
shipped their English source in both locales while `zh-CN` had all thirty-three
authored. An author working in Japanese or Spanish read the whole retention /
TTL / rotation / archive panel in English. Each leaf is now decided per locale
with its reason and the `en` source it was judged against, recorded in
`object-lifecycle-panel-echo-decisions.test.ts` and pinned to the live bundle,
to the `en` source and to the form declaration that manufactures it.

No keys are added or removed: values were authored by hand and the structure
regenerated with `pnpm i18n:extract`.

Clause-②: no
Original file line number Diff line number Diff line change
Expand Up @@ -258,68 +258,68 @@ export const esESMetadataForms: NonNullable<TranslationData['metadataForms']> =
helpText: "ID de fuente de datos de destino (valor predeterminado: \"default\")"
},
lifecycle: {
label: "Lifecycle",
helpText: "Data lifecycle contract (ADR-0057): how long rows live and how space is reclaimed. Leave empty for permanent record semantics. Non-record classes require at least one bounding policy (retention, TTL, or rotation)."
label: "Ciclo de vida de los datos",
helpText: "Contrato de ciclo de vida de los datos (ADR-0057): cuánto viven las filas y cómo se recupera el espacio. Déjalo en blanco para una semántica record permanente. Las clases distintas de record requieren al menos una política acotante (retención, TTL o rotación)."
},
"lifecycle.class": {
label: "Class",
helpText: "Persistence contract for the rows of this object"
label: "Clase de ciclo de vida",
helpText: "Contrato de persistencia de las filas de este objeto"
},
"lifecycle.retention": {
label: "Retention",
helpText: "Age-based retention window"
label: "Retención",
helpText: "Ventana de retención basada en la antigüedad de las filas"
},
"lifecycle.retention.maxAge": {
label: "Max Age",
helpText: "Rows older than this (by created_at) are reaped. Duration literal: h/d/w/y, e.g. \"30d\""
label: "Antigüedad máxima",
helpText: "Las filas más antiguas que este valor (según created_at) se eliminan. Literal de duración: h/d/w/y, p. ej. \"30d\""
},
"lifecycle.ttl": {
label: "Ttl",
helpText: "Per-row TTL expiry"
label: "Caducidad por TTL",
helpText: "Caducidad por TTL de cada fila"
},
"lifecycle.ttl.field": {
label: "Field",
helpText: "Timestamp field the TTL is measured from (e.g. expires_at)"
label: "Campo de marca temporal",
helpText: "Campo de marca temporal desde el que se mide el TTL (p. ej. expires_at)"
},
"lifecycle.ttl.expireAfter": {
label: "Expire After",
helpText: "Rows expire this long after the field, e.g. \"1d\""
label: "Plazo de caducidad",
helpText: "Las filas caducan este tiempo después del campo, p. ej. \"1d\""
},
"lifecycle.storage": {
label: "Storage",
helpText: "Physical rotation for high-frequency telemetry (SQLite: O(1) shard DROP)"
label: "Almacenamiento",
helpText: "Rotación física para telemetría de alta frecuencia (SQLite: DROP de fragmento en O(1))"
},
"lifecycle.storage.strategy": {
label: "Strategy",
helpText: "Storage strategy"
label: "Estrategia",
helpText: "Estrategia de almacenamiento"
},
"lifecycle.storage.shards": {
label: "Shards",
helpText: "Shards retained; total window = shards × unit"
label: "Número de fragmentos",
helpText: "Número de fragmentos que se conservan; ventana total = fragmentos × unidad"
},
"lifecycle.storage.unit": {
label: "Unit",
helpText: "Time width of one shard"
label: "Unidad de fragmento",
helpText: "Amplitud temporal de un fragmento"
},
"lifecycle.archive": {
label: "Archive",
helpText: "Cold-store hand-off (audit class). Rows are never hot-deleted before the archive copy succeeded."
label: "Archivado",
helpText: "Traspaso al almacenamiento en frío (clase audit). Las filas nunca se eliminan en caliente antes de que la copia de archivado haya finalizado correctamente."
},
"lifecycle.archive.after": {
label: "After",
helpText: "Archive rows older than this — must equal retention.maxAge"
label: "Antigüedad de archivado",
helpText: "Archiva las filas más antiguas que este valor — debe coincidir con retention.maxAge"
},
"lifecycle.archive.to": {
label: "To",
helpText: "Target datasource name for cold storage"
label: "Fuente de datos de archivado",
helpText: "Nombre de la fuente de datos de destino para el almacenamiento en frío"
},
"lifecycle.archive.keep": {
label: "Keep",
helpText: "How long the archive keeps rows (empty = forever), e.g. \"7y\""
label: "Retención en archivado",
helpText: "Cuánto tiempo conserva las filas el archivado (en blanco = para siempre), p. ej. \"7y\""
},
"lifecycle.reclaim": {
label: "Reclaim",
helpText: "Reclaim driver space after sweeps (default on for non-record classes)"
label: "Recuperación de espacio",
helpText: "Recupera el espacio del driver después de los barridos (activado de forma predeterminada en las clases distintas de record)"
}
}
},
Expand Down Expand Up @@ -1774,7 +1774,7 @@ export const esESMetadataForms: NonNullable<TranslationData['metadataForms']> =
},
variables: {
label: "Variables de plantilla",
helpText: "[{ \"name\": \"user.name\", \"type\": \"string\", \"required\": true, \"description\": \"...\" }]"
helpText: "Ejemplo: [{ \"name\": \"user.name\", \"type\": \"string\", \"required\": true, \"description\": \"...\" }]"
},
fromOverride: {
label: "Sobrescritura de remitente",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,39 +18,6 @@
*/

export const esESGeneratedSourceHashes: Readonly<Record<string, string>> = {
"metadataForms.email_template.fields.variables.helpText": "27197774c2cda633",
"metadataForms.object.fields.lifecycle.archive.after.helpText": "e0e76ef140528e1c",
"metadataForms.object.fields.lifecycle.archive.after.label": "05e119362ddb98d6",
"metadataForms.object.fields.lifecycle.archive.helpText": "e1d3f49d818d0807",
"metadataForms.object.fields.lifecycle.archive.keep.helpText": "5c64726b12f2717a",
"metadataForms.object.fields.lifecycle.archive.keep.label": "a4a66d4839231b06",
"metadataForms.object.fields.lifecycle.archive.label": "dc721777496e2512",
"metadataForms.object.fields.lifecycle.archive.to.helpText": "b086a13b2c7cbd23",
"metadataForms.object.fields.lifecycle.archive.to.label": "ca6e09b7adfeb23f",
"metadataForms.object.fields.lifecycle.class.helpText": "a2a0c1b381c361cf",
"metadataForms.object.fields.lifecycle.class.label": "e9dba3be46bf7fea",
"metadataForms.object.fields.lifecycle.helpText": "608118f856cec104",
"metadataForms.object.fields.lifecycle.label": "aeb8410b6c716b40",
"metadataForms.object.fields.lifecycle.reclaim.helpText": "3214ee85bf5ec2d1",
"metadataForms.object.fields.lifecycle.reclaim.label": "a3be311d3ce0282c",
"metadataForms.object.fields.lifecycle.retention.helpText": "3d8f859e28eb37ec",
"metadataForms.object.fields.lifecycle.retention.label": "a672155e6c24e41a",
"metadataForms.object.fields.lifecycle.retention.maxAge.helpText": "7cd18232c490868c",
"metadataForms.object.fields.lifecycle.retention.maxAge.label": "3654cac5ba14e6ce",
"metadataForms.object.fields.lifecycle.storage.helpText": "dc5d38fadc7e273c",
"metadataForms.object.fields.lifecycle.storage.label": "6fb0804db64324af",
"metadataForms.object.fields.lifecycle.storage.shards.helpText": "d948a024425640ba",
"metadataForms.object.fields.lifecycle.storage.shards.label": "739988affb36b2e0",
"metadataForms.object.fields.lifecycle.storage.strategy.helpText": "93bf61da82533a75",
"metadataForms.object.fields.lifecycle.storage.strategy.label": "785c1dd353da380b",
"metadataForms.object.fields.lifecycle.storage.unit.helpText": "f43af4c056eab727",
"metadataForms.object.fields.lifecycle.storage.unit.label": "c53f07123f162a30",
"metadataForms.object.fields.lifecycle.ttl.expireAfter.helpText": "ed226b79ee7fd60f",
"metadataForms.object.fields.lifecycle.ttl.expireAfter.label": "27a86cf076af8e84",
"metadataForms.object.fields.lifecycle.ttl.field.helpText": "66edfde80e1ee2ff",
"metadataForms.object.fields.lifecycle.ttl.field.label": "e21c314685cd95ca",
"metadataForms.object.fields.lifecycle.ttl.helpText": "9b125bc1584a941f",
"metadataForms.object.fields.lifecycle.ttl.label": "e37616f70b0d157a",
"objects.sys_account._actions.link_social.params.provider.options.apple": "cfdc41e15ed6699b",
"objects.sys_account._actions.link_social.params.provider.options.discord": "12f931cc062e76ae",
"objects.sys_account._actions.link_social.params.provider.options.facebook": "7eea009178f5b807",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -258,68 +258,68 @@ export const jaJPMetadataForms: NonNullable<TranslationData['metadataForms']> =
helpText: "対象データソース ID(既定: \"default\")"
},
lifecycle: {
label: "Lifecycle",
helpText: "Data lifecycle contract (ADR-0057): how long rows live and how space is reclaimed. Leave empty for permanent record semantics. Non-record classes require at least one bounding policy (retention, TTL, or rotation)."
label: "データライフサイクル",
helpText: "データライフサイクルのコントラクト(ADR-0057): 行をどれだけ保持し、容量をどう回収するか。空欄の場合は永続的な record セマンティクスになります。record 以外のクラスは、少なくとも 1 つの境界ポリシー(保持期間、TTL、ローテーション)を宣言する必要があります。"
},
"lifecycle.class": {
label: "Class",
helpText: "Persistence contract for the rows of this object"
label: "ライフサイクルクラス",
helpText: "このオブジェクトの行の永続化コントラクト"
},
"lifecycle.retention": {
label: "Retention",
helpText: "Age-based retention window"
label: "保持期間",
helpText: "行の経過時間にもとづく保持ウィンドウ"
},
"lifecycle.retention.maxAge": {
label: "Max Age",
helpText: "Rows older than this (by created_at) are reaped. Duration literal: h/d/w/y, e.g. \"30d\""
label: "最大経過時間",
helpText: "これより古い行(created_at 基準)は削除されます。期間リテラル: h/d/w/y、例: \"30d\""
},
"lifecycle.ttl": {
label: "Ttl",
helpText: "Per-row TTL expiry"
label: "TTL 期限切れ",
helpText: "行ごとの TTL による期限切れ"
},
"lifecycle.ttl.field": {
label: "Field",
helpText: "Timestamp field the TTL is measured from (e.g. expires_at)"
label: "タイムスタンプフィールド",
helpText: "TTL の起点となるタイムスタンプフィールド(例: expires_at)"
},
"lifecycle.ttl.expireAfter": {
label: "Expire After",
helpText: "Rows expire this long after the field, e.g. \"1d\""
label: "期限切れまでの期間",
helpText: "行はこのフィールドの時刻からこの期間が経過すると期限切れになります。例: \"1d\""
},
"lifecycle.storage": {
label: "Storage",
helpText: "Physical rotation for high-frequency telemetry (SQLite: O(1) shard DROP)"
label: "ストレージ",
helpText: "高頻度テレメトリー向けの物理ローテーション(SQLite: O(1) のシャード DROP)"
},
"lifecycle.storage.strategy": {
label: "Strategy",
helpText: "Storage strategy"
label: "戦略",
helpText: "ストレージ戦略"
},
"lifecycle.storage.shards": {
label: "Shards",
helpText: "Shards retained; total window = shards × unit"
label: "シャード数",
helpText: "保持するシャード数。合計ウィンドウ = シャード数 × 単位"
},
"lifecycle.storage.unit": {
label: "Unit",
helpText: "Time width of one shard"
label: "シャード単位",
helpText: "シャード 1 つあたりの時間幅"
},
"lifecycle.archive": {
label: "Archive",
helpText: "Cold-store hand-off (audit class). Rows are never hot-deleted before the archive copy succeeded."
label: "アーカイブ",
helpText: "コールドストレージへの引き渡し(audit クラス)。アーカイブのコピーが成功する前に、行がホット側から削除されることはありません。"
},
"lifecycle.archive.after": {
label: "After",
helpText: "Archive rows older than this — must equal retention.maxAge"
label: "アーカイブ対象の経過時間",
helpText: "これより古い行をアーカイブします — retention.maxAge と一致している必要があります"
},
"lifecycle.archive.to": {
label: "To",
helpText: "Target datasource name for cold storage"
label: "アーカイブ先データソース",
helpText: "コールドストレージ用の対象データソース名"
},
"lifecycle.archive.keep": {
label: "Keep",
helpText: "How long the archive keeps rows (empty = forever), e.g. \"7y\""
label: "アーカイブ保持期間",
helpText: "アーカイブが行を保持する期間(空欄 = 無期限)。例: \"7y\""
},
"lifecycle.reclaim": {
label: "Reclaim",
helpText: "Reclaim driver space after sweeps (default on for non-record classes)"
label: "容量の回収",
helpText: "スイープ後にドライバーの容量を回収します(record 以外のクラスでは既定で有効)"
}
}
},
Expand Down Expand Up @@ -1774,7 +1774,7 @@ export const jaJPMetadataForms: NonNullable<TranslationData['metadataForms']> =
},
variables: {
label: "変数",
helpText: "[{ \"name\": \"user.name\", \"type\": \"string\", \"required\": true, \"description\": \"...\" }]"
helpText: "例: [{ \"name\": \"user.name\", \"type\": \"string\", \"required\": true, \"description\": \"...\" }]"
},
fromOverride: {
label: "送信者オーバーライド",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,39 +18,6 @@
*/

export const jaJPGeneratedSourceHashes: Readonly<Record<string, string>> = {
"metadataForms.email_template.fields.variables.helpText": "27197774c2cda633",
"metadataForms.object.fields.lifecycle.archive.after.helpText": "e0e76ef140528e1c",
"metadataForms.object.fields.lifecycle.archive.after.label": "05e119362ddb98d6",
"metadataForms.object.fields.lifecycle.archive.helpText": "e1d3f49d818d0807",
"metadataForms.object.fields.lifecycle.archive.keep.helpText": "5c64726b12f2717a",
"metadataForms.object.fields.lifecycle.archive.keep.label": "a4a66d4839231b06",
"metadataForms.object.fields.lifecycle.archive.label": "dc721777496e2512",
"metadataForms.object.fields.lifecycle.archive.to.helpText": "b086a13b2c7cbd23",
"metadataForms.object.fields.lifecycle.archive.to.label": "ca6e09b7adfeb23f",
"metadataForms.object.fields.lifecycle.class.helpText": "a2a0c1b381c361cf",
"metadataForms.object.fields.lifecycle.class.label": "e9dba3be46bf7fea",
"metadataForms.object.fields.lifecycle.helpText": "608118f856cec104",
"metadataForms.object.fields.lifecycle.label": "aeb8410b6c716b40",
"metadataForms.object.fields.lifecycle.reclaim.helpText": "3214ee85bf5ec2d1",
"metadataForms.object.fields.lifecycle.reclaim.label": "a3be311d3ce0282c",
"metadataForms.object.fields.lifecycle.retention.helpText": "3d8f859e28eb37ec",
"metadataForms.object.fields.lifecycle.retention.label": "a672155e6c24e41a",
"metadataForms.object.fields.lifecycle.retention.maxAge.helpText": "7cd18232c490868c",
"metadataForms.object.fields.lifecycle.retention.maxAge.label": "3654cac5ba14e6ce",
"metadataForms.object.fields.lifecycle.storage.helpText": "dc5d38fadc7e273c",
"metadataForms.object.fields.lifecycle.storage.label": "6fb0804db64324af",
"metadataForms.object.fields.lifecycle.storage.shards.helpText": "d948a024425640ba",
"metadataForms.object.fields.lifecycle.storage.shards.label": "739988affb36b2e0",
"metadataForms.object.fields.lifecycle.storage.strategy.helpText": "93bf61da82533a75",
"metadataForms.object.fields.lifecycle.storage.strategy.label": "785c1dd353da380b",
"metadataForms.object.fields.lifecycle.storage.unit.helpText": "f43af4c056eab727",
"metadataForms.object.fields.lifecycle.storage.unit.label": "c53f07123f162a30",
"metadataForms.object.fields.lifecycle.ttl.expireAfter.helpText": "ed226b79ee7fd60f",
"metadataForms.object.fields.lifecycle.ttl.expireAfter.label": "27a86cf076af8e84",
"metadataForms.object.fields.lifecycle.ttl.field.helpText": "66edfde80e1ee2ff",
"metadataForms.object.fields.lifecycle.ttl.field.label": "e21c314685cd95ca",
"metadataForms.object.fields.lifecycle.ttl.helpText": "9b125bc1584a941f",
"metadataForms.object.fields.lifecycle.ttl.label": "e37616f70b0d157a",
"objects.sys_account._actions.link_social.params.provider.options.apple": "cfdc41e15ed6699b",
"objects.sys_account._actions.link_social.params.provider.options.discord": "12f931cc062e76ae",
"objects.sys_account._actions.link_social.params.provider.options.facebook": "7eea009178f5b807",
Expand Down
Loading
Loading