Browse Source
feat: implement services feature, internationalization support, login page, and core UI components
master
feat: implement services feature, internationalization support, login page, and core UI components
master
22 changed files with 3146 additions and 1328 deletions
-
856scripts/generate-locales.js
-
52src/components/layout/ServerStatusDialog.tsx
-
26src/components/shared/DeleteConfirmDialog.tsx
-
26src/features/auth/LoginPage.tsx
-
15src/features/dashboard/DashboardHome.tsx
-
20src/features/global-search/GlobalSearchDialog.tsx
-
4src/features/services/ServicesPage.tsx
-
13src/features/services/components/CategoriesServiceView.tsx
-
203src/features/services/components/CitiesServiceView.tsx
-
430src/features/services/components/CreateLocationDialog.tsx
-
870src/features/services/components/DuasServiceView.tsx
-
122src/features/services/components/LocationDetailSheet.tsx
-
397src/features/services/components/ZayerGuideServiceView.tsx
-
120src/features/services/services/trip-etiquette-api.ts
-
424src/features/services/services/zayer-guide-api.ts
-
34src/features/services/types/trip-etiquette.ts
-
33src/features/services/types/zayer-guide.ts
-
44src/features/tours/components/TourStatusBadge.tsx
-
12src/i18n/index.ts
-
219src/locales/ar.json
-
143src/locales/en.json
-
201src/locales/fa.json
@ -0,0 +1,856 @@ |
|||
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 (Zain, Asiacell, Korek, STC)', |
|||
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: 'مدیریت بستههای اینترنت، سیمکارتهای بینالمللی و سفارشهای زائرین (زین، آسیاسل، کورک، STC)', |
|||
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: 'إدارة باقات الإنترنت والشرائح الدولية وطلبات الزوار (زين، آسیاسیل، كورك، STC)', |
|||
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!') |
|||
870
src/features/services/components/DuasServiceView.tsx
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save
Reference in new issue