Files
Spanglish/frontend/src/i18n/locales/en.json
T
MichilisandClaude Opus 4.6 dafa3711f8 Fix post-login redirect when the session cookie is off-origin
Signing in showed the "Welcome back!" toast but never left /login. The
session cookie was host-only on the API subdomain, so the Next middleware
guard on the site origin saw no cookie and bounced /dashboard straight
back to /login?redirect=/dashboard.

- Add AUTH_COOKIE_DOMAIN, wiring Better Auth's crossSubDomainCookies so
  the cookie also reaches the site origin. Unset in dev, where localhost
  is single-host and must stay host-only.
- Navigate after authentication with a full page load, via a shared
  authRedirect helper: only a top-level request carries the httpOnly
  cookie. Used by the login, register, magic-link and Google flows.
- Show "Redirecting..." on the login and register pages and keep the
  submit button disabled until the browser replaces the page, instead of
  re-enabling it mid-navigation.
- Guard against a redirect loop with a sessionStorage marker. A React ref
  cannot do this: the full page load resets component state. If the
  destination bounces back, explain it rather than navigating again.
- Middleware: accept any *.session_token cookie so a cookiePrefix change
  cannot lock everyone out, and preserve the destination's query string.
- Trust any loopback port in dev, so reaching the dev server through a
  forwarded port does not fail Better Auth's CSRF origin check.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-07-29 20:45:05 +00:00

372 lines
11 KiB
JSON

{
"common": {
"loading": "Loading...",
"error": "An error occurred",
"save": "Save",
"cancel": "Cancel",
"delete": "Delete",
"edit": "Edit",
"create": "Create",
"search": "Search",
"filter": "Filter",
"submit": "Submit",
"back": "Back",
"next": "Next",
"viewAll": "View All",
"learnMore": "Learn More",
"moreInfo": "More Info"
},
"nav": {
"home": "Home",
"events": "Events",
"community": "Community",
"contact": "Contact",
"faq": "FAQ",
"joinEvent": "Join Event",
"login": "Login",
"register": "Sign Up",
"logout": "Logout",
"admin": "Admin",
"dashboard": "My Account"
},
"home": {
"hero": {
"title": "Practice English & Spanish in Asunción",
"subtitle": "Meet people. Learn languages. Have fun.",
"cta": "Join Next Event"
},
"about": {
"title": "What is Spanglish?",
"description": "Spanglish is a language exchange community where Spanish and English speakers come together to practice, learn, and connect. Our monthly events create a friendly environment for language learning through real conversations.",
"feature1": "Monthly Events",
"feature1Desc": "Regular meetups at welcoming venues",
"feature2": "Native Speakers",
"feature2Desc": "Practice with native English and Spanish speakers",
"feature3": "All Levels",
"feature3Desc": "Beginners to advanced are welcome"
},
"nextEvent": {
"title": "Next Event",
"noEvents": "No upcoming events scheduled",
"stayTuned": "Stay tuned for announcements!"
},
"gallery": {
"title": "Our Community"
},
"carousel": {
"title": "Moments from past events",
"subtitle": "A glimpse of our language exchange meetups",
"cta": "See upcoming events",
"previous": "Previous image",
"next": "Next image"
},
"newsletter": {
"title": "Stay Updated",
"description": "Subscribe to get notified about upcoming events",
"placeholder": "Enter your email",
"button": "Subscribe",
"success": "Thanks for subscribing!",
"error": "Subscription failed. Please try again."
},
"faq": {
"title": "Frequently Asked Questions",
"seeFull": "See full FAQ"
}
},
"events": {
"title": "Events",
"upcoming": "Upcoming Events",
"past": "Past Events",
"noEvents": "No events found",
"details": {
"date": "Date",
"time": "Time",
"location": "Location",
"price": "Price",
"free": "Free",
"capacity": "Capacity",
"spotsLeft": "spots left",
"soldOut": "Sold Out",
"cancelled": "Cancelled",
"eventEnded": "Event Ended"
},
"booking": {
"join": "Join Event",
"book": "Book Now",
"register": "Register"
}
},
"booking": {
"title": "Book Your Spot",
"form": {
"personalInfo": "Your Information",
"fullName": "Full Name",
"fullNamePlaceholder": "Enter your full name",
"firstName": "First Name",
"firstNamePlaceholder": "Enter your first name",
"lastName": "Last Name",
"lastNamePlaceholder": "Enter your last name",
"email": "Email Address",
"emailPlaceholder": "your@email.com",
"phone": "Phone / WhatsApp",
"phonePlaceholder": "+595 XXX XXX XXX",
"preferredLanguage": "Preferred Language",
"paymentMethod": "Payment Method",
"ruc": "RUC (Tax ID)",
"rucPlaceholder": "12345678-9",
"rucOptional": "Optional - for invoice",
"reserveSpot": "Reserve My Spot",
"proceedPayment": "Proceed to Payment",
"termsAgreePart1": "I agree to the ",
"termsOfService": "Terms of Service",
"termsAgreePart2": " and ",
"privacyPolicy": "Privacy Policy",
"termsAgreePart3": ".",
"soldOutMessage": "This event is fully booked. Check back later or browse other events.",
"errors": {
"nameRequired": "Please enter your full name",
"firstNameRequired": "Please enter your first name",
"lastNameRequired": "Please enter your last name",
"lastNameTooShort": "Last name must be at least 2 characters",
"phoneTooShort": "Phone number must be at least 6 digits",
"emailInvalid": "Please enter a valid email address",
"phoneRequired": "Phone number is required",
"bookingFailed": "Booking failed. Please try again.",
"rucInvalidFormat": "Invalid format. Example: 12345678-9",
"rucInvalidCheckDigit": "Invalid RUC. Please verify the number.",
"paymentMethodRequired": "Please select a payment method.",
"termsRequired": "You must agree to the Terms of Service and Privacy Policy to continue."
}
},
"summary": {
"title": "Booking Summary",
"event": "Event",
"date": "Date",
"price": "Price",
"total": "Total"
},
"confirm": "Confirm Booking",
"success": {
"title": "Booking Confirmed!",
"message": "Your spot has been reserved successfully!",
"description": "We've sent a confirmation to your email.",
"event": "Event",
"date": "Date",
"time": "Time",
"location": "Location",
"ticketId": "Ticket ID",
"instructions": "Please save this ticket ID. You'll need it at check-in.",
"cashNote": "Payment Required",
"cashDescription": "Please bring the exact amount in cash to pay at the event entrance.",
"cardNote": "You will be redirected to complete your card payment shortly.",
"lightningNote": "A Lightning invoice will be generated for payment.",
"emailSent": "A confirmation email has been sent to your inbox.",
"browseEvents": "Browse More Events",
"backHome": "Back to Home"
}
},
"dashboard": {
"payment": {
"received": "Payment received",
"receivedConfirmShortly": "Payment received. We will confirm it shortly.",
"receivedConfirmSoon": "Payment received. We will confirm it shortly.",
"confirmForEvent": "We will confirm your {amount} payment for {event} shortly. Nothing else needed."
}
},
"community": {
"title": "Join Our Community",
"subtitle": "Connect with us on social media and stay updated",
"whatsapp": {
"title": "WhatsApp Group",
"description": "Join our WhatsApp group for event updates and community chat",
"button": "Join WhatsApp"
},
"instagram": {
"title": "Instagram",
"description": "Follow us for photos, stories, and announcements",
"button": "Follow Us"
},
"telegram": {
"title": "Telegram Channel",
"description": "Join our Telegram channel for news and announcements",
"button": "Join Telegram"
},
"tiktok": {
"title": "TikTok",
"description": "Watch our videos and follow us for fun content",
"button": "Follow Us"
},
"guidelines": {
"title": "Community Rules",
"items": [
"Respect above all. Treat others the way you would like to be treated.",
"We are all learning, let's help each other practice.",
"Use this space to practice the event languages, mistakes are part of the process.",
"Keep an open attitude to meet new people and have fun.",
"This is a space to connect, please avoid spam and unsolicited promotions."
]
},
"volunteer": {
"title": "Become a Volunteer",
"description": "Help us organize events and grow the community",
"button": "Contact Us"
}
},
"contact": {
"title": "Contact Us",
"subtitle": "Have questions? We'd love to hear from you.",
"form": {
"name": "Your Name",
"email": "Your Email",
"message": "Your Message",
"submit": "Send Message"
},
"success": "Message sent successfully!",
"error": "Failed to send message. Please try again.",
"info": {
"email": "Email",
"social": "Social Media"
}
},
"auth": {
"login": {
"title": "Welcome Back",
"subtitle": "Sign in to your account",
"email": "Email",
"password": "Password",
"submit": "Sign In",
"redirecting": "Redirecting...",
"redirectBlocked": "You're signed in, but we couldn't open that page.",
"redirectRetry": "Try again",
"noAccount": "Don't have an account?",
"register": "Sign Up"
},
"register": {
"title": "Create Account",
"subtitle": "Join the Spanglish community",
"name": "Full Name",
"email": "Email",
"password": "Password (min. 8 characters)",
"phone": "Phone (optional)",
"submit": "Create Account",
"hasAccount": "Already have an account?",
"login": "Sign In"
},
"errors": {
"invalidCredentials": "Invalid email or password",
"emailExists": "Email already registered"
}
},
"admin": {
"privacy": {
"hide": "Hide Stats",
"show": "Show Stats"
},
"dashboard": {
"title": "Dashboard",
"welcome": "Welcome back",
"stats": {
"users": "Total Users",
"events": "Total Events",
"tickets": "Total Tickets",
"revenue": "Total Revenue"
}
},
"nav": {
"dashboard": "Dashboard",
"events": "Events",
"bookings": "Bookings",
"tickets": "Tickets",
"users": "Users",
"payments": "Payments",
"contacts": "Messages",
"emails": "Emails",
"gallery": "Gallery",
"photos": "Photos",
"settings": "Settings"
},
"events": {
"title": "Manage Events",
"create": "Create Event",
"edit": "Edit Event",
"delete": "Delete Event",
"publish": "Publish",
"unpublish": "Unpublish"
},
"tickets": {
"title": "Manage Tickets",
"checkin": "Check In",
"cancel": "Cancel Ticket",
"status": {
"pending": "Pending",
"confirmed": "Confirmed",
"cancelled": "Cancelled",
"checkedIn": "Checked In"
}
},
"users": {
"title": "Manage Users",
"role": "Role",
"roles": {
"admin": "Admin",
"organizer": "Organizer",
"staff": "Staff",
"marketing": "Marketing",
"user": "User"
}
},
"payments": {
"title": "Payments",
"confirm": "Confirm Payment",
"refund": "Refund",
"status": {
"pending": "Pending",
"paid": "Paid",
"refunded": "Refunded",
"failed": "Failed"
}
}
},
"footer": {
"tagline": "Language exchange community in Asunción",
"links": "Quick Links",
"social": "Follow Us",
"copyright": "© {year} Spanglish. All rights reserved.",
"legal": {
"title": "Legal",
"terms": "Terms & Conditions",
"privacy": "Privacy Policy",
"refund": "Refund Policy"
}
},
"legalPage": {
"backToHome": "Back to Home",
"lastUpdated": "Last updated: {date}",
"backToTop": "Back to top"
},
"linktree": {
"tagline": "Language Exchange Community",
"nextEvent": "Next Event",
"noEvents": "No upcoming events",
"moreInfo": "More info",
"joinCommunity": "Join Our Community",
"visitWebsite": "Visit Our Website",
"whatsapp": {
"title": "WhatsApp Community",
"subtitle": "Chat & event updates"
},
"telegram": {
"title": "Telegram Channel",
"subtitle": "News & announcements"
},
"instagram": {
"title": "Instagram",
"subtitle": "Photos & stories"
},
"tiktok": {
"title": "TikTok",
"subtitle": "Videos & fun content"
}
}
}