/** * English translations * Note: Skateboarding trick names and terminology stay in English */ const en = { // Common common: { loading: 'Loading...', error: 'Error', save: 'Save', cancel: 'Cancel', delete: 'Delete', edit: 'Edit', create: 'Create', submit: 'Submit', close: 'Close', back: 'Back', next: 'Next', done: 'Done', search: 'Search', filter: 'Filter', sort: 'Sort', share: 'Share', copy: 'Copy', copied: 'Copied!', viewAll: 'View All', seeMore: 'See More', showMore: 'Show More', showLess: 'Show Less', noResults: 'No results found', tryAgain: 'Try Again', learnMore: 'Learn More', getStarted: 'Get Started', yes: 'Yes', no: 'No', or: 'or', and: 'and', free: 'Free', new: 'New', popular: 'Popular', featured: 'Featured', verified: 'Verified', sats: 'sats', clear: 'Clear', clearFilters: 'Clear Filters', clearAll: 'Clear All', }, // Navigation nav: { home: 'Home', map: 'Shops & Spots', lab: 'The Lab', events: 'Events', crews: 'Crews', wallet: 'Wallet', settings: 'Settings', more: 'More', rewards: 'Rewards', stats: 'Community Stats', about: 'About', food: 'Food', marketplace: 'Marketplace', }, // Authentication auth: { login: 'Log in', logout: 'Log out', signUp: 'Sign Up', signUpTitle: 'New to Nostr?', signUpDesc: "Create a new account to get started. It's free and open.", orLogIn: 'Or log in', loginWithExtension: 'Login with Extension', loginWithAmber: 'Login with Amber (Android)', loginWithKey: 'Secret Key (nsec) or Recovery Phrase', loginWithBunker: 'Login with Nostr Connect', bunkerUri: 'Bunker Connection String', openAmber: 'Open Amber', connectToBunker: 'Connect to Bunker', noExtension: 'No extension detected.', extensionHelp: 'Try using the Sign Up button above to create a new account, or use the Amber, Key or Bunker tabs if you have existing credentials.', amberDesc: 'Amber is a secure Nostr signer app for Android devices. Click the button below to open Amber and authorize access.', bunkerDesc: 'Access your account from any device using a remote signer (bunker). Your keys stay safe on the server, never exposed to websites.', keyPlaceholder: 'nsec1... or your 12-word recovery phrase', keyHint: 'You can paste either your nsec key or 12-word recovery phrase', uploadKeyFile: 'Upload Your Key File', loggingIn: 'Logging in...', connecting: 'Connecting...', verifying: 'Verifying...', }, // Backup Reminder backup: { title: 'Backup Your Account!', subtitle: 'Important security reminder', message: 'Your recovery phrase or secret key (nsec) is the ONLY way to access your account from other devices.', warning: 'If you lose it, you lose your account forever!', backupNow: 'Backup Now', confirmed: "I've Backed It Up", remindLater: 'Remind me later', }, // PWA Install pwa: { installTitle: 'Install SkateSpots', installSubtitle: 'Get the full app experience', addToHomeScreen: 'Add to Home Screen', installApp: 'Install App', maybeLater: 'Maybe later', gotIt: 'Got it!', benefits: { fast: 'Lightning Fast', offline: 'Works Offline', fullAccess: 'Full Access', }, iosStep1: 'Tap the Share button', iosStep1Hint: 'at the bottom of Safari', iosStep2: 'Scroll and tap "Add to Home Screen"', iosStep2Hint: 'in the share menu', iosStep3: 'Tap "Add" to install', iosStep3Hint: 'The app will appear on your home screen', androidStep1: 'Tap the menu button', androidStep1Hint: '(three dots) in your browser', androidStep2: 'Select "Add to Home Screen"', androidStep2Hint: 'or "Install App"', androidStep3: 'Confirm to install', androidStep3Hint: 'The app will appear on your home screen', tagline: 'Free • Works offline • Fast & reliable', }, // Home/Index Page home: { tagline: 'Community-Powered • Relay-Based', title: 'SKATE SPOTS', subtitle: 'Discover Spots • Meet Up • Learn Tricks • Support Locals', description: 'Real skateboarding happens offline - this tool helps you find it.', betaWarning: 'BETA - Under Construction • Use at Your Own Risk', pwaHint: 'Progressive Web App - Install on Your Device', exploreMap: 'Explore Map', addSpot: 'Add Spot', globalSpots: 'Global Spots', openCommunity: 'Open Community', lightningZaps: 'Lightning Zaps', featuredSpots: 'Featured Spots', featuredSpotsDesc: 'Community-verified skate spots from around the world', upcomingEvents: 'Upcoming Events', upcomingEventsDesc: 'Contests, meetups, and sessions happening soon', noSpotsYet: 'No spots found yet', noSpotsHint: 'Be the first to add a skate spot!', noEventsYet: 'No upcoming events', noEventsHint: 'Check back later or create one!', theLab: 'The Lab', theLabDesc: 'Learn tricks, find coaches, and level up your skating', coaches: 'Coaches', coachesDesc: 'Learn from experienced skaters who can help you progress', filmers: 'Filmers', filmersDesc: 'Connect with filmers to capture your best clips', findCoach: 'Find a Coach', becomeCoach: 'Become a Coach', findFilmer: 'Find a Filmer', becomeFilmer: 'Become a Filmer', viewAllSpots: 'View All Spots', viewAllEvents: 'View All Events', createEvent: 'Create Event', readyToShare: 'Ready to Share?', readyToShareDesc: 'Help the skateboarding community grow by adding your favorite spots. Every location you share helps fellow skaters discover new places to ride.', }, // Map Page mapPage: { title: 'Shops & Spots', spots: 'Spots', shops: 'Shops', filters: 'Filters', listView: 'List', mapView: 'Map', nearMe: 'Near Me', searchPlaceholder: 'Search spots...', noSpotsInArea: 'No spots in this area', zoomIn: 'Zoom In', zoomOut: 'Zoom Out', myLocation: 'My Location', locationsFound: '{{count}} locations found', spotsOnly: 'Spots only', shopsOnly: 'Shops only', spotsAndShops: 'Spots & Shops', noSpotsMatch: 'No spots match your filters.', noSpotsYet: 'No spots have been added yet.', addFirstSpot: 'Add First Spot', }, // Spots spots: { addSpot: 'Add Spot', editSpot: 'Edit Spot', spotDetails: 'Spot Details', spotName: 'Spot Name', spotType: 'Spot Type', description: 'Description', location: 'Location', address: 'Address', photos: 'Photos', addPhotos: 'Add Photos', obstacles: 'Obstacles', features: 'Features', bustLevel: 'Bust Level', bestTime: 'Best Time', tips: 'Tips', reviews: 'Reviews', addReview: 'Add Review', reportSpot: 'Report Spot', directions: 'Directions', shareSpot: 'Share Spot', createdBy: 'Created by', lastUpdated: 'Last updated', // Spot types (keep some English as they're skate terms) types: { park: 'Skatepark', street: 'Street Spot', diy: 'DIY Spot', plaza: 'Plaza', indoor: 'Indoor', bowl: 'Bowl', vert: 'Vert', miniramp: 'Mini Ramp', }, // Bust levels bustLevels: { chill: 'Chill', moderate: 'Moderate', sketchy: 'Sketchy', heavy: 'Heavy', }, }, // Events events: { title: 'Skate Events', createEvent: 'Create Event', editEvent: 'Edit Event', eventDetails: 'Event Details', eventName: 'Event Name', eventType: 'Event Type', date: 'Date', time: 'Time', startDate: 'Start Date', endDate: 'End Date', venue: 'Venue', organizer: 'Organizer', attendees: 'Attendees', going: 'Going', interested: 'Interested', rsvp: 'RSVP', ticketPrice: 'Ticket Price', freeEntry: 'Free Entry', register: 'Register', moreInfo: 'More Info', upcomingEvents: 'Upcoming', pastEvents: 'Past', noEvents: 'No events found', findEvents: 'Find contests, demos, sessions, and more', searchPlaceholder: 'Search events...', loginToCreate: 'Login to create events', noEventsMatch: 'No upcoming events match your filters.', noUpcoming: 'No upcoming events found.', noPast: 'No past events found.', // Event types types: { contest: 'Contest', session: 'Session', meetup: 'Meetup', premiere: 'Video Premiere', workshop: 'Workshop', demo: 'Demo', jam: 'Jam', }, }, // Shops shops: { title: 'Skate Shops', addShop: 'Add Shop', editShop: 'Edit Shop', shopDetails: 'Shop Details', shopName: 'Shop Name', hours: 'Hours', phone: 'Phone', website: 'Website', services: 'Services', brands: 'Brands', supportLocal: 'Support Local', }, // Wallet wallet: { title: 'Wallet', balance: 'Balance', send: 'Send', receive: 'Receive', transactions: 'Transactions', history: 'History', noTransactions: 'No transactions yet', sendSats: 'Send Sats', receiveSats: 'Receive Sats', amount: 'Amount', recipient: 'Recipient', lightning: 'Lightning', onChain: 'On-chain', invoice: 'Invoice', address: 'Address', scanQR: 'Scan QR', paste: 'Paste', payInvoice: 'Pay Invoice', createInvoice: 'Create Invoice', copied: 'Copied to clipboard!', insufficientFunds: 'Insufficient funds', paymentSent: 'Payment sent!', paymentReceived: 'Payment received!', cashu: { title: 'Cashu Wallet', tokens: 'Tokens', mint: 'Mint', mints: 'Mints', manageMints: 'Manage Mints', addMint: 'Add Mint', removeMint: 'Remove Mint', defaultMint: 'Default Mint', backup: 'Backup', restore: 'Restore', recoveryPhrase: 'Recovery Phrase', viewRecoveryPhrase: 'View Recovery Phrase', seedWarning: 'This is like your Nostr nsec - keep it secret and backed up!', }, }, // Settings settings: { title: 'Settings', profile: 'Profile', editProfile: 'Edit Profile', account: 'Account', security: 'Security', relays: 'Relays', appearance: 'Appearance', language: 'Language', notifications: 'Notifications', privacy: 'Privacy', about: 'About', help: 'Help', feedback: 'Feedback', version: 'Version', // Profile fields displayName: 'Display Name', username: 'Username', bio: 'Bio', website: 'Website', lightningAddress: 'Lightning Address', profilePicture: 'Profile Picture', banner: 'Banner', saveProfile: 'Save Profile', // Security backupKeys: 'Backup Keys', exportKeys: 'Export Keys', secretKey: 'Secret Key', publicKey: 'Public Key', showSecretKey: 'Show Secret Key', hideSecretKey: 'Hide Secret Key', copyKey: 'Copy Key', keysBackedUp: "You've confirmed that your keys are safely backed up.", keysNotBackedUp: 'Make sure to backup your recovery phrase or secret key!', // Language selectLanguage: 'Select Language', english: 'English', spanish: 'Spanish', }, // Lab / Coaches lab: { title: 'The Lab', subtitle: 'Level up your skating', coaches: 'Coaches', filmers: 'Filmers', findCoach: 'Find a Coach', becomeCoach: 'Become a Coach', findFilmer: 'Find a Filmer', becomeFilmer: 'Become a Filmer', hourlyRate: 'Hourly Rate', experience: 'Experience', specialties: 'Specialties', availability: 'Availability', bookSession: 'Book a Session', contactCoach: 'Contact Coach', noCoaches: 'No coaches found in your area', noFilmers: 'No filmers found in your area', }, // Rewards rewards: { title: 'Rewards', yourPoints: 'Your Points', earnPoints: 'Earn Points', redeemPoints: 'Redeem Points', leaderboard: 'Leaderboard', achievements: 'Achievements', dailyTasks: 'Daily Tasks', weeklyTasks: 'Weekly Tasks', }, // Zaps zaps: { zapButton: 'Zap', sendZap: 'Send Zap', zapAmount: 'Zap Amount', customAmount: 'Custom Amount', addMessage: 'Add a message (optional)', sending: 'Sending...', sent: 'Zap sent!', failed: 'Zap failed', received: 'You received a zap!', }, // Errors errors: { somethingWentWrong: 'Something went wrong', tryAgainLater: 'Please try again later', notFound: 'Not found', pageNotFound: 'Page not found', unauthorized: 'Unauthorized', loginRequired: 'Please log in to continue', networkError: 'Network error', checkConnection: 'Please check your internet connection', invalidInput: 'Invalid input', requiredField: 'This field is required', }, // Time/Date time: { today: 'Today', yesterday: 'Yesterday', tomorrow: 'Tomorrow', thisWeek: 'This week', nextWeek: 'Next week', thisMonth: 'This month', justNow: 'Just now', minutesAgo: '{{count}} minutes ago', hoursAgo: '{{count}} hours ago', daysAgo: '{{count}} days ago', }, // Footer footer: { vibedWith: 'Vibed with', poweredBy: 'Powered by', openSource: 'Open Source', contribute: 'Contribute', decentralized: 'Decentralized', communityOwned: 'Community Owned', }, // Create Spot Page createSpot: { title: 'Add a Skate Spot', subtitle: 'Share a skateboarding spot with the community', backToMap: 'Back to Map', namePlaceholder: 'e.g., Hollywood High School', descriptionPlaceholder: 'Describe the spot, obstacles, best times to skate, security info, etc.', addressPlaceholder: 'e.g., 1521 N Highland Ave, Los Angeles, CA', selectType: 'Select spot type', selectBustLevel: 'Select bust level', uploadPhotos: 'Upload', dragDrop: 'Drag and drop or click to upload', maxPhotos: 'Max 5 photos', publishing: 'Publishing...', success: 'Spot published successfully!', error: 'Failed to publish spot', locationRequired: 'Please select a location on the map', useCurrentLocation: 'Use my current location', pickOnMap: 'Pick Location on Map', loginToAdd: 'You need to log in to add a skate spot.', requiredFields: 'Tell us about this spot. All fields marked with * are required.', coordinates: 'Coordinates', latitudePlaceholder: 'Latitude (e.g., 34.1012)', longitudePlaceholder: 'Longitude (e.g., -118.3389)', gettingLocation: 'Getting location...', accessType: 'Access Type', publicTitle: 'Public - Open to Everyone', publicDesc: 'Skate parks, public plazas, street spots', privateTitle: 'Private Property - Permission Needed', privateDesc: 'Backyard ramps, private land, gated spots', localsTitle: 'Ask Locals First', localsDesc: "Respect the spot, don't blow it out", contactInfo: 'Contact Information', contactPlaceholder: 'e.g., Phone number, Instagram, email...', contactHintPrivate: 'How should people contact you for permission?', contactHintLocals: 'How should people reach out to ask about the spot?', }, // Create Event Page createEvent: { title: 'Create an Event', subtitle: 'Organize a skateboarding event for the community', backToEvents: 'Back to Events', namePlaceholder: 'e.g., Summer Skate Session', descriptionPlaceholder: 'Describe the event, what to expect, rules, prizes, etc.', selectType: 'Select event type', venuePlaceholder: 'e.g., Venice Beach Skatepark, CA', selectDate: 'Select date', selectTime: 'Select time', ticketPricePlaceholder: 'Leave empty for free events', publishing: 'Publishing...', success: 'Event published successfully!', error: 'Failed to publish event', loginToCreate: 'You need to log in to create an event.', requiredFields: 'Tell us about this event. All fields marked with * are required.', startDateTime: 'Start Date & Time', endDateTime: 'End Date & Time (optional)', coordinatesOptional: 'Coordinates (optional)', coverImage: 'Cover Image', uploadCover: 'Upload cover image', nip05Recommended: 'NIP-05 Verification Recommended', nip05Desc: 'Add a NIP-05 identifier to your profile to verify your identity and build trust with attendees.', addNip05: 'Add NIP-05 in Settings', }, // Spot Detail Page spotDetail: { postedBy: 'Posted by', getDirections: 'Get Directions', reviews: 'Reviews', noReviews: 'No reviews yet', beFirstReview: 'Be the first to review this spot!', writeReview: 'Write a Review', submitReview: 'Submit Review', rating: 'Rating', reviewPlaceholder: 'Share your experience at this spot...', relatedSpots: 'Nearby Spots', }, // Event Detail Page eventDetail: { organizedBy: 'Organized by', eventInfo: 'Event Info', location: 'Location', dateTime: 'Date & Time', price: 'Price', attendeeCount: '{{count}} going', interested: 'Interested', going: 'Going', notGoing: 'Not Going', share: 'Share Event', }, // Profile Page profile: { posts: 'Posts', spots: 'Spots', events: 'Events', following: 'Following', followers: 'Followers', editProfile: 'Edit Profile', follow: 'Follow', unfollow: 'Unfollow', noPostsYet: 'No posts yet', noBio: 'No bio yet', zapProfile: 'Zap this skater', }, // About Page about: { title: 'About SkateSpots', subtitle: 'A decentralized skateboarding community', whatIs: 'What is SkateSpots?', whatIsDesc: 'SkateSpots is a community-powered platform for discovering skateboarding locations worldwide. Built on Nostr, it gives skaters true ownership of their data.', features: 'Features', featuresDesc: 'Find spots, create events, connect with coaches, and support your local skate shops—all in one place.', nostr: 'Built on Nostr', nostrDesc: 'Nostr is a simple, open protocol that enables truly censorship-resistant global communication. Your account and data belong to you.', openSource: 'Open Source', openSourceDesc: 'SkateSpots is completely open source. Contribute, fork, or run your own instance.', lightning: 'Lightning Payments', lightningDesc: 'Zap your favorite skaters, coaches, and content creators with Bitcoin Lightning payments.', }, // FAQ Page faq: { title: 'Frequently Asked Questions', subtitle: 'Everything you need to know about SkateSpots', whatIsNostr: 'What is Nostr?', whatIsNostrAnswer: 'Nostr is an open protocol for decentralized social networking. Unlike traditional platforms, you own your data and identity.', howToStart: 'How do I get started?', howToStartAnswer: 'Click "Sign Up" to create a new Nostr account, or "Log In" if you already have one. You can use a browser extension, mobile app, or secret key.', whatAreZaps: 'What are Zaps?', whatAreZapsAnswer: 'Zaps are Bitcoin Lightning tips you can send to other users. They\'re a way to show appreciation for great content or support creators.', howToAddSpot: 'How do I add a spot?', howToAddSpotAnswer: 'Log in to your account, click "Add Spot" and fill in the details including location, photos, and description.', isItFree: 'Is SkateSpots free?', isItFreeAnswer: 'Yes! SkateSpots is completely free to use. You can optionally send Zaps (Bitcoin tips) to other users.', canIEditSpot: 'Can I edit or delete my spots?', canIEditSpotAnswer: 'Yes, you can edit spots you\'ve created. Due to the decentralized nature of Nostr, deletion requests are sent but some relays may retain data.', }, // Onboarding onboarding: { welcome: 'Welcome to SkateSpots!', welcomeDesc: 'Let\'s get you set up in just a few steps.', step1Title: 'Create Your Account', step1Desc: 'Your Nostr keys are being generated. This is like a password that you control.', step2Title: 'Backup Your Keys', step2Desc: 'Save your recovery phrase somewhere safe. This is the only way to recover your account!', step3Title: 'Set Up Your Profile', step3Desc: 'Tell the community about yourself.', step4Title: 'You\'re Ready!', step4Desc: 'Start exploring spots, events, and connecting with skaters.', skipForNow: 'Skip for now', continueToApp: 'Continue to App', }, // Lab Page labPage: { title: 'The Lab', subtitle: 'Learn tricks. Capture moments. Connect with other Skaters', coachesTab: 'Coaching', filmersTab: 'Filming', offerCoaching: 'OFFER COACHING', offerFilming: 'OFFER FILMING', loginToOffer: 'Login to offer services', whatToLearn: 'WHAT DO YOU WANT TO LEARN?', whatContent: 'WHAT TYPE OF CONTENT?', selectSkillsDesc: "Select skills and we'll match you with coaches", selectFilmingDesc: "Select filming services you're looking for", searchPlaceholder: 'Search by name, location, or skills...', noServicesYet: 'NO SERVICES YET', beFirstToOffer: 'Be the first to offer coaching or filming services to the community!', skills: 'Skills', rate: 'Rate', perHour: '/hour', contact: 'Contact', viewProfile: 'View Profile', noProfilesYet: 'No profiles yet', beFirstCoach: 'Be the first to register as a coach!', beFirstFilmer: 'Be the first to register as a filmer!', yearsExperience: 'years experience', }, // Become Coach/Filmer Forms becomeCoach: { title: 'Become a Coach', subtitle: 'Share your skills and help other skaters progress', bioPlaceholder: 'Tell us about your skating background and teaching style...', skillsPlaceholder: 'e.g., kickflip, heelflip, grinds, bowls', selectSkills: 'Select skills you can teach', hourlyRate: 'Hourly Rate (sats)', ratePlaceholder: 'e.g., 5000', locationPlaceholder: 'Your city or area', publishing: 'Publishing profile...', success: 'Coach profile created!', error: 'Failed to create profile', }, becomeFilmer: { title: 'Become a Filmer', subtitle: 'Capture the best clips for the community', bioPlaceholder: 'Tell us about your filming experience and equipment...', specialtiesPlaceholder: 'e.g., fisheye, long lens, drone, editing', selectSpecialties: 'Select your specialties', hourlyRate: 'Hourly Rate (sats)', ratePlaceholder: 'e.g., 5000', locationPlaceholder: 'Your city or area', portfolioUrl: 'Portfolio URL', portfolioPlaceholder: 'Link to your work (YouTube, Instagram, etc.)', publishing: 'Publishing profile...', success: 'Filmer profile created!', error: 'Failed to create profile', }, // Skills (keep in English as skate terminology) skills: { kickflip: 'Kickflip', heelflip: 'Heelflip', ollie: 'Ollie', treflip: '360 Flip', shuvit: 'Shuvit', hardflip: 'Hardflip', varial: 'Varial', nollie: 'Nollie', fakie: 'Fakie', switch: 'Switch', grind: 'Grind', slide: 'Slide', manual: 'Manual', transition: 'Transition', bowl: 'Bowl', vert: 'Vert', street: 'Street', flatground: 'Flatground', }, // Food Spots food: { title: 'Food Spots', subtitle: 'Fuel up before or after your session', addFood: 'Add Food Spot', categories: { all: 'All', burgers: 'Burgers', pizza: 'Pizza', tacos: 'Tacos', coffee: 'Coffee', drinks: 'Drinks', snacks: 'Snacks', }, skaterFriendly: 'Skater Friendly', nearSpots: 'Near Skate Spots', }, // Marketplace marketplace: { title: 'Marketplace', subtitle: 'Buy, sell, and trade skate gear', addListing: 'Add Listing', condition: 'Condition', conditions: { new: 'New', likeNew: 'Like New', good: 'Good', fair: 'Fair', poor: 'Poor', }, categories: { all: 'All', decks: 'Decks', trucks: 'Trucks', wheels: 'Wheels', bearings: 'Bearings', shoes: 'Shoes', clothing: 'Clothing', protection: 'Protection', other: 'Other', }, priceRange: 'Price Range', location: 'Location', seller: 'Seller', contact: 'Contact Seller', makeOffer: 'Make Offer', sold: 'Sold', available: 'Available', gear: 'Gear', sellGear: 'Sell Gear', wantToBuy: 'Want to Buy', }, // Weather weather: { title: 'Weather', current: 'Current Conditions', forecast: 'Forecast', humidity: 'Humidity', wind: 'Wind', feelsLike: 'Feels like', goodForSkating: 'Good for skating!', notIdeal: 'Not ideal conditions', allWeather: 'All Weather', goodWeather: 'Good Weather', perfectWeather: 'Perfect Weather', }, }; export default en;