Implement Smart Location: auto-detect user location if preference is enabled, hide location button, and handle permission denial by resetting preference

This commit is contained in:
2026-03-01 12:15:08 -05:00
parent d0d75b8c98
commit 4d7b472c6c
20 changed files with 852 additions and 344 deletions

View File

@ -5,7 +5,11 @@
"noData": "No data available",
"select": "Select",
"clear": "Clear",
"clearSelection": "Clear selection"
"clearSelection": "Clear selection",
"notAvailable": "Not available",
"back": "Back",
"all": "All",
"retry": "Retry"
},
"navigation": {
"map": "Map",
@ -17,6 +21,24 @@
"discover": "Discover",
"profile": "Profile"
},
"menu": {
"management": "MANAGEMENT",
"adminPanel": "Admin Panel",
"driverPanel": "Driver Panel",
"operations": "OPERATIONS",
"favorites": "Favorites",
"support": "SUPPORT",
"sendReport": "Send Report",
"login": "LOGIN",
"logout": "LOGOUT",
"welcome": "HELLO,",
"guest": "GUEST",
"lightMode": "Light Mode",
"darkMode": "Dark Mode",
"translate": "Español (ES)",
"admin": "ADMIN",
"driver": "DRIVER"
},
"favorites": {
"title": "My Favorites",
"subtitle": "Save your favorite routes, taxis, and businesses for quick access.",
@ -27,22 +49,31 @@
"viewSchedules": "Tap to view schedules",
"tabs": {
"routes": "Routes",
"taxis": "Taxis",
"taxis": "Transport",
"businesses": "Businesses",
"coupons": "Offers"
"coupons": "Events"
},
"empty": {
"title": "Nothing saved yet",
"subtitle": "You don't have any favorites yet",
"description": "Explore routes, taxis, and businesses to save your favorites here",
"routes": "You don't have any saved favorite routes.",
"taxis": "You don't have any saved favorite taxis.",
"businesses": "You don't have any saved favorite businesses.",
"coupons": "You don't have any saved favorite offers."
"coupons": "You don't have any saved favorite events.",
"noResultsCategory": "You don't have favorites in this category"
},
"cta": {
"exploreNow": "Explore now",
"routes": "Explore Routes",
"taxis": "View Directory",
"businesses": "Discover Businesses",
"coupons": "View Offers"
}
"coupons": "View Events"
},
"count": "{count} saved | {count} saved",
"removeTitle": "Remove from favorites",
"availability": "Check availability",
"details": "View details →"
},
"header": {
"title": "SIBU",
@ -63,7 +94,15 @@
"selectRoute": "Select a route",
"route": "Route",
"stops": "stops",
"stop": "stop"
"stop": "stop",
"calculatingRoute": "Calculating real route...",
"viewRoutes": "view routes",
"arrivalTime": "Arrival time",
"availableRoutes": "Available Routes",
"busRoute": "Bus Route",
"showMyLocation": "Show my location",
"promo": "PROMO",
"search": "Search"
},
"schedules": {
"title": "Schedules",
@ -77,6 +116,12 @@
"schedules": "schedules",
"schedule": "schedule",
"departureTime": "Departure time",
"today": "Today",
"tomorrow": "Tomorrow",
"loading": "Loading schedules...",
"viewAll": "View all schedules",
"departing": "DEPARTING",
"daily": "Daily",
"types": {
"weekday": "Weekday",
"weekend": "Weekend",
@ -87,19 +132,23 @@
"title": "Offers",
"loadingCoupons": "Loading offers...",
"noCouponsAvailable": "No offers available",
"noResults": "No results found for your search.",
"off": "OFF",
"searchPlaceholder": "Search offers...",
"filterByCategory": "Filter by category",
"apply": "Apply",
"offerDetails": "Offer Details",
"description": "Description",
"noDescription": "No additional description.",
"validity": "Validity",
"category": "Category",
"viewLocation": "View location",
"validUntil": "Valid until",
"tomorrow": "Tomorrow",
"active": "Active",
"offersCount": "{count} offer | {count} offers"
"offersCount": "{count} offer | {count} offers",
"viewDetails": "View details",
"restaurant": "Restaurant"
},
"taxi": {
"title": "Transport Hub",
@ -115,7 +164,8 @@
"allZones": "All zones",
"dayShift": "Day",
"afternoonShift": "Afternoon",
"nightShift": "Night"
"nightShift": "Night",
"errorLoading": "Error loading transport section"
},
"shuttle": {
"title": "Tourist Trips & Shuttles",
@ -128,9 +178,21 @@
"filterRoute": "Filter by route",
"allRoutes": "All routes",
"tripType": "Trip type",
"oneWay": "Outbound",
"roundTrip": "Return",
"both": "Both"
"oneWay": "One way",
"roundTrip": "Round trip",
"both": "Both",
"detailTitle": "Trip Detail",
"origin": "Origin",
"destination": "Destination",
"departureTimes": "Departure Times",
"languages": "Languages",
"pricePerPerson": "Price per passenger",
"private": "Private",
"bookingInfo": "Booking & Information",
"contactOperator": "Contact the operator directly to confirm availability.",
"bookWhatsapp": "Book via WhatsApp",
"callOperator": "Call Operator",
"errorLoading": "Could not load trip information"
},
"busStop": {
"loadingDetails": "Loading bus stop details...",
@ -140,14 +202,149 @@
"accessible": "Accessible"
},
"discover": {
"title": "Discover",
"subtitle": "Explore the best places in Chiriqui",
"searchPlaceholder": "Explore the best places in Chiriqui",
"title": "Explore Chiriquí! 🌿",
"subtitle": "Discover the best places near you",
"searchPlaceholder": "Search restaurants, hotels...",
"filterLabel": "Filter by area:",
"allAreas": "All",
"loading": "Searching for treasures...",
"empty": "No places found in this area yet.",
"loading": "Loading places...",
"error": "Could not load places. Check your connection.",
"empty": "No places yet",
"emptyDesc": "Business and tourist places will be available here soon.",
"noResults": "No results",
"noResultsDesc": "We couldn't find any places matching that filter.",
"viewAll": "View all places",
"exploreMore": "Explore Place",
"tourism": "Tourism"
"tourism": "Tourism",
"results": "{count} place | {count} places",
"in": "in",
"lookingMore": "Looking for something else?",
"exploreWithoutFilters": "Explore without filters to discover everything",
"sections": {
"byArea": "🗺️ By Area",
"featured": "✨ Featured",
"allPlaces": "🏙️ All places"
},
"categories": {
"all": "All",
"restaurant": "Restaurant",
"hotel": "Hotel",
"cafe": "Cafe",
"commerce": "Commerce",
"tourism": "Tourism",
"drinks": "Drinks"
}
},
"business": {
"detailsTitle": "Explore Our History For Refined Cuisine And A Timeless Atmosphere",
"detailsDescription": "Our story is one of growth, exploration, and unforgettable culinary memories, where each chapter is served with elegance.",
"timelessHeritage": "Timeless Heritage",
"timelessHeritageDesc": "Signature dishes that evolve with local inspiration and culture.",
"worldClassDishes": "World Class Dishes",
"worldClassDishesDesc": "Gastronomic experience designed to delight the most demanding senses.",
"emotionElegance": "Emotion and Elegance",
"emotionEleganceDesc": "Evenings enhanced by the timeless charm of an exclusive atmosphere.",
"unmatchedExperience": "Unmatched Experience",
"unmatchedExperienceDesc": "Personalized service from a dedicated host for your comfort.",
"address": "Address",
"contact": "Contact",
"socialMedia": "Social Media",
"availableOffers": "Available Offers",
"viewBusiness": "View Business",
"loadingPremium": "Loading premium experience..."
},
"profile": {
"title": "Profile",
"myCoupons": "My Coupons",
"emptyCoupons": "You don't have any coupons",
"exploreOffers": "Explore the benefits we have for you for using SIBU.",
"viewOffers": "View Offers",
"viewCode": "View Code",
"usedAt": "Used on:",
"claimedAt": "Claimed on:",
"editProfile": "Edit Profile",
"photoOptional": "Optional photo",
"nameLabel": "Full Name",
"namePlaceholder": "Your name",
"passwordOptional": "New Password (Optional)",
"passwordPlaceholder": "Minimum 6 characters",
"passwordHint": "Leave blank if you don't want to change it.",
"cancel": "Cancel",
"save": "Save Changes",
"saving": "Saving...",
"qrTitle": "Discount Coupon",
"qrCode": "REDEMPTION CODE",
"qrInstructions": "Show this code to the establishment manager to validate your promotion.",
"understood": "Understood",
"pending": "Pending",
"redeemed": "Redeemed",
"expired": "Expired",
"updateSuccess": "Profile updated successfully",
"updateError": "Update error:",
"user": "User",
"logoutTitle": "Logout"
},
"auth": {
"back": "Back",
"brandingSubtitle": "Public Transport System",
"loginTab": "Login",
"registerTab": "Create Account",
"sessionExpired": "Your session has expired. Please log in again.",
"footer": "SIBU © 2026 • Chiriquí Transport System",
"googleLogin": "Continue with Google",
"googleRegister": "Sign up with Google",
"orEmail": "or with email",
"emailLabel": "Email address",
"emailPlaceholder": "you@email.com",
"passLabel": "Password",
"keepSession": "Keep me logged in",
"loggingIn": "Logging in...",
"creatingAccount": "Creating account...",
"noAccount": "Don't have an account?",
"registerHere": "Register here",
"hasAccount": "Already have an account?",
"loginHere": "Login",
"successTitle": "Successful registration!",
"fullNameLabel": "Full name",
"fullNamePlaceholder": "Your name",
"passMin8": "Minimum 8 characters",
"smartLocation": "Allow to detect my location automatically (Smart Location)",
"emailRegistered": "Email is already registered.",
"invalidCreds": "Incorrect email or password."
},
"routesView": {
"title": "Transport",
"busTab": "Bus Routes",
"taxiTab": "Local Taxis",
"originPlaceholder": "Origin City",
"destPlaceholder": "Destination City",
"searchBtn": "Search Routes",
"allCorregimientos": "All corregimientos",
"english": "English",
"availableRoutes": "Available Routes",
"recommendedDrivers": "Recommended Drivers",
"active": "ACTIVE",
"minutes": "min",
"km": "km",
"findSchedules": "View Schedules",
"contact": "Contact",
"noTaxis": "No taxis available in this area.",
"noRoutes": "No routes found for your search."
},
"splash": {
"subtitle": "Boquete Public Transport",
"starting": "Starting SIBU...",
"offline": "Starting offline mode...",
"verifying": "Verifying data...",
"ready": "Ready to use"
},
"report": {
"title": "Send Report",
"instruction": "Tell us what's happening or send us a suggestion. The administrative team will review your message.",
"placeholder": "Write your message here...",
"success": "Report sent successfully! Thanks for your collaboration.",
"error": "There was an error sending the report. Please try again.",
"cancel": "Cancel",
"send": "Send Report"
}
}