Waseel: driver app, dispatch, POI suggestions, map fixes

This commit is contained in:
Krikorios
2026-08-25 02:57:49 +03:00
parent 899ca93cd5
commit 1d84003e0a
50 changed files with 3625 additions and 625 deletions
+501
View File
@@ -0,0 +1,501 @@
export const en = {
common: {
cancel: "Cancel",
continue: "Continue",
back: "Back",
retry: "Try Again",
loading: "Loading…",
saving: "Saving…",
error: "Error",
save: "Save",
or: "Or",
browseHome: "Browse Home",
backHome: "Back Home",
openSettings: "Open Settings",
yourLocation: "Your location",
},
onboarding: {
skip: "Skip",
next: "Next",
getStarted: "Get Started",
slide1: {
title: "The perfect ride is just a tap away!",
desc: "Your journey begins with Waseel. Find your ideal ride effortlessly.",
},
slide2: {
title: "Best car in your hands with Waseel",
desc: "Discover the convenience of finding your perfect ride with Waseel",
},
slide3: {
title: "Your ride, your way. Let's go!",
desc: "Enter your destination, sit back, and let us take care of the rest.",
},
},
auth: {
signIn: {
welcome: "Welcome 👋",
email: "Email",
emailPlaceholder: "karim@email.com",
password: "Password",
passwordPlaceholder: "••••••••",
keepSignedIn: "Keep me signed in",
signingIn: "Signing in…",
signInBtn: "Sign In",
signInGoogle: "Sign in with Google",
forgotPassword: "Forgot password?",
noAccount: "Don't have an account? ",
signUpLink: "Sign up",
carAlt: "Car",
reset: {
title: "Reset password",
requestBody:
"Enter your email and we'll send you a 6-digit reset code.",
emailPlaceholder: "karim@email.com",
sending: "Sending…",
sendCode: "Send Code",
newPassTitle: "Enter new password",
resetBody: "We've sent a reset code to {email}",
devBanner:
"Email delivery is not configured on this server. Your reset code is ",
newPassLabel: "New password",
newPasswordPlaceholder: "••••••••",
resetting: "Resetting…",
resetBtn: "Reset Password",
},
alertMissingTitle: "Missing information",
alertMissingBody: "Enter both your email and your password.",
alertErrorTitle: "Error",
alertErrorFallback: "Could not sign in. Please try again.",
errEmail: "Enter your email address.",
errCode: "Enter the 6-digit code.",
errPassword: "Password must be at least 8 characters.",
errReset: "Could not reset your password. Please try again.",
},
signUp: {
createAccount: "Create Your Account",
howUse: "How will you use Waseel?",
riderTitle: "I need a ride",
riderDesc: "Book rides and get where you're going",
driverTitle: "I want to drive",
driverDesc: "Offer rides and earn money with your car",
carAlt: "Car",
name: "Name",
namePlaceholder: "Karim Haddad",
email: "Email",
emailPlaceholder: "karim@email.com",
phoneOptional: "Phone (optional)",
phonePlaceholder: "70 123 456",
password: "Password",
passwordPlaceholder: "••••••••",
signUpBtn: "Sign Up",
signUpGoogle: "Sign up with Google",
haveAccount: "Already have an account? ",
signInLink: "Sign in",
verify: {
title: "Verification",
body: "We've sent a verification code to {email}",
devBanner:
"Email delivery is not configured on this server. Your verification code is ",
verifying: "Verifying…",
verifyBtn: "Verify Email",
checkAlt: "Check",
},
verified: {
title: "Verified",
body: "You've successfully verified your account.",
},
alertMissingTitle: "Missing information",
alertMissingBody: "Please fill in your name, email and password.",
alertPhoneTitle: "Invalid phone number",
alertPhoneBody: "Enter a valid Lebanese number, e.g. 70 123 456.",
alertErrorTitle: "Error",
alertErrorFallback: "Could not create your account.",
errCode: "Enter the 6-digit code.",
errVerify: "Verification failed. Please try again.",
},
role: {
title: "How will you use Waseel?",
subtitle: "You can change this later by contacting support.",
riderTitle: "I'm a Rider",
riderDesc: "Book rides and get around Lebanon",
driverTitle: "I'm a Driver",
driverDesc: "Give rides and earn money",
alertErrorTitle: "Error",
alertErrorBody: "Could not save your choice. Please try again.",
},
},
home: {
welcome: "Welcome {name} 👋",
logoutAlt: "Logout",
currentLocation: "Your Current Location",
findingLocation: "Finding your location…",
whatNeed: "What do you need?",
recentRides: "Recent Rides",
noRecent: "No recent rides found.",
noRecentAlt: "No recent rides found",
},
rides: {
allRides: "All rides",
noRecent: "No recent rides found.",
noRecentAlt: "No recent rides found",
},
tabs: {
home: "Home",
rides: "Rides",
chat: "Chat",
profile: "Profile",
settings: "Settings",
},
chat: {
title: "Chat",
messageAlt: "message",
noMessages: "No Messages Yet",
startConversation: "Start a conversation with your friends and family",
},
profile: {
title: "My Profile",
avatarAlt: "Your Avatar",
firstName: "First name",
firstNamePlaceholder: "Your First name",
lastName: "Last name",
lastNamePlaceholder: "Your Last name",
email: "Email",
emailPlaceholder: "Your Email address",
},
findRide: {
title: "Ride",
from: "From",
to: "To",
findNow: "Find now",
},
confirmRide: {
title: "Request Ride",
yourTrip: "Your trip",
pickup: "Pickup",
destination: "Destination",
tripTime: "Trip time {time}",
paymentMethod: "Payment Method",
cash: "💵 Cash",
card: "💳 Card",
fareDisplay: "${fare}",
lbpEstimate: "≈ {lbp}",
noDrivers: "No {service} drivers online right now",
findingDrivers: "Finding drivers nearby…",
nearestDriver: "Nearest driver ≈ {eta} min away",
requesting: "Requesting…",
noDriversOnline: "No drivers online",
requestCash: "Request Ride · Pay cash to driver",
requestCard: "Request Ride · Pay by card",
alertMissingRouteTitle: "Missing route",
alertMissingRouteBody: "Please set a pickup and destination first.",
alertNoEstimateTitle: "No estimate",
alertNoEstimateBody: "We couldn't estimate this fare. Please try again.",
alertErrorTitle: "Error",
alertErrorFallback:
"Something went wrong while booking your ride. Please try again.",
alertPayCardTitle: "Pay by card",
alertPayCardBody: "Your card will be charged ${fare}.",
},
bookRide: {
status: {
requested: "Finding your driver…",
accepted: "Driver assigned — heading to you",
enRoute: "On your trip",
completed: "You've arrived!",
cancelled: "Ride cancelled",
},
rideNotFound: "Ride not found.",
couldNotLoad: "Could not load this ride.",
backHome: "Back Home",
matchingDriver: "We're matching you with the nearest {service} driver.",
ratingFallback: "—",
paymentCash: "💵 Cash to driver",
paymentCard: "💳 Paid by card",
fare: "Fare: ${fare}",
tripTime: "Trip time {time}",
rideCancelled: "This ride was cancelled.",
cancelRide: "Cancel Ride",
cancelling: "Cancelling…",
alertErrorTitle: "Error",
alertErrorBody: "Could not cancel this ride. Please try again.",
},
driver: {
home: {
signOutAlt: "Sign out",
driverMode: "Driver mode",
online: "● Online — receiving ride requests",
goOnline: "○ Go online to drive",
todaysEarnings: "Today's earnings",
completedToday: "Completed today",
incomingRequests: "Incoming requests",
incomingRequestsOffline: "Incoming requests (offline)",
waitingRequests: "Waiting for ride requests…",
goOnlineStart: "Go online to start driving.",
welcome: "Welcome, {name}",
welcomeFallback: "driver",
setupIntro:
"Set up your driver profile to start receiving ride requests.",
whatDrive: "What will you drive?",
carModel: "Car model",
carModelPlaceholder: "e.g. Toyota Camry",
carSeats: "Car seats",
carSeatsPlaceholder: "4",
saving: "Saving…",
startDriving: "Start driving",
alertSeatsTitle: "Invalid seats",
alertSeatsBody: "Car seats must be a whole number 18.",
alertErrorTitle: "Error",
alertCreateBody:
"Could not create your driver profile. Please try again.",
alertToggleBody: "Could not change your status. Please try again.",
noRequestsAlt: "No recent rides found",
},
offerCard: {
newRequest: "New request · {service}",
cash: "💵 Cash",
card: "💳 Card",
fromAlt: "From",
toAlt: "To",
tripTime: "Trip time",
fare: "Fare",
decline: "Decline",
accept: "Accept",
},
activeRide: {
headToPickup: "Head to pickup",
tripInProgress: "Trip in progress",
rider: "{name}",
fromAlt: "From",
toAlt: "To",
fare: "Fare",
startTrip: "Start trip",
completeTrip: "Complete trip",
alertErrorTitle: "Error",
alertAcceptBody:
"Could not accept this ride. It may have been taken or expired.",
alertDeclineBody: "Could not decline this ride. Please try again.",
alertUpdateBody: "Could not update the ride. Please try again.",
},
},
services: {
car: { label: "Car", tagline: "An everyday ride, up to 4 seats." },
moto: {
label: "Moto",
tagline: "Beat the traffic — one passenger, no luggage.",
},
courier: {
label: "Courier",
tagline: "Send a parcel across town without riding along.",
},
chauffeur: {
label: "My Car",
tagline: "A driver comes to you and drives your own car.",
},
},
pois: {
nearbyTitle: "Nearby suggestions",
mall: "Mall",
hospital: "Hospital",
pharmacy: "Pharmacy",
restaurant: "Restaurant",
searching: "searching…",
noneNearby: "none nearby",
kmAway: "{km} km away",
routeAway: "{km} km · {min} min",
nearbyPlace: "Nearby place",
},
units: {
min: { zero: "0 min", one: "{n} min", other: "{n} min" },
h: "{n}h",
m: "{n}m",
hoursMinutes: "{h}h {m}m",
seats: { zero: "{n} seats", one: "{n} seat", other: "{n} seats" },
lbpSuffix: " L.B.P.",
},
months: {
jan: "Jan",
feb: "Feb",
mar: "Mar",
apr: "Apr",
may: "May",
jun: "Jun",
jul: "Jul",
aug: "Aug",
sep: "Sep",
oct: "Oct",
nov: "Nov",
dec: "Dec",
},
components: {
oauth: {
or: "Or",
googleLogoAlt: "Google logo",
alertFailTitle: "Google sign-in failed",
alertFailNoToken: "No token returned. Try again.",
alertFailFallback: "Please try again.",
},
otp: {
code: "Code",
codePlaceholder: "123456",
pasteCode: "Paste code from Gmail",
},
googleTextInput: {
searchAlt: "Search",
placeholder: "Where do you want to go?",
},
inputField: {
labelIconAlt: "{label} icon",
},
locationNotice: {
denied: {
title: "Location access is off",
body: "Waseel needs your location to show nearby drivers and set your pickup point.",
action: "Open Settings",
},
servicesOff: {
title: "Location services are off",
body: "Turn on location on your device, then try again.",
action: "Try Again",
},
unavailable: {
title: "Couldn't find your location",
body: "Move somewhere with a clearer signal, or set your pickup point manually.",
action: "Try Again",
},
},
map: {
destination: "Destination",
webUnavailable:
"Map is not available on web.\nRun on Android/iOS for the full experience.",
},
rideCard: {
mapAlt: "Map",
originAlt: "Origin",
destinationAlt: "Destination",
dateTime: "Date & Time",
driver: "Driver",
carSeats: "Car Seats",
fare: "Fare",
paymentStatus: "Payment Status",
paymentCash: "Cash · Pay to driver",
paymentPaid: "Paid by card",
paymentOther: "{status}",
},
rideLayout: {
goBack: "Go Back",
backArrowAlt: "Back arrow",
},
payment: {
paymentMethod: "Payment Method",
cash: "💵 Cash",
card: "💳 Card",
processing: "Processing...",
bookCash: "Book ride · Pay cash to driver",
confirmCard: "Confirm & Pay by Card",
checkAlt: "Check",
rideBooked: "Ride Booked!",
successBody:
"Thank you for your booking.\n Your reservation has been placed.\n",
cashInstruction: "Please have {lbp} ready.",
backHome: "Back Home",
alertPayCardTitle: "Pay by card",
alertPayCardBody: "Your card will be charged ${amount}.",
alertErrorTitle: "Error",
alertErrorBody:
"Something went wrong while booking your ride. Please try again.",
alertPaymentNotCompletedTitle: "Payment not completed",
alertPaymentNotCompletedBody:
"Your payment was cancelled or could not be verified. Please try again.",
alertProcessingTitle: "Error",
alertProcessingBody:
"Something went wrong while processing your payment. Please try again.",
},
driverCard: {
avatarAlt: "Driver Avatar",
starAlt: "Star",
dollarAlt: "Dollar",
carAlt: "Car",
seats: "{n} seats",
},
},
settings: {
title: "Settings",
maps: {
title: "Maps & Navigation",
description:
"Waseel uses your location to show nearby drivers and navigate to your pickup.",
statusGranted: "Granted",
statusDenied: "Not allowed",
statusBlocked: "Blocked",
statusUnknown: "Checking…",
openSettings: "Open Settings",
},
appearance: {
title: "Appearance",
description: "Choose how Waseel looks.",
light: "Light",
dark: "Dark",
system: "System",
},
safety: {
title: "Safety",
call112: "Call 112 — Emergency",
call112Description:
"Call Lebanon's emergency number for law enforcement, ambulance, or fire.",
callFailedTitle: "Could not place a call",
callFailedBody:
"No dialer is available on this device. Call 112 manually.",
proactive: {
title: "Proactive safety",
body: "Share your trip status and live location with trusted contacts, and ride with confidence knowing help is one tap away.",
},
verification: {
title: "Passenger verification",
body: "Riders and drivers verify their phone number and identity, so you always know who you're riding with.",
},
privacy: {
title: "Protecting your privacy",
body: "Your phone number and contact details stay hidden in chat. Messages are visible only between you and your driver for this ride.",
},
},
language: {
title: "Language",
description: "App language.",
en: "English",
ar: "العربية",
fr: "Français",
rtlRestartTitle: "Restart for Arabic",
rtlRestartBody:
"Arabic layout will apply fully the next time you open the app.",
},
keepAwake: {
title: "Do not lock screen",
description: "Keep the display on while the app is open.",
},
overlay: {
title: "Display over other apps",
description:
"Required so incoming ride alerts can appear over other apps.",
allow: "Allow display over other apps",
openedHint: "Opened system settings",
notAndroid: "Only available on Android.",
},
},
};