Files
TX/artifacts/tx-os/src/locales/ar.json
T
Riyadh affd105c7a Executive Meetings Phase 2: full module + atomic audit
Original task (#108): polish the daily-schedule UI and ship the
remaining 8 sections of the Executive Meetings module (Manage,
Requests, Approvals, Tasks, Notifications, Audit, PDF, Font Settings)
with bilingual i18n and fine-grained RBAC.

What changed:
- Schedule UI: centered cells, '#' header (not 'م'), attendees widest,
  RTL column order locked, navy/white/gray + red highlighting only.
- Schema: made executive_meeting_requests.meetingId nullable so
  'create-meeting' suggestions don't need a target row.
- Backend rewrite of artifacts/api-server/src/routes/executive-meetings.ts:
  GET /me (now returns userId), full CRUD for meetings (transactional
  attendee replace), requests CRUD + approve/reject/withdraw, tasks
  CRUD with assignee status updates, audit-logs GET (admin), notifications
  GET, font-settings GET/PATCH (per-user + global). RBAC via 5 role
  sets and a makeRequireRoles middleware factory.
- Audit-in-transaction: every mutation (meeting/request/task/font CRUD)
  wraps the DB write AND the audit-log insert in the same db.transaction
  so audit entries cannot drift from state if either insert fails. This
  was the main finding from the architect review and is now fixed.
- Path-to-regexp 8 fix: replaced inline ':id(\\d+)' with router.param('id')
  + next('route') guard, plus NaN guards in handlers.
- Frontend rewrite of artifacts/tx-os/src/pages/executive-meetings.tsx
  (~2200 lines): 8 new section components, RBAC-aware UI via /me,
  per-task assignee check now shown for status buttons.
- i18n: full executiveMeetings.* key set added in ar.json + en.json.

Verified: full e2e (admin login -> all 9 tabs -> create meeting ->
submit request -> approve -> audit shows full chain -> font save)
plus a smoke regression after the audit-in-tx refactor (atomic
audit row created in lockstep with mutation).

Out of scope (proposed as follow-ups #110-#112): real notification
delivery, real PDF generation (currently window.print), and
automated integration tests for the new endpoints. The pre-existing
'apps-open.test.mjs' syntax error in the test workflow is unrelated
to this task.
2026-04-28 06:18:08 +00:00

868 lines
39 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"nav": {
"home": "الرئيسية",
"services": "الخدمات",
"chat": "المحادثات",
"notifications": "الإشعارات",
"admin": "لوحة التحكم",
"logout": "تسجيل الخروج"
},
"auth": {
"login": "تسجيل الدخول",
"register": "إنشاء حساب",
"username": "اسم المستخدم",
"email": "البريد الإلكتروني",
"password": "كلمة المرور",
"loginButton": "دخول",
"registerButton": "تسجيل",
"welcomeBack": "مرحباً بعودتك",
"createAccount": "حساب جديد",
"registrationClosed": "إنشاء الحسابات العامة مغلق حالياً. تواصل مع مدير النظام.",
"displayNameAr": "الاسم (عربي)",
"displayNameEn": "الاسم (إنجليزي)",
"subtitle": "سجّل دخولك للمتابعة",
"signingIn": "جارٍ الدخول...",
"noAccount": "ليس لديك حساب؟",
"showPassword": "إظهار كلمة المرور",
"hidePassword": "إخفاء كلمة المرور",
"errRequired": "الرجاء إدخال اسم المستخدم وكلمة المرور.",
"errInvalid": "اسم مستخدم أو كلمة مرور غير صحيحة.",
"forgotPassword": "نسيت كلمة المرور؟",
"forgot": {
"title": "إعادة تعيين كلمة المرور",
"subtitle": "أدخل اسم المستخدم أو البريد الإلكتروني وسنرسل لك رابطاً لإعادة تعيين كلمة المرور.",
"identifier": "اسم المستخدم أو البريد الإلكتروني",
"identifierPlaceholder": "you@example.com",
"submit": "إرسال رابط الاستعادة",
"sending": "جارٍ الإرسال...",
"errRequired": "الرجاء إدخال اسم المستخدم أو البريد الإلكتروني.",
"errGeneric": "حدث خطأ ما. حاول مرة أخرى.",
"successMessage": "تم استلام طلبك. سيقوم المسؤول بمشاركة رابط إعادة التعيين معك قريباً.",
"adminNotice": "إرسال البريد الإلكتروني غير مفعّل بعد لهذه المساحة، لذا سيصدر المسؤول رابط إعادة تعيين لمرة واحدة يدوياً.",
"backToLogin": "العودة إلى تسجيل الدخول"
},
"reset": {
"title": "تعيين كلمة مرور جديدة",
"subtitle": "اختر كلمة مرور جديدة لحسابك.",
"newPassword": "كلمة المرور الجديدة",
"confirmPassword": "تأكيد كلمة المرور",
"submit": "تحديث كلمة المرور",
"saving": "جارٍ الحفظ...",
"errMinLength": "يجب أن تكون كلمة المرور ٦ أحرف على الأقل.",
"errMismatch": "كلمتا المرور غير متطابقتين.",
"errGeneric": "تعذّر إعادة تعيين كلمة المرور. قد يكون الرابط منتهي الصلاحية.",
"invalidToken": "رابط إعادة التعيين غير صالح أو منتهي الصلاحية.",
"requestNew": "طلب رابط جديد",
"successMessage": "تم تحديث كلمة المرور بنجاح. يمكنك تسجيل الدخول بكلمة المرور الجديدة.",
"goToLogin": "الذهاب لتسجيل الدخول"
},
"heroTitle": "مرحباً بك في منصتك الموحدة.",
"heroSubtitle": "سجّل دخولك لإدارة كل شيء من مكان واحد.",
"feat1": "كل أدواتك في لوحة تحكم واحدة",
"feat2": "تحديثات لحظية",
"feat3": "وصول آمن بالجلسات",
"rights": "جميع الحقوق محفوظة."
},
"home": {
"myApps": "تطبيقاتي",
"noApps": "لا توجد تطبيقات بعد",
"noAppsHint": "ستظهر هنا التطبيقات التي تملك صلاحية الوصول إليها.",
"greeting": {
"morning": "صباح الخير، {{name}}",
"afternoon": "مساء الخير، {{name}}",
"evening": "مساء الخير، {{name}}"
},
"stats": {
"apps": "التطبيقات",
"services": "الخدمات",
"messages": "الرسائل",
"alerts": "التنبيهات"
},
"clockStyle": {
"label": "نمط الساعة",
"showWidget": "إظهار ساعة الحائط في الشاشة الرئيسية",
"showTopbar": "إظهار الساعة في الشريط العلوي",
"hideWidget": "إخفاء الساعة",
"hourFormat": {
"label": "صيغة الساعة",
"h12": "12 ساعة (ص/م)",
"h24": "24 ساعة"
},
"options": {
"full": "كامل (الوقت واليوم والتقويمان الهجري والميلادي)",
"digital": "رقمي مع الثواني",
"digital-no-seconds": "رقمي بدون ثواني",
"analog": "ساعة عقاربية",
"minimal": "مبسّط (الوقت فقط)"
}
}
},
"services": {
"title": "الخدمات",
"available": "متاح",
"unavailable": "غير متاح",
"price": "السعر",
"noServices": "لا توجد خدمات متاحة",
"category": "التصنيف",
"free": "مجاني",
"order": "اطلب",
"orderModalTitle": "اطلب: {{name}}",
"orderNotes": "ملاحظات (اختياري)",
"orderNotesPlaceholder": "أي ملاحظات إضافية؟",
"orderNotesCounter": "{{count}}/500",
"placeOrder": "إرسال",
"placing": "جارٍ الإرسال...",
"orderPlaced": "تم إرسال طلبك",
"orderFailed": "تعذّر إرسال الطلب",
"myOrdersLink": "طلباتي"
},
"myOrders": {
"title": "طلباتي",
"loadError": "تعذّر تحميل الطلبات. حاول مرة أخرى.",
"retry": "إعادة المحاولة",
"back": "رجوع",
"empty": "لا توجد طلبات بعد",
"emptyHint": "ابدأ من كتالوج الخدمات.",
"browseServices": "تصفّح الخدمات",
"notesLabel": "ملاحظات:",
"cancel": "إلغاء الطلب",
"cancelConfirmTitle": "إلغاء هذا الطلب؟",
"cancelConfirmBody": "ستتاح لك ثوانٍ قليلة للتراجع.",
"cancelConfirm": "نعم، إلغاء",
"keep": "احتفظ به",
"cancelled": "تم إلغاء الطلب",
"cancelFailed": "تعذّر إلغاء الطلب",
"restoreFailed": "تعذّر استعادة الطلب",
"delete": "حذف",
"reorder": "اطلب مجددًا",
"deleteConfirmTitle": "حذف هذا الطلب؟",
"deleteConfirmBody": "سيتم حذف الطلب نهائياً من سجلّك.",
"deleteConfirm": "نعم، احذف",
"deleted": "تم حذف الطلب",
"deleteFailed": "تعذّر حذف الطلب",
"undo": "تراجع",
"undone": "تمت الاستعادة",
"clearFinished_one": "مسح طلب منتهٍ",
"clearFinished_other": "مسح {{count}} طلبات منتهية",
"clearConfirmTitle": "مسح الطلبات المنتهية؟",
"clearConfirmBody_one": "سيتم حذف طلب واحد منتهٍ نهائياً من سجلّك.",
"clearConfirmBody_other": "سيتم حذف {{count}} طلبات منتهية نهائياً من سجلّك.",
"clearConfirm": "نعم، امسح",
"clearedCount_one": "تم حذف طلب واحد",
"clearedCount_other": "تم حذف {{count}} طلبات",
"clearedPartial": "تم حذف {{ok}} وفشل {{fail}}"
},
"orderStatus": {
"pending": "بانتظار المستلِم",
"received": "تم الاستلام",
"preparing": "قيد التحضير",
"completed": "مكتمل",
"cancelled": "ملغى"
},
"incomingOrders": {
"title": "الطلبات الواردة",
"linkLabel": "الطلبات الواردة",
"subtitleUnclaimed": "طلبات بانتظار الاستلام",
"subtitleMine": "طلباتي الجارية",
"empty": "ما في طلبات حالياً",
"emptyHint": "ستظهر هنا الطلبات الجديدة فور وصولها.",
"loadError": "تعذّر تحميل الطلبات الواردة.",
"retry": "إعادة المحاولة",
"noAccess": "ليس لديك صلاحية لاستلام الطلبات.",
"back": "رجوع",
"ageJustNow": "الآن",
"ageMinutes": "منذ {{count}} د",
"ageHours": "منذ {{count}} س",
"ageDays": "منذ {{count}} يوم",
"from": "من",
"confirmReceipt": "استلام الطلب",
"confirming": "جارٍ التأكيد...",
"markPreparing": "بدء التحضير",
"markCompleted": "إنجاز",
"cancel": "إلغاء",
"alreadyClaimed": "استلمه شخص آخر قبلك",
"orderUnavailable": "هذا الطلب لم يعد متاحاً",
"actionFailed": "تعذّر تنفيذ الإجراء",
"claimed": "تم استلام الطلب",
"marked": "تم تحديث الحالة",
"cancelled": "تم إلغاء الطلب",
"undo": "تراجع",
"undone": "تمت الاستعادة",
"restoreFailed": "تعذّر استعادة الطلب"
},
"chat": {
"title": "المحادثات",
"newMessage": "رسالة جديدة",
"typeMessage": "اكتب رسالتك...",
"send": "إرسال",
"noConversations": "لا توجد محادثات",
"createConversation": "محادثة جديدة",
"groupChat": "مجموعة",
"directMessage": "محادثة خاصة",
"participants": "المشاركون",
"searchUsers": "البحث عن مستخدمين",
"modeDirect": "محادثة خاصة",
"modeGroup": "مجموعة",
"groupNameAr": "اسم المجموعة (عربي)",
"groupNameEn": "اسم المجموعة (إنجليزي)",
"groupNamePlaceholderAr": "مثلاً: فريق المبيعات",
"groupNamePlaceholderEn": "e.g. Sales team",
"searchUsersPlaceholder": "ابحث بالاسم أو اسم المستخدم",
"participantsCount_one": "{{count}} شخص مختار",
"participantsCount_other": "{{count}} أشخاص مختارين",
"participantsCount_zero": "لم يتم اختيار أحد",
"noUsersFound": "لا يوجد مستخدمون مطابقون",
"uploadAvatar": "رفع صورة",
"replaceAvatar": "استبدال الصورة",
"removeAvatar": "إزالة الصورة",
"changeAvatar": "تغيير صورة المجموعة",
"uploadingAvatar": "جارٍ الرفع… {{progress}}٪",
"avatarUploadFailed": "تعذّر رفع الصورة",
"validation": {
"needGroupName": "أدخل اسم المجموعة بالعربية أو الإنجليزية.",
"minTwoMembers": "اختر شخصين على الأقل لإنشاء مجموعة.",
"pickOnePerson": "اختر شخصاً واحداً للمحادثة."
},
"create": "إنشاء",
"settings": {
"title": "إعدادات المجموعة",
"openSettings": "فتح إعدادات المجموعة",
"groupName": "اسم المجموعة",
"saveName": "حفظ الاسم",
"nameSaved": "تم تحديث اسم المجموعة",
"saveFailed": "تعذّر حفظ التغييرات",
"needGroupName": "أدخل اسم المجموعة بالعربية أو الإنجليزية.",
"members_one": "عضو واحد",
"members_two": "عضوان",
"members_few": "{{count}} أعضاء",
"members_many": "{{count}} عضواً",
"members_other": "{{count}} عضو",
"addMembers": "إضافة أعضاء",
"addSelected": "إضافة",
"membersAdded": "تمت إضافة الأعضاء",
"addFailed": "تعذّرت إضافة الأعضاء",
"removeMember": "إزالة العضو",
"removeFailed": "تعذّرت إزالة العضو",
"admin": "مشرف",
"you": "(أنت)",
"viewOnly": "فقط مشرف المجموعة يستطيع تغيير الاسم أو الأعضاء."
},
"filterAll": "نشطة",
"filterArchived": "المؤرشفة",
"noArchived": "لا توجد محادثات مؤرشفة",
"actions": {
"title": "خيارات المحادثة",
"openActions": "فتح خيارات المحادثة",
"mute": "كتم الإشعارات",
"unmute": "إلغاء كتم الإشعارات",
"archive": "أرشفة المحادثة",
"unarchive": "إلغاء الأرشفة",
"leave": "مغادرة المجموعة",
"leaveConfirmTitle": "مغادرة هذه المجموعة؟",
"leaveConfirmBody": "ستتم إزالتك من \"{{name}}\" ولن تتلقى رسائلها بعد الآن.",
"successorTitle": "اختر المشرف التالي",
"successorHelp": "أنت المشرف الوحيد. اختر من يتولى الإدارة، أو دعنا نرقّي أقدم عضو في المجموعة.",
"successorAuto": "تلقائي (أقدم عضو)",
"muted": "تم كتم الإشعارات",
"unmuted": "الإشعارات مفعّلة",
"archived": "تمت أرشفة المحادثة",
"unarchived": "أعيدت المحادثة إلى النشطة",
"left": "غادرت المجموعة",
"actionFailed": "تعذّر تنفيذ الإجراء",
"mutedLabel": "مكتومة",
"youAreAdminTitle": "أنت الآن المشرف",
"youAreAdminDescription": "أصبحت مسؤولًا عن \"{{name}}\".",
"newAdminBadge": "مشرف جديد",
"newAdminLabel": "مشرف جديد: {{name}}"
},
"system": {
"someone": "شخص ما",
"listSeparator": "، ",
"groupRenamed": "غيّر {{actor}} اسم المجموعة إلى \"{{name}}\"",
"membersAdded_one": "أضاف {{actor}} {{names}}",
"membersAdded_other": "أضاف {{actor}} {{names}}",
"memberRemoved": "أزال {{actor}} {{target}}",
"memberLeft": "غادر {{actor}} المجموعة",
"adminPromoted": "{{target}} أصبح مشرفًا للمجموعة",
"adminPromotedAfterLeave": "تمت ترقية {{target}} إلى مشرف بعد مغادرة المشرف السابق"
}
},
"notifications": {
"title": "الإشعارات",
"markAllRead": "تحديد الكل كمقروء",
"noNotifications": "لا توجد إشعارات جديدة",
"unread": "غير مقروء"
},
"admin": {
"title": "لوحة التحكم",
"manageApps": "إدارة التطبيقات",
"manageServices": "إدارة الخدمات",
"manageUsers": "إدارة المستخدمين",
"appDisabled": "معطّل",
"addApp": "إضافة تطبيق",
"addService": "إضافة خدمة",
"addUser": "إضافة مستخدم",
"editApp": "تعديل التطبيق",
"editService": "تعديل الخدمة",
"editUser": "تعديل المستخدم",
"deleteConfirm": "هل أنت متأكد من الحذف؟",
"deleteApp": {
"title": "حذف التطبيق \"{{name}}\"؟",
"warning": "هذا التطبيق لا يزال قيد الاستخدام. حذفه سيؤثر على ما يلي:",
"forceHint": "سيؤدي ذلك إلى إلغاء وصول كل من يستخدمه وإزالة سجلّه. لا يمكن التراجع عن هذا الإجراء.",
"emptyBody": "هل أنت متأكد من حذف هذا التطبيق؟",
"groupCount": "{{count}} مجموعة تمنح هذا التطبيق حالياً",
"restrictionCount": "{{count}} قاعدة صلاحيات تقيّده",
"openCount": "{{count}} مرة فتح في السجل",
"confirm": "حذف",
"anyway": "حذف رغم ذلك"
},
"deleteService": {
"title": "حذف الخدمة \"{{name}}\"؟",
"warning": "هذه الخدمة لا تزال مرتبطة بطلبات. حذفها سيؤثر على ما يلي:",
"forceHint": "سيؤدي ذلك إلى حذف كل الطلبات المرتبطة نهائياً. لا يمكن التراجع عن هذا الإجراء.",
"emptyBody": "هل أنت متأكد من حذف هذه الخدمة؟",
"orderCount": "{{count}} طلب",
"confirm": "حذف",
"anyway": "حذف رغم ذلك"
},
"deleteUser": {
"title": "حذف المستخدم \"{{name}}\"؟",
"warning": "هذا المستخدم لديه بيانات. حذفه سيؤثر على ما يلي:",
"forceHint": "سيؤدي ذلك إلى حذف ملاحظاته وطلباته والمحادثات التي أنشأها والرسائل التي أرسلها بشكل نهائي. لا يمكن التراجع عن هذا الإجراء.",
"emptyBody": "هل أنت متأكد من حذف هذا المستخدم؟",
"noteCount": "{{count}} ملاحظة",
"orderCount": "{{count}} طلب",
"conversationCount": "{{count}} محادثة أنشأها",
"messageCount": "{{count}} رسالة أرسلها",
"confirm": "حذف",
"anyway": "حذف رغم ذلك"
},
"activate": "تفعيل",
"deactivate": "تعطيل",
"appName": "اسم التطبيق",
"appNameAr": "اسم التطبيق (عربي)",
"appNameEn": "اسم التطبيق (إنجليزي)",
"appSlug": "المعرف",
"appRoute": "المسار",
"appIcon": "الأيقونة",
"appColor": "اللون",
"appSortOrder": "الترتيب",
"serviceName": "اسم الخدمة",
"serviceNameAr": "اسم الخدمة (عربي)",
"serviceNameEn": "اسم الخدمة (إنجليزي)",
"serviceDescriptionAr": "الوصف (عربي)",
"serviceDescriptionEn": "الوصف (إنجليزي)",
"servicePrice": "السعر",
"serviceAvailable": "متاح؟",
"serviceImageUrl": "رابط الصورة",
"serviceImage": "صورة الخدمة",
"uploadImage": "رفع صورة",
"replaceImage": "استبدال الصورة",
"uploading": "جاري الرفع...",
"uploadFailed": "فشل رفع الصورة",
"users": "المستخدمين",
"username": "اسم المستخدم",
"email": "البريد الإلكتروني",
"password": "كلمة المرور",
"roles": "الصلاحيات",
"active": "نشط",
"issueResetLink": "إصدار رابط إعادة تعيين كلمة المرور",
"orderReceiverRole": "مستلم الطلبات",
"resetLinkModal": {
"title": "رابط إعادة تعيين كلمة المرور للمستخدم {{username}}",
"description": "شارك هذا الرابط لمرة واحدة مع المستخدم. يمكن استخدامه مرة واحدة فقط.",
"expires": "تنتهي الصلاحية: {{time}}",
"copy": "نسخ الرابط",
"copied": "تم نسخ الرابط"
},
"siteSettings": "إعدادات الموقع",
"siteNameAr": "اسم الموقع (عربي)",
"siteNameEn": "اسم الموقع (إنجليزي)",
"registrationOpen": "السماح بإنشاء حسابات",
"registrationOpenHint": "عند الإيقاف، الأدمن فقط يقدر ينشئ مستخدمين جدد.",
"footerTextAr": "نص التذييل (عربي)",
"footerTextEn": "نص التذييل (إنجليزي)",
"nav": {
"dashboard": "الرئيسية",
"apps": "التطبيقات",
"services": "الخدمات",
"users": "المستخدمين",
"groups": "المجموعات",
"roles": "الأدوار",
"auditLog": "سجل التدقيق",
"userManagement": "إدارة المستخدمين",
"settings": "الإعدادات",
"menu": "القائمة"
},
"users": {
"searchPlaceholder": "ابحث باسم المستخدم أو البريد...",
"allGroups": "كل المجموعات",
"allStatuses": "كل الحالات",
"statusActive": "نشط",
"statusInactive": "موقوف",
"showing": "عرض {{count}} من أصل {{total}}",
"empty": "لا يوجد مستخدمون يطابقون الفلاتر.",
"editGroups": "تعديل المجموعات",
"editUserGroups": "تعديل مجموعات {{username}}",
"col": {
"username": "اسم المستخدم",
"email": "البريد",
"displayNameAr": "الاسم (عربي)",
"displayNameEn": "الاسم (إنجليزي)",
"language": "اللغة",
"createdAt": "تاريخ الإنشاء",
"groups": "المجموعات",
"actions": "إجراءات"
}
},
"roles": {
"searchPlaceholder": "ابحث في الأدوار...",
"addRole": "إضافة دور",
"editRole": "تعديل الدور",
"name": "الاسم",
"namePlaceholder": "مثال: content_editor",
"nameHint": "حروف وأرقام وشرطات سفلية فقط.",
"descriptionAr": "الوصف (عربي)",
"descriptionEn": "الوصف (إنجليزي)",
"system": "نظامي",
"empty": "لا توجد أدوار بعد.",
"edit": "تعديل الدور",
"delete": "حذف الدور",
"editSystemNameHint": "لا يمكن تغيير اسم الأدوار النظامية.",
"deleteTitle": "حذف الدور \"{{name}}\"؟",
"deleteEmptyBody": "هذا الدور غير مُعيَّن لأي مستخدم. هل تريد المتابعة؟",
"deleteConflict": "هذا الدور قيد الاستخدام ولا يمكن حذفه.",
"deleteConflictHint": "أزل هذا الدور من المستخدمين والمجموعات قبل حذفه.",
"deleteConfirm": "حذف",
"usersCount": "{{count}} مستخدم",
"groupsCount": "{{count}} مجموعة",
"errorNameTaken": "يوجد دور بنفس الاسم.",
"errorInvalidName": "يجب أن يبدأ اسم الدور بحرف ويحتوي على حروف وأرقام وشرطات سفلية فقط.",
"errorSystemRename": "لا يمكن تغيير اسم الأدوار النظامية.",
"permissions": "الصلاحيات",
"permissionsHint": "اختر الصلاحيات التي يمنحها هذا الدور.",
"permissionsSystemHint": "صلاحيات الأدوار النظامية للقراءة فقط.",
"permissionsEmpty": "لا توجد صلاحيات معرّفة.",
"errorSystemPermissions": "لا يمكن تغيير صلاحيات الأدوار النظامية.",
"errorPermissionsSave": "تعذّر حفظ صلاحيات الدور."
},
"groups": {
"searchPlaceholder": "ابحث في المجموعات...",
"addGroup": "إضافة مجموعة",
"editGroup": "تعديل المجموعة",
"name": "الاسم",
"descriptionAr": "الوصف (عربي)",
"descriptionEn": "الوصف (إنجليزي)",
"system": "نظامية",
"empty": "لا توجد مجموعات بعد.",
"members": "{{count}} عضو",
"appsCount": "{{count}} تطبيق",
"rolesCount": "{{count}} دور",
"appsHint": "أعضاء هذه المجموعة سيرون هذه التطبيقات.",
"usersHint": "أعضاء هذه المجموعة.",
"rolesHint": "يحصل أعضاء هذه المجموعة تلقائياً على هذه الأدوار.",
"rolesEmpty": "لا توجد أدوار متاحة.",
"deleteTitle": "حذف المجموعة \"{{name}}\"؟",
"deleteWarning": "هذه المجموعة لا تزال قيد الاستخدام. حذفها سيلغي الوصول لما يلي:",
"deleteForceHint": "سيؤدي الحذف إلى فصل الأعضاء وإلغاء التطبيقات والأدوار الممنوحة عبر المجموعة. لا يمكن التراجع عن هذا الإجراء.",
"deleteEmptyBody": "لا تحتوي هذه المجموعة على أعضاء أو تطبيقات أو أدوار. هل تريد المتابعة؟",
"deleteConfirm": "حذف",
"deleteAnyway": "حذف رغم ذلك",
"tab": {
"info": "المعلومات",
"apps": "التطبيقات",
"users": "المستخدمون",
"roles": "الأدوار"
}
},
"audit": {
"filters": {
"action": "الإجراء",
"allActions": "كل الإجراءات",
"from": "من",
"to": "إلى",
"apply": "تطبيق",
"reset": "إعادة ضبط"
},
"target": "الهدف: {{type}} #{{id}}",
"showing": "عرض {{shown}} من أصل {{total}}",
"empty": "لا توجد إدخالات في سجل التدقيق تطابق الفلاتر.",
"loadMore": "عرض المزيد",
"errors": {
"invalidDate": "يجب أن تكون التواريخ بصيغة YYYY-MM-DD.",
"invertedDates": "تاريخ \"من\" يجب أن يكون قبل أو يساوي تاريخ \"إلى\".",
"fixFiltersFirst": "عدّل الفلاتر لتحميل الإدخالات."
}
},
"dashboardSoon": "إحصائيات اللوحة قريباً.",
"dashboard": {
"totalApps": "إجمالي التطبيقات",
"totalServices": "إجمالي الخدمات",
"totalUsers": "إجمالي المستخدمين",
"registration": "التسجيل",
"open": "مفتوح",
"closed": "مغلق",
"recentActivity": "آخر النشاطات",
"latestUser": "آخر مستخدم",
"latestApp": "آخر تطبيق",
"none": "—",
"newUsers7d": "مستخدمون جدد (٧ أيام)",
"vsPrev7d": "الأسبوع السابق: {{count}}",
"newUsersInRange": "مستخدمون جدد · {{range}}",
"vsPrevRange": "{{range}}: {{count}}",
"activeServices": "الخدمات النشطة",
"inactiveServices": "غير نشطة: {{count}}",
"signupsTrend": "التسجيلات",
"last7Days": "آخر ٧ أيام",
"appOpensTrend": "فتح التطبيقات",
"appOpensSummary": "{{count}} إجمالاً · {{delta}}",
"appOpensSummaryRanged": "{{count}} في {{range}} · {{delta}}",
"servicesCreatedTrend": "خدمات جديدة",
"servicesCreatedSummary": "{{count}} مضافة",
"servicesCreatedSummaryRanged": "{{count}} في {{range}}",
"trends": "الاتجاهات",
"rangeSelector": "المدى الزمني",
"range": {
"7d": "آخر ٧ أيام",
"30d": "آخر ٣٠ يومًا",
"90d": "آخر ٩٠ يومًا",
"custom": "مدى مخصص",
"customLabel": "{{from}} {{to}}"
},
"prevRange": {
"7d": "الأيام ٧ السابقة",
"30d": "الأيام ٣٠ السابقة",
"90d": "الأيام ٩٠ السابقة",
"custom": "الـ {{count}} أيام السابقة"
},
"customRange": {
"from": "من",
"to": "إلى",
"apply": "تطبيق",
"invalid": "اختر نطاقًا صحيحًا",
"loadError": "تعذّر تحميل الإحصائيات للنطاق المحدّد. يرجى التحقق من التواريخ والمحاولة مرة أخرى."
},
"topApps": "أكثر التطبيقات استخدامًا",
"topAppsSubtitle": "حسب الفتح في {{range}}",
"mostActiveUsers": "أكثر المستخدمين نشاطًا",
"mostActiveUsersSubtitle": "حسب فتح التطبيقات في {{range}}",
"leaderboardEmpty": "لا يوجد نشاط بعد",
"openCount": "{{count}} فتحة",
"viewAppDetails": "عرض تفاصيل {{name}}",
"viewUserDetails": "عرض تفاصيل {{name}}",
"drillIn": {
"loading": "جارٍ التحميل…",
"appTitle": "آخر الفتحات · {{name}}",
"userTitle": "آخر الفتحات · {{name}}",
"subtitle": "{{count}} فتحة في {{range}}",
"empty": "لا توجد فتحات في هذا النطاق",
"loadError": "تعذّر تحميل آخر الفتحات.",
"editApp": "تعديل التطبيق",
"viewUser": "عرض المستخدم",
"loadMore": "تحميل المزيد",
"loadMoreError": "تعذّر تحميل المزيد من الفتحات.",
"shownOf": "عرض {{shown}} من {{total}}"
}
}
},
"notFound": {
"title": "404 — الصفحة غير موجودة",
"description": "الصفحة التي تبحث عنها غير موجودة."
},
"common": {
"save": "حفظ",
"cancel": "إلغاء",
"delete": "حذف",
"edit": "تعديل",
"add": "إضافة",
"close": "إغلاق",
"loading": "جاري التحميل...",
"error": "حدث خطأ",
"success": "تمت العملية بنجاح",
"language": "English",
"appName": "نظام Tx"
},
"notes": {
"title": "الملاحظات",
"searchPlaceholder": "ابحث في الملاحظات",
"labels": "التصنيفات",
"manageLabels": "إدارة التصنيفات",
"newLabel": "تصنيف جديد",
"noLabelsYet": "لا توجد تصنيفات بعد",
"allLabels": "الكل",
"tabs": { "active": "ملاحظات", "archived": "الأرشيف" },
"pinned": "مثبّتة",
"others": "أخرى",
"empty": "ستظهر ملاحظاتك هنا",
"emptyArchived": "لا توجد ملاحظات في الأرشيف",
"takeNote": "اكتب ملاحظة...",
"titlePlaceholder": "العنوان",
"contentPlaceholder": "اكتب ملاحظة...",
"save": "حفظ",
"pin": "تثبيت",
"archive": "أرشفة",
"unarchive": "إلغاء الأرشفة",
"delete": "حذف",
"deleteConfirm": "حذف هذه الملاحظة؟",
"deleteLabelConfirm": "حذف هذا التصنيف؟",
"editTitle": "تعديل ملاحظة"
},
"executiveMeetings": {
"titleAr": "إدارة الاجتماعات التنفيذية",
"titleEn": "Executive Meetings Management",
"scheduleHeading": "قائمة بأسماء حضور الاجتماعات",
"date": "التاريخ:",
"exportPdf": "تصدير PDF",
"fontSettings": "إعدادات الخط",
"noMeetings": "لا توجد اجتماعات في هذا اليوم",
"virtual": "اتصال مرئي",
"virtualAttendance": "الحضور عبر الاتصال المرئي",
"internalAttendance": "الحضور الداخلي",
"externalAttendance": "حضور خارجي",
"placeholderBody": "هذا القسم قيد التطوير في المراحل القادمة. ستتوفر إدارته الكاملة قريباً.",
"col": {
"number": "#",
"meeting": "الاجتماع",
"attendees": "الحضور",
"time": "الوقت"
},
"nav": {
"schedule": "جدول الاجتماعات اليومي",
"manage": "إدارة الاجتماعات",
"requests": "طلبات التعديل",
"approvals": "موافقات مدير المكتب",
"tasks": "مهام فريق التنسيق",
"notifications": "التنبيهات",
"audit": "سجل التعديلات",
"pdf": "تصدير PDF",
"fontSettings": "إعدادات الخط"
},
"common": {
"save": "حفظ",
"cancel": "إلغاء",
"delete": "حذف",
"edit": "تعديل",
"add": "إضافة",
"submit": "إرسال",
"close": "إغلاق",
"loading": "جارٍ التحميل...",
"saved": "تم الحفظ",
"saveFailed": "تعذر الحفظ",
"actions": "إجراءات",
"noPermission": "ليست لديك صلاحية لتنفيذ هذا الإجراء",
"yes": "نعم",
"no": "لا",
"all": "الكل",
"filter": "تصفية"
},
"manage": {
"heading": "إدارة الاجتماعات",
"addMeeting": "إضافة اجتماع",
"editMeeting": "تعديل الاجتماع",
"deleteMeeting": "حذف الاجتماع",
"deleteConfirm": "حذف هذا الاجتماع نهائياً؟",
"noMeetings": "لا توجد اجتماعات لهذا اليوم. اضغط \"إضافة اجتماع\" لإنشاء واحد.",
"field": {
"titleAr": "العنوان (عربي)",
"titleEn": "العنوان (إنجليزي)",
"meetingDate": "التاريخ",
"dailyNumber": "الرقم اليومي",
"dailyNumberHint": "اتركه فارغاً ليتم الترقيم تلقائياً",
"startTime": "وقت البدء",
"endTime": "وقت الانتهاء",
"location": "المكان",
"meetingUrl": "رابط الاجتماع",
"platform": "المنصة",
"status": "الحالة",
"isHighlighted": "تمييز (لون أحمر)",
"notes": "ملاحظات"
},
"attendees": {
"label": "قائمة الحضور",
"name": "الاسم",
"type": "نوع الحضور",
"add": "إضافة حاضر",
"remove": "إزالة"
},
"platform": {
"none": "بدون",
"webex": "Webex",
"teams": "Teams",
"zoom": "Zoom",
"other": "أخرى"
},
"attendanceType": {
"internal": "داخلي",
"virtual": "افتراضي",
"external": "خارجي"
},
"status": {
"scheduled": "مجدول",
"cancelled": "ملغى",
"completed": "منتهٍ",
"postponed": "مؤجل"
},
"errors": {
"titleRequired": "العنوان بالعربية مطلوب",
"dateRequired": "التاريخ مطلوب",
"duplicateNumber": "هذا الرقم اليومي مستخدم بالفعل في هذا التاريخ",
"saveFailed": "تعذر حفظ الاجتماع"
}
},
"requests": {
"heading": "طلبات التعديل",
"newRequest": "طلب جديد",
"myRequests": "طلباتي",
"allRequests": "جميع الطلبات",
"empty": "لا توجد طلبات.",
"filterStatus": "تصفية حسب الحالة",
"submitFor": "اقتراح تعديل على:",
"noTargetMeeting": "اقتراح اجتماع جديد (بدون ربط)",
"details": "التفاصيل",
"detailsPlaceholder": "اشرح ما تقترح بالتفصيل...",
"submitted": "تم إرسال الطلب",
"submitFailed": "تعذر إرسال الطلب",
"requestedBy": "مقدم الطلب",
"requestedAt": "وقت الطلب",
"type": {
"create": "إنشاء اجتماع",
"edit": "تعديل بيانات",
"delete": "حذف",
"reschedule": "إعادة جدولة",
"highlight": "تمييز",
"unhighlight": "إزالة التمييز",
"other": "آخر"
},
"status": {
"new": "جديد",
"approved": "تمت الموافقة",
"rejected": "مرفوض",
"withdrawn": "مسحوب"
}
},
"approvals": {
"heading": "موافقات مدير المكتب",
"empty": "لا توجد طلبات بانتظار المراجعة.",
"approve": "اعتماد",
"reject": "رفض",
"reviewNotes": "ملاحظات المراجعة",
"reviewNotesPlaceholder": "اكتب ملاحظاتك هنا (اختياري)",
"approved": "تم الاعتماد",
"rejected": "تم الرفض",
"actionFailed": "تعذر تنفيذ المراجعة"
},
"tasks": {
"heading": "مهام فريق التنسيق",
"addTask": "إضافة مهمة",
"empty": "لا توجد مهام.",
"field": {
"taskType": "نوع المهمة",
"assignee": "المُكلَّف",
"dueDate": "تاريخ الاستحقاق",
"notes": "ملاحظات",
"meeting": "الاجتماع",
"status": "الحالة"
},
"status": {
"pending": "بالانتظار",
"in_progress": "قيد التنفيذ",
"completed": "منجزة",
"cancelled": "ملغاة"
},
"markCompleted": "إنهاء المهمة",
"markInProgress": "بدء التنفيذ",
"deleteConfirm": "حذف هذه المهمة؟",
"saved": "تم حفظ المهمة",
"deleted": "تم حذف المهمة"
},
"audit": {
"heading": "سجل التعديلات",
"empty": "لا توجد قيود في السجل.",
"filterDate": "تصفية بالتاريخ",
"filterEntity": "النوع",
"all": "الكل",
"col": {
"when": "الوقت",
"actor": "المنفّذ",
"action": "الإجراء",
"entity": "النوع",
"entityId": "المعرف",
"diff": "التفاصيل"
},
"entity": {
"meeting": "اجتماع",
"attendee": "حاضر",
"request": "طلب",
"task": "مهمة",
"font_settings": "إعدادات الخط"
},
"action": {
"create": "إنشاء",
"update": "تعديل",
"delete": "حذف",
"approve": "اعتماد",
"reject": "رفض",
"submit": "إرسال"
}
},
"pdf": {
"heading": "تصدير / طباعة",
"intro": "تستخدم هذه الواجهة طابعة المتصفح لإنتاج نسخة PDF من جدول اليوم. اختر التاريخ ثم اضغط طباعة.",
"print": "طباعة الجدول",
"openSchedule": "عرض الجدول",
"selectDate": "تاريخ الجدول"
},
"fontSettingsPage": {
"heading": "إعدادات الخط",
"intro": "تطبق هذه الإعدادات على جدول الاجتماعات. يمكنك حفظ تفضيلك الشخصي، ويمكن للمسؤول حفظ الإعدادات العامة لجميع المستخدمين.",
"scope": "النطاق",
"scopeUser": "تفضيلي الشخصي",
"scopeGlobal": "عام (جميع المستخدمين)",
"fontFamily": "نوع الخط",
"fontSize": "حجم الخط",
"fontWeight": "السماكة",
"alignment": "المحاذاة",
"weight": {
"regular": "عادي",
"medium": "متوسط",
"semibold": "نصف عريض",
"bold": "عريض"
},
"align": {
"start": "بداية",
"center": "وسط",
"end": "نهاية"
},
"preview": "معاينة",
"previewText": "نص تجريبي ١٢٣ Sample 123",
"save": "حفظ الإعدادات",
"saved": "تم الحفظ",
"reset": "إعادة الافتراضي"
},
"notificationsPage": {
"heading": "التنبيهات",
"intro": "هذه قائمة التنبيهات المجدولة المرتبطة باجتماعات المكتب. لا يتم الإرسال الفعلي حالياً (وضع تجريبي).",
"empty": "لا توجد تنبيهات مجدولة.",
"col": {
"meeting": "الاجتماع",
"user": "المستخدم",
"type": "النوع",
"scheduledAt": "الموعد",
"status": "الحالة"
},
"type": {
"reminder": "تذكير",
"change": "تنبيه تعديل",
"cancel": "تنبيه إلغاء"
},
"status": {
"pending": "بالانتظار",
"sent": "أُرسل",
"skipped": "متخطى",
"failed": "فشل"
}
}
}
}