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
10 changes: 10 additions & 0 deletions .changeset/30512-platform-objects-ar.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
'@objectstack/platform-objects': patch
---

i18n(platform-objects): the platform objects, Setup, Studio and Account ship in Arabic

Clause-②: no
Metadata-protocol: none

`@objectstack/platform-objects` now carries `ar` beside `en`, `zh-CN`, `ja-JP`, `es-ES` and `zh-Hant`: every `sys_*` object (labels, fields, help, options, views, actions and their dialogs), the metadata-type configuration forms Studio opens, the Setup, Studio and Account navigation, the System Overview dashboard and its datasets, the platform pages' titles, and the inline copy on the user and organization record pages. An administrator or developer reading the platform in Arabic no longer sees it in English. The new bundles pass through the same source-hash fallback as the existing ones, and every hand-authored leaf records the digest of the source it was translated from. The extract config documents `ar` in its `--locales`, so `check:i18n` now gates the new bundles. Package 11 of #30512, second of seven locales; `fr`, `pt-BR`, `ru`, `de` and `ko` follow.
6 changes: 5 additions & 1 deletion packages/platform-objects/scripts/i18n-extract.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* pointed at this file via `bundle-require`:
*
* os i18n extract packages/platform-objects/scripts/i18n-extract.config.ts \
* --locales=zh-CN,ja-JP,es-ES,zh-Hant \
* --locales=zh-CN,ja-JP,es-ES,zh-Hant,ar \
* --fill=default \
* --source-hashes \
* --out=packages/platform-objects/src/apps/translations
Expand Down Expand Up @@ -222,11 +222,13 @@ import { zhCNObjects } from '../src/apps/translations/zh-CN.objects.generated.js
import { jaJPObjects } from '../src/apps/translations/ja-JP.objects.generated.js';
import { esESObjects } from '../src/apps/translations/es-ES.objects.generated.js';
import { zhHantObjects } from '../src/apps/translations/zh-Hant.objects.generated.js';
import { arObjects } from '../src/apps/translations/ar.objects.generated.js';
import { enMetadataForms } from '../src/apps/translations/en.metadata-forms.generated.js';
import { zhCNMetadataForms } from '../src/apps/translations/zh-CN.metadata-forms.generated.js';
import { jaJPMetadataForms } from '../src/apps/translations/ja-JP.metadata-forms.generated.js';
import { esESMetadataForms } from '../src/apps/translations/es-ES.metadata-forms.generated.js';
import { zhHantMetadataForms } from '../src/apps/translations/zh-Hant.metadata-forms.generated.js';
import { arMetadataForms } from '../src/apps/translations/ar.metadata-forms.generated.js';

// ── Existing hand-authored app/dashboard/page translations ────────────────
// The per-locale assemblers, NOT the `SetupAppTranslations` wrapper. Each one
Expand All @@ -250,6 +252,7 @@ import { zhCN } from '../src/apps/translations/zh-CN.js';
import { jaJP } from '../src/apps/translations/ja-JP.js';
import { esES } from '../src/apps/translations/es-ES.js';
import { zhHant } from '../src/apps/translations/zh-Hant.js';
import { ar } from '../src/apps/translations/ar.js';

/**
* The annotation is load-bearing, not decoration (#10868). `defineStack`
Expand Down Expand Up @@ -351,6 +354,7 @@ const config: ObjectStackDefinition = defineStack({
{ 'ja-JP': { ...jaJP, objects: jaJPObjects, metadataForms: jaJPMetadataForms } },
{ 'es-ES': { ...esES, objects: esESObjects, metadataForms: esESMetadataForms } },
{ 'zh-Hant': { ...zhHant, objects: zhHantObjects, metadataForms: zhHantMetadataForms } },
{ 'ar': { ...ar, objects: arObjects, metadataForms: arMetadataForms } },
],
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ describe('System Overview: the null-user bucket reads "System"', () => {
'ja-JP': 'システム',
'es-ES': 'Sistema',
'zh-Hant': '系統',
ar: 'النظام',
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ export const SysAuditLogDataset = defineDataset({
label: 'User',
field: 'user_id',
type: 'lookup',
nullLabel: { en: 'System', 'zh-CN': '系统', 'ja-JP': 'システム', 'es-ES': 'Sistema', 'zh-Hant': '系統' },
nullLabel: { en: 'System', 'zh-CN': '系统', 'ja-JP': 'システム', 'es-ES': 'Sistema', 'zh-Hant': '系統', ar: 'النظام' },
},
],
measures: [{ name: 'event_count', label: 'Events', aggregate: 'count' }],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,19 @@ import { zhCN } from './translations/zh-CN.js';
import { jaJP } from './translations/ja-JP.js';
import { esES } from './translations/es-ES.js';
import { zhHant } from './translations/zh-Hant.js';
import { ar } from './translations/ar.js';
import { enObjects } from './translations/en.objects.generated.js';
import { zhCNObjects } from './translations/zh-CN.objects.generated.js';
import { jaJPObjects } from './translations/ja-JP.objects.generated.js';
import { esESObjects } from './translations/es-ES.objects.generated.js';
import { zhHantObjects } from './translations/zh-Hant.objects.generated.js';
import { arObjects } from './translations/ar.objects.generated.js';
import { enMetadataForms } from './translations/en.metadata-forms.generated.js';
import { zhCNMetadataForms } from './translations/zh-CN.metadata-forms.generated.js';
import { jaJPMetadataForms } from './translations/ja-JP.metadata-forms.generated.js';
import { esESMetadataForms } from './translations/es-ES.metadata-forms.generated.js';
import { zhHantMetadataForms } from './translations/zh-Hant.metadata-forms.generated.js';
import { arMetadataForms } from './translations/ar.metadata-forms.generated.js';

/** The design-record vocabulary an admin-facing string must not carry. */
const DESIGN_RECORD_VOCABULARY: ReadonlyArray<readonly [string, RegExp]> = [
Expand Down Expand Up @@ -130,13 +133,14 @@ function objectSchemas(...modules: Array<Record<string, unknown>>): Map<string,
return byName;
}

const LOCALES = { en, 'zh-CN': zhCN, 'ja-JP': jaJP, 'es-ES': esES, 'zh-Hant': zhHant } as const;
const LOCALES = { en, 'zh-CN': zhCN, 'ja-JP': jaJP, 'es-ES': esES, 'zh-Hant': zhHant, ar } as const;
const OBJECT_BUNDLES = {
en: enObjects, 'zh-CN': zhCNObjects, 'ja-JP': jaJPObjects, 'es-ES': esESObjects, 'zh-Hant': zhHantObjects,
en: enObjects, 'zh-CN': zhCNObjects, 'ja-JP': jaJPObjects, 'es-ES': esESObjects, 'zh-Hant': zhHantObjects, ar: arObjects,
} as const;
const FORM_BUNDLES = {
en: enMetadataForms, 'zh-CN': zhCNMetadataForms, 'ja-JP': jaJPMetadataForms, 'es-ES': esESMetadataForms,
'zh-Hant': zhHantMetadataForms,
ar: arMetadataForms,
} as const;

describe('Setup copy carries no design-record vocabulary', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@ import { zhCN } from './translations/zh-CN.js';
import { jaJP } from './translations/ja-JP.js';
import { esES } from './translations/es-ES.js';
import { zhHant } from './translations/zh-Hant.js';
import { ar } from './translations/ar.js';

const LOCALES = { en, 'zh-CN': zhCN, 'ja-JP': jaJP, 'es-ES': esES, 'zh-Hant': zhHant } as const;
const LOCALES = { en, 'zh-CN': zhCN, 'ja-JP': jaJP, 'es-ES': esES, 'zh-Hant': zhHant, ar } as const;

type NavItem = { id?: string; label?: string };

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,10 @@ describe('(2) the User page lists each per-user store, keyed to its record (#238
'ja-JP': '設定',
'es-ES': 'Preferencias',
'zh-Hant': '偏好設定',
ar: 'التفضيلات',
});
expect((tabOf('sys_account')?.label as Rec)?.en).toBe('Linked Accounts');
expect(Object.keys((tabOf('sys_account')?.label as Rec) ?? {}).sort()).toEqual(['en', 'es-ES', 'ja-JP', 'zh-CN', 'zh-Hant']);
expect(Object.keys((tabOf('sys_account')?.label as Rec) ?? {}).sort()).toEqual(['ar', 'en', 'es-ES', 'ja-JP', 'zh-CN', 'zh-Hant']);
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,9 @@ import { zhCN } from './zh-CN.js';
import { jaJP } from './ja-JP.js';
import { esES } from './es-ES.js';
import { zhHant } from './zh-Hant.js';
import { ar } from './ar.js';

const LOCALES = { en, 'zh-CN': zhCN, 'ja-JP': jaJP, 'es-ES': esES, 'zh-Hant': zhHant } as const;
const LOCALES = { en, 'zh-CN': zhCN, 'ja-JP': jaJP, 'es-ES': esES, 'zh-Hant': zhHant, ar } as const;

/** Every statically declared nav item of an app, depth-first, with its label. */
function navItems(app: { navigation?: unknown[] }): Array<{ id: string; label?: string }> {
Expand Down
Loading
Loading