import fs from 'node:fs' import path from 'node:path' import { fileURLToPath } from 'node:url' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) const LOCALES_DIR = path.resolve(__dirname, '../src/locales') export const enLocale = { navigation: { brand: 'Aqila Admin Panel', brandShort: 'Aqila', dashboard: 'Dashboard', dashboardTitle: 'Admin Dashboard', tours: 'Tours', allTours: 'All Tours', ongoingTours: 'Ongoing Tours', tourOrders: 'Orders & Bookings', services: 'Services Center', simcard: 'SIM Card', zayerGuide: 'Zayer Guide', exchange: 'Online Exchange', duas: 'Duas & Ziyarat', duasList: 'Duas & Ziyarat', categories: 'Categories', cities: 'Holy Cities', store: 'Massoumah Store', storeProducts: 'Products', storeCategories: 'Categories', costEstimate: 'Cost Estimate', support: 'Support Center', supporters: 'Support Staff', faq: 'FAQ', faqCategories: 'Subject Categories', faqQuestions: 'Questions & Answers', consultant: 'Support', billing: 'Billing & Finance', settings: 'Settings', logout: 'Logout', soon: 'Soon', adminRole: 'System Administrator', }, topbar: { serverOnline: 'Server is Online', serverOffline: 'Server Disconnected', theme: 'Theme', language: 'Language', selectLanguage: 'Select System Language', search: 'Search...', }, auth: { loginTitle: 'Login to Admin Dashboard', loginDescription: 'Enter your credentials to access the management portal', demoBoxTitle: 'Demo Ready Account:', autoFill: 'Auto Fill', emailLabel: 'Account Email', emailPlaceholder: 'you@example.com', passwordLabel: 'Password', passwordPlaceholder: '••••••••', showPassword: 'Show password', hidePassword: 'Hide password', submitLogin: 'Login to Account', loggingIn: 'Logging in...', loginFailed: 'Login failed. Please try again.', footerNote: 'Supports custom templates and direct API connection', }, dashboard: { welcome: 'Welcome, {name}', readyBadge: 'Ready for Development', welcomeSubtitle: 'Aqila admin panel is ready for your new widgets, tables, and modules.', cleanBoardTitle: 'Clean Dashboard Ready for Development', cleanBoardDescription: 'All mock data and dummy UIs have been cleaned up. You can build your new modules using UI components and connect directly to Aqila database and backend.', }, serverStatus: { title: 'System & Server Status', description: 'Server connection summary, API configuration, and account details', backendStatus: 'Django Server Status (Backend)', connected: 'Online & Connected', checking: 'Checking...', disconnected: 'Disconnected', recheck: 'Re-check', rechecking: 'Testing...', recheckFull: 'Re-check Server', apiConfigTitle: 'API & Server Configuration', targetServer: 'Target Server', apiPrefix: 'API Prefix', authHeader: 'Auth Header', currentUserTitle: 'Current User Account', roleSuperuser: 'Super Administrator (Superuser)', roleStaff: 'System Administrator (Staff)', roleUser: 'User', fullName: 'Full Name:', email: 'Email:', userId: 'User ID:', connectionStable: 'Connection to server is stable', connectionTesting: 'Testing connection...', connectionUnreachable: 'Server is unreachable', }, globalSearch: { placeholder: 'Search pages, actions, or commands... (Ctrl+K)', empty: 'No results found.', systemSections: 'System Sections', toggleTheme: 'Toggle Theme', toggleThemeDesc: 'Switch theme between dark and light mode', logoutAccount: 'Logout from account', }, common: { save: 'Save Changes', cancel: 'Cancel', confirm: 'Confirm', delete: 'Delete', edit: 'Edit', close: 'Close', back: 'Back', refresh: 'Refresh', loading: 'Loading...', status: 'Status', actions: 'Actions', all: 'All', active: 'Active', inactive: 'Inactive', noData: 'No records found.', pageOf: 'Page {current} of {total}', success: 'Operation completed successfully.', error: 'Server connection error.', retry: 'Retry', previous: 'Previous', next: 'Next', showing: 'Showing', to: 'to', of: 'of', testSyncNotice: 'This is a test message for language synchronization verification.', deleteConfirmTitle: 'Are you sure you want to delete this item?', deleteConfirmDesc: 'This action cannot be undone and the record will be permanently deleted.', yesDelete: 'Yes, Delete', deleting: 'Deleting...', filter: 'Filter', search: 'Search...', export: 'Export', import: 'Import', create: 'Create', add: 'Add', view: 'View', details: 'Details', operations: 'Operations', enabled: 'Enabled', disabled: 'Disabled', unknown: 'Unknown', days: '{count} Days', dayOne: '1 Day', }, tours: { title: 'Tour Management', subtitle: 'Live monitoring of sales, travel itineraries, passengers, pricing, and multi-language translations', totalRegistered: '{count} Tours Registered', ongoingTitle: 'Ongoing Tours', ongoingSubtitle: 'Live tracking of ongoing trips, daily itinerary schedules, current stage position, and passengers', totalOngoing: '{count} Active Ongoing Tours', ordersTitle: 'Tour Orders & Bookings', ordersSubtitle: 'Order tracking, payment monitoring, document validation, and traveler deposit receipts', totalOrders: 'Total Registered Orders', approvedBookings: 'Approved Bookings', pendingReviewOrders: 'Pending Receipt Review', searchOrdersPlaceholder: 'Search orders (Passenger name, phone, order ID)...', filterSaleStatus: 'Sale Status', filterTripStatus: 'Trip Status', filterOrderStatus: 'Order Status', createTour: 'Create New Tour', tourDetails: 'Tour Details', manageTranslations: 'Manage Translations (5 Languages)', tabOverview: 'Specifications', tabItinerary: 'Itinerary', tabPassengers: 'Passengers', tabFeatures: 'Amenities', saleAvailable: 'Available', saleSoldOut: 'Sold Out', saleNoShow: 'Hidden', saleUnknown: 'Unknown', tripPending: 'Upcoming', tripTraveling: 'Ongoing', tripFinished: 'Completed', orderApproved: 'Approved', orderAwaitingPayment: 'Awaiting Payment', orderPending: 'Pending Receipt Review', orderRejected: 'Rejected', orderExpired: 'Expired', countryIraq: 'Iraq', countryIran: 'Iran', countrySaudi: 'Saudi Arabia', countrySyria: 'Syria', countryOman: 'Oman', }, services: { title: 'Services Center', subtitle: 'Management of pilgrimage services, SIM cards, Zayer guide, exchange, store, and religious rituals', allServices: 'All Services', searchPlaceholder: 'Search services...', simcardTitle: 'SIM Card', simcardDesc: 'Internet packages, international SIM cards, and traveler orders (Iran, Iraq, Saudi Arabia)', zayerGuideTitle: 'Zayer Guide', zayerGuideDesc: 'Holy shrines, historical sites, hospitals, mawakib, and city locations', exchangeTitle: 'Online Exchange', exchangeDesc: 'Exchange rates, currency requests, cash reserves, and traveler transfers (USD, IQD, IRR)', duasTitle: 'Duas & Ziyarat', duasDesc: 'Mafatih al-Jinan bank, audios, translations, and authentic ziyarats', categoriesTitle: 'Categories', categoriesDesc: 'Management of religious, shrine, store, and app content categories', citiesTitle: 'Holy Cities', citiesDesc: 'Pilgrimage cities (Najaf, Karbala, Kadhimiya, Samarra, Mashhad, Qom, Mecca, Medina)', storeTitle: 'Massoumah Store', storeDesc: 'Massoumah online store products, souvenirs, inventory, and order fulfillment', costEstimateTitle: 'Cost Estimate', costEstimateDesc: 'Estimation of total pilgrimage trip costs according to season, services, and hotel class', supportTitle: 'Support', supportDesc: 'Direct ticketing system, user requests, and operator responses', faqTitle: 'FAQ', faqDesc: 'Frequently asked questions bank, travel guides, and religious rules', }, billing: { title: 'Invoices & Billing Management', description: 'Review bank receipts, approve or reject payments, and track invoices across Aqila services', totalInvoices: 'Total Invoices', pendingReview: 'Pending Receipt Review', awaitingPayment: 'Awaiting Customer Payment', approvedPayments: 'Approved Payments', rejectedOrExpired: 'Rejected / Expired', searchPlaceholder: 'Search invoices (Customer name, email, card number, invoice ID)...', statusFilter: 'Invoice Status', serviceFilter: 'Service Type', clearFilters: 'Clear Filters', invoiceList: 'Invoice List', customer: 'Customer', amount: 'Amount', service: 'Service', date: 'Issue Date', receipt: 'Payment Receipt', hasReceipt: 'View Receipt', noReceipt: 'None', approve: 'Approve Payment', reject: 'Reject Invoice', rejectTitle: 'Reject Invoice', rejectReason: 'Rejection Reason / Bank Receipt:', rejectReasonPlaceholder: 'e.g., Unreadable receipt, amount mismatch, invalid transaction reference...', rejectNotice: 'This explanation will be displayed to the traveler in their invoice details.', submitReject: 'Submit & Reject Invoice', submitting: 'Submitting...', statusPending: 'Pending Receipt Review', statusAwaiting: 'Awaiting Payment', statusApproved: 'Payment Approved', statusRejected: 'Rejected', statusExpired: 'Expired', invoice: 'Invoice', invoices: 'Invoices', id: 'ID', viewDetails: 'View Details', viewReceipt: 'View Receipt', noReceiptUploaded: 'No receipt uploaded', serviceTour: 'Pilgrimage Tours', serviceSimcard: 'SIM Card', serviceShop: 'Massoumah Store', serviceExchange: 'Exchange (Tasreef)', serviceCustomTrip: 'Custom Trip', allStatuses: 'All Statuses', allServices: 'All Services', noFactorsFound: 'No invoices found.', noFactorsFilter: 'No records match current filters. You can clear filters.', noFactorsEmpty: 'No invoices have been issued in the system yet.', confirmClearReceipt: 'Are you sure you want to remove the uploaded receipt image?', receiptClearedSuccess: 'Payment receipt cleared successfully.', tabAll: 'All Transactions', tabTour: 'Tour Orders & Bookings', tabSimcard: 'SIM Cards', tabExchange: 'Currency & Exchange', tabShop: 'Souvenir Store', tabCustomTrip: 'Custom Trips', coreTourBadge: 'Primary Core', liveStatus: 'Live Status', quickFilter: 'Status Filter', }, languages: { fa: 'فارسی', ar: 'العربية', en: 'English', }, } export const faLocale = { navigation: { brand: 'پنل مدیریت عقیله', brandShort: 'عقیله', dashboard: 'داشبورد', dashboardTitle: 'داشبورد مدیریت', tours: 'تورها', allTours: 'فهرست همه تورها', ongoingTours: 'تورهای در حال برگزاری', tourOrders: 'سفارشات و رزروها', services: 'مرکز خدمات (همه)', simcard: 'سیم‌کارت (Simcard)', zayerGuide: 'راهنمای زائر (Zayer Guide)', exchange: 'صرافی آنلاین (Exchange)', duas: 'ادعیه و زیارات (Duas)', duasList: 'ادعیه و زیارات', categories: 'دسته‌بندی‌ها', cities: 'شهرهای زیارتی', store: 'فروشگاه معصومه (Store)', storeProducts: 'محصولات', storeCategories: 'دسته‌بندی‌ها', costEstimate: 'تخمین هزینه (Cost Estimate)', support: 'پشتیبانی (Support)', supporters: 'پشتیبان‌ها (Supporters)', faq: 'سوالات متداول (FAQ)', faqCategories: 'دسته‌بندی‌های موضوعی', faqQuestions: 'پرسش و پاسخ‌ها', consultant: 'پشتیبانی (Support)', billing: 'صورت‌حساب‌ها و مالی', settings: 'تنظیمات', logout: 'خروج از سیستم', soon: 'به‌زودی', adminRole: 'مدیر کل سیستم', }, topbar: { serverOnline: 'سرور متصل است', serverOffline: 'قطع ارتباط با سرور', theme: 'تغییر تم', language: 'تغییر زبان', selectLanguage: 'انتخاب زبان سامانه', search: 'جستجو...', }, auth: { loginTitle: 'ورود به پنل مدیریت و داشبورد', loginDescription: 'برای دسترسی به پرتال مدیریت، اطلاعات ورود خود را وارد نمایید', demoBoxTitle: 'حساب آزمایشی آماده:', autoFill: 'پر کردن خودکار', emailLabel: 'ایمیل حساب کاربری', emailPlaceholder: 'you@example.com', passwordLabel: 'رمز عبور', passwordPlaceholder: '••••••••', showPassword: 'نمایش رمز', hidePassword: 'مخفی‌کردن رمز', submitLogin: 'ورود به حساب کاربری', loggingIn: 'در حال ورود...', loginFailed: 'ورود ناموفق بود. دوباره تلاش کنید.', footerNote: 'پشتیبانی از قالب‌های سفارشی و اتصال مستقیم به API', }, dashboard: { welcome: 'خوش آمدید، {name}', readyBadge: 'آماده توسعه', welcomeSubtitle: 'پنل مدیریت عقیله آماده اضافه کردن ویجت‌ها، جداول و ماژول‌های جدید شماست.', cleanBoardTitle: 'داشبورد تمیز و آماده توسعه', cleanBoardDescription: 'تمام اطلاعات و یوآی‌های ساختگی حذف شدند. می‌توانید ماژول‌های جدید خود را با کامپوننت‌های آماده UI پیاده‌سازی و مستقیماً به دیتابیس و بک‌اند عقیله متصل نمایید.', }, serverStatus: { title: 'وضعیت سیستم و سرور', description: 'خلاصه ارتباط سرور، پیکربندی API و اطلاعات حساب', backendStatus: 'وضعیت سرور جنگو (Backend)', connected: 'آنلاین و متصل', checking: 'در حال بررسی...', disconnected: 'قطع ارتباط', recheck: 'بررسی مجدد', rechecking: 'در حال تست...', recheckFull: 'بررسی مجدد سرور', apiConfigTitle: 'پیکربندی API و سرور', targetServer: 'سرور هدف', apiPrefix: 'پیشوند API', authHeader: 'هدر احراز هویت', currentUserTitle: 'اطلاعات حساب کاربری جاری', roleSuperuser: 'مدیر ارشد (Superuser)', roleStaff: 'مدیر سیستم (Staff)', roleUser: 'کاربر', fullName: 'نام و نام خانوادگی:', email: 'ایمیل:', userId: 'شناسه کاربری (ID):', connectionStable: 'ارتباط با سرور پایدار است', connectionTesting: 'در حال آزمایش اتصال...', connectionUnreachable: 'سرور در دسترس نیست', }, globalSearch: { placeholder: 'جستجوی صفحات، عملیات‌ها یا فرمان‌ها... (Ctrl+K)', empty: 'هیچ نتیجه‌ای یافت نشد.', systemSections: 'بخش‌های سیستم', toggleTheme: 'تغییر پوسته (Theme)', toggleThemeDesc: 'تغییر تم به حالت تیره یا روشن', logoutAccount: 'خروج از حساب کاربری', }, common: { save: 'ذخیره تغییرات', cancel: 'انصراف', confirm: 'تایید', delete: 'حذف', edit: 'ویرایش', close: 'بستن', back: 'بازگشت', refresh: 'به‌روزرسانی', loading: 'در حال بارگذاری...', status: 'وضعیت', actions: 'عملیات', all: 'همه', active: 'فعال', inactive: 'غیرفعال', noData: 'موردی برای نمایش یافت نشد.', pageOf: 'صفحه {current} از {total}', success: 'عملیات با موفقیت انجام شد.', error: 'خطا در برقراری ارتباط با سرور.', retry: 'تلاش مجدد', previous: 'قبلی', next: 'بعدی', showing: 'نمایش', to: 'تا', of: 'از', testSyncNotice: 'این یک پیام آزمایشی برای تست هماهنگی زبان‌هاست', deleteConfirmTitle: 'آیا از حذف این مورد اطمینان دارید؟', deleteConfirmDesc: 'این عملیات غیرقابل بازگشت است و رکورد مورد نظر به طور کامل حذف خواهد شد.', yesDelete: 'بله، حذف شود', deleting: 'در حال حذف...', filter: 'فیلتر', search: 'جستجو...', export: 'خروجی اکسل', import: 'ورود اطلاعات', create: 'ایجاد جدید', add: 'افزودن', view: 'مشاهده', details: 'جزئیات', operations: 'عملیات', enabled: 'فعال', disabled: 'غیرفعال', unknown: 'نامشخص', days: '{count} روز', dayOne: '۱ روز', }, tours: { title: 'مدیریت تورها', subtitle: 'پایش وضعیت زنده فروش، برنامه‌های سفر، مسافران، اطلاعات قیمتی و ترجمه‌های چندزبانه', totalRegistered: '{count} تور ثبت‌شده', ongoingTitle: 'تورهای در حال برگزاری', ongoingSubtitle: 'پایش زنده وضعیت سفرهای جاری، زمان‌بندی روزانه (Itinerary)، موقعیت مرحله فعلی و وضعیت مسافران', totalOngoing: '{count} تور فعال و در جریان', ordersTitle: 'سفارشات و رزروهای تور', ordersSubtitle: 'پیگیری سفارشات، نظارت بر پرداخت‌ها و اعتبارسنجی مدارک و فیش‌های واریزی مسافران', totalOrders: 'کل سفارشات ثبت‌شده', approvedBookings: 'رزروهای تأییدشده', pendingReviewOrders: 'در انتظار بررسی فیش', searchOrdersPlaceholder: 'جستجوی سفارشات (نام مسافر، شماره تماس، کد سفارش)...', filterSaleStatus: 'وضعیت فروش', filterTripStatus: 'وضعیت سفر', filterOrderStatus: 'وضعیت سفارش', createTour: 'ایجاد تور جدید', tourDetails: 'جزئیات تور', manageTranslations: 'مدیریت ترجمه‌ها (۵ زبان)', tabOverview: 'مشخصات', tabItinerary: 'برنامه سفر', tabPassengers: 'مسافران', tabFeatures: 'امکانات', saleAvailable: 'در دسترس', saleSoldOut: 'تکمیل ظرفیت', saleNoShow: 'عدم نمایش', saleUnknown: 'نامشخص', tripPending: 'در انتظار اجرا', tripTraveling: 'در حال برگزاری', tripFinished: 'پایان‌یافته', orderApproved: 'تایید شده', orderAwaitingPayment: 'در انتظار پرداخت', orderPending: 'در انتظار بررسی فیش', orderRejected: 'رد شده', orderExpired: 'منقضی شده', countryIraq: 'عراق', countryIran: 'ایران', countrySaudi: 'عربستان', countrySyria: 'سوریه', countryOman: 'عمان', }, services: { title: 'مرکز خدمات', subtitle: 'مدیریت جامع خدمات زیارتی، سیم‌کارت، راهنمای زائر، صرافی، فروشگاه و مناسک', allServices: 'همه خدمات', searchPlaceholder: 'جستجوی خدمات...', simcardTitle: 'سیم‌کارت', simcardDesc: 'مدیریت بسته‌های اینترنت، سیم‌کارت‌های بین‌المللی و سفارش‌های زائرین (ایران، عراق، عربستان سعودی)', zayerGuideTitle: 'راهنمای زائر', zayerGuideDesc: 'بانک جامع اماکن متبرکه، راهنمای اماکن تاریخی، بیمارستان‌ها، مواکب و موقعیت مکانی شهرها', exchangeTitle: 'صرافی آنلاین', exchangeDesc: 'نرخ لحظه‌ای ارزها، درخواست‌های ارزی، مدیریت موجودی نقدی و حواله‌های زائران (دلار، دینار، تومان)', duasTitle: 'ادعیه و زیارات', duasDesc: 'بانک مفاتیح‌الجنان، ادعیه صوتی، ترجمه و شرح متون ادعیه و زیارات معتبر', categoriesTitle: 'دسته‌بندی‌ها', categoriesDesc: 'مدیریت دسته‌بندی‌های موضوعی خدمات، اماکن، فروشگاه و محتواهای اپلیکیشن', citiesTitle: 'شهرهای زیارتی', citiesDesc: 'شهرهای زیارتی (نجف، کربلا، کاظمین، سامرا، مشهد، قم، مکه، مدینه)', storeTitle: 'فروشگاه معصومه', storeDesc: 'محصولات فروشگاه آنلاین معصومه، سوغات زیارتی، مدیریت انبار و سفارشات خرید', costEstimateTitle: 'تخمین هزینه', costEstimateDesc: 'محاسبه آنلاین هزینه‌های سفر انفرادی و خانوادگی به تفکیک فصل، خدمات و سطح هتل', supportTitle: 'پشتیبانی', supportDesc: 'سیستم تیکتینگ مستقیم، پشتیبانی از زائران و مدیریت پاسخگویی اپراتورها', faqTitle: 'سوالات متداول', faqDesc: 'بانک پرسش و پاسخ‌های پرتکرار زائرین، راهنمای سفر و احکام شرعی', }, billing: { title: 'مدیریت صورت‌حساب‌ها و فاکتورها', description: 'بررسی فیش‌های بانکی، تایید یا رد پرداخت‌ها و پیگیری ریز فاکتورهای ۵ سرویس سامانه عقیله', totalInvoices: 'کل صورت‌حساب‌ها', pendingReview: 'در انتظار بررسی فیش', awaitingPayment: 'در انتظار پرداخت مشتری', approvedPayments: 'پرداخت‌های تایید شده', rejectedOrExpired: 'رد شده / منقضی', searchPlaceholder: 'جستجو در صورت‌حساب‌ها (نام مشتری، ایمیل، شماره کارت، شماره فاکتور)...', statusFilter: 'وضعیت صورت‌حساب', serviceFilter: 'نوع سرویس', clearFilters: 'پاک کردن فیلترها', invoiceList: 'فهرست صورت‌حساب‌ها', customer: 'مشتری', amount: 'مبلغ', service: 'سرویس', date: 'تاریخ صدور', receipt: 'فیش پرداخت', hasReceipt: 'مشاهده فیش', noReceipt: 'ندارد', approve: 'تایید پرداخت', reject: 'رد فاکتور', rejectTitle: 'رد صورت‌حساب', rejectReason: 'علت رد فاکتور / فیش بانکی:', rejectReasonPlaceholder: 'مثال: تصویر فیش ناخواناست، مبلغ فیش با فاکتور همخوانی ندارد، کد رهگیری نامعتبر است...', rejectNotice: 'این توضیح به مسافر در بخش وضعیت فاکتور نمایش داده خواهد شد.', submitReject: 'ثبت و رد فاکتور', submitting: 'در حال ثبت...', statusPending: 'در انتظار بررسی فیش', statusAwaiting: 'در انتظار پرداخت', statusApproved: 'پرداخت تایید شده', statusRejected: 'رد شده', statusExpired: 'منقضی شده', invoice: 'صورت‌حساب', invoices: 'صورت‌حساب‌ها', id: 'شناسه', viewDetails: 'مشاهده جزئیات', viewReceipt: 'مشاهده فیش', noReceiptUploaded: 'فیشی بارگذاری نشده است', serviceTour: 'تور زیارتی', serviceSimcard: 'سیم‌کارت', serviceShop: 'فروشگاه معصومه', serviceExchange: 'صرافی (تصریف)', serviceCustomTrip: 'سفر اختصاصی', allStatuses: 'همه وضعیت‌ها', allServices: 'همه سرویس‌ها', noFactorsFound: 'هیچ صورت‌حسابی یافت نشد.', noFactorsFilter: 'رکوردی با فیلترهای فعلی همخوانی ندارد. می‌توانید فیلترها را پاک کنید.', noFactorsEmpty: 'تاکنون هیچ صورت‌حسابی در سیستم صادر نشده است.', confirmClearReceipt: 'آیا از حذف تصویر فیش بارگذاری شده اطمینان دارید؟', receiptClearedSuccess: 'تصویر فیش پرداخت با موفقیت حذف شد.', tabAll: 'کل تراکنش‌ها', tabTour: 'سفارشات و رزرو تور', tabSimcard: 'سیم‌کارت', tabExchange: 'ارز و صرافی', tabShop: 'فروشگاه سوغات', tabCustomTrip: 'سفرهای اختصاصی', coreTourBadge: 'هسته اصلی', liveStatus: 'وضعیت زنده', quickFilter: 'فیلتر وضعیت', }, languages: { fa: 'فارسی', ar: 'العربية', en: 'English', }, } export const arLocale = { navigation: { brand: 'لوحة تحكم عقيلة', brandShort: 'عقيلة', dashboard: 'الرئيسية', dashboardTitle: 'لوحة التحكم', tours: 'الرحلات', allTours: 'جميع الرحلات', ongoingTours: 'الرحلات الجارية', tourOrders: 'الطلبات والحجوزات', services: 'مركز الخدمات (الكل)', simcard: 'شريحة الاتصال (Simcard)', zayerGuide: 'دليل الزائر (Zayer Guide)', exchange: 'الصرافة الإلكترونية (Exchange)', duas: 'الأدعية والزيارات (Duas)', duasList: 'الأدعية والزيارات', categories: 'التصنيفات', cities: 'المدن المقدسة', store: 'متجر معصومة (Store)', storeProducts: 'المنتجات', storeCategories: 'التصنيفات', costEstimate: 'تقدير التكلفة (Cost Estimate)', support: 'الدعم الفني (Support)', supporters: 'فريق الدعم (Supporters)', faq: 'الأسئلة الشائعة (FAQ)', faqCategories: 'التصنيفات الموضوعية', faqQuestions: 'الأسئلة والأجوبة', consultant: 'الدعم الفني (Support)', billing: 'الفواتير والمالية', settings: 'الإعدادات', logout: 'تسجيل الخروج', soon: 'قريباً', adminRole: 'مدير النظام العام', }, topbar: { serverOnline: 'الخادم متصل', serverOffline: 'انقطع الاتصال بالخادم', theme: 'المظهر', language: 'اللغة', selectLanguage: 'اختر لغة النظام', search: 'بحث...', }, auth: { loginTitle: 'تسجيل الدخول إلى لوحة الإدارة', loginDescription: 'أدخل بيانات الاعتماد الخاصة بك للوصول إلى بوابة الإدارة', demoBoxTitle: 'حساب تجريبي جاهز:', autoFill: 'تعبئة تلقائية', emailLabel: 'البريد الإلكتروني للحساب', emailPlaceholder: 'you@example.com', passwordLabel: 'كلمة المرور', passwordPlaceholder: '••••••••', showPassword: 'عرض كلمة المرور', hidePassword: 'إخفاء كلمة المرور', submitLogin: 'تسجيل الدخول إلى الحساب', loggingIn: 'جاري تسجيل الدخول...', loginFailed: 'فشل تسجيل الدخول. يرجى المحاولة مرة أخرى.', footerNote: 'يدعم القوالب المخصصة والاتصال المباشر بواجهة برمجة التطبيقات (API)', }, dashboard: { welcome: 'مرحباً، {name}', readyBadge: 'جاهز للتطوير', welcomeSubtitle: 'لوحة تحكم عقيلة جاهزة لإضافة أدواتك وجداولك ووحداتك الجديدة.', cleanBoardTitle: 'لوحة تحكم نظيفة وجاهزة للتطوير', cleanBoardDescription: 'تم مسح جميع البيانات والواجهات الوهمية. يمكنك بناء وحداتك الجديدة باستخدام مكونات واجهة المستخدم الجاهزة والاتصال مباشرة بقاعدة البيانات وخادم عقيلة.', }, serverStatus: { title: 'حالة النظام والخادم', description: 'ملخص اتصال الخادم، وتكوين واجهة برمجة التطبيقات وبيانات الحساب', backendStatus: 'حالة خادم جانغو (Backend)', connected: 'متصل ونشط', checking: 'جاري الفحص...', disconnected: 'انقطع الاتصال', recheck: 'إعادة الفحص', rechecking: 'جاري الاختبار...', recheckFull: 'إعادة فحص الخادم', apiConfigTitle: 'تكوين واجهة برمجة التطبيقات والخادم', targetServer: 'الخادم الهدف', apiPrefix: 'بادئة API', authHeader: 'ترويسة المصادقة', currentUserTitle: 'بيانات الحساب الحالي', roleSuperuser: 'المدير العام (Superuser)', roleStaff: 'مدير النظام (Staff)', roleUser: 'مستخدم', fullName: 'الاسم الكامل:', email: 'البريد الإلكتروني:', userId: 'معرف المستخدم (ID):', connectionStable: 'الاتصال بالخادم مستقر', connectionTesting: 'جاري اختبار الاتصال...', connectionUnreachable: 'الخادم غير متاح', }, globalSearch: { placeholder: 'البحث في الصفحات والعمليات والأوامر... (Ctrl+K)', empty: 'لم يتم العثور على أي نتائج.', systemSections: 'أقسام النظام', toggleTheme: 'تغيير السمة (Theme)', toggleThemeDesc: 'تبديل المظهر بين الوضع الداكن والفاتح', logoutAccount: 'تسجيل الخروج من الحساب', }, common: { save: 'حفظ التغييرات', cancel: 'إلغاء', confirm: 'تأكيد', delete: 'حذف', edit: 'تعديل', close: 'إغلاق', back: 'رجوع', refresh: 'تحديث', loading: 'جاري التحميل...', status: 'الحالة', actions: 'الإجراءات', all: 'الكل', active: 'نشط', inactive: 'غير نشط', noData: 'لا توجد بيانات للعرض.', pageOf: 'صفحة {current} من {total}', success: 'تمت العملية بنجاح.', error: 'حدث خطأ في الاتصال بالخادم.', retry: 'إعادة المحاولة', previous: 'السابق', next: 'التالي', showing: 'عرض', to: 'إلى', of: 'من', testSyncNotice: 'هذه رسالة تجريبية لاختبار مزامنة اللغات.', deleteConfirmTitle: 'هل أنت متأكد من حذف هذا العنصر؟', deleteConfirmDesc: 'هذا الإجراء لا يمكن التراجع عنه وسيتم حذف السجل نهائياً.', yesDelete: 'نعم، احذف', deleting: 'جاري الحذف...', filter: 'تصفية', search: 'بحث...', export: 'تصدير إكسل', import: 'استيراد بيانات', create: 'إنشاء جديد', add: 'إضافة', view: 'عرض', details: 'تفاصيل', operations: 'العمليات', enabled: 'مفعل', disabled: 'معطل', unknown: 'غير محدد', days: '{count} أيام', dayOne: 'يوم واحد', }, tours: { title: 'إدارة الرحلات', subtitle: 'متابعة مباشرة لحالة المبيعات وجداول الرحلات والمسافرين وبيانات الأسعار والترجمات متعددة اللغات', totalRegistered: '{count} رحلة مسجلة', ongoingTitle: 'الرحلات الجارية', ongoingSubtitle: 'متابعة مباشرة للرحلات الحالية والجدول اليومي والموقع الحالي وحالة المسافرين', totalOngoing: '{count} رحلة نشطة وجارية', ordersTitle: 'طلبات وحجوزات الرحلات', ordersSubtitle: 'متابعة الطلبات ومراقبة المدفوعات والتحقق من وثائق وإيصالات التحويل للمسافرين', totalOrders: 'إجمالي الطلبات المسجلة', approvedBookings: 'الحجوزات المؤكدة', pendingReviewOrders: 'بانتظار مراجعة الإيصال', searchOrdersPlaceholder: 'البحث في الطلبات (اسم المسافر، الهاتف، معرف الطلب)...', filterSaleStatus: 'حالة البيع', filterTripStatus: 'حالة السفر', filterOrderStatus: 'حالة الطلب', createTour: 'إنشاء رحلة جديدة', tourDetails: 'تفاصيل الرحلة', manageTranslations: 'إدارة الترجمات (٥ لغات)', tabOverview: 'المواصفات', tabItinerary: 'برنامج الرحلة', tabPassengers: 'المسافرون', tabFeatures: 'المميزات', saleAvailable: 'متاح', saleSoldOut: 'اكتمل العدد', saleNoShow: 'مخفي', saleUnknown: 'غير محدد', tripPending: 'بانتظار الانطلاق', tripTraveling: 'جارية حالياً', tripFinished: 'منتهية', orderApproved: 'تمت الموافقة', orderAwaitingPayment: 'بانتظار الدفع', orderPending: 'بانتظار مراجعة الإيصال', orderRejected: 'مرفوض', orderExpired: 'منتهي الصلاحية', countryIraq: 'العراق', countryIran: 'إيران', countrySaudi: 'السعودية', countrySyria: 'سوريا', countryOman: 'عمان', }, services: { title: 'مركز الخدمات', subtitle: 'إدارة شاملة لخدمات الزوار والشرائح ودليل الزائر والصرافة والمتجر والمناسك', allServices: 'جميع الخدمات', searchPlaceholder: 'البحث في الخدمات...', simcardTitle: 'شريحة الاتصال', simcardDesc: 'إدارة باقات الإنترنت والشرائح الدولية وطلبات الزوار (إيران، العراق، السعودية)', zayerGuideTitle: 'دليل الزائر', zayerGuideDesc: 'دليل شامل للعتبات المقدسة والمعالم التاريخية والمستشفيات والمواكب ومواقع المدن', exchangeTitle: 'الصرافة الإلكترونية', exchangeDesc: 'أسعار الصرف المباشرة وطلبات العملات وإدارة السيولة النقدية وحوالات الزوار (دولار، دينار، تومان)', duasTitle: 'الأدعية والزيارات', duasDesc: 'بنك مفاتيح الجنان والتسجيلات الصوتية والترجمات وشروح الأدعية والزيارات المعتبرة', categoriesTitle: 'التصنيفات', categoriesDesc: 'إدارة التصنيفات الموضوعية للخدمات والأماكن والمتجر ومحتويات التطبيق', citiesTitle: 'المدن المقدسة', citiesDesc: 'المدن المقدسة (النجف، كربلاء، الكاظمية، سامراء، مشهد، قم، مكة، المدينة)', storeTitle: 'متجر معصومة', storeDesc: 'منتجات متجر معصومة الإلكتروني وهدايا الزيارة وإدارة المخزون وطلبات الشراء', costEstimateTitle: 'تقدير التكلفة', costEstimateDesc: 'حساب تكاليف الرحلات الفردية والعائلية حسب الموسم والخدمات ومستوى الفندق', supportTitle: 'الدعم الفني', supportDesc: 'نظام التذاكر المباشر ودعم الزوار وإدارة استجابات فريق العمل', faqTitle: 'الأسئلة الشائعة', faqDesc: 'بنك الأسئلة المتكررة للزوار وإرشادات السفر والأحكام الشرعية', }, billing: { title: 'إدارة الفواتير والمدفوعات', description: 'مراجعة إيصالات التحويل البنكي، واعتماد أو رفض المدفوعات ومتابعة تفاصيل فواتير خدمات عقيلة', totalInvoices: 'إجمالي الفواتير', pendingReview: 'بانتظار مراجعة الإيصال', awaitingPayment: 'بانتظار دفع العميل', approvedPayments: 'المدفوعات المعتمدة', rejectedOrExpired: 'مرفوض / منتهي الصلاحية', searchPlaceholder: 'البحث في الفواتير (اسم العميل، البريد، رقم البطاقة، رقم الفاتورة)...', statusFilter: 'حالة الفاتورة', serviceFilter: 'نوع الخدمة', clearFilters: 'إعادة ضبط التصفية', invoiceList: 'قائمة الفواتير', customer: 'العميل', amount: 'المبلغ', service: 'الخدمة', date: 'تاريخ الإصدار', receipt: 'إيصال الدفع', hasReceipt: 'عرض الإيصال', noReceipt: 'لا يوجد', approve: 'اعتماد الدفع', reject: 'رفض الفاتورة', rejectTitle: 'رفض الفاتورة', rejectReason: 'سبب رفض الفاتورة / الإيصال البنكي:', rejectReasonPlaceholder: 'مثال: صورة الإيصال غير واضحة، المبلغ غير متطابق، الرقم المرجعي غير صالح...', rejectNotice: 'سيظهر هذا الشرح للمسافر في تفاصيل الفاتورة.', submitReject: 'تأكيد ورفض الفاتورة', submitting: 'جاري الإرسال...', statusPending: 'بانتظار مراجعة الإيصال', statusAwaiting: 'بانتظار الدفع', statusApproved: 'تم اعتماد الدفع', statusRejected: 'مرفوض', statusExpired: 'منتهي الصلاحية', invoice: 'فاتورة', invoices: 'الفواتير', id: 'المعرف', viewDetails: 'عرض التفاصيل', viewReceipt: 'عرض الإيصال', noReceiptUploaded: 'لم يتم رفع إيصال', serviceTour: 'رحلة زيارة', serviceSimcard: 'شريحة اتصال', serviceShop: 'متجر معصومة', serviceExchange: 'صرافة (تصريف)', serviceCustomTrip: 'رحلة مخصصة', allStatuses: 'جميع الحالات', allServices: 'جميع الخدمات', noFactorsFound: 'لم يتم العثور على فواتير.', noFactorsFilter: 'لا توجد نتائج تطابق معايير التصفية الحالية.', noFactorsEmpty: 'لم يتم إصدار أي فواتير في النظام بعد.', confirmClearReceipt: 'هل أنت متأكد من حذف صورة الإيصال المرفوعة؟', receiptClearedSuccess: 'تم حذف صورة الإيصال بنجاح.', tabAll: 'جميع المعاملات', tabTour: 'طلبات وحجوزات الرحلات', tabSimcard: 'شرائح الاتصال', tabExchange: 'العملات والصرافة', tabShop: 'متجر الهدايا', tabCustomTrip: 'الرحلات الخاصة', coreTourBadge: 'الخدمة الأساسية', liveStatus: 'الحالة المباشرة', quickFilter: 'تصفية الحالة', }, languages: { fa: 'فارسی', ar: 'العربية', en: 'English', }, } function writeJson(filePath, data) { fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n', 'utf8') console.log(`✓ Generated: ${filePath}`) } writeJson(path.join(LOCALES_DIR, 'en.json'), enLocale) writeJson(path.join(LOCALES_DIR, 'fa.json'), faLocale) writeJson(path.join(LOCALES_DIR, 'ar.json'), arLocale) console.log('\n🎉 Successfully synchronized all 3 locale files with en.json as Source of Truth!')