@object-ui/i18n 17.3.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 +1295 -1
  2. package/README.md +0 -13
  3. package/dist/index.d.ts +3 -1
  4. package/dist/index.js +11 -1
  5. package/dist/locales/ar.d.ts +466 -107
  6. package/dist/locales/ar.js +559 -153
  7. package/dist/locales/de.d.ts +466 -107
  8. package/dist/locales/de.js +574 -175
  9. package/dist/locales/en.d.ts +502 -143
  10. package/dist/locales/en.js +678 -145
  11. package/dist/locales/es.d.ts +466 -107
  12. package/dist/locales/es.js +553 -155
  13. package/dist/locales/fr.d.ts +466 -107
  14. package/dist/locales/fr.js +553 -152
  15. package/dist/locales/index.d.ts +4734 -1144
  16. package/dist/locales/ja.d.ts +466 -107
  17. package/dist/locales/ja.js +545 -146
  18. package/dist/locales/ko.d.ts +466 -107
  19. package/dist/locales/ko.js +551 -153
  20. package/dist/locales/pt.d.ts +466 -107
  21. package/dist/locales/pt.js +552 -154
  22. package/dist/locales/ru.d.ts +466 -107
  23. package/dist/locales/ru.js +563 -153
  24. package/dist/locales/zh.d.ts +501 -142
  25. package/dist/locales/zh.js +542 -142
  26. package/dist/pickLocalized.d.ts +21 -0
  27. package/dist/pickLocalized.js +40 -7
  28. package/dist/provider.d.ts +83 -1
  29. package/dist/provider.js +303 -29
  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 +50 -2
  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 +4 -3
@@ -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,7 +113,7 @@ const ar = {
76
113
  required: "مطلوب",
77
114
  optional: "اختياري",
78
115
  selectOption: "اختر خياراً",
79
- select: "اختر...",
116
+ select: "اختر…",
80
117
  openChat: "فتح المحادثة",
81
118
  closeChat: "إغلاق المحادثة",
82
119
  closePanel: "إغلاق اللوحة",
@@ -85,6 +122,11 @@ const ar = {
85
122
  itemCountOne: "{{count}} عنصر",
86
123
  toggleSidebar: "تبديل الشريط الجانبي",
87
124
  package: "الحزمة",
125
+ done: "تم",
126
+ editInStudio: "التعديل في Studio",
127
+ record: "سجل",
128
+ retry: "إعادة المحاولة",
129
+ printDialogHint: "يفتح مربع حوار الطباعة في المتصفح (ليس تصديرًا إلى PDF)",
88
130
  },
89
131
  actions: {
90
132
  decisionOutput: {
@@ -116,6 +158,9 @@ const ar = {
116
158
  submitFailed: "تعذّر الحفظ. يرجى المحاولة مرة أخرى.",
117
159
  discardTitle: "تجاهل التغييرات؟",
118
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: "املأ حقول النموذج ثم أرسل أو ألغِ.",
119
164
  keepEditing: "متابعة التحرير",
120
165
  discard: "تجاهل",
121
166
  conflictTitle: "تعارض في الحفظ",
@@ -184,7 +229,7 @@ const ar = {
184
229
  richText: {
185
230
  format: "التنسيق: {{format}}",
186
231
  basicEditorHint: "محرر النص الغني (أساسي)",
187
- placeholder: "اكتب شيئاً...",
232
+ placeholder: "اكتب شيئاً…",
188
233
  },
189
234
  options: {
190
235
  empty: "لا توجد خيارات متاحة",
@@ -250,7 +295,7 @@ const ar = {
250
295
  saveAll: "حفظ الكل ({{count}})",
251
296
  addRecord: "إضافة سجل",
252
297
  open: "فتح",
253
- search: "بحث...",
298
+ search: "بحث…",
254
299
  modified: "{{count}} صف(صفوف) معدّل(ة)",
255
300
  saveFailed: 'فشل الحفظ',
256
301
  selected: "{{count}} محدد(ة)",
@@ -294,7 +339,7 @@ const ar = {
294
339
  delete: "حذف",
295
340
  export: "تصدير",
296
341
  exportAs: "تصدير كـ {{format}}",
297
- loading: "جاري تحميل الشبكة...",
342
+ loading: "جاري تحميل الشبكة…",
298
343
  errorLoading: "خطأ في تحميل الشبكة",
299
344
  pullToRefresh: "اسحب للتحديث",
300
345
  refreshing: "جاري التحديث…",
@@ -305,6 +350,22 @@ const ar = {
305
350
  yes: "نعم",
306
351
  no: "لا",
307
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
+ },
308
369
  toolbar: {
309
370
  densityMode: "الكثافة",
310
371
  densityCompact: "مضغوط",
@@ -418,12 +479,12 @@ const ar = {
418
479
  templateName: "اسم القالب",
419
480
  save: "حفظ",
420
481
  deleteTemplate: "حذف القالب",
421
- savedMapping: 'Saved mapping:',
422
- chooseSavedMapping: 'Choose a saved mapping…',
423
- manualMapping: '— Map columns manually —',
424
- transform: 'Transform',
425
- savedMappingHint: 'Mapping “{{name}}” applies rename + transforms + type coercion on the server. Column mapping is read-only.',
426
- 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}}" إعادة التسمية والتحويلات وتحويل الأنواع على الخادم.',
427
488
  csvColumn: "العمود",
428
489
  mapsTo: "يُعيَّن إلى",
429
490
  typeMismatch: "يبدو أنه {{type}}",
@@ -483,6 +544,8 @@ const ar = {
483
544
  loadErrorUnauthorizedMessage: "انتهت صلاحية جلستك أو تم تسجيل خروجك. سجّل الدخول مرة أخرى لعرض هذه السجلات.",
484
545
  loadErrorRejectedTitle: "تم رفض استعلام طريقة العرض هذه",
485
546
  loadErrorRejectedMessage: "تعذّر على الخادم معالجة عامل التصفية أو خيارات الاستعلام لطريقة العرض هذه. مسح عوامل التصفية يحل المشكلة عادةً؛ وإذا كانت طريقة العرض محفوظة بهذا الشكل، فيجب على المسؤول تصحيحها.",
547
+ loadErrorApiDisabledTitle: "هذا الكائن غير متاح عبر واجهة API",
548
+ loadErrorApiDisabledMessage: "لا يمكن لهذه الصفحة تحميل سجلاتها لأن الكائن غير معروض عبر واجهة API. هذا إعداد خاص بالكائن نفسه وليس صلاحية — يجب على المسؤول تفعيل الوصول عبر API حتى تعمل هذه الصفحة.",
486
549
  retry: "إعادة المحاولة",
487
550
  managedBy: {
488
551
  system: {
@@ -507,7 +570,7 @@ const ar = {
507
570
  },
508
571
  },
509
572
  refresh: "تحديث",
510
- loading: 'Loading records...',
573
+ loading: "جارٍ تحميل السجلات…",
511
574
  recordCount: "{{count}} سجلات",
512
575
  recordCountOne: "{{count}} سجل",
513
576
  addRecord: "إضافة سجل",
@@ -519,7 +582,8 @@ const ar = {
519
582
  sort: "ترتيب",
520
583
  sortRecords: "ترتيب السجلات",
521
584
  sortByIdSuffix: "(حسب المعرّف)",
522
- sortRelationalHint: "الأعمدة التي تشير إلى سجل آخر غير مدرجة هنا: يمكن ترتيبها حسب المعرّف المخزَّن فقط، وليس حسب الاسم الظاهر في الخلية. للترتيب حسب ذلك الاسم، أضف حقل صيغة يحتوي عليه.",
585
+ sortRelationalHint: "الأعمدة التي تشير إلى سجل آخر غير مدرجة هنا: يمكن ترتيبها حسب المعرّف المخزَّن فقط، وليس حسب الاسم الظاهر في الخلية. للترتيب حسب ذلك الاسم، أضِف الاسم إلى هذا الكائن نفسه (إلغاء التطبيع) كحقل مخزَّن يُكتب عند تغيّر المصدر، ثم رتّب حسبه. وليس حقل صيغة: فهو افتراضي، ولا يُخزَّن له أي عمود، ويرفض الخادم الترتيب حسبه.",
586
+ resetSortToDefault: "إعادة التعيين إلى الترتيب الافتراضي للعرض",
523
587
  group: "تجميع",
524
588
  groupBy: "تجميع حسب",
525
589
  export: "تصدير",
@@ -577,13 +641,16 @@ const ar = {
577
641
  },
578
642
  kanban: {
579
643
  uncategorized: "غير مصنّف",
644
+ columns: "أعمدة",
580
645
  addCard: "إضافة بطاقة",
581
646
  addColumn: "إضافة عمود",
582
647
  moveCard: "نقل بطاقة",
583
648
  deleteCard: "حذف بطاقة",
584
649
  deleteColumn: "حذف عمود",
585
650
  noCards: "لا بطاقات",
586
- cardTitlePlaceholder: "أدخل عنوان البطاقة...",
651
+ cardTitlePlaceholder: "أدخل عنوان البطاقة…",
652
+ requiredFieldsTitle: "أكمل الحقول المطلوبة",
653
+ requiredFieldsDescription: "يجعل هذا النقل الحقول أدناه مطلوبة. أكملها للمتابعة.",
587
654
  },
588
655
  timeline: {
589
656
  bucket: {
@@ -596,6 +663,13 @@ const ar = {
596
663
  noDate: "بدون تاريخ",
597
664
  unassigned: "غير معين",
598
665
  },
666
+ scale: {
667
+ week: "الأسبوع {{n}}",
668
+ quarter: "الربع {{quarter}} {{year}}",
669
+ },
670
+ gantt: {
671
+ rowLabel: "العناصر",
672
+ },
599
673
  },
600
674
  gantt: {
601
675
  viewMode: {
@@ -642,6 +716,18 @@ const ar = {
642
716
  ff: "نهاية → نهاية",
643
717
  sf: "بداية → نهاية",
644
718
  },
719
+ linkEnd: {
720
+ start: "بداية",
721
+ end: "نهاية",
722
+ },
723
+ link: {
724
+ rejected: {
725
+ self: "لا يمكن أن تعتمد المهمة على نفسها.",
726
+ locked: "هذا الصف مقفل ولا يمكنه استقبال تبعية جديدة.",
727
+ group: "لا يمكن لصف التلخيص استقبال تبعية — اربط إحدى مهامه بدلاً من ذلك.",
728
+ cycle: "هذا الرابط سينشئ تبعية دائرية.",
729
+ },
730
+ },
645
731
  conflict: {
646
732
  title: "تعارض في الجدولة",
647
733
  body: "يتعارض هذا النقل مع قيود التبعية. هل تريد إعادة جدولة {{count}} من المهام المتأثرة تلقائيًا؟",
@@ -650,8 +736,8 @@ const ar = {
650
736
  },
651
737
  autoScheduleDlg: {
652
738
  title: "الجدولة التلقائية",
653
- body: "هل تريد تأخير {count} من المهام لتلبية روابط التبعية؟",
654
- skipped: "{count} من المهام المقفلة تخالف الروابط أيضًا وقد تم تخطيها.",
739
+ body: "هل تريد تأخير {{count}} من المهام لتلبية روابط التبعية؟",
740
+ skipped: "{{count}} من المهام المقفلة تخالف الروابط أيضًا وقد تم تخطيها.",
655
741
  confirm: "تطبيق",
656
742
  cancel: "إلغاء",
657
743
  none: "جميع التبعيات مستوفاة — لا شيء لإعادة جدولته.",
@@ -688,6 +774,7 @@ const ar = {
688
774
  exportPng: "تصدير بصيغة PNG",
689
775
  exportPdf: "تصدير PDF",
690
776
  saveLayout: "حفظ التخطيط",
777
+ refresh: "تحديث",
691
778
  undo: "تراجع",
692
779
  redo: "إعادة",
693
780
  prevPeriod: "الفترة السابقة",
@@ -728,11 +815,11 @@ const ar = {
728
815
  defaultBadge: "افتراضي",
729
816
  tabActionsFor: "إجراءات العرض لـ {{name}}",
730
817
  readonlyAriaLabel: "عرض للقراءة فقط",
731
- readonlyTooltip: "عرض النظام — انسخ للتخصيص.",
818
+ readonlyTooltip: "عرض النظام — معرَّف في الكود، للقراءة فقط.",
732
819
  },
733
820
  designer: {
734
- undo: 'Undo',
735
- redo: 'Redo',
821
+ undo: "تراجع",
822
+ redo: "إعادة",
736
823
  },
737
824
  detail: {
738
825
  editInlineHint: "انقر نقرًا مزدوجًا للتحرير",
@@ -774,13 +861,15 @@ const ar = {
774
861
  relatedRecords: "{{count}} سجلات",
775
862
  relatedRecordOne: "{{count}} سجل",
776
863
  noRelatedRecords: "لا توجد سجلات ذات صلة",
777
- loading: "جاري التحميل...",
864
+ loading: "جاري التحميل…",
778
865
  copyToClipboard: "نسخ إلى الحافظة",
779
866
  copied: "تم النسخ!",
780
867
  deleteConfirmation: "هل أنت متأكد أنك تريد حذف هذا السجل؟",
868
+ deleted: "تم حذف السجل",
781
869
  editRecord: "تحرير السجل",
782
870
  viewAll: "عرض الكل",
783
871
  new: "جديد",
872
+ add: "إضافة",
784
873
  emptyValue: "—",
785
874
  comments: "التعليقات",
786
875
  searchComments: "البحث في التعليقات…",
@@ -845,6 +934,7 @@ const ar = {
845
934
  loadMore: "تحميل المزيد",
846
935
  edited: "(معدل)",
847
936
  via: "عبر {{source}}",
937
+ viewSource: "عرض المصدر",
848
938
  replyCount: "{{count}} رد",
849
939
  replyCountPlural: "{{count}} ردود",
850
940
  replyPlaceholder: "رد…",
@@ -886,9 +976,11 @@ const ar = {
886
976
  concurrentUpdateReload: "تحميل النسخة الحالية",
887
977
  concurrentUpdateOverwrite: "الكتابة فوقه على أي حال",
888
978
  concurrentUpdateCancel: "إلغاء",
979
+ concurrentUpdateRecordLabel: "هذا السجل",
889
980
  openInNewTab: "فتح في علامة تبويب جديدة",
890
981
  activity: "النشاط",
891
982
  history: "السجل",
983
+ historyEmpty: "لا يوجد سجل بعد",
892
984
  editRow: "تعديل",
893
985
  deleteRow: "حذف",
894
986
  deleteRowConfirmation: "حذف هذا السجل؟",
@@ -898,10 +990,16 @@ const ar = {
898
990
  nextPage: "التالي",
899
991
  pageOf: "صفحة {{current}} من {{total}}",
900
992
  sortBy: "ترتيب حسب",
901
- filterPlaceholder: "تصفية...",
993
+ filterPlaceholder: "تصفية…",
902
994
  highlightFields: "الحقول الرئيسية",
903
995
  createdBy: "أنشأه",
904
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}} فارغ(فارغة)",
905
1003
  showEmptyRelated_one: "+ {{count}} فارغ",
906
1004
  showEmptyRelated_other: "+ {{count}} فارغة",
907
1005
  copyEmail: "نسخ البريد الإلكتروني",
@@ -913,7 +1011,8 @@ const ar = {
913
1011
  },
914
1012
  chart: {
915
1013
  noData: "لا تتوفر بيانات للرسم البياني",
916
- loading: "جاري تحميل الرسم البياني...",
1014
+ loading: "جاري تحميل الرسم البياني…",
1015
+ nullCategory: "(غير محدد)",
917
1016
  },
918
1017
  map: {
919
1018
  searchLocations: "البحث عن المواقع…",
@@ -935,8 +1034,8 @@ const ar = {
935
1034
  properties: "الخصائص",
936
1035
  connections: "الاتصالات",
937
1036
  quickConnect: "اتصال سريع",
938
- fromPlaceholder: "من...",
939
- toPlaceholder: "إلى...",
1037
+ fromPlaceholder: "من…",
1038
+ toPlaceholder: "إلى…",
940
1039
  connect: "ربط",
941
1040
  label: "التسمية",
942
1041
  type: "النوع",
@@ -984,6 +1083,7 @@ const ar = {
984
1083
  },
985
1084
  dashboard: {
986
1085
  noRows: "لا توجد صفوف",
1086
+ loading: "جارٍ التحميل…",
987
1087
  pickMeasures: "اختر المقاييس (القيم) لأداة مجموعة البيانات هذه.",
988
1088
  datasetUnsupported: "مصدر البيانات هذا لا يدعم استعلامات مجموعات البيانات.",
989
1089
  details: "التفاصيل",
@@ -1077,7 +1177,7 @@ const ar = {
1077
1177
  faviconUrl: "Favicon URL",
1078
1178
  preview: "معاينة",
1079
1179
  complete: "إكمال",
1080
- snakeCaseHint: "Must be snake_case (e.g. my_app)",
1180
+ snakeCaseHint: "يجب أن يكون بصيغة snake_case (مثل my_app)",
1081
1181
  modeEdit: "تعديل",
1082
1182
  modePreview: "معاينة",
1083
1183
  modeCode: "كود",
@@ -1241,6 +1341,7 @@ const ar = {
1241
1341
  },
1242
1342
  },
1243
1343
  console: {
1344
+ saveAdvisoryTitle: "تم الحفظ — أنتج فحص التأليف {{count}} ملاحظة إرشادية",
1244
1345
  settingsHub: {
1245
1346
  title: "الإعدادات",
1246
1347
  subtitle: "اضبط مساحة العمل والتكاملات وأعلام الميزات.",
@@ -1307,7 +1408,7 @@ const ar = {
1307
1408
  shareTitle: "مشاركة هذه المحادثة",
1308
1409
  shareDisabledTitle: "ابدأ المحادثة لتفعيل المشاركة",
1309
1410
  newChat: "جديدة",
1310
- searchChats: "البحث في المحادثات...",
1411
+ searchChats: "البحث في المحادثات…",
1311
1412
  noChatsYet: "لا توجد محادثات بعد",
1312
1413
  noChatsDescription: "ابدأ محادثة جديدة لتظهر هنا.",
1313
1414
  noMatchingChats: "لا توجد محادثات مطابقة.",
@@ -1316,18 +1417,18 @@ const ar = {
1316
1417
  deleteConversation: "حذف المحادثة",
1317
1418
  saveRename: "حفظ الاسم",
1318
1419
  cancelRename: "إلغاء إعادة التسمية",
1319
- loadingHistory: "جارٍ تحميل سجل المحادثة...",
1420
+ loadingHistory: "جارٍ تحميل سجل المحادثة…",
1320
1421
  conversationReady: "المحادثة جاهزة",
1321
1422
  preparingConversation: "جارٍ تجهيز محادثة جديدة",
1322
1423
  offlineDemoMode: "وضع العرض دون اتصال — قائمة الوكلاء غير متاحة",
1323
1424
  sendFailedRateLimited: "أنت ترسل الرسائل بسرعة كبيرة. رسالتك محفوظة بالأسفل — انتظر لحظة ثم أعد المحاولة.",
1324
1425
  sendFailedGeneric: "تعذّر إرسال رسالتك. وهي محفوظة بالأسفل — يرجى إعادة المحاولة.",
1325
- askAgent: "اسأل {{agent}}...",
1426
+ askAgent: "اسأل {{agent}}…",
1326
1427
  assistant: "المساعد",
1327
1428
  liveCanvas: "معاينة حية — {{app}} (مسودة)",
1328
1429
  liveCanvasUnlisted: "تطبيق حي — {{app}} (غير مُدرج حتى النشر)",
1329
- loadingAgents: "جارٍ تحميل الوكلاء...",
1330
- askAnything: "اسأل عن أي شيء...",
1430
+ loadingAgents: "جارٍ تحميل الوكلاء…",
1431
+ askAnything: "اسأل عن أي شيء…",
1331
1432
  emptyTitle: "ابدأ محادثة",
1332
1433
  emptyDescription: "اسأل عن أي شيء — يمكن للمساعد الاطلاع على سياق تطبيقك الحالي.",
1333
1434
  switchAssistant: "تبديل المساعد",
@@ -1430,9 +1531,60 @@ const ar = {
1430
1531
  createSeed: "إنشاء بيانات تجريبية",
1431
1532
  createPackage: "إنشاء حزمة تطبيق",
1432
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
+ },
1433
1585
  },
1434
1586
  title: "وحدة تحكم ObjectStack",
1435
- initializing: "جاري تهيئة التطبيق...",
1587
+ initializing: "جاري تهيئة التطبيق…",
1436
1588
  loadingHint: "قد يستغرق إعداد بيئة جديدة بعض الوقت.",
1437
1589
  breadcrumb: {
1438
1590
  dashboards: "لوحات المعلومات",
@@ -1440,6 +1592,31 @@ const ar = {
1440
1592
  reports: "التقارير",
1441
1593
  system: "النظام",
1442
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
+ },
1443
1620
  loadingSteps: {
1444
1621
  connecting: "جاري الاتصال بمصدر البيانات",
1445
1622
  loadingConfig: "جاري تحميل الإعدادات",
@@ -1469,6 +1646,7 @@ const ar = {
1469
1646
  general: "عام",
1470
1647
  navigation: "التنقل",
1471
1648
  dataViews: "عروض البيانات",
1649
+ aiChat: "مساعد الذكاء الاصطناعي",
1472
1650
  preferences: "التفضيلات",
1473
1651
  },
1474
1652
  openCommandPalette: "فتح لوحة الأوامر",
@@ -1479,11 +1657,13 @@ const ar = {
1479
1657
  createRecord: "إنشاء سجل جديد",
1480
1658
  refreshData: "تحديث البيانات",
1481
1659
  editRecord: "تعديل السجل المحدد",
1660
+ newChat: "محادثة جديدة",
1661
+ toggleChatsList: "تبديل قائمة المحادثات",
1482
1662
  toggleDarkMode: "تبديل الوضع الداكن",
1483
1663
  },
1484
1664
  commandPalette: {
1485
1665
  title: "لوحة الأوامر",
1486
- placeholder: "اكتب أمراً أو ابحث...",
1666
+ placeholder: "اكتب أمراً أو ابحث…",
1487
1667
  noResults: "لم يتم العثور على نتائج.",
1488
1668
  objects: "الكائنات",
1489
1669
  dashboards: "لوحات المعلومات",
@@ -1509,6 +1689,12 @@ const ar = {
1509
1689
  goHome: "العودة للرئيسية",
1510
1690
  errorDetails: "تفاصيل الخطأ (وضع التطوير فقط)",
1511
1691
  },
1692
+ // objectui#3546 slice four — the console's catch-all route (AppContent `RouteNotFound`).
1693
+ notFound: {
1694
+ title: "الصفحة غير موجودة",
1695
+ description: "الرابط الذي فتحته لا يطابق أي عرض في هذا التطبيق.",
1696
+ back: "رجوع",
1697
+ },
1512
1698
  theme: {
1513
1699
  toggle: "تبديل المظهر",
1514
1700
  light: "فاتح",
@@ -1524,8 +1710,10 @@ const ar = {
1524
1710
  viewNameHelp: "مفتاح برمجي (snake_case). يُملأ تلقائيًا من العنوان — عدّله إن أردت.",
1525
1711
  viewNameRequired: "أدخل مفتاحًا (أحرف إنجليزية صغيرة وأرقام وشرطة سفلية). لا يُملأ تلقائيًا للعناوين غير اللاتينية.",
1526
1712
  viewNameInvalid: "استخدم أحرفًا إنجليزية صغيرة وأرقامًا وشرطات سفلية؛ وابدأ بحرف أو شرطة سفلية.",
1527
- systemViewReadonly: 'System view defined in code - duplicate to customize.',
1528
- expandToPage: 'Open as full page',
1713
+ systemViewReadonly: "عرض النظام معرَّف في الكود — للقراءة فقط.",
1714
+ cannotEditMetaView: "هذا عرض مدمج معرَّف في الكود — لا يمكن تعديله.",
1715
+ cannotDeleteMetaView: "هذا عرض مدمج معرَّف في الكود — لا يمكن حذفه.",
1716
+ expandToPage: "فتح كصفحة كاملة",
1529
1717
  objectNotFound: "الكائن غير موجود",
1530
1718
  objectNotFoundDescription: "الكائن \"{{objectName}}\" غير موجود في الإعدادات الحالية.",
1531
1719
  objectNotFoundHint: "تحقق من إعدادات التنقل في تطبيقك أو اختر كائنًا آخر من الشريط الجانبي.",
@@ -1557,7 +1745,7 @@ const ar = {
1557
1745
  exportPrintHint: "صيغ التصدير والطباعة وعرض عدد السجلات",
1558
1746
  showAllFields: "إظهار الكل",
1559
1747
  hideAllFields: "إخفاء الكل",
1560
- searchFields: "البحث في الحقول...",
1748
+ searchFields: "البحث في الحقول…",
1561
1749
  title: "العنوان",
1562
1750
  description: "الوصف",
1563
1751
  data: "البيانات",
@@ -1596,7 +1784,7 @@ const ar = {
1596
1784
  longitudeField: "حقل خط الطول",
1597
1785
  imageField: "حقل الصورة",
1598
1786
  dateField: "حقل التاريخ",
1599
- selectField: "اختر حقلاً...",
1787
+ selectField: "اختر حقلاً…",
1600
1788
  gridOptionsHint: "يستخدم عرض الشبكة الأعمدة المكونة أعلاه.",
1601
1789
  groupBy: "تجميع حسب",
1602
1790
  prefixField: "حقل البادئة",
@@ -1659,7 +1847,7 @@ const ar = {
1659
1847
  latitudeFieldHelp: "حقل يحتوي على خط العرض (حقول جغرافية فقط).",
1660
1848
  longitudeFieldHelp: "حقل يحتوي على خط الطول (حقول جغرافية فقط).",
1661
1849
  imageFieldHelp: "تأتي غلاف المعرض من هذا الحقل للصورة أو المرفق.",
1662
- selectOption: "تحديد...",
1850
+ selectOption: "تحديد…",
1663
1851
  noEligibleFieldForType: "لا يوجد حقل مؤهل من هذا النوع. أضف حقلاً إلى الكائن أولاً.",
1664
1852
  viewTypeUnavailable: "لا يحتوي هذا الكائن على حقل يمكن أن يعمل كـ \"{{field}}\".",
1665
1853
  viewTypeUnavailableShort: "غير مدعوم من هذا الكائن.",
@@ -1709,7 +1897,7 @@ const ar = {
1709
1897
  ufDropdown: "قائمة منسدلة",
1710
1898
  ufTabs: "علامات تبويب",
1711
1899
  ufToggle: "تبديل",
1712
- ufAddField: "+ إضافة حقل فلتر...",
1900
+ ufAddField: "+ إضافة حقل فلتر…",
1713
1901
  ufNoFields: "لا حقول متاحة",
1714
1902
  ufAddTab: "+ إضافة علامة تبويب",
1715
1903
  ufTabLabel: "التسمية",
@@ -1769,7 +1957,7 @@ const ar = {
1769
1957
  passwordPlaceholder: "أدخل كلمة المرور",
1770
1958
  forgotPasswordText: "نسيت كلمة المرور؟",
1771
1959
  submitButton: "تسجيل الدخول",
1772
- submittingButton: "جارٍ تسجيل الدخول...",
1960
+ submittingButton: "جارٍ تسجيل الدخول…",
1773
1961
  noAccountText: "ليس لديك حساب؟",
1774
1962
  signUpText: "إنشاء حساب",
1775
1963
  errors: {
@@ -1777,6 +1965,18 @@ const ar = {
1777
1965
  invalidCredentials: "بريد إلكتروني أو كلمة مرور غير صحيحة. يرجى المحاولة مرة أخرى.",
1778
1966
  emailNotVerified: "يرجى التحقق من بريدك الإلكتروني قبل تسجيل الدخول.",
1779
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: "تسجيل الدخول بكلمة المرور بدلاً من ذلك",
1780
1980
  },
1781
1981
  register: {
1782
1982
  title: "إنشاء حساب",
@@ -1792,7 +1992,7 @@ const ar = {
1792
1992
  passwordMismatchError: "كلمتا المرور غير متطابقتين",
1793
1993
  passwordTooShortError: "يجب أن تتكون كلمة المرور من 8 أحرف على الأقل",
1794
1994
  submitButton: "إنشاء حساب",
1795
- submittingButton: "جارٍ إنشاء الحساب...",
1995
+ submittingButton: "جارٍ إنشاء الحساب…",
1796
1996
  hasAccountText: "لديك حساب بالفعل؟",
1797
1997
  signInText: "تسجيل الدخول",
1798
1998
  errors: {
@@ -1813,12 +2013,26 @@ const ar = {
1813
2013
  emailLabel: "البريد الإلكتروني",
1814
2014
  emailPlaceholder: "name@example.com",
1815
2015
  submitButton: "إرسال رابط إعادة التعيين",
1816
- submittingButton: "جارٍ الإرسال...",
2016
+ submittingButton: "جارٍ الإرسال…",
1817
2017
  successTitle: "تحقق من بريدك الإلكتروني",
1818
2018
  successDescription: "لقد أرسلنا رابط إعادة تعيين كلمة المرور إلى {{email}}. يرجى التحقق من بريدك الوارد.",
1819
2019
  backToSignInText: "العودة إلى تسجيل الدخول",
1820
2020
  rememberPasswordText: "تتذكر كلمة المرور؟",
1821
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: "تمت إعادة تعيين كلمة المرور. يمكنك الآن تسجيل الدخول بكلمة المرور الجديدة.",
1822
2036
  },
1823
2037
  resetPassword: {
1824
2038
  title: "تعيين كلمة مرور جديدة",
@@ -1857,6 +2071,8 @@ const ar = {
1857
2071
  backToLogin: "العودة إلى تسجيل الدخول",
1858
2072
  checkSpam: "لم تستلم البريد؟ تحقق من مجلد البريد غير المرغوب أو تواصل مع الدعم.",
1859
2073
  or: "أو",
2074
+ // objectui#3546 slice three.
2075
+ resendUnavailable: "قد يكون إرسال البريد الإلكتروني غير مُهيأ في هذه البيئة. تواصل مع الدعم إذا استمرت المشكلة.",
1860
2076
  },
1861
2077
  setup: {
1862
2078
  welcomeTitle: "مرحباً بك في ObjectStack",
@@ -1895,6 +2111,9 @@ const ar = {
1895
2111
  invalidDescription: "لم يتم تقديم رمز جهاز في URL.",
1896
2112
  loading: "جارٍ التحميل…",
1897
2113
  cancel: "إلغاء",
2114
+ // objectui#3546 slice three — device-authorization plugin switched off.
2115
+ disabledTitle: "تفويض الأجهزة غير مُمكَّن",
2116
+ disabledDescription: "لم يتم تمكين تفويض الأجهزة في هذا النشر، لذا لا يمكن الموافقة على هذا الجهاز هنا.",
1898
2117
  },
1899
2118
  shell: {
1900
2119
  tenantHostHint: "تسجل الدخول إلى مساحة العمل هذه",
@@ -1934,6 +2153,29 @@ const ar = {
1934
2153
  },
1935
2154
  },
1936
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
+ },
1937
2179
  profile: {
1938
2180
  title: "الملف الشخصي",
1939
2181
  subtitle: "إدارة إعدادات حسابك",
@@ -1995,6 +2237,8 @@ const ar = {
1995
2237
  invite: "دعوة عضو",
1996
2238
  members: "الأعضاء",
1997
2239
  settings: "إعدادات مساحة العمل",
2240
+ multiOrgDisabled: "إنشاء مؤسسات جديدة معطّل في هذا النشر.",
2241
+ createFailed: 'تعذّر إنشاء مساحة العمل',
1998
2242
  },
1999
2243
  help: {
2000
2244
  onThisPage: "في هذه الصفحة",
@@ -2005,7 +2249,7 @@ const ar = {
2005
2249
  },
2006
2250
  sidebar: {
2007
2251
  packageManagement: "إدارة الحزم",
2008
- searchNavigation: "البحث في التنقل...",
2252
+ searchNavigation: "البحث في التنقل…",
2009
2253
  settings: "الإعدادات",
2010
2254
  help: "المساعدة",
2011
2255
  helpTooltip: "المساعدة والوثائق",
@@ -2029,8 +2273,8 @@ const ar = {
2029
2273
  switchObject: "تبديل الكائن",
2030
2274
  connection: {
2031
2275
  connected: "متصل",
2032
- connecting: "جارٍ الاتصال...",
2033
- reconnecting: "جارٍ إعادة الاتصال...",
2276
+ connecting: "جارٍ الاتصال…",
2277
+ reconnecting: "جارٍ إعادة الاتصال…",
2034
2278
  disconnected: "منقطع",
2035
2279
  error: "خطأ في الاتصال",
2036
2280
  },
@@ -2069,6 +2313,14 @@ const ar = {
2069
2313
  publishing: "جارٍ النشر…",
2070
2314
  published: "تم النشر! تغييراتك فعّالة الآن.",
2071
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}} مرجع(مراجع) قدرات لا تشير إلى شيء.",
2072
2324
  },
2073
2325
  title: "الرئيسية",
2074
2326
  subtitle: "لوحة تحكم مساحة العمل",
@@ -2082,7 +2334,7 @@ const ar = {
2082
2334
  title: "يتطلب انتباهك",
2083
2335
  empty: "لقد أنجزت كل شيء",
2084
2336
  },
2085
- loading: "جارٍ تحميل مساحة العمل...",
2337
+ loading: "جارٍ تحميل مساحة العمل…",
2086
2338
  recent: "الأخيرة",
2087
2339
  starred: "المميزة بنجمة",
2088
2340
  welcome: "مرحباً بك في ObjectUI",
@@ -2143,6 +2395,9 @@ const ar = {
2143
2395
  roles: "الأدوار",
2144
2396
  configuration: "التهيئة",
2145
2397
  createApp: "إنشاء تطبيق",
2398
+ administration: "الإدارة",
2399
+ datasources: "مصادر البيانات",
2400
+ documentation: "الوثائق",
2146
2401
  },
2147
2402
  appSwitcher: {
2148
2403
  switchApplication: "تبديل التطبيق",
@@ -2182,7 +2437,7 @@ const ar = {
2182
2437
  search: {
2183
2438
  title: "بحث",
2184
2439
  back: "رجوع",
2185
- placeholder: "ابحث في الكائنات، لوحات التحكم، الصفحات، التقارير...",
2440
+ placeholder: "ابحث في الكائنات، لوحات التحكم، الصفحات، التقارير…",
2186
2441
  inputAriaLabel: "ابحث في الكائنات، لوحات التحكم، الصفحات، التقارير",
2187
2442
  resultsCount: "{{count}} نتيجة لـ \"{{query}}\"",
2188
2443
  resultsCountPlural: "{{count}} نتيجة لـ \"{{query}}\"",
@@ -2201,6 +2456,7 @@ const ar = {
2201
2456
  empty: {
2202
2457
  objectNotFound: "الكائن غير موجود",
2203
2458
  objectNotFoundDescription: "تعريف الكائن \"{{name}}\" مفقود. تحقق من الإعداد أو ارجع للخلف.",
2459
+ interfacePageSourceMissing: "تشير صفحة الواجهة هذه إلى \"{{name}}\"، وهو غير متاح.",
2204
2460
  pageNotFound: "الصفحة غير موجودة",
2205
2461
  pageNotFoundDescription: "الصفحة \"{{name}}\" غير موجودة. ربما تم إزالتها أو إعادة تسميتها.",
2206
2462
  dashboardNotFound: "لوحة التحكم غير موجودة",
@@ -2209,6 +2465,11 @@ const ar = {
2209
2465
  reportNotFoundDescription: "التقرير \"{{name}}\" غير موجود. ربما تم إزالته أو إعادة تسميته.",
2210
2466
  noAppsConfigured: "لا تطبيقات مُهيأة",
2211
2467
  noAppsConfiguredDescription: "لا تطبيقات مسجلة. أنشئ تطبيقك الأول أو زر إعدادات النظام.",
2468
+ appNotAvailable: "التطبيق غير متاح",
2469
+ appNotAvailableDescription: "هذا التطبيق غير متاح بعد — قد يكون النشر ما زال جارياً. أعد المحاولة بعد لحظات.",
2470
+ appAccessDenied: "ليس لديك حق الوصول إلى هذا التطبيق",
2471
+ appAccessDeniedDescription: "هذا التطبيق موجود، لكن حسابك غير مخوَّل بفتحه. اطلب من المسؤول منحك حق الوصول.",
2472
+ appAccessDeniedHome: "العودة إلى الرئيسية",
2212
2473
  createFirstApp: "إنشاء أول تطبيق",
2213
2474
  systemSettings: "إعدادات النظام",
2214
2475
  back: "رجوع",
@@ -2280,7 +2541,7 @@ const ar = {
2280
2541
  deleteFailed: "تعذر حذف العرض",
2281
2542
  },
2282
2543
  dashboardActions: {
2283
- pdfPreparing: "جارٍ تحضير تصدير PDF…",
2544
+ printDialogOpening: "جارٍ فتح مربع حوار الطباعة في المتصفح (ليس تصديرًا إلى PDF)",
2284
2545
  exportFailed: "فشل التصدير: {{message}}",
2285
2546
  forecastSoon: "عرض التوقعات قادم قريباً",
2286
2547
  },
@@ -2324,111 +2585,7 @@ const ar = {
2324
2585
  first: "الأول",
2325
2586
  },
2326
2587
  editor: {
2327
- breadcrumb: "الإعدادات",
2328
- basic: "أساسي",
2329
- title: "العنوان",
2330
- titlePlaceholder: "مثال: المسار حسب الربع",
2331
- description: "الوصف",
2332
- descriptionPlaceholder: "ماذا يعرض هذا التقرير؟",
2333
- type: "نوع التقرير",
2334
- typeTabular: "جدولي — قائمة مسطّحة",
2335
- typeSummary: "ملخص — مجمّع مع المجاميع",
2336
- typeMatrix: "مصفوفة — محور صفوف × أعمدة",
2337
- typeJoined: "مدمج — كتل متعددة",
2338
- typeHelp: "اختر التخطيط الذي يطابق ما تريد رؤيته.",
2339
- data: "البيانات",
2340
- objectName: "مصدر البيانات",
2341
- objectNamePlaceholder: "مثال: opportunity",
2342
- objectNameHelp: "أي كائن يجب أن يستعلم عنه هذا التقرير؟",
2343
- limit: "حد عدد الصفوف",
2344
- limitPlaceholder: "مثال: 100",
2345
- columns: "الأعمدة",
2346
- columnsHint: "اختر الحقول التي ستظهر كأعمدة. أضف تجميعًا (مجموع، عدد…) في تقارير الملخص أو المصفوفة.",
2347
- filters: "عوامل التصفية",
2348
- filtersHint: "قيّد الصفوف التي تدخل في هذا التقرير.",
2349
- filtersComplex: "يستخدم هذا التقرير عامل تصفية متقدّمًا لا يمكن تحريره هنا. سيُحتفظ به كما هو عند الحفظ.",
2350
- groupBy: "التجميع حسب",
2351
- groupByHint: "جمّع البيانات واحسب المجاميع الفرعية.",
2352
- rows: "الصفوف",
2353
- rowsHint: "جمّع الصفوف حسب هذه الحقول.",
2354
- columnsAxis: "الأعمدة",
2355
- columnsAxisHint: "اعرض هذه الحقول كمحور في الأعلى.",
2356
- values: "القيم",
2357
- valuesHint: "الأرقام التي تظهر في كل خلية. اختر حقلاً واحدًا أو أكثر وأضف تجميعًا (مجموع، عدد…).",
2358
- grouping: "تجميع",
2359
- addGrouping: "إضافة تجميع",
2360
- dateGranularity: "دقة التاريخ",
2361
- dateGranularityNone: "(استخدام القيمة الأصلية)",
2362
- day: "يوم",
2363
- week: "أسبوع",
2364
- month: "شهر",
2365
- quarter: "ربع",
2366
- year: "سنة",
2367
- sortAsc: "تصاعدي",
2368
- sortDesc: "تنازلي",
2369
- chart: "الرسم البياني",
2370
- chartHint: "عرض مرئي اختياري بجانب الجدول.",
2371
- chartType: "نوع الرسم",
2372
- chartTitle: "عنوان الرسم",
2373
- chartTitlePlaceholder: "افتراضيًا يستخدم عنوان التقرير",
2374
- chartXAxis: "المحور السيني (الفئة)",
2375
- chartYAxis: "المحور الصادي (القيمة)",
2376
- chartShowLegend: "إظهار وسيلة الإيضاح",
2377
- chartShowDataLabels: "إظهار تسميات البيانات",
2378
- chartNone: "(بدون رسم)",
2379
- chartBar: "أعمدة",
2380
- chartLine: "خطي",
2381
- chartArea: "منطقة",
2382
- chartPie: "دائري",
2383
- chartDonut: "حلقي",
2384
- chartFunnel: "قمعي",
2385
- validationNeedsObject: "اختر مصدر بيانات قبل إضافة الأعمدة.",
2386
- validationMatrixNeedsRowsCols: "تتطلب تقارير المصفوفة صفًا وعمودًا واحدًا على الأقل.",
2387
- validationSummaryNeedsRows: "تتطلب تقارير الملخص حقل تجميع واحدًا على الأقل.",
2388
- blocks: "الكتل",
2389
- blocksHint: "كل كتلة هي جدولها أو رسمها البياني الخاص. عوامل تصفية الكتلة تُدمج مع عامل تصفية التقرير بمنطق AND.",
2390
- addBlock: "إضافة كتلة",
2391
- removeBlock: "إزالة الكتلة",
2392
- blockName: "اسم الكتلة",
2393
- blockNamePlaceholder: "اسم_فريد_للكتلة",
2394
- blockLabel: "التسمية المعروضة",
2395
- blockLabelPlaceholder: "تُعرض فوق الكتلة",
2396
- blockDescription: "الوصف",
2397
- blockDescriptionPlaceholder: "سياق اختياري لهذه الكتلة",
2398
- validationJoinedNeedsBlocks: "تتطلب التقارير المدمجة كتلة واحدة على الأقل.",
2399
- validationBlockNameRequired: "يجب أن يكون لكل كتلة اسم غير فارغ.",
2400
- validationBlockNameDuplicate: "يجب أن تكون أسماء الكتل فريدة داخل التقرير.",
2401
- validationBlockNeedsColumns: "تحتاج كل كتلة إلى عمود واحد على الأقل.",
2402
- noneOption: "(بلا)",
2403
- addCondition: "إضافة شرط",
2404
- combineLogic: "الدمج مع",
2405
- opContains: "يحتوي على",
2406
- opIsEmpty: "فارغ",
2407
- opIsNotEmpty: "ليس فارغًا",
2408
- formatAuto: "تلقائي",
2409
- formatCurrency: "عملة",
2410
- formatPercent: "نسبة مئوية",
2411
- formatInteger: "عدد صحيح",
2412
- formatDate: "تاريخ",
2413
- formatDatetime: "تاريخ ووقت",
2414
- columnLabelPlaceholder: "تجاوز التسمية",
2415
- aggregateColumn: "تجميع",
2416
- formatColumn: "تنسيق",
2417
- addColumns: "إضافة أعمدة",
2418
- searchFields: "البحث في الحقول…",
2419
- noMatchingFields: "لا توجد حقول تطابق بحثك.",
2420
- noFieldsAvailable: "لا توجد حقول متاحة.",
2421
- columnsCount: "{n} عمود(أعمدة) محدد(ة)",
2422
- columnsEmpty: "لم يتم تحديد أعمدة بعد.",
2423
- fieldPickerTitle: "تحديد الحقول",
2424
- fieldPickerDescription: "اختر حقلاً أو أكثر للإضافة. استخدم مربع البحث لتصفية القائمة.",
2425
- fieldPickerChangeTitle: "تغيير الحقل",
2426
- fieldPickerAddGroupingTitle: "إضافة تجميع",
2427
- fieldPickerEmpty: "(تحديد حقل)",
2428
- fieldPickerSelected: "{n} محدد(ة)",
2429
- fieldPickerClear: "مسح التحديد",
2430
- fieldPickerAdd: "إضافة",
2431
- fieldPickerAddN: "إضافة {n}",
2588
+ panelTitle: "تعديل التقرير",
2432
2589
  },
2433
2590
  },
2434
2591
  organizations: {
@@ -2445,6 +2602,140 @@ const ar = {
2445
2602
  emptyDescription: "أنشئ مؤسستك الأولى للبدء.",
2446
2603
  noMatches: "لا توجد مؤسسات تطابق بحثك.",
2447
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
+ },
2448
2739
  notifications: {
2449
2740
  regionLabel: "الإشعارات",
2450
2741
  groupCount: "{{count}} من الإشعارات",
@@ -2458,6 +2749,9 @@ const ar = {
2458
2749
  viewApprovals: "عرض الموافقات",
2459
2750
  noPendingApprovals: "لا توجد موافقات معلقة",
2460
2751
  openApprovalsInbox: "فتح صندوق الموافقات",
2752
+ badgeTotal: "{{total}} إجمالاً",
2753
+ badgeNotifications: "{{unread}} إشعارات",
2754
+ badgeApprovals: "{{approvals}} موافقات معلقة",
2461
2755
  emptyUnread: "كل شيء مقروء",
2462
2756
  filterUnread: "غير مقروء",
2463
2757
  filterAll: "الكل",
@@ -2744,6 +3038,7 @@ const ar = {
2744
3038
  dismiss: "رفض",
2745
3039
  openOnCloud: "فتح في السحابة",
2746
3040
  backHome: "العودة إلى الرئيسية",
3041
+ updateTo: "تحديث",
2747
3042
  },
2748
3043
  install: {
2749
3044
  dialogTitle: "تثبيت {{name}}",
@@ -2760,6 +3055,37 @@ const ar = {
2760
3055
  localManifestConflict: "{{message}}\nملاحظة: تطبيق محلي يمتلك بالفعل هذا المعرف. أزله أولاً من objectstack.config.ts.",
2761
3056
  localUnauthorized: "سجل الدخول إلى هذا الوقت التشغيل أولاً.",
2762
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
+ },
2763
3089
  },
2764
3090
  uninstall: {
2765
3091
  confirm: "إلغاء تثبيت {{manifestId}} v{{version}} من هذا الوقت التشغيل؟\n\nسيتم إزالة المانيفست المخزن مؤقتاً.",
@@ -3009,6 +3335,34 @@ const ar = {
3009
3335
  confirmNote: 'النشر يُصدر كل المسودات المعلقة ({{count}}) لهذه الحزمة دفعة واحدة.',
3010
3336
  publishConfirm: 'نشر الكل',
3011
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
+ },
3012
3366
  },
3013
3367
  filterBuilder: {
3014
3368
  where: "حيث",
@@ -3087,5 +3441,57 @@ const ar = {
3087
3441
  statusIdle: "خامل",
3088
3442
  statusAway: "غائب",
3089
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
+ },
3090
3496
  };
3091
3497
  export default ar;