From 28ebd23538960465127b51dce81e107659927e8a Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 5 Nov 2026 14:07:51 +0000 Subject: [PATCH] i18n(service-realtime): ship sys_presence in zh-Hant, ar, fr, pt-BR, ru, de and ko Co-Authored-By: Claude Claude-Session: https://claude.ai/code/session_01Utp6Cai5CRdAs4u9gTipWU --- .changeset/30512-service-realtime-locales.md | 10 +++ .../scripts/i18n-extract.config.ts | 16 +++- .../src/translations/ar.objects.generated.ts | 75 +++++++++++++++++++ .../ar.source-hashes.generated.ts | 21 ++++++ .../src/translations/bundle-ownership.test.ts | 2 +- .../src/translations/de.objects.generated.ts | 75 +++++++++++++++++++ .../de.source-hashes.generated.ts | 26 +++++++ .../src/translations/fr.objects.generated.ts | 75 +++++++++++++++++++ .../fr.source-hashes.generated.ts | 23 ++++++ .../src/translations/index.ts | 21 ++++++ .../src/translations/ko.objects.generated.ts | 75 +++++++++++++++++++ .../ko.source-hashes.generated.ts | 21 ++++++ .../translations/pt-BR.objects.generated.ts | 75 +++++++++++++++++++ .../pt-BR.source-hashes.generated.ts | 26 +++++++ .../src/translations/ru.objects.generated.ts | 75 +++++++++++++++++++ .../ru.source-hashes.generated.ts | 21 ++++++ .../translations/zh-Hant.objects.generated.ts | 75 +++++++++++++++++++ .../zh-Hant.source-hashes.generated.ts | 21 ++++++ 18 files changed, 731 insertions(+), 2 deletions(-) create mode 100644 .changeset/30512-service-realtime-locales.md create mode 100644 packages/services/service-realtime/src/translations/ar.objects.generated.ts create mode 100644 packages/services/service-realtime/src/translations/ar.source-hashes.generated.ts create mode 100644 packages/services/service-realtime/src/translations/de.objects.generated.ts create mode 100644 packages/services/service-realtime/src/translations/de.source-hashes.generated.ts create mode 100644 packages/services/service-realtime/src/translations/fr.objects.generated.ts create mode 100644 packages/services/service-realtime/src/translations/fr.source-hashes.generated.ts create mode 100644 packages/services/service-realtime/src/translations/ko.objects.generated.ts create mode 100644 packages/services/service-realtime/src/translations/ko.source-hashes.generated.ts create mode 100644 packages/services/service-realtime/src/translations/pt-BR.objects.generated.ts create mode 100644 packages/services/service-realtime/src/translations/pt-BR.source-hashes.generated.ts create mode 100644 packages/services/service-realtime/src/translations/ru.objects.generated.ts create mode 100644 packages/services/service-realtime/src/translations/ru.source-hashes.generated.ts create mode 100644 packages/services/service-realtime/src/translations/zh-Hant.objects.generated.ts create mode 100644 packages/services/service-realtime/src/translations/zh-Hant.source-hashes.generated.ts diff --git a/.changeset/30512-service-realtime-locales.md b/.changeset/30512-service-realtime-locales.md new file mode 100644 index 00000000000..38c87135504 --- /dev/null +++ b/.changeset/30512-service-realtime-locales.md @@ -0,0 +1,10 @@ +--- +'@objectstack/service-realtime': patch +--- + +i18n(service-realtime): the presence object's labels, help and option names ship in all eleven platform languages + +Clause-②: no +Metadata-protocol: none + +`sys_presence` now carries Traditional Chinese (`zh-Hant`), Arabic (`ar`), French (`fr`), Brazilian Portuguese (`pt-BR`), Russian (`ru`), German (`de`) and Korean (`ko`) beside the existing `en`, `zh-CN`, `ja-JP` and `es-ES`, so a reader in one of those languages sees the object's labels in their own language instead of English. Each new locale is registered under its platform-table tag and carries its source-hash companion, and the package's extract command lists the seven tags, so the existing `check:i18n` bundle check covers them. Part of #30512. diff --git a/packages/services/service-realtime/scripts/i18n-extract.config.ts b/packages/services/service-realtime/scripts/i18n-extract.config.ts index c196fdfd5ca..609cdcb4e11 100644 --- a/packages/services/service-realtime/scripts/i18n-extract.config.ts +++ b/packages/services/service-realtime/scripts/i18n-extract.config.ts @@ -8,7 +8,7 @@ * strings were seeded from @objectstack/platform-objects.) * * os i18n extract packages/services/service-realtime/scripts/i18n-extract.config.ts \ - * --locales=zh-CN,ja-JP,es-ES --fill=default --objects-only --no-metadata-forms \ + * --locales=zh-CN,ja-JP,es-ES,zh-Hant,ar,fr,pt-BR,ru,de,ko --fill=default --objects-only --no-metadata-forms \ * --source-hashes \ * --out=packages/services/service-realtime/src/translations * @@ -42,6 +42,13 @@ import { enObjects } from '../src/translations/en.objects.generated.js'; import { zhCNObjects } from '../src/translations/zh-CN.objects.generated.js'; import { jaJPObjects } from '../src/translations/ja-JP.objects.generated.js'; import { esESObjects } from '../src/translations/es-ES.objects.generated.js'; +import { zhHantObjects } from '../src/translations/zh-Hant.objects.generated.js'; +import { arObjects } from '../src/translations/ar.objects.generated.js'; +import { frObjects } from '../src/translations/fr.objects.generated.js'; +import { ptBRObjects } from '../src/translations/pt-BR.objects.generated.js'; +import { ruObjects } from '../src/translations/ru.objects.generated.js'; +import { deObjects } from '../src/translations/de.objects.generated.js'; +import { koObjects } from '../src/translations/ko.objects.generated.js'; /** * The annotation is load-bearing, not decoration (#10868). `defineStack` @@ -64,6 +71,13 @@ const config: ObjectStackDefinition = defineStack({ { 'zh-CN': { objects: zhCNObjects } }, { 'ja-JP': { objects: jaJPObjects } }, { 'es-ES': { objects: esESObjects } }, + { 'zh-Hant': { objects: zhHantObjects } }, + { 'ar': { objects: arObjects } }, + { 'fr': { objects: frObjects } }, + { 'pt-BR': { objects: ptBRObjects } }, + { 'ru': { objects: ruObjects } }, + { 'de': { objects: deObjects } }, + { 'ko': { objects: koObjects } }, ], }); diff --git a/packages/services/service-realtime/src/translations/ar.objects.generated.ts b/packages/services/service-realtime/src/translations/ar.objects.generated.ts new file mode 100644 index 00000000000..28a6c5ddb23 --- /dev/null +++ b/packages/services/service-realtime/src/translations/ar.objects.generated.ts @@ -0,0 +1,75 @@ +// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Auto-generated by 'os i18n extract' for locale 'ar'. + * 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'; + +export const arObjects: NonNullable = { + sys_presence: { + label: "الحضور", + pluralLabel: "حالات الحضور", + description: "تتبّع حضور المستخدمين ونشاطهم في الوقت الفعلي", + fields: { + id: { + label: "معرّف الحضور" + }, + display_title: { + label: "العنوان", + help: "عنوان السجل: المستخدم وحالة حضوره (يُحسب عند القراءة)" + }, + created_at: { + label: "تاريخ الإنشاء" + }, + updated_at: { + label: "تاريخ التحديث" + }, + user_id: { + label: "المستخدم" + }, + session_id: { + label: "الجلسة" + }, + status: { + label: "الحالة", + options: { + online: "متصل", + away: "بعيد", + busy: "مشغول", + offline: "غير متصل" + } + }, + last_seen: { + label: "آخر ظهور" + }, + current_location: { + label: "الموقع الحالي" + }, + device: { + label: "الجهاز", + options: { + desktop: "سطح المكتب", + mobile: "الهاتف المحمول", + tablet: "الجهاز اللوحي", + other: "أخرى" + } + }, + custom_status: { + label: "الحالة المخصّصة" + }, + metadata: { + label: "البيانات الوصفية", + help: "بيانات وصفية عشوائية بصيغة JSON مرتبطة بحالة الحضور (تطابق PresenceStateSchema.metadata)." + } + } + } +}; diff --git a/packages/services/service-realtime/src/translations/ar.source-hashes.generated.ts b/packages/services/service-realtime/src/translations/ar.source-hashes.generated.ts new file mode 100644 index 00000000000..728daa2a100 --- /dev/null +++ b/packages/services/service-realtime/src/translations/ar.source-hashes.generated.ts @@ -0,0 +1,21 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Auto-generated by 'os i18n extract' for locale 'ar'. Do not hand-edit. + * + * Each entry is the digest of the SOURCE REVISION that this locale's leaf at + * that path is still a byte copy of — provenance for the generated half of the + * bundles (commit 09b4f4e4e): a leaf whose digest no longer matches its source is stale and serves the source text instead. + * + * An entry exists only while the leaf IS such a copy. Re-translate the leaf in + * `.objects.generated.ts` and the next extract drops its entry by + * itself — the table makes no claim about text a translator wrote. A path with + * no entry is LEGACY-TRUSTED and never reported stale. + * + * ⚠️ Do not "fix" a staleness report by editing this file. Refreshing a digest + * records that the current text was copied from the current source, which is + * the false claim the mechanism exists to detect. Fix the TRANSLATION. + */ + +export const arGeneratedSourceHashes: Readonly> = { +}; diff --git a/packages/services/service-realtime/src/translations/bundle-ownership.test.ts b/packages/services/service-realtime/src/translations/bundle-ownership.test.ts index 6d9591ca76c..b18ab99f801 100644 --- a/packages/services/service-realtime/src/translations/bundle-ownership.test.ts +++ b/packages/services/service-realtime/src/translations/bundle-ownership.test.ts @@ -27,7 +27,7 @@ describe('objects translation bundle ownership (ADR-0029 D8)', () => { strays, `bundle carries objects this package's extract config does not own: ${strays.join(', ')} — ` + 'their curated translations would be silently deleted on the next `os i18n extract`. ' + - 'Remove the dead block from the four locale bundles, or add the object to the extract config + this list.', + 'Remove the dead block from every locale bundle, or add the object to the extract config + this list.', ).toEqual([]); }); diff --git a/packages/services/service-realtime/src/translations/de.objects.generated.ts b/packages/services/service-realtime/src/translations/de.objects.generated.ts new file mode 100644 index 00000000000..03bca92a7b3 --- /dev/null +++ b/packages/services/service-realtime/src/translations/de.objects.generated.ts @@ -0,0 +1,75 @@ +// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Auto-generated by 'os i18n extract' for locale 'de'. + * 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'; + +export const deObjects: NonNullable = { + sys_presence: { + label: "Anwesenheit", + pluralLabel: "Anwesenheiten", + description: "Echtzeit-Verfolgung von Anwesenheit und Aktivität der Benutzer", + fields: { + id: { + label: "Anwesenheits-ID" + }, + display_title: { + label: "Titel", + help: "Datensatztitel: der Benutzer und sein Anwesenheitsstatus (beim Lesen berechnet)" + }, + created_at: { + label: "Erstellt am" + }, + updated_at: { + label: "Aktualisiert am" + }, + user_id: { + label: "Benutzer" + }, + session_id: { + label: "Sitzung" + }, + status: { + label: "Status", + options: { + online: "Online", + away: "Abwesend", + busy: "Beschäftigt", + offline: "Offline" + } + }, + last_seen: { + label: "Zuletzt gesehen" + }, + current_location: { + label: "Aktueller Ort" + }, + device: { + label: "Gerät", + options: { + desktop: "Desktop", + mobile: "Mobilgerät", + tablet: "Tablet", + other: "Sonstiges" + } + }, + custom_status: { + label: "Benutzerdefinierter Status" + }, + metadata: { + label: "Metadaten", + help: "Beliebige JSON-Metadaten zum Anwesenheitsstatus (entspricht PresenceStateSchema.metadata)." + } + } + } +}; diff --git a/packages/services/service-realtime/src/translations/de.source-hashes.generated.ts b/packages/services/service-realtime/src/translations/de.source-hashes.generated.ts new file mode 100644 index 00000000000..7e897a61db0 --- /dev/null +++ b/packages/services/service-realtime/src/translations/de.source-hashes.generated.ts @@ -0,0 +1,26 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Auto-generated by 'os i18n extract' for locale 'de'. Do not hand-edit. + * + * Each entry is the digest of the SOURCE REVISION that this locale's leaf at + * that path is still a byte copy of — provenance for the generated half of the + * bundles (commit 09b4f4e4e): a leaf whose digest no longer matches its source is stale and serves the source text instead. + * + * An entry exists only while the leaf IS such a copy. Re-translate the leaf in + * `.objects.generated.ts` and the next extract drops its entry by + * itself — the table makes no claim about text a translator wrote. A path with + * no entry is LEGACY-TRUSTED and never reported stale. + * + * ⚠️ Do not "fix" a staleness report by editing this file. Refreshing a digest + * records that the current text was copied from the current source, which is + * the false claim the mechanism exists to detect. Fix the TRANSLATION. + */ + +export const deGeneratedSourceHashes: Readonly> = { + "objects.sys_presence.fields.device.options.desktop": "cc1bf941a947048d", + "objects.sys_presence.fields.device.options.tablet": "7a8f4fab8baceb72", + "objects.sys_presence.fields.status.label": "64a420165247654b", + "objects.sys_presence.fields.status.options.offline": "322a7ca59145b5d8", + "objects.sys_presence.fields.status.options.online": "ac0927911fe6b7c1", +}; diff --git a/packages/services/service-realtime/src/translations/fr.objects.generated.ts b/packages/services/service-realtime/src/translations/fr.objects.generated.ts new file mode 100644 index 00000000000..63f54fc5f4f --- /dev/null +++ b/packages/services/service-realtime/src/translations/fr.objects.generated.ts @@ -0,0 +1,75 @@ +// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Auto-generated by 'os i18n extract' for locale 'fr'. + * 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'; + +export const frObjects: NonNullable = { + sys_presence: { + label: "Présence", + pluralLabel: "Présences", + description: "Suivi en temps réel de la présence et de l’activité des utilisateurs", + fields: { + id: { + label: "ID de présence" + }, + display_title: { + label: "Titre", + help: "Titre de l’enregistrement : l’utilisateur et son état de présence (calculé à la lecture)" + }, + created_at: { + label: "Créé le" + }, + updated_at: { + label: "Mis à jour le" + }, + user_id: { + label: "Utilisateur" + }, + session_id: { + label: "Session" + }, + status: { + label: "Statut", + options: { + online: "En ligne", + away: "Absent", + busy: "Occupé", + offline: "Hors ligne" + } + }, + last_seen: { + label: "Vu pour la dernière fois" + }, + current_location: { + label: "Emplacement actuel" + }, + device: { + label: "Appareil", + options: { + desktop: "Ordinateur", + mobile: "Mobile", + tablet: "Tablette", + other: "Autre" + } + }, + custom_status: { + label: "Statut personnalisé" + }, + metadata: { + label: "Métadonnées", + help: "Métadonnées JSON arbitraires associées à l’état de présence (correspond à PresenceStateSchema.metadata)." + } + } + } +}; diff --git a/packages/services/service-realtime/src/translations/fr.source-hashes.generated.ts b/packages/services/service-realtime/src/translations/fr.source-hashes.generated.ts new file mode 100644 index 00000000000..edb2b73911c --- /dev/null +++ b/packages/services/service-realtime/src/translations/fr.source-hashes.generated.ts @@ -0,0 +1,23 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Auto-generated by 'os i18n extract' for locale 'fr'. Do not hand-edit. + * + * Each entry is the digest of the SOURCE REVISION that this locale's leaf at + * that path is still a byte copy of — provenance for the generated half of the + * bundles (commit 09b4f4e4e): a leaf whose digest no longer matches its source is stale and serves the source text instead. + * + * An entry exists only while the leaf IS such a copy. Re-translate the leaf in + * `.objects.generated.ts` and the next extract drops its entry by + * itself — the table makes no claim about text a translator wrote. A path with + * no entry is LEGACY-TRUSTED and never reported stale. + * + * ⚠️ Do not "fix" a staleness report by editing this file. Refreshing a digest + * records that the current text was copied from the current source, which is + * the false claim the mechanism exists to detect. Fix the TRANSLATION. + */ + +export const frGeneratedSourceHashes: Readonly> = { + "objects.sys_presence.fields.device.options.mobile": "b93f18e1a3526425", + "objects.sys_presence.fields.session_id.label": "2650b5c24a1853d7", +}; diff --git a/packages/services/service-realtime/src/translations/index.ts b/packages/services/service-realtime/src/translations/index.ts index cb6af431095..14874219f16 100644 --- a/packages/services/service-realtime/src/translations/index.ts +++ b/packages/services/service-realtime/src/translations/index.ts @@ -16,9 +16,23 @@ import { enObjects } from './en.objects.generated.js'; import { zhCNObjects } from './zh-CN.objects.generated.js'; import { jaJPObjects } from './ja-JP.objects.generated.js'; import { esESObjects } from './es-ES.objects.generated.js'; +import { zhHantObjects } from './zh-Hant.objects.generated.js'; +import { arObjects } from './ar.objects.generated.js'; +import { frObjects } from './fr.objects.generated.js'; +import { ptBRObjects } from './pt-BR.objects.generated.js'; +import { ruObjects } from './ru.objects.generated.js'; +import { deObjects } from './de.objects.generated.js'; +import { koObjects } from './ko.objects.generated.js'; import { zhCNGeneratedSourceHashes } from './zh-CN.source-hashes.generated.js'; import { jaJPGeneratedSourceHashes } from './ja-JP.source-hashes.generated.js'; import { esESGeneratedSourceHashes } from './es-ES.source-hashes.generated.js'; +import { zhHantGeneratedSourceHashes } from './zh-Hant.source-hashes.generated.js'; +import { arGeneratedSourceHashes } from './ar.source-hashes.generated.js'; +import { frGeneratedSourceHashes } from './fr.source-hashes.generated.js'; +import { ptBRGeneratedSourceHashes } from './pt-BR.source-hashes.generated.js'; +import { ruGeneratedSourceHashes } from './ru.source-hashes.generated.js'; +import { deGeneratedSourceHashes } from './de.source-hashes.generated.js'; +import { koGeneratedSourceHashes } from './ko.source-hashes.generated.js'; /** * ## The provenance companions are READ here, not merely recorded @@ -54,4 +68,11 @@ export const RealtimeTranslations: TranslationBundle = { 'zh-CN': withSourceFallback({ objects: zhCNObjects }, enSource, undefined, zhCNGeneratedSourceHashes), 'ja-JP': withSourceFallback({ objects: jaJPObjects }, enSource, undefined, jaJPGeneratedSourceHashes), 'es-ES': withSourceFallback({ objects: esESObjects }, enSource, undefined, esESGeneratedSourceHashes), + 'zh-Hant': withSourceFallback({ objects: zhHantObjects }, enSource, undefined, zhHantGeneratedSourceHashes), + 'ar': withSourceFallback({ objects: arObjects }, enSource, undefined, arGeneratedSourceHashes), + 'fr': withSourceFallback({ objects: frObjects }, enSource, undefined, frGeneratedSourceHashes), + 'pt-BR': withSourceFallback({ objects: ptBRObjects }, enSource, undefined, ptBRGeneratedSourceHashes), + 'ru': withSourceFallback({ objects: ruObjects }, enSource, undefined, ruGeneratedSourceHashes), + 'de': withSourceFallback({ objects: deObjects }, enSource, undefined, deGeneratedSourceHashes), + 'ko': withSourceFallback({ objects: koObjects }, enSource, undefined, koGeneratedSourceHashes), }; diff --git a/packages/services/service-realtime/src/translations/ko.objects.generated.ts b/packages/services/service-realtime/src/translations/ko.objects.generated.ts new file mode 100644 index 00000000000..67372303451 --- /dev/null +++ b/packages/services/service-realtime/src/translations/ko.objects.generated.ts @@ -0,0 +1,75 @@ +// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Auto-generated by 'os i18n extract' for locale 'ko'. + * 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'; + +export const koObjects: NonNullable = { + sys_presence: { + label: "접속 상태", + pluralLabel: "접속 상태", + description: "실시간 사용자 접속 상태 및 활동 추적", + fields: { + id: { + label: "접속 상태 ID" + }, + display_title: { + label: "제목", + help: "레코드 제목: 사용자와 접속 상태(읽을 때 계산됨)" + }, + created_at: { + label: "생성 일시" + }, + updated_at: { + label: "수정 일시" + }, + user_id: { + label: "사용자" + }, + session_id: { + label: "세션" + }, + status: { + label: "상태", + options: { + online: "온라인", + away: "자리 비움", + busy: "바쁨", + offline: "오프라인" + } + }, + last_seen: { + label: "마지막 접속" + }, + current_location: { + label: "현재 위치" + }, + device: { + label: "기기", + options: { + desktop: "데스크톱", + mobile: "모바일", + tablet: "태블릿", + other: "기타" + } + }, + custom_status: { + label: "사용자 지정 상태" + }, + metadata: { + label: "메타데이터", + help: "접속 상태와 연결된 임의의 JSON 메타데이터(PresenceStateSchema.metadata와 일치)." + } + } + } +}; diff --git a/packages/services/service-realtime/src/translations/ko.source-hashes.generated.ts b/packages/services/service-realtime/src/translations/ko.source-hashes.generated.ts new file mode 100644 index 00000000000..5ec3ebc3496 --- /dev/null +++ b/packages/services/service-realtime/src/translations/ko.source-hashes.generated.ts @@ -0,0 +1,21 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Auto-generated by 'os i18n extract' for locale 'ko'. Do not hand-edit. + * + * Each entry is the digest of the SOURCE REVISION that this locale's leaf at + * that path is still a byte copy of — provenance for the generated half of the + * bundles (commit 09b4f4e4e): a leaf whose digest no longer matches its source is stale and serves the source text instead. + * + * An entry exists only while the leaf IS such a copy. Re-translate the leaf in + * `.objects.generated.ts` and the next extract drops its entry by + * itself — the table makes no claim about text a translator wrote. A path with + * no entry is LEGACY-TRUSTED and never reported stale. + * + * ⚠️ Do not "fix" a staleness report by editing this file. Refreshing a digest + * records that the current text was copied from the current source, which is + * the false claim the mechanism exists to detect. Fix the TRANSLATION. + */ + +export const koGeneratedSourceHashes: Readonly> = { +}; diff --git a/packages/services/service-realtime/src/translations/pt-BR.objects.generated.ts b/packages/services/service-realtime/src/translations/pt-BR.objects.generated.ts new file mode 100644 index 00000000000..586989cec1c --- /dev/null +++ b/packages/services/service-realtime/src/translations/pt-BR.objects.generated.ts @@ -0,0 +1,75 @@ +// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Auto-generated by 'os i18n extract' for locale 'pt-BR'. + * 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'; + +export const ptBRObjects: NonNullable = { + sys_presence: { + label: "Presença", + pluralLabel: "Presenças", + description: "Rastreamento em tempo real da presença e da atividade dos usuários", + fields: { + id: { + label: "ID de presença" + }, + display_title: { + label: "Título", + help: "Título do registro: o usuário e seu status de presença (calculado na leitura)" + }, + created_at: { + label: "Criado em" + }, + updated_at: { + label: "Atualizado em" + }, + user_id: { + label: "Usuário" + }, + session_id: { + label: "Sessão" + }, + status: { + label: "Status", + options: { + online: "Online", + away: "Ausente", + busy: "Ocupado", + offline: "Offline" + } + }, + last_seen: { + label: "Visto por último" + }, + current_location: { + label: "Local atual" + }, + device: { + label: "Dispositivo", + options: { + desktop: "Desktop", + mobile: "Celular", + tablet: "Tablet", + other: "Outro" + } + }, + custom_status: { + label: "Status personalizado" + }, + metadata: { + label: "Metadados", + help: "Metadados JSON arbitrários associados ao estado de presença (corresponde a PresenceStateSchema.metadata)." + } + } + } +}; diff --git a/packages/services/service-realtime/src/translations/pt-BR.source-hashes.generated.ts b/packages/services/service-realtime/src/translations/pt-BR.source-hashes.generated.ts new file mode 100644 index 00000000000..5d6bf39a939 --- /dev/null +++ b/packages/services/service-realtime/src/translations/pt-BR.source-hashes.generated.ts @@ -0,0 +1,26 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Auto-generated by 'os i18n extract' for locale 'pt-BR'. Do not hand-edit. + * + * Each entry is the digest of the SOURCE REVISION that this locale's leaf at + * that path is still a byte copy of — provenance for the generated half of the + * bundles (commit 09b4f4e4e): a leaf whose digest no longer matches its source is stale and serves the source text instead. + * + * An entry exists only while the leaf IS such a copy. Re-translate the leaf in + * `.objects.generated.ts` and the next extract drops its entry by + * itself — the table makes no claim about text a translator wrote. A path with + * no entry is LEGACY-TRUSTED and never reported stale. + * + * ⚠️ Do not "fix" a staleness report by editing this file. Refreshing a digest + * records that the current text was copied from the current source, which is + * the false claim the mechanism exists to detect. Fix the TRANSLATION. + */ + +export const ptBRGeneratedSourceHashes: Readonly> = { + "objects.sys_presence.fields.device.options.desktop": "cc1bf941a947048d", + "objects.sys_presence.fields.device.options.tablet": "7a8f4fab8baceb72", + "objects.sys_presence.fields.status.label": "64a420165247654b", + "objects.sys_presence.fields.status.options.offline": "322a7ca59145b5d8", + "objects.sys_presence.fields.status.options.online": "ac0927911fe6b7c1", +}; diff --git a/packages/services/service-realtime/src/translations/ru.objects.generated.ts b/packages/services/service-realtime/src/translations/ru.objects.generated.ts new file mode 100644 index 00000000000..71d4d720d37 --- /dev/null +++ b/packages/services/service-realtime/src/translations/ru.objects.generated.ts @@ -0,0 +1,75 @@ +// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Auto-generated by 'os i18n extract' for locale 'ru'. + * 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'; + +export const ruObjects: NonNullable = { + sys_presence: { + label: "Присутствие", + pluralLabel: "Присутствие", + description: "Отслеживание присутствия и активности пользователей в реальном времени", + fields: { + id: { + label: "ID присутствия" + }, + display_title: { + label: "Заголовок", + help: "Заголовок записи: пользователь и его статус присутствия (вычисляется при чтении)" + }, + created_at: { + label: "Создано" + }, + updated_at: { + label: "Обновлено" + }, + user_id: { + label: "Пользователь" + }, + session_id: { + label: "Сеанс" + }, + status: { + label: "Статус", + options: { + online: "В сети", + away: "Отошёл", + busy: "Занят", + offline: "Не в сети" + } + }, + last_seen: { + label: "Последний раз в сети" + }, + current_location: { + label: "Текущее местоположение" + }, + device: { + label: "Устройство", + options: { + desktop: "Компьютер", + mobile: "Мобильное устройство", + tablet: "Планшет", + other: "Другое" + } + }, + custom_status: { + label: "Пользовательский статус" + }, + metadata: { + label: "Метаданные", + help: "Произвольные метаданные JSON, связанные с состоянием присутствия (соответствует PresenceStateSchema.metadata)." + } + } + } +}; diff --git a/packages/services/service-realtime/src/translations/ru.source-hashes.generated.ts b/packages/services/service-realtime/src/translations/ru.source-hashes.generated.ts new file mode 100644 index 00000000000..0f794307ebc --- /dev/null +++ b/packages/services/service-realtime/src/translations/ru.source-hashes.generated.ts @@ -0,0 +1,21 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Auto-generated by 'os i18n extract' for locale 'ru'. Do not hand-edit. + * + * Each entry is the digest of the SOURCE REVISION that this locale's leaf at + * that path is still a byte copy of — provenance for the generated half of the + * bundles (commit 09b4f4e4e): a leaf whose digest no longer matches its source is stale and serves the source text instead. + * + * An entry exists only while the leaf IS such a copy. Re-translate the leaf in + * `.objects.generated.ts` and the next extract drops its entry by + * itself — the table makes no claim about text a translator wrote. A path with + * no entry is LEGACY-TRUSTED and never reported stale. + * + * ⚠️ Do not "fix" a staleness report by editing this file. Refreshing a digest + * records that the current text was copied from the current source, which is + * the false claim the mechanism exists to detect. Fix the TRANSLATION. + */ + +export const ruGeneratedSourceHashes: Readonly> = { +}; diff --git a/packages/services/service-realtime/src/translations/zh-Hant.objects.generated.ts b/packages/services/service-realtime/src/translations/zh-Hant.objects.generated.ts new file mode 100644 index 00000000000..fd6bdb6efd4 --- /dev/null +++ b/packages/services/service-realtime/src/translations/zh-Hant.objects.generated.ts @@ -0,0 +1,75 @@ +// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Auto-generated by 'os i18n extract' for locale 'zh-Hant'. + * 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'; + +export const zhHantObjects: NonNullable = { + sys_presence: { + label: "線上狀態", + pluralLabel: "線上狀態", + description: "即時使用者線上與活動追蹤", + fields: { + id: { + label: "線上狀態 ID" + }, + display_title: { + label: "標題", + help: "記錄標題:使用者及其線上狀態(讀取時計算)" + }, + created_at: { + label: "建立時間" + }, + updated_at: { + label: "更新時間" + }, + user_id: { + label: "使用者" + }, + session_id: { + label: "工作階段" + }, + status: { + label: "狀態", + options: { + online: "線上", + away: "離開", + busy: "忙碌", + offline: "離線" + } + }, + last_seen: { + label: "最近上線時間" + }, + current_location: { + label: "目前位置" + }, + device: { + label: "裝置", + options: { + desktop: "桌面裝置", + mobile: "行動裝置", + tablet: "平板", + other: "其他" + } + }, + custom_status: { + label: "自訂狀態" + }, + metadata: { + label: "中繼資料", + help: "與線上狀態關聯的任意 JSON 中繼資料(對應 PresenceStateSchema.metadata)。" + } + } + } +}; diff --git a/packages/services/service-realtime/src/translations/zh-Hant.source-hashes.generated.ts b/packages/services/service-realtime/src/translations/zh-Hant.source-hashes.generated.ts new file mode 100644 index 00000000000..bf521657f18 --- /dev/null +++ b/packages/services/service-realtime/src/translations/zh-Hant.source-hashes.generated.ts @@ -0,0 +1,21 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Auto-generated by 'os i18n extract' for locale 'zh-Hant'. Do not hand-edit. + * + * Each entry is the digest of the SOURCE REVISION that this locale's leaf at + * that path is still a byte copy of — provenance for the generated half of the + * bundles (commit 09b4f4e4e): a leaf whose digest no longer matches its source is stale and serves the source text instead. + * + * An entry exists only while the leaf IS such a copy. Re-translate the leaf in + * `.objects.generated.ts` and the next extract drops its entry by + * itself — the table makes no claim about text a translator wrote. A path with + * no entry is LEGACY-TRUSTED and never reported stale. + * + * ⚠️ Do not "fix" a staleness report by editing this file. Refreshing a digest + * records that the current text was copied from the current source, which is + * the false claim the mechanism exists to detect. Fix the TRANSLATION. + */ + +export const zhHantGeneratedSourceHashes: Readonly> = { +};