@object-ui/i18n 17.2.0 → 17.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +1817 -1
  2. package/README.md +26 -13
  3. package/dist/index.d.ts +3 -1
  4. package/dist/index.js +14 -1
  5. package/dist/locales/ar.d.ts +550 -107
  6. package/dist/locales/ar.js +646 -156
  7. package/dist/locales/de.d.ts +550 -107
  8. package/dist/locales/de.js +661 -178
  9. package/dist/locales/en.d.ts +586 -143
  10. package/dist/locales/en.js +851 -143
  11. package/dist/locales/es.d.ts +550 -107
  12. package/dist/locales/es.js +647 -160
  13. package/dist/locales/fr.d.ts +550 -107
  14. package/dist/locales/fr.js +640 -155
  15. package/dist/locales/index.d.ts +5587 -1157
  16. package/dist/locales/ja.d.ts +550 -107
  17. package/dist/locales/ja.js +632 -149
  18. package/dist/locales/ko.d.ts +550 -107
  19. package/dist/locales/ko.js +638 -156
  20. package/dist/locales/pt.d.ts +550 -107
  21. package/dist/locales/pt.js +639 -157
  22. package/dist/locales/ru.d.ts +550 -107
  23. package/dist/locales/ru.js +650 -156
  24. package/dist/locales/zh.d.ts +588 -145
  25. package/dist/locales/zh.js +629 -145
  26. package/dist/pickLocalized.d.ts +21 -0
  27. package/dist/pickLocalized.js +40 -7
  28. package/dist/provider.d.ts +125 -1
  29. package/dist/provider.js +380 -4
  30. package/dist/useDisplayLocale.d.ts +49 -0
  31. package/dist/useDisplayLocale.js +55 -0
  32. package/dist/useObjectLabel.d.ts +8 -2
  33. package/dist/useObjectLabel.js +28 -8
  34. package/dist/useSafeTranslation.js +67 -3
  35. package/dist/utils/index.d.ts +1 -0
  36. package/dist/utils/index.js +1 -0
  37. package/dist/utils/number-display.d.ts +32 -0
  38. package/dist/utils/number-display.js +32 -0
  39. package/dist/utils/spec-formatters.d.ts +39 -13
  40. package/dist/utils/spec-formatters.js +3 -3
  41. package/package.json +5 -4
@@ -1,4 +1,18 @@
1
1
  const ar = {
2
+ // objectui#4467 — the impersonation banner (app-shell ImpersonationBanner).
3
+ // Raised by `session.impersonatedBy`, so it survives SPA reboots; it names
4
+ // BOTH parties because the audit trail attributes the work to the impersonated
5
+ // user, and the exit states its own failure rather than appearing to succeed.
6
+ impersonation: {
7
+ banner: {
8
+ message: 'أنت تنتحل هوية {{user}} — يُسجَّل كل إجراء باسمه.',
9
+ startedBy: 'بدأها المسؤول {{admin}}.',
10
+ stop: 'إنهاء انتحال الهوية',
11
+ stopping: 'جارٍ الإنهاء…',
12
+ stopFailed: 'تعذّر إنهاء انتحال الهوية: {{reason}}',
13
+ notRestored: 'قبل الخادم الطلب لكنه لم يستعد جلسة المسؤول — ما زلت تنتحل هوية {{user}}. سجّل الخروج ثم الدخول مرة أخرى لإنهائها.',
14
+ },
15
+ },
2
16
  // objectui#2600 B5 — capability picker scope group headers (labels come from the sys_capability registry).
3
17
  capability: {
4
18
  label: {
@@ -16,6 +30,30 @@ const ar = {
16
30
  other: 'أخرى',
17
31
  },
18
32
  },
33
+ // objectui#3546 slice six — ملخص للقراءة فقط لأوجه التخويل الستة في
34
+ // PermissionFacetLink، مع رابط التصميم في Studio.
35
+ //
36
+ // صيغة العدد تتبع نمط الحزمة نفسه: «{{count}} مفرد(جمع)» كما في
37
+ // appDesigner.objectManager.fieldCount و table.modified. المفتاح الأساسي هو
38
+ // ما تلجأ إليه فئات two/few/many/zero غير المعرّفة، فيظل النص عربيًا.
39
+ // لا نعكس سهم روابط الإجراء: يبقى كما في en، مثل marketplace.browseLink.
40
+ perm: {
41
+ facet: {
42
+ none: "لا شيء",
43
+ more: "+{{count}} المزيد",
44
+ objects: "{{count}} كائن(كائنات)",
45
+ objects_one: "{{count}} كائن",
46
+ fields: "{{count}} قاعدة(قواعد) حقول",
47
+ fields_one: "{{count}} قاعدة حقول",
48
+ rls: "{{count}} سياسة(سياسات) RLS",
49
+ rls_one: "{{count}} سياسة RLS",
50
+ tabs: "{{count}} قاعدة(قواعد) تبويب",
51
+ tabs_one: "{{count}} قاعدة تبويب",
52
+ adminScope: "تم تكوين الإدارة المفوَّضة",
53
+ designInStudio: "التصميم في Studio →",
54
+ designInStudioHint: "التصميم في Studio",
55
+ },
56
+ },
19
57
  lookup: {
20
58
  recentlyUsed: 'المستخدمة مؤخرًا',
21
59
  allResults: 'كل النتائج',
@@ -46,13 +84,12 @@ const ar = {
46
84
  common: {
47
85
  addToFavorites: "إضافة إلى المفضلة",
48
86
  removeFromFavorites: "إزالة من المفضلة",
49
- loading: "جاري التحميل...",
87
+ loading: "جاري التحميل…",
50
88
  save: "حفظ",
51
89
  cancel: "إلغاء",
52
90
  delete: "حذف",
53
91
  edit: "تعديل",
54
92
  create: "إنشاء",
55
- search: "بحث",
56
93
  filter: "تصفية",
57
94
  reset: "إعادة تعيين",
58
95
  confirm: "تأكيد",
@@ -76,11 +113,20 @@ const ar = {
76
113
  required: "مطلوب",
77
114
  optional: "اختياري",
78
115
  selectOption: "اختر خياراً",
79
- select: "اختر...",
116
+ select: "اختر…",
80
117
  openChat: "فتح المحادثة",
81
118
  closeChat: "إغلاق المحادثة",
119
+ closePanel: "إغلاق اللوحة",
120
+ resizeDrawer: "تغيير عرض اللوحة",
121
+ itemCount: "{{count}} عناصر",
122
+ itemCountOne: "{{count}} عنصر",
82
123
  toggleSidebar: "تبديل الشريط الجانبي",
83
124
  package: "الحزمة",
125
+ done: "تم",
126
+ editInStudio: "التعديل في Studio",
127
+ record: "سجل",
128
+ retry: "إعادة المحاولة",
129
+ printDialogHint: "يفتح مربع حوار الطباعة في المتصفح (ليس تصديرًا إلى PDF)",
84
130
  },
85
131
  actions: {
86
132
  decisionOutput: {
@@ -103,6 +149,7 @@ const ar = {
103
149
  url: "يرجى إدخال رابط صالح",
104
150
  pattern: "صيغة {{field}} غير صالحة",
105
151
  formInvalid: "يرجى التحقق من الحقول المميزة: {{fields}}",
152
+ formInvalidJoiner: "، ",
106
153
  unique: "{{field}} يجب أن يكون فريداً",
107
154
  type: "{{field}} يجب أن يكون {{type}} صالحاً",
108
155
  },
@@ -111,6 +158,9 @@ const ar = {
111
158
  submitFailed: "تعذّر الحفظ. يرجى المحاولة مرة أخرى.",
112
159
  discardTitle: "تجاهل التغييرات؟",
113
160
  discardMessage: "لديك تغييرات غير محفوظة. إذا أغلقت هذا النموذج الآن، ستفقد تعديلاتك.",
161
+ // objectui#4024 — the create/edit dialog's `sr-only` accessible
162
+ // description, used when the form declares no `description` of its own.
163
+ dialogDescriptionFallback: "املأ حقول النموذج ثم أرسل أو ألغِ.",
114
164
  keepEditing: "متابعة التحرير",
115
165
  discard: "تجاهل",
116
166
  conflictTitle: "تعارض في الحفظ",
@@ -127,12 +177,21 @@ const ar = {
127
177
  stepOf: "الخطوة {{current}} من {{total}}",
128
178
  createTitle: "إنشاء {{object}}",
129
179
  editTitle: "تعديل {{object}}",
180
+ viewTitle: "عرض {{object}}",
181
+ createTargetOrg: "الإنشاء في {{org}}",
130
182
  saveRecord: "حفظ السجل",
131
183
  create: "إنشاء",
132
184
  update: "تحديث",
133
185
  createSuccess: "تم إنشاء {{object}}",
134
186
  updateSuccess: "تم تحديث {{object}}",
135
187
  deleteSuccess: "تم حذف {{object}}",
188
+ fullscreen: {
189
+ title: "تحرير النص",
190
+ description: "حرّر قيمة النص الكاملة، ثم احفظ التغييرات أو ألغِها.",
191
+ done: "تم",
192
+ toggle: "تحرير {{label}} بملء الشاشة",
193
+ textFallback: "النص",
194
+ },
136
195
  },
137
196
  fields: {
138
197
  image: {
@@ -170,7 +229,11 @@ const ar = {
170
229
  richText: {
171
230
  format: "التنسيق: {{format}}",
172
231
  basicEditorHint: "محرر النص الغني (أساسي)",
173
- placeholder: "اكتب شيئاً...",
232
+ placeholder: "اكتب شيئاً…",
233
+ },
234
+ options: {
235
+ empty: "لا توجد خيارات متاحة",
236
+ selectFirst: "اختر {{fields}} أولاً",
174
237
  },
175
238
  objectRef: {
176
239
  loading: "جارٍ تحميل الكائنات…",
@@ -199,6 +262,13 @@ const ar = {
199
262
  editAsJson: "التحرير بصيغة JSON",
200
263
  useVisualBuilder: "استخدام المُنشئ المرئي",
201
264
  },
265
+ tags: {
266
+ placeholder: "اكتب واضغط Enter للإضافة…",
267
+ },
268
+ textarea: {
269
+ characterCount: "عدد الأحرف: {{count}} من {{max}}",
270
+ charactersRemaining: "الأحرف المتبقية: {{count}}",
271
+ },
202
272
  },
203
273
  table: {
204
274
  rowsPerPage: "صفوف في الصفحة",
@@ -225,7 +295,7 @@ const ar = {
225
295
  saveAll: "حفظ الكل ({{count}})",
226
296
  addRecord: "إضافة سجل",
227
297
  open: "فتح",
228
- search: "بحث...",
298
+ search: "بحث…",
229
299
  modified: "{{count}} صف(صفوف) معدّل(ة)",
230
300
  saveFailed: 'فشل الحفظ',
231
301
  selected: "{{count}} محدد(ة)",
@@ -269,7 +339,7 @@ const ar = {
269
339
  delete: "حذف",
270
340
  export: "تصدير",
271
341
  exportAs: "تصدير كـ {{format}}",
272
- loading: "جاري تحميل الشبكة...",
342
+ loading: "جاري تحميل الشبكة…",
273
343
  errorLoading: "خطأ في تحميل الشبكة",
274
344
  pullToRefresh: "اسحب للتحديث",
275
345
  refreshing: "جاري التحديث…",
@@ -280,6 +350,22 @@ const ar = {
280
350
  yes: "نعم",
281
351
  no: "لا",
282
352
  systemFields: "النظام",
353
+ // objectui#4024 — column-footer aggregate prefixes, keyed by the spec's
354
+ // `ColumnSummary` vocabulary. `pattern` owns the label/value join so this
355
+ // pack controls its own separator and word order.
356
+ summary: {
357
+ pattern: "{{label}}: {{value}}",
358
+ count: "العدد",
359
+ countEmpty: "فارغة",
360
+ countFilled: "ممتلئة",
361
+ countUnique: "فريدة",
362
+ percentEmpty: "فارغة",
363
+ percentFilled: "ممتلئة",
364
+ sum: "المجموع",
365
+ avg: "المتوسط",
366
+ min: "الأدنى",
367
+ max: "الأعلى",
368
+ },
283
369
  toolbar: {
284
370
  densityMode: "الكثافة",
285
371
  densityCompact: "مضغوط",
@@ -393,12 +479,12 @@ const ar = {
393
479
  templateName: "اسم القالب",
394
480
  save: "حفظ",
395
481
  deleteTemplate: "حذف القالب",
396
- savedMapping: 'Saved mapping:',
397
- chooseSavedMapping: 'Choose a saved mapping…',
398
- manualMapping: '— Map columns manually —',
399
- transform: 'Transform',
400
- savedMappingHint: 'Mapping “{{name}}” applies rename + transforms + type coercion on the server. Column mapping is read-only.',
401
- savedMappingPreviewNote: 'The preview shows your source columns; on import, mapping “{{name}}” applies rename, transforms and type coercion on the server.',
482
+ savedMapping: 'التعيين المحفوظ:',
483
+ chooseSavedMapping: 'اختر تعييناً محفوظاً…',
484
+ manualMapping: '— تعيين الأعمدة يدويًا —',
485
+ transform: 'التحويل',
486
+ savedMappingHint: 'يطبّق التعيين "{{name}}" إعادة التسمية + التحويلات + تحويل الأنواع على الخادم. تعيين الأعمدة للقراءة فقط.',
487
+ savedMappingPreviewNote: 'تعرض المعاينة الأعمدة المصدر لديك؛ وعند الاستيراد يطبّق التعيين "{{name}}" إعادة التسمية والتحويلات وتحويل الأنواع على الخادم.',
402
488
  csvColumn: "العمود",
403
489
  mapsTo: "يُعيَّن إلى",
404
490
  typeMismatch: "يبدو أنه {{type}}",
@@ -458,6 +544,8 @@ const ar = {
458
544
  loadErrorUnauthorizedMessage: "انتهت صلاحية جلستك أو تم تسجيل خروجك. سجّل الدخول مرة أخرى لعرض هذه السجلات.",
459
545
  loadErrorRejectedTitle: "تم رفض استعلام طريقة العرض هذه",
460
546
  loadErrorRejectedMessage: "تعذّر على الخادم معالجة عامل التصفية أو خيارات الاستعلام لطريقة العرض هذه. مسح عوامل التصفية يحل المشكلة عادةً؛ وإذا كانت طريقة العرض محفوظة بهذا الشكل، فيجب على المسؤول تصحيحها.",
547
+ loadErrorApiDisabledTitle: "هذا الكائن غير متاح عبر واجهة API",
548
+ loadErrorApiDisabledMessage: "لا يمكن لهذه الصفحة تحميل سجلاتها لأن الكائن غير معروض عبر واجهة API. هذا إعداد خاص بالكائن نفسه وليس صلاحية — يجب على المسؤول تفعيل الوصول عبر API حتى تعمل هذه الصفحة.",
461
549
  retry: "إعادة المحاولة",
462
550
  managedBy: {
463
551
  system: {
@@ -482,7 +570,7 @@ const ar = {
482
570
  },
483
571
  },
484
572
  refresh: "تحديث",
485
- loading: 'Loading records...',
573
+ loading: "جارٍ تحميل السجلات…",
486
574
  recordCount: "{{count}} سجلات",
487
575
  recordCountOne: "{{count}} سجل",
488
576
  addRecord: "إضافة سجل",
@@ -494,7 +582,8 @@ const ar = {
494
582
  sort: "ترتيب",
495
583
  sortRecords: "ترتيب السجلات",
496
584
  sortByIdSuffix: "(حسب المعرّف)",
497
- sortRelationalHint: "الأعمدة التي تشير إلى سجل آخر غير مدرجة هنا: يمكن ترتيبها حسب المعرّف المخزَّن فقط، وليس حسب الاسم الظاهر في الخلية. للترتيب حسب ذلك الاسم، أضف حقل صيغة يحتوي عليه.",
585
+ sortRelationalHint: "الأعمدة التي تشير إلى سجل آخر غير مدرجة هنا: يمكن ترتيبها حسب المعرّف المخزَّن فقط، وليس حسب الاسم الظاهر في الخلية. للترتيب حسب ذلك الاسم، أضِف الاسم إلى هذا الكائن نفسه (إلغاء التطبيع) كحقل مخزَّن يُكتب عند تغيّر المصدر، ثم رتّب حسبه. وليس حقل صيغة: فهو افتراضي، ولا يُخزَّن له أي عمود، ويرفض الخادم الترتيب حسبه.",
586
+ resetSortToDefault: "إعادة التعيين إلى الترتيب الافتراضي للعرض",
498
587
  group: "تجميع",
499
588
  groupBy: "تجميع حسب",
500
589
  export: "تصدير",
@@ -552,13 +641,16 @@ const ar = {
552
641
  },
553
642
  kanban: {
554
643
  uncategorized: "غير مصنّف",
644
+ columns: "أعمدة",
555
645
  addCard: "إضافة بطاقة",
556
646
  addColumn: "إضافة عمود",
557
647
  moveCard: "نقل بطاقة",
558
648
  deleteCard: "حذف بطاقة",
559
649
  deleteColumn: "حذف عمود",
560
650
  noCards: "لا بطاقات",
561
- cardTitlePlaceholder: "أدخل عنوان البطاقة...",
651
+ cardTitlePlaceholder: "أدخل عنوان البطاقة…",
652
+ requiredFieldsTitle: "أكمل الحقول المطلوبة",
653
+ requiredFieldsDescription: "يجعل هذا النقل الحقول أدناه مطلوبة. أكملها للمتابعة.",
562
654
  },
563
655
  timeline: {
564
656
  bucket: {
@@ -571,6 +663,13 @@ const ar = {
571
663
  noDate: "بدون تاريخ",
572
664
  unassigned: "غير معين",
573
665
  },
666
+ scale: {
667
+ week: "الأسبوع {{n}}",
668
+ quarter: "الربع {{quarter}} {{year}}",
669
+ },
670
+ gantt: {
671
+ rowLabel: "العناصر",
672
+ },
574
673
  },
575
674
  gantt: {
576
675
  viewMode: {
@@ -617,6 +716,18 @@ const ar = {
617
716
  ff: "نهاية → نهاية",
618
717
  sf: "بداية → نهاية",
619
718
  },
719
+ linkEnd: {
720
+ start: "بداية",
721
+ end: "نهاية",
722
+ },
723
+ link: {
724
+ rejected: {
725
+ self: "لا يمكن أن تعتمد المهمة على نفسها.",
726
+ locked: "هذا الصف مقفل ولا يمكنه استقبال تبعية جديدة.",
727
+ group: "لا يمكن لصف التلخيص استقبال تبعية — اربط إحدى مهامه بدلاً من ذلك.",
728
+ cycle: "هذا الرابط سينشئ تبعية دائرية.",
729
+ },
730
+ },
620
731
  conflict: {
621
732
  title: "تعارض في الجدولة",
622
733
  body: "يتعارض هذا النقل مع قيود التبعية. هل تريد إعادة جدولة {{count}} من المهام المتأثرة تلقائيًا؟",
@@ -625,8 +736,8 @@ const ar = {
625
736
  },
626
737
  autoScheduleDlg: {
627
738
  title: "الجدولة التلقائية",
628
- body: "هل تريد تأخير {count} من المهام لتلبية روابط التبعية؟",
629
- skipped: "{count} من المهام المقفلة تخالف الروابط أيضًا وقد تم تخطيها.",
739
+ body: "هل تريد تأخير {{count}} من المهام لتلبية روابط التبعية؟",
740
+ skipped: "{{count}} من المهام المقفلة تخالف الروابط أيضًا وقد تم تخطيها.",
630
741
  confirm: "تطبيق",
631
742
  cancel: "إلغاء",
632
743
  none: "جميع التبعيات مستوفاة — لا شيء لإعادة جدولته.",
@@ -637,6 +748,12 @@ const ar = {
637
748
  over: "محمّل بإفراط",
638
749
  empty: "لا توجد مهام لتخصيصها.",
639
750
  },
751
+ quickFilter: {
752
+ all: "الكل",
753
+ clear: "مسح عوامل التصفية",
754
+ empty: "لا توجد خيارات",
755
+ resultSummary: "عرض {shown} / {total} من المهام",
756
+ },
640
757
  readOnly: "للقراءة فقط",
641
758
  readOnlyHint: "التحرير معطّل في هذا العرض.",
642
759
  lockedHint: "لا توجد صلاحية تحرير",
@@ -657,6 +774,7 @@ const ar = {
657
774
  exportPng: "تصدير بصيغة PNG",
658
775
  exportPdf: "تصدير PDF",
659
776
  saveLayout: "حفظ التخطيط",
777
+ refresh: "تحديث",
660
778
  undo: "تراجع",
661
779
  redo: "إعادة",
662
780
  prevPeriod: "الفترة السابقة",
@@ -697,11 +815,11 @@ const ar = {
697
815
  defaultBadge: "افتراضي",
698
816
  tabActionsFor: "إجراءات العرض لـ {{name}}",
699
817
  readonlyAriaLabel: "عرض للقراءة فقط",
700
- readonlyTooltip: "عرض النظام — انسخ للتخصيص.",
818
+ readonlyTooltip: "عرض النظام — معرَّف في الكود، للقراءة فقط.",
701
819
  },
702
820
  designer: {
703
- undo: 'Undo',
704
- redo: 'Redo',
821
+ undo: "تراجع",
822
+ redo: "إعادة",
705
823
  },
706
824
  detail: {
707
825
  editInlineHint: "انقر نقرًا مزدوجًا للتحرير",
@@ -721,6 +839,15 @@ const ar = {
721
839
  viewHistory: "عرض السجل",
722
840
  delete: "حذف",
723
841
  moreActions: "المزيد من الإجراءات",
842
+ addReaction: "إضافة تفاعل",
843
+ pageHeaderActions: "إجراءات رأس الصفحة",
844
+ emojiPicker: "منتقي الرموز التعبيرية",
845
+ reactionCount: "{{emoji}} {{count}} تفاعلات",
846
+ reactionCountOne: "{{emoji}} {{count}} تفاعل",
847
+ recordDetail: "تفاصيل السجل",
848
+ recordDetailWithLabel: "تفاصيل {{label}}",
849
+ openAsFullPage: "فتح كصفحة كاملة",
850
+ recordDetailOverlay: "طبقة تفاصيل السجل الخاصة بـ {{title}}.",
724
851
  addToFavorites: "إضافة إلى المفضلة",
725
852
  removeFromFavorites: "إزالة من المفضلة",
726
853
  previousRecord: "السجل السابق",
@@ -734,13 +861,15 @@ const ar = {
734
861
  relatedRecords: "{{count}} سجلات",
735
862
  relatedRecordOne: "{{count}} سجل",
736
863
  noRelatedRecords: "لا توجد سجلات ذات صلة",
737
- loading: "جاري التحميل...",
864
+ loading: "جاري التحميل…",
738
865
  copyToClipboard: "نسخ إلى الحافظة",
739
866
  copied: "تم النسخ!",
740
867
  deleteConfirmation: "هل أنت متأكد أنك تريد حذف هذا السجل؟",
868
+ deleted: "تم حذف السجل",
741
869
  editRecord: "تحرير السجل",
742
870
  viewAll: "عرض الكل",
743
871
  new: "جديد",
872
+ add: "إضافة",
744
873
  emptyValue: "—",
745
874
  comments: "التعليقات",
746
875
  searchComments: "البحث في التعليقات…",
@@ -805,6 +934,7 @@ const ar = {
805
934
  loadMore: "تحميل المزيد",
806
935
  edited: "(معدل)",
807
936
  via: "عبر {{source}}",
937
+ viewSource: "عرض المصدر",
808
938
  replyCount: "{{count}} رد",
809
939
  replyCountPlural: "{{count}} ردود",
810
940
  replyPlaceholder: "رد…",
@@ -817,14 +947,15 @@ const ar = {
817
947
  saving: "جارٍ الحفظ…",
818
948
  lockedByApproval: "مقفل للموافقة",
819
949
  lockedTooltip: "يحتوي هذا السجل على طلب موافقة معلق؛ التعديل مقفل",
820
- writeStrippedTitle: "لم يتم حفظ بعض الحقول",
821
- writeStrippedReadonly: "للقراءة فقط، لذلك لم يتم حفظها: {{fields}}",
822
- writeStrippedByState: "غير قابلة للتعديل في الحالة الحالية لهذا السجل، لذلك لم يتم حفظها: {{fields}}",
950
+ writeStrippedTitle: "تم الحفظ، لكن بعض الحقول لم تُطبَّق",
951
+ writeStrippedReadonly: "للقراءة فقط، لذلك لم تُطبَّق: {{fields}}",
952
+ writeStrippedByState: "غير قابلة للتعديل في الحالة الحالية لهذا السجل، لذلك لم تُطبَّق: {{fields}}",
823
953
  approvalPendingEditable: "قيد الموافقة · قابل للتعديل",
824
954
  approvalPendingTooltip: "يحتوي هذا السجل على طلب موافقة معلق، لكن هذه الخطوة لا تزال تسمح بالتعديل",
825
955
  approvalProgress: "الموافقات — {{got}} من {{need}}",
826
956
  approvalProgressGroups: "التوقيعات — {{got}} من {{need}} مجموعات",
827
957
  approvalProgressLabel: "تقدّم الموافقة",
958
+ approvalsPanelTitle: "الموافقات",
828
959
  cancelApproval: "إلغاء الموافقة",
829
960
  cancelApprovalInFlight: "جارٍ الإلغاء…",
830
961
  cancelApprovalTooltip: "إلغاء طلب الموافقة المعلق لفتح قفل السجل",
@@ -845,9 +976,11 @@ const ar = {
845
976
  concurrentUpdateReload: "تحميل النسخة الحالية",
846
977
  concurrentUpdateOverwrite: "الكتابة فوقه على أي حال",
847
978
  concurrentUpdateCancel: "إلغاء",
979
+ concurrentUpdateRecordLabel: "هذا السجل",
848
980
  openInNewTab: "فتح في علامة تبويب جديدة",
849
981
  activity: "النشاط",
850
982
  history: "السجل",
983
+ historyEmpty: "لا يوجد سجل بعد",
851
984
  editRow: "تعديل",
852
985
  deleteRow: "حذف",
853
986
  deleteRowConfirmation: "حذف هذا السجل؟",
@@ -857,10 +990,16 @@ const ar = {
857
990
  nextPage: "التالي",
858
991
  pageOf: "صفحة {{current}} من {{total}}",
859
992
  sortBy: "ترتيب حسب",
860
- filterPlaceholder: "تصفية...",
993
+ filterPlaceholder: "تصفية…",
861
994
  highlightFields: "الحقول الرئيسية",
862
995
  createdBy: "أنشأه",
863
996
  updatedBy: "حدّثه",
997
+ // objectui#3863 — base key, and in ar this is the slot users actually hit: `zero`,
998
+ // `two` (2), `few` (3-10) and `many` (11-99) are unenumerated, so before this key
999
+ // those counts rendered ENGLISH. It uses the «{{count}} مفرد(جمع)» marker this
1000
+ // pack writes throughout (perm.facet.objects, and the sibling toggle
1001
+ // showEmptyFields below), which reads correctly for every count.
1002
+ showEmptyRelated: "+ {{count}} فارغ(فارغة)",
864
1003
  showEmptyRelated_one: "+ {{count}} فارغ",
865
1004
  showEmptyRelated_other: "+ {{count}} فارغة",
866
1005
  copyEmail: "نسخ البريد الإلكتروني",
@@ -872,7 +1011,8 @@ const ar = {
872
1011
  },
873
1012
  chart: {
874
1013
  noData: "لا تتوفر بيانات للرسم البياني",
875
- loading: "جاري تحميل الرسم البياني...",
1014
+ loading: "جاري تحميل الرسم البياني…",
1015
+ nullCategory: "(غير محدد)",
876
1016
  },
877
1017
  map: {
878
1018
  searchLocations: "البحث عن المواقع…",
@@ -894,8 +1034,8 @@ const ar = {
894
1034
  properties: "الخصائص",
895
1035
  connections: "الاتصالات",
896
1036
  quickConnect: "اتصال سريع",
897
- fromPlaceholder: "من...",
898
- toPlaceholder: "إلى...",
1037
+ fromPlaceholder: "من…",
1038
+ toPlaceholder: "إلى…",
899
1039
  connect: "ربط",
900
1040
  label: "التسمية",
901
1041
  type: "النوع",
@@ -943,6 +1083,7 @@ const ar = {
943
1083
  },
944
1084
  dashboard: {
945
1085
  noRows: "لا توجد صفوف",
1086
+ loading: "جارٍ التحميل…",
946
1087
  pickMeasures: "اختر المقاييس (القيم) لأداة مجموعة البيانات هذه.",
947
1088
  datasetUnsupported: "مصدر البيانات هذا لا يدعم استعلامات مجموعات البيانات.",
948
1089
  details: "التفاصيل",
@@ -1036,7 +1177,7 @@ const ar = {
1036
1177
  faviconUrl: "Favicon URL",
1037
1178
  preview: "معاينة",
1038
1179
  complete: "إكمال",
1039
- snakeCaseHint: "Must be snake_case (e.g. my_app)",
1180
+ snakeCaseHint: "يجب أن يكون بصيغة snake_case (مثل my_app)",
1040
1181
  modeEdit: "تعديل",
1041
1182
  modePreview: "معاينة",
1042
1183
  modeCode: "كود",
@@ -1200,6 +1341,7 @@ const ar = {
1200
1341
  },
1201
1342
  },
1202
1343
  console: {
1344
+ saveAdvisoryTitle: "تم الحفظ — أنتج فحص التأليف {{count}} ملاحظة إرشادية",
1203
1345
  settingsHub: {
1204
1346
  title: "الإعدادات",
1205
1347
  subtitle: "اضبط مساحة العمل والتكاملات وأعلام الميزات.",
@@ -1266,7 +1408,7 @@ const ar = {
1266
1408
  shareTitle: "مشاركة هذه المحادثة",
1267
1409
  shareDisabledTitle: "ابدأ المحادثة لتفعيل المشاركة",
1268
1410
  newChat: "جديدة",
1269
- searchChats: "البحث في المحادثات...",
1411
+ searchChats: "البحث في المحادثات…",
1270
1412
  noChatsYet: "لا توجد محادثات بعد",
1271
1413
  noChatsDescription: "ابدأ محادثة جديدة لتظهر هنا.",
1272
1414
  noMatchingChats: "لا توجد محادثات مطابقة.",
@@ -1275,18 +1417,18 @@ const ar = {
1275
1417
  deleteConversation: "حذف المحادثة",
1276
1418
  saveRename: "حفظ الاسم",
1277
1419
  cancelRename: "إلغاء إعادة التسمية",
1278
- loadingHistory: "جارٍ تحميل سجل المحادثة...",
1420
+ loadingHistory: "جارٍ تحميل سجل المحادثة…",
1279
1421
  conversationReady: "المحادثة جاهزة",
1280
1422
  preparingConversation: "جارٍ تجهيز محادثة جديدة",
1281
1423
  offlineDemoMode: "وضع العرض دون اتصال — قائمة الوكلاء غير متاحة",
1282
1424
  sendFailedRateLimited: "أنت ترسل الرسائل بسرعة كبيرة. رسالتك محفوظة بالأسفل — انتظر لحظة ثم أعد المحاولة.",
1283
1425
  sendFailedGeneric: "تعذّر إرسال رسالتك. وهي محفوظة بالأسفل — يرجى إعادة المحاولة.",
1284
- askAgent: "اسأل {{agent}}...",
1426
+ askAgent: "اسأل {{agent}}…",
1285
1427
  assistant: "المساعد",
1286
1428
  liveCanvas: "معاينة حية — {{app}} (مسودة)",
1287
1429
  liveCanvasUnlisted: "تطبيق حي — {{app}} (غير مُدرج حتى النشر)",
1288
- loadingAgents: "جارٍ تحميل الوكلاء...",
1289
- askAnything: "اسأل عن أي شيء...",
1430
+ loadingAgents: "جارٍ تحميل الوكلاء…",
1431
+ askAnything: "اسأل عن أي شيء…",
1290
1432
  emptyTitle: "ابدأ محادثة",
1291
1433
  emptyDescription: "اسأل عن أي شيء — يمكن للمساعد الاطلاع على سياق تطبيقك الحالي.",
1292
1434
  switchAssistant: "تبديل المساعد",
@@ -1389,9 +1531,60 @@ const ar = {
1389
1531
  createSeed: "إنشاء بيانات تجريبية",
1390
1532
  createPackage: "إنشاء حزمة تطبيق",
1391
1533
  },
1534
+ // objectui#3546 slice four — the AI console surfaces: the /ai chat page's app switcher,
1535
+ // connection banner and plan/publish cards, the ChatDock chrome, and the
1536
+ // conversation-list date buckets. `group.*` is the template-key family
1537
+ // `console.ai.group.${key}` (ConversationsSidebar), enumerated from the
1538
+ // ConversationGroupKey union — all five members, no wildcard.
1539
+ collapseToDock: "طيّ إلى اللوحة الجانبية",
1540
+ switchApp: "تبديل التطبيق",
1541
+ switchAppLabel: "محادثات الإنشاء حسب التطبيق",
1542
+ newApp: "تطبيق جديد",
1543
+ connectionWaiting: "في انتظار الخادم…",
1544
+ connectionStalled: "لا يزال العمل جاريًا…",
1545
+ connectionOffline: "انقطع الاتصال — جارٍ إعادة الاتصال…",
1546
+ designingPlan: "جارٍ تصميم تطبيقك…",
1547
+ designingPlanHint: {
1548
+ data: "جارٍ تحديد البيانات التي ستتابعها…",
1549
+ objects: "جارٍ تشكيل الكائنات وحقولها…",
1550
+ relations: "جارٍ ربط السجلات ذات الصلة…",
1551
+ lookups: "جارٍ إعداد العلاقات وحقول البحث…",
1552
+ views: "جارٍ التخطيط للشاشات والعروض…",
1553
+ forms: "جارٍ تنسيق النماذج والقوائم…",
1554
+ defaults: "جارٍ إضافة قيم افتراضية ومعايير تحقّق منطقية…",
1555
+ dashboard: "جارٍ رسم لوحة معلومات للمتابعة…",
1556
+ review: "جارٍ التحقّق من تماسك البنية…",
1557
+ finalize: "جارٍ تجميع الخطة…",
1558
+ },
1559
+ planBuilding: "جارٍ الإنشاء…",
1560
+ planBuilt: "تم الإنشاء",
1561
+ planDeferred: "لم يُنشأ بعد",
1562
+ planReady: "الخطة جاهزة. ابدأ الإنشاء الآن، أو أخبرني بما تريد تعديله.",
1563
+ published: "تم النشر",
1564
+ publishFailed: "فشل النشر",
1565
+ unavailableTitle: "مساعد الذكاء الاصطناعي غير متاح",
1566
+ unavailableDescription: "لم يتم تمكين مساعد الذكاء الاصطناعي في هذا النشر. وكل شيء آخر يعمل كالمعتاد.",
1567
+ unavailableError: "تعذّر الوصول إلى خدمة الذكاء الاصطناعي. قد تكون غير متصلة مؤقتًا — أعد المحاولة أو عد إلى الرئيسية.",
1568
+ unavailableRetry: "إعادة المحاولة",
1569
+ unavailableHome: "العودة إلى الرئيسية",
1570
+ dock: {
1571
+ title: "المساعد",
1572
+ description: "محادثة مساعد الذكاء الاصطناعي",
1573
+ resize: "تغيير حجم المحادثة",
1574
+ collapse: "طي المحادثة",
1575
+ maximize: "فتح كصفحة كاملة",
1576
+ open: "فتح المساعد",
1577
+ },
1578
+ group: {
1579
+ today: "اليوم",
1580
+ yesterday: "أمس",
1581
+ previous7Days: "آخر 7 أيام",
1582
+ previous30Days: "آخر 30 يومًا",
1583
+ older: "أقدم",
1584
+ },
1392
1585
  },
1393
1586
  title: "وحدة تحكم ObjectStack",
1394
- initializing: "جاري تهيئة التطبيق...",
1587
+ initializing: "جاري تهيئة التطبيق…",
1395
1588
  loadingHint: "قد يستغرق إعداد بيئة جديدة بعض الوقت.",
1396
1589
  breadcrumb: {
1397
1590
  dashboards: "لوحات المعلومات",
@@ -1399,6 +1592,31 @@ const ar = {
1399
1592
  reports: "التقارير",
1400
1593
  system: "النظام",
1401
1594
  },
1595
+ // objectui#4024 — the single-namespace settings screen. Its sibling
1596
+ // `settingsHub` above already resolved through this pack; the view was the
1597
+ // one file still carrying English literals.
1598
+ settingsView: {
1599
+ backToHub: "جميع الإعدادات",
1600
+ back: "رجوع",
1601
+ noNamespace: "لم يتم تحديد أي مساحة اسم.",
1602
+ loadError: "تعذّر تحميل الإعدادات",
1603
+ saved: "تم حفظ الإعدادات",
1604
+ saveFailed: "فشل في الحفظ",
1605
+ lockedByEnv: "مقفل بواسطة البيئة: {{key}}",
1606
+ lockedByEnvNoKey: "مقفل بواسطة البيئة",
1607
+ actionSucceeded: "نجح الإجراء",
1608
+ actionFailed: "فشل الإجراء",
1609
+ discard: "تجاهل",
1610
+ saveChanges: "حفظ التغييرات",
1611
+ unsavedCount: "{{count}} تغيير(تغييرات) غير محفوظ",
1612
+ unsavedCount_one: "{{count}} تغيير غير محفوظ",
1613
+ unsavedCount_other: "{{count}} تغييرات غير محفوظة",
1614
+ cryptoRefusalTitle: "لا يمكن لهذا النشر تشفير الأسرار",
1615
+ cryptoRefusalSubjectSuffix: "معلن كمشفَّر، لذلك لم تتم كتابة أي شيء.",
1616
+ cryptoRefusalNoSubject: "تم رفض القيمة المعلنة كمشفَّرة، لذلك لم تتم كتابة أي شيء.",
1617
+ cryptoRefusalToast: "تعذّر تشفير الأسرار: {{subject}}",
1618
+ cryptoRefusalToastNoSubject: "تعذّر تشفير الأسرار",
1619
+ },
1402
1620
  loadingSteps: {
1403
1621
  connecting: "جاري الاتصال بمصدر البيانات",
1404
1622
  loadingConfig: "جاري تحميل الإعدادات",
@@ -1414,6 +1632,13 @@ const ar = {
1414
1632
  retry: "إعادة المحاولة",
1415
1633
  retrying: "جاري إعادة المحاولة…",
1416
1634
  },
1635
+ serverAction: {
1636
+ openingTitle: "جارٍ الفتح…",
1637
+ openingBody: "جارٍ الفتح… قد يستغرق ذلك لحظة.",
1638
+ popupBlockedTitle: "تم حظر النافذة المنبثقة",
1639
+ popupBlockedDescription: "حظر المتصفح فتح علامة التبويب الجديدة.",
1640
+ popupBlockedAction: "فتح في علامة تبويب جديدة",
1641
+ },
1417
1642
  shortcuts: {
1418
1643
  title: "اختصارات لوحة المفاتيح",
1419
1644
  description: "مرجع سريع لجميع اختصارات لوحة المفاتيح المتاحة.",
@@ -1421,6 +1646,7 @@ const ar = {
1421
1646
  general: "عام",
1422
1647
  navigation: "التنقل",
1423
1648
  dataViews: "عروض البيانات",
1649
+ aiChat: "مساعد الذكاء الاصطناعي",
1424
1650
  preferences: "التفضيلات",
1425
1651
  },
1426
1652
  openCommandPalette: "فتح لوحة الأوامر",
@@ -1431,11 +1657,13 @@ const ar = {
1431
1657
  createRecord: "إنشاء سجل جديد",
1432
1658
  refreshData: "تحديث البيانات",
1433
1659
  editRecord: "تعديل السجل المحدد",
1660
+ newChat: "محادثة جديدة",
1661
+ toggleChatsList: "تبديل قائمة المحادثات",
1434
1662
  toggleDarkMode: "تبديل الوضع الداكن",
1435
1663
  },
1436
1664
  commandPalette: {
1437
1665
  title: "لوحة الأوامر",
1438
- placeholder: "اكتب أمراً أو ابحث...",
1666
+ placeholder: "اكتب أمراً أو ابحث…",
1439
1667
  noResults: "لم يتم العثور على نتائج.",
1440
1668
  objects: "الكائنات",
1441
1669
  dashboards: "لوحات المعلومات",
@@ -1461,6 +1689,12 @@ const ar = {
1461
1689
  goHome: "العودة للرئيسية",
1462
1690
  errorDetails: "تفاصيل الخطأ (وضع التطوير فقط)",
1463
1691
  },
1692
+ // objectui#3546 slice four — the console's catch-all route (AppContent `RouteNotFound`).
1693
+ notFound: {
1694
+ title: "الصفحة غير موجودة",
1695
+ description: "الرابط الذي فتحته لا يطابق أي عرض في هذا التطبيق.",
1696
+ back: "رجوع",
1697
+ },
1464
1698
  theme: {
1465
1699
  toggle: "تبديل المظهر",
1466
1700
  light: "فاتح",
@@ -1476,11 +1710,15 @@ const ar = {
1476
1710
  viewNameHelp: "مفتاح برمجي (snake_case). يُملأ تلقائيًا من العنوان — عدّله إن أردت.",
1477
1711
  viewNameRequired: "أدخل مفتاحًا (أحرف إنجليزية صغيرة وأرقام وشرطة سفلية). لا يُملأ تلقائيًا للعناوين غير اللاتينية.",
1478
1712
  viewNameInvalid: "استخدم أحرفًا إنجليزية صغيرة وأرقامًا وشرطات سفلية؛ وابدأ بحرف أو شرطة سفلية.",
1479
- systemViewReadonly: 'System view defined in code - duplicate to customize.',
1480
- expandToPage: 'Open as full page',
1713
+ systemViewReadonly: "عرض النظام معرَّف في الكود — للقراءة فقط.",
1714
+ cannotEditMetaView: "هذا عرض مدمج معرَّف في الكود — لا يمكن تعديله.",
1715
+ cannotDeleteMetaView: "هذا عرض مدمج معرَّف في الكود — لا يمكن حذفه.",
1716
+ expandToPage: "فتح كصفحة كاملة",
1481
1717
  objectNotFound: "الكائن غير موجود",
1482
1718
  objectNotFoundDescription: "الكائن \"{{objectName}}\" غير موجود في الإعدادات الحالية.",
1483
1719
  objectNotFoundHint: "تحقق من إعدادات التنقل في تطبيقك أو اختر كائنًا آخر من الشريط الجانبي.",
1720
+ filterOrNotSavable: "يستخدم هذا الفلتر «أو» بين الشروط، وهو ما لا يمكن للعرض المحفوظ تخزينه بعد. لا يزال مطبقًا على هذه القائمة — أزل تجميع «أو» لحفظه في العرض.",
1721
+ filterNestedNotSavable: "يستخدم هذا الفلتر مجموعات شروط متداخلة لا يمكن للعرض المحفوظ تخزينها. حوّله إلى قائمة شروط واحدة لحفظه في العرض.",
1484
1722
  allRecords: "جميع السجلات",
1485
1723
  exitDesignMode: "الخروج من وضع التصميم",
1486
1724
  enterDesignMode: "الدخول إلى وضع التصميم",
@@ -1507,7 +1745,7 @@ const ar = {
1507
1745
  exportPrintHint: "صيغ التصدير والطباعة وعرض عدد السجلات",
1508
1746
  showAllFields: "إظهار الكل",
1509
1747
  hideAllFields: "إخفاء الكل",
1510
- searchFields: "البحث في الحقول...",
1748
+ searchFields: "البحث في الحقول…",
1511
1749
  title: "العنوان",
1512
1750
  description: "الوصف",
1513
1751
  data: "البيانات",
@@ -1546,7 +1784,7 @@ const ar = {
1546
1784
  longitudeField: "حقل خط الطول",
1547
1785
  imageField: "حقل الصورة",
1548
1786
  dateField: "حقل التاريخ",
1549
- selectField: "اختر حقلاً...",
1787
+ selectField: "اختر حقلاً…",
1550
1788
  gridOptionsHint: "يستخدم عرض الشبكة الأعمدة المكونة أعلاه.",
1551
1789
  groupBy: "تجميع حسب",
1552
1790
  prefixField: "حقل البادئة",
@@ -1609,7 +1847,7 @@ const ar = {
1609
1847
  latitudeFieldHelp: "حقل يحتوي على خط العرض (حقول جغرافية فقط).",
1610
1848
  longitudeFieldHelp: "حقل يحتوي على خط الطول (حقول جغرافية فقط).",
1611
1849
  imageFieldHelp: "تأتي غلاف المعرض من هذا الحقل للصورة أو المرفق.",
1612
- selectOption: "تحديد...",
1850
+ selectOption: "تحديد…",
1613
1851
  noEligibleFieldForType: "لا يوجد حقل مؤهل من هذا النوع. أضف حقلاً إلى الكائن أولاً.",
1614
1852
  viewTypeUnavailable: "لا يحتوي هذا الكائن على حقل يمكن أن يعمل كـ \"{{field}}\".",
1615
1853
  viewTypeUnavailableShort: "غير مدعوم من هذا الكائن.",
@@ -1659,7 +1897,7 @@ const ar = {
1659
1897
  ufDropdown: "قائمة منسدلة",
1660
1898
  ufTabs: "علامات تبويب",
1661
1899
  ufToggle: "تبديل",
1662
- ufAddField: "+ إضافة حقل فلتر...",
1900
+ ufAddField: "+ إضافة حقل فلتر…",
1663
1901
  ufNoFields: "لا حقول متاحة",
1664
1902
  ufAddTab: "+ إضافة علامة تبويب",
1665
1903
  ufTabLabel: "التسمية",
@@ -1719,7 +1957,7 @@ const ar = {
1719
1957
  passwordPlaceholder: "أدخل كلمة المرور",
1720
1958
  forgotPasswordText: "نسيت كلمة المرور؟",
1721
1959
  submitButton: "تسجيل الدخول",
1722
- submittingButton: "جارٍ تسجيل الدخول...",
1960
+ submittingButton: "جارٍ تسجيل الدخول…",
1723
1961
  noAccountText: "ليس لديك حساب؟",
1724
1962
  signUpText: "إنشاء حساب",
1725
1963
  errors: {
@@ -1727,6 +1965,18 @@ const ar = {
1727
1965
  invalidCredentials: "بريد إلكتروني أو كلمة مرور غير صحيحة. يرجى المحاولة مرة أخرى.",
1728
1966
  emailNotVerified: "يرجى التحقق من بريدك الإلكتروني قبل تسجيل الدخول.",
1729
1967
  },
1968
+ // objectui#3546 slice three — phone/OTP sign-in. `{seconds}` is LoginForm's own
1969
+ // literal `.replace()` hole, not i18next interpolation: keep the single braces.
1970
+ emailOrPhoneLabel: "البريد الإلكتروني أو رقم الهاتف",
1971
+ emailOrPhonePlaceholder: "name@example.com أو +1 555 000 0000",
1972
+ phoneLabel: "رقم الهاتف",
1973
+ phonePlaceholder: "+1 555 000 0000",
1974
+ otpCodeLabel: "رمز التحقق",
1975
+ otpCodePlaceholder: "رمز مكوّن من 6 أرقام",
1976
+ sendOtpButton: "الحصول على رمز",
1977
+ resendOtpCountdownText: "إعادة الإرسال بعد {seconds} ثانية",
1978
+ usePhoneOtpText: "تسجيل الدخول برمز التحقق",
1979
+ usePasswordSignInText: "تسجيل الدخول بكلمة المرور بدلاً من ذلك",
1730
1980
  },
1731
1981
  register: {
1732
1982
  title: "إنشاء حساب",
@@ -1742,7 +1992,7 @@ const ar = {
1742
1992
  passwordMismatchError: "كلمتا المرور غير متطابقتين",
1743
1993
  passwordTooShortError: "يجب أن تتكون كلمة المرور من 8 أحرف على الأقل",
1744
1994
  submitButton: "إنشاء حساب",
1745
- submittingButton: "جارٍ إنشاء الحساب...",
1995
+ submittingButton: "جارٍ إنشاء الحساب…",
1746
1996
  hasAccountText: "لديك حساب بالفعل؟",
1747
1997
  signInText: "تسجيل الدخول",
1748
1998
  errors: {
@@ -1763,12 +2013,26 @@ const ar = {
1763
2013
  emailLabel: "البريد الإلكتروني",
1764
2014
  emailPlaceholder: "name@example.com",
1765
2015
  submitButton: "إرسال رابط إعادة التعيين",
1766
- submittingButton: "جارٍ الإرسال...",
2016
+ submittingButton: "جارٍ الإرسال…",
1767
2017
  successTitle: "تحقق من بريدك الإلكتروني",
1768
2018
  successDescription: "لقد أرسلنا رابط إعادة تعيين كلمة المرور إلى {{email}}. يرجى التحقق من بريدك الوارد.",
1769
2019
  backToSignInText: "العودة إلى تسجيل الدخول",
1770
2020
  rememberPasswordText: "تتذكر كلمة المرور؟",
1771
2021
  signInText: "تسجيل الدخول",
2022
+ // objectui#3546 slice three — the SMS reset branch of the same form.
2023
+ phoneLabel: "رقم الهاتف",
2024
+ phonePlaceholder: "+1 555 000 0000",
2025
+ otpCodeLabel: "رمز التحقق",
2026
+ otpCodePlaceholder: "رمز مكوّن من 6 أرقام",
2027
+ sendOtpButton: "الحصول على رمز",
2028
+ resendOtpCountdownText: "إعادة الإرسال بعد {seconds} ثانية",
2029
+ newPasswordLabel: "كلمة المرور الجديدة",
2030
+ newPasswordPlaceholder: "أدخل كلمة مرور جديدة",
2031
+ resetButton: "إعادة تعيين كلمة المرور",
2032
+ usePhoneResetText: "إعادة التعيين برمز SMS",
2033
+ useEmailResetText: "إعادة التعيين بالبريد الإلكتروني بدلاً من ذلك",
2034
+ phoneSuccessTitle: "تمت إعادة تعيين كلمة المرور",
2035
+ phoneSuccessDescription: "تمت إعادة تعيين كلمة المرور. يمكنك الآن تسجيل الدخول بكلمة المرور الجديدة.",
1772
2036
  },
1773
2037
  resetPassword: {
1774
2038
  title: "تعيين كلمة مرور جديدة",
@@ -1807,6 +2071,8 @@ const ar = {
1807
2071
  backToLogin: "العودة إلى تسجيل الدخول",
1808
2072
  checkSpam: "لم تستلم البريد؟ تحقق من مجلد البريد غير المرغوب أو تواصل مع الدعم.",
1809
2073
  or: "أو",
2074
+ // objectui#3546 slice three.
2075
+ resendUnavailable: "قد يكون إرسال البريد الإلكتروني غير مُهيأ في هذه البيئة. تواصل مع الدعم إذا استمرت المشكلة.",
1810
2076
  },
1811
2077
  setup: {
1812
2078
  welcomeTitle: "مرحباً بك في ObjectStack",
@@ -1845,6 +2111,9 @@ const ar = {
1845
2111
  invalidDescription: "لم يتم تقديم رمز جهاز في URL.",
1846
2112
  loading: "جارٍ التحميل…",
1847
2113
  cancel: "إلغاء",
2114
+ // objectui#3546 slice three — device-authorization plugin switched off.
2115
+ disabledTitle: "تفويض الأجهزة غير مُمكَّن",
2116
+ disabledDescription: "لم يتم تمكين تفويض الأجهزة في هذا النشر، لذا لا يمكن الموافقة على هذا الجهاز هنا.",
1848
2117
  },
1849
2118
  shell: {
1850
2119
  tenantHostHint: "تسجل الدخول إلى مساحة العمل هذه",
@@ -1884,6 +2153,29 @@ const ar = {
1884
2153
  },
1885
2154
  },
1886
2155
  },
2156
+ // objectui#3546 slice three — the /oauth/consent screen.
2157
+ oauth: {
2158
+ consent: {
2159
+ title: "يطلب {{appName}} الوصول إلى حسابك",
2160
+ request: "يطلب {{appName}} الإذن{{suffix}}.",
2161
+ unknownApp: "تطبيق ما",
2162
+ willAllow: "سيتمكن هذا التطبيق من:",
2163
+ scope: {
2164
+ openid: "تأكيد هويتك",
2165
+ profile: "قراءة ملفك الشخصي الأساسي (الاسم، الصورة)",
2166
+ email: "قراءة عنوان بريدك الإلكتروني",
2167
+ offlineAccess: "البقاء مسجّلاً للدخول (تحديث الوصول)",
2168
+ },
2169
+ deny: "رفض",
2170
+ authorize: "تفويض",
2171
+ submitting: "جارٍ التفويض…",
2172
+ granted: "تم منح الوصول",
2173
+ denied: "تم رفض الوصول",
2174
+ noRedirect: "لم يُرجع الخادم أي عنوان URL لإعادة التوجيه.",
2175
+ failed: "فشلت الموافقة",
2176
+ footer: "يمكنك إلغاء الوصول في أي وقت من إعدادات حسابك.",
2177
+ },
2178
+ },
1887
2179
  profile: {
1888
2180
  title: "الملف الشخصي",
1889
2181
  subtitle: "إدارة إعدادات حسابك",
@@ -1945,6 +2237,8 @@ const ar = {
1945
2237
  invite: "دعوة عضو",
1946
2238
  members: "الأعضاء",
1947
2239
  settings: "إعدادات مساحة العمل",
2240
+ multiOrgDisabled: "إنشاء مؤسسات جديدة معطّل في هذا النشر.",
2241
+ createFailed: 'تعذّر إنشاء مساحة العمل',
1948
2242
  },
1949
2243
  help: {
1950
2244
  onThisPage: "في هذه الصفحة",
@@ -1955,7 +2249,7 @@ const ar = {
1955
2249
  },
1956
2250
  sidebar: {
1957
2251
  packageManagement: "إدارة الحزم",
1958
- searchNavigation: "البحث في التنقل...",
2252
+ searchNavigation: "البحث في التنقل…",
1959
2253
  settings: "الإعدادات",
1960
2254
  help: "المساعدة",
1961
2255
  helpTooltip: "المساعدة والوثائق",
@@ -1979,8 +2273,8 @@ const ar = {
1979
2273
  switchObject: "تبديل الكائن",
1980
2274
  connection: {
1981
2275
  connected: "متصل",
1982
- connecting: "جارٍ الاتصال...",
1983
- reconnecting: "جارٍ إعادة الاتصال...",
2276
+ connecting: "جارٍ الاتصال…",
2277
+ reconnecting: "جارٍ إعادة الاتصال…",
1984
2278
  disconnected: "منقطع",
1985
2279
  error: "خطأ في الاتصال",
1986
2280
  },
@@ -2019,6 +2313,14 @@ const ar = {
2019
2313
  publishing: "جارٍ النشر…",
2020
2314
  published: "تم النشر! تغييراتك فعّالة الآن.",
2021
2315
  publishFailed: "فشل النشر",
2316
+ // objectui#3546 slice six — seedWarn له النص الإنجليزي نفسه الذي في
2317
+ // console.ai.seedWarn، فنعيد استخدام الترجمة ذاتها. علامة «(جمع)» تتبع
2318
+ // grid.import.rowsWithErrors في هذه الحزمة.
2319
+ nothing: "لا شيء للنشر.",
2320
+ probeWarn: "تم النشر، لكن التحقق وجد مشكلات.",
2321
+ seedWarn: "تم النشر، لكن تعذّر تحميل بعض البيانات التجريبية.",
2322
+ publishedVerified: "تم النشر والتحقق — {{count}} صف(صفوف) من البيانات التجريبية فعّالة الآن.",
2323
+ capabilityWarn: "فحص التأليف: {{count}} مرجع(مراجع) قدرات لا تشير إلى شيء.",
2022
2324
  },
2023
2325
  title: "الرئيسية",
2024
2326
  subtitle: "لوحة تحكم مساحة العمل",
@@ -2032,7 +2334,7 @@ const ar = {
2032
2334
  title: "يتطلب انتباهك",
2033
2335
  empty: "لقد أنجزت كل شيء",
2034
2336
  },
2035
- loading: "جارٍ تحميل مساحة العمل...",
2337
+ loading: "جارٍ تحميل مساحة العمل…",
2036
2338
  recent: "الأخيرة",
2037
2339
  starred: "المميزة بنجمة",
2038
2340
  welcome: "مرحباً بك في ObjectUI",
@@ -2093,6 +2395,9 @@ const ar = {
2093
2395
  roles: "الأدوار",
2094
2396
  configuration: "التهيئة",
2095
2397
  createApp: "إنشاء تطبيق",
2398
+ administration: "الإدارة",
2399
+ datasources: "مصادر البيانات",
2400
+ documentation: "الوثائق",
2096
2401
  },
2097
2402
  appSwitcher: {
2098
2403
  switchApplication: "تبديل التطبيق",
@@ -2132,7 +2437,7 @@ const ar = {
2132
2437
  search: {
2133
2438
  title: "بحث",
2134
2439
  back: "رجوع",
2135
- placeholder: "ابحث في الكائنات، لوحات التحكم، الصفحات، التقارير...",
2440
+ placeholder: "ابحث في الكائنات، لوحات التحكم، الصفحات، التقارير…",
2136
2441
  inputAriaLabel: "ابحث في الكائنات، لوحات التحكم، الصفحات، التقارير",
2137
2442
  resultsCount: "{{count}} نتيجة لـ \"{{query}}\"",
2138
2443
  resultsCountPlural: "{{count}} نتيجة لـ \"{{query}}\"",
@@ -2151,6 +2456,7 @@ const ar = {
2151
2456
  empty: {
2152
2457
  objectNotFound: "الكائن غير موجود",
2153
2458
  objectNotFoundDescription: "تعريف الكائن \"{{name}}\" مفقود. تحقق من الإعداد أو ارجع للخلف.",
2459
+ interfacePageSourceMissing: "تشير صفحة الواجهة هذه إلى \"{{name}}\"، وهو غير متاح.",
2154
2460
  pageNotFound: "الصفحة غير موجودة",
2155
2461
  pageNotFoundDescription: "الصفحة \"{{name}}\" غير موجودة. ربما تم إزالتها أو إعادة تسميتها.",
2156
2462
  dashboardNotFound: "لوحة التحكم غير موجودة",
@@ -2159,6 +2465,11 @@ const ar = {
2159
2465
  reportNotFoundDescription: "التقرير \"{{name}}\" غير موجود. ربما تم إزالته أو إعادة تسميته.",
2160
2466
  noAppsConfigured: "لا تطبيقات مُهيأة",
2161
2467
  noAppsConfiguredDescription: "لا تطبيقات مسجلة. أنشئ تطبيقك الأول أو زر إعدادات النظام.",
2468
+ appNotAvailable: "التطبيق غير متاح",
2469
+ appNotAvailableDescription: "هذا التطبيق غير متاح بعد — قد يكون النشر ما زال جارياً. أعد المحاولة بعد لحظات.",
2470
+ appAccessDenied: "ليس لديك حق الوصول إلى هذا التطبيق",
2471
+ appAccessDeniedDescription: "هذا التطبيق موجود، لكن حسابك غير مخوَّل بفتحه. اطلب من المسؤول منحك حق الوصول.",
2472
+ appAccessDeniedHome: "العودة إلى الرئيسية",
2162
2473
  createFirstApp: "إنشاء أول تطبيق",
2163
2474
  systemSettings: "إعدادات النظام",
2164
2475
  back: "رجوع",
@@ -2230,7 +2541,7 @@ const ar = {
2230
2541
  deleteFailed: "تعذر حذف العرض",
2231
2542
  },
2232
2543
  dashboardActions: {
2233
- pdfPreparing: "جارٍ تحضير تصدير PDF…",
2544
+ printDialogOpening: "جارٍ فتح مربع حوار الطباعة في المتصفح (ليس تصديرًا إلى PDF)",
2234
2545
  exportFailed: "فشل التصدير: {{message}}",
2235
2546
  forecastSoon: "عرض التوقعات قادم قريباً",
2236
2547
  },
@@ -2274,111 +2585,7 @@ const ar = {
2274
2585
  first: "الأول",
2275
2586
  },
2276
2587
  editor: {
2277
- breadcrumb: "الإعدادات",
2278
- basic: "أساسي",
2279
- title: "العنوان",
2280
- titlePlaceholder: "مثال: المسار حسب الربع",
2281
- description: "الوصف",
2282
- descriptionPlaceholder: "ماذا يعرض هذا التقرير؟",
2283
- type: "نوع التقرير",
2284
- typeTabular: "جدولي — قائمة مسطّحة",
2285
- typeSummary: "ملخص — مجمّع مع المجاميع",
2286
- typeMatrix: "مصفوفة — محور صفوف × أعمدة",
2287
- typeJoined: "مدمج — كتل متعددة",
2288
- typeHelp: "اختر التخطيط الذي يطابق ما تريد رؤيته.",
2289
- data: "البيانات",
2290
- objectName: "مصدر البيانات",
2291
- objectNamePlaceholder: "مثال: opportunity",
2292
- objectNameHelp: "أي كائن يجب أن يستعلم عنه هذا التقرير؟",
2293
- limit: "حد عدد الصفوف",
2294
- limitPlaceholder: "مثال: 100",
2295
- columns: "الأعمدة",
2296
- columnsHint: "اختر الحقول التي ستظهر كأعمدة. أضف تجميعًا (مجموع، عدد…) في تقارير الملخص أو المصفوفة.",
2297
- filters: "عوامل التصفية",
2298
- filtersHint: "قيّد الصفوف التي تدخل في هذا التقرير.",
2299
- filtersComplex: "يستخدم هذا التقرير عامل تصفية متقدّمًا لا يمكن تحريره هنا. سيُحتفظ به كما هو عند الحفظ.",
2300
- groupBy: "التجميع حسب",
2301
- groupByHint: "جمّع البيانات واحسب المجاميع الفرعية.",
2302
- rows: "الصفوف",
2303
- rowsHint: "جمّع الصفوف حسب هذه الحقول.",
2304
- columnsAxis: "الأعمدة",
2305
- columnsAxisHint: "اعرض هذه الحقول كمحور في الأعلى.",
2306
- values: "القيم",
2307
- valuesHint: "الأرقام التي تظهر في كل خلية. اختر حقلاً واحدًا أو أكثر وأضف تجميعًا (مجموع، عدد…).",
2308
- grouping: "تجميع",
2309
- addGrouping: "إضافة تجميع",
2310
- dateGranularity: "دقة التاريخ",
2311
- dateGranularityNone: "(استخدام القيمة الأصلية)",
2312
- day: "يوم",
2313
- week: "أسبوع",
2314
- month: "شهر",
2315
- quarter: "ربع",
2316
- year: "سنة",
2317
- sortAsc: "تصاعدي",
2318
- sortDesc: "تنازلي",
2319
- chart: "الرسم البياني",
2320
- chartHint: "عرض مرئي اختياري بجانب الجدول.",
2321
- chartType: "نوع الرسم",
2322
- chartTitle: "عنوان الرسم",
2323
- chartTitlePlaceholder: "افتراضيًا يستخدم عنوان التقرير",
2324
- chartXAxis: "المحور السيني (الفئة)",
2325
- chartYAxis: "المحور الصادي (القيمة)",
2326
- chartShowLegend: "إظهار وسيلة الإيضاح",
2327
- chartShowDataLabels: "إظهار تسميات البيانات",
2328
- chartNone: "(بدون رسم)",
2329
- chartBar: "أعمدة",
2330
- chartLine: "خطي",
2331
- chartArea: "منطقة",
2332
- chartPie: "دائري",
2333
- chartDonut: "حلقي",
2334
- chartFunnel: "قمعي",
2335
- validationNeedsObject: "اختر مصدر بيانات قبل إضافة الأعمدة.",
2336
- validationMatrixNeedsRowsCols: "تتطلب تقارير المصفوفة صفًا وعمودًا واحدًا على الأقل.",
2337
- validationSummaryNeedsRows: "تتطلب تقارير الملخص حقل تجميع واحدًا على الأقل.",
2338
- blocks: "الكتل",
2339
- blocksHint: "كل كتلة هي جدولها أو رسمها البياني الخاص. عوامل تصفية الكتلة تُدمج مع عامل تصفية التقرير بمنطق AND.",
2340
- addBlock: "إضافة كتلة",
2341
- removeBlock: "إزالة الكتلة",
2342
- blockName: "اسم الكتلة",
2343
- blockNamePlaceholder: "اسم_فريد_للكتلة",
2344
- blockLabel: "التسمية المعروضة",
2345
- blockLabelPlaceholder: "تُعرض فوق الكتلة",
2346
- blockDescription: "الوصف",
2347
- blockDescriptionPlaceholder: "سياق اختياري لهذه الكتلة",
2348
- validationJoinedNeedsBlocks: "تتطلب التقارير المدمجة كتلة واحدة على الأقل.",
2349
- validationBlockNameRequired: "يجب أن يكون لكل كتلة اسم غير فارغ.",
2350
- validationBlockNameDuplicate: "يجب أن تكون أسماء الكتل فريدة داخل التقرير.",
2351
- validationBlockNeedsColumns: "تحتاج كل كتلة إلى عمود واحد على الأقل.",
2352
- noneOption: "(بلا)",
2353
- addCondition: "إضافة شرط",
2354
- combineLogic: "الدمج مع",
2355
- opContains: "يحتوي على",
2356
- opIsEmpty: "فارغ",
2357
- opIsNotEmpty: "ليس فارغًا",
2358
- formatAuto: "تلقائي",
2359
- formatCurrency: "عملة",
2360
- formatPercent: "نسبة مئوية",
2361
- formatInteger: "عدد صحيح",
2362
- formatDate: "تاريخ",
2363
- formatDatetime: "تاريخ ووقت",
2364
- columnLabelPlaceholder: "تجاوز التسمية",
2365
- aggregateColumn: "تجميع",
2366
- formatColumn: "تنسيق",
2367
- addColumns: "إضافة أعمدة",
2368
- searchFields: "البحث في الحقول…",
2369
- noMatchingFields: "لا توجد حقول تطابق بحثك.",
2370
- noFieldsAvailable: "لا توجد حقول متاحة.",
2371
- columnsCount: "{n} عمود(أعمدة) محدد(ة)",
2372
- columnsEmpty: "لم يتم تحديد أعمدة بعد.",
2373
- fieldPickerTitle: "تحديد الحقول",
2374
- fieldPickerDescription: "اختر حقلاً أو أكثر للإضافة. استخدم مربع البحث لتصفية القائمة.",
2375
- fieldPickerChangeTitle: "تغيير الحقل",
2376
- fieldPickerAddGroupingTitle: "إضافة تجميع",
2377
- fieldPickerEmpty: "(تحديد حقل)",
2378
- fieldPickerSelected: "{n} محدد(ة)",
2379
- fieldPickerClear: "مسح التحديد",
2380
- fieldPickerAdd: "إضافة",
2381
- fieldPickerAddN: "إضافة {n}",
2588
+ panelTitle: "تعديل التقرير",
2382
2589
  },
2383
2590
  },
2384
2591
  organizations: {
@@ -2395,6 +2602,140 @@ const ar = {
2395
2602
  emptyDescription: "أنشئ مؤسستك الأولى للبدء.",
2396
2603
  noMatches: "لا توجد مؤسسات تطابق بحثك.",
2397
2604
  },
2605
+ organization: {
2606
+ roles: {
2607
+ owner: 'المالك',
2608
+ admin: 'المسؤول',
2609
+ delegatedAdmin: 'مسؤول مفوَّض',
2610
+ member: 'عضو',
2611
+ },
2612
+ errors: {
2613
+ notAllowedToInvite: 'لا يُسمح لك بدعوة مستخدمين إلى هذه المؤسسة.',
2614
+ notAllowedToInviteWithRole: 'لا يُسمح لك بدعوة مستخدم بهذا الدور.',
2615
+ alreadyInvited: 'تمت دعوة هذا المستخدم إلى هذه المؤسسة بالفعل.',
2616
+ organizationExists: 'هذه المؤسسة موجودة بالفعل.',
2617
+ slugTaken: 'هذا المُعرِّف مستخدَم بالفعل.',
2618
+ notAllowedToCreate: 'لا يُسمح لك بإنشاء مؤسسة جديدة.',
2619
+ notTheRecipient: 'لست المستلم المقصود بهذه الدعوة.',
2620
+ invitationNotFound: 'لم تعد هذه الدعوة موجودة أو أنها منتهية الصلاحية.',
2621
+ unknown: 'حدث خطأ ما. يرجى المحاولة مرة أخرى.',
2622
+ },
2623
+ backToList: "العودة إلى المؤسسات",
2624
+ notFound: "المؤسسة غير موجودة",
2625
+ notFoundDescription: "هذه المؤسسة غير موجودة أو ليس لديك صلاحية الوصول إليها.",
2626
+ tabs: {
2627
+ members: "الأعضاء",
2628
+ invitations: "الدعوات",
2629
+ settings: "الإعدادات",
2630
+ },
2631
+ members: {
2632
+ title: "الأعضاء",
2633
+ inviteMember: "دعوة عضو",
2634
+ inviteRestrictedNote: "لا يمكن دعوة الأعضاء إلا لمسؤولي المؤسسة.",
2635
+ removeMember: "إزالة العضو",
2636
+ removeConfirmTitle: "إزالة العضو؟",
2637
+ removeConfirmDescription: "سيؤدي ذلك إلى إزالة {{name}} من المؤسسة، وسيفقد صلاحية الوصول فورًا.",
2638
+ removeConfirmAction: "إزالة",
2639
+ memberRemoved: "تمت إزالة العضو",
2640
+ removeFailed: "فشل إزالة العضو",
2641
+ roleUpdated: "تم تحديث الدور",
2642
+ roleUpdateFailed: "فشل تحديث الدور",
2643
+ memberActions: 'إجراءات العضو',
2644
+ loadFailed: 'تعذّر تحميل الأعضاء',
2645
+ },
2646
+ invitations: {
2647
+ title: "الدعوات",
2648
+ empty: "لا توجد دعوات.",
2649
+ expiresAt: "تنتهي في",
2650
+ linkCopied: "تم نسخ رابط الدعوة",
2651
+ copyFailed: "فشل نسخ الرابط",
2652
+ canceled: "تم إلغاء الدعوة",
2653
+ cancelFailed: "فشل إلغاء الدعوة",
2654
+ cancelTitle: "إلغاء الدعوة؟",
2655
+ cancelDescription: "سيتم إبطال الدعوة المرسلة إلى {{email}}.",
2656
+ cancelAction: "إلغاء الدعوة",
2657
+ inviteTitle: "دعوة عضو",
2658
+ inviteDescription: "سيتلقى دعوة للانضمام إلى هذه المؤسسة.",
2659
+ emailLabel: "البريد الإلكتروني",
2660
+ roleLabel: "الدور",
2661
+ placementLabel: "التعيين (اختياري)",
2662
+ placementDescription: "يُطبَّق عند قبول الدعوة. تُعرض فقط الوحدات والمناصب التي يمكنك تفويضها.",
2663
+ businessUnitLabel: "وحدة العمل",
2664
+ businessUnitPlaceholder: "بدون تعيين",
2665
+ positionsLabel: "المناصب",
2666
+ sendInvite: "إرسال الدعوة",
2667
+ sentTitle: "تم إنشاء الدعوة",
2668
+ sentDescription: "شارك الرابط أدناه مع المدعوّ. سيحتاج إلى تسجيل الدخول للقبول.",
2669
+ linkLabel: "رابط القبول",
2670
+ invitedAs: "تمت دعوة {{email}} بصفة {{role}}",
2671
+ copyLinkLabel: 'نسخ رابط الدعوة',
2672
+ loadFailed: 'تعذّر تحميل الدعوات',
2673
+ inviteFailed: 'تعذّرت دعوة العضو',
2674
+ status: {
2675
+ all: "الكل",
2676
+ pending: "قيد الانتظار",
2677
+ accepted: "مقبولة",
2678
+ rejected: "مرفوضة",
2679
+ canceled: "ملغاة",
2680
+ },
2681
+ },
2682
+ settings: {
2683
+ generalTitle: "عام",
2684
+ generalDescription: "حدّث معلومات مؤسستك.",
2685
+ readOnlyNote: "يمكن للمالكين فقط تغيير الإعدادات.",
2686
+ nameLabel: "اسم المؤسسة",
2687
+ slugLabel: "المعرف",
2688
+ logoLabel: "الشعار",
2689
+ logoUpload: "رفع",
2690
+ logoReplace: "استبدال",
2691
+ logoClear: "إزالة",
2692
+ logoUploaded: "تم رفع الشعار — احفظ لتطبيقه",
2693
+ logoUploadFailed: "فشل رفع الشعار",
2694
+ save: "حفظ التغييرات",
2695
+ saved: "تم حفظ الإعدادات",
2696
+ saveFailed: "فشل حفظ الإعدادات",
2697
+ leaveTitle: "مغادرة المؤسسة",
2698
+ leaveDescription: "ستفقد صلاحية الوصول إلى هذه المؤسسة.",
2699
+ leaveAction: "مغادرة",
2700
+ leaveConfirmTitle: "مغادرة المؤسسة؟",
2701
+ leaveConfirmDescription: "هل أنت متأكد أنك تريد مغادرة {{name}}؟ ستفقد صلاحية الوصول فورًا.",
2702
+ leaveConfirmAction: "مغادرة",
2703
+ leftOrg: "لقد غادرت المؤسسة",
2704
+ leaveFailed: "فشلت مغادرة المؤسسة",
2705
+ dangerZone: "منطقة الخطر",
2706
+ deleteTitle: "حذف المؤسسة",
2707
+ deleteDescription: "احذف هذه المؤسسة وجميع بياناتها نهائيًا.",
2708
+ deleteAction: "حذف",
2709
+ deleteConfirmTitle: "حذف المؤسسة؟",
2710
+ deleteConfirmDescription: "هذا الإجراء لا يمكن التراجع عنه. ستُحذف جميع البيانات نهائيًا. اكتب معرف المؤسسة للتأكيد.",
2711
+ deleteConfirmSlugLabel: "اكتب \"{{slug}}\" للتأكيد",
2712
+ deleteConfirmAction: "حذف المؤسسة",
2713
+ deleted: "تم حذف المؤسسة",
2714
+ deleteFailed: "فشل حذف المؤسسة",
2715
+ },
2716
+ accept: {
2717
+ title: "لقد تلقيت دعوة",
2718
+ description: "تمت دعوتك للانضمام إلى {{orgName}} بصفة {{role}}.",
2719
+ errorTitle: "الدعوة غير متاحة",
2720
+ goToOrgs: "الانتقال إلى المؤسسات",
2721
+ loading: "جارٍ تحميل الدعوة…",
2722
+ organization: "المؤسسة",
2723
+ role: "الدور",
2724
+ expiresAt: "تنتهي في",
2725
+ accept: "قبول الدعوة",
2726
+ accepted: "تم قبول الدعوة",
2727
+ acceptFailed: "فشل قبول الدعوة",
2728
+ decline: "رفض",
2729
+ declined: "تم رفض الدعوة",
2730
+ declineFailed: "فشل رفض الدعوة",
2731
+ },
2732
+ switcher: {
2733
+ label: "تبديل المؤسسة",
2734
+ groupLabel: "مؤسسة العمل",
2735
+ groupHint: "تُنشأ السجلات الجديدة هنا. تعرض العروض بيانات من جميع مؤسساتك.",
2736
+ manageMembers: "إدارة الأعضاء",
2737
+ },
2738
+ },
2398
2739
  notifications: {
2399
2740
  regionLabel: "الإشعارات",
2400
2741
  groupCount: "{{count}} من الإشعارات",
@@ -2408,6 +2749,9 @@ const ar = {
2408
2749
  viewApprovals: "عرض الموافقات",
2409
2750
  noPendingApprovals: "لا توجد موافقات معلقة",
2410
2751
  openApprovalsInbox: "فتح صندوق الموافقات",
2752
+ badgeTotal: "{{total}} إجمالاً",
2753
+ badgeNotifications: "{{unread}} إشعارات",
2754
+ badgeApprovals: "{{approvals}} موافقات معلقة",
2411
2755
  emptyUnread: "كل شيء مقروء",
2412
2756
  filterUnread: "غير مقروء",
2413
2757
  filterAll: "الكل",
@@ -2694,6 +3038,7 @@ const ar = {
2694
3038
  dismiss: "رفض",
2695
3039
  openOnCloud: "فتح في السحابة",
2696
3040
  backHome: "العودة إلى الرئيسية",
3041
+ updateTo: "تحديث",
2697
3042
  },
2698
3043
  install: {
2699
3044
  dialogTitle: "تثبيت {{name}}",
@@ -2710,6 +3055,37 @@ const ar = {
2710
3055
  localManifestConflict: "{{message}}\nملاحظة: تطبيق محلي يمتلك بالفعل هذا المعرف. أزله أولاً من objectstack.config.ts.",
2711
3056
  localUnauthorized: "سجل الدخول إلى هذا الوقت التشغيل أولاً.",
2712
3057
  localMarketplaceUnavailable: "هذا الوقت التشغيل لا يحتوي على OS_CLOUD_URL مُهيأ.",
3058
+ updateTo: "تحديث → v{{version}}",
3059
+ installedVersion: "مثبت v{{version}}",
3060
+ },
3061
+ // objectui#3546 — the MarketplacePage "Your organization" strip.
3062
+ org: {
3063
+ heading: "مؤسستك",
3064
+ install: "تثبيت",
3065
+ installed: "تم تثبيت {{name}}",
3066
+ installedBadge: "مثبت",
3067
+ installing: "جارٍ التثبيت…",
3068
+ },
3069
+ // ADR-0025 PD4 §3.5/§3.11 — the pre-install consent panel
3070
+ // (PluginDisclosure.tsx). `runtime` is a CLOSED enum: spec
3071
+ // PluginRuntimeSchema = z.enum(['node', 'sandbox', 'worker']).
3072
+ disclosure: {
3073
+ containsCode: "تحتوي هذه الحزمة على تعليمات برمجية",
3074
+ reviewed: "تمت المراجعة والموافقة",
3075
+ unreviewed: "لم تتم المراجعة بعد",
3076
+ signed: "موقَّع",
3077
+ grantsIntro: "عند التثبيت، ستُمنح هذه الحزمة:",
3078
+ services: "خدمات المنصة",
3079
+ hooks: "خطافات دورة الحياة",
3080
+ network: "الوصول إلى الشبكة",
3081
+ fs: "الوصول إلى نظام الملفات",
3082
+ noPermissions: "لا تطلب أي أذونات خاصة.",
3083
+ acknowledge: "أفهم أن هذه الحزمة تنفّذ تعليمات برمجية وتحصل على الأذونات المذكورة أعلاه.",
3084
+ runtime: {
3085
+ node: "داخل العملية · ثقة كاملة",
3086
+ sandbox: "في بيئة معزولة",
3087
+ worker: "خارج العملية",
3088
+ },
2713
3089
  },
2714
3090
  uninstall: {
2715
3091
  confirm: "إلغاء تثبيت {{manifestId}} v{{version}} من هذا الوقت التشغيل؟\n\nسيتم إزالة المانيفست المخزن مؤقتاً.",
@@ -2959,6 +3335,34 @@ const ar = {
2959
3335
  confirmNote: 'النشر يُصدر كل المسودات المعلقة ({{count}}) لهذه الحزمة دفعة واحدة.',
2960
3336
  publishConfirm: 'نشر الكل',
2961
3337
  },
3338
+ // ADR-0045 — the materialized-but-unlisted app banner
3339
+ // (UnpublishedAppBar.tsx), sibling of draftBar above.
3340
+ unpublishedBar: {
3341
+ message: 'تطبيق غير منشور — يعمل بالكامل، لكن لا يراه سوى المنشئين. انشره ليصبح مرئياً لمستخدميك.',
3342
+ publish: 'نشر',
3343
+ publishing: 'جارٍ النشر…',
3344
+ published: 'تم النشر! التطبيق مرئي الآن لمستخدميك.',
3345
+ publishFailed: 'فشل النشر',
3346
+ },
3347
+ // ADR-0067 — the append-only build/revert timeline (CommitTimeline.tsx);
3348
+ // `button` is the banner's entry point into it.
3349
+ history: {
3350
+ button: 'السجل',
3351
+ title: 'سجل البناء',
3352
+ description: 'كل تغيير في هذا التطبيق، الأحدث أولاً. تراجع عن أي خطوة لإلغائها — لا حاجة لتأكيد النشر.',
3353
+ loadFailed: 'تعذر تحميل السجل:',
3354
+ loadFailedUnavailable: 'يتعذّر الوصول مؤقتًا إلى مخزن الإيداعات — لم تتم هذه القراءة، لذلك لا يُعرض أي سجل. أعد المحاولة بعد قليل.',
3355
+ loading: 'جارٍ تحميل السجل…',
3356
+ empty: 'لا يوجد سجل لهذا التطبيق بعد.',
3357
+ revertLabel: 'تم التراجع عن تغيير',
3358
+ applyLabel: 'تغيير من البناء',
3359
+ revert: 'تراجع',
3360
+ items: 'عناصر',
3361
+ revertAction: 'تراجع',
3362
+ reverted: 'تم التراجع — أُلغي التغيير.',
3363
+ revertFailed: 'فشل التراجع',
3364
+ revertUnavailable: 'يتعذّر الوصول مؤقتًا إلى مخزن الإيداعات — قد لا يكون التراجع قد طُبِّق. أعد فتح هذا السجل للتحقق قبل إعادة المحاولة.',
3365
+ },
2962
3366
  },
2963
3367
  filterBuilder: {
2964
3368
  where: "حيث",
@@ -3003,5 +3407,91 @@ const ar = {
3003
3407
  addSort: "إضافة ترتيب",
3004
3408
  removeSort: "إزالة الترتيب",
3005
3409
  },
3410
+ collaboration: {
3411
+ commentCount: "{{count}} تعليقات",
3412
+ commentCountOne: "{{count}} تعليق",
3413
+ resolvedSuffix: " · تم الحل",
3414
+ sortComments: "ترتيب التعليقات",
3415
+ sortOldest: "الأقدم أولاً",
3416
+ sortNewest: "الأحدث أولاً",
3417
+ resolve: "وضع علامة كمحلول",
3418
+ reopen: "إعادة الفتح",
3419
+ justNow: "الآن",
3420
+ minutesAgo: "قبل {{count}} دقيقة",
3421
+ hoursAgo: "قبل {{count}} ساعة",
3422
+ daysAgo: "قبل {{count}} يوم",
3423
+ edited: "(تم التعديل)",
3424
+ reactionCount: "{{count}} تفاعلات",
3425
+ reactionCountOne: "{{count}} تفاعل",
3426
+ addThumbsUp: "إضافة إعجاب",
3427
+ reply: "رد",
3428
+ reactThumbsUp: "التفاعل بإعجاب",
3429
+ reactHeart: "التفاعل بقلب",
3430
+ cancelReply: "إلغاء الرد",
3431
+ replyingTo: "الرد على {{name}}…",
3432
+ replyingToComment: "الرد على التعليق…",
3433
+ commentPlaceholder: "أضف تعليقًا… (استخدم @ للإشارة)",
3434
+ send: "إرسال",
3435
+ presentUserCount: "{{count}} مستخدمين متواجدين",
3436
+ presentUserCountOne: "{{count}} مستخدم متواجد",
3437
+ moreUserCount: "{{count}} مستخدمين آخرين",
3438
+ moreUserCountOne: "{{count}} مستخدم آخر",
3439
+ userStatusTitle: "{{name}} ({{status}})",
3440
+ statusActive: "نشط",
3441
+ statusIdle: "خامل",
3442
+ statusAway: "غائب",
3443
+ },
3444
+ wizard: {
3445
+ missingRequired: "يرجى إكمال الحقول المطلوبة: {{fields}}",
3446
+ },
3447
+ appManagement: {
3448
+ title: "التطبيقات",
3449
+ subtitle: "إدارة جميع التطبيقات المُعدّة",
3450
+ newApp: "تطبيق جديد",
3451
+ searchLabel: "البحث في التطبيقات",
3452
+ searchPlaceholder: "البحث في التطبيقات…",
3453
+ selectedCount: "{{n}} محدد",
3454
+ bulkEnable: "تفعيل",
3455
+ bulkDisable: "تعطيل",
3456
+ selectAll: "تحديد الكل ({{n}})",
3457
+ empty: "لم يتم العثور على تطبيقات.",
3458
+ defaultBadge: "افتراضي",
3459
+ active: "نشط",
3460
+ inactive: "غير نشط",
3461
+ selectApp: "تحديد {{name}}",
3462
+ openApp: "فتح التطبيق",
3463
+ openAppNamed: "فتح {{name}}",
3464
+ editApp: "تعديل التطبيق",
3465
+ editAppNamed: "تعديل {{name}}",
3466
+ editWithAi: "التعديل بالذكاء الاصطناعي",
3467
+ editWithAiNamed: "تعديل {{name}} بالذكاء الاصطناعي",
3468
+ enableApp: "تفعيل التطبيق",
3469
+ disableApp: "تعطيل التطبيق",
3470
+ enableAppNamed: "تفعيل {{name}}",
3471
+ disableAppNamed: "تعطيل {{name}}",
3472
+ setDefault: "تعيين كافتراضي",
3473
+ setDefaultNamed: "تعيين {{name}} كافتراضي",
3474
+ deleteApp: "حذف التطبيق",
3475
+ deleteAppNamed: "حذف {{name}}",
3476
+ confirmDelete: "انقر مرة أخرى لتأكيد الحذف",
3477
+ confirmDeleteNamed: "تأكيد حذف {{name}}",
3478
+ toast: {
3479
+ noClient: "تعذّر الوصول إلى خدمة البيانات الوصفية",
3480
+ unknownError: "خطأ غير معروف",
3481
+ appEnabled: "تم تفعيل {{name}}",
3482
+ appDisabled: "تم تعطيل {{name}}",
3483
+ toggleFailed: "فشل تغيير حالة التطبيق: {{reason}}",
3484
+ setDefaultDone: "تم تعيين {{name}} كافتراضي",
3485
+ setDefaultFailed: "فشل تعيين التطبيق الافتراضي: {{reason}}",
3486
+ appDeleted: "تم حذف {{name}}",
3487
+ deleteFailed: "فشل حذف التطبيق: {{reason}}",
3488
+ bulkEnabled: "تم تفعيل {{n}} تطبيقات",
3489
+ bulkDisabled: "تم تعطيل {{n}} تطبيقات",
3490
+ bulkFailed: "فشل لـ {{n}}: {{details}}",
3491
+ bulkFailureEntry: "{{name}} ({{reason}})",
3492
+ bulkFailureJoiner: "؛ ",
3493
+ bulkOperationFailed: "فشلت العملية الجماعية: {{reason}}",
3494
+ },
3495
+ },
3006
3496
  };
3007
3497
  export default ar;