2305c3dc9d
- Add backend/locale/ar_SA/LC_MESSAGES/django.po with Arabic (ar-sa) translations
for all 62 user-facing error/validation strings across accounts, bookings,
payments, and notifications apps; compile to django.mo
- Add common.loading and salon.unknownStaff keys to both ar-sa.json and en.json
- ProtectedRoute: replace hardcoded "Loading..." with t("common.loading")
- BookPage, SalonDetailPage: replace `Staff ${s.id}` fallback with
t("salon.unknownStaff", { id: s.id })
- BookingsPage: pass getActiveLocale() to toLocaleString so date/time
format matches the active app language
All 35 backend tests and 7 frontend tests pass.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
54 lines
3.4 KiB
JSON
54 lines
3.4 KiB
JSON
{
|
|
"hero": {
|
|
"eyebrow": "Salon Booking Platform",
|
|
"title": "Find, compare, and book top salons near you.",
|
|
"subtitle": "Search by city or service, compare pricing, and lock in your slot in seconds.",
|
|
"searchPlaceholder": "Search by salon or service"
|
|
},
|
|
"results": {
|
|
"title": "Salons",
|
|
"loading": "Loading salons...",
|
|
"error": "Unable to load salons. Start the backend API to see results.",
|
|
"empty": "No salons found."
|
|
},
|
|
"card": {
|
|
"noDescription": "No description yet.",
|
|
"phoneUnavailable": "Phone unavailable",
|
|
"viewDetails": "View details & book"
|
|
},
|
|
"nav":{"home":"Home","book":"Book","pay":"Pay","profile":"Profile","bookings":"My bookings","login":"Sign in","logout":"Sign out"},"book":{"title":"Book a Service","placeholder":"Booking flow coming soon.","cta":"Book now","selectSalon":"Select a salon from the home page to book.","service":"Service","staff":"Staff","date":"Date","time":"Time","notes":"Notes","notesPlaceholder":"Optional notes","selectService":"Select service","selectStaff":"Select staff","submit":"Confirm booking","submitting":"Booking...","errors":{"fillAll":"Please fill all required fields.","invalidTime":"Invalid date or time.","generic":"Booking failed."}},"salon":{"services":"Services","staff":"Staff","unknownStaff":"Staff {{id}}"},"profile":{"title":"Profile","placeholder":"Profile and bookings coming soon.","myBookings":"My bookings","noContact":"No contact info"},"bookings":{"title":"My bookings","subtitle":"Your upcoming and past appointments.","empty":"No bookings yet.","pay":"Pay now"},"paymentReturn":{"title":"Payment status","success":"Payment successful","successMessage":"Your payment was completed. You will receive a confirmation by SMS or WhatsApp.","checkStatus":"Check your email or the salon for payment status.","reference":"Reference: {{id}}","viewBookings":"View my bookings"},"auth":{"title":"Sign in","subtitle":"Enter your phone number to receive a verification code.","phone":"Phone number","channel":"Send via","sms":"SMS","whatsapp":"WhatsApp","sendCode":"Send code","sending":"Sending...","verifyTitle":"Enter code","verifySubtitle":"We sent a code to {{phone}}","code":"Verification code","verify":"Verify","verifying":"Verifying...","back":"Change number","errors":{"generic":"Something went wrong.","retryAfter":"Please wait {{seconds}} seconds before trying again."}},"locale": {
|
|
"label": "Language",
|
|
"arabic": "العربية",
|
|
"english": "English"
|
|
},
|
|
"common": {
|
|
"loading": "Loading..."
|
|
},
|
|
"payment": {
|
|
"title": "Payment (Beta)",
|
|
"subtitle": "Send a Moyasar payment for an existing booking.",
|
|
"badge": "Payments",
|
|
"bookingId": "Booking ID",
|
|
"accessToken": "Access token",
|
|
"accessTokenPlaceholder": "Paste JWT access token",
|
|
"sourceType": "Source type",
|
|
"sourceValue": "Source value",
|
|
"sourceValuePlaceholder": "Mobile number or token",
|
|
"callbackUrl": "Callback URL",
|
|
"payNow": "Pay now",
|
|
"processing": "Processing...",
|
|
"idempotency": "Idempotency key",
|
|
"sources": {
|
|
"stcpay": "stc pay (mobile)",
|
|
"token": "tokenized payment",
|
|
"applepay": "Apple Pay"
|
|
},
|
|
"errors": {
|
|
"bookingRequired": "Booking ID is required.",
|
|
"mobileRequired": "Mobile number is required for stc pay.",
|
|
"tokenRequired": "Token is required for token payments.",
|
|
"generic": "Payment request failed."
|
|
}
|
|
}
|
|
}
|