aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/components/LocaleSelector.svelte3
-rw-r--r--src/lib/utils.js6
-rw-r--r--src/locales/en.json5
-rw-r--r--src/locales/es.json301
-rw-r--r--src/routes/(app)/+layout.svelte31
-rw-r--r--src/routes/(app)/[username]/invoice/[id]/+page.svelte4
-rw-r--r--src/routes/(app)/[username]/settings/[...tab]/+page.server.js2
-rw-r--r--src/routes/(app)/[username]/settings/[...tab]/+page.svelte12
-rw-r--r--src/routes/(app)/[username]/settings/[...tab]/_pos.svelte4
-rw-r--r--src/routes/+layout.server.js10
10 files changed, 217 insertions, 161 deletions
diff --git a/src/components/LocaleSelector.svelte b/src/components/LocaleSelector.svelte
index 8ec5def0..aeca86f2 100644
--- a/src/components/LocaleSelector.svelte
+++ b/src/components/LocaleSelector.svelte
@@ -1,9 +1,10 @@
<script>
import { t, locale, locales } from "$lib/translations";
+ export let user;
export let style;
</script>
-<select name="language" bind:value={$locale} class={style}>
+<select name="language" bind:value={user.language} class={style}>
{#each $locales as locale}
<option value={locale}>{$t(`lang.${locale}`)}</option>
{/each}
diff --git a/src/lib/utils.js b/src/lib/utils.js
index 738413bf..4ffbb8b0 100644
--- a/src/lib/utils.js
+++ b/src/lib/utils.js
@@ -101,7 +101,11 @@ export function reverseFormat(val, locale) {
export let protectedRoutes = [/customers/, /settings/, /payments/];
+let recent = [];
export let success = (m, clear = true) => {
+ if (recent.includes(m)) return;
+ recent.push(m);
+ setTimeout(() => (recent = []), 5000);
if (clear) toast.pop();
toast.push(m, {
theme: {
@@ -110,7 +114,7 @@ export let success = (m, clear = true) => {
});
};
-export let warning = (m, clear = true) => {
+ export let warning = (m, clear = true) => {
if (clear) toast.pop();
toast.push(m, {
theme: {
diff --git a/src/locales/en.json b/src/locales/en.json
index 8b1039c1..acd94905 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -201,6 +201,7 @@
"placeholder": "Paste a bitcoin address, lightning invoice or coinos username"
},
"settings": {
+ "shopify": "Shopify integration",
"notifications": "Payment notifications",
"notificationsDesc": "Receive an email whenever a payment lands in your account",
"seedPhrase": "Seed phrase",
@@ -333,6 +334,8 @@
"redeemedBy": "Redeemed by",
"sendMessage": "Write a message...",
"fundsClaimed": "Funds claimed!",
- "print": "Print"
+ "print": "Print",
+ "onlyLbtc": "We only support",
+ "dontDeposit": "don't deposit other assets yet"
}
}
diff --git a/src/locales/es.json b/src/locales/es.json
index 29508b27..d0a2687e 100644
--- a/src/locales/es.json
+++ b/src/locales/es.json
@@ -1,103 +1,86 @@
{
"404": {
"404": "404",
- "pageNotFound": "Pagina no encontrada."
+ "pageNotFound": "Página no encontrada."
},
"about": {
- "header": "Sobre Nosotros",
- "p1": "Coinos es una aplicación de pagos en bitcoin de código abierto. Este desarrollo comenzó en septiembre de 2012 en Vancouver como una forma de proporcionar a los comerciantes locales una forma conveniente de aceptar pagos con bitcoin.",
- "p2": "Descarga el código fuente para ejecutar una instancia y conectarla a tu propio nodo bitcoin y lightning. Te ayudaremos a convertirte en un excelente custodio y proveedor de pagos para tu comunidad.",
- "p3": "Las transferencias de bitcoin entre usuarios en nuestro servidor se realizan off-chain, por lo que son completamente gratuitas, instantáneas e ilimitadas.",
+ "header": "Acerca de Ocultar",
"team": {
- "header": "Nuestro Equipo",
+ "header": "El Equipo",
"adam": {
"name": "Adam Soltys",
- "position": "Director de Tecnología",
- "bio": "Adam es un desarrollador web y un entusiasta de bitcoin que cree que el dinero sólido es clave para aumentar la prosperidad global. Vive en la ciudad de North Vancouver con su esposa Chelsea y sus dos hijos."
+ "position": "Fundador y CTO",
+ "bio": "Adam es un ingeniero de software que cree que la adopción de un dinero sólido impulsará la prosperidad mundial. Vive en North Vancouver con su esposa, hija e hijo."
},
"cole": {
"name": "Cole",
- "position": "Profesional de Bitcoin",
- "bio": "Como profesional certificado de Bitcoin, Cole es una persona motivada y apasionada por la libertad. Conoció el bitcoin en 2016 y lo estudió en profundidad. Ahora quiere presentarle la Red Lightning a tantos usuarios como sea posible."
+ "position": "Desarrollo de Negocios",
+ "bio": "Cole es un individuo motivado con pasión por la libertad. Descubrió bitcoin en 2016 y lo estudió a fondo. Ahora quiere introducir la red Lightning a tantos usuarios como sea posible."
}
},
"locations": {
- "header": "Locaciones",
- "description": "Aquí algunas empresas que aceptan bitcoin con Coinos. ¡Esperamos que el tuyo sea el próximo!"
+ "header": "Ubicaciones",
+ "description": "Aquí hay algunos negocios que aceptan bitcoin con Coinos. ¡Esperamos que el tuyo sea el siguiente!"
}
},
"error": {
"header": "Error",
- "message": "Vuelva a intentarlo o póngase en contacto con el soporte.",
- "signIn": "Por favor inicie sesión para continuar."
+ "message": "Por favor, inténtelo de nuevo o contacte con el soporte.",
+ "signIn": "Por favor, inicie sesión para continuar.",
+ "unrecognizedInput": "Entrada no reconocida"
},
"faq": {
- "header": "FAQ",
- "why": {
- "question": "¿Por qué aceptar Bitcoin?",
- "answer": "Con Bitcoin, los comerciantes ahorran en comisiones, los consumidores obtienen privacidad y los ahorradores ganan poder adquisitivo. Promocionaremos tu negocio a una comunidad entusiasta que prefiere comprar en lugares que aceptan Bitcoin."
- },
+ "header": "Preguntas Frecuentes",
"cost": {
- "question": "¿Cuánto cuesta?",
- "answer": "Recibir pagos en tu cuenta es gratis. Las retiradas a carteras externas incurren en una pequeña tarifa que varía según las condiciones de la red. Cobramos el 0.1% para convertir entre Bitcoin lightning y on-chain. Enviar a otras cuentas de Coinos es gratis."
- },
- "individuals": {
- "question": "¿Quién puede usarlo?",
- "answer": "Cualquiera, en cualquier parte del mundo. Coinos es adecuado para individuos y negocios."
+ "question": "¿Cuál es el costo?",
+ "answer": "Recibir pagos en tu cuenta es gratuito. Las retiradas a carteras externas tienen una pequeña tarifa que varía según las condiciones de la red."
},
"compatibility": {
"question": "¿Necesito algún dispositivo o software especial?",
- "answer": "No, Coinos es una aplicación web que funciona en cualquier lugar que tenga Internet. Los comerciantes pueden usarla en una tableta o mostrar un código QR para que los clientes lo escaneen con sus teléfonos."
+ "answer": "No, Coinos funciona en cualquier lugar que tenga Internet. Los comerciantes pueden usarlo en una tableta o colocar un código QR para que los clientes lo escaneen con su teléfono."
},
"safety": {
"question": "¿Cuándo se liquidan mis fondos?",
- "answer": "Los pagos lightning se liquidan al instante. Puedes retirar tu saldo a otra cartera en segundos. Los depósitos en cadena tardan en promedio de 5 a 10 minutos en confirmarse."
+ "answer": "Los pagos de Lightning se liquidan instantáneamente. Puedes retirar tu saldo a otra cartera en segundos. Los depósitos en cadena tardan de 5 a 10 minutos en confirmarse en promedio."
},
"pos": {
"question": "¿Puede Coinos integrarse con mi PoS existente?",
- "answer": "Recomendamos ingresar las ventas en tu PoS existente como transacciones en efectivo."
- },
- "accounting": {
- "question": "¿Qué pasa con la contabilidad?",
- "answer": "Mostramos todos los pagos en términos de tu moneda local y te permitimos filtrar por fecha para que puedas informar tus ingresos como de costumbre. Puedes exportar tu historial de cuenta a un archivo csv. Si vendes Bitcoin con beneficio, es posible que desees informar las ganancias de capital."
- },
- "offramp": {
- "question": "¿Puedo convertir el Bitcoin que recibo a mi moneda local?",
- "answer": "Puedes retirar tus fondos en cualquier momento a un exchange o correduría para vender tu Bitcoin y recibir una transferencia bancaria. Es posible que estemos dispuestos a proporcionar liquidación directa a través de e-transferencia a comerciantes canadienses seleccionados."
+ "answer": "Recomendamos registrar las ventas en tu PoS existente como transacciones en efectivo."
},
"bitcoin": {
"question": "¿Qué puedo hacer con Bitcoin?",
- "answer": "Gástalo en otros comerciantes o paga tus gastos con él al conseguir que tu personal, proveedores y arrendador lo acepten."
+ "answer": "Gastarlo en otros comerciantes o pagar tus gastos con él consiguiendo que tu personal, proveedores y arrendador lo acepten."
}
},
"footer": {
- "company": "Empresa",
+ "company": "Compañía",
"followUs": "Síguenos",
"github": "GitHub",
- "jobs": "Trabaje con nosotros",
+ "linktree": "Linktree",
+ "jobs": "Empleos",
"support": "Soporte",
"telegram": "Telegram",
"twitter": "Twitter",
- "news": "Noticias"
+ "documentation": "Documentación"
},
"howItWorks": {
- "header": "Cómo funciona",
+ "header": "Cómo Funciona",
"step1": {
"header": "1. Crea tu cuenta",
- "description": "Un nombre de usuario y una contraseña es todo lo que necesita para comenzar."
+ "description": "Solo necesitas un nombre de usuario y contraseña para empezar."
},
"step2": {
- "header": "2. Cobra tus pagos",
- "description": "Lo mismo que harías normalmente, pero con bitcoin."
+ "header": "2. Solicita pagos",
+ "description": "Igual que lo haces normalmente, pero con bitcoin."
},
"step3": {
"header": "3. ¡Eso es todo!",
- "description": "Haz pagos con otros comerciantes o guarda tu bitcoin para días difíciles, la elección es tuya."
+ "description": "Gasta tu moneda inmediatamente o mírala aumentar de valor."
}
},
"invoice": {
"addTip": "Añadir propina",
- "addTipq": "Añadir propina?",
+ "addTipq": "¿Añadir propina?",
"done": "Hecho",
"paymentSuccessful": "¡Pago recibido!",
"invoice": "Factura",
@@ -105,170 +88,226 @@
"tip": "Propina"
},
"jobs": {
- "header": "Trabaje con nosotros",
- "subheader": "Ofertas de Trabajo",
- "pitch1": "Coinos está activamente buscando desarrolladores para unirse a nuestro equipo en crecimiento (tiempo completo o medio tiempo, trabajo remoto OK).",
- "pitch2": "¿Emocionado por trabajar en bitcoin de código abierto? Entonces eche un vistazo a nuestros repositorios en",
+ "header": "Empleos",
+ "subheader": "Vacantes Actuales",
+ "pitch1": "Coinos está buscando activamente desarrolladores para unirse a nuestro equipo en crecimiento (tiempo completo o parcial, trabajo remoto OK).",
+ "pitch2": "¿Te emociona trabajar en bitcoin de código abierto? Entonces echa un vistazo a nuestros repositorios en",
"github": "GitHub",
- "pitch3": "Si crees que puedes generar impacto, nos encantaría saber de ti. Envíanos tu currículum a"
+ "pitch3": "Si crees que puedes tener un impacto, nos encantaría saber de ti. Envíanos tu currículum a"
},
"landing": {
"header_before_icon": "La",
- "header_with_icon": "manera",
- "header_after_icon": "más fácil de aceptar bitcoins en tu tienda.",
- "subheader": "Aumenta tu número de clientes e ingresos al aceptar bitcoin con una aplicación web fácil de usar. No requiere software ni hardware.",
+ "header_with_icon": "manera más fácil",
+ "header_after_icon": "de empezar con bitcoin.",
+ "subheader": "Una billetera web gratuita y página de pago para todos.",
"info1": {
"title": "Pagos instantáneos a través de Lightning",
- "description": "El momento en que su cliente envía un pago, este llega inmediatamente. Sin esperar liquidaciones bancarias ni preocuparse por cargos extras. Liquidación instantánea, en segundos. Diga adiós a los cargos del 3% de las tarifas en tarjetas de crédito."
+ "description": "Facilitamos que los comerciantes reciban pagos al por menor. Sin esperar liquidaciones bancarias o preocuparse por contracargos. Liquidación instantánea, en segundos. Adiós a las tarifas del 3% de las tarjetas."
},
"info2": {
- "title": "Fácil de usar",
- "description1": "Solo ingrese una cantidad en su moneda local, comparta el código QR y listo.",
- "description2": "Hacemos todo el trabajo pesado para que pueda concentrarse en su negocio.",
- "description3": "Siempre tiene la opción de tomar la custodia de sus fondos al retirarlos instantáneamente en cualquier momento."
+ "title": "Simple de usar",
+ "description1": "Simplemente ingresa una cantidad en tu moneda local, comparte el código QR y ya está.",
+ "description2": "Hacemos todo el trabajo duro para que puedas centrarte en tu negocio.",
+ "description3": "Siempre tienes la opción de tomar custodia de tus fondos retirándolos al instante en cualquier momento."
},
"info3": {
- "title": "Maneja tu marca a tu manera!",
- "description": "Personalice la apariencia y el estilo del punto de venta de tu negocio a tu gusto: depende totalmente de ti."
+ "title": "¡Personalízalo a tu manera!",
+ "description": "Personaliza el aspecto y sensación de tu página de perfil, o déjalo por defecto - depende completamente de ti."
}
},
"login": {
+ "forgot": "¿Olvidaste la contraseña?",
+ "reset": "Restablecer contraseña",
"optional": "Opcional",
+ "submit": "Enviar",
"token": "Token 2FA",
- "username": "Usuario",
+ "username": "Nombre de usuario",
"password": "Contraseña",
- "email": "Correo",
- "passwordRecommendation": "Recomendamos una contraseña larga y aleatoria generada con un administrador de contraseñas.",
- "forgotUserOrPassword": "¿Olvidaste tu nombre de usuario o contraseña?",
+ "newPassword": "Nueva contraseña",
+ "email": "Correo electrónico",
+ "passwordRecommendation": "Recomendamos usar una contraseña larga y aleatoria si piensas mantener fondos en tu cuenta.",
+ "forgotUserOrPassword": "¿Olvidaste la contraseña?",
"haveAccount": "¿Ya tienes una cuenta?",
"noAccount": "¿No tienes una cuenta?",
- "register": "Registro",
- "signIn": "Registrarse",
- "failed": "Fallo en Inicio"
+ "register": "Registrarse",
+ "signIn": "Iniciar Sesión",
+ "failed": "Inicio de sesión fallido"
},
"nav": {
+ "about": "Acerca de",
+ "docs": "Documentos",
+ "messages": "Mensajes",
+ "funds": "Fondos",
+ "map": "Mapa",
+ "merch": "Mercancía",
"profile": "Perfil",
- "startInSeconds": "Comience en segundos",
+ "startInSeconds": "Comienza en segundos",
"account": "Cuenta",
- "signIn": "Registrarse",
- "signOut": "Desconectar",
- "dashboard": "Panel",
- "settings": "Ajustes",
+ "signIn": "Iniciar Sesión",
+ "signOut": "Cerrar sesión",
+ "dashboard": "Tablero",
+ "settings": "Configuraciones",
"support": "Soporte"
},
- "newSiteHeader": "Acompañanos en nuestra <a href=\"/launch\" class=\"underline underline-offset-4 text-black hover:opacity-80\">launch party</a> en Vancouver el 26 de Octubre! Buscando la version anterior de coinos? Visita <a href=\"https://classic.coinos.io\" class=\"underline underline-offset-4 text-black hover:opacity-80\">classic.coinos.io</a>",
"news": {
"header": "Noticias",
- "subheader": "Últimas Actualizaciones",
- "update1": ""
+ "subheader": "Últimas Actualizaciones"
},
"user": {
+ "profilePage": "Página de perfil",
+ "nostrPubkey": "Clave pública Nostr",
"requestPayment": "Solicitar pago",
- "welcome": "¡Bienvenido! El saldo de su cuenta está vacío. Puede comenzar haciendo un depósito o pidiéndole a alguien que le pague.",
+ "welcome": "¡Bienvenido! Tu saldo de cuenta está vacío. Puedes comenzar haciendo un depósito o pidiendo a alguien que te pague.",
"showBalance": "Mostrar saldo",
"bitcoin": "Bitcoin",
"lightning": "Lightning",
"invoice": "Factura",
"unfollow": "Dejar de seguir",
"following": "Siguiendo",
- "followers": "Seguidores",
"follow": "Seguir",
+ "followers": "Seguidores",
"remove": "Eliminar",
+ "noNotes": "Aún no hay notas",
+ "message": "Mensaje",
+ "messages": "Mensajes",
+ "feed": "Feed",
+ "notes": "Notas",
+ "pay": "Pagar",
"scanToPayBTC": "Escanear para pagar con bitcoin",
"this": "Esta",
- "lightningAddress": "Dirección lightning",
+ "lightningAddress": "Dirección Lightning",
"dashboard": {
- "go": "Ir",
- "dashboard": "Panel",
- "accountBalance": "Saldo de la cuenta",
- "bitcoinPrice": "Precio de Bitcoin:",
+ "accountBalance": "Saldo de la Cuenta",
"conversionFeeWarning": "Se le cobrará una tarifa de retiro del 1% sobre el monto.",
- "dataFromBinance": "Datos de <span class=\"text-black\">Binance</span>.",
- "fetchingRate": "calculando tasa...",
- "optionalNote": "Nota (Opcional)",
+ "fetchingRate": "obteniendo tasa...",
"send": "Enviar",
"receive": "Recibir",
"withdraw": "Retirar",
"deposit": "Depositar",
- "voucher": "Comprobante"
+ "voucher": "Vale"
},
"receive": {
- "lessThan1BTCWarning": "Introduzca una cantidad inferior a 1 bitcoin.",
- "showQR": "Mostrar código QR"
+ "lessThan1BTCWarning": "Por favor, introduzca una cantidad menor a 1 bitcoin.",
+ "showQR": "Mostrar QR"
},
"send": {
+ "makeQR": "QR",
"contacts": "Contactos",
"scan": "Escanear",
"paste": "Pegar",
"next": "Siguiente",
- "placeholder": "Asigne una dirección de bitcoin, una factura lightning o un usuario de coinos"
+ "placeholder": "Pegue una dirección de bitcoin, factura lightning o nombre de usuario de coinos"
},
"settings": {
- "saveSettings": "Guardar ajustes",
- "tipPrompt": "Solicitar propinas",
- "tipPromptDescription": "Pregunta a las personas si quieren agregar una propina antes de pagar sus facturas",
- "bannerImage": "Imagen del Banner",
- "profileImage": "Imagen de perfil",
- "oneTimeCode": "Ingrese el código de un solo uso",
- "accountId": "Id Cuenta",
+ "shopify": "Integración con Shopify",
+ "notifications": "Notificaciones de Pago",
+ "notificationsDesc": "Reciba un correo electrónico cada vez que reciba un pago en su cuenta",
+ "seedPhrase": "Frase Semilla",
+ "nostrKeys": "Clave Nostr",
+ "nostrDescription": "Su clave Nostr se utiliza para firmar y descifrar mensajes, manténgala segura para evitar suplantaciones.",
+ "seedDescription": "Esta frase semilla de 12 palabras se utiliza para derivar su clave privada Nostr y las claves de su billetera autogestionada, que determinan sus direcciones de auto-retiro. Guárdela y no permita que nadie la vea.",
+ "emailDescription": "Solo para restablecimiento de contraseñas y notificaciones de pago",
+ "hideNsec": "Ocultar clave secreta Nostr",
+ "saved": "¡Ajustes guardados!",
+ "verifying": "Correo de verificación enviado",
+ "verified": "Correo verificado!",
+ "revealNsec": "Revelar clave secreta Nostr",
+ "hideSeed": "Ocultar frase semilla",
+ "revealSeed": "Revelar frase semilla",
+ "saveSettings": "Guardar Ajustes",
+ "bannerImage": "Imagen de Banner",
+ "profileImage": "Imagen de Perfil",
+ "oneTimeCode": "Ingrese código de un solo uso",
+ "accountId": "Secreto de la Cuenta",
"header": "Ajustes",
"ACCOUNT": "CUENTA",
- "POINT_OF_SALE": "PUNTO DE VENTA",
+ "POINT_OF_SALE": "PREFERENCIAS",
"SECURITY": "SEGURIDAD",
"locale": "Idioma",
- "username": "Usuario",
- "email": "Correo",
- "newPassword": "Nueva contraseña",
- "businessAddress": "Dirección Negocio",
- "emailNotifications": "Notificaciones de Correo Electrónico",
- "emailNotificationsDescription": "Reciba notificaciones por correo electrónico cuando se produzca un cambio en su cuenta o cuando las personas le envíen pagos.",
+ "username": "Nombre de Usuario",
+ "email": "Correo Electrónico",
+ "newPassword": "Cambiar Contraseña",
+ "about": "Acerca de",
+ "aboutPlaceholder": "Algo sobre usted o la dirección y horario de su negocio",
+ "emailNotifications": "Notificaciones por Correo Electrónico",
+ "emailNotificationsDescription": "Reciba notificaciones por correo electrónico cuando ocurra un cambio en su cuenta o cuando la gente le envíe pagos.",
"smsNotifications": "Notificaciones SMS",
- "smsNotificationsDescription": "Coinos enviará notificaciones de texto cuando esto esté habilitado.",
- "theme": "Color Tema",
+ "smsNotificationsDescription": "Coinos le enviará notificaciones de texto cuando esto esté habilitado.",
+ "theme": "Tema de Color",
+ "tipPrompt": "Solicitar propinas",
+ "tipPromptDescription": "Pregunte a las personas si desean agregar una propina antes de pagar sus facturas",
+ "displayName": "Nombre Visible",
"themeDescription": "Seleccione entre los temas de color predeterminados.",
"localCurrency": "Moneda Local",
- "btcUnit": "Ver bitcoin en:",
+ "btcUnit": "Mostrar bitcoin en:",
"bitcoin": "bitcoin",
"satoshis": "Satoshis",
"securityPIN": "PIN de Seguridad",
- "securityPINDescription": "Establezca un pin de seguridad para desbloquear la configuración y enviar pagos.",
+ "securityPINDescription": "Establezca un PIN de seguridad que se utilizará para desbloquear sus ajustes y para enviar pagos salientes.",
"setPIN": "Establecer PIN",
- "autoLock": "Temporizador de bloqueo automático",
- "autoLockDescription": "Su cuenta entrará en modo seguro automáticamente después del tiempo especificado:",
- "twofa": "Autenticación de 2 factores",
- "twofaDescription": "Agregue una capa extra de seguridad a su dispositivo habilitando la autenticación de 2 factores.",
+ "autoLock": "Tiempo de Espera",
+ "autoLockDescription": "Tiempo después del cual necesitará reingresar su PIN:",
+ "twofa": "Autenticación de Dos Factores",
+ "twofaDescription": "Agregue un nivel extra de seguridad a su dispositivo habilitando la autenticación de dos factores.",
"twofaSetup": "Configurar 2FA",
"twofaDisable": "Deshabilitar 2FA",
"select": "Seleccionar",
"verifyPIN": "Verificar PIN",
"enablePIN": "Habilitar PIN",
- "disablePIN": "Deshabilitar PIN"
+ "disablePIN": "Deshabilitar PIN",
+ "publishNip5": "Publicar identidad nostr",
+ "nip5a": "Usar",
+ "nip5b": "como su dirección nostr verificada públicamente"
},
"support": {
"header": "Soporte",
- "email": "Correo",
- "accountName": "Nombre Cuenta",
+ "email": "Correo Electrónico",
+ "accountName": "Nombre de la Cuenta",
"message": "Mensaje",
"send": "Enviar"
}
},
"payments": {
- "header": "Transacciones",
- "AMOUNT": "CANTIDAD",
- "TYPE": "TIPO",
- "TIME": "HORA",
+ "networkFee": "Tarifa de Red",
+ "platformFee": "Tarifa de Plataforma",
+ "fastest": "Más rápido",
+ "fast": "Rápido",
+ "medium": "Medio",
+ "slow": "Lento",
+ "create": "Crear",
+ "fund": "Fondos",
+ "addFunds": "Agregar Fondos",
+ "takeFunds": "Retirar Fondos",
+ "show": "Mostrar",
+ "hide": "Ocultar",
+ "qr": "QR",
+ "copyLink": "Copiar Enlace",
+ "copyText": "Copiar Texto",
+ "openLink": "Abrir billetera",
+ "moreOptions": "Más opciones",
+ "total": "Total",
+ "gainLoss": "Ganancia/Pérdida",
+ "presentValue": "Valor Actual",
+ "amount": "Cantidad",
+ "date": "Fecha",
+ "id": "ID de Transacción",
+ "details": "Detalles de la Transacción",
+ "header": "Pagos",
+ "preimage": "Prueba de pago",
+ "maxfee": "Máxima tarifa de enrutamiento",
+ "type": "Tipo",
+ "time": "Hora",
"sent": "Enviado",
"received": "Recibido",
"empty": "Aún no hay transacciones.",
- "send": "Enviado",
+ "send": "Enviar",
"next": "Siguiente",
- "sendersChoice": "Elección del remitente",
"sendTo": "Enviar a",
- "to": "para",
+ "to": "a",
"pay": "Pagar",
"requesting": "está solicitando",
- "sentInvoiceTo": "Enviar factura a",
- "sentRequestTo": "Enviar solicitud a",
+ "sentInvoiceTo": "Factura enviada a",
+ "sentRequestTo": "¡Solicitud enviada!",
"pleasePay": "Por favor pague",
"day": "Día",
"week": "Semana",
@@ -277,15 +316,21 @@
"export": "Exportar",
"invoice": "Factura",
"readyToPay": "está listo para pagar",
- "describeOrder": "Utilice este campo para describir su orden",
- "requestAnInvoice": "Solicitar factura",
+ "describeOrder": "Utilice este campo para describir su pedido",
+ "requestAnInvoice": "Solicitar Factura",
"submit": "Enviar",
"isRequesting": "está solicitando",
+ "invoiceFrom": "Factura de",
"awaiting": "Esperando",
- "tapAnywhere": "Toca en cualquier lugar",
+ "tapAnywhere": "Toque en cualquier lugar para continuar",
"from": "de",
"redeem": "Redimir",
"redeemed": "Redimido",
- "redeemedBy": "Redimido por"
+ "redeemedBy": "Redimido por",
+ "sendMessage": "Escribir un mensaje...",
+ "fundsClaimed": "¡Fondos reclamados!",
+ "print": "Imprimir",
+ "onlyLbtc": "Solo admitimos",
+ "dontDeposit": "no deposite otros activos todavía"
}
}
diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte
index cb3e284d..d853dd9e 100644
--- a/src/routes/(app)/+layout.svelte
+++ b/src/routes/(app)/+layout.svelte
@@ -39,37 +39,30 @@
$: update(data);
let update = (data) => {
({ rate, user, subject, token, rates } = data);
+ $locale = user?.language || "en";
};
onMount(async () => {
- let localeLocalStorageKey = "sveltekit-i18n-locale";
- let localStorageLocale = localStorage.getItem(localeLocalStorageKey);
- if (localStorageLocale) locale.set(localStorageLocale);
-
- locale.subscribe((lng) => {
- if (lng) localStorage.setItem(localeLocalStorageKey, lng);
- });
-
if (browser) {
checkSocket();
let locktime = user && user.locktime ? user.locktime : 300;
expireTimer = setTimeout(expirePin, locktime * 1000);
if (window.NDEFReader && user.nfc) {
- try {
- $ndef = new NDEFReader();
- await $ndef.scan();
+ try {
+ $ndef = new NDEFReader();
+ await $ndef.scan();
- $ndef.addEventListener('readingerror', (e) => {
- console.log('nfc error', e);
- });
+ $ndef.addEventListener("readingerror", (e) => {
+ console.log("nfc error", e);
+ });
- $ndef.addEventListener('reading', ({ message, serialNumber }) => {
+ $ndef.addEventListener("reading", ({ message, serialNumber }) => {
goto(`/send/${message}`);
- });
- } catch (error) {
- console.log('Argh! ' + error);
- }
+ });
+ } catch (error) {
+ console.log("Argh! " + error);
+ }
}
}
});
diff --git a/src/routes/(app)/[username]/invoice/[id]/+page.svelte b/src/routes/(app)/[username]/invoice/[id]/+page.svelte
index a7a7b26d..e09d5935 100644
--- a/src/routes/(app)/[username]/invoice/[id]/+page.svelte
+++ b/src/routes/(app)/[username]/invoice/[id]/+page.svelte
@@ -204,8 +204,8 @@
{#if type === types.liquid}
<div class="flex justify-center">
<div class="my-auto text-xl text-center text-secondary">
- We only support <span class="text-teal-500 font-bold">L-BTC</span>,
- don't deposit other assets yet
+ {$t("payments.onlyLbtc")} <span class="text-teal-500 font-bold">L-BTC</span>,
+ {$t("payments.dontDeposit")}
</div>
</div>
{/if}
diff --git a/src/routes/(app)/[username]/settings/[...tab]/+page.server.js b/src/routes/(app)/[username]/settings/[...tab]/+page.server.js
index b9717b82..3c10d897 100644
--- a/src/routes/(app)/[username]/settings/[...tab]/+page.server.js
+++ b/src/routes/(app)/[username]/settings/[...tab]/+page.server.js
@@ -5,7 +5,7 @@ export function load({ cookies, params, url }) {
if (url.pathname.endsWith("settings"))
redirect(307, url.pathname + "/account");
params.cookies = cookies.getAll();
- return params;
+ return { cookies: cookies.getAll(), tab: params.tab }
}
export const actions = {
diff --git a/src/routes/(app)/[username]/settings/[...tab]/+page.svelte b/src/routes/(app)/[username]/settings/[...tab]/+page.svelte
index 54a2d71c..0a08a4b1 100644
--- a/src/routes/(app)/[username]/settings/[...tab]/+page.svelte
+++ b/src/routes/(app)/[username]/settings/[...tab]/+page.svelte
@@ -39,7 +39,17 @@
$: form?.user && ({ user } = form);
- $: form?.success && success($t("user.settings.saved"), false);
+ $: form?.success && throttledSuccess();
+
+ let justUpdated;
+ let throttledSuccess = () => {
+ console.log("justUpdated", justUpdated);
+ if (!justUpdated) {
+ justUpdated = true;
+ success($t("user.settings.saved"), false);
+ setTimeout(() => (justUpdated = false), 5000);
+ }
+ };
$: form?.message && fail(form.message);
diff --git a/src/routes/(app)/[username]/settings/[...tab]/_pos.svelte b/src/routes/(app)/[username]/settings/[...tab]/_pos.svelte
index 539cfd5e..80ae3ad9 100644
--- a/src/routes/(app)/[username]/settings/[...tab]/_pos.svelte
+++ b/src/routes/(app)/[username]/settings/[...tab]/_pos.svelte
@@ -15,7 +15,7 @@
<label for="language" class="font-bold block mb-1"
>{$t("user.settings.locale")}</label
>
- <LocaleSelector style="select-styles block py-3 w-full" />
+ <LocaleSelector style="select-styles block py-3 w-full" bind:user />
</div>
<div>
@@ -71,6 +71,6 @@
class="flex rounded-full border py-2 px-4 font-bold hover:opacity-80 w-full gap-2 my-5 justify-center"
>
<img src="/icons/shopify.svg" class="w-8" />
- <div class="my-auto">Shopify Integration</div>
+ <div class="my-auto">{$t("user.settings.shopify")}</div>
</button>
</a>
diff --git a/src/routes/+layout.server.js b/src/routes/+layout.server.js
index 5273d372..91d24d3d 100644
--- a/src/routes/+layout.server.js
+++ b/src/routes/+layout.server.js
@@ -1,6 +1,7 @@
import { auth, get } from "$lib/utils";
import { loadTranslations, locale } from "$lib/translations";
-export const load = async ({ cookies, url }) => {
+
+export let load = async ({ cookies, url }) => {
let user;
let token = cookies.get("token");
if (token) {
@@ -9,9 +10,8 @@ export const load = async ({ cookies, url }) => {
} catch (e) {}
}
- const { host, pathname } = url;
- const defaultLocale = user?.language || "en"; // get from cookie, user session, ...
- const initLocale = locale.get() || defaultLocale; // set default if no locale already set
- await loadTranslations(initLocale, pathname); // keep this just before the `return`
+ let { host, pathname } = url;
+ let locale = user?.language || "en";
+ await loadTranslations(locale, pathname);
return { host, pathname };
};