Marketing Hub: RBAC, i18n (AR/EN), tasks overhaul, team/user merge, tutorial

Features:
- Full RBAC with 3 roles (superadmin/manager/contributor)
- Ownership tracking on posts, tasks, campaigns, projects
- Task system: assign to anyone, filter combobox, visibility scoping
- Team members merged into users table (single source of truth)
- Post thumbnails on kanban cards from attachments
- Publication link validation before publishing
- Interactive onboarding tutorial with Settings restart
- Full Arabic/English i18n with RTL layout support
- Language toggle in sidebar, IBM Plex Sans Arabic font
- Brand-based visibility filtering for non-superadmins
- Manager can only create contributors
- Profile completion flow for new users
- Cookie-based sessions (express-session + SQLite)
This commit is contained in:
fahed
2026-02-08 20:46:58 +03:00
commit 35d84b6bff
2240 changed files with 846749 additions and 0 deletions

239
client/src/i18n/ar.json Normal file
View File

@@ -0,0 +1,239 @@
{
"app.name": "سمايا",
"app.subtitle": "مركز التسويق",
"nav.dashboard": "لوحة التحكم",
"nav.campaigns": "الحملات",
"nav.finance": "المالية والعائد",
"nav.posts": "إنتاج المحتوى",
"nav.assets": "الأصول",
"nav.projects": "المشاريع",
"nav.tasks": "المهام",
"nav.team": "الفريق",
"nav.settings": "الإعدادات",
"nav.users": "المستخدمين",
"nav.logout": "تسجيل الخروج",
"nav.collapse": "طي",
"common.save": "حفظ",
"common.cancel": "إلغاء",
"common.delete": "حذف",
"common.edit": "تعديل",
"common.create": "إنشاء",
"common.search": "بحث...",
"common.filter": "تصفية",
"common.all": "الكل",
"common.noResults": "لا توجد نتائج",
"common.loading": "جاري التحميل...",
"common.unassigned": "غير مُسند",
"common.required": "مطلوب",
"auth.login": "تسجيل الدخول",
"auth.email": "البريد الإلكتروني",
"auth.password": "كلمة المرور",
"auth.loginBtn": "دخول",
"auth.signingIn": "جاري تسجيل الدخول...",
"dashboard.title": "لوحة التحكم",
"dashboard.welcomeBack": "مرحباً بعودتك",
"dashboard.happeningToday": "إليك ما يحدث مع تسويقك اليوم.",
"dashboard.totalPosts": "إجمالي المنشورات",
"dashboard.published": "منشور",
"dashboard.activeCampaigns": "الحملات النشطة",
"dashboard.total": "إجمالي",
"dashboard.budgetSpent": "الميزانية المنفقة",
"dashboard.of": "من",
"dashboard.noBudget": "لا توجد ميزانية بعد",
"dashboard.overdueTasks": "مهام متأخرة",
"dashboard.needsAttention": "يحتاج اهتماماً",
"dashboard.allOnTrack": "كل شيء على المسار الصحيح",
"dashboard.budgetOverview": "نظرة عامة على الميزانية",
"dashboard.details": "التفاصيل",
"dashboard.noBudgetRecorded": "لم يتم تسجيل ميزانية بعد.",
"dashboard.addBudget": "إضافة ميزانية",
"dashboard.spent": "مُنفق",
"dashboard.received": "مُستلم",
"dashboard.remaining": "المتبقي",
"dashboard.revenue": "الإيرادات",
"dashboard.roi": "العائد على الاستثمار",
"dashboard.recentPosts": "المنشورات الأخيرة",
"dashboard.viewAll": "عرض الكل",
"dashboard.sar": "ريال",
"dashboard.noPostsYet": "لا توجد منشورات بعد. أنشئ منشورك الأول!",
"dashboard.upcomingDeadlines": "المواعيد النهائية القادمة",
"dashboard.noUpcomingDeadlines": "لا توجد مواعيد نهائية هذا الأسبوع. 🎉",
"dashboard.loadingHub": "جاري تحميل مركز سمايا للتسويق...",
"posts.title": "إنتاج المحتوى",
"posts.newPost": "منشور جديد",
"posts.editPost": "تعديل المنشور",
"posts.createPost": "إنشاء منشور",
"posts.saveChanges": "حفظ التغييرات",
"posts.postTitle": "العنوان",
"posts.description": "الوصف",
"posts.brand": "العلامة التجارية",
"posts.platforms": "المنصات",
"posts.status": "الحالة",
"posts.assignTo": "إسناد إلى",
"posts.scheduledDate": "تاريخ النشر المجدول",
"posts.notes": "ملاحظات",
"posts.campaign": "الحملة",
"posts.noCampaign": "بدون حملة",
"posts.publicationLinks": "روابط النشر",
"posts.attachments": "المرفقات",
"posts.uploadFiles": "انقر أو اسحب الملفات للرفع",
"posts.dropFiles": "أسقط الملفات هنا",
"posts.maxSize": "الحد الأقصى 50 ميجابايت للملف",
"posts.allBrands": "جميع العلامات",
"posts.allPlatforms": "جميع المنصات",
"posts.allPeople": "جميع الأشخاص",
"posts.searchPosts": "بحث في المنشورات...",
"posts.deletePost": "حذف المنشور؟",
"posts.deleteConfirm": "هل أنت متأكد من حذف هذا المنشور؟ لا يمكن التراجع.",
"posts.publishMissing": "لا يمكن النشر: روابط النشر مفقودة لـ:",
"posts.publishRequired": "جميع روابط النشر مطلوبة للنشر",
"posts.noPostsFound": "لم يتم العثور على منشورات",
"posts.selectBrand": "اختر العلامة التجارية",
"posts.additionalNotes": "ملاحظات إضافية",
"posts.uploading": "جاري الرفع...",
"posts.deleteAttachment": "حذف المرفق",
"posts.whatNeedsDone": "ما الذي يجب القيام به؟",
"posts.optionalDetails": "تفاصيل اختيارية...",
"posts.postTitlePlaceholder": "عنوان المنشور",
"posts.postDescPlaceholder": "وصف المنشور...",
"posts.dropHere": "أسقط هنا",
"posts.noPosts": "لا توجد منشورات",
"posts.sendToReview": "إرسال للمراجعة",
"posts.approve": "اعتماد",
"posts.schedule": "جدولة",
"posts.publish": "نشر",
"posts.status.draft": "مسودة",
"posts.status.in_review": "قيد المراجعة",
"posts.status.approved": "مُعتمد",
"posts.status.scheduled": "مجدول",
"posts.status.published": "منشور",
"tasks.title": "المهام",
"tasks.newTask": "مهمة جديدة",
"tasks.editTask": "تعديل المهمة",
"tasks.createTask": "إنشاء مهمة",
"tasks.saveChanges": "حفظ التغييرات",
"tasks.taskTitle": "العنوان",
"tasks.description": "الوصف",
"tasks.priority": "الأولوية",
"tasks.dueDate": "تاريخ الاستحقاق",
"tasks.assignTo": "إسناد إلى",
"tasks.allTasks": "جميع المهام",
"tasks.assignedToMe": "المُسندة إليّ",
"tasks.createdByMe": "أنشأتها",
"tasks.byTeamMember": "حسب عضو الفريق",
"tasks.noTasks": "لا توجد مهام بعد",
"tasks.noMatch": "لا توجد مهام تطابق هذا الفلتر",
"tasks.createFirst": "أنشئ مهمة للبدء",
"tasks.tryFilter": "جرب فلتر مختلف",
"tasks.deleteTask": "حذف المهمة؟",
"tasks.deleteConfirm": "هل أنت متأكد من حذف هذه المهمة؟ لا يمكن التراجع.",
"tasks.todo": "للتنفيذ",
"tasks.in_progress": "قيد التنفيذ",
"tasks.done": "مكتمل",
"tasks.start": "ابدأ",
"tasks.complete": "أكمل",
"tasks.from": "من:",
"tasks.assignedTo": "مُسند إلى:",
"tasks.task": "مهمة",
"tasks.tasks": "مهام",
"tasks.of": "من",
"tasks.priority.low": "منخفض",
"tasks.priority.medium": "متوسط",
"tasks.priority.high": "عالي",
"tasks.priority.urgent": "عاجل",
"team.title": "الفريق",
"team.members": "أعضاء الفريق",
"team.addMember": "إضافة عضو",
"team.newMember": "عضو جديد",
"team.editMember": "تعديل العضو",
"team.myProfile": "ملفي الشخصي",
"team.editProfile": "تعديل ملفي",
"team.name": "الاسم",
"team.email": "البريد الإلكتروني",
"team.password": "كلمة المرور",
"team.teamRole": "الدور في الفريق",
"team.phone": "الهاتف",
"team.brands": "العلامات التجارية",
"team.brandsHelp": "أسماء العلامات مفصولة بفاصلة",
"team.removeMember": "إزالة عضو الفريق؟",
"team.removeConfirm": "هل أنت متأكد من إزالة {name}؟ لا يمكن التراجع.",
"team.noMembers": "لا يوجد أعضاء",
"team.backToTeam": "العودة للفريق",
"team.totalTasks": "إجمالي المهام",
"team.saveProfile": "حفظ الملف",
"team.saveChanges": "حفظ التغييرات",
"team.member": "عضو فريق",
"team.membersPlural": "أعضاء فريق",
"team.fullName": "الاسم الكامل",
"team.defaultPassword": "افتراضياً: changeme123",
"team.optional": "(اختياري)",
"team.fixedRole": "دور ثابت للمديرين",
"team.remove": "إزالة",
"team.noTasks": "لا توجد مهام",
"team.toDo": "للتنفيذ",
"team.inProgress": "قيد التنفيذ",
"campaigns.title": "الحملات",
"campaigns.newCampaign": "حملة جديدة",
"campaigns.noCampaigns": "لا توجد حملات",
"assets.title": "الأصول",
"assets.upload": "رفع",
"assets.noAssets": "لا توجد أصول",
"settings.title": "الإعدادات",
"settings.language": "اللغة",
"settings.english": "English",
"settings.arabic": "عربي",
"settings.restartTutorial": "إعادة تشغيل الدليل التعليمي",
"settings.tutorialDesc": "هل تحتاج إلى تذكير؟ أعد تشغيل الدليل التفاعلي للتعرف على جميع ميزات مركز سمايا للتسويق.",
"settings.general": "عام",
"settings.onboardingTutorial": "الدليل التعليمي",
"settings.tutorialRestarted": "تم إعادة تشغيل الدليل!",
"settings.restarting": "جاري إعادة التشغيل...",
"settings.reloadingPage": "جاري إعادة تحميل الصفحة لبدء الدليل...",
"settings.moreComingSoon": "المزيد من الإعدادات قريباً",
"settings.additionalSettings": "سيتم إضافة إعدادات إضافية للإشعارات وتفضيلات العرض والمزيد هنا.",
"settings.preferences": "إدارة تفضيلاتك وإعدادات التطبيق",
"tutorial.skip": "تخطي",
"tutorial.next": "التالي",
"tutorial.prev": "السابق",
"tutorial.finish": "إنهاء",
"tutorial.of": "من",
"tutorial.step": "الخطوة",
"tutorial.dashboard.title": "لوحة التحكم",
"tutorial.dashboard.desc": "مركز القيادة الخاص بك. شاهد أداء الحملات وتقدم المهام ونشاط الفريق في لمحة.",
"tutorial.campaigns.title": "الحملات",
"tutorial.campaigns.desc": "خطط وأدر الحملات التسويقية عبر جميع العلامات والمنصات.",
"tutorial.posts.title": "إنتاج المحتوى",
"tutorial.posts.desc": "أنشئ وراجع وانشر المحتوى. اسحب المنشورات عبر خط سير العمل.",
"tutorial.tasks.title": "المهام",
"tutorial.tasks.desc": "أسند وتتبع المهام. صفّ حسب من أسندها أو من أُسندت إليه.",
"tutorial.team.title": "الفريق",
"tutorial.team.desc": "دليل فريقك. أكمل ملفك الشخصي وشاهد من تعمل معه.",
"tutorial.assets.title": "الأصول",
"tutorial.assets.desc": "ارفع وأدر الأصول الإبداعية — الصور والفيديوهات والمستندات.",
"tutorial.newPost.title": "إنشاء محتوى",
"tutorial.newPost.desc": "ابدأ إنشاء المحتوى من هنا. اختر علامتك التجارية والمنصات وأسنده لعضو فريق.",
"tutorial.filters.title": "التصفية والتركيز",
"tutorial.filters.desc": "استخدم الفلاتر للتركيز على علامات أو منصات أو أعضاء فريق محددين.",
"login.title": "سمايا للتسويق",
"login.subtitle": "سجل دخولك للمتابعة",
"login.forgotPassword": "نسيت كلمة المرور؟",
"login.defaultCreds": "بيانات الدخول الافتراضية:",
"profile.completeYourProfile": "أكمل ملفك الشخصي",
"profile.completeDesc": "يرجى إكمال ملفك الشخصي للوصول إلى جميع الميزات ومساعدة فريقك في العثور عليك.",
"profile.completeProfileBtn": "إكمال الملف",
"profile.later": "لاحقاً"
}