diff --git a/src/i18n/locales/en.ts b/src/i18n/locales/en.ts index d0dd194..132762e 100644 --- a/src/i18n/locales/en.ts +++ b/src/i18n/locales/en.ts @@ -1,331 +1,341 @@ -import type { LocaleMessages } from '../types' +import type { LocaleMessages } from "../types"; const messages: LocaleMessages = { nav: { - home: 'Home', - title: 'Virtual Realm', - directory: 'Directory', - faq: 'FAQ', - events: 'Events', - market: 'Market', - chat: 'Chat', - login: 'Login', - logout: 'Logout' + home: "Home", + title: "Virtual Realm", + directory: "Directory", + faq: "FAQ", + events: "Events", + market: "Market", + chat: "Chat", + login: "Login", + logout: "Logout", }, common: { - loading: 'Loading...', - error: 'An error occurred', - success: 'Operation successful', + loading: "Loading...", + error: "An error occurred", + success: "Operation successful", nav: { - profile: 'Profile', - preferences: 'Preferences', - profileDescription: 'Your Nostr identity and display name.', - profileLoggedOutDescription: 'Sign in or change your preferences.', - login: 'Log in', - menu: 'Menu', - backToHub: 'Back to hub', - hub: 'Hub', - theme: 'Theme', - themeLight: 'Light', - themeDark: 'Dark', - themeSystem: 'System', - colorScheme: 'Color scheme', - palette_catppuccin: 'Catppuccin', - palette_countrysidecastle: 'Countryside Castle', - palette_darkmatter: 'Dark Matter', - palette_emeraldforest: 'Emerald Forest', - palette_lightgreen: 'Light Green', - palette_neobrut: 'Neo Brutalist', - palette_starrynight: 'Starry Night', - language: 'Language', - currency: 'Currency', - currencyComingSoon: 'Currency picker — coming soon', - currencyComingSoonDescription: 'A preferred-currency setting (sats/USD/EUR) is on the roadmap.' - } + profile: "Profile", + preferences: "Preferences", + profileDescription: "Your Nostr identity and display name.", + profileLoggedOutDescription: "Sign in or change your preferences.", + login: "Log in", + menu: "Menu", + backToHub: "Back to hub", + hub: "Hub", + theme: "Theme", + themeLight: "Light", + themeDark: "Dark", + themeSystem: "System", + colorScheme: "Color scheme", + palette_catppuccin: "Catppuccin", + palette_countrysidecastle: "Countryside Castle", + palette_darkmatter: "Dark Matter", + palette_emeraldforest: "Emerald Forest", + palette_lightgreen: "Light Green", + palette_neobrut: "Neo Brutalist", + palette_starrynight: "Starry Night", + language: "Language", + currency: "Currency", + currencyComingSoon: "Currency picker — coming soon", + currencyComingSoonDescription: + "A preferred-currency setting (sats/USD/EUR) is on the roadmap.", + }, }, errors: { - notFound: 'Page not found', - serverError: 'Server error occurred', - networkError: 'Network connection error' + notFound: "Page not found", + serverError: "Server error occurred", + networkError: "Network connection error", }, locales: { - en: 'English', - es: 'Spanish', - fr: 'French', - de: 'German', - zh: 'Chinese' + en: "English", + es: "Spanish", + fr: "French", + de: "German", + zh: "Chinese", }, events: { - title: 'Events', - createNew: 'Create Event', + title: "Events", + createNew: "Create Event", create: { promo: { - title: 'Promo codes', - hint: 'Percentage discounts buyers can enter at checkout. Codes are never shown publicly.', - empty: 'No promo codes yet.', - code: 'Code', - codePlaceholder: 'EARLYBIRD', - discount: 'Discount %', - maxUses: 'Max uses', - active: 'Active', - used: 'Used {count}', - add: 'Add code', - removeLabel: 'Remove code {code}', + title: "Promo codes", + hint: "Percentage discounts buyers can enter at checkout. Codes are never shown publicly.", + empty: "No promo codes yet.", + code: "Code", + codePlaceholder: "EARLYBIRD", + discount: "Discount %", + maxUses: "Max uses", + active: "Active", + used: "Used {count}", + add: "Add code", + removeLabel: "Remove code {code}", errors: { - required: 'Enter a code', - duplicate: 'Duplicate code', - percentRange: 'Between 1 and 100', - maxUsesMin: 'Must be 1 or more', + required: "Enter a code", + duplicate: "Duplicate code", + percentRange: "Between 1 and 100", + maxUsesMin: "Must be 1 or more", }, }, }, - noEvents: 'No events found', + noEvents: "No events found", filters: { - all: 'All', - today: 'Today', - tomorrow: 'Tomorrow', - thisWeek: 'This Week', - thisMonth: 'This Month', - myTickets: 'My tickets', - hosting: 'Hosting', - pastEvents: 'Past events', - past: 'Past', - filters: 'Filters', - clearAll: 'Clear all', - filteringBy: 'Filtering by:', - removeCategory: 'Remove {category} filter', + all: "All", + today: "Today", + tomorrow: "Tomorrow", + thisWeek: "This Week", + thisMonth: "This Month", + myTickets: "My tickets", + hosting: "Hosting", + pastEvents: "Past events", + past: "Past", + filters: "Filters", + clearAll: "Clear all", + filteringBy: "Filtering by:", + removeCategory: "Remove {category} filter", }, categories: { - concert: 'Concert', - workshop: 'Workshop', - market: 'Market', - festival: 'Festival', - exhibition: 'Exhibition', - sport: 'Sport', - theater: 'Theater', - cinema: 'Cinema', - party: 'Party', - talk: 'Talk', - conference: 'Conference', - meetup: 'Meetup', - food: 'Food', - outdoor: 'Outdoor', - kids: 'Kids', - wellness: 'Wellness', - technology: 'Technology', - art: 'Art', - music: 'Music', - dance: 'Dance', - literature: 'Literature', - comedy: 'Comedy', - charity: 'Charity', - tradition: 'Tradition', - other: 'Other', + concert: "Concert", + workshop: "Workshop", + market: "Market", + festival: "Festival", + exhibition: "Exhibition", + sport: "Sport", + theater: "Theater", + cinema: "Cinema", + party: "Party", + talk: "Talk", + conference: "Conference", + meetup: "Meetup", + food: "Food", + outdoor: "Outdoor", + kids: "Kids", + wellness: "Wellness", + technology: "Technology", + art: "Art", + music: "Music", + dance: "Dance", + literature: "Literature", + comedy: "Comedy", + charity: "Charity", + tradition: "Tradition", + other: "Other", }, detail: { - getTicket: 'Get Ticket', - contactOrganizer: 'Contact Organizer', - organizer: 'Organizer', - location: 'Location', - when: 'When', - tickets: 'Tickets', - ticketsAvailable: '{count} tickets available', - ticketsRemainingOfTotal: '{count} of {total} tickets left', - ticketsOwned: 'You have {count} ticket | You have {count} tickets', - unlimitedTickets: 'Unlimited tickets', - buyTicket: 'Buy ticket', - buyAnotherTicket: 'Buy another ticket', - viewMyTickets: 'View in My Tickets', - soldOut: 'Sold Out', - pastEvent: 'This event has already happened', - loginToBuyTickets: 'Log in to buy tickets', - logIn: 'Log in', - free: 'Free', + getTicket: "Get Ticket", + contactOrganizer: "Contact Organizer", + organizer: "Organizer", + location: "Location", + when: "When", + tickets: "Tickets", + ticketsAvailable: "{count} tickets available", + ticketsOwned: "You have {count} ticket | You have {count} tickets", + unlimitedTickets: "Unlimited tickets", + buyTicket: "Buy ticket", + buyAnotherTicket: "Buy another ticket", + viewMyTickets: "View in My Tickets", + soldOut: "Sold Out", + pastEvent: "This event has already happened", + loginToBuyTickets: "Log in to buy tickets", + logIn: "Log in", + free: "Free", }, tickets: { - myTickets: 'My Tickets', - scanTicket: 'Scan Ticket', - noTickets: 'No tickets yet', - paid: 'Paid', - pending: 'Pending', - registered: 'Registered', + myTickets: "My Tickets", + scanTicket: "Scan Ticket", + noTickets: "No tickets yet", + paid: "Paid", + pending: "Pending", + registered: "Registered", }, purchase: { - card: 'Card', - continueTo: 'Continue to {provider} checkout', - fiatRedirectHint: "You'll be taken to the provider's secure checkout and brought back here once paid.", - noCheckoutUrl: 'Fiat provider did not return a checkout URL.', - fiatFailed: 'Card checkout failed', - loginRequiredTitle: 'Login required', - loginRequiredFree: 'Free tickets need an account so seats cannot be claimed anonymously. Log in to get yours.', + card: "Card", + continueTo: "Continue to {provider} checkout", + fiatRedirectHint: + "You'll be taken to the provider's secure checkout and brought back here once paid.", + noCheckoutUrl: "Fiat provider did not return a checkout URL.", + fiatFailed: "Card checkout failed", + loginRequiredTitle: "Login required", + loginRequiredFree: + "Free tickets need an account so seats cannot be claimed anonymously. Log in to get yours.", promo: { - label: 'Promo code', - placeholder: 'Enter code', - apply: 'Apply', - remove: 'Remove', - checking: 'Checking…', - applied: '{code} −{percent}%', - discountLine: 'Discount ({code})', - invalid: 'This code is not valid for this purchase.', - unverified: 'Could not verify the code — it will be applied at checkout if valid.', - loginRequiredDiscount: 'This code makes your ticket free. Free tickets need an account — log in to claim it.', + label: "Promo code", + placeholder: "Enter code", + apply: "Apply", + remove: "Remove", + checking: "Checking…", + applied: "{code} −{percent}%", + discountLine: "Discount ({code})", + invalid: "This code is not valid for this purchase.", + unverified: + "Could not verify the code — it will be applied at checkout if valid.", + loginRequiredDiscount: + "This code makes your ticket free. Free tickets need an account — log in to claim it.", }, contact: { - title: 'Your details', - name: 'Name', - namePlaceholder: 'Name on the ticket', - nameRequired: 'Name is required', - email: 'Email', - emailHint: 'Your ticket will be sent to this address.', - spamHint: 'If it has not arrived a few minutes after paying, check your spam folder.', - emailInvalid: 'Enter a valid email address', - confirmEmail: 'Confirm email', - emailMismatch: 'Email addresses do not match', + title: "Your details", + name: "Name", + namePlaceholder: "Name on the ticket", + nameRequired: "Name is required", + email: "Email", + emailHint: "Your ticket will be sent to this address.", + spamHint: + "If it has not arrived a few minutes after paying, check your spam folder.", + emailInvalid: "Enter a valid email address", + confirmEmail: "Confirm email", + emailMismatch: "Email addresses do not match", }, }, checkout: { - title: 'Confirming your payment…', - paidTitle: 'Payment received', - processing: 'Waiting for the payment to settle. This usually takes a few seconds.', - stillProcessing: 'Still processing. Your ticket will be emailed to {email} as soon as the payment settles.', - stillProcessingNoEmail: 'Still processing. Reload this page in a moment to check again.', - emailedTo: 'We emailed your ticket to {email}.', - cancelled: 'Payment cancelled — no seats were reserved.', - viewTicket: 'Open ticket page', - viewMyTickets: 'View My Tickets', - retry: 'Check again', - ticketN: 'Ticket {n} of {total}', - close: 'Close', + title: "Confirming your payment…", + paidTitle: "Payment received", + processing: + "Waiting for the payment to settle. This usually takes a few seconds.", + stillProcessing: + "Still processing. Your ticket will be emailed to {email} as soon as the payment settles.", + stillProcessingNoEmail: + "Still processing. Reload this page in a moment to check again.", + emailedTo: "We emailed your ticket to {email}.", + cancelled: "Payment cancelled — no seats were reserved.", + viewTicket: "Open ticket page", + viewMyTickets: "View My Tickets", + retry: "Check again", + ticketN: "Ticket {n} of {total}", + close: "Close", }, ticket: { - title: 'Your ticket', - loading: 'Loading ticket…', - notFound: 'Ticket not found', - event: 'Event', - holder: 'Name', - paid: 'Paid', - pending: 'Payment pending', - registered: 'Checked in', - showAtDoor: 'Show this QR at the door.', - backToEvent: 'Back to event', + title: "Your ticket", + loading: "Loading ticket…", + notFound: "Ticket not found", + event: "Event", + holder: "Name", + paid: "Paid", + pending: "Payment pending", + registered: "Checked in", + showAtDoor: "Show this QR at the door.", + backToEvent: "Back to event", }, nav: { - feed: 'Home', - calendar: 'Calendar', - map: 'Map', - favorites: 'Favorites', - settings: 'Settings', + feed: "Home", + calendar: "Calendar", + map: "Map", + favorites: "Favorites", + settings: "Settings", }, search: { - placeholder: 'Search events...', - noResults: 'No events found', + placeholder: "Search events...", + noResults: "No events found", }, favorites: { - title: 'Favorites', - loginPrompt: 'Log in to save your favorite events', - empty: 'No favorites yet', - emptyHint: 'Tap the heart icon on any event to save it here', - logIn: 'Log in', + title: "Favorites", + loginPrompt: "Log in to save your favorite events", + empty: "No favorites yet", + emptyHint: "Tap the heart icon on any event to save it here", + logIn: "Log in", }, settings: { - title: 'Settings', - account: 'Account', - loginPrompt: 'Log in to bookmark events, RSVP, and purchase tickets.', - logIn: 'Log in', - logOut: 'Log out', - appearance: 'Appearance', - theme: 'Theme', - language: 'Language', + title: "Settings", + account: "Account", + loginPrompt: "Log in to bookmark events, RSVP, and purchase tickets.", + logIn: "Log in", + logOut: "Log out", + appearance: "Appearance", + theme: "Theme", + language: "Language", }, }, libra: { nav: { - record: 'Record', - transactions: 'Transactions', - balance: 'Balance', - wallet: 'Wallet', - settings: 'Settings', + record: "Record", + transactions: "Transactions", + balance: "Balance", + wallet: "Wallet", + settings: "Settings", }, record: { - title: 'Record', - addExpense: 'Add Expense', - addExpenseDescription: 'Submit an expense for approval', - addIncome: 'Add Income', - addIncomeDescription: 'Record income or revenue received', - comingSoon: 'Coming Soon', - drafts: 'Drafts', - noDrafts: 'No saved drafts', - draftAge: 'Saved {time}', - saveDraft: 'Save Draft', - deleteDraft: 'Delete Draft', + title: "Record", + addExpense: "Add Expense", + addExpenseDescription: "Submit an expense for approval", + addIncome: "Add Income", + addIncomeDescription: "Record income or revenue received", + comingSoon: "Coming Soon", + drafts: "Drafts", + noDrafts: "No saved drafts", + draftAge: "Saved {time}", + saveDraft: "Save Draft", + deleteDraft: "Delete Draft", }, balance: { - title: 'Balance', - netBalance: 'Net Balance', - pending: 'Pending', - pendingExpenses: '{count} pending expense | {count} pending expenses', - pendingAmount: '{amount} pending approval', - noBalance: 'No balance data available', - owedToYou: 'Owed to you', - youOwe: 'You owe', + title: "Balance", + netBalance: "Net Balance", + pending: "Pending", + pendingExpenses: "{count} pending expense | {count} pending expenses", + pendingAmount: "{amount} pending approval", + noBalance: "No balance data available", + owedToYou: "Owed to you", + youOwe: "You owe", }, settings: { - title: 'Settings', - account: 'Account', - loginPrompt: 'Log in to record expenses and view your balance.', - logIn: 'Log in', - logOut: 'Log out', - appearance: 'Appearance', - theme: 'Theme', - language: 'Language', + title: "Settings", + account: "Account", + loginPrompt: "Log in to record expenses and view your balance.", + logIn: "Log in", + logOut: "Log out", + appearance: "Appearance", + theme: "Theme", + language: "Language", }, income: { - title: 'Add Income', - description: 'Submit income for the organization', - selectAccount: 'Select the revenue account.', + title: "Add Income", + description: "Submit income for the organization", + selectAccount: "Select the revenue account.", otherAccountHint: 'Use the "Other" account if you\'re not sure.', - submitIncome: 'Submit Income', - notAvailable: 'Income submission is not yet available. This feature is coming soon.', + submitIncome: "Submit Income", + notAvailable: + "Income submission is not yet available. This feature is coming soon.", }, }, market: { auth: { - loginPrompt: 'Log in to place your order', - logIn: 'Log in', - logInToCheckout: 'Log in to checkout', - nostrKeyRequired: 'A Nostr identity is required', - nostrKeyDescription: 'Configure your Nostr public key in Profile settings to place orders.', + loginPrompt: "Log in to place your order", + logIn: "Log in", + logInToCheckout: "Log in to checkout", + nostrKeyRequired: "A Nostr identity is required", + nostrKeyDescription: + "Configure your Nostr public key in Profile settings to place orders.", }, }, dateTimeFormats: { short: { - year: 'numeric', - month: 'short', - day: 'numeric' + year: "numeric", + month: "short", + day: "numeric", }, long: { - year: 'numeric', - month: 'long', - day: 'numeric', - weekday: 'long', - hour: 'numeric', - minute: 'numeric' - } + year: "numeric", + month: "long", + day: "numeric", + weekday: "long", + hour: "numeric", + minute: "numeric", + }, }, numberFormats: { currency: { - style: 'currency', - currencyDisplay: 'symbol' + style: "currency", + currencyDisplay: "symbol", }, decimal: { - style: 'decimal', - minimumFractionDigits: 2 + style: "decimal", + minimumFractionDigits: 2, }, percent: { - style: 'percent', - useGrouping: false - } - } -} + style: "percent", + useGrouping: false, + }, + }, +}; -export default messages +export default messages; diff --git a/src/i18n/locales/es.ts b/src/i18n/locales/es.ts index 2177fc7..b55c559 100644 --- a/src/i18n/locales/es.ts +++ b/src/i18n/locales/es.ts @@ -1,331 +1,342 @@ -import type { LocaleMessages } from '../types' +import type { LocaleMessages } from "../types"; const messages: LocaleMessages = { nav: { - title: 'Reino Virtual', - home: 'Inicio', - directory: 'Directorio', - faq: 'Preguntas Frecuentes', - events: 'Eventos', - market: 'Mercado', - chat: 'Chat', - login: 'Iniciar Sesión', - logout: 'Cerrar Sesión' + title: "Reino Virtual", + home: "Inicio", + directory: "Directorio", + faq: "Preguntas Frecuentes", + events: "Eventos", + market: "Mercado", + chat: "Chat", + login: "Iniciar Sesión", + logout: "Cerrar Sesión", }, common: { - loading: 'Cargando...', - error: 'Ha ocurrido un error', - success: 'Operación exitosa', + loading: "Cargando...", + error: "Ha ocurrido un error", + success: "Operación exitosa", nav: { - profile: 'Perfil', - preferences: 'Preferencias', - profileDescription: 'Tu identidad Nostr y nombre de visualización.', - profileLoggedOutDescription: 'Inicia sesión o cambia tus preferencias.', - login: 'Iniciar sesión', - menu: 'Menú', - backToHub: 'Volver al hub', - hub: 'Hub', - theme: 'Tema', - themeLight: 'Claro', - themeDark: 'Oscuro', - themeSystem: 'Sistema', - colorScheme: 'Paleta', - palette_catppuccin: 'Catppuccin', - palette_countrysidecastle: 'Castillo Campestre', - palette_darkmatter: 'Dark Matter', - palette_emeraldforest: 'Bosque Esmeralda', - palette_lightgreen: 'Verde Claro', - palette_neobrut: 'Neo Brutalista', - palette_starrynight: 'Noche Estrellada', - language: 'Idioma', - currency: 'Moneda', - currencyComingSoon: 'Selector de moneda — próximamente', - currencyComingSoonDescription: 'Un ajuste de moneda preferida (sats/USD/EUR) está en la hoja de ruta.' - } + profile: "Perfil", + preferences: "Preferencias", + profileDescription: "Tu identidad Nostr y nombre de visualización.", + profileLoggedOutDescription: "Inicia sesión o cambia tus preferencias.", + login: "Iniciar sesión", + menu: "Menú", + backToHub: "Volver al hub", + hub: "Hub", + theme: "Tema", + themeLight: "Claro", + themeDark: "Oscuro", + themeSystem: "Sistema", + colorScheme: "Paleta", + palette_catppuccin: "Catppuccin", + palette_countrysidecastle: "Castillo Campestre", + palette_darkmatter: "Dark Matter", + palette_emeraldforest: "Bosque Esmeralda", + palette_lightgreen: "Verde Claro", + palette_neobrut: "Neo Brutalista", + palette_starrynight: "Noche Estrellada", + language: "Idioma", + currency: "Moneda", + currencyComingSoon: "Selector de moneda — próximamente", + currencyComingSoonDescription: + "Un ajuste de moneda preferida (sats/USD/EUR) está en la hoja de ruta.", + }, }, errors: { - notFound: 'Página no encontrada', - serverError: 'Error del servidor', - networkError: 'Error de conexión de red' + notFound: "Página no encontrada", + serverError: "Error del servidor", + networkError: "Error de conexión de red", }, locales: { - en: 'Inglés', - es: 'Español', - fr: 'Francés', - de: 'Alemán', - zh: 'Chino' + en: "Inglés", + es: "Español", + fr: "Francés", + de: "Alemán", + zh: "Chino", }, events: { - title: 'Eventos', - createNew: 'Crear evento', + title: "Eventos", + createNew: "Crear evento", create: { promo: { - title: 'Códigos promocionales', - hint: 'Descuentos porcentuales que los compradores pueden introducir al pagar. Los códigos nunca se muestran públicamente.', - empty: 'Aún no hay códigos promocionales.', - code: 'Código', - codePlaceholder: 'EARLYBIRD', - discount: 'Descuento %', - maxUses: 'Usos máx.', - active: 'Activo', - used: 'Usado {count}', - add: 'Añadir código', - removeLabel: 'Eliminar el código {code}', + title: "Códigos promocionales", + hint: "Descuentos porcentuales que los compradores pueden introducir al pagar. Los códigos nunca se muestran públicamente.", + empty: "Aún no hay códigos promocionales.", + code: "Código", + codePlaceholder: "EARLYBIRD", + discount: "Descuento %", + maxUses: "Usos máx.", + active: "Activo", + used: "Usado {count}", + add: "Añadir código", + removeLabel: "Eliminar el código {code}", errors: { - required: 'Introduce un código', - duplicate: 'Código duplicado', - percentRange: 'Entre 1 y 100', - maxUsesMin: 'Debe ser 1 o más', + required: "Introduce un código", + duplicate: "Código duplicado", + percentRange: "Entre 1 y 100", + maxUsesMin: "Debe ser 1 o más", }, }, }, - noEvents: 'No se encontraron eventos', + noEvents: "No se encontraron eventos", filters: { - all: 'Todas', - today: 'Hoy', - tomorrow: 'Mañana', - thisWeek: 'Esta semana', - thisMonth: 'Este mes', - myTickets: 'Mis boletos', - hosting: 'Organizo', - pastEvents: 'Eventos pasados', - past: 'Pasado', - filters: 'Filtros', - clearAll: 'Limpiar todo', - filteringBy: 'Filtrando por:', - removeCategory: 'Quitar el filtro {category}', + all: "Todas", + today: "Hoy", + tomorrow: "Mañana", + thisWeek: "Esta semana", + thisMonth: "Este mes", + myTickets: "Mis boletos", + hosting: "Organizo", + pastEvents: "Eventos pasados", + past: "Pasado", + filters: "Filtros", + clearAll: "Limpiar todo", + filteringBy: "Filtrando por:", + removeCategory: "Quitar el filtro {category}", }, categories: { - concert: 'Concierto', - workshop: 'Taller', - market: 'Mercado', - festival: 'Festival', - exhibition: 'Exposición', - sport: 'Deporte', - theater: 'Teatro', - cinema: 'Cine', - party: 'Fiesta', - talk: 'Charla', - conference: 'Conferencia', - meetup: 'Encuentro', - food: 'Gastronomía', - outdoor: 'Al aire libre', - kids: 'Niños', - wellness: 'Bienestar', - technology: 'Tecnología', - art: 'Arte', - music: 'Música', - dance: 'Danza', - literature: 'Literatura', - comedy: 'Comedia', - charity: 'Solidario', - tradition: 'Tradición', - other: 'Otro', + concert: "Concierto", + workshop: "Taller", + market: "Mercado", + festival: "Festival", + exhibition: "Exposición", + sport: "Deporte", + theater: "Teatro", + cinema: "Cine", + party: "Fiesta", + talk: "Charla", + conference: "Conferencia", + meetup: "Encuentro", + food: "Gastronomía", + outdoor: "Al aire libre", + kids: "Niños", + wellness: "Bienestar", + technology: "Tecnología", + art: "Arte", + music: "Música", + dance: "Danza", + literature: "Literatura", + comedy: "Comedia", + charity: "Solidario", + tradition: "Tradición", + other: "Otro", }, detail: { - getTicket: 'Obtener boleto', - contactOrganizer: 'Contactar organizador', - organizer: 'Organizador', - location: 'Ubicación', - when: 'Cuándo', - tickets: 'Boletos', - ticketsAvailable: '{count} boletos disponibles', - ticketsRemainingOfTotal: '{count} de {total} boletos restantes', - ticketsOwned: 'Tienes {count} boleto | Tienes {count} boletos', - unlimitedTickets: 'Boletos ilimitados', - buyTicket: 'Comprar boleto', - buyAnotherTicket: 'Comprar otro boleto', - viewMyTickets: 'Ver en Mis boletos', - soldOut: 'Agotado', - pastEvent: 'Este evento ya pasó', - loginToBuyTickets: 'Inicia sesión para comprar boletos', - logIn: 'Iniciar sesión', - free: 'Gratis', + getTicket: "Obtener boleto", + contactOrganizer: "Contactar organizador", + organizer: "Organizador", + location: "Ubicación", + when: "Cuándo", + tickets: "Boletos", + ticketsAvailable: "{count} boletos disponibles", + ticketsOwned: "Tienes {count} boleto | Tienes {count} boletos", + unlimitedTickets: "Boletos ilimitados", + buyTicket: "Comprar boleto", + buyAnotherTicket: "Comprar otro boleto", + viewMyTickets: "Ver en Mis boletos", + soldOut: "Agotado", + pastEvent: "Este evento ya pasó", + loginToBuyTickets: "Inicia sesión para comprar boletos", + logIn: "Iniciar sesión", + free: "Gratis", }, tickets: { - myTickets: 'Mis boletos', - scanTicket: 'Escanear boleto', - noTickets: 'Aún no tienes boletos', - paid: 'Pagado', - pending: 'Pendiente', - registered: 'Registrado', + myTickets: "Mis boletos", + scanTicket: "Escanear boleto", + noTickets: "Aún no tienes boletos", + paid: "Pagado", + pending: "Pendiente", + registered: "Registrado", }, purchase: { - card: 'Tarjeta', - continueTo: 'Continuar al pago con {provider}', - fiatRedirectHint: 'Te llevaremos al pago seguro del proveedor y volverás aquí una vez pagado.', - noCheckoutUrl: 'El proveedor no devolvió una URL de pago.', - fiatFailed: 'El pago con tarjeta falló', - loginRequiredTitle: 'Inicio de sesión requerido', - loginRequiredFree: 'Los boletos gratuitos requieren una cuenta para evitar reservas anónimas. Inicia sesión para obtener el tuyo.', + card: "Tarjeta", + continueTo: "Continuar al pago con {provider}", + fiatRedirectHint: + "Te llevaremos al pago seguro del proveedor y volverás aquí una vez pagado.", + noCheckoutUrl: "El proveedor no devolvió una URL de pago.", + fiatFailed: "El pago con tarjeta falló", + loginRequiredTitle: "Inicio de sesión requerido", + loginRequiredFree: + "Los boletos gratuitos requieren una cuenta para evitar reservas anónimas. Inicia sesión para obtener el tuyo.", promo: { - label: 'Código promocional', - placeholder: 'Introduce el código', - apply: 'Aplicar', - remove: 'Quitar', - checking: 'Comprobando…', - applied: '{code} −{percent}%', - discountLine: 'Descuento ({code})', - invalid: 'Este código no es válido para esta compra.', - unverified: 'No se pudo verificar el código; se aplicará al pagar si es válido.', - loginRequiredDiscount: 'Este código hace que tu boleto sea gratis. Los boletos gratuitos requieren una cuenta: inicia sesión para reclamarlo.', + label: "Código promocional", + placeholder: "Introduce el código", + apply: "Aplicar", + remove: "Quitar", + checking: "Comprobando…", + applied: "{code} −{percent}%", + discountLine: "Descuento ({code})", + invalid: "Este código no es válido para esta compra.", + unverified: + "No se pudo verificar el código; se aplicará al pagar si es válido.", + loginRequiredDiscount: + "Este código hace que tu boleto sea gratis. Los boletos gratuitos requieren una cuenta: inicia sesión para reclamarlo.", }, contact: { - title: 'Tus datos', - name: 'Nombre', - namePlaceholder: 'Nombre en el boleto', - nameRequired: 'El nombre es obligatorio', - email: 'Correo electrónico', - emailHint: 'Tu boleto se enviará a esta dirección.', - spamHint: 'Si no llega unos minutos después de pagar, revisa tu carpeta de spam.', - emailInvalid: 'Introduce un correo electrónico válido', - confirmEmail: 'Confirmar correo', - emailMismatch: 'Los correos no coinciden', + title: "Tus datos", + name: "Nombre", + namePlaceholder: "Nombre en el boleto", + nameRequired: "El nombre es obligatorio", + email: "Correo electrónico", + emailHint: "Tu boleto se enviará a esta dirección.", + spamHint: + "Si no llega unos minutos después de pagar, revisa tu carpeta de spam.", + emailInvalid: "Introduce un correo electrónico válido", + confirmEmail: "Confirmar correo", + emailMismatch: "Los correos no coinciden", }, }, checkout: { - title: 'Confirmando tu pago…', - paidTitle: 'Pago recibido', - processing: 'Esperando a que se liquide el pago. Suele tardar unos segundos.', - stillProcessing: 'Aún en proceso. Tu boleto se enviará a {email} en cuanto se liquide el pago.', - stillProcessingNoEmail: 'Aún en proceso. Recarga esta página en un momento.', - emailedTo: 'Enviamos tu boleto a {email}.', - cancelled: 'Pago cancelado — no se reservó ningún asiento.', - viewTicket: 'Abrir página del boleto', - viewMyTickets: 'Ver mis boletos', - retry: 'Comprobar de nuevo', - ticketN: 'Boleto {n} de {total}', - close: 'Cerrar', + title: "Confirmando tu pago…", + paidTitle: "Pago recibido", + processing: + "Esperando a que se liquide el pago. Suele tardar unos segundos.", + stillProcessing: + "Aún en proceso. Tu boleto se enviará a {email} en cuanto se liquide el pago.", + stillProcessingNoEmail: + "Aún en proceso. Recarga esta página en un momento.", + emailedTo: "Enviamos tu boleto a {email}.", + cancelled: "Pago cancelado — no se reservó ningún asiento.", + viewTicket: "Abrir página del boleto", + viewMyTickets: "Ver mis boletos", + retry: "Comprobar de nuevo", + ticketN: "Boleto {n} de {total}", + close: "Cerrar", }, ticket: { - title: 'Tu boleto', - loading: 'Cargando boleto…', - notFound: 'Boleto no encontrado', - event: 'Evento', - holder: 'Nombre', - paid: 'Pagado', - pending: 'Pago pendiente', - registered: 'Registrado', - showAtDoor: 'Muestra este QR en la entrada.', - backToEvent: 'Volver al evento', + title: "Tu boleto", + loading: "Cargando boleto…", + notFound: "Boleto no encontrado", + event: "Evento", + holder: "Nombre", + paid: "Pagado", + pending: "Pago pendiente", + registered: "Registrado", + showAtDoor: "Muestra este QR en la entrada.", + backToEvent: "Volver al evento", }, nav: { - feed: 'Inicio', - calendar: 'Calendario', - map: 'Mapa', - favorites: 'Favoritos', - settings: 'Ajustes', + feed: "Inicio", + calendar: "Calendario", + map: "Mapa", + favorites: "Favoritos", + settings: "Ajustes", }, search: { - placeholder: 'Buscar eventos...', - noResults: 'No se encontraron eventos', + placeholder: "Buscar eventos...", + noResults: "No se encontraron eventos", }, favorites: { - title: 'Favoritos', - loginPrompt: 'Inicia sesión para guardar tus eventos favoritos', - empty: 'Aún no tienes favoritos', - emptyHint: 'Toca el corazón en cualquier evento para guardarlo aquí', - logIn: 'Iniciar sesión', + title: "Favoritos", + loginPrompt: "Inicia sesión para guardar tus eventos favoritos", + empty: "Aún no tienes favoritos", + emptyHint: "Toca el corazón en cualquier evento para guardarlo aquí", + logIn: "Iniciar sesión", }, settings: { - title: 'Ajustes', - account: 'Cuenta', - loginPrompt: 'Inicia sesión para guardar eventos, confirmar asistencia y comprar boletos.', - logIn: 'Iniciar sesión', - logOut: 'Cerrar sesión', - appearance: 'Apariencia', - theme: 'Tema', - language: 'Idioma', + title: "Ajustes", + account: "Cuenta", + loginPrompt: + "Inicia sesión para guardar eventos, confirmar asistencia y comprar boletos.", + logIn: "Iniciar sesión", + logOut: "Cerrar sesión", + appearance: "Apariencia", + theme: "Tema", + language: "Idioma", }, }, libra: { nav: { - record: 'Registrar', - transactions: 'Transacciones', - balance: 'Saldo', - wallet: 'Billetera', - settings: 'Ajustes', + record: "Registrar", + transactions: "Transacciones", + balance: "Saldo", + wallet: "Billetera", + settings: "Ajustes", }, record: { - title: 'Registrar', - addExpense: 'A\u00f1adir gasto', - addExpenseDescription: 'Enviar un gasto para aprobaci\u00f3n', - addIncome: 'A\u00f1adir ingreso', - addIncomeDescription: 'Registrar un ingreso recibido', - comingSoon: 'Pr\u00f3ximamente', - drafts: 'Borradores', - noDrafts: 'Sin borradores', - draftAge: 'Guardado {time}', - saveDraft: 'Guardar borrador', - deleteDraft: 'Eliminar borrador', + title: "Registrar", + addExpense: "A\u00f1adir gasto", + addExpenseDescription: "Enviar un gasto para aprobaci\u00f3n", + addIncome: "A\u00f1adir ingreso", + addIncomeDescription: "Registrar un ingreso recibido", + comingSoon: "Pr\u00f3ximamente", + drafts: "Borradores", + noDrafts: "Sin borradores", + draftAge: "Guardado {time}", + saveDraft: "Guardar borrador", + deleteDraft: "Eliminar borrador", }, balance: { - title: 'Saldo', - netBalance: 'Saldo neto', - pending: 'Pendiente', - pendingExpenses: '{count} gasto pendiente | {count} gastos pendientes', - pendingAmount: '{amount} pendiente de aprobaci\u00f3n', - noBalance: 'No hay datos de saldo disponibles', - owedToYou: 'Te deben', - youOwe: 'Debes', + title: "Saldo", + netBalance: "Saldo neto", + pending: "Pendiente", + pendingExpenses: "{count} gasto pendiente | {count} gastos pendientes", + pendingAmount: "{amount} pendiente de aprobaci\u00f3n", + noBalance: "No hay datos de saldo disponibles", + owedToYou: "Te deben", + youOwe: "Debes", }, settings: { - title: 'Ajustes', - account: 'Cuenta', - loginPrompt: 'Inicia sesi\u00f3n para registrar gastos y ver tu saldo.', - logIn: 'Iniciar sesi\u00f3n', - logOut: 'Cerrar sesi\u00f3n', - appearance: 'Apariencia', - theme: 'Tema', - language: 'Idioma', + title: "Ajustes", + account: "Cuenta", + loginPrompt: "Inicia sesi\u00f3n para registrar gastos y ver tu saldo.", + logIn: "Iniciar sesi\u00f3n", + logOut: "Cerrar sesi\u00f3n", + appearance: "Apariencia", + theme: "Tema", + language: "Idioma", }, income: { - title: 'A\u00f1adir ingreso', - description: 'Enviar un ingreso para la organizaci\u00f3n', - selectAccount: 'Seleccionar la cuenta de ingresos.', + title: "A\u00f1adir ingreso", + description: "Enviar un ingreso para la organizaci\u00f3n", + selectAccount: "Seleccionar la cuenta de ingresos.", otherAccountHint: 'Use la cuenta "Other" si no está seguro.', - submitIncome: 'Enviar ingreso', - notAvailable: 'El registro de ingresos a\u00fan no est\u00e1 disponible. Esta funci\u00f3n llegar\u00e1 pronto.', + submitIncome: "Enviar ingreso", + notAvailable: + "El registro de ingresos a\u00fan no est\u00e1 disponible. Esta funci\u00f3n llegar\u00e1 pronto.", }, }, market: { auth: { - loginPrompt: 'Inicia sesi\u00f3n para realizar tu pedido', - logIn: 'Iniciar sesi\u00f3n', - logInToCheckout: 'Iniciar sesi\u00f3n para finalizar compra', - nostrKeyRequired: 'Se requiere una identidad Nostr', - nostrKeyDescription: 'Configura tu clave p\u00fablica Nostr en los ajustes del perfil para realizar pedidos.', + loginPrompt: "Inicia sesi\u00f3n para realizar tu pedido", + logIn: "Iniciar sesi\u00f3n", + logInToCheckout: "Iniciar sesi\u00f3n para finalizar compra", + nostrKeyRequired: "Se requiere una identidad Nostr", + nostrKeyDescription: + "Configura tu clave p\u00fablica Nostr en los ajustes del perfil para realizar pedidos.", }, }, dateTimeFormats: { short: { - year: 'numeric', - month: 'short', - day: 'numeric' + year: "numeric", + month: "short", + day: "numeric", }, long: { - year: 'numeric', - month: 'long', - day: 'numeric', - weekday: 'long', - hour: 'numeric', - minute: 'numeric' - } + year: "numeric", + month: "long", + day: "numeric", + weekday: "long", + hour: "numeric", + minute: "numeric", + }, }, numberFormats: { currency: { - style: 'currency', - currencyDisplay: 'symbol' + style: "currency", + currencyDisplay: "symbol", }, decimal: { - style: 'decimal', - minimumFractionDigits: 2 + style: "decimal", + minimumFractionDigits: 2, }, percent: { - style: 'percent', - useGrouping: false - } - } -} + style: "percent", + useGrouping: false, + }, + }, +}; -export default messages +export default messages; diff --git a/src/i18n/locales/fr.ts b/src/i18n/locales/fr.ts index 54b3676..fb87a12 100644 --- a/src/i18n/locales/fr.ts +++ b/src/i18n/locales/fr.ts @@ -1,331 +1,346 @@ -import type { LocaleMessages } from '../types' +import type { LocaleMessages } from "../types"; const messages: LocaleMessages = { nav: { - title: 'Monde Virtuel', - home: 'Accueil', - directory: 'Répertoire', - faq: 'FAQ', - events: 'Événements', - market: 'Marché', - chat: 'Chat', - login: 'Connexion', - logout: 'Déconnexion' + title: "Monde Virtuel", + home: "Accueil", + directory: "Répertoire", + faq: "FAQ", + events: "Événements", + market: "Marché", + chat: "Chat", + login: "Connexion", + logout: "Déconnexion", }, common: { - loading: 'Chargement...', - error: 'Une erreur est survenue', - success: 'Opération réussie', + loading: "Chargement...", + error: "Une erreur est survenue", + success: "Opération réussie", nav: { - profile: 'Profil', - preferences: 'Préférences', - profileDescription: 'Votre identité Nostr et votre nom d\u2019affichage.', - profileLoggedOutDescription: 'Connectez-vous ou modifiez vos préférences.', - login: 'Se connecter', - menu: 'Menu', - backToHub: 'Retour au hub', - hub: 'Hub', - theme: 'Thème', - themeLight: 'Clair', - themeDark: 'Sombre', - themeSystem: 'Système', - colorScheme: 'Palette', - palette_catppuccin: 'Catppuccin', - palette_countrysidecastle: 'Château Champêtre', - palette_darkmatter: 'Dark Matter', - palette_emeraldforest: 'Forêt d\'Émeraude', - palette_lightgreen: 'Vert Clair', - palette_neobrut: 'Néo-Brutaliste', - palette_starrynight: 'Nuit Étoilée', - language: 'Langue', - currency: 'Devise', - currencyComingSoon: 'Sélecteur de devise — bientôt disponible', - currencyComingSoonDescription: 'Un réglage de devise préférée (sats/USD/EUR) est prévu.' - } + profile: "Profil", + preferences: "Préférences", + profileDescription: "Votre identité Nostr et votre nom d\u2019affichage.", + profileLoggedOutDescription: + "Connectez-vous ou modifiez vos préférences.", + login: "Se connecter", + menu: "Menu", + backToHub: "Retour au hub", + hub: "Hub", + theme: "Thème", + themeLight: "Clair", + themeDark: "Sombre", + themeSystem: "Système", + colorScheme: "Palette", + palette_catppuccin: "Catppuccin", + palette_countrysidecastle: "Château Champêtre", + palette_darkmatter: "Dark Matter", + palette_emeraldforest: "Forêt d'Émeraude", + palette_lightgreen: "Vert Clair", + palette_neobrut: "Néo-Brutaliste", + palette_starrynight: "Nuit Étoilée", + language: "Langue", + currency: "Devise", + currencyComingSoon: "Sélecteur de devise — bientôt disponible", + currencyComingSoonDescription: + "Un réglage de devise préférée (sats/USD/EUR) est prévu.", + }, }, errors: { - notFound: 'Page non trouvée', - serverError: 'Erreur du serveur', - networkError: 'Erreur de connexion réseau' + notFound: "Page non trouvée", + serverError: "Erreur du serveur", + networkError: "Erreur de connexion réseau", }, locales: { - en: 'Anglais', - es: 'Espagnol', - fr: 'Français', - de: 'Allemand', - zh: 'Chinois' + en: "Anglais", + es: "Espagnol", + fr: "Français", + de: "Allemand", + zh: "Chinois", }, events: { - title: 'Événements', - createNew: 'Créer un événement', + title: "Événements", + createNew: "Créer un événement", create: { promo: { - title: 'Codes promo', - hint: 'Remises en pourcentage que les acheteurs peuvent saisir au paiement. Les codes ne sont jamais affichés publiquement.', - empty: 'Aucun code promo pour le moment.', - code: 'Code', - codePlaceholder: 'EARLYBIRD', - discount: 'Remise %', - maxUses: 'Utilisations max.', - active: 'Actif', - used: 'Utilisé {count}', - add: 'Ajouter un code', - removeLabel: 'Supprimer le code {code}', + title: "Codes promo", + hint: "Remises en pourcentage que les acheteurs peuvent saisir au paiement. Les codes ne sont jamais affichés publiquement.", + empty: "Aucun code promo pour le moment.", + code: "Code", + codePlaceholder: "EARLYBIRD", + discount: "Remise %", + maxUses: "Utilisations max.", + active: "Actif", + used: "Utilisé {count}", + add: "Ajouter un code", + removeLabel: "Supprimer le code {code}", errors: { - required: 'Saisissez un code', - duplicate: 'Code en double', - percentRange: 'Entre 1 et 100', - maxUsesMin: 'Doit être 1 ou plus', + required: "Saisissez un code", + duplicate: "Code en double", + percentRange: "Entre 1 et 100", + maxUsesMin: "Doit être 1 ou plus", }, }, }, - noEvents: 'Aucun événement trouvé', + noEvents: "Aucun événement trouvé", filters: { - all: 'Tout', + all: "Tout", today: "Aujourd'hui", - tomorrow: 'Demain', - thisWeek: 'Cette semaine', - thisMonth: 'Ce mois-ci', - myTickets: 'Mes billets', - hosting: 'J\'organise', - pastEvents: 'Événements passés', - past: 'Passé', - filters: 'Filtres', - clearAll: 'Tout effacer', - filteringBy: 'Filtré par :', - removeCategory: 'Retirer le filtre {category}', + tomorrow: "Demain", + thisWeek: "Cette semaine", + thisMonth: "Ce mois-ci", + myTickets: "Mes billets", + hosting: "J'organise", + pastEvents: "Événements passés", + past: "Passé", + filters: "Filtres", + clearAll: "Tout effacer", + filteringBy: "Filtré par :", + removeCategory: "Retirer le filtre {category}", }, categories: { - concert: 'Concert', - workshop: 'Atelier', - market: 'Marché', - festival: 'Festival', - exhibition: 'Exposition', - sport: 'Sport', - theater: 'Théâtre', - cinema: 'Cinéma', - party: 'Fête', - talk: 'Conférence', - conference: 'Congrès', - meetup: 'Rencontre', - food: 'Gastronomie', - outdoor: 'Plein air', - kids: 'Enfants', - wellness: 'Bien-être', - technology: 'Technologie', - art: 'Art', - music: 'Musique', - dance: 'Danse', - literature: 'Littérature', - comedy: 'Humour', - charity: 'Caritatif', - tradition: 'Tradition', - other: 'Autre', + concert: "Concert", + workshop: "Atelier", + market: "Marché", + festival: "Festival", + exhibition: "Exposition", + sport: "Sport", + theater: "Théâtre", + cinema: "Cinéma", + party: "Fête", + talk: "Conférence", + conference: "Congrès", + meetup: "Rencontre", + food: "Gastronomie", + outdoor: "Plein air", + kids: "Enfants", + wellness: "Bien-être", + technology: "Technologie", + art: "Art", + music: "Musique", + dance: "Danse", + literature: "Littérature", + comedy: "Humour", + charity: "Caritatif", + tradition: "Tradition", + other: "Autre", }, detail: { - getTicket: 'Obtenir un billet', + getTicket: "Obtenir un billet", contactOrganizer: "Contacter l'organisateur", - organizer: 'Organisateur', - location: 'Lieu', - when: 'Quand', - tickets: 'Billets', - ticketsAvailable: '{count} billets disponibles', - ticketsRemainingOfTotal: '{count} sur {total} billets restants', - ticketsOwned: 'Vous avez {count} billet | Vous avez {count} billets', - unlimitedTickets: 'Billets illimités', - buyTicket: 'Acheter un billet', - buyAnotherTicket: 'Acheter un autre billet', - viewMyTickets: 'Voir dans Mes billets', - soldOut: 'Épuisé', - pastEvent: 'Cet événement est déjà passé', - loginToBuyTickets: 'Connectez-vous pour acheter des billets', - logIn: 'Connexion', - free: 'Gratuit', + organizer: "Organisateur", + location: "Lieu", + when: "Quand", + tickets: "Billets", + ticketsAvailable: "{count} billets disponibles", + ticketsOwned: "Vous avez {count} billet | Vous avez {count} billets", + unlimitedTickets: "Billets illimités", + buyTicket: "Acheter un billet", + buyAnotherTicket: "Acheter un autre billet", + viewMyTickets: "Voir dans Mes billets", + soldOut: "Épuisé", + pastEvent: "Cet événement est déjà passé", + loginToBuyTickets: "Connectez-vous pour acheter des billets", + logIn: "Connexion", + free: "Gratuit", }, tickets: { - myTickets: 'Mes billets', - scanTicket: 'Scanner le billet', - noTickets: 'Pas encore de billets', - paid: 'Payé', - pending: 'En attente', - registered: 'Enregistré', + myTickets: "Mes billets", + scanTicket: "Scanner le billet", + noTickets: "Pas encore de billets", + paid: "Payé", + pending: "En attente", + registered: "Enregistré", }, purchase: { - card: 'Carte', - continueTo: 'Continuer vers le paiement {provider}', - fiatRedirectHint: 'Vous serez redirigé vers le paiement sécurisé du prestataire, puis ramené ici une fois payé.', + card: "Carte", + continueTo: "Continuer vers le paiement {provider}", + fiatRedirectHint: + "Vous serez redirigé vers le paiement sécurisé du prestataire, puis ramené ici une fois payé.", noCheckoutUrl: "Le prestataire n'a pas renvoyé d'URL de paiement.", - fiatFailed: 'Le paiement par carte a échoué', - loginRequiredTitle: 'Connexion requise', - loginRequiredFree: 'Les billets gratuits nécessitent un compte pour éviter les réservations anonymes. Connectez-vous pour obtenir le vôtre.', + fiatFailed: "Le paiement par carte a échoué", + loginRequiredTitle: "Connexion requise", + loginRequiredFree: + "Les billets gratuits nécessitent un compte pour éviter les réservations anonymes. Connectez-vous pour obtenir le vôtre.", promo: { - label: 'Code promo', - placeholder: 'Saisir le code', - apply: 'Appliquer', - remove: 'Retirer', - checking: 'Vérification…', - applied: '{code} −{percent}%', - discountLine: 'Remise ({code})', + label: "Code promo", + placeholder: "Saisir le code", + apply: "Appliquer", + remove: "Retirer", + checking: "Vérification…", + applied: "{code} −{percent}%", + discountLine: "Remise ({code})", invalid: "Ce code n'est pas valable pour cet achat.", - unverified: "Impossible de vérifier le code — il sera appliqué au paiement s'il est valable.", - loginRequiredDiscount: 'Ce code rend votre billet gratuit. Les billets gratuits nécessitent un compte : connectez-vous pour le réclamer.', + unverified: + "Impossible de vérifier le code — il sera appliqué au paiement s'il est valable.", + loginRequiredDiscount: + "Ce code rend votre billet gratuit. Les billets gratuits nécessitent un compte : connectez-vous pour le réclamer.", }, contact: { - title: 'Vos coordonnées', - name: 'Nom', - namePlaceholder: 'Nom sur le billet', - nameRequired: 'Le nom est obligatoire', - email: 'E-mail', - emailHint: 'Votre billet sera envoyé à cette adresse.', - spamHint: 'S’il n’est pas arrivé quelques minutes après le paiement, vérifiez votre dossier spam.', - emailInvalid: 'Saisissez une adresse e-mail valide', + title: "Vos coordonnées", + name: "Nom", + namePlaceholder: "Nom sur le billet", + nameRequired: "Le nom est obligatoire", + email: "E-mail", + emailHint: "Votre billet sera envoyé à cette adresse.", + spamHint: + "S’il n’est pas arrivé quelques minutes après le paiement, vérifiez votre dossier spam.", + emailInvalid: "Saisissez une adresse e-mail valide", confirmEmail: "Confirmer l'e-mail", - emailMismatch: 'Les adresses e-mail ne correspondent pas', + emailMismatch: "Les adresses e-mail ne correspondent pas", }, }, checkout: { - title: 'Confirmation de votre paiement…', - paidTitle: 'Paiement reçu', - processing: 'En attente du règlement du paiement. Cela prend généralement quelques secondes.', - stillProcessing: 'Toujours en cours. Votre billet sera envoyé à {email} dès que le paiement sera réglé.', - stillProcessingNoEmail: 'Toujours en cours. Rechargez cette page dans un instant.', - emailedTo: 'Nous avons envoyé votre billet à {email}.', - cancelled: 'Paiement annulé — aucune place réservée.', - viewTicket: 'Ouvrir la page du billet', - viewMyTickets: 'Voir mes billets', - retry: 'Vérifier à nouveau', - ticketN: 'Billet {n} sur {total}', - close: 'Fermer', + title: "Confirmation de votre paiement…", + paidTitle: "Paiement reçu", + processing: + "En attente du règlement du paiement. Cela prend généralement quelques secondes.", + stillProcessing: + "Toujours en cours. Votre billet sera envoyé à {email} dès que le paiement sera réglé.", + stillProcessingNoEmail: + "Toujours en cours. Rechargez cette page dans un instant.", + emailedTo: "Nous avons envoyé votre billet à {email}.", + cancelled: "Paiement annulé — aucune place réservée.", + viewTicket: "Ouvrir la page du billet", + viewMyTickets: "Voir mes billets", + retry: "Vérifier à nouveau", + ticketN: "Billet {n} sur {total}", + close: "Fermer", }, ticket: { - title: 'Votre billet', - loading: 'Chargement du billet…', - notFound: 'Billet introuvable', - event: 'Événement', - holder: 'Nom', - paid: 'Payé', - pending: 'Paiement en attente', - registered: 'Enregistré', + title: "Votre billet", + loading: "Chargement du billet…", + notFound: "Billet introuvable", + event: "Événement", + holder: "Nom", + paid: "Payé", + pending: "Paiement en attente", + registered: "Enregistré", showAtDoor: "Présentez ce QR à l'entrée.", backToEvent: "Retour à l'événement", }, nav: { - feed: 'Accueil', - calendar: 'Calendrier', - map: 'Carte', - favorites: 'Favoris', - settings: 'Réglages', + feed: "Accueil", + calendar: "Calendrier", + map: "Carte", + favorites: "Favoris", + settings: "Réglages", }, search: { - placeholder: 'Rechercher des événements...', - noResults: 'Aucun événement trouvé', + placeholder: "Rechercher des événements...", + noResults: "Aucun événement trouvé", }, favorites: { - title: 'Favoris', - loginPrompt: 'Connectez-vous pour sauvegarder vos événements préférés', - empty: 'Pas encore de favoris', + title: "Favoris", + loginPrompt: "Connectez-vous pour sauvegarder vos événements préférés", + empty: "Pas encore de favoris", emptyHint: "Appuyez sur le cœur d'un événement pour le sauvegarder ici", - logIn: 'Se connecter', + logIn: "Se connecter", }, settings: { - title: 'Réglages', - account: 'Compte', - loginPrompt: 'Connectez-vous pour sauvegarder des événements, confirmer votre présence et acheter des billets.', - logIn: 'Se connecter', - logOut: 'Se déconnecter', - appearance: 'Apparence', - theme: 'Thème', - language: 'Langue', + title: "Réglages", + account: "Compte", + loginPrompt: + "Connectez-vous pour sauvegarder des événements, confirmer votre présence et acheter des billets.", + logIn: "Se connecter", + logOut: "Se déconnecter", + appearance: "Apparence", + theme: "Thème", + language: "Langue", }, }, libra: { nav: { - record: 'Saisir', - transactions: 'Transactions', - balance: 'Solde', - wallet: 'Portefeuille', - settings: 'Param\u00e8tres', + record: "Saisir", + transactions: "Transactions", + balance: "Solde", + wallet: "Portefeuille", + settings: "Param\u00e8tres", }, record: { - title: 'Saisir', - addExpense: 'Ajouter une d\u00e9pense', - addExpenseDescription: 'Soumettre une d\u00e9pense pour approbation', - addIncome: 'Ajouter un revenu', - addIncomeDescription: 'Enregistrer un revenu re\u00e7u', - comingSoon: 'Bient\u00f4t disponible', - drafts: 'Brouillons', - noDrafts: 'Aucun brouillon', - draftAge: 'Enregistr\u00e9 {time}', - saveDraft: 'Enregistrer le brouillon', - deleteDraft: 'Supprimer le brouillon', + title: "Saisir", + addExpense: "Ajouter une d\u00e9pense", + addExpenseDescription: "Soumettre une d\u00e9pense pour approbation", + addIncome: "Ajouter un revenu", + addIncomeDescription: "Enregistrer un revenu re\u00e7u", + comingSoon: "Bient\u00f4t disponible", + drafts: "Brouillons", + noDrafts: "Aucun brouillon", + draftAge: "Enregistr\u00e9 {time}", + saveDraft: "Enregistrer le brouillon", + deleteDraft: "Supprimer le brouillon", }, balance: { - title: 'Solde', - netBalance: 'Solde net', - pending: 'En attente', - pendingExpenses: '{count} d\u00e9pense en attente | {count} d\u00e9penses en attente', - pendingAmount: '{amount} en attente d\u2019approbation', - noBalance: 'Aucune donn\u00e9e de solde disponible', - owedToYou: 'D\u00fb', - youOwe: 'Vous devez', + title: "Solde", + netBalance: "Solde net", + pending: "En attente", + pendingExpenses: + "{count} d\u00e9pense en attente | {count} d\u00e9penses en attente", + pendingAmount: "{amount} en attente d\u2019approbation", + noBalance: "Aucune donn\u00e9e de solde disponible", + owedToYou: "D\u00fb", + youOwe: "Vous devez", }, settings: { - title: 'Param\u00e8tres', - account: 'Compte', - loginPrompt: 'Connectez-vous pour saisir des d\u00e9penses et voir votre solde.', - logIn: 'Se connecter', - logOut: 'Se d\u00e9connecter', - appearance: 'Apparence', - theme: 'Th\u00e8me', - language: 'Langue', + title: "Param\u00e8tres", + account: "Compte", + loginPrompt: + "Connectez-vous pour saisir des d\u00e9penses et voir votre solde.", + logIn: "Se connecter", + logOut: "Se d\u00e9connecter", + appearance: "Apparence", + theme: "Th\u00e8me", + language: "Langue", }, income: { - title: 'Ajouter un revenu', - description: 'Soumettre un revenu pour l\u2019organisation', - selectAccount: 'S\u00e9lectionner le compte de revenus.', - otherAccountHint: 'Utilisez le compte "Other" si vous n\'\u00eates pas s\u00fbr.', - submitIncome: 'Soumettre le revenu', - notAvailable: 'La saisie de revenus n\u2019est pas encore disponible. Cette fonctionnalit\u00e9 arrive bient\u00f4t.', + title: "Ajouter un revenu", + description: "Soumettre un revenu pour l\u2019organisation", + selectAccount: "S\u00e9lectionner le compte de revenus.", + otherAccountHint: + 'Utilisez le compte "Other" si vous n\'\u00eates pas s\u00fbr.', + submitIncome: "Soumettre le revenu", + notAvailable: + "La saisie de revenus n\u2019est pas encore disponible. Cette fonctionnalit\u00e9 arrive bient\u00f4t.", }, }, market: { auth: { - loginPrompt: 'Connectez-vous pour passer commande', - logIn: 'Se connecter', - logInToCheckout: 'Se connecter pour commander', - nostrKeyRequired: 'Une identit\u00e9 Nostr est requise', - nostrKeyDescription: 'Configurez votre cl\u00e9 publique Nostr dans les param\u00e8tres du profil pour passer commande.', + loginPrompt: "Connectez-vous pour passer commande", + logIn: "Se connecter", + logInToCheckout: "Se connecter pour commander", + nostrKeyRequired: "Une identit\u00e9 Nostr est requise", + nostrKeyDescription: + "Configurez votre cl\u00e9 publique Nostr dans les param\u00e8tres du profil pour passer commande.", }, }, dateTimeFormats: { short: { - year: 'numeric', - month: 'short', - day: 'numeric' + year: "numeric", + month: "short", + day: "numeric", }, long: { - year: 'numeric', - month: 'long', - day: 'numeric', - weekday: 'long', - hour: 'numeric', - minute: 'numeric' - } + year: "numeric", + month: "long", + day: "numeric", + weekday: "long", + hour: "numeric", + minute: "numeric", + }, }, numberFormats: { currency: { - style: 'currency', - currencyDisplay: 'symbol' + style: "currency", + currencyDisplay: "symbol", }, decimal: { - style: 'decimal', - minimumFractionDigits: 2 + style: "decimal", + minimumFractionDigits: 2, }, percent: { - style: 'percent', - useGrouping: false - } - } -} + style: "percent", + useGrouping: false, + }, + }, +}; -export default messages +export default messages; diff --git a/src/i18n/types.ts b/src/i18n/types.ts index 2a1b004..7f59c08 100644 --- a/src/i18n/types.ts +++ b/src/i18n/types.ts @@ -1,308 +1,307 @@ export interface LocaleMessages { nav: { - title: string - home: string - directory: string - faq: string - events: string - market: string - chat: string - login: string - logout: string - } + title: string; + home: string; + directory: string; + faq: string; + events: string; + market: string; + chat: string; + login: string; + logout: string; + }; // Add more message categories here common: { - loading: string - error: string - success: string + loading: string; + error: string; + success: string; nav: { - profile: string - preferences: string - profileDescription: string - profileLoggedOutDescription: string - login: string - menu: string - backToHub: string - hub: string - theme: string - themeLight: string - themeDark: string - themeSystem: string - colorScheme: string - palette_catppuccin: string - palette_countrysidecastle: string - palette_darkmatter: string - palette_emeraldforest: string - palette_lightgreen: string - palette_neobrut: string - palette_starrynight: string - language: string - currency: string - currencyComingSoon: string - currencyComingSoonDescription: string - } - } + profile: string; + preferences: string; + profileDescription: string; + profileLoggedOutDescription: string; + login: string; + menu: string; + backToHub: string; + hub: string; + theme: string; + themeLight: string; + themeDark: string; + themeSystem: string; + colorScheme: string; + palette_catppuccin: string; + palette_countrysidecastle: string; + palette_darkmatter: string; + palette_emeraldforest: string; + palette_lightgreen: string; + palette_neobrut: string; + palette_starrynight: string; + language: string; + currency: string; + currencyComingSoon: string; + currencyComingSoonDescription: string; + }; + }; errors: { - notFound: string - serverError: string - networkError: string - } + notFound: string; + serverError: string; + networkError: string; + }; // Language names in the current language locales: { - en: string - es: string - fr: string - de: string - zh: string - } + en: string; + es: string; + fr: string; + de: string; + zh: string; + }; // Events module events?: { - title: string - createNew: string + title: string; + createNew: string; create: { promo: { - title: string - hint: string - empty: string - code: string - codePlaceholder: string - discount: string - maxUses: string - active: string - used: string - add: string - removeLabel: string + title: string; + hint: string; + empty: string; + code: string; + codePlaceholder: string; + discount: string; + maxUses: string; + active: string; + used: string; + add: string; + removeLabel: string; errors: { - required: string - duplicate: string - percentRange: string - maxUsesMin: string - } - } - } - noEvents: string + required: string; + duplicate: string; + percentRange: string; + maxUsesMin: string; + }; + }; + }; + noEvents: string; filters: { - all: string - today: string - tomorrow: string - thisWeek: string - thisMonth: string - myTickets: string - hosting: string - pastEvents: string - past: string - filters: string - clearAll: string - filteringBy: string - removeCategory: string - } - categories: Record + all: string; + today: string; + tomorrow: string; + thisWeek: string; + thisMonth: string; + myTickets: string; + hosting: string; + pastEvents: string; + past: string; + filters: string; + clearAll: string; + filteringBy: string; + removeCategory: string; + }; + categories: Record; detail: { - getTicket: string - contactOrganizer: string - organizer: string - location: string - when: string - tickets: string - ticketsAvailable: string - ticketsRemainingOfTotal: string - ticketsOwned: string - unlimitedTickets: string - buyTicket: string - buyAnotherTicket: string - viewMyTickets: string - soldOut: string - pastEvent: string - loginToBuyTickets: string - logIn: string - free: string - } + getTicket: string; + contactOrganizer: string; + organizer: string; + location: string; + when: string; + tickets: string; + ticketsAvailable: string; + ticketsOwned: string; + unlimitedTickets: string; + buyTicket: string; + buyAnotherTicket: string; + viewMyTickets: string; + soldOut: string; + pastEvent: string; + loginToBuyTickets: string; + logIn: string; + free: string; + }; tickets: { - myTickets: string - scanTicket: string - noTickets: string - paid: string - pending: string - registered: string - } + myTickets: string; + scanTicket: string; + noTickets: string; + paid: string; + pending: string; + registered: string; + }; purchase: { - card: string - continueTo: string - fiatRedirectHint: string - noCheckoutUrl: string - fiatFailed: string - loginRequiredTitle: string - loginRequiredFree: string + card: string; + continueTo: string; + fiatRedirectHint: string; + noCheckoutUrl: string; + fiatFailed: string; + loginRequiredTitle: string; + loginRequiredFree: string; promo: { - label: string - placeholder: string - apply: string - remove: string - checking: string - applied: string - discountLine: string - invalid: string - unverified: string - loginRequiredDiscount: string - } + label: string; + placeholder: string; + apply: string; + remove: string; + checking: string; + applied: string; + discountLine: string; + invalid: string; + unverified: string; + loginRequiredDiscount: string; + }; contact: { - title: string - name: string - namePlaceholder: string - nameRequired: string - email: string - emailHint: string - spamHint: string - emailInvalid: string - confirmEmail: string - emailMismatch: string - } - } + title: string; + name: string; + namePlaceholder: string; + nameRequired: string; + email: string; + emailHint: string; + spamHint: string; + emailInvalid: string; + confirmEmail: string; + emailMismatch: string; + }; + }; checkout: { - title: string - paidTitle: string - processing: string - stillProcessing: string - stillProcessingNoEmail: string - emailedTo: string - cancelled: string - viewTicket: string - viewMyTickets: string - retry: string - ticketN: string - close: string - } + title: string; + paidTitle: string; + processing: string; + stillProcessing: string; + stillProcessingNoEmail: string; + emailedTo: string; + cancelled: string; + viewTicket: string; + viewMyTickets: string; + retry: string; + ticketN: string; + close: string; + }; ticket: { - title: string - loading: string - notFound: string - event: string - holder: string - paid: string - pending: string - registered: string - showAtDoor: string - backToEvent: string - } + title: string; + loading: string; + notFound: string; + event: string; + holder: string; + paid: string; + pending: string; + registered: string; + showAtDoor: string; + backToEvent: string; + }; nav: { - feed: string - calendar: string - map: string - favorites: string - settings: string - } + feed: string; + calendar: string; + map: string; + favorites: string; + settings: string; + }; search: { - placeholder: string - noResults: string - } + placeholder: string; + noResults: string; + }; favorites: { - title: string - loginPrompt: string - empty: string - emptyHint: string - logIn: string - } + title: string; + loginPrompt: string; + empty: string; + emptyHint: string; + logIn: string; + }; settings: { - title: string - account: string - loginPrompt: string - logIn: string - logOut: string - appearance: string - theme: string - language: string - } - } + title: string; + account: string; + loginPrompt: string; + logIn: string; + logOut: string; + appearance: string; + theme: string; + language: string; + }; + }; // Libra accounting module libra?: { nav: { - record: string - transactions: string - balance: string - wallet: string - settings: string - } + record: string; + transactions: string; + balance: string; + wallet: string; + settings: string; + }; record: { - title: string - addExpense: string - addExpenseDescription: string - addIncome: string - addIncomeDescription: string - comingSoon: string - drafts: string - noDrafts: string - draftAge: string - saveDraft: string - deleteDraft: string - } + title: string; + addExpense: string; + addExpenseDescription: string; + addIncome: string; + addIncomeDescription: string; + comingSoon: string; + drafts: string; + noDrafts: string; + draftAge: string; + saveDraft: string; + deleteDraft: string; + }; balance: { - title: string - netBalance: string - pending: string - pendingExpenses: string - pendingAmount: string - noBalance: string - owedToYou: string - youOwe: string - } + title: string; + netBalance: string; + pending: string; + pendingExpenses: string; + pendingAmount: string; + noBalance: string; + owedToYou: string; + youOwe: string; + }; settings: { - title: string - account: string - loginPrompt: string - logIn: string - logOut: string - appearance: string - theme: string - language: string - } + title: string; + account: string; + loginPrompt: string; + logIn: string; + logOut: string; + appearance: string; + theme: string; + language: string; + }; income: { - title: string - description: string - selectAccount: string - otherAccountHint: string - submitIncome: string - notAvailable: string - } - } + title: string; + description: string; + selectAccount: string; + otherAccountHint: string; + submitIncome: string; + notAvailable: string; + }; + }; // Market module market?: { auth: { - loginPrompt: string - logIn: string - logInToCheckout: string - nostrKeyRequired: string - nostrKeyDescription: string - } - } + loginPrompt: string; + logIn: string; + logInToCheckout: string; + nostrKeyRequired: string; + nostrKeyDescription: string; + }; + }; // Add date/time formats dateTimeFormats: { short: { - year: 'numeric' - month: 'short' - day: 'numeric' - } + year: "numeric"; + month: "short"; + day: "numeric"; + }; long: { - year: 'numeric' - month: 'long' - day: 'numeric' - weekday: 'long' - hour: 'numeric' - minute: 'numeric' - } - } + year: "numeric"; + month: "long"; + day: "numeric"; + weekday: "long"; + hour: "numeric"; + minute: "numeric"; + }; + }; // Add number formats numberFormats: { currency: { - style: 'currency' - currencyDisplay: 'symbol' - } + style: "currency"; + currencyDisplay: "symbol"; + }; decimal: { - style: 'decimal' - minimumFractionDigits: 2 - } + style: "decimal"; + minimumFractionDigits: 2; + }; percent: { - style: 'percent' - useGrouping: false - } - } -} \ No newline at end of file + style: "percent"; + useGrouping: false; + }; + }; +} diff --git a/src/modules/events/components/CreateEventDialog.vue b/src/modules/events/components/CreateEventDialog.vue index 7bd43a0..76a476a 100644 --- a/src/modules/events/components/CreateEventDialog.vue +++ b/src/modules/events/components/CreateEventDialog.vue @@ -1,17 +1,17 @@