From 109dafcc052ededa3da41f386ccb5b2ae77f6352 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 18 Aug 2026 22:39:53 +0000 Subject: [PATCH] docs(cli): document the i18n merge consequence for a corrected source string `os i18n extract` merges against committed bundles by default so a re-run never wipes a hand translation, and `--fill=default` only fills gaps. That means a source label/description that is later corrected does not propagate into a locale that already holds a translation of the old text -- a present-but-stale string is not a gap, so it is left as-is. This is intended behaviour and is unchanged; it was simply undocumented where the next reader looks. Two places now say so: - the merge-options comment in `os i18n extract`'s command implementation (packages/cli/src/commands/i18n/extract.ts) - the header comment written into every generated bundle (packages/cli/src/utils/i18n-extract.ts's renderTranslationModule) Committed bundles across the 9 packages that own i18n-extract.config.ts are regenerated (`node scripts/check-i18n-bundles.mjs --write`) so their header matches the new template -- translated content is byte-identical apart from the added header lines. Fixes #9672 Co-Authored-By: Claude --- .../i18n-merge-consequence-documented.md | 22 +++++++++++++++++++ packages/cli/src/commands/i18n/extract.ts | 10 +++++++++ packages/cli/src/utils/i18n-extract.ts | 6 +++++ .../en.metadata-forms.generated.ts | 6 +++++ .../apps/translations/en.objects.generated.ts | 6 +++++ .../es-ES.metadata-forms.generated.ts | 6 +++++ .../translations/es-ES.objects.generated.ts | 6 +++++ .../ja-JP.metadata-forms.generated.ts | 6 +++++ .../translations/ja-JP.objects.generated.ts | 6 +++++ .../zh-CN.metadata-forms.generated.ts | 6 +++++ .../translations/zh-CN.objects.generated.ts | 6 +++++ .../src/translations/en.objects.generated.ts | 6 +++++ .../translations/es-ES.objects.generated.ts | 6 +++++ .../translations/ja-JP.objects.generated.ts | 6 +++++ .../translations/zh-CN.objects.generated.ts | 6 +++++ .../src/translations/en.objects.generated.ts | 6 +++++ .../translations/es-ES.objects.generated.ts | 6 +++++ .../translations/ja-JP.objects.generated.ts | 6 +++++ .../translations/zh-CN.objects.generated.ts | 6 +++++ .../src/translations/en.objects.generated.ts | 6 +++++ .../translations/es-ES.objects.generated.ts | 6 +++++ .../translations/ja-JP.objects.generated.ts | 6 +++++ .../translations/zh-CN.objects.generated.ts | 6 +++++ .../src/translations/en.objects.generated.ts | 6 +++++ .../translations/es-ES.objects.generated.ts | 6 +++++ .../translations/ja-JP.objects.generated.ts | 6 +++++ .../translations/zh-CN.objects.generated.ts | 6 +++++ .../src/translations/en.objects.generated.ts | 6 +++++ .../translations/es-ES.objects.generated.ts | 6 +++++ .../translations/ja-JP.objects.generated.ts | 6 +++++ .../translations/zh-CN.objects.generated.ts | 6 +++++ .../src/translations/en.objects.generated.ts | 6 +++++ .../translations/es-ES.objects.generated.ts | 6 +++++ .../translations/ja-JP.objects.generated.ts | 6 +++++ .../translations/zh-CN.objects.generated.ts | 6 +++++ .../src/translations/en.objects.generated.ts | 6 +++++ .../translations/es-ES.objects.generated.ts | 6 +++++ .../translations/ja-JP.objects.generated.ts | 6 +++++ .../translations/zh-CN.objects.generated.ts | 6 +++++ .../src/translations/en.objects.generated.ts | 6 +++++ .../translations/es-ES.objects.generated.ts | 6 +++++ .../translations/ja-JP.objects.generated.ts | 6 +++++ .../translations/zh-CN.objects.generated.ts | 6 +++++ 43 files changed, 278 insertions(+) create mode 100644 .changeset/i18n-merge-consequence-documented.md diff --git a/.changeset/i18n-merge-consequence-documented.md b/.changeset/i18n-merge-consequence-documented.md new file mode 100644 index 0000000000..f3ea4ca299 --- /dev/null +++ b/.changeset/i18n-merge-consequence-documented.md @@ -0,0 +1,22 @@ +--- +"@objectstack/cli": patch +--- + +docs(cli): document the i18n merge consequence for a corrected source string (#9672) + +`os i18n extract` merges against committed bundles by default so a re-run never +wipes a hand translation, and `--fill=default` only fills gaps. That means a +source label/description that is later **corrected** does not propagate into a +locale that already holds a translation of the old text — a present-but-stale +string is not a gap, so it is left as-is. This was always the behaviour and +remains unchanged; it was simply undocumented where the next reader looks. + +Two places now say so: the merge-options comment in `os i18n extract`'s command +implementation, and the header comment written into every generated +`.objects.generated.ts` / `.metadata-forms.generated.ts` bundle. +Committed bundles across the repo are regenerated so their header matches the +new template (translated content is unchanged). + +`check:i18n`'s bundle-drift verdict still proves generated output matches the +schema; it does not compare a translated value against its source's meaning +(that remains an open appetite question, tracked separately — see #9672). diff --git a/packages/cli/src/commands/i18n/extract.ts b/packages/cli/src/commands/i18n/extract.ts index 0f327faee1..19ed045a10 100644 --- a/packages/cli/src/commands/i18n/extract.ts +++ b/packages/cli/src/commands/i18n/extract.ts @@ -136,6 +136,16 @@ export default class I18nExtract extends Command { locales, fill: flags.fill as FillStrategy, filter, + // Merge (the default) never overwrites an existing non-default-locale + // entry, so correcting a source label/description does not propagate + // into a locale that already holds a translation of the old text — + // a present-but-stale string is not a gap, only a missing one is. This + // is deliberate, not an oversight: the alternative, --no-merge, wipes + // every hand translation in the bundle, not just the ones the schema + // changed. The maintenance path is a translator re-editing the leaf in + // place (the generated bundle header names it); nothing here or in + // `os i18n check` distinguishes that deliberate edit from a leaf + // nobody has looked at since the source moved. mergeExisting: !flags['no-merge'], }); diff --git a/packages/cli/src/utils/i18n-extract.ts b/packages/cli/src/utils/i18n-extract.ts index 093d4feb77..e66ac3d593 100644 --- a/packages/cli/src/utils/i18n-extract.ts +++ b/packages/cli/src/utils/i18n-extract.ts @@ -1173,6 +1173,12 @@ export function renderTranslationModule( `Auto-generated by 'os i18n extract' for locale '${options.locale}'.`, 'Edit translations in place; re-run extract (with --merge) to fill new gaps.', 'Do not hand-edit the structure — only the leaf string values.', + 'Merge only fills gaps: correcting a source label/description does not', + 'push the correction into a leaf here that already holds a translation —', + 'a present-but-stale string is not a gap, so it is left as-is. Re-translate', + 'it by hand when its source changes; nothing here or in `os i18n check`', + 'tells a leaf a translator updated on purpose from one nobody has looked', + 'at since the source moved.', ]; const lines: string[] = []; diff --git a/packages/platform-objects/src/apps/translations/en.metadata-forms.generated.ts b/packages/platform-objects/src/apps/translations/en.metadata-forms.generated.ts index f76066c6f8..10270c3cba 100644 --- a/packages/platform-objects/src/apps/translations/en.metadata-forms.generated.ts +++ b/packages/platform-objects/src/apps/translations/en.metadata-forms.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'en'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/platform-objects/src/apps/translations/en.objects.generated.ts b/packages/platform-objects/src/apps/translations/en.objects.generated.ts index 898fe26d88..a631ccaa0c 100644 --- a/packages/platform-objects/src/apps/translations/en.objects.generated.ts +++ b/packages/platform-objects/src/apps/translations/en.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'en'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/platform-objects/src/apps/translations/es-ES.metadata-forms.generated.ts b/packages/platform-objects/src/apps/translations/es-ES.metadata-forms.generated.ts index b85a3ab312..f4c653ee68 100644 --- a/packages/platform-objects/src/apps/translations/es-ES.metadata-forms.generated.ts +++ b/packages/platform-objects/src/apps/translations/es-ES.metadata-forms.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'es-ES'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/platform-objects/src/apps/translations/es-ES.objects.generated.ts b/packages/platform-objects/src/apps/translations/es-ES.objects.generated.ts index a910aa821d..0dcaad4ef2 100644 --- a/packages/platform-objects/src/apps/translations/es-ES.objects.generated.ts +++ b/packages/platform-objects/src/apps/translations/es-ES.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'es-ES'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/platform-objects/src/apps/translations/ja-JP.metadata-forms.generated.ts b/packages/platform-objects/src/apps/translations/ja-JP.metadata-forms.generated.ts index 9a8774ef4b..7b60ed3afb 100644 --- a/packages/platform-objects/src/apps/translations/ja-JP.metadata-forms.generated.ts +++ b/packages/platform-objects/src/apps/translations/ja-JP.metadata-forms.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'ja-JP'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/platform-objects/src/apps/translations/ja-JP.objects.generated.ts b/packages/platform-objects/src/apps/translations/ja-JP.objects.generated.ts index 55f05c897e..d14ddd1184 100644 --- a/packages/platform-objects/src/apps/translations/ja-JP.objects.generated.ts +++ b/packages/platform-objects/src/apps/translations/ja-JP.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'ja-JP'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/platform-objects/src/apps/translations/zh-CN.metadata-forms.generated.ts b/packages/platform-objects/src/apps/translations/zh-CN.metadata-forms.generated.ts index 72b831c413..923e4f64c6 100644 --- a/packages/platform-objects/src/apps/translations/zh-CN.metadata-forms.generated.ts +++ b/packages/platform-objects/src/apps/translations/zh-CN.metadata-forms.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'zh-CN'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/platform-objects/src/apps/translations/zh-CN.objects.generated.ts b/packages/platform-objects/src/apps/translations/zh-CN.objects.generated.ts index a33958f3a3..f834c0bcb7 100644 --- a/packages/platform-objects/src/apps/translations/zh-CN.objects.generated.ts +++ b/packages/platform-objects/src/apps/translations/zh-CN.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'zh-CN'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-approvals/src/translations/en.objects.generated.ts b/packages/plugins/plugin-approvals/src/translations/en.objects.generated.ts index a1465aa993..560da1570d 100644 --- a/packages/plugins/plugin-approvals/src/translations/en.objects.generated.ts +++ b/packages/plugins/plugin-approvals/src/translations/en.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'en'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-approvals/src/translations/es-ES.objects.generated.ts b/packages/plugins/plugin-approvals/src/translations/es-ES.objects.generated.ts index 6094a97e52..f7a7399a37 100644 --- a/packages/plugins/plugin-approvals/src/translations/es-ES.objects.generated.ts +++ b/packages/plugins/plugin-approvals/src/translations/es-ES.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'es-ES'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-approvals/src/translations/ja-JP.objects.generated.ts b/packages/plugins/plugin-approvals/src/translations/ja-JP.objects.generated.ts index 7274f2c975..0428500655 100644 --- a/packages/plugins/plugin-approvals/src/translations/ja-JP.objects.generated.ts +++ b/packages/plugins/plugin-approvals/src/translations/ja-JP.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'ja-JP'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-approvals/src/translations/zh-CN.objects.generated.ts b/packages/plugins/plugin-approvals/src/translations/zh-CN.objects.generated.ts index 603095302a..931731f4a6 100644 --- a/packages/plugins/plugin-approvals/src/translations/zh-CN.objects.generated.ts +++ b/packages/plugins/plugin-approvals/src/translations/zh-CN.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'zh-CN'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-audit/src/translations/en.objects.generated.ts b/packages/plugins/plugin-audit/src/translations/en.objects.generated.ts index 31dca5e80b..7b9fe2485a 100644 --- a/packages/plugins/plugin-audit/src/translations/en.objects.generated.ts +++ b/packages/plugins/plugin-audit/src/translations/en.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'en'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-audit/src/translations/es-ES.objects.generated.ts b/packages/plugins/plugin-audit/src/translations/es-ES.objects.generated.ts index fffa53d40e..946c8840c9 100644 --- a/packages/plugins/plugin-audit/src/translations/es-ES.objects.generated.ts +++ b/packages/plugins/plugin-audit/src/translations/es-ES.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'es-ES'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-audit/src/translations/ja-JP.objects.generated.ts b/packages/plugins/plugin-audit/src/translations/ja-JP.objects.generated.ts index 8eaf186cfd..7bfc4881ad 100644 --- a/packages/plugins/plugin-audit/src/translations/ja-JP.objects.generated.ts +++ b/packages/plugins/plugin-audit/src/translations/ja-JP.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'ja-JP'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-audit/src/translations/zh-CN.objects.generated.ts b/packages/plugins/plugin-audit/src/translations/zh-CN.objects.generated.ts index efafe9487e..3e04bfdf5a 100644 --- a/packages/plugins/plugin-audit/src/translations/zh-CN.objects.generated.ts +++ b/packages/plugins/plugin-audit/src/translations/zh-CN.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'zh-CN'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-security/src/translations/en.objects.generated.ts b/packages/plugins/plugin-security/src/translations/en.objects.generated.ts index 8309f8d8f6..a1e34584ae 100644 --- a/packages/plugins/plugin-security/src/translations/en.objects.generated.ts +++ b/packages/plugins/plugin-security/src/translations/en.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'en'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-security/src/translations/es-ES.objects.generated.ts b/packages/plugins/plugin-security/src/translations/es-ES.objects.generated.ts index d714cd9306..6426c410dc 100644 --- a/packages/plugins/plugin-security/src/translations/es-ES.objects.generated.ts +++ b/packages/plugins/plugin-security/src/translations/es-ES.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'es-ES'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-security/src/translations/ja-JP.objects.generated.ts b/packages/plugins/plugin-security/src/translations/ja-JP.objects.generated.ts index 5d4eaea6a2..a6c48a8a88 100644 --- a/packages/plugins/plugin-security/src/translations/ja-JP.objects.generated.ts +++ b/packages/plugins/plugin-security/src/translations/ja-JP.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'ja-JP'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-security/src/translations/zh-CN.objects.generated.ts b/packages/plugins/plugin-security/src/translations/zh-CN.objects.generated.ts index 17995cc2b8..ebb7887397 100644 --- a/packages/plugins/plugin-security/src/translations/zh-CN.objects.generated.ts +++ b/packages/plugins/plugin-security/src/translations/zh-CN.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'zh-CN'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-sharing/src/translations/en.objects.generated.ts b/packages/plugins/plugin-sharing/src/translations/en.objects.generated.ts index 12724a9c1f..2da79799dd 100644 --- a/packages/plugins/plugin-sharing/src/translations/en.objects.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/en.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'en'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-sharing/src/translations/es-ES.objects.generated.ts b/packages/plugins/plugin-sharing/src/translations/es-ES.objects.generated.ts index ad8dda15d6..01390fa9fd 100644 --- a/packages/plugins/plugin-sharing/src/translations/es-ES.objects.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/es-ES.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'es-ES'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-sharing/src/translations/ja-JP.objects.generated.ts b/packages/plugins/plugin-sharing/src/translations/ja-JP.objects.generated.ts index c078ee2177..8ac2b7d9b0 100644 --- a/packages/plugins/plugin-sharing/src/translations/ja-JP.objects.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/ja-JP.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'ja-JP'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-sharing/src/translations/zh-CN.objects.generated.ts b/packages/plugins/plugin-sharing/src/translations/zh-CN.objects.generated.ts index 66bb3829cc..ebf859204c 100644 --- a/packages/plugins/plugin-sharing/src/translations/zh-CN.objects.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/zh-CN.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'zh-CN'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-webhooks/src/translations/en.objects.generated.ts b/packages/plugins/plugin-webhooks/src/translations/en.objects.generated.ts index 1889323872..1ea53337dd 100644 --- a/packages/plugins/plugin-webhooks/src/translations/en.objects.generated.ts +++ b/packages/plugins/plugin-webhooks/src/translations/en.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'en'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-webhooks/src/translations/es-ES.objects.generated.ts b/packages/plugins/plugin-webhooks/src/translations/es-ES.objects.generated.ts index 37c8497ef5..065eaec46c 100644 --- a/packages/plugins/plugin-webhooks/src/translations/es-ES.objects.generated.ts +++ b/packages/plugins/plugin-webhooks/src/translations/es-ES.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'es-ES'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-webhooks/src/translations/ja-JP.objects.generated.ts b/packages/plugins/plugin-webhooks/src/translations/ja-JP.objects.generated.ts index 27793f9a79..1fbad9f155 100644 --- a/packages/plugins/plugin-webhooks/src/translations/ja-JP.objects.generated.ts +++ b/packages/plugins/plugin-webhooks/src/translations/ja-JP.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'ja-JP'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/plugins/plugin-webhooks/src/translations/zh-CN.objects.generated.ts b/packages/plugins/plugin-webhooks/src/translations/zh-CN.objects.generated.ts index c28a1a872b..a48589537c 100644 --- a/packages/plugins/plugin-webhooks/src/translations/zh-CN.objects.generated.ts +++ b/packages/plugins/plugin-webhooks/src/translations/zh-CN.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'zh-CN'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/services/service-messaging/src/translations/en.objects.generated.ts b/packages/services/service-messaging/src/translations/en.objects.generated.ts index cec152cf06..ac3330d9a0 100644 --- a/packages/services/service-messaging/src/translations/en.objects.generated.ts +++ b/packages/services/service-messaging/src/translations/en.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'en'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/services/service-messaging/src/translations/es-ES.objects.generated.ts b/packages/services/service-messaging/src/translations/es-ES.objects.generated.ts index c0c0f2e3d8..662487ca3f 100644 --- a/packages/services/service-messaging/src/translations/es-ES.objects.generated.ts +++ b/packages/services/service-messaging/src/translations/es-ES.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'es-ES'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/services/service-messaging/src/translations/ja-JP.objects.generated.ts b/packages/services/service-messaging/src/translations/ja-JP.objects.generated.ts index b7c9a8bb3a..4ed091e539 100644 --- a/packages/services/service-messaging/src/translations/ja-JP.objects.generated.ts +++ b/packages/services/service-messaging/src/translations/ja-JP.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'ja-JP'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/services/service-messaging/src/translations/zh-CN.objects.generated.ts b/packages/services/service-messaging/src/translations/zh-CN.objects.generated.ts index 67cc72cf2f..bc8ebd85d8 100644 --- a/packages/services/service-messaging/src/translations/zh-CN.objects.generated.ts +++ b/packages/services/service-messaging/src/translations/zh-CN.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'zh-CN'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/services/service-realtime/src/translations/en.objects.generated.ts b/packages/services/service-realtime/src/translations/en.objects.generated.ts index 2cf3bc77ce..e29bd4a38e 100644 --- a/packages/services/service-realtime/src/translations/en.objects.generated.ts +++ b/packages/services/service-realtime/src/translations/en.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'en'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/services/service-realtime/src/translations/es-ES.objects.generated.ts b/packages/services/service-realtime/src/translations/es-ES.objects.generated.ts index 0c41f603aa..3b656e84c5 100644 --- a/packages/services/service-realtime/src/translations/es-ES.objects.generated.ts +++ b/packages/services/service-realtime/src/translations/es-ES.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'es-ES'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/services/service-realtime/src/translations/ja-JP.objects.generated.ts b/packages/services/service-realtime/src/translations/ja-JP.objects.generated.ts index 935829b8a7..29bdfc3490 100644 --- a/packages/services/service-realtime/src/translations/ja-JP.objects.generated.ts +++ b/packages/services/service-realtime/src/translations/ja-JP.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'ja-JP'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/services/service-realtime/src/translations/zh-CN.objects.generated.ts b/packages/services/service-realtime/src/translations/zh-CN.objects.generated.ts index 3662ed1534..e41f5399f7 100644 --- a/packages/services/service-realtime/src/translations/zh-CN.objects.generated.ts +++ b/packages/services/service-realtime/src/translations/zh-CN.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'zh-CN'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/services/service-storage/src/translations/en.objects.generated.ts b/packages/services/service-storage/src/translations/en.objects.generated.ts index 23f0f829fa..c6e281ecec 100644 --- a/packages/services/service-storage/src/translations/en.objects.generated.ts +++ b/packages/services/service-storage/src/translations/en.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'en'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/services/service-storage/src/translations/es-ES.objects.generated.ts b/packages/services/service-storage/src/translations/es-ES.objects.generated.ts index c4bac9cb7a..2aa6b04216 100644 --- a/packages/services/service-storage/src/translations/es-ES.objects.generated.ts +++ b/packages/services/service-storage/src/translations/es-ES.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'es-ES'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/services/service-storage/src/translations/ja-JP.objects.generated.ts b/packages/services/service-storage/src/translations/ja-JP.objects.generated.ts index 5ef7b54973..09f6f70420 100644 --- a/packages/services/service-storage/src/translations/ja-JP.objects.generated.ts +++ b/packages/services/service-storage/src/translations/ja-JP.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'ja-JP'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system'; diff --git a/packages/services/service-storage/src/translations/zh-CN.objects.generated.ts b/packages/services/service-storage/src/translations/zh-CN.objects.generated.ts index b4b60cabe6..9825711310 100644 --- a/packages/services/service-storage/src/translations/zh-CN.objects.generated.ts +++ b/packages/services/service-storage/src/translations/zh-CN.objects.generated.ts @@ -4,6 +4,12 @@ * Auto-generated by 'os i18n extract' for locale 'zh-CN'. * Edit translations in place; re-run extract (with --merge) to fill new gaps. * Do not hand-edit the structure — only the leaf string values. + * Merge only fills gaps: correcting a source label/description does not + * push the correction into a leaf here that already holds a translation — + * a present-but-stale string is not a gap, so it is left as-is. Re-translate + * it by hand when its source changes; nothing here or in `os i18n check` + * tells a leaf a translator updated on purpose from one nobody has looked + * at since the source moved. */ import type { TranslationData } from '@objectstack/spec/system';