From 01fdad8ee4e6bb4213c0c81a8876cda67ad3085a Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Thu, 25 Jan 2024 21:56:59 -0800 Subject: remember user language selection --- src/components/LocaleSelector.svelte | 3 +- src/lib/utils.js | 6 +- src/locales/en.json | 5 +- src/locales/es.json | 301 ++++++++++++--------- src/routes/(app)/+layout.svelte | 31 +-- .../(app)/[username]/invoice/[id]/+page.svelte | 4 +- .../[username]/settings/[...tab]/+page.server.js | 2 +- .../[username]/settings/[...tab]/+page.svelte | 12 +- .../(app)/[username]/settings/[...tab]/_pos.svelte | 4 +- src/routes/+layout.server.js | 10 +- 10 files changed, 217 insertions(+), 161 deletions(-) (limited to 'src') 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 @@ - {#each $locales as locale} {/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 launch party en Vancouver el 26 de Octubre! Buscando la version anterior de coinos? Visita classic.coinos.io", "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 Binance.", - "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}
- We only support L-BTC, - don't deposit other assets yet + {$t("payments.onlyLbtc")} L-BTC, + {$t("payments.dontDeposit")}
{/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 @@ - +
@@ -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" > -
Shopify Integration
+
{$t("user.settings.shopify")}
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 }; }; -- cgit v1.2.3