- History ({pastOrFinalTrades.length})
+ {t("page.history", { count: pastOrFinalTrades.length })}
{pastOrFinalTrades.map((trade) => {
diff --git a/frontend/locales/ca/exchange.json b/frontend/locales/ca/exchange.json
index 2362763..0fa6c43 100644
--- a/frontend/locales/ca/exchange.json
+++ b/frontend/locales/ca/exchange.json
@@ -8,10 +8,70 @@
},
"direction": {
"buy": "COMPRAR BTC",
- "sell": "VENDRE BTC"
+ "sell": "VENDRE BTC",
+ "buyShort": "Comprar BTC",
+ "sellShort": "Vendre BTC"
},
"transferMethod": {
"onchain": "Onchain",
"lightning": "Lightning"
+ },
+ "page": {
+ "title": "Intercanviar Bitcoin",
+ "subtitle": "Compra o ven Bitcoin amb una prima del 5%",
+ "viewExistingTrade": "Veure la teva operació existent →"
+ },
+ "steps": {
+ "details": "Detalls de l'Intercanvi",
+ "booking": "Reservar Cita",
+ "confirm": "Confirmar"
+ },
+ "detailsStep": {
+ "paymentMethod": "Mètode de Pagament",
+ "required": "*",
+ "lightningThreshold": "Els pagaments Lightning només estan disponibles per importants fins a €{max}",
+ "amount": "Quantitat (EUR)",
+ "summaryBuy": "Compres {sats}, vens {eur}",
+ "summarySell": "Compres {eur}, vens {sats}",
+ "continueToBooking": "Continuar a Reserva"
+ },
+ "bookingStep": {
+ "yourExchange": "El Teu Intercanvi",
+ "edit": "Editar",
+ "buy": "Comprar",
+ "sell": "Vendre",
+ "receiveVia": "Rebre via",
+ "sendVia": "Enviar via",
+ "selectDate": "Seleccionar una Data",
+ "existingTradeWarning": "Ja tens una operació reservada en aquest dia. Només pots reservar una operació per dia.",
+ "viewExistingTrade": "Veure la teva operació existent →",
+ "availableSlots": "Espais Disponibles per a",
+ "loadingSlots": "Carregant espais...",
+ "noSlots": "No hi ha espais disponibles per a aquesta data"
+ },
+ "confirmationStep": {
+ "appointment": "Cita",
+ "edit": "Editar",
+ "confirmTrade": "Confirmar Operació",
+ "time": "Hora:",
+ "direction": "Direcció:",
+ "eur": "EUR:",
+ "btc": "BTC:",
+ "rate": "Taxa:",
+ "payment": "Pagament:",
+ "receiveVia": "Rebre via",
+ "sendVia": "Enviar via",
+ "booking": "Reservant...",
+ "priceStale": "Preu Desactualitzat",
+ "confirmBuy": "Confirmar Compra",
+ "confirmSell": "Confirmar Venda",
+ "back": "Enrere"
+ },
+ "priceDisplay": {
+ "loading": "Carregant preu...",
+ "market": "Mercat:",
+ "ourPrice": "El nostre preu:",
+ "updated": "Actualitzat",
+ "stale": "(desactualitzat)"
}
}
diff --git a/frontend/locales/ca/invites.json b/frontend/locales/ca/invites.json
new file mode 100644
index 0000000..dea790b
--- /dev/null
+++ b/frontend/locales/ca/invites.json
@@ -0,0 +1,17 @@
+{
+ "page": {
+ "title": "Les Meves Invitacions",
+ "subtitle": "Comparteix els teus codis d'invitació amb amics perquè s'uneixin",
+ "noInvites": "Encara no tens invitacions.",
+ "noInvitesHint": "Contacta amb un administrador si necessites codis d'invitació per compartir.",
+ "available": "Disponibles ({count})",
+ "availableHint": "Comparteix aquests enllaços amb les persones que vulguis convidar",
+ "used": "Usades ({count})",
+ "revoked": "Revocades ({count})",
+ "copyLink": "Copiar Enllaç",
+ "copied": "Copiat!",
+ "usedBy": "per {email}",
+ "usedStatus": "Usada",
+ "revokedStatus": "Revocada"
+ }
+}
diff --git a/frontend/locales/ca/profile.json b/frontend/locales/ca/profile.json
new file mode 100644
index 0000000..30edb9c
--- /dev/null
+++ b/frontend/locales/ca/profile.json
@@ -0,0 +1,33 @@
+{
+ "page": {
+ "title": "El Meu Perfil",
+ "subtitle": "Gestiona la teva informació de contacte"
+ },
+ "form": {
+ "email": "Correu Electrònic",
+ "emailHint": "Aquest és el teu correu d'inici de sessió i no es pot canviar aquí.",
+ "invitedBy": "Convidat Per",
+ "invitedByHint": "L'usuari que et va convidar a unir-te.",
+ "readOnly": "Només lectura",
+ "contactDetails": "Detalls de Contacte",
+ "contactDetailsHint": "Aquests són només per a fins de comunicació — no afectaran el teu inici de sessió.",
+ "contactEmail": "Correu de Contacte",
+ "telegram": "Telegram",
+ "signal": "Signal",
+ "nostrNpub": "Nostr (npub)",
+ "saving": "Desant...",
+ "saveChanges": "Desar Canvis"
+ },
+ "messages": {
+ "loadError": "Error en carregar el perfil",
+ "saveSuccess": "Perfil desat amb èxit!",
+ "fixErrors": "Si us plau, corregeix els errors a continuació",
+ "networkError": "Error de xarxa. Si us plau, intenta-ho de nou."
+ },
+ "placeholders": {
+ "contactEmail": "alternate@example.com",
+ "telegram": "@username",
+ "signal": "username.01",
+ "nostrNpub": "npub1..."
+ }
+}
diff --git a/frontend/locales/ca/trades.json b/frontend/locales/ca/trades.json
new file mode 100644
index 0000000..547f9af
--- /dev/null
+++ b/frontend/locales/ca/trades.json
@@ -0,0 +1,16 @@
+{
+ "page": {
+ "title": "Les Meves Operacions",
+ "subtitle": "Veure i gestionar les teves operacions de Bitcoin",
+ "loadingTrades": "Carregant operacions...",
+ "noTrades": "Encara no tens operacions.",
+ "startTrading": "Començar a operar",
+ "upcoming": "Properes ({count})",
+ "history": "Historial ({count})"
+ },
+ "trade": {
+ "rate": "Taxa:",
+ "cancel": "Cancel·lar",
+ "viewDetails": "Veure Detalls"
+ }
+}
diff --git a/frontend/locales/en/exchange.json b/frontend/locales/en/exchange.json
index 13297c6..7e1d4ee 100644
--- a/frontend/locales/en/exchange.json
+++ b/frontend/locales/en/exchange.json
@@ -8,10 +8,70 @@
},
"direction": {
"buy": "BUY BTC",
- "sell": "SELL BTC"
+ "sell": "SELL BTC",
+ "buyShort": "Buy BTC",
+ "sellShort": "Sell BTC"
},
"transferMethod": {
"onchain": "Onchain",
"lightning": "Lightning"
+ },
+ "page": {
+ "title": "Exchange Bitcoin",
+ "subtitle": "Buy or sell Bitcoin with a 5% premium",
+ "viewExistingTrade": "View your existing trade →"
+ },
+ "steps": {
+ "details": "Exchange Details",
+ "booking": "Book Appointment",
+ "confirm": "Confirm"
+ },
+ "detailsStep": {
+ "paymentMethod": "Payment Method",
+ "required": "*",
+ "lightningThreshold": "Lightning payments are only available for amounts up to €{max}",
+ "amount": "Amount (EUR)",
+ "summaryBuy": "You buy {sats}, you sell {eur}",
+ "summarySell": "You buy {eur}, you sell {sats}",
+ "continueToBooking": "Continue to Booking"
+ },
+ "bookingStep": {
+ "yourExchange": "Your Exchange",
+ "edit": "Edit",
+ "buy": "Buy",
+ "sell": "Sell",
+ "receiveVia": "Receive via",
+ "sendVia": "Send via",
+ "selectDate": "Select a Date",
+ "existingTradeWarning": "You already have a trade booked on this day. You can only book one trade per day.",
+ "viewExistingTrade": "View your existing trade →",
+ "availableSlots": "Available Slots for",
+ "loadingSlots": "Loading slots...",
+ "noSlots": "No available slots for this date"
+ },
+ "confirmationStep": {
+ "appointment": "Appointment",
+ "edit": "Edit",
+ "confirmTrade": "Confirm Trade",
+ "time": "Time:",
+ "direction": "Direction:",
+ "eur": "EUR:",
+ "btc": "BTC:",
+ "rate": "Rate:",
+ "payment": "Payment:",
+ "receiveVia": "Receive via",
+ "sendVia": "Send via",
+ "booking": "Booking...",
+ "priceStale": "Price Stale",
+ "confirmBuy": "Confirm Buy",
+ "confirmSell": "Confirm Sell",
+ "back": "Back"
+ },
+ "priceDisplay": {
+ "loading": "Loading price...",
+ "market": "Market:",
+ "ourPrice": "Our price:",
+ "updated": "Updated",
+ "stale": "(stale)"
}
}
diff --git a/frontend/locales/en/invites.json b/frontend/locales/en/invites.json
new file mode 100644
index 0000000..0961e8e
--- /dev/null
+++ b/frontend/locales/en/invites.json
@@ -0,0 +1,17 @@
+{
+ "page": {
+ "title": "My Invites",
+ "subtitle": "Share your invite codes with friends to let them join",
+ "noInvites": "You don't have any invites yet.",
+ "noInvitesHint": "Contact an admin if you need invite codes to share.",
+ "available": "Available ({count})",
+ "availableHint": "Share these links with people you want to invite",
+ "used": "Used ({count})",
+ "revoked": "Revoked ({count})",
+ "copyLink": "Copy Link",
+ "copied": "Copied!",
+ "usedBy": "by {email}",
+ "usedStatus": "Used",
+ "revokedStatus": "Revoked"
+ }
+}
diff --git a/frontend/locales/en/profile.json b/frontend/locales/en/profile.json
new file mode 100644
index 0000000..4e0cf03
--- /dev/null
+++ b/frontend/locales/en/profile.json
@@ -0,0 +1,33 @@
+{
+ "page": {
+ "title": "My Profile",
+ "subtitle": "Manage your contact information"
+ },
+ "form": {
+ "email": "Email",
+ "emailHint": "This is your login email and cannot be changed here.",
+ "invitedBy": "Invited By",
+ "invitedByHint": "The user who invited you to join.",
+ "readOnly": "Read only",
+ "contactDetails": "Contact Details",
+ "contactDetailsHint": "These are for communication purposes only — they won't affect your login.",
+ "contactEmail": "Contact Email",
+ "telegram": "Telegram",
+ "signal": "Signal",
+ "nostrNpub": "Nostr (npub)",
+ "saving": "Saving...",
+ "saveChanges": "Save Changes"
+ },
+ "messages": {
+ "loadError": "Failed to load profile",
+ "saveSuccess": "Profile saved successfully!",
+ "fixErrors": "Please fix the errors below",
+ "networkError": "Network error. Please try again."
+ },
+ "placeholders": {
+ "contactEmail": "alternate@example.com",
+ "telegram": "@username",
+ "signal": "username.01",
+ "nostrNpub": "npub1..."
+ }
+}
diff --git a/frontend/locales/en/trades.json b/frontend/locales/en/trades.json
new file mode 100644
index 0000000..a4917a7
--- /dev/null
+++ b/frontend/locales/en/trades.json
@@ -0,0 +1,16 @@
+{
+ "page": {
+ "title": "My Trades",
+ "subtitle": "View and manage your Bitcoin trades",
+ "loadingTrades": "Loading trades...",
+ "noTrades": "You don't have any trades yet.",
+ "startTrading": "Start trading",
+ "upcoming": "Upcoming ({count})",
+ "history": "History ({count})"
+ },
+ "trade": {
+ "rate": "Rate:",
+ "cancel": "Cancel",
+ "viewDetails": "View Details"
+ }
+}
diff --git a/frontend/locales/es/exchange.json b/frontend/locales/es/exchange.json
index f755651..78a8a6d 100644
--- a/frontend/locales/es/exchange.json
+++ b/frontend/locales/es/exchange.json
@@ -8,10 +8,70 @@
},
"direction": {
"buy": "COMPRAR BTC",
- "sell": "VENDER BTC"
+ "sell": "VENDER BTC",
+ "buyShort": "Comprar BTC",
+ "sellShort": "Vender BTC"
},
"transferMethod": {
"onchain": "Onchain",
"lightning": "Lightning"
+ },
+ "page": {
+ "title": "Intercambiar Bitcoin",
+ "subtitle": "Compra o vende Bitcoin con una prima del 5%",
+ "viewExistingTrade": "Ver tu operación existente →"
+ },
+ "steps": {
+ "details": "Detalles del Intercambio",
+ "booking": "Reservar Cita",
+ "confirm": "Confirmar"
+ },
+ "detailsStep": {
+ "paymentMethod": "Método de Pago",
+ "required": "*",
+ "lightningThreshold": "Los pagos Lightning solo están disponibles para montos de hasta €{max}",
+ "amount": "Cantidad (EUR)",
+ "summaryBuy": "Compras {sats}, vendes {eur}",
+ "summarySell": "Compras {eur}, vendes {sats}",
+ "continueToBooking": "Continuar a Reserva"
+ },
+ "bookingStep": {
+ "yourExchange": "Tu Intercambio",
+ "edit": "Editar",
+ "buy": "Comprar",
+ "sell": "Vender",
+ "receiveVia": "Recibir vía",
+ "sendVia": "Enviar vía",
+ "selectDate": "Seleccionar una Fecha",
+ "existingTradeWarning": "Ya tienes una operación reservada en este día. Solo puedes reservar una operación por día.",
+ "viewExistingTrade": "Ver tu operación existente →",
+ "availableSlots": "Espacios Disponibles para",
+ "loadingSlots": "Cargando espacios...",
+ "noSlots": "No hay espacios disponibles para esta fecha"
+ },
+ "confirmationStep": {
+ "appointment": "Cita",
+ "edit": "Editar",
+ "confirmTrade": "Confirmar Operación",
+ "time": "Hora:",
+ "direction": "Dirección:",
+ "eur": "EUR:",
+ "btc": "BTC:",
+ "rate": "Tasa:",
+ "payment": "Pago:",
+ "receiveVia": "Recibir vía",
+ "sendVia": "Enviar vía",
+ "booking": "Reservando...",
+ "priceStale": "Precio Desactualizado",
+ "confirmBuy": "Confirmar Compra",
+ "confirmSell": "Confirmar Venta",
+ "back": "Atrás"
+ },
+ "priceDisplay": {
+ "loading": "Cargando precio...",
+ "market": "Mercado:",
+ "ourPrice": "Nuestro precio:",
+ "updated": "Actualizado",
+ "stale": "(desactualizado)"
}
}
diff --git a/frontend/locales/es/invites.json b/frontend/locales/es/invites.json
new file mode 100644
index 0000000..e8e3ca7
--- /dev/null
+++ b/frontend/locales/es/invites.json
@@ -0,0 +1,17 @@
+{
+ "page": {
+ "title": "Mis Invitaciones",
+ "subtitle": "Comparte tus códigos de invitación con amigos para que se unan",
+ "noInvites": "Aún no tienes invitaciones.",
+ "noInvitesHint": "Contacta con un administrador si necesitas códigos de invitación para compartir.",
+ "available": "Disponibles ({count})",
+ "availableHint": "Comparte estos enlaces con las personas que quieras invitar",
+ "used": "Usadas ({count})",
+ "revoked": "Revocadas ({count})",
+ "copyLink": "Copiar Enlace",
+ "copied": "¡Copiado!",
+ "usedBy": "por {email}",
+ "usedStatus": "Usada",
+ "revokedStatus": "Revocada"
+ }
+}
diff --git a/frontend/locales/es/profile.json b/frontend/locales/es/profile.json
new file mode 100644
index 0000000..dd99fe3
--- /dev/null
+++ b/frontend/locales/es/profile.json
@@ -0,0 +1,33 @@
+{
+ "page": {
+ "title": "Mi Perfil",
+ "subtitle": "Gestiona tu información de contacto"
+ },
+ "form": {
+ "email": "Correo Electrónico",
+ "emailHint": "Este es tu correo de inicio de sesión y no se puede cambiar aquí.",
+ "invitedBy": "Invitado Por",
+ "invitedByHint": "El usuario que te invitó a unirte.",
+ "readOnly": "Solo lectura",
+ "contactDetails": "Detalles de Contacto",
+ "contactDetailsHint": "Estos son solo para fines de comunicación — no afectarán tu inicio de sesión.",
+ "contactEmail": "Correo de Contacto",
+ "telegram": "Telegram",
+ "signal": "Signal",
+ "nostrNpub": "Nostr (npub)",
+ "saving": "Guardando...",
+ "saveChanges": "Guardar Cambios"
+ },
+ "messages": {
+ "loadError": "Error al cargar el perfil",
+ "saveSuccess": "¡Perfil guardado exitosamente!",
+ "fixErrors": "Por favor corrige los errores a continuación",
+ "networkError": "Error de red. Por favor intenta de nuevo."
+ },
+ "placeholders": {
+ "contactEmail": "alternate@example.com",
+ "telegram": "@username",
+ "signal": "username.01",
+ "nostrNpub": "npub1..."
+ }
+}
diff --git a/frontend/locales/es/trades.json b/frontend/locales/es/trades.json
new file mode 100644
index 0000000..40c22c4
--- /dev/null
+++ b/frontend/locales/es/trades.json
@@ -0,0 +1,16 @@
+{
+ "page": {
+ "title": "Mis Operaciones",
+ "subtitle": "Ver y gestionar tus operaciones de Bitcoin",
+ "loadingTrades": "Cargando operaciones...",
+ "noTrades": "Aún no tienes operaciones.",
+ "startTrading": "Empezar a operar",
+ "upcoming": "Próximas ({count})",
+ "history": "Historial ({count})"
+ },
+ "trade": {
+ "rate": "Tasa:",
+ "cancel": "Cancelar",
+ "viewDetails": "Ver Detalles"
+ }
+}