diff --git a/src/i18n/locales/en.ts b/src/i18n/locales/en.ts index f3475df..d0dd194 100644 --- a/src/i18n/locales/en.ts +++ b/src/i18n/locales/en.ts @@ -58,6 +58,27 @@ const messages: LocaleMessages = { events: { 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}', + errors: { + required: 'Enter a code', + duplicate: 'Duplicate code', + percentRange: 'Between 1 and 100', + maxUsesMin: 'Must be 1 or more', + }, + }, + }, noEvents: 'No events found', filters: { all: 'All', @@ -137,6 +158,18 @@ const messages: LocaleMessages = { 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.', + }, contact: { title: 'Your details', name: 'Name', diff --git a/src/i18n/locales/es.ts b/src/i18n/locales/es.ts index 1e080fe..2177fc7 100644 --- a/src/i18n/locales/es.ts +++ b/src/i18n/locales/es.ts @@ -58,6 +58,27 @@ const messages: LocaleMessages = { events: { 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}', + errors: { + 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', filters: { all: 'Todas', @@ -137,6 +158,18 @@ const messages: LocaleMessages = { 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.', + }, contact: { title: 'Tus datos', name: 'Nombre', diff --git a/src/i18n/locales/fr.ts b/src/i18n/locales/fr.ts index 7c16e79..54b3676 100644 --- a/src/i18n/locales/fr.ts +++ b/src/i18n/locales/fr.ts @@ -58,6 +58,27 @@ const messages: LocaleMessages = { events: { 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}', + errors: { + required: 'Saisissez un code', + duplicate: 'Code en double', + percentRange: 'Entre 1 et 100', + maxUsesMin: 'Doit être 1 ou plus', + }, + }, + }, noEvents: 'Aucun événement trouvé', filters: { all: 'Tout', @@ -137,6 +158,18 @@ const messages: LocaleMessages = { 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})', + 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.', + }, contact: { title: 'Vos coordonnées', name: 'Nom', diff --git a/src/i18n/types.ts b/src/i18n/types.ts index c41389f..2a1b004 100644 --- a/src/i18n/types.ts +++ b/src/i18n/types.ts @@ -59,6 +59,27 @@ export interface LocaleMessages { events?: { 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 + errors: { + required: string + duplicate: string + percentRange: string + maxUsesMin: string + } + } + } noEvents: string filters: { all: string @@ -112,6 +133,18 @@ export interface LocaleMessages { 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 + } contact: { title: string name: string